wbfy 5.9.0 → 5.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"node:fs";import t from"node:path";import{ignoreEnoentAsync as n,withRetry as s,ignoreErrorAsync as i}from"@willbooster/shared-lib";import r from"yargs";import o from"node:fs/promises";import{PromisePool as a}from"minimal-promise-pool";import c from"deepmerge";import l from"typescript";import p from"fast-glob";import d from"js-yaml";import u from"lodash.clonedeep";import m from"node:os";import f from"node:child_process";import{Octokit as g}from"@octokit/core";import h from"dotenv";import y from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";const k=new class{isVerbose=!1;doesUploadEnvVars=!1};const x=new class{async functionIgnoringException(e,t){k.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function j(e){return x.functionIgnoringException("fixDockerfile",async()=>{if(!e.doesContainDockerfile)return;const n=e.dockerfile,s=n;n!==s&&await o.writeFile(t.join(e.dirPath,"Dockerfile"),s)})}const _={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,s){await e.promises.mkdir(t.dirname(n),{recursive:!0});let i=s.replaceAll("\r\n","\n").trim();i&&(i+="\n"),await e.promises.writeFile(n,i)}},S=new a;async function P(n){return x.functionIgnoringException("fixNextConfigJson",async()=>{const s=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!s)return;const i=(await e.promises.readFile(s,"utf8")).replace(/=\s*{([\S\s]*)};/,(e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`));await S.run(()=>_.generateFile(s,i))})}const $=e=>({kind:"literal",value:e}),C=e=>({kind:"object",value:e}),E={forbidOnly:$("!!process.env.CI"),retries:$("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:C({baseURL:$("process.env.NEXT_PUBLIC_BASE_URL"),trace:$("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:$("process.env.CI ? 'only-on-failure' : 'only-on-failure'"),video:$("process.env.CI ? 'retain-on-failure' : 'retain-on-failure'")}),webServer:C({command:$("'yarn start-test-server'"),url:$("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:$("!!process.env.CI"),timeout:$("300_000"),stdout:$("'pipe'"),stderr:$("'pipe'"),env:$("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:$("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})};async function F(n){return x.functionIgnoringException("fixPlaywrightConfig",async()=>{const s=t.resolve(n.dirPath,"playwright.config.ts");if(!e.existsSync(s))return;const i=await e.promises.readFile(s,"utf8"),r=/defineConfig\s*\(\s*(\{[\s\S]*?})\s*\);?/.exec(i),o=r?.[1];if(!o)return;const a=function(e){const t=l.createSourceFile("playwright-config.ts",`const config = ${e};`,l.ScriptTarget.Latest,!0,l.ScriptKind.TS),n=t.statements[0];if(!n||!l.isVariableStatement(n))return;const s=n.declarationList.declarations[0];if(!s?.initializer||!l.isObjectLiteralExpression(s.initializer))return;return B(s.initializer,t)}(o);if(!a)return;const p=c.all([E,a]);Boolean(n.packageJson?.scripts?.["start-test-server"])||delete p.webServer;const d=await async function(n){const s=[t.resolve(n,".env"),t.resolve(n,"mise.toml")];for(const t of s)try{const n=await e.promises.readFile(t,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(n))return!0}catch{}return!1}(n.dirPath);if(!d){const e=p.use;"object"===e?.kind&&delete e.value.baseURL}const u=I(p,0),m=i.replace(o,u);await S.run(()=>_.generateFile(s,m))})}function B(e,t){const n={};for(const s of e.properties){if(!l.isPropertyAssignment(s)||!l.isIdentifier(s.name)&&!l.isStringLiteral(s.name))return;const e=O(s.initializer,t);if(void 0===e)return;n[s.name.getText(t)]=e}return n}function O(e,t){if(l.isObjectLiteralExpression(e)){const n=B(e,t);return n?C(n):$(e.getText(t))}if(l.isArrayLiteralExpression(e)){const n=e.elements.map(e=>O(e,t));return n.some(e=>void 0===e)?$(e.getText(t)):{kind:"array",value:n}}return $(e.getText(t))}function A(e,t){return"array"===e.kind?function(e,t){if(0===e.length)return"[]";const n=" ".repeat(t+1),s=e.map(e=>{const s=A(e,t+1).split("\n");if(s[s.length-1]=`${s.at(-1)},`,"literal"===e.kind)for(let e=1;e<s.length;e+=1)s[e]=`${n}${s[e]}`;return s[0]=`${n}${s[0]}`,s.join("\n")}),i=" ".repeat(t);return`[\n${s.join("\n")}\n${i}]`}(e.value,t):"literal"===e.kind?e.value:I(e.value,t)}function I(e,t){const n=" ".repeat(t+1),s=Object.entries(e).map(([e,s])=>{const i=A(s,t+1).split("\n");if(i[i.length-1]=`${i.at(-1)},`,"literal"===s.kind)for(let e=1;e<i.length;e+=1)i[e]=`${n}${i[e]}`;return i[0]=`${n}${e}: ${i[0]}`,i.join("\n")}),i=" ".repeat(t);return 0===s.length?`{\n${i}}`:`{\n${s.join("\n")}\n${i}}`}const T=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function R(e){return x.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await p.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:T});for(const s of n){const n=t.resolve(e.dirPath,s),i=(await o.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await o.writeFile(n,i)}})}async function W(n){return x.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const s=t.join(n,"test");for(const i of["__tests__","tests"]){const r=t.join(n,i);try{await e.promises.rename(r,s);const o=await e.promises.readFile(t.join(n,"package.json"),"utf8"),a=o.replaceAll(i,"test");if(o===a)return;await e.promises.writeFile(t.join(n,"package.json"),a)}catch{}}}))})}async function D(e,s){return x.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),r=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),a=await n(()=>o.readdir(i,{withFileTypes:!0}));if(a)for(const e of a){const a=e.name.slice(0,-5),c=e.name.endsWith(".d.ts");let l=c?a:e.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=s.some(e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]);e.isFile()&&c?p?(await o.mkdir(t.join(i,a)),await S.run(()=>o.rename(t.join(i,e.name),t.join(i,a,"index.d.ts")))):r&&(await o.mkdir(r,{recursive:!0}),await S.run(()=>o.rename(t.join(i,e.name),t.join(r,e.name)))):e.isDirectory()&&r&&!p&&(await o.mkdir(r,{recursive:!0}),await S.run(()=>n(()=>o.rename(t.join(i,e.name,"index.d.ts"),t.join(r,`${e.name}.d.ts`)))))}})}function L(e,t){return t}function N(e,t,n){const s=[...e];for(const[i,r]of t.entries())void 0===s[i]?s[i]=n.cloneUnlessOtherwiseSpecified(r,n):n.isMergeableObject(r)?s[i]=c(e[i],r,n):e.includes(r)||s.push(r);return s}function J(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&J(s);return e}const G={name:"autofix.ci",on:{pull_request:null,push:{branches:["main"]}},permissions:{contents:"read"},concurrency:{group:"autofix-${{ github.head_ref }}","cancel-in-progress":!0},jobs:{autofix:{"runs-on":"ubuntu-latest"}}},U={name:"Fix code automatically",on:{pull_request:null},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{autofix:{uses:"WillBooster/reusable-workflows/.github/workflows/autofix.yml@main"}}},z={test:{name:"Test",on:{pull_request:null,push:{branches:["main","wbfy"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},permissions:{contents:"write"},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/test.yml@main"}}},release:{name:"Release",on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},permissions:{"id-token":"write",contents:"write"},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},"semantic-pr":{name:"Lint PR title",on:{pull_request_target:{types:["opened","edited","synchronize"]}},jobs:{"semantic-pr":{uses:"WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main"}}},sync:{name:"Sync",on:{},permissions:{contents:"write"},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"gen-pr-claude":{name:"Generate PR with Claude Code",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-claude')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"claude-code","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{CLAUDE_CODE_OAUTH_TOKEN:"${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}"}}}},"gen-pr-codex":{name:"Generate PR with Codex CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-codex')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"codex-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{OPENAI_API_KEY:"${{ secrets.OPENAI_API_KEY }}"}}}},"gen-pr-gemini":{name:"Generate PR with Gemini CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-gemini')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"gemini-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{GEMINI_API_KEY:"${{ secrets.GEMINI_API_KEY }}"}}}}};async function M(n){return x.functionIgnoringException("generateWorkflow",async()=>{if(q(n.repository))return;const s=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(s,{recursive:!0});const i=t.resolve(n.dirPath,".github","semantic.yml");await S.run(()=>e.promises.rm(i,{force:!0,recursive:!0}));const r=await e.promises.readdir(s,{withFileTypes:!0}),o=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml","gen-pr-claude.yml","gen-pr-codex.yml","gen-pr-gemini.yml",...r.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&o.add("release.yml");for(const e of o){const i=t.basename(e,".yml");await S.run(()=>H(n,s,i))}})}function q(e){return e?.endsWith("/reusable-workflows")??!1}async function H(n,s,i){const r=t.join(s,`${i}.yml`),o=e.existsSync(t.join(s,"deploy-production.yml"));if("autofix"===i)return void await K(function(e){if(!e.isPublicRepo)return u(U);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0}},...e.isBun?[{uses:"oven-sh/setup-bun@v1",with:{"bun-version":"latest"}}]:[],{run:`${t} install`},{run:`${t} run cleanup`}];e.packageJson?.scripts?.build&&n.push({run:`${t} run build`});n.push({uses:"autofix-ci/action@v1"});const s=u(G),i=s.jobs.autofix??{"runs-on":"ubuntu-latest"};return s.jobs.autofix={...i,steps:n},s}(n),r);let a=u(i in z?z[i]:{});if(!("jobs"in a))return;try{const t=await e.promises.readFile(r,"utf8"),n=d.load(t);a=c.all([a,n,a],{arrayMerge:N})}catch{}i.startsWith("deploy")&&(a={...a,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},function(e,t){const n=e[t];delete e[t],e[t]=n}(a,"jobs"),a.on?.push&&(a.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...a.on.push["paths-ignore"]??[]])])),"release"===i&&a.jobs.release&&o&&(a.permissions??={},a.permissions.actions="write",a.jobs.release.with??={},a.jobs.release.with.trigger_deploy_workflow="deploy-production.yml");let l=!1;for(const e of Object.values(a.jobs))e.uses?.includes("/reusable-workflows/")&&(Y(n,e,i),l=!0);if(l){switch(i){case"release":if(a.on?.schedule)delete a.on.push;else{if(!(a.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});a.on.push.branches=n.release.branches}n.isPublicRepo?(a.permissions??={},a.permissions["id-token"]="write"):delete a.permissions?.["id-token"];break;case"test":a.on?.pull_request&&delete a.on.pull_request["paths-ignore"],a.on?.push&&(delete a.on.push["paths-ignore"],a.on.push.branches=a.on.push.branches.filter(e=>"renovate/**"!==e))}if(await K(a,r),"sync"===i){if(await e.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!a.jobs.sync?.with)return;a.jobs["sync-force"]=a.jobs.sync;const n=a.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;a.jobs.sync.with.sync_params_without_dest=`--force ${n}`,a.name="Force to Sync",a.on={workflow_dispatch:null},delete a.jobs.sync,await K(a,t.join(s,"sync-force.yml"))}}}function Y(e,t,n){if(t.with??={},t.secrets??={},delete t.secrets.NPM_TOKEN,"test"!==n&&"release"!==n&&"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.with["test-command"]=e.isBun?"bun run check-all-for-ai":"yarn check-all-for-ai"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with.sync_params_without_dest;"string"==typeof e&&(t.with.sync_params_without_dest=e.replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses?.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses?.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&"string"==typeof t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.replace(/\s+--json/,"")),e.doesContainDockerfile&&!t.with.ci_label&&n.startsWith("test")&&(t.with.ci_label="large"),"release"===n||"test"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?J(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=J(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function K(t,n){const s=d.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function V(n){return x.functionIgnoringException("fixTypos",async()=>{if(q(n.repository))return;const s=n.dirPath,i=await p.glob("**/*.md",{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const r of i){const i=t.join(s,r);await S.run(async()=>{const t=await e.promises.readFile(i,"utf8");let s=X(t);s=Z(s,n,"doc"),t!==s&&await _.generateFile(i,s)})}const r=await p.glob(["{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${r.length} TypeScript files in ${s}`);for(const i of r){const r=t.join(s,i),o=await e.promises.readFile(r,"utf8");let a=Q(o);a=Z(a,n,"ts"),o!==a&&await _.generateFile(r,a)}const o=await p.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${o.length} text-based files in ${s}`);for(const i of o){const r=t.join(s,i),o=await e.promises.readFile(r,"utf8");let a=X(o);a=Z(a,n,"text"),o!==a&&await _.generateFile(r,a)}await S.promiseAll()})}function X(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function Q(e){return e.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.")}function Z(e,t,n){for(const[n,s]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,s);for(const[s,i]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(s,i);return e}async function ee(e,n){return x.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const s=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),i=await _.readFileIgnoringError(s);for(const[s,r]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const o=te(e,n,r,i),a=t.resolve(e.dirPath,s);await S.run(()=>_.generateFile(a,o))}const r=t.resolve(e.dirPath,".cursor/rules/general.mdc"),o=function(e,t,n){const s="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",i=te(e,t,"Cursor",n);return`${s}\n\n${i}`}(e,n,i);await S.run(()=>_.generateFile(r,o))})}function te(e,t,n,s){const i=e.isBun?"bun":"yarn",r=`\n## Project Information\n\n- Name: \`${e.packageJson?.name||"unknown"}\`\n- Description: ${e.packageJson?.description}\n- Package Manager: ${i}\n\n## General Instructions\n\n- Create a new branch if the current branch is \`main\`.\n- Run any \`git\` commands sequentially.\n- Write tests ONLY if explicitly requested.\n - Make sure to continue to modify the tests and code until the tests pass.\n- When fixing tests, gather debug information through logging and screenshots before modifying the code.\n- After making code changes, run \`${i} check-all-for-ai\` to execute all tests (takes up to 1 hour), or run \`${i} check-for-ai\` for type checking and linting only (takes up to 10 minutes).\n - If you are confident your changes will not break any tests, you may use \`check-for-ai\`.\n- Once you have verified your changes, commit and push them to the current (non-main) branch then create a PR via \`gh\`.\n - Follow the conventional commits; your commit message should start with \`feat:\`, \`fix:\`, etc.\n - If not specified, make sure to add a new line at the end of your commit message${e.isWillBoosterRepo?` with: \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\``:""}.\n - Always create new commits. Avoid using \`--amend\`.\n${t.some(e=>e.hasStartTestServer)?`- Use \`${i} run start-test-server\` to launch a web server for debugging or testing.`:""}\n\n${ne(t)}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim(),o=s?.trim().startsWith("#");return r+(s?o?"\n\n"+s.trim():"\n"+s:"")}function ne(e){return`\n## Coding Style\n\n- Simplify code as much as possible to eliminate redundancy.\n- Design each module with high cohesion, grouping related functionality together.\n - Refactor existing large modules into smaller, focused modules when necessary.\n - Create well-organized directory structures with low coupling and high cohesion.\n- When adding new functions or classes, define them below any functions or classes that call them to maintain a clear top-down call order.\n- Write comments that explain "why" rather than "what". Avoid stating what can be understood from the code itself.\n- Prefer \`undefined\` over \`null\` unless explicitly required by APIs or libraries.\n- Prefer using a single template literal for prompts instead of \`join()\` with an array of strings.\n${e.some(e=>e.depending.genI18nTs)?'- When introducing new string literals in React components, update the language resource files in the `i18n` directory (e.g., `i18n/ja-JP.json`). Reference these strings using the `i18n` utility. For example, use `i18n.pages.home.title()` for `{ "pages": { "home": { "title": "My App" } } }`.':""}\n${e.some(e=>e.depending.react||e.depending.next)?"- Prefer `useImmer` for storing an array or an object to `useState`.":""}\n${e.some(e=>e.depending.next)?"\n- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.\n- Assume there is only a single server instance.\n":""}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim()}async function se(n){return x.functionIgnoringException("generateBiomeJsonc",async()=>{let s={root:n.isRoot,$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};const i=t.resolve(n.dirPath,"biome.jsonc");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=c.all([s,n,s],{arrayMerge:L})}catch{}const r=JSON.stringify(s);await S.run(()=>_.generateFile(i,r))})}const ie='env = false\ntelemetry = false\n\n[install]\nexact = true\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n "@exercode/problem-utils",\n "@willbooster/babel-configs",\n "@willbooster/biome-config",\n "@willbooster/eslint-config-js",\n "@willbooster/eslint-config-js-react",\n "@willbooster/eslint-config-next",\n "@willbooster/eslint-config-ts",\n "@willbooster/eslint-config-ts-react",\n "@willbooster/prettier-config",\n "@willbooster/shared-lib",\n "@willbooster/wb",\n "next",\n "@next/*",\n "react",\n "react-dom"\n]\n',re=ie.replace("exact = true","exact = false");async function oe(n){return x.functionIgnoringException("generateBunfigToml",async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(s)&&e.readFileSync(s,"utf8").includes("exact = false")?re:ie;await S.run(()=>_.generateFile(s,i))})}const ae="# Project-specific settings",ce=/# Project-specific settings[^\n]*\n/gm,le="# Generated by wbfy",pe=`${ae} (head)\n\n\n${le}\n`,de=`\n${ae} (tail)\n`,ue={separator:le,separatorPrefix:"# Generated by ",defaultHeadUserContent:pe,defaultTailUserContent:de,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=me(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(ce,"").replaceAll(/# Generated by [^\n]*\n/gm,"").replaceAll(/\r?\n\r?\n(\r?\n)+/gm,"\n\n").trim()+"\n"}catch{}},getHeadUserContent(e){const t=e.indexOf(this.separatorPrefix);return-1!==t?e.slice(0,e.indexOf("\n",t)+1).replaceAll(ce,`${ae} (head)\n`):pe},getTailUserContent(e){const t=me(e);return t>0?e.slice(t-1):de},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function me(e){const t=e.indexOf(ae),n=e.lastIndexOf(ae);return n>t?n:-1}async function fe(n){return x.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await _.readFileIgnoringError(s)??"",t=ue.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+ue.getTailUserContent(e);await S.run(()=>_.generateFile(s,t))}else await e.promises.rm(s,{force:!0})})}const ge={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].toSorted(),codeWith4IndentSize:["go","gradle","java","py"].toSorted(),markdownLike:["md"].toSorted(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].toSorted(),prettier:["cjs","mjs","java","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].toSorted(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].toSorted()},he=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${we(ge.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${we(ge.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${we(ge.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function ye(e){return x.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await S.run(()=>_.generateFile(n,he))})}function we(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function be(n){return x.functionIgnoringException("generateEslintrc",async()=>{const s=t.resolve(n.dirPath,"eslint.config.mjs");if(n.isBun)await S.run(()=>e.promises.rm(s,{force:!0}));else if(n.eslintBase){try{if(!(await e.promises.readFile(s,"utf8")).includes("export { default }"))return}catch{}await S.run(()=>_.generateFile(s,`export { default } from '${n.eslintBase}';`))}})}const ve={have_fun:!0,code_review:{disable:!1,comment_severity_threshold:"MEDIUM",max_review_comments:-1,pull_request_opened:{help:!1,summary:!0,code_review:!0}},ignore_patterns:["**/__generated__"]};async function ke(n,s){return x.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const i=t.resolve(n.dirPath,".gemini"),r=t.resolve(i,"config.yml"),o=t.resolve(i,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let l=u(ve);try{const t=await e.promises.readFile(r,"utf8"),n=d.load(t);l=c.all([l,n,l],{arrayMerge:L})}catch{}const p=d.dump(l,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),m=await _.readFileIgnoringError(a),f=`以下のコーディング規約を踏まえて、日本語でレビューしてください。\n\n${ne(s)}${m?`\n\n${m.trimEnd()}`:""}`,g=[S.run(()=>_.generateFile(r,p))];e.existsSync(o)||g.push(S.run(()=>_.generateFile(o,f))),await Promise.all(g)})}async function xe(n){return x.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),i=t.resolve(s,"settings.json");await e.promises.rm(i,{force:!0})})}const je=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...ge.codeWith2IndentSize,...ge.codeWith4IndentSize,...ge.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function _e(e){return x.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await S.run(()=>_.generateFile(n,je))})}const Se=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Pe(e,n){return x.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await _.readFileIgnoringError(s)??"";let r=ue.getHeadUserContent(i)+"\n!.keep\n.aider*\n.env.production\n*/mount/*.hash\n.devcontainer/\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot.*\n.idea/copilot/chatSessions/\n.serena/\n.tmp/\n__generated__/\n@willbooster/\ndist/\ntemp/\ntmp/\n";const o=ue.getTailUserContent(i),a=[...Se];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),r+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),r+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),r+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(r+=".aws-sam/\npackaged.yaml\n"),e.doesContainPoetryLock&&(a.push("python"),r+=".venv/\n"),e.depending.blitz&&(r+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(r+="*.sqlite3*\n"),e.depending.playwrightTest&&(r+="playwright-report/\ntest-results/\n.playwright-cli/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),r+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(r+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Ee(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,s=await fetch(n),i=await s.text();if(!s.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await S.run(()=>Ce(e,t)),k.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await ue.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=r+"\n"+c+o;await S.run(()=>_.generateFile(s,l))})}const $e=t.join(m.homedir(),".cache","wbfy","gitignore");async function Ce(n,s){await e.promises.mkdir($e,{recursive:!0}),await e.promises.writeFile(t.join($e,n),s)}async function Ee(n){try{const s=await e.promises.stat(t.join($e,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join($e,n),"utf8")}catch{}}function Fe(e,t,n,s){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${s}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${s})" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="${e}" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n`}const Be=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ge.prettier.map(e=>Fe("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,Oe=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ge.prettier.map(e=>Fe("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-parse-errors","Biome",e)).join("")}\n </component>\n</project>\n`;async function Ae(n){return x.functionIgnoringException("generateIdeaSettings",async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const i=t.resolve(s,"watcherTasks.xml");await(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages||n.doesContainPackageJson&&!n.doesContainPubspecYaml&&!n.doesContainGemfile&&!n.doesContainGoMod&&!n.doesContainPomXml?S.run(()=>_.generateFile(i,n.isBun?Oe:Be)):S.run(()=>e.promises.rm(i,{force:!0})))}})}function Ie(e,t,n,s=0){do{const[s,i,r]=Re(e,t,n);if(0===f.spawnSync(s,i,r).status)break}while(--s>=0)}function Te(e,t,n){const[s,i,r]=Re(e,t,n);r.stdio="pipe";const o=f.spawnSync(s,i,r),a=o.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();o.error?console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] failed with: ${o.error.message}`):c&&console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${c}`);const l=o.stdout??"";return"string"==typeof l?l.trim():l.toString().trim()}function Re(e,t,n){const s={...process.env};return s.PATH&&s.BERRY_BIN_FOLDER&&(s.PATH=s.PATH.replace(`${s.BERRY_BIN_FOLDER}:`,"")),[e,t,{cwd:n,env:s,encoding:"utf8",shell:!1,stdio:"inherit"}]}function We(e,t){try{const n=`git@github.com:${e}/${t}.git`,s=Te("git",["ls-remote",n,"HEAD"],process.cwd()).split(/\s+/)[0];if(!s)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(s)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}const De={getLintFixSuffix:e=>e.doesContainJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""};const Le=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},Ne=new Map;function Je(e){const t=e??"",n=Ne.get(t);if(n)return n;const s=new g({auth:Ue(e)||void 0});return Ne.set(t,s),s}function Ge(e){return!!Ue(e)}function Ue(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER:"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB:process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN}const ze=["@eslint/js","eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-import-x","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],Me=[...ze,"typescript-eslint","eslint-import-resolver-typescript"],qe=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],He={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...ze],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...ze,...qe],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...Me],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...Me,...qe],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","@next/eslint-plugin-next",...Me,...qe]};async function Ye(n,s,i){return x.functionIgnoringException("generatePackageJson",async()=>{await async function(n,s,i){const r=t.resolve(n.dirPath,"package.json"),o=await e.promises.readFile(r,"utf8"),a=JSON.parse(o);a.scripts=a.scripts??{},a.dependencies=a.dependencies??{},a.devDependencies=a.devDependencies??{},a.peerDependencies=a.peerDependencies??{};const l=n.isBun?"bun":"yarn";await async function(t){"WillBooster LLC"===t.author&&(t.author="WillBooster Inc.");delete t.scripts["sort-package-json"],delete t.scripts["sort-all-package-json"],delete t.scripts["typecheck/warn"],delete t.scripts["typecheck:gen-code"],delete t.scripts["typecheck:codegen"],delete t.dependencies.tslib,delete t.devDependencies["@willbooster/eslint-config"],delete t.devDependencies["@willbooster/eslint-config-react"],delete t.devDependencies["@willbooster/renovate-config"],delete t.devDependencies["@willbooster/tsconfig"],delete t.devDependencies["eslint-import-resolver-node"],delete t.devDependencies["eslint-plugin-prettier"],delete t.devDependencies.lerna,delete t.devDependencies.pinst,delete t.scripts["flutter-format"],delete t.scripts["format-flutter"],delete t.scripts["python-format"],delete t.scripts["format-python"],delete t.scripts.prettier,delete t.scripts["check-all"],await S.run(()=>e.promises.rm("lerna.json",{force:!0})),delete t.devDependencies["@typescript-eslint/eslint-plugin"],delete t.devDependencies["@typescript-eslint/parser"],delete t.devDependencies["eslint-plugin-import"]}(a);for(const[e,t]of Object.entries(a.scripts))t.includes("git clone")||(a.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));a.scripts=c(a.scripts,Ve(n,a.scripts)),"check-for-ai"in a.scripts&&("gen-code"in a.scripts&&(a.scripts["check-for-ai"]=`${l} gen-code > /dev/null && ${a.scripts["check-for-ai"]}`),a.scripts["check-for-ai"]=`${l} install > /dev/null && ${a.scripts["check-for-ai"]}`);n.isBun?delete a.scripts.prettify:a.scripts.prettify=(a.scripts.prettify??"")+await async function(n){const s=t.resolve(n,".prettierignore"),i=await e.promises.readFile(s,"utf8"),r=i.indexOf(ue.separatorPrefix);if(-1===r)return"";const o=i.slice(0,r);return`${o.split("\n").map(e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t}).filter(e=>e&&!e.startsWith("#")&&!e.includes("/")).map(e=>` "!**/${e}/**"`).join("")} || true`}(n.dirPath);for(const[e,t]of Object.entries(a.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(a.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let d=[],u=["prettier","sort-package-json"];const m=[];e.existsSync(t.join(s.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(a.prettier="@willbooster/prettier-config",u.push("prettier-plugin-java","@willbooster/prettier-config"));n.isBun?delete a.devDependencies["lint-staged"]:u.push("lint-staged");if(n.isRoot){if(delete a.devDependencies.husky,delete a.devDependencies.pinst,delete a.scripts.postinstall,delete a.scripts.postpublish,delete a.scripts.prepublishOnly,delete a.scripts.prepack,delete a.scripts.postpack,a.scripts.prepare="lefthook install || true",u.push("lefthook"),n.depending.semanticRelease&&(a.devDependencies["semantic-release"]||a.devDependencies["multi-semantic-release"]||a.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),a.version="0.0.0-semantically-released"),n.depending.playwrightTest){a.dependencies.artillery||a.devDependencies.artillery||a.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete a.dependencies["@playwright/test"]),delete a.dependencies.playwright,delete a.devDependencies.playwright}n.doesContainSubPackageJsons?a.workspaces=Array.isArray(a.workspaces)?c.all([a.workspaces,["packages/*"]],{arrayMerge:N}):["packages/*"]:Array.isArray(a.workspaces)&&(a.workspaces=a.workspaces.filter(e=>p.globSync(e,{dot:!0,cwd:n.dirPath,ignore:T}).length>0),0===a.workspaces.length&&delete a.workspaces)}if(n.depending.wb||n.isBun){a.dependencies["@willbooster/wb"]?d.push("@willbooster/wb"):u.push("@willbooster/wb");for(const[e,t]of Object.entries(a.scripts))a.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(n.isBun?(u.push("@biomejs/biome","@willbooster/biome-config"),delete a.devDependencies.eslint,delete a.devDependencies.micromatch,delete a.devDependencies["typescript-eslint"]):u.push("eslint","micromatch"));(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&u.push(...function(e){return e.isBun?["@tsconfig/bun"]:e.depending.reactNative?["@tsconfig/react-native"]:["@tsconfig/node-lts","@tsconfig/node-ts"]}(n));(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(u.push("typescript"),n.isBun&&u.push("@types/bun"));n.eslintBase&&u.push(...He[n.eslintBase]);n.isWillBoosterConfigs&&(d=d.filter(e=>!e.includes("@willbooster/")),u=u.filter(e=>!e.includes("@willbooster/")));a.name||(a.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(a.private=!0);a.license||(a.license="UNLICENSED");!a.private&&"UNLICENSED"!==a.license&&s.isPublicRepo&&(a.publishConfig??={},a.publishConfig.access??="public");const[f]=Le.getOrgAndName(n.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(a.author="WillBooster Inc.");n.isRoot||!a.private||a.main||(a.main="./src");if(delete a.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)a.scripts["lint-fix"]=(a.scripts["lint-fix"]??"")+De.getLintFixSuffix(n);else{delete a.scripts.lint,delete a.scripts["lint-fix"];for(const e of["cleanup","check-for-ai"]){const t=a.scripts[e];t&&(a.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){a.scripts.lint="flutter analyze",a.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter(s=>e.existsSync(t.resolve(n.dirPath,s)));s.length>0&&(a.scripts["format-code"]=`dart format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,a.scripts.format=(a.scripts.format??"")+" && yarn format-code")}if(n.doesContainPoetryLock){"poetry install"===a.scripts.postinstall&&delete a.scripts.postinstall;const e=await p.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:T}),t=new Set;for(const n of e){const[e,s]=n.split(/[/\\]/);e&&s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");a.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,a.scripts.lint?a.scripts.lint=`poetry run flake8 ${e} && ${a.scripts.lint}`:(a.scripts.lint=`poetry run flake8 ${e}`,a.scripts["lint-fix"]="yarn lint"),a.scripts.format=(a.scripts.format??"")+" && yarn format-code",m.push("black","isort","flake8")}}n.repository&&(a.repository=function(e){if("string"!=typeof e||!e.startsWith("github:"))return e;const[t,n]=Le.getOrgAndName(e);if(!t||!n)return e;return{type:"git",url:`git+https://github.com/${t}/${n}.git`}}(n.repository))}n.depending.blitz?a.scripts["gen-code"]?.startsWith("blitz codegen")?a.scripts["gen-code"].includes("blitz prisma generate")||(a.scripts["gen-code"]=a.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):a.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!a.scripts["gen-code"]?.startsWith("prisma generate")&&(a.scripts["gen-code"]="prisma generate");a.dependencies.prettier||delete a.devDependencies["@types/prettier"];0===Object.keys(a.dependencies).length&&delete a.dependencies;0===Object.keys(a.devDependencies).length&&delete a.devDependencies;0===Object.keys(a.peerDependencies).length&&delete a.peerDependencies;await async function(e){e.dependencies=e.dependencies??{},e.devDependencies=e.devDependencies??{};const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]);if(t.has("@willbooster/auth")&&!Xe(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await We("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!Xe(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await We("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!Xe(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await We("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#${t}`}if(t.has("@willbooster/judge")&&!Xe(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await We("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!Xe(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await We("WillBoosterLab","llm-proxy");e.dependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#${t}`}}(a),n.isBun&&delete a.packageManager;let g=JSON.stringify(a);if(g=await async function(n,s,i){const r=[];for(const[e]of Object.keys(n))e&&!e.startsWith(":")&&e.includes(":")&&r.push([e,e.replaceAll(":","-")]);if(0===r.length)return s;for(const[e,t]of r)s=s.replaceAll(e,t);const o=await p.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,ignore:T});for(const n of o)await S.run(async()=>{const s=t.join(i.dirPath,n),o=await e.promises.readFile(s,"utf8");let a=o;for(const[e,t]of r)a=a.replaceAll(e,t);a!==o&&await e.promises.writeFile(s,a)});return await S.promiseAll(),s}(a.scripts,g,n),await e.promises.writeFile(r,g),!i){if(d=d.filter(e=>!a.devDependencies?.[e]),d.length>0){const e=[...new Set(d)].map(Ke);n.isBun?(Ie(l,["remove",...new Set(d)],n.dirPath),Ie(l,["add","--exact",...e],n.dirPath)):Ie(l,["add",...e],n.dirPath)}if(u=u.filter(e=>!a.dependencies?.[e]),u.length>0){const e=[...new Set(u)].map(Ke);n.isBun?(Ie(l,["remove",...new Set(u)],n.dirPath),Ie(l,["add","-D","--exact",...e],n.dirPath)):Ie(l,["add","-D",...e],n.dirPath)}m.length>0&&Ie("poetry",["add","--group","dev",...new Set(m)],n.dirPath)}}(n,s,i)})}function Ke(e){return"typescript"===e?"typescript@^5":e}function Ve(e,t){if(e.isBun){const t=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,n={"check-all-for-ai":"bun run check-for-ai && bun run test","check-for-ai":"bun run cleanup"+(t?" && bun run typecheck":""),cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun wb test",typecheck:"bun --bun wb typecheck"};return t||delete n.typecheck,n}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,s=t.test;let i={"check-all-for-ai":"yarn check-for-ai && yarn test","check-for-ai":`yarn format > /dev/null 2> /dev/null || true${n?" && yarn typecheck":""} && yarn lint-fix --quiet`,cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:"eslint --color","lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ge.prettier.join(",")}}" "!**/test{-,/}fixtures/**"`,typecheck:"tsc --noEmit"};return e.doesContainSubPackageJsons?i=c({...i},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ge.prettier.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}):e.depending.pyright&&(i.typecheck=i.typecheck?`${i.typecheck} && `:"",i.typecheck+="pyright"),s?.includes("wb test")&&(i.test=s),n?e.depending.wb&&(i.typecheck="wb typecheck"):delete i.typecheck,i}}function Xe(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const Qe={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},Ze={commands:{cleanup:{glob:"*.{astro,cjs,css,cts,gql,htm,html,java,js,json,json5,jsonc,jsx,md,mjs,mts,scss,svelte,ts,tsx,vue,yaml,yml}",run:""},"check-migrations":{glob:"**/migration.sql",run:"\nif grep -q 'Warnings:' {staged_files}; then\n echo \"Migration SQL files ({staged_files}) contain warnings! Please solve the warnings and commit again.\"\n exit 1\nfi\n".trim()}}},et='\n#!/bin/bash\n\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim();async function tt(n){return x.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook"),i=t.resolve(n.dirPath,".husky"),r=e.existsSync(i),{typecheck:o}=Ve(n,{}),a={...Qe,"pre-commit":{...Ze,commands:{...Ze.commands,cleanup:{...Ze.commands.cleanup,run:nt(n)}}}};o||delete a["pre-push"];await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),d.dump(a,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]),r&&(await Promise.all([e.promises.rm(i,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})]),Ie("git",["config","--unset","core.hooksPath"],n.dirPath));if(o){const i=function(e){let t;t=e.isBun?e.depending.wb?"bun --bun wb typecheck":"bun run typecheck":e.depending.wb?"yarn wb typecheck":"yarn run typecheck";if(e.repository?.startsWith("github:WillBoosterLab/"))return`\n#!/bin/bash\n\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don't push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\n${t}\n`.trim();return t}(n);e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await S.run(()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),i+"\n",{mode:493}))}const c=`${et}\n\n${function(e){const t=[];if(e.hasVersionSettings){const e=String.raw`(mise\.toml|\.mise\.toml|\.tool-versions|\..+-version)`;t.push(String.raw`run_if_changed "${e}" "mise install"`)}const n=e.isBun?"bun install":"yarn",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";t.push(String.raw`run_if_changed "package\.json" "${n}${s}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`);e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`);return t}(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await S.run(()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),c,{mode:493}))}(n)})}function nt(e){const t=e.isBun?"bun":"yarn";return`${e.depending.wb?(e.isBun?"bun --bun wb":"yarn wb")+" lint --fix --format -- {staged_files}":`${t} run format && ${t} run lint-fix`} && git add -- {staged_files}`}const st={node:["src","test","scripts"].toSorted(),blitz:["src","test","scripts","db","integrations","mailers"].toSorted()};async function it(n){return x.functionIgnoringException("generateLintstagedrc",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lintstagedrc.cjs");if(n.isBun)return void await S.run(()=>e.promises.rm(s,{force:!0}));const i=n.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",r=[];if(n.doesContainJavaScript||n.doesContainTypeScript){const e=`\n '${rt(n)}': [${JSON.stringify(`${i}eslint --fix${De.getLintFixSuffix(n)}`)}, '${i}prettier --cache --write'],`;r.push(e)}const o=n.isRoot?" && !file.includes('/packages/')":"";r.push(`\n './**/*.{${ge.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/') && !file.includes('/test/fixtures/')${o});${function(e){return e.doesContainJavaScript||e.doesContainTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${rt(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(n)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${i}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${i}sort-package-json');\n }\n return commands;\n },\n './**/migration.sql': (files) => {\n for (const file of files) {\n const content = fs.readFileSync(file, 'utf-8');\n if (content.includes('Warnings:')) {\n return [\n \`echo '!!! Migration SQL file (\${path.relative('', file)}) contains warnings !!! Solve the warnings and commit again.'\`,\n 'false',\n ];\n }\n }\n return [];\n},`),n.doesContainPubspecYaml&&r.push("\n './{lib,test,test_driver}/**/*.dart': files => {\n const filteredFiles = files.filter(file => !file.includes('generated'))\n .filter(file => !file.endsWith('.freezed.dart') && !file.endsWith('.g.dart'));\n if (filteredFiles.length === 0) return [];\n return [`dart format ${filteredFiles.join(' ')}`];\n },");n.doesContainPoetryLock&&r.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const a=`const fs = require('fs');\nconst path = require('path');\n${n.doesContainJavaScript||n.doesContainTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${r.join("")}\n};\n`;await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.js"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.json"),{force:!0})),await S.run(()=>_.generateFile(s,a))}(n)})}function rt(e){const t=function(e){return e.depending.blitz?st.blitz:st.node}(e).map(e=>`${e}/**/`);return`{,${t.join(",")}}*.{${ge.eslint.join(",")}}`}async function ot(e){return x.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await _.readFileIgnoringError(n)??"",i=ue.getHeadUserContent(s),r=ue.getTailUserContent(s),o=t.resolve(e.dirPath,".gitignore"),a=await ue.readGitignoreWithoutSeparators(o)||"";let c="";e.doesContainPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+r;await S.run(()=>_.generateFile(n,l))})}const at={venvPath:".",venv:".venv"};async function ct(n){return x.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=u(at);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=c.all([s,n,s],{arrayMerge:L})}catch{}const r=JSON.stringify(s);await S.run(()=>_.generateFile(i,r))})}async function lt(n){return x.functionIgnoringException("generateReadme",async()=>{const s=t.resolve(n.dirPath,"README.md");let i=await e.promises.readFile(s,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(i=pt(i,"[](https://github.com/semantic-release/semantic-release)"));const r=n.repository?.slice(n.repository.indexOf(":")+1),o=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const s of o){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let o=s;if(o=(o[0]||"").toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," "),!r)continue;const a=`[](https://github.com/${r}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(i=pt(i,a))}await S.run(()=>_.generateFile(s,i))})}function pt(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const s=e.slice(0,n+1);let i=e.slice(n+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${s}${t}\n${i}`}return`${e}\n${t}\n`}async function dt(n){return x.functionIgnoringException("generateReleaserc",async()=>{const s=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(s))return;const i=JSON.parse(await e.promises.readFile(s,"utf8")),r=i.plugins??[];for(let e=0;e<r.length;e++){const t=Array.isArray(r[e])?r[e]?.[0]:r[e],n=Array.isArray(r[e])&&r[e]?.[1]||{};"@semantic-release/commit-analyzer"===t?r[e]=["@semantic-release/commit-analyzer",c.all([n,{preset:"conventionalcommits"}],{arrayMerge:L})]:"@semantic-release/github"===t&&(r[e]=["@semantic-release/github",c.all([n,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:L})])}const o=JSON.stringify(i);await S.run(()=>_.generateFile(s,o))})}const ut={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function mt(n){return x.functionIgnoringException("generateRenovateJson",async()=>{let s=u(ut);const i=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${i}5`))return;try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=c.all([s,n,s],{arrayMerge:L}),s.extends=s.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(s.packageRules??=[],s.packageRules.some(e=>e.matchPackageNames?.includes("next"))||s.packageRules.push({matchPackageNames:["next"],enabled:!1})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const r=JSON.stringify(s);await S.run(()=>_.generateFile(i,r))})}const ft=["claude-code","codex","cursor","gemini-cli"].flatMap(e=>["--agent",e]),gt="WillBooster/agent-skills",ht="playwright-cli",yt=["--agent","universal",...ft];async function wt(e){return x.functionIgnoringException("installAgentSkills",async()=>{await async function(e){if(!e.isRoot)return;if(Ie("npx",["skills@latest","add",gt,...ft,"--skill","*","--yes"],e.dirPath),function(e){return e.depending.next||e.depending.playwrightTest||e.depending.react||e.depending.storybook||e.doesContainJsxOrTsx||e.doesContainJsxOrTsxInPackages}(e))return;Ie("npx",["skills@latest","remove",ht,...yt,"--yes"],e.dirPath),await Promise.all([bt(e.dirPath,".agents/skills"),bt(e.dirPath,".claude/skills"),bt(e.dirPath,".codex/skills"),bt(e.dirPath,".cursor/skills"),bt(e.dirPath,".gemini/skills"),bt(e.dirPath,".gemini/commands"),vt(e.dirPath)])}(e)})}async function bt(e,n){await o.rm(t.resolve(e,n,ht),{force:!0,recursive:!0})}async function vt(e){const n=t.resolve(e,"skills-lock.json");try{const e=await o.readFile(n,"utf8"),t=JSON.parse(e);if(!function(e){return"object"==typeof e&&null!==e&&"skills"in e&&"object"==typeof e.skills&&null!==e.skills&&!Array.isArray(e.skills)}(t)||!t.skills[ht])return;t.skills=Object.fromEntries(Object.entries(t.skills).filter(([e])=>e!==ht)),await o.writeFile(n,JSON.stringify(t,void 0,2)+"\n")}catch{}}const kt={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},xt={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function jt(n){return x.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=u(n.isRoot?kt:xt);s.extends=function(e){return e.isBun?"@tsconfig/bun/tsconfig.json":e.depending.reactNative?"@tsconfig/react-native/tsconfig.json":["@tsconfig/node-lts/tsconfig.json","@tsconfig/node-ts/tsconfig.json"]}(n),n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?n.isBun||n.depending.reactNative||(s.compilerOptions={...s.compilerOptions,jsx:"react-jsx"}):delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(s.include=s.include?.filter(e=>!e.startsWith("packages/*/")),s.exclude=s.exclude?.filter(e=>!e.startsWith("packages/*/")));const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s.extends=function(e,t){const n=[..._t(e),..._t(t)],s=[...new Set(n)];return 0===s.length?void 0:1===s.length?s[0]:s}(s.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,s=c.all([s,n,s],{arrayMerge:N}),s.include=s.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/"))}catch{}J(s),s.include?.sort(),delete s.compilerOptions?.experimentalDecorators,n.depending.reactNative&&delete s.compilerOptions?.verbatimModuleSyntax;const r=JSON.stringify(s);await S.run(()=>_.generateFile(i,r))})}function _t(e){return e?Array.isArray(e)?e:[e]:[]}const St=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function Pt(n){return x.functionIgnoringException("generateVscodeSettings",async()=>{try{const s=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(s,"utf8");let r=JSON.parse(i);for(const e of St)r=c.all([r,$t(e)]);n.doesContainPoetryLock&&(r=c.all([r,$t("**/.venv/**")])),n.depending.next&&(r=c.all([r,$t("**/.next/**")])),"editor.codeActionsOnSave"in r&&delete r["editor.codeActionsOnSave"],"editor.formatOnSave"in r&&delete r["editor.formatOnSave"],J(r);const o=JSON.stringify(r,void 0,2);await S.run(()=>_.generateFile(s,o))}catch{}})}function $t(e){return{"files.watcherExclude":{[e]:!0}}}async function Ct(n){return x.functionIgnoringException("generateYarnrcYml",async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await S.run(()=>e.promises.rm(s,{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await S.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const i=Te("yarn",["--version"],n.dirPath),r=function(e,t){const n=Te("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);Et(i)<=Et(r)&&i!==r&&Ie("yarn",["set","version",r],n.dirPath,1);const o=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(o,{recursive:!0});for(const n of await e.promises.readdir(o))n.startsWith("yarn-")&&!n.startsWith(`yarn-${r}.`)&&await S.run(()=>e.promises.rm(t.join(o,n)));const a=t.resolve(n.dirPath,".yarnrc");await S.run(()=>e.promises.rm(a,{force:!0}));const c=d.load(await e.promises.readFile(s,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.npmPreapprovedPackages=["@exercode/problem-utils","@willbooster/babel-configs","@willbooster/biome-config","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","@willbooster/prettier-config","@willbooster/shared-lib","@willbooster/wb","next","@next/*","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const s=t.resolve(n.dirPath,".yarnrc","undefined.cjs");await S.run(()=>e.promises.rm(s,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,d.dump(c,{lineWidth:-1})),Ie("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}function Et(e){const[t]=e.split(".");return Number(t)}async function Ft(e){return x.functionIgnoringException("setupLabels",async()=>{const[t,n]=Le.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ge(t))return;const s=Je(t);try{await Bt(s,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await Bt(s,t,n,"d2: easy :rabbit2:","DDD6FE"),await Bt(s,t,n,"d3: medium :ox:","C4B5FD"),await Bt(s,t,n,"d4: hard :squid:","A78BFA"),await Bt(s,t,n,"d5: x-hard :whale2:","8B5CF6"),await Bt(s,t,n,"p1: critical :fire::fire::fire:","EF4444"),await Bt(s,t,n,"p2: urgent :fire::fire:","F87171"),await Bt(s,t,n,"p3: important :fire:","FCA5A5"),await Bt(s,t,n,"p4: nice to have :droplet:","FECACA"),await Bt(s,t,n,"r: blitz","5300bc"),await Bt(s,t,n,"r: firebase","ffca28"),await Bt(s,t,n,"r: prisma","0c344b"),await Bt(s,t,n,"r: react","61dafb"),await Bt(s,t,n,"r: svelte","ff3e00"),await Bt(s,t,n,"r: semantic-release","494949"),await Bt(s,t,n,"ready :rocket:","22C55E"),await Bt(s,t,n,"review requested :mag:","FBCA04"),await Bt(s,t,n,"released :bookmark:","6366F1"),await Bt(s,t,n,"s: 0.5h :clock1230:","F3F4F6"),await Bt(s,t,n,"s: 1h :clock1:","E5E7EB"),await Bt(s,t,n,"s: 2h :clock2:","D1D5DB"),await Bt(s,t,n,"s: 3h :clock3:","9CA3AF"),await Bt(s,t,n,"s: 5h :clock5:","6B7280"),await Bt(s,t,n,"s: 8h :clock8:","4B5563"),await Bt(s,t,n,"s: 13h :clock1:","374151"),await Bt(s,t,n,"t: build :hammer:","BFDBFE"),await Bt(s,t,n,"t: chore :broom:","BFDBFE"),await Bt(s,t,n,"t: ci :construction_worker:","BFDBFE"),await Bt(s,t,n,"t: docs :memo:","BFDBFE"),await Bt(s,t,n,"t: feat :sparkles:","BFDBFE"),await Bt(s,t,n,"t: fix :bug:","BFDBFE"),await Bt(s,t,n,"t: perf :zap:","BFDBFE"),await Bt(s,t,n,"t: refactor :recycle:","BFDBFE"),await Bt(s,t,n,"t: style :lipstick:","BFDBFE"),await Bt(s,t,n,"t: test :test_tube:","BFDBFE"),await Bt(s,t,n,"project","24292F"),await Bt(s,t,n,"focused :dart:","22C55E"),await Bt(s,t,n,"gen-pr-all :robot:","00B4D8"),await Bt(s,t,n,"gen-pr-claude :robot:","00B4D8"),await Bt(s,t,n,"gen-pr-codex :robot:","00B4D8"),await Bt(s,t,n,"gen-pr-gemini :robot:","00B4D8"),await Ot(s,t,n,"bug"),await Ot(s,t,n,"documentation"),await Ot(s,t,n,"duplicate"),await Ot(s,t,n,"enhancement"),await Ot(s,t,n,"good first issue"),await Ot(s,t,n,"help wanted"),await Ot(s,t,n,"invalid"),await Ot(s,t,n,"question"),await Ot(s,t,n,"wontfix"),await Ot(s,t,n,"ready"),await Ot(s,t,n,"review requested"),await Ot(s,t,n,"released"),await Ot(s,t,n,"semantic-release"),await Ot(s,t,n,"llm-pr :robot:"),await Ot(s,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function Bt(e,t,n,s,i){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:s,color:i})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s,color:i})}}async function Ot(e,t,n,s){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s})}catch{}}const At=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function It(e){return x.functionIgnoringException("setupSecrets",async()=>{const[t,n]=Le.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;if(!Ge(t)||!k.doesUploadEnvVars)return;const s=h.config().parsed??{};if(0===Object.keys(s).length)return;const i=Je(t);try{for(const e of At)try{await i.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const e=await i.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:r,key_id:o}=e.data;await y.ready;for(const[e,a]of Object.entries(s)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const s=y.from_base64(r,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,s),p=y.to_base64(l,y.base64_variants.ORIGINAL);await i.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e,encrypted_value:p,key_id:o})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Tt(e){const[t,n]=Le.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ge(t))return;const i=Je(t);await s(()=>i.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}))}const Rt="__PM_RUN__",Wt={"pull_request_template.md":`\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I've confirmed \`All checks have passed\` on this page.\n - PR title follows [Angular's commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn't have \`WIP:\`.\n - The test command (e.g., \`${Rt} test\`) passed.\n - The lint command (e.g., \`${Rt} lint\`) passed.\n - You may leave this box unchecked due to long workflows.\n- [ ] I've reviewed my changes on the GitHub diff view.\n- [ ] I've written the steps to test my changes.\n- [ ] I've added screenshots (if the UI changed).\n - You may leave this box unchecked if you didn't modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language \`C\`.\n3. Write the following code:\n \`\`\`c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n \`\`\`\n4. Push \`Submit\` button.\n5. ...\n--\x3e\n`.trim()};async function Dt(n){return x.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(Wt)){const r=Lt(i,n),o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(w(t,r)>r.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await S.run(()=>_.generateFile(o,r))}})}function Lt(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Rt,n)}const Nt=v.object({typos:v.object({all:v.record(v.string(),v.string()).optional(),doc:v.record(v.string(),v.string()).optional(),ts:v.record(v.string(),v.string()).optional(),text:v.record(v.string(),v.string()).optional()}).optional()});async function Jt(n,s){const i=t.resolve(n,"package.json");try{const r=e.existsSync(i);let a={},c={},l={},p=!1;if(r){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),s=JSON.parse(await o.readFile(e,"utf8"));d=s?.branches??[],u=s?.plugins?.flat()??[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=b(e),s=(await n.getRemotes(!0)).find(e=>"origin"===e.name),i=s?.refs.fetch??s?.refs.push;if("string"==typeof i){const e=await Ut(i);if(e)return e}const r="string"==typeof t.repository?t.repository:t.repository?.url;if(r){const e=await Ut(r);if(e&&"Not Found"!==e.message)return e}}(n,l));let g=function(n){const s=t.resolve(n);return e.existsSync(t.join(s,"mise.toml"))||e.existsSync(t.join(s,".mise.toml"))||e.existsSync(t.join(s,".tool-versions"))}(n);for(const s of["java","node","python"])if(e.existsSync(t.resolve(n,`.${s}-version`))){g=!0;break}let h="";try{h=await o.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let w;try{const e=await o.readFile(y,"utf8");w=Nt.parse(JSON.parse(e))}catch{}const v="string"==typeof f?.full_name?f.full_name:void 0;let k,x;if(v){const e=v.split("/");e.length>=2&&(k=e[0],x=e[1])}const j=v?`github:${v}`:void 0,_={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:j,repoAuthor:k,repoName:x,isWillBoosterRepo:Boolean(j?.startsWith("github:WillBooster/")||j?.startsWith("github:WillBoosterLab/")),isBun:s?.isBun||e.existsSync(t.join(n,"bun.lock")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainSubPackageJsons:Gt("packages/**/package.json",n),doesContainDockerfile:!!h||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainJavaScript:Gt("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Gt("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Gt("{app,src,test}/**/*.{t,j}sx",n),doesContainJavaScriptInPackages:Gt("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Gt("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Gt("packages/**/{app,src,test}/**/*.{t,j}sx",n),hasStartTestServer:!!l.scripts?.["start-test-server"],depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!c["gen-i18n-ts"],litestream:h.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},hasVersionSettings:g,packageJson:l,wbfyJson:w};if(_.isBun||(_.eslintBase=function(e){if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainTypeScript)return e.doesContainJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainJavaScript)return"@willbooster/eslint-config-js"}(_)),_.doesContainGemfile||_.doesContainGoMod||_.doesContainPackageJson||_.doesContainPoetryLock||_.doesContainPomXml||_.doesContainPubspecYaml||_.doesContainTemplateYaml)return _}catch{}}function Gt(e,t){return p.globSync(e,{dot:!0,cwd:t,ignore:T}).length>0}async function Ut(e){const[t,n]=Le.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await Je().request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch(e){const t=function(e){if(!e||"object"!=typeof e)return;const t="response"in e?e.response:void 0,n=t?.status??e.status;if(301!==n&&302!==n)return;const s=t?.headers?.location;if("string"!=typeof s)return;const[i,r]=Le.getOrgAndName(s);if(!i||!r)return;return`${i}/${r}`}(e);t&&(s.full_name=t)}return s}function zt(e){return e.isWillBoosterConfigs&&!0===e.packageJson?.name?.startsWith("@willbooster/eslint-config-")}await async function(){const n=await r(process.argv.slice(2)).command("$0 [paths..]","Make a given project follow the WillBooster standard",e=>{e.positional("paths",{describe:"project paths to be wbfied",array:!0,type:"string",default:["."]})}).options({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;k.isVerbose=n.verbose,k.doesUploadEnvVars=n.env;for(const s of n.paths){const r=t.join(s,"packages"),o=(await i(()=>e.promises.readdir(r,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(r,e.name));await W([s,...o]);const a=await Jt(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=V(a),l=(await Promise.all(o.map(e=>Jt(e,a)))).filter(e=>!!e),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await Ct(a),a.isBun&&await oe(a);const d=!q(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([j(a),R(a),c.then(()=>lt(a)),ee(a,p),fe(a),ye(a),ke(a,p),xe(a),_e(a),Dt(a),Ae(a),mt(a),dt(a),...d?[M(a)]:[],Ft(a),It(a),Tt(a),tt(a),it(a)]),await S.promiseAll();const u=[];for(const e of p)zt(e)||((e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(D(e,e.isRoot?p:[e])),e.depending.playwrightTest&&u.push(F(e)),e.depending.next&&u.push(P(e)),await Pe(e,a),await S.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await ot(e),await Ye(e,a,n.skipDeps),u.push(it(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push(Pt(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(jt(e)),(e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&(a.isBun&&u.push(se(e)),a.isWillBoosterConfigs||u.push(be(e))),e.depending.pyright&&u.push(ct(e))));await Promise.all(u),await S.promiseAll();const m=a.isBun?"bun":"yarn";a.isBun?(e.rmSync(t.join(s,"bun.lock"),{force:!0}),Ie(m,["update"],s)):(e.rmSync(t.join(s,"yarn.lock"),{force:!0}),Ie(m,["install","--no-immutable"],s)),Ie(m,["cleanup"],s),a.isBun||Ie(m,["install","--no-immutable"],s),await wt(a)}}();
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9iaW9tZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy9lc2xpbnRVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy91dGlscy90c2NvbmZpZ0Jhc2UudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9sZWZ0aG9vay50cyIsIi4uL3NyYy91dGlscy9zcmNEaXJlY3Rvcmllcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3NraWxscy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3RzY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy95YXJucmMudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9zZWNyZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy9wYWNrYWdlQ29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xuICBkb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4RG9ja2VyZmlsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhEb2NrZXJmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGNvbmZpZy5kb2NrZXJmaWxlO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuXG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnRG9ja2VyZmlsZScpLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoJ1xcclxcbicsICdcXG4nKS50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCArPSAnXFxuJztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgLy8gUmVwbGFjZSB0aGUgSlNPTiBvYmplY3QgZnJvbSB0aGUgZmlsZVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoLz1cXHMqeyhbXFxTXFxzXSopfTsvLCAoXywgc2V0dGluZ3NUZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCdlc2xpbnQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICdlc2xpbnQ6IHsgaWdub3JlRHVyaW5nQnVpbGRzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCd0eXBlc2NyaXB0OicpKSB7XG4gICAgICAgIHNldHRpbmdzVGV4dCArPSAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9LCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gYD0geyR7c2V0dGluZ3NUZXh0fX07YDtcbiAgICB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbnR5cGUgUGFyc2VkVmFsdWUgPVxuICB8IHsga2luZDogJ2FycmF5JzsgdmFsdWU6IFBhcnNlZFZhbHVlW10gfVxuICB8IHsga2luZDogJ2xpdGVyYWwnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdvYmplY3QnOyB2YWx1ZTogUGFyc2VkT2JqZWN0IH07XG50eXBlIFBhcnNlZE9iamVjdCA9IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcblxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHZhbHVlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnb2JqZWN0JywgdmFsdWUgfSk7XG5cbmNvbnN0IGRlZmF1bHRDb25maWc6IFBhcnNlZE9iamVjdCA9IHtcbiAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICByZXRyaWVzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEnKSxcbiAgdXNlOiBhc09iamVjdCh7XG4gICAgYmFzZVVSTDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb25seS1vbi1mYWlsdXJlJ1wiKSxcbiAgICB2aWRlbzogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ3JldGFpbi1vbi1mYWlsdXJlJyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gIH0pLFxuICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICBjb21tYW5kOiBsaXRlcmFsKFwiJ3lhcm4gc3RhcnQtdGVzdC1zZXJ2ZXInXCIpLFxuICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICB9KSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBwbGF5d3JpZ2h0LmNvbmZpZy50c2ApO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBtYXRjaCA9IC9kZWZpbmVDb25maWdcXHMqXFwoXFxzKihcXHtbXFxzXFxTXSo/fSlcXHMqXFwpOz8vLmV4ZWMob2xkQ29udGVudCk7XG4gICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IG1hdGNoPy5bMV07XG4gICAgaWYgKCFvYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWwob2JqZWN0TGl0ZXJhbCk7XG4gICAgaWYgKCFwYXJzZWQpIHJldHVybjtcblxuICAgIC8vIEtlZXAgZmlsbGluZyBtaXNzaW5nIGRlZmF1bHRzLCBidXQgZG9uJ3Qgb3ZlcndyaXRlIGxvY2FsIGFkanVzdG1lbnRzIG9uIGV2ZXJ5IHJlZ2VuZXJhdGlvbi5cbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZS5hbGw8UGFyc2VkT2JqZWN0PihbZGVmYXVsdENvbmZpZywgcGFyc2VkXSk7XG4gICAgY29uc3QgaGFzU3RhcnRUZXN0U2VydmVyID0gQm9vbGVhbihjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHM/Llsnc3RhcnQtdGVzdC1zZXJ2ZXInXSk7XG4gICAgaWYgKCFoYXNTdGFydFRlc3RTZXJ2ZXIpIHtcbiAgICAgIGRlbGV0ZSBtZXJnZWQud2ViU2VydmVyO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0Jhc2VVcmwgPSBhd2FpdCBoYXNOZXh0UHVibGljQmFzZVVybChjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKCFoYXNCYXNlVXJsKSB7XG4gICAgICBjb25zdCB1c2VDb25maWcgPSBtZXJnZWQudXNlO1xuICAgICAgaWYgKHVzZUNvbmZpZz8ua2luZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZGVsZXRlIHVzZUNvbmZpZy52YWx1ZS5iYXNlVVJMO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5ld09iamVjdExpdGVyYWwgPSBzdHJpbmdpZnlPYmplY3QobWVyZ2VkLCAwKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKG9iamVjdExpdGVyYWwsIG5ld09iamVjdExpdGVyYWwpO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc05leHRQdWJsaWNCYXNlVXJsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBlbnZGaWxlUGF0aHMgPSBbcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZW52JyksIHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnbWlzZS50b21sJyldO1xuICBmb3IgKGNvbnN0IGVudkZpbGVQYXRoIG9mIGVudkZpbGVQYXRocykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoL05FWFRfUFVCTElDX0JBU0VfVVJMXFxzKj0vbS50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBlbnYgZmlsZXMgYXJlIGV4cGVjdGVkIGluIHNvbWUgcmVwb3MuXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsKG9iamVjdExpdGVyYWw6IHN0cmluZyk6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgJ3BsYXl3cmlnaHQtY29uZmlnLnRzJyxcbiAgICBgY29uc3QgY29uZmlnID0gJHtvYmplY3RMaXRlcmFsfTtgLFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgICB0cy5TY3JpcHRLaW5kLlRTXG4gICk7XG4gIGNvbnN0IHN0YXRlbWVudCA9IHNvdXJjZS5zdGF0ZW1lbnRzWzBdO1xuICBpZiAoIXN0YXRlbWVudCB8fCAhdHMuaXNWYXJpYWJsZVN0YXRlbWVudChzdGF0ZW1lbnQpKSByZXR1cm47XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gc3RhdGVtZW50LmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbMF07XG4gIGlmICghZGVjbGFyYXRpb24/LmluaXRpYWxpemVyIHx8ICF0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXRpYWxpemVyKSkgcmV0dXJuO1xuICByZXR1cm4gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihkZWNsYXJhdGlvbi5pbml0aWFsaXplciwgc291cmNlKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogdHMuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7fTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoIXRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fCAoIXRzLmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhdHMuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHBhcnNlZFtwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbiwgc291cmNlOiB0cy5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc291cmNlKTtcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0ID8gYXNPYmplY3QocGFyc2VkT2JqZWN0KSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmICh0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUudmFsdWUsIGxldmVsKTtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG4gIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUudmFsdWUsIGxldmVsKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkodmFsdWVzOiBQYXJzZWRWYWx1ZVtdLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZSh2YWx1ZSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgfSk7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3Qob2JqZWN0OiBQYXJzZWRPYmplY3QsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBsaW5lcyA9IE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKHZhbHVlLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gIH0pO1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyouZW52JywgJyouZW52LionXSwgeyBkb3Q6IHRydWUsIGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9EQVRBQkFTRV9VUkw9XCI/KC4rXFwuc3FsaXRlMylcIj9bXFxuJF0vLFxuICAgICAgICAnREFUQUJBU0VfVVJMPVwiJDE/Y29ubmVjdGlvbl9saW1pdD0xXCJcXG4nXG4gICAgICApO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGVudkZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24ocGFja2FnZURpclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlRGlyUGF0aHMubWFwKGFzeW5jIChwYWNrYWdlRGlyUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3Rlc3QnKTtcbiAgICAgICAgZm9yIChjb25zdCBvbGRUZXN0RGlyTmFtZSBvZiBbJ19fdGVzdHNfXycsICd0ZXN0cyddKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsIG9sZFRlc3REaXJOYW1lKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4Jyk7XG4gICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlQWxsKG9sZFRlc3REaXJOYW1lLCAndGVzdCcpO1xuICAgICAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBuZXdDb250ZW50KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBlRGVmaW5pdGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuOiBQYWNrYWdlQ29uZmlnW11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cGVEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsaWJUeXBlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0B0eXBlcycpO1xuICAgIGNvbnN0IHNyY1R5cGVEaXJQYXRoID1cbiAgICAgIGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zID8gdW5kZWZpbmVkIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnc3JjJywgJ3R5cGVzJyk7XG5cbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucmVhZGRpcihsaWJUeXBlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKTtcbiAgICBpZiAoIWRpcmVudHMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBkaXJlbnQubmFtZS5zbGljZSgwLCAtNSk7XG4gICAgICBjb25zdCBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPSBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgICAgIGxldCBwYWNrYWdlTmFtZSA9IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA/IGRpck5hbWUgOiBkaXJlbnQubmFtZTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZS5pbmNsdWRlcygnX18nKSkge1xuICAgICAgICBwYWNrYWdlTmFtZSA9IGBAJHtwYWNrYWdlTmFtZS5yZXBsYWNlKCdfXycsICcvJyl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0xpYnJhcnkgPSBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNvbmZpZykgPT5cbiAgICAgICAgICBjb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGhhc0xpYnJhcnkpIHtcbiAgICAgICAgICAvLyBNb3ZlIEB0eXBlcy88bmFtZT4vaW5kZXguZC50cyBpZiBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUpKTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lLCAnaW5kZXguZC50cycpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjVHlwZURpclBhdGgpIHtcbiAgICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4gaWYgbm90IGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBzcmNUeXBlRGlyUGF0aCAmJiAhaGFzTGlicmFyeSkge1xuICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4uZC50cyBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgaWdub3JlRW5vZW50QXN5bmMoKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ2luZGV4LmQudHMnKSxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBgJHtkaXJlbnQubmFtZX0uZC50c2ApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50ICovXG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVNZXJnZSh0YXJnZXQ6IG9iamVjdFtdLCBzb3VyY2U6IG9iamVjdFtdLCBvcHRpb25zOiBhbnkpOiBvYmplY3RbXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdIGFzIG9iamVjdCwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCBwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ2F1dG9maXguY2knLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICBwdXNoOiB7XG4gICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgfSxcbiAgfSxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBjb250ZW50czogJ3JlYWQnLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnYXV0b2ZpeC0ke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ0ZpeCBjb2RlIGF1dG9tYXRpY2FsbHknLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDoge1xuICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hdXRvZml4LnltbEBtYWluJyxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgbGludGVyIGZpeFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jbGF1ZGUnOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggQ2xhdWRlIENvZGUnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY2xhdWRlJylcIixcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9nZW4tcHIueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2NvZGluZy10b29sJzogJ2NsYXVkZS1jb2RlJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogJyR7eyBzZWNyZXRzLkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jb2RleCc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDb2RleCBDTEknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY29kZXgnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY29kZXgtY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBPUEVOQUlfQVBJX0tFWTogJyR7eyBzZWNyZXRzLk9QRU5BSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1nZW1pbmknOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggR2VtaW5pIENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1nZW1pbmknKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnZ2VtaW5pLWNsaScsXG4gICAgICAgICAgJ2lzc3VlLW51bWJlcic6ICcke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB8fCBnaXRodWIuZXZlbnQubnVtYmVyIH19JyxcbiAgICAgICAgICAndGVzdC1jb21tYW5kJzogJ3lhcm58YnVuIGNoZWNrLWFsbC1mb3ItYWknLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0VNSU5JX0FQSV9LRVk6ICcke3sgc2VjcmV0cy5HRU1JTklfQVBJX0tFWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JyB8ICdhdXRvZml4JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpKSB7XG4gICAgICAvLyBEb24ndCB0b3VjaCByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBiZWNhdXNlIGl0IGhvc3RzIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlbW92ZSBjb25maWcgb2Ygc2VtYW50aWMgcHVsbCByZXF1ZXN0XG4gICAgY29uc3Qgc2VtYW50aWNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnc2VtYW50aWMueW1sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHNlbWFudGljWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICdhdXRvZml4LnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAnZ2VuLXByLWNsYXVkZS55bWwnLFxuICAgICAgJ2dlbi1wci1jb2RleC55bWwnLFxuICAgICAgJ2dlbi1wci1nZW1pbmkueW1sJyxcbiAgICAgIC4uLmVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lU2V0KSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGNvbnN0IGtpbmQgPSBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lLCAnLnltbCcpIGFzIEtub3duS2luZDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9zaXRvcnk/LmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG4gIGNvbnN0IGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnKSk7XG5cbiAgaWYgKGtpbmQgPT09ICdhdXRvZml4Jykge1xuICAgIGF3YWl0IHdyaXRlWWFtbChnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWcpLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG4gIC8vIFNraXAgYSBicm9rZW4gd29ya2Zsb3dcbiAgaWYgKCEoJ2pvYnMnIGluIG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9ICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnO1xuICB9XG5cbiAgbGV0IGlzUmV1c2FibGVXb3JrZmxvdyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcygnL3JldXNhYmxlLXdvcmtmbG93cy8nKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCB1c2UgcmVsZWFzZS55bWwgaWYgcmVsZWFzZSBicmFuY2ggaXMgbm90IHNwZWNpZmllZFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3JlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBObyBkZWZhdWx0XG4gIH1cbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jPy53aXRoKSByZXR1cm47XG5cbiAgICAvLyBHZW5lcmF0ZSBzeW5jLWZvcmNlLnltbCBiYXNlZCBvbiBzeW5jLnltbCBpZiBpdCBleGlzdHMuXG4gICAgbmV3U2V0dGluZ3Muam9ic1snc3luYy1mb3JjZSddID0gbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IGAtLWZvcmNlICR7cGFyYW1zfWA7XG4gICAgbmV3U2V0dGluZ3MubmFtZSA9ICdGb3JjZSB0byBTeW5jJztcbiAgICBuZXdTZXR0aW5ncy5vbiA9IHsgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwgfTtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWZvcmNlLnltbCcpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgam9iLnNlY3JldHMgPz89IHt9O1xuICAvLyBVc2UgdHJ1c3RlZCBwdWJsaXNoaW5nIGluc3RlYWQgb2YgTlBNX1RPS0VOXG4gIGRlbGV0ZSBqb2Iuc2VjcmV0cy5OUE1fVE9LRU47XG5cbiAgaWYgKFxuICAgIGtpbmQgPT09ICd0ZXN0JyB8fFxuICAgIGtpbmQgPT09ICdyZWxlYXNlJyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItY29kZXgnIHx8XG4gICAga2luZCA9PT0gJ2dlbi1wci1nZW1pbmknXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkdIX1RPS0VOID0gJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fSc7XG4gIH1cblxuICAvLyBTZXQgdGVzdC1jb21tYW5kIGZvciBnZW4tcHIgd29ya2Zsb3dzIGJhc2VkIG9uIHBhY2thZ2UgbWFuYWdlclxuICBpZiAoa2luZCA9PT0gJ2dlbi1wci1jbGF1ZGUnIHx8IGtpbmQgPT09ICdnZW4tcHItY29kZXgnIHx8IGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJykge1xuICAgIGpvYi53aXRoWyd0ZXN0LWNvbW1hbmQnXSA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuIGNoZWNrLWFsbC1mb3ItYWknIDogJ3lhcm4gY2hlY2stYWxsLWZvci1haSc7XG4gIH1cbiAgaWYgKGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOKSB7XG4gICAgam9iLnNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSA9ICcke3sgc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIH19JztcbiAgICBkZWxldGUgam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU47XG4gIH1cbiAgaWYgKFxuICAgIChqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkpIHx8XG4gICAgKGpvYi53aXRoLnNlcnZlcl91cmwgJiYga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSlcbiAgKSB7XG4gICAgam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCA9ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUxFQVNFIH19JztcbiAgfVxuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBwYXJhbXMucmVwbGFjZSgnc3luYyAnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3RlckxhYi8nLCAnV2lsbEJvb3N0ZXIvJyk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGguZG90X2Vudl9wYXRoID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGguZG90X2Vudl9wYXRoO1xuICB9XG5cbiAgLy8gRG9uJ3QgdXNlIGBmbHkgZGVwbG95IC0tanNvbmAgc2luY2UgaXQgY2F1c2VzIGFuIGVycm9yXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmIGpvYi5zZWNyZXRzLkZMWV9BUElfVE9LRU4gJiYgdHlwZW9mIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID09PSAnc3RyaW5nJykge1xuICAgIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID0gam9iLndpdGguZGVwbG95X2NvbW1hbmQucmVwbGFjZSgvXFxzKy0tanNvbi8sICcnKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSAmJiAham9iLndpdGguY2lfbGFiZWwgJiYga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9ICdsYXJnZSc7XG4gIH1cbiAgLy8gQmVjYXVzZSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5wcml2YXRlIGlzIGFsd2F5cyB0cnVlIGlmIGpvYiBpcyBzY2hlZHVsZWRcbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kID09PSAndGVzdCcgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lcjtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi5zZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gTW92ZSBzZWNyZXRzIHByb3AgYWZ0ZXIgd2l0aCBwcm9wXG4gICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKGpvYi5zZWNyZXRzKTtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBXb3JrZmxvdyB7XG4gIGlmICghY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIHJldHVybiBjbG9uZURlZXAocHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3cpO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgY29uc3Qgc3RlcHM6IFN0ZXBbXSA9IFtcbiAgICB7IHVzZXM6ICdhY3Rpb25zL2NoZWNrb3V0QHY2JyB9LFxuICAgIHsgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NicsIHdpdGg6IHsgJ2NoZWNrLWxhdGVzdCc6IHRydWUgfSB9LFxuICAgIC4uLihjb25maWcuaXNCdW4gPyBbeyB1c2VzOiAnb3Zlbi1zaC9zZXR1cC1idW5AdjEnLCB3aXRoOiB7ICdidW4tdmVyc2lvbic6ICdsYXRlc3QnIH0gfV0gOiBbXSksXG4gICAgeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsYCB9LFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGNsZWFudXBgIH0sXG4gIF07XG4gIGlmIChjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHM/LmJ1aWxkKSB7XG4gICAgc3RlcHMucHVzaCh7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBidWlsZGAgfSk7XG4gIH1cbiAgc3RlcHMucHVzaCh7IHVzZXM6ICdhdXRvZml4LWNpL2FjdGlvbkB2MScgfSk7XG5cbiAgY29uc3QgYXV0b2ZpeFdvcmtmbG93ID0gY2xvbmVEZWVwKHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3cpO1xuICBjb25zdCBhdXRvZml4Sm9iID0gYXV0b2ZpeFdvcmtmbG93LmpvYnMuYXV0b2ZpeCA/PyB7ICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnIH07XG4gIGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPSB7IC4uLmF1dG9maXhKb2IsIHN0ZXBzIH07XG4gIHJldHVybiBhdXRvZml4V29ya2Zsb3c7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeWFtbFRleHQgPSB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSwgbm9Db21wYXRNb2RlOiB0cnVlLCBzdHlsZXM6IHsgJyEhbnVsbCc6ICdlbXB0eScgfSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCB5YW1sVGV4dCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLihbXiRdKS9nLCAnY2YuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLihbXiRdKS9nLCAnZS5nLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oW14kXSkvZywgJ2kuZS4kMScpO1xufVxuXG5mdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopZWdcXC4vZywgJy8vJDFlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWllXFwuL2csICcvLyQxaS5lLicpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXJvb3RDb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiBBR0VOVFNfRVhUUkEubWQgZXhpc3RzIGFuZCByZWFkIGl0cyBjb250ZW50XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiBcXGAke3Jvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgJ3Vua25vd24nfVxcYFxuLSBEZXNjcmlwdGlvbjogJHtyb290Q29uZmlnLnBhY2thZ2VKc29uPy5kZXNjcmlwdGlvbn1cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIENyZWF0ZSBhIG5ldyBicmFuY2ggaWYgdGhlIGN1cnJlbnQgYnJhbmNoIGlzIFxcYG1haW5cXGAuXG4tIFJ1biBhbnkgXFxgZ2l0XFxgIGNvbW1hbmRzIHNlcXVlbnRpYWxseS5cbi0gV3JpdGUgdGVzdHMgT05MWSBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAgLSBNYWtlIHN1cmUgdG8gY29udGludWUgdG8gbW9kaWZ5IHRoZSB0ZXN0cyBhbmQgY29kZSB1bnRpbCB0aGUgdGVzdHMgcGFzcy5cbi0gV2hlbiBmaXhpbmcgdGVzdHMsIGdhdGhlciBkZWJ1ZyBpbmZvcm1hdGlvbiB0aHJvdWdoIGxvZ2dpbmcgYW5kIHNjcmVlbnNob3RzIGJlZm9yZSBtb2RpZnlpbmcgdGhlIGNvZGUuXG4tIEFmdGVyIG1ha2luZyBjb2RlIGNoYW5nZXMsIHJ1biBcXGAke3BhY2thZ2VNYW5hZ2VyfSBjaGVjay1hbGwtZm9yLWFpXFxgIHRvIGV4ZWN1dGUgYWxsIHRlc3RzICh0YWtlcyB1cCB0byAxIGhvdXIpLCBvciBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stZm9yLWFpXFxgIGZvciB0eXBlIGNoZWNraW5nIGFuZCBsaW50aW5nIG9ubHkgKHRha2VzIHVwIHRvIDEwIG1pbnV0ZXMpLlxuICAtIElmIHlvdSBhcmUgY29uZmlkZW50IHlvdXIgY2hhbmdlcyB3aWxsIG5vdCBicmVhayBhbnkgdGVzdHMsIHlvdSBtYXkgdXNlIFxcYGNoZWNrLWZvci1haVxcYC5cbi0gT25jZSB5b3UgaGF2ZSB2ZXJpZmllZCB5b3VyIGNoYW5nZXMsIGNvbW1pdCBhbmQgcHVzaCB0aGVtIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoIHRoZW4gY3JlYXRlIGEgUFIgdmlhIFxcYGdoXFxgLlxuICAtIEZvbGxvdyB0aGUgY29udmVudGlvbmFsIGNvbW1pdHM7IHlvdXIgY29tbWl0IG1lc3NhZ2Ugc2hvdWxkIHN0YXJ0IHdpdGggXFxgZmVhdDpcXGAsIFxcYGZpeDpcXGAsIGV0Yy5cbiAgLSBJZiBub3Qgc3BlY2lmaWVkLCBtYWtlIHN1cmUgdG8gYWRkIGEgbmV3IGxpbmUgYXQgdGhlIGVuZCBvZiB5b3VyIGNvbW1pdCBtZXNzYWdlJHtyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvID8gYCB3aXRoOiBcXGBDby1hdXRob3JlZC1ieTogV2lsbEJvb3N0ZXIgKCR7dG9vbE5hbWV9KSA8YWdlbnRAd2lsbGJvb3N0ZXIuY29tPlxcYGAgOiAnJ30uXG4gIC0gQWx3YXlzIGNyZWF0ZSBuZXcgY29tbWl0cy4gQXZvaWQgdXNpbmcgXFxgLS1hbWVuZFxcYC5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5oYXNTdGFydFRlc3RTZXJ2ZXIpXG4gICAgPyBgLSBVc2UgXFxgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIHN0YXJ0LXRlc3Qtc2VydmVyXFxgIHRvIGxhdW5jaCBhIHdlYiBzZXJ2ZXIgZm9yIGRlYnVnZ2luZyBvciB0ZXN0aW5nLmBcbiAgICA6ICcnXG59XG5cbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3MpfVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG5cbiAgY29uc3QgaGFzTmV3U2VjdGlvbiA9IGV4dHJhQ29udGVudD8udHJpbSgpLnN0YXJ0c1dpdGgoJyMnKTtcbiAgY29uc3Qgbm9ybWFsaXplZEV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudFxuICAgID8gaGFzTmV3U2VjdGlvblxuICAgICAgPyAnXFxuXFxuJyArIGV4dHJhQ29udGVudC50cmltKClcbiAgICAgIDogJ1xcbicgKyBleHRyYUNvbnRlbnRcbiAgICA6ICcnO1xuICByZXR1cm4gYmFzZUNvbnRlbnQgKyBub3JtYWxpemVkRXh0cmFDb250ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBlYWNoIG1vZHVsZSB3aXRoIGhpZ2ggY29oZXNpb24sIGdyb3VwaW5nIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSB0b2dldGhlci5cbiAgLSBSZWZhY3RvciBleGlzdGluZyBsYXJnZSBtb2R1bGVzIGludG8gc21hbGxlciwgZm9jdXNlZCBtb2R1bGVzIHdoZW4gbmVjZXNzYXJ5LlxuICAtIENyZWF0ZSB3ZWxsLW9yZ2FuaXplZCBkaXJlY3Rvcnkgc3RydWN0dXJlcyB3aXRoIGxvdyBjb3VwbGluZyBhbmQgaGlnaCBjb2hlc2lvbi5cbi0gV2hlbiBhZGRpbmcgbmV3IGZ1bmN0aW9ucyBvciBjbGFzc2VzLCBkZWZpbmUgdGhlbSBiZWxvdyBhbnkgZnVuY3Rpb25zIG9yIGNsYXNzZXMgdGhhdCBjYWxsIHRoZW0gdG8gbWFpbnRhaW4gYSBjbGVhciB0b3AtZG93biBjYWxsIG9yZGVyLlxuLSBXcml0ZSBjb21tZW50cyB0aGF0IGV4cGxhaW4gXCJ3aHlcIiByYXRoZXIgdGhhbiBcIndoYXRcIi4gQXZvaWQgc3RhdGluZyB3aGF0IGNhbiBiZSB1bmRlcnN0b29kIGZyb20gdGhlIGNvZGUgaXRzZWxmLlxuLSBQcmVmZXIgXFxgdW5kZWZpbmVkXFxgIG92ZXIgXFxgbnVsbFxcYCB1bmxlc3MgZXhwbGljaXRseSByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gUHJlZmVyIHVzaW5nIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgZm9yIHByb21wdHMgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgd2l0aCBhbiBhcnJheSBvZiBzdHJpbmdzLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBXaGVuIGludHJvZHVjaW5nIG5ldyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgdXBkYXRlIHRoZSBsYW5ndWFnZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUgXFxgaTE4blxcYCBkaXJlY3RvcnkgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkuIFJlZmVyZW5jZSB0aGVzZSBzdHJpbmdzIHVzaW5nIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkuIEZvciBleGFtcGxlLCB1c2UgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIGZvciBzdG9yaW5nIGFuIGFycmF5IG9yIGFuIG9iamVjdCB0byBcXGB1c2VTdGF0ZVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYFxuLSBTaW5jZSB0aGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgXFxgdXNlQ2FsbGJhY2tcXGAgb3IgXFxgdXNlTWVtb1xcYCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxuLSBBc3N1bWUgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UuXG5gXG4gICAgOiAnJ1xufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCBleHRyYUNvbnRlbnQpO1xuICByZXR1cm4gYCR7ZnJvbnRtYXR0ZXJ9XFxuXFxuJHtib2R5fWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQmlvbWVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHtcbiAgICAgIHJvb3Q6IGNvbmZpZy5pc1Jvb3QsXG4gICAgICAkc2NoZW1hOiAnLi9ub2RlX21vZHVsZXMvQGJpb21lanMvYmlvbWUvY29uZmlndXJhdGlvbl9zY2hlbWEuanNvbicsXG4gICAgICBleHRlbmRzOiBbJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnXSxcbiAgICB9O1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYmlvbWUuanNvbmMnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudFdpdGhFeGFjdFRydWUgPSBgZW52ID0gZmFsc2VcbnRlbGVtZXRyeSA9IGZhbHNlXG5cbltpbnN0YWxsXVxuZXhhY3QgPSB0cnVlXG5saW5rZXIgPSBcImhvaXN0ZWRcIlxubWluaW11bVJlbGVhc2VBZ2UgPSA0MzIwMDAgIyA1IGRheXNcbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gICAgXCJAZXhlcmNvZGUvcHJvYmxlbS11dGlsc1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2JhYmVsLWNvbmZpZ3NcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9iaW9tZS1jb25maWdcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdFwiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dFwiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHNcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0XCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYlwiLFxuICAgIFwiQHdpbGxib29zdGVyL3diXCIsXG4gICAgXCJuZXh0XCIsXG4gICAgXCJAbmV4dC8qXCIsXG4gICAgXCJyZWFjdFwiLFxuICAgIFwicmVhY3QtZG9tXCJcbl1cbmA7XG5cbmNvbnN0IG5ld0NvbnRlbnRXaXRoRXhhY3RGYWxzZSA9IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlLnJlcGxhY2UoJ2V4YWN0ID0gdHJ1ZScsICdleGFjdCA9IGZhbHNlJyk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJ1bmZpZ1RvbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCdW5maWdUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgICBjb25zdCBjb250ZW50ID1cbiAgICAgIGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpICYmIGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKS5pbmNsdWRlcygnZXhhY3QgPSBmYWxzZScpXG4gICAgICAgID8gbmV3Q29udGVudFdpdGhFeGFjdEZhbHNlXG4gICAgICAgIDogbmV3Q29udGVudFdpdGhFeGFjdFRydWU7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGXjgafjga9ub2RlX21vZHVsZXPjgpJDT1BZ44GZ44KL5b+F6KaB44GM44GC44KL44Gf44KB44CBbm9kZV9tb2R1bGVz44KS6Zmk5aSW44GX44Gm44Gv44GE44GR44Gq44GE44CCXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuKiovLmlkZWFcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IHtcbiAgY29kZVdpdGgySW5kZW50U2l6ZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjcHAnLFxuICAgICdkYXJ0JyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3B1JyxcbiAgICAncHVtbCcsXG4gICAgJ3JiJyxcbiAgICAndnVlJyxcbiAgICAneG1sJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ3NoJyxcbiAgXS50b1NvcnRlZCgpLFxuICBjb2RlV2l0aDRJbmRlbnRTaXplOiBbJ2dvJywgJ2dyYWRsZScsICdqYXZhJywgJ3B5J10udG9Tb3J0ZWQoKSxcbiAgbWFya2Rvd25MaWtlOiBbJ21kJ10udG9Tb3J0ZWQoKSxcbiAgZXNsaW50OiBbJ2NqcycsICdtanMnLCAnanMnLCAnY3RzJywgJ210cycsICd0cycsICd0c3gnLCAnanN4J10udG9Tb3J0ZWQoKSxcbiAgcHJldHRpZXI6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnamF2YScsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NzcycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdtZCcsXG4gICAgJ3Njc3MnLFxuICAgICd2dWUnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS50b1NvcnRlZCgpLFxuICAvLyBjZi4gaHR0cHM6Ly9iaW9tZWpzLmRldi9pbnRlcm5hbHMvbGFuZ3VhZ2Utc3VwcG9ydC9cbiAgYmlvbWU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ2FzdHJvJyxcbiAgICAnY3NzJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ2dxbCcsXG4gIF0udG9Tb3J0ZWQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFc2xpbnRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVzbGludHJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5tanMnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLmVzbGludEJhc2UpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoIW9sZENvbnRlbnQuaW5jbHVkZXMoJ2V4cG9ydCB7IGRlZmF1bHQgfScpKSByZXR1cm47XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnJHtjb25maWcuZXNsaW50QmFzZX0nO2ApKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUgfSBmcm9tICcuL2FnZW50cy5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gIGhhdmVfZnVuOiB0cnVlLFxuICBjb2RlX3Jldmlldzoge1xuICAgIGRpc2FibGU6IGZhbHNlLFxuICAgIGNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkOiAnTUVESVVNJyxcbiAgICBtYXhfcmV2aWV3X2NvbW1lbnRzOiAtMSxcbiAgICBwdWxsX3JlcXVlc3Rfb3BlbmVkOiB7XG4gICAgICBoZWxwOiBmYWxzZSxcbiAgICAgIHN1bW1hcnk6IHRydWUsXG4gICAgICBjb2RlX3JldmlldzogdHJ1ZSxcbiAgICB9LFxuICB9LFxuICBpZ25vcmVfcGF0dGVybnM6IFsnKiovX19nZW5lcmF0ZWRfXyddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2VtaW5pQ29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueW1sJyk7XG4gICAgY29uc3Qgc3R5bGVndWlkZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzdHlsZWd1aWRlLm1kJyk7XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBjbG9uZURlZXAoZGVmYXVsdENvbmZpZyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShjb25maWdGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSBwYXJzZWRcbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChuZXdDb25maWcsIHtcbiAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYOS7peS4i+OBruOCs+ODvOODh+OCo+ODs+OCsOimj+e0hOOCkui4j+OBvuOBiOOBpuOAgeaXpeacrOiqnuOBp+ODrOODk+ODpeODvOOBl+OBpuOBj+OBoOOBleOBhOOAglxcblxcbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3MpfSR7XG4gICAgICBleHRyYUNvbnRlbnQgPyBgXFxuXFxuJHtleHRyYUNvbnRlbnQudHJpbUVuZCgpfWAgOiAnJ1xuICAgIH1gO1xuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSldO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhzdHlsZWd1aWRlRmlsZVBhdGgpKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHN0eWxlZ3VpZGVGaWxlUGF0aCwgc3R5bGVndWlkZUNvbnRlbnQpKSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHZW1pbmlTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc2V0dGluZ3MuanNvbicpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy9pbnN0YWxsL2dpdC1kaWZmLWJ1bi1sb2NrZmlsZVxuY29uc3QgbmV3Q29udGVudCA9IGAqIHRleHQ9YXV0b1xuXG4qLmxvY2tiIGJpbmFyeSBkaWZmPWxvY2tiXG4qLnZjcHJvaiB0ZXh0IGVvbD1jcmxmXG5cbiR7Wy4uLmV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLm1hcmtkb3duTGlrZV1cbiAgLm1hcCgoZXh0KSA9PiBgKi4ke2V4dH0gdGV4dCBlb2w9bGZgKVxuICAuam9pbignXFxuJyl9XG5cbmRpc3QvKiogbGluZ3Vpc3QtZ2VuZXJhdGVkPXRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGF0dHJpYnV0ZXMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBkZWZhdWx0TmFtZXMgPSBbJ3dpbmRvd3MnLCAnbWFjb3MnLCAnbGludXgnLCAnamV0YnJhaW5zJywgJ3Zpc3VhbHN0dWRpb2NvZGUnLCAnZW1hY3MnLCAndmltJywgJ3lhcm4nXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbiEua2VlcFxuLmFpZGVyKlxuLmVudi5wcm9kdWN0aW9uXG4qL21vdW50LyouaGFzaFxuLmRldmNvbnRhaW5lci9cbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4uc2VyZW5hL1xuLnRtcC9cbl9fZ2VuZXJhdGVkX18vXG5Ad2lsbGJvb3N0ZXIvXG5kaXN0L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Hb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAqLnNxbGl0ZTMqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBwbGF5d3JpZ2h0LXJlcG9ydC9cbnRlc3QtcmVzdWx0cy9cbi5wbGF5d3JpZ2h0LWNsaS9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdyZWFjdG5hdGl2ZScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnb29nbGUtc2VydmljZXMuanNvblxuYW5kcm9pZC9hcHAvc3JjL21haW4vYXNzZXRzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc3Rvcnlib29rKSB7XG4gICAgICBuYW1lcy5wdXNoKCdzdG9yeWJvb2tqcycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdGVkID0gJyc7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IChhd2FpdCByZWFkQ2FjaGUobmFtZSkpID8/ICcnO1xuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy50b3B0YWwuY29tL2RldmVsb3BlcnMvZ2l0aWdub3JlL2FwaS8ke25hbWV9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdBdHRlbnRpb24gUmVxdWlyZWQhJykgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCc8dGl0bGU+JykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSByZXNwb25zZVRleHQudHJpbSgpO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVDYWNoZShuYW1lLCBjb250ZW50KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRmV0Y2hlZCAke3VybH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdlbmVyYXRlZCkgZ2VuZXJhdGVkICs9ICdcXG4nO1xuICAgICAgZ2VuZXJhdGVkICs9IGNvbnRlbnQgKyAnXFxuJztcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaWdub3JlRmlsZVV0aWwuaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aCkpKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZSgnIS55YXJuL2NhY2hlJywgJyMgIS55YXJuL2NhY2hlJykucmVwbGFjZSgnIyAucG5wLionLCAnLnBucC4qJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eKC5pZGVhXFwvLispJC9nbSwgJyQxXFxuYW5kcm9pZC8kMScpO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgJ1xcbicgKyBnZW5lcmF0ZWQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNhY2hlJywgJ3diZnknLCAnZ2l0aWdub3JlJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FjaGUobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpO1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhdC5tdGltZU1zID4gNiAqIDYwICogNjAgKiAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cblxuY29uc3QgcHJldHRpZXJDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnLCAnUHJldHRpZXInLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5jb25zdCBiaW9tZUNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdidW4nLCAnLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vYmlvbWUgY2hlY2sgLS1maXggLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0tc2tpcC1wYXJzZS1lcnJvcnMnLCAnQmlvbWUnLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5Hb01vZCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluUG9tWG1sKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWcuaXNCdW4gPyBiaW9tZUNvbnRlbnQgOiBwcmV0dGllckNvbnRlbnQpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBpZiAocmV0LnN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3RkZXJyIG9uIEVOT0VOVC5cbiAgY29uc3Qgc3RkZXJyID0gcHJvYy5zdGRlcnIgPz8gJyc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycgPyBzdGRlcnIudHJpbSgpIDogc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAocHJvYy5lcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIGZhaWxlZCB3aXRoOiAke3Byb2MuZXJyb3IubWVzc2FnZX1gKTtcbiAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gb3V0cHV0cyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdG8gc3RkZXJyOlxcbiR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRvdXQgb24gRU5PRU5ULlxuICBjb25zdCBzdGRvdXQgPSBwcm9jLnN0ZG91dCA/PyAnJztcbiAgcmV0dXJuIHR5cGVvZiBzdGRvdXQgPT09ICdzdHJpbmcnID8gc3Rkb3V0LnRyaW0oKSA6IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5yZXBsYWNlKGAke2Vudi5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJyk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb1VybCA9IGBnaXRAZ2l0aHViLmNvbToke29yZ2FuaXphdGlvbn0vJHtyZXBvfS5naXRgO1xuICAgIGNvbnN0IG91dHB1dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydscy1yZW1vdGUnLCByZXBvVXJsLCAnSEVBRCddLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gb3V0cHV0LnNwbGl0KC9cXHMrLylbMF07XG4gICAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29tbWl0SGFzaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCkpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IEVzbGludFV0aWwgPSB7XG4gIGdldExpbnRGaXhTdWZmaXgoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggPyAnIC0tcnVsZSBcInsgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzOiAwIH1cIicgOiAnJztcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmNsYXNzIEdpdEh1YlV0aWwge1xuICBnZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGNvbnN0IHVybFdpdGhvdXRQcm90b2NvbCA9IHVybE9yRnVsbE5hbWUuc3BsaXQoJzonKS5hdCgtMSk7XG4gICAgY29uc3QgbmFtZXMgPSB1cmxXaXRob3V0UHJvdG9jb2w/LnNwbGl0KCcvJyk7XG4gICAgY29uc3Qgb3JnID0gbmFtZXM/LmF0KC0yKSA/PyAnJztcbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvLmdpdCQvLCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICBjb25zdCBrZXkgPSBvd25lciA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVI7XG4gIH1cbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFc2xpbnRFeHRlbnNpb25CYXNlLCBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcblxuY29uc3QganNDb21tb25EZXBzID0gW1xuICAnQGVzbGludC9qcycsXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbiAgJ2VzbGludC1wbHVnaW4tdW51c2VkLWltcG9ydHMnLFxuICAnZ2xvYmFscycsXG5dO1xuXG5jb25zdCB0c0NvbW1vbkRlcHMgPSBbLi4uanNDb21tb25EZXBzLCAndHlwZXNjcmlwdC1lc2xpbnQnLCAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0J107XG5cbmNvbnN0IHJlYWN0Q29tbW9uRGVwcyA9IFsnZXNsaW50LXBsdWdpbi1yZWFjdCcsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJywgJ2VzbGludC1wbHVnaW4tcmVhY3QtY29tcGlsZXInXTtcblxuY29uc3QgZXNsaW50RGVwczogUmVjb3JkPEVzbGludEV4dGVuc2lvbkJhc2UsIHN0cmluZ1tdPiA9IHtcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsIC4uLmpzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLCAuLi5qc0NvbW1vbkRlcHMsIC4uLnJlYWN0Q29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLCAuLi50c0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JywgLi4udHNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICAgJ0BuZXh0L2VzbGludC1wbHVnaW4tbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoanNvbk9iaiBhcyBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz4pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgIC8vIEZyZXNoIHJlcG8gc3RpbGwgcmVxdWlyZXMgJ3lhcm4gaW5zdGFsbCdcbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC95YXJuXFxzKiYmXFxzKi8sICcnKS5yZXBsYWNlKC95YXJuXFxzKmluc3RhbGxcXHMqJiZcXHMqLywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGpzb25PYmouc2NyaXB0cyA9IG1lcmdlKGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSk7XG5cbiAgaWYgKCdjaGVjay1mb3ItYWknIGluIGpzb25PYmouc2NyaXB0cykge1xuICAgIGlmICgnZ2VuLWNvZGUnIGluIGpzb25PYmouc2NyaXB0cykge1xuICAgICAganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZSA+IC9kZXYvbnVsbCAmJiAke2pzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbiAgICB9XG4gICAganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsID4gL2Rldi9udWxsICYmICR7anNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXX1gO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5ID0gKGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeSA/PyAnJykgKyAoYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCkpO1xuICB9XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1hbGwnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tcmVjdXJzaXZlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXNpbmNlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXdvcmt0cmVlJylcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJywgJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsJyk7XG4gIH1cblxuICBsZXQgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZGV2RGVwZW5kZW5jaWVzID0gWydwcmV0dGllcicsICdzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBwb2V0cnlEZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKFxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICB9IGVsc2Uge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdsaW50LXN0YWdlZCcpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuaHVza3k7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcGFjaztcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrO1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xlZnRob29rJyk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgY29uZmlnLmlzQnVuKSB7XG4gICAgaWYgKGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHdpbGxib29zdGVyL3diJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC93YlxccytkYi8sICd3YiBwcmlzbWEnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAYmlvbWVqcy9iaW9tZScsICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyk7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuZXNsaW50O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLm1pY3JvbWF0Y2g7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3R5cGVzY3JpcHQtZXNsaW50J107XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdlc2xpbnQnLCAnbWljcm9tYXRjaCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4uZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZykpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgndHlwZXNjcmlwdCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5lc2xpbnRCYXNlKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4uZXNsaW50RGVwc1tjb25maWcuZXNsaW50QmFzZV0pO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIH1cblxuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gQmVjYXVzZSBgXCJyZXNvbHV0aW9uc1wiOiB7IFwibnBtL2NoYWxrXCI6IFwiXjQuMS4yXCIgfSxgIGNhdXNlcyBcIkludmFsaWQgbnBtIHRva2VuXCJcbiAgZGVsZXRlIGpzb25PYmoucmVzb2x1dGlvbnM/LlsnbnBtL2NoYWxrJ107XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBpZiAoIWNvbmZpZy5pc0J1bikge1xuICAgICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMubGludDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXTtcbiAgICAgICAgZm9yIChjb25zdCBzY3JpcHROYW1lIG9mIFsnY2xlYW51cCcsICdjaGVjay1mb3ItYWknXSkge1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICAgICAgICBpZiAoIXNjcmlwdCkgY29udGludWU7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdID0gc2NyaXB0LnJlcGxhY2UoLyA/JiYgP3lhcm4gbGludC1maXgoPzogLS1xdWlldCk/LywgJycpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAoanNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID8/ICcnKSArIEVzbGludFV0aWwuZ2V0TGludEZpeFN1ZmZpeChjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGRhcnQgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IChqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID8/ICcnKSArIGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPT09ICdwb2V0cnkgaW5zdGFsbCcpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KC9bL1xcXFxdLyk7XG4gICAgICAgIGlmIChmaXJzdCAmJiBzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgcG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgcG9ldHJ5IHJ1biBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IChqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID8/ICcnKSArIGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICAgIHBvZXRyeURldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnJlcG9zaXRvcnkpIHtcbiAgICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihjb25maWcucmVwb3NpdG9yeSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgnYmxpdHogY29kZWdlbicpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAnYmxpdHogY29kZWdlbic7XG4gICAgfSBlbHNlIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLmluY2x1ZGVzKCdibGl0eiBwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLnJlcGxhY2UoXG4gICAgICAgICdibGl0eiBjb2RlZ2VuJyxcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4gJiYgYmxpdHogcHJpc21hIGdlbmVyYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgncHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAncHJpc21hIGdlbmVyYXRlJztcbiAgfVxuXG4gIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXMucHJldHRpZXIpIHtcbiAgICAvLyBCZWNhdXNlIEB0eXBlcy9wcmV0dGllciBibG9ja3MgcHJldHRpZXIgZXhlY3V0aW9uLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzO1xuICB9XG5cbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICBsZXQgbmV3SnNvblRleHQgPSBKU09OLnN0cmluZ2lmeShqc29uT2JqKTtcbiAgbmV3SnNvblRleHQgPSBhd2FpdCBmaXhTY3JpcHROYW1lcyhqc29uT2JqLnNjcmlwdHMsIG5ld0pzb25UZXh0LCBjb25maWcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0pzb25UZXh0KTtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgLy8gV2UgY2Fubm90IGFkZCBkZXBlbmRlbmNpZXMgd2hpY2ggYXJlIGFscmVhZHkgaW5jbHVkZWQgaW4gZGV2RGVwZW5kZW5jaWVzLlxuICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVycyA9IFsuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldLm1hcChnZXREZXBlbmRlbmN5U3BlY2lmaWVyKTtcbiAgICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3JlbW92ZScsIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctLWV4YWN0JywgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJbnRlbnRpb25hbGx5IG9taXQgdmVyc2lvbnMgdG8gdXBkYXRlIGRlcGVuZGVuY2llcyB0byB0aGUgbGF0ZXN0IHZlcnNpb25zIHdpdGggWWFybi5cbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRldkRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXBlbmRlbmNpZXMuXG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpZiAoZGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGRldkRlcGVuZGVuY3lTcGVjaWZpZXJzID0gWy4uLm5ldyBTZXQoZGV2RGVwZW5kZW5jaWVzKV0ubWFwKGdldERlcGVuZGVuY3lTcGVjaWZpZXIpO1xuICAgICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsncmVtb3ZlJywgLi4ubmV3IFNldChkZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy1EJywgJy0tZXhhY3QnLCAuLi5kZXZEZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEludGVudGlvbmFsbHkgb21pdCB2ZXJzaW9ucyB0byB1cGRhdGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbnMgd2l0aCBZYXJuLlxuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy1EJywgLi4uZGV2RGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwb2V0cnlEZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLm5ldyBTZXQocG9ldHJ5RGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChqc29uT2JqLmF1dGhvciA9PT0gJ1dpbGxCb29zdGVyIExMQycpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LWFsbC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrL3dhcm4nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmdlbi1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpjb2RlZ2VuJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy50c2xpYjtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXJlYWN0J107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci90c2NvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItbm9kZSddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4tcHJldHRpZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmxlcm5hO1xuICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmbHV0dGVyLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtZmx1dHRlciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydweXRob24tZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1weXRob24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGllcjtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stYWxsJ107XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSgnbGVybmEuanNvbicsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gIC8vIE1pZ3JhdGUgZnJvbSBFU0xpbnQgbGVnYWN5IGNvbmZpZ3MgdG8gZmxhdCBjb25maWdzLFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4taW1wb3J0J107XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gVGhlIGN1cnJlbnQgRVNMaW50IHN0YWNrIGluIGdlbmVyYXRlZCByZXBvcyBkb2VzIG5vdCBzdXBwb3J0IFR5cGVTY3JpcHQgNiB5ZXQuXG4gIGlmIChkZXBlbmRlbmN5ID09PSAndHlwZXNjcmlwdCcpIHJldHVybiAndHlwZXNjcmlwdEBeNSc7XG4gIHJldHVybiBkZXBlbmRlbmN5O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgIT09ICdzdHJpbmcnIHx8ICFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkge1xuICAgIHJldHVybiByZXBvc2l0b3J5O1xuICB9XG5cbiAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykge1xuICAgIHJldHVybiByZXBvc2l0b3J5O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnZ2l0JyxcbiAgICB1cmw6IGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ2J1biBydW4gY2hlY2stZm9yLWFpICYmIGJ1biBydW4gdGVzdCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogYGJ1biBydW4gY2xlYW51cCR7aGFzVHlwZWNoZWNrID8gJyAmJiBidW4gcnVuIHR5cGVjaGVjaycgOiAnJ31gLFxuICAgICAgY2xlYW51cDogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0JyxcbiAgICAgIGZvcm1hdDogYGJ1biAtLWJ1biB3YiBsaW50IC0tZm9ybWF0YCxcbiAgICAgIGxpbnQ6IGBidW4gLS1idW4gd2IgbGludGAsXG4gICAgICAnbGludC1maXgnOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXgnLFxuICAgICAgdGVzdDogJ2J1biB3YiB0ZXN0JyxcbiAgICAgIHR5cGVjaGVjazogJ2J1biAtLWJ1biB3YiB0eXBlY2hlY2snLFxuICAgIH07XG4gICAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgICBjb25zdCBvbGRUZXN0ID0gb2xkU2NyaXB0cy50ZXN0O1xuICAgIGxldCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2NoZWNrLWFsbC1mb3ItYWknOiAneWFybiBjaGVjay1mb3ItYWkgJiYgeWFybiB0ZXN0JyxcbiAgICAgICdjaGVjay1mb3ItYWknOiBgeWFybiBmb3JtYXQgPiAvZGV2L251bGwgMj4gL2Rldi9udWxsIHx8IHRydWUke1xuICAgICAgICBoYXNUeXBlY2hlY2sgPyAnICYmIHlhcm4gdHlwZWNoZWNrJyA6ICcnXG4gICAgICB9ICYmIHlhcm4gbGludC1maXggLS1xdWlldGAsXG4gICAgICBjbGVhbnVwOiAneWFybiBmb3JtYXQgJiYgeWFybiBsaW50LWZpeCcsXG4gICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5YCxcbiAgICAgIGxpbnQ6IGBlc2xpbnQgLS1jb2xvcmAsXG4gICAgICAnbGludC1maXgnOiAneWFybiBsaW50IC0tZml4JyxcbiAgICAgIHByZXR0aWZ5OiBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX1cIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYCxcbiAgICAgIHR5cGVjaGVjazogJ3RzYyAtLW5vRW1pdCcsXG4gICAgfTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBzY3JpcHRzID0gbWVyZ2UoXG4gICAgICAgIHsgLi4uc2NyaXB0cyB9LFxuICAgICAgICB7XG4gICAgICAgICAgZm9ybWF0OiBgc29ydC1wYWNrYWdlLWpzb24gJiYgeWFybiBwcmV0dGlmeSAmJiB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gZm9ybWF0YCxcbiAgICAgICAgICBsaW50OiBgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnRgLFxuICAgICAgICAgICdsaW50LWZpeCc6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludC1maXgnLFxuICAgICAgICAgIHByZXR0aWZ5OiBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbihcbiAgICAgICAgICAgICcsJ1xuICAgICAgICAgICl9fVwiIFwiISoqL3BhY2thZ2VzLyoqXCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImAsXG4gICAgICAgICAgLy8gQ0k9MSBwcmV2ZW50cyB2aXRlc3QgZnJvbSBlbmFibGluZyB3YXRjaC5cbiAgICAgICAgICAvLyBGT1JDRV9DT0xPUj0zIG1ha2Ugd2IgZW5hYmxlIGNvbG9yIG91dHB1dC5cbiAgICAgICAgICB0ZXN0OiAnQ0k9MSBGT1JDRV9DT0xPUj0zIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tdmVyYm9zZSBydW4gdGVzdCcsXG4gICAgICAgICAgdHlwZWNoZWNrOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIHR5cGVjaGVjaycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gc2NyaXB0cy50eXBlY2hlY2sgPyBgJHtzY3JpcHRzLnR5cGVjaGVja30gJiYgYCA6ICcnO1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJ3B5cmlnaHQnO1xuICAgIH1cbiAgICBpZiAob2xkVGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgICAgc2NyaXB0cy50ZXN0ID0gb2xkVGVzdDtcbiAgICB9XG5cbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSAnd2IgdHlwZWNoZWNrJztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBpbmRleCA9IGV4aXN0aW5nQ29udGVudC5pbmRleE9mKGlnbm9yZUZpbGVVdGlsLnNlcGFyYXRvclByZWZpeCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiAnJztcblxuICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQuc2xpY2UoMCwgaW5kZXgpO1xuICBjb25zdCBsaW5lcyA9IG9yaWdpbmFsQ29udGVudFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBuZXdMaW5lID0gbGluZS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3TGluZS5lbmRzV2l0aCgnLycpID8gbmV3TGluZS5zbGljZSgwLCAtMSkgOiBuZXdMaW5lO1xuICAgIH0pXG4gICAgLmZpbHRlcigobCkgPT4gbCAmJiAhbC5zdGFydHNXaXRoKCcjJykgJiYgIWwuaW5jbHVkZXMoJy8nKSk7XG5cbiAgcmV0dXJuIGAke2xpbmVzLm1hcCgobGluZSkgPT4gYCBcIiEqKi8ke2xpbmV9LyoqXCJgKS5qb2luKCcnKX0gfHwgdHJ1ZWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeFNjcmlwdE5hbWVzKFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuZXdKc29uVGV4dDogc3RyaW5nLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG9sZEFuZE5ld1NjcmlwdE5hbWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5XSBvZiBPYmplY3Qua2V5cyhzY3JpcHRzKSkge1xuICAgIGlmIChrZXkgJiYgIWtleS5zdGFydHNXaXRoKCc6JykgJiYga2V5LmluY2x1ZGVzKCc6JykpIHtcbiAgICAgIG9sZEFuZE5ld1NjcmlwdE5hbWVzLnB1c2goW2tleSwga2V5LnJlcGxhY2VBbGwoJzonLCAnLScpXSk7XG4gICAgfVxuICB9XG4gIGlmIChvbGRBbmROZXdTY3JpcHROYW1lcy5sZW5ndGggPT09IDApIHJldHVybiBuZXdKc29uVGV4dDtcblxuICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBvbGRBbmROZXdTY3JpcHROYW1lcykge1xuICAgIG5ld0pzb25UZXh0ID0gbmV3SnNvblRleHQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgfVxuICBjb25zdCBmaWxlcyA9IGF3YWl0IGZnLmdsb2IoWycqKi8qLnttZCxjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLCAnKiovRG9ja2VyZmlsZSddLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCBmaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gb2xkQ29udGVudDtcbiAgICAgIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwob2xkTmFtZSwgbmV3TmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAobmV3Q29udGVudCAhPT0gb2xkQ29udGVudCkge1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgcmV0dXJuIG5ld0pzb25UZXh0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcGFja2FnZU5hbWVzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLCAuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcyldKTtcbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9hdXRoJykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2F1dGgnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2F1dGgnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnYXV0aCcpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2F1dGguZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAZGlzY29yZC1ib3Qvc2hhcmVkJykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQGRpc2NvcmQtYm90L3NoYXJlZCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAZGlzY29yZC1ib3Qvc2hhcmVkJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2Rpc2NvcmQtYm90Jyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BkaXNjb3JkLWJvdC9zaGFyZWQnXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9kaXNjb3JkLWJvdC5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cblxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplciddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdjb2RlLWFuYWx5emVyJyk7XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ10gPVxuICAgICAgYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2NvZGUtYW5hbHl6ZXIuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvanVkZ2UnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvanVkZ2UnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2p1ZGdlJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2p1ZGdlJyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9qdWRnZSddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2p1ZGdlLmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2xsbS1wcm94eScpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2xsbS1wcm94eSddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdsbG0tcHJveHknKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2xsbS1wcm94eSddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2xsbS1wcm94eS5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmo6IFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwganNvbk9iai5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHJldHVybiAnQHRzY29uZmlnL2J1bi90c2NvbmZpZy5qc29uJztcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZS90c2NvbmZpZy5qc29uJztcbiAgfVxuICByZXR1cm4gWydAdHNjb25maWcvbm9kZS1sdHMvdHNjb25maWcuanNvbicsICdAdHNjb25maWcvbm9kZS10cy90c2NvbmZpZy5qc29uJ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgcmV0dXJuIFsnQHRzY29uZmlnL2J1biddO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuIFsnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSddO1xuICB9XG4gIHJldHVybiBbJ0B0c2NvbmZpZy9ub2RlLWx0cycsICdAdHNjb25maWcvbm9kZS10cyddO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmludGVyZmFjZSBMZWZ0aG9va1NldHRpbmdzIHtcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ3ByZXBhcmUuc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuICAncHJlLWNvbW1pdCc6IHtcbiAgICBjb21tYW5kczoge1xuICAgICAgY2xlYW51cDoge1xuICAgICAgICBnbG9iOiBzdHJpbmc7XG4gICAgICAgIHJ1bjogc3RyaW5nO1xuICAgICAgfTtcbiAgICAgICdjaGVjay1taWdyYXRpb25zJzoge1xuICAgICAgICBnbG9iOiBzdHJpbmc7XG4gICAgICAgIHJ1bjogc3RyaW5nO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuICAncHJlLXB1c2gnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ2NoZWNrLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJztcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbn1cblxuY29uc3QgYmFzZVNldHRpbmdzOiBPbWl0PExlZnRob29rU2V0dGluZ3MsICdwcmUtY29tbWl0Jz4gPSB7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdwcmVwYXJlLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdjaGVjay5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBwcmVDb21taXRTZXR0aW5nczogTGVmdGhvb2tTZXR0aW5nc1sncHJlLWNvbW1pdCddID0ge1xuICBjb21tYW5kczoge1xuICAgIGNsZWFudXA6IHtcbiAgICAgIGdsb2I6ICcqLnthc3RybyxjanMsY3NzLGN0cyxncWwsaHRtLGh0bWwsamF2YSxqcyxqc29uLGpzb241LGpzb25jLGpzeCxtZCxtanMsbXRzLHNjc3Msc3ZlbHRlLHRzLHRzeCx2dWUseWFtbCx5bWx9JyxcbiAgICAgIHJ1bjogJycsXG4gICAgfSxcbiAgICAnY2hlY2stbWlncmF0aW9ucyc6IHtcbiAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgIHJ1bjogYFxuaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyB7c3RhZ2VkX2ZpbGVzfTsgdGhlblxuICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlcyAoe3N0YWdlZF9maWxlc30pIGNvbnRhaW4gd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICBleGl0IDFcbmZpXG5gLnRyaW0oKSxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBjb25zdCBodXNreURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3knKTtcbiAgY29uc3QgaGFzSHVza3lEaXIgPSBmcy5leGlzdHNTeW5jKGh1c2t5RGlyUGF0aCk7XG4gIGNvbnN0IHsgdHlwZWNoZWNrIH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCB7fSk7XG4gIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPExlZnRob29rU2V0dGluZ3M+ID0ge1xuICAgIC4uLmJhc2VTZXR0aW5ncyxcbiAgICAncHJlLWNvbW1pdCc6IHtcbiAgICAgIC4uLnByZUNvbW1pdFNldHRpbmdzLFxuICAgICAgY29tbWFuZHM6IHtcbiAgICAgICAgLi4ucHJlQ29tbWl0U2V0dGluZ3MuY29tbWFuZHMsXG4gICAgICAgIGNsZWFudXA6IHtcbiAgICAgICAgICAuLi5wcmVDb21taXRTZXR0aW5ncy5jb21tYW5kcy5jbGVhbnVwLFxuICAgICAgICAgIHJ1bjogZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbiAgaWYgKCF0eXBlY2hlY2spIHtcbiAgICBkZWxldGUgc2V0dGluZ3NbJ3ByZS1wdXNoJ107XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShcbiAgICAgIHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2xlZnRob29rLnltbCcpLFxuICAgICAgeWFtbC5kdW1wKHNldHRpbmdzLCB7XG4gICAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgICAgc3R5bGVzOiB7XG4gICAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcbiAgaWYgKGhhc0h1c2t5RGlyKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZnMucHJvbWlzZXMucm0oaHVza3lEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSksXG4gICAgXSk7XG4gICAgc3Bhd25TeW5jKCdnaXQnLCBbJ2NvbmZpZycsICctLXVuc2V0JywgJ2NvcmUuaG9va3NQYXRoJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmICh0eXBlY2hlY2spIHtcbiAgICBjb25zdCBwcmVQdXNoID0gZ2V0UHJlUHVzaFNjcmlwdChjb25maWcpO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBsZXQgdHlwZWNoZWNrQ29tbWFuZDogc3RyaW5nO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgdHlwZWNoZWNrQ29tbWFuZCA9IGNvbmZpZy5kZXBlbmRpbmcud2IgPyAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycgOiAnYnVuIHJ1biB0eXBlY2hlY2snO1xuICB9IGVsc2Uge1xuICAgIHR5cGVjaGVja0NvbW1hbmQgPSBjb25maWcuZGVwZW5kaW5nLndiID8gJ3lhcm4gd2IgdHlwZWNoZWNrJyA6ICd5YXJuIHJ1biB0eXBlY2hlY2snO1xuICB9XG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgcmV0dXJuIGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG4ke3R5cGVjaGVja0NvbW1hbmR9XG5gLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gdHlwZWNoZWNrQ29tbWFuZDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgY29uc3QgY29tbWFuZCA9IGNvbmZpZy5kZXBlbmRpbmcud2JcbiAgICA/IGAke2NvbmZpZy5pc0J1biA/ICdidW4gLS1idW4gd2InIDogJ3lhcm4gd2InfSBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9YFxuICAgIDogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBmb3JtYXQgJiYgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGxpbnQtZml4YDtcbiAgcmV0dXJuIGAke2NvbW1hbmR9ICYmIGdpdCBhZGQgLS0ge3N0YWdlZF9maWxlc31gO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcuaGFzVmVyc2lvblNldHRpbmdzKSB7XG4gICAgY29uc3QgdG9vbHNDaGFuZ2VkUGF0dGVybiA9IFN0cmluZy5yYXdgKG1pc2VcXC50b21sfFxcLm1pc2VcXC50b21sfFxcLnRvb2wtdmVyc2lvbnN8XFwuListdmVyc2lvbilgO1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIiR7dG9vbHNDaGFuZ2VkUGF0dGVybn1cIiBcIm1pc2UgaW5zdGFsbFwiYCk7XG4gIH1cbiAgY29uc3QgaW5zdGFsbENvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIGluc3RhbGwnIDogJ3lhcm4nO1xuICBjb25zdCBybU5leHREaXJlY3RvcnkgPSBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCA/ICcgJiYgcm0gLVJmIC5uZXh0JyA6ICcnO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwYWNrYWdlXFwuanNvblwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yeX1cImApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBnZW5lcmF0ZVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBjb2RlZ2VuXCJgXG4gICAgKTtcbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBnZW5lcmF0ZVwiYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IHNyY0RpcmVjdG9yaWVzID0ge1xuICBub2RlOiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnXS50b1NvcnRlZCgpLFxuICBibGl0ejogWydzcmMnLCAndGVzdCcsICdzY3JpcHRzJywgJ2RiJywgJ2ludGVncmF0aW9ucycsICdtYWlsZXJzJ10udG9Tb3J0ZWQoKSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcmNEaXJzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICByZXR1cm4gc3JjRGlyZWN0b3JpZXMuYmxpdHo7XG4gIH1cbiAgcmV0dXJuIHNyY0RpcmVjdG9yaWVzLm5vZGU7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRTcmNEaXJzIH0gZnJvbSAnLi4vdXRpbHMvc3JjRGlyZWN0b3JpZXMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMaW50c3RhZ2VkcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmNqcycpO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYWNrYWdlUHJlZml4ID0gY29uZmlnLmlzUm9vdCA/ICdub2RlIG5vZGVfbW9kdWxlcy8uYmluLycgOiAnbm9kZSAuLi8uLi9ub2RlX21vZHVsZXMvLmJpbi8nO1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgIGNvbnN0IGVzbGludCA9IGBcbiAgJyR7Z2V0RXNsaW50S2V5KGNvbmZpZyl9JzogWyR7SlNPTi5zdHJpbmdpZnkoXG4gICAgYCR7cGFja2FnZVByZWZpeH1lc2xpbnQgLS1maXgke0VzbGludFV0aWwuZ2V0TGludEZpeFN1ZmZpeChjb25maWcpfWBcbiAgKX0sICcke3BhY2thZ2VQcmVmaXh9cHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlJ10sYDtcbiAgICBsaW5lcy5wdXNoKGVzbGludCk7XG4gIH1cbiAgY29uc3QgcGFja2FnZXNGaWx0ZXIgPSBjb25maWcuaXNSb290ID8gXCIgJiYgIWZpbGUuaW5jbHVkZXMoJy9wYWNrYWdlcy8nKVwiIDogJyc7XG4gIGxpbmVzLnB1c2goYFxuICAnLi8qKi8qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX0nOiBmaWxlcyA9PiB7XG4gICAgbGV0IGZpbHRlcmVkRmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhZmlsZS5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJykgJiYgIWZpbGUuaW5jbHVkZXMoJy90ZXN0L2ZpeHR1cmVzLycpJHtwYWNrYWdlc0ZpbHRlcn0pOyR7Z2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIoY29uZmlnKX1cbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBjb21tYW5kcyA9IFtcXGAke3BhY2thZ2VQcmVmaXh9cHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlIFxcJHtmaWx0ZXJlZEZpbGVzLmpvaW4oJyAnKX1cXGBdO1xuICAgIGlmIChmaWx0ZXJlZEZpbGVzLnNvbWUoZmlsZSA9PiBmaWxlLmVuZHNXaXRoKCdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goJyR7cGFja2FnZVByZWZpeH1zb3J0LXBhY2thZ2UtanNvbicpO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWFuZHM7XG4gIH0sXG4gICcuLyoqL21pZ3JhdGlvbi5zcWwnOiAoZmlsZXMpID0+IHtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKTtcbiAgICBpZiAoY29udGVudC5pbmNsdWRlcygnV2FybmluZ3M6JykpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFxcYGVjaG8gJyEhISBNaWdyYXRpb24gU1FMIGZpbGUgKFxcJHtwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKX0pIGNvbnRhaW5zIHdhcm5pbmdzICEhISBTb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi4nXFxgLFxuICAgICAgICAnZmFsc2UnLFxuICAgICAgXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufSxgKTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgbGluZXMucHVzaChgXG4gICcuL3tsaWIsdGVzdCx0ZXN0X2RyaXZlcn0vKiovKi5kYXJ0JzogZmlsZXMgPT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhZmlsZS5pbmNsdWRlcygnZ2VuZXJhdGVkJykpXG4gICAgICAuZmlsdGVyKGZpbGUgPT4gIWZpbGUuZW5kc1dpdGgoJy5mcmVlemVkLmRhcnQnKSAmJiAhZmlsZS5lbmRzV2l0aCgnLmcuZGFydCcpKTtcbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gW1xcYGRhcnQgZm9ybWF0IFxcJHtmaWx0ZXJlZEZpbGVzLmpvaW4oJyAnKX1cXGBdO1xuICB9LGApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgbGluZXMucHVzaChgXG4gICcuLyoqLyoucHknOiBbXG4gICAgJ3BvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzJyxcbiAgICAncG9ldHJ5IHJ1biBibGFjaycsXG4gICAgJ3BvZXRyeSBydW4gZmxha2U4J1xuICBdLGApO1xuICB9XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuJHtjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgPyBcImNvbnN0IG1pY3JvbWF0Y2ggPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XFxuXCIgOiAnJ31cbm1vZHVsZS5leHBvcnRzID0geyR7bGluZXMuam9pbignJyl9XG59O1xuYDtcblxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXNsaW50S2V5KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRpcnMgPSBnZXRTcmNEaXJzKGNvbmZpZykubWFwKChkaXIpID0+IGAke2Rpcn0vKiovYCk7XG4gIHJldHVybiBgeywke2RpcnMuam9pbignLCcpfX0qLnske2V4dGVuc2lvbnMuZXNsaW50LmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdFxuICAgID8gYFxcblxuICAgIGZpbHRlcmVkRmlsZXMgPSBmaWx0ZXJlZEZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZWxhdGl2ZSgnJywgZmlsZSkpO1xuICAgIGZpbHRlcmVkRmlsZXMgPSBtaWNyb21hdGNoLm5vdChmaWx0ZXJlZEZpbGVzLCAnJHtnZXRFc2xpbnRLZXkoY29uZmlnKX0nKTtcbiAgICBmaWx0ZXJlZEZpbGVzID0gZmlsdGVyZWRGaWxlcy5tYXAoKGZpbGUpID0+IHBhdGgucmVzb2x2ZShmaWxlKSk7YFxuICAgIDogJyc7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgdmVudlBhdGg6ICcuJyxcbiAgdmVudjogJy52ZW52Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSBjbG9uZURlZXAoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkge1xuICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLnJlYWRkaXJTeW5jKGAke2NvbmZpZy5kaXJQYXRofS8uZ2l0aHViL3dvcmtmbG93c2ApO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuXG4gICAgICBsZXQgYmFkZ2VOYW1lID0gZmlsZU5hbWU7XG4gICAgICBiYWRnZU5hbWUgPSAoYmFkZ2VOYW1lWzBdIHx8ICcnKS50b1VwcGVyQ2FzZSgpICsgYmFkZ2VOYW1lLnNsaWNlKDEsIGJhZGdlTmFtZS5pbmRleE9mKCcuJykpO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgICAgaWYgKCFyZXBvc2l0b3J5KSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGJhZGdlID0gYFshWyR7YmFkZ2VOYW1lfV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0vYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0pYDtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC5naXRodWIvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBiYWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOaXouOBq2JhZGdl44GM44GC44KL5aC05ZCI44Gv5YmK6ZmkXG4gIHJlYWRtZSA9IHJlYWRtZS5yZXBsYWNlKGJhZGdlLCAnJykucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFkbWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVhZG1lW2kgLSAxXSA9PT0gJ1xcbicgJiYgcmVhZG1lW2ldID09PSAnXFxuJykge1xuICAgICAgY29uc3QgYmVmb3JlID0gcmVhZG1lLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgIGxldCBhZnRlciA9IHJlYWRtZS5zbGljZShpICsgMSk7XG4gICAgICBpZiAoIWFmdGVyLnN0YXJ0c1dpdGgoJ1snKSAmJiAhYWZ0ZXIuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgIGFmdGVyID0gYFxcbiR7YWZ0ZXJ9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtiZWZvcmV9JHtiYWRnZX1cXG4ke2FmdGVyfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHtyZWFkbWV9XFxuJHtiYWRnZX1cXG5gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucyA/PyBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IEFycmF5LmlzQXJyYXkocGx1Z2luc1tpXSkgPyBwbHVnaW5zW2ldPy5bMF0gOiBwbHVnaW5zW2ldO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKEFycmF5LmlzQXJyYXkocGx1Z2luc1tpXSkgJiYgcGx1Z2luc1tpXT8uWzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFsnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbjUnXSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSB0eXBlb2YganNvbk9iaiAmIHsgcGFja2FnZVJ1bGVzPzogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXSB9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGpzb25PYmopIGFzIFNldHRpbmdzO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncmVub3ZhdGUuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2ZpbGVQYXRofTVgKSkge1xuICAgICAgLy8gU2luY2UgaXQgaXMgZGlmZmljdWx0IGZvciBwYXJzaW5nIHJlbm92YXRlLmpzb241LCB3ZSBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSAnQHdpbGxib29zdGVyJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdXBncmFkZSBOZXh0LmpzIGF1dG9tYXRpY2FsbHlcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzID8/PSBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgIW5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5zb21lKChydWxlOiB7IG1hdGNoUGFja2FnZU5hbWVzPzogc3RyaW5nW10gfSkgPT5cbiAgICAgICAgICBydWxlLm1hdGNoUGFja2FnZU5hbWVzPy5pbmNsdWRlcygnbmV4dCcpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMucHVzaCh7IG1hdGNoUGFja2FnZU5hbWVzOiBbJ25leHQnXSwgZW5hYmxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kZXBlbmRhYm90JyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVub3ZhdGVyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5jb25zdCB0YXJnZXRBZ2VudHMgPSBbJ2NsYXVkZS1jb2RlJywgJ2NvZGV4JywgJ2N1cnNvcicsICdnZW1pbmktY2xpJ107XG5jb25zdCBpbnN0YWxsVGFyZ2V0QWdlbnRBcmdzID0gdGFyZ2V0QWdlbnRzLmZsYXRNYXAoKGFnZW50KSA9PiBbJy0tYWdlbnQnLCBhZ2VudF0pO1xuY29uc3Qgc2tpbGxzUmVwbyA9ICdXaWxsQm9vc3Rlci9hZ2VudC1za2lsbHMnO1xuY29uc3QgcGxheXdyaWdodFNraWxsTmFtZSA9ICdwbGF5d3JpZ2h0LWNsaSc7XG5jb25zdCBub25XZWJSZW1vdmFsQWdlbnRBcmdzID0gWyctLWFnZW50JywgJ3VuaXZlcnNhbCcsIC4uLmluc3RhbGxUYXJnZXRBZ2VudEFyZ3NdO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdpbnN0YWxsQWdlbnRTa2lsbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcnVuSW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWcpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaXNXZWJBcHBSZWxhdGVkKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fFxuICAgIGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QgfHxcbiAgICBjb25maWcuZGVwZW5kaW5nLnJlYWN0IHx8XG4gICAgY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2sgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlc1xuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5JbnN0YWxsQWdlbnRTa2lsbHMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXJvb3RDb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgY29uc3QgY29tbW9uQXJncyA9IFsnc2tpbGxzQGxhdGVzdCcsICdhZGQnLCBza2lsbHNSZXBvLCAuLi5pbnN0YWxsVGFyZ2V0QWdlbnRBcmdzLCAnLS1za2lsbCcsICcqJywgJy0teWVzJ107XG4gIHNwYXduU3luYygnbnB4JywgY29tbW9uQXJncywgcm9vdENvbmZpZy5kaXJQYXRoKTtcblxuICBpZiAoaXNXZWJBcHBSZWxhdGVkKHJvb3RDb25maWcpKSByZXR1cm47XG5cbiAgc3Bhd25TeW5jKFxuICAgICducHgnLFxuICAgIFsnc2tpbGxzQGxhdGVzdCcsICdyZW1vdmUnLCBwbGF5d3JpZ2h0U2tpbGxOYW1lLCAuLi5ub25XZWJSZW1vdmFsQWdlbnRBcmdzLCAnLS15ZXMnXSxcbiAgICByb290Q29uZmlnLmRpclBhdGhcbiAgKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIC8vIFRoZSBWZXJjZWwgQ0xJIGxlYXZlcyB0aGUgc2hhcmVkIHVuaXZlcnNhbCBpbnN0YWxsIGJlaGluZCBpbiB0aGlzIGZsb3csXG4gICAgLy8gc28gbm9uLXdlYiByZXBvcyBuZWVkIGFuIGV4cGxpY2l0IGNsZWFudXAgcGFzcyB0byBlbmZvcmNlIHRoZSBmaW5hbCBzdGF0ZS5cbiAgICByZW1vdmVTa2lsbERpcmVjdG9yeShyb290Q29uZmlnLmRpclBhdGgsICcuYWdlbnRzL3NraWxscycpLFxuICAgIHJlbW92ZVNraWxsRGlyZWN0b3J5KHJvb3RDb25maWcuZGlyUGF0aCwgJy5jbGF1ZGUvc2tpbGxzJyksXG4gICAgcmVtb3ZlU2tpbGxEaXJlY3Rvcnkocm9vdENvbmZpZy5kaXJQYXRoLCAnLmNvZGV4L3NraWxscycpLFxuICAgIHJlbW92ZVNraWxsRGlyZWN0b3J5KHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3Ivc2tpbGxzJyksXG4gICAgcmVtb3ZlU2tpbGxEaXJlY3Rvcnkocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdlbWluaS9za2lsbHMnKSxcbiAgICByZW1vdmVTa2lsbERpcmVjdG9yeShyb290Q29uZmlnLmRpclBhdGgsICcuZ2VtaW5pL2NvbW1hbmRzJyksXG4gICAgcmVtb3ZlU2tpbGxMb2NrRW50cnkocm9vdENvbmZpZy5kaXJQYXRoKSxcbiAgXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVNraWxsRGlyZWN0b3J5KHJvb3REaXJQYXRoOiBzdHJpbmcsIHJlbGF0aXZlUGFyZW50RGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnJtKHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgcmVsYXRpdmVQYXJlbnREaXJQYXRoLCBwbGF5d3JpZ2h0U2tpbGxOYW1lKSwge1xuICAgIGZvcmNlOiB0cnVlLFxuICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVNraWxsTG9ja0VudHJ5KHJvb3REaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdza2lsbHMtbG9jay5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBqc29uOiB1bmtub3duID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XG4gICAgaWYgKCFpc1NraWxsTG9ja0pzb24oanNvbikgfHwgIWpzb24uc2tpbGxzW3BsYXl3cmlnaHRTa2lsbE5hbWVdKSByZXR1cm47XG4gICAganNvbi5za2lsbHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoanNvbi5za2lsbHMpLmZpbHRlcigoW25hbWVdKSA9PiBuYW1lICE9PSBwbGF5d3JpZ2h0U2tpbGxOYW1lKSk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShqc29uLCB1bmRlZmluZWQsIDIpICsgJ1xcbicpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZ25vcmUgaWYgdGhlIHNraWxsIGxvY2sgZG9lcyBub3QgZXhpc3QgeWV0IG9yIGlzIHVucmVhZGFibGUuXG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTa2lsbExvY2tKc29uKGpzb246IHVua25vd24pOiBqc29uIGlzIHsgc2tpbGxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YganNvbiA9PT0gJ29iamVjdCcgJiZcbiAgICBqc29uICE9PSBudWxsICYmXG4gICAgJ3NraWxscycgaW4ganNvbiAmJlxuICAgIHR5cGVvZiBqc29uLnNraWxscyA9PT0gJ29iamVjdCcgJiZcbiAgICBqc29uLnNraWxscyAhPT0gbnVsbCAmJlxuICAgICFBcnJheS5pc0FycmF5KGpzb24uc2tpbGxzKVxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnRXh0ZW5kcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5cbmNvbnN0IHJvb3RKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgc291cmNlTWFwOiB0cnVlLFxuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICAgIHR5cGVSb290czogWycuL25vZGVfbW9kdWxlcy9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgZXhjbHVkZTogWydwYWNrYWdlcy8qL3Rlc3QvZml4dHVyZXMnLCAndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbXG4gICAgJ3BhY2thZ2VzLyovc2NyaXB0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zcmMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovdGVzdC8qKi8qJyxcbiAgICAnc2NyaXB0cy8qKi8qJyxcbiAgICAnc3JjLyoqLyonLFxuICAgICd0ZXN0LyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBvdXREaXI6ICdkaXN0JyxcbiAgICB0eXBlUm9vdHM6IFsnLi4vLi4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuLi8uLi9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgZXhjbHVkZTogWyd0ZXN0L2ZpeHR1cmVzJ10sXG4gIGluY2x1ZGU6IFsnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHJldHVybjtcblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChjb25maWcuaXNSb290ID8gcm9vdEpzb25PYmogOiBzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWcpO1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5pc0J1biAmJiAhY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGpzeDogJ3JlYWN0LWpzeCcgfTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4Y2x1ZGUgPSBuZXdTZXR0aW5ncy5leGNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgVHNDb25maWdKc29uO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG1lcmdlVHNjb25maWdFeHRlbmRzKG5ld1NldHRpbmdzLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMpO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgLy8gRG9uJ3QgdXNlIG9sZCBkZWNvcmF0b3JcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5leHBlcmltZW50YWxEZWNvcmF0b3JzO1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy52ZXJiYXRpbU1vZHVsZVN5bnRheDtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMoXG4gIGdlbmVyYXRlZEV4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddLFxuICBleGlzdGluZ0V4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddXG4pOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSB7XG4gIGNvbnN0IG1lcmdlZEV4dGVuZHMgPSBbLi4ubm9ybWFsaXplRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzKSwgLi4ubm9ybWFsaXplRXh0ZW5kcyhleGlzdGluZ0V4dGVuZHMpXTtcbiAgY29uc3QgdW5pcXVlRXh0ZW5kcyA9IFsuLi5uZXcgU2V0KG1lcmdlZEV4dGVuZHMpXTtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDEpIHJldHVybiB1bmlxdWVFeHRlbmRzWzBdO1xuICByZXR1cm4gdW5pcXVlRXh0ZW5kcztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5kcyh2YWx1ZTogVHNDb25maWdKc29uWydleHRlbmRzJ10pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgICB9XG4gICAgICAvLyBMTE3jgavjgojjgot2aWJlIGNvZGluZ+OBp+OBr+OAgeiHquWLleODleOCqeODvOODnuODg+ODiOOChOOCs+ODvOODieOCouOCr+OCt+ODp+ODs+OCkueEoeWKueWMluOBmeOCi+OBk+OBqOOBp1xuICAgICAgLy8g55Sf5oiQ44GV44KM44Gf44Kz44O844OJ44Gu5YWD44Gu5b2i5byP44KS57at5oyB44Gn44GN44KLXG4gICAgICBpZiAoJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIGlmICgnZWRpdG9yLmZvcm1hdE9uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuZm9ybWF0T25TYXZlJ107XG4gICAgICB9XG4gICAgICBzb3J0S2V5cyhzZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uVmFsdWVNYXAgfSBmcm9tICdAeWFybnBrZy9jb3JlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxudHlwZSBTZXR0aW5ncyA9IHtcbiAgZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4OiBzdHJpbmc7XG4gIG5tTW9kZTogc3RyaW5nO1xuICBub2RlTGlua2VyOiBzdHJpbmc7XG4gIG5wbU1pbmltYWxBZ2VHYXRlPzogc3RyaW5nO1xuICBucG1QcmVhcHByb3ZlZFBhY2thZ2VzPzogc3RyaW5nW107XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbn0gJiBQYXJ0aWFsPENvbmZpZ3VyYXRpb25WYWx1ZU1hcD47XG5cbmludGVyZmFjZSBQbHVnaW4ge1xuICBjaGVja3N1bTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNwZWM6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWWFybnJjWW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlWWFybnJjWW1sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHlhcm5yY1ltbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjLnltbCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgneWFybicsIFsnLS12ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0VmVyc2lvbignQHlhcm5wa2cvY2xpJywgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmIChnZXRNYWpvck51bWJlcihjdXJyZW50VmVyc2lvbikgPD0gZ2V0TWFqb3JOdW1iZXIobGF0ZXN0VmVyc2lvbikgJiYgY3VycmVudFZlcnNpb24gIT09IGxhdGVzdFZlcnNpb24pIHtcbiAgICAgIHNwYXduU3luYygneWFybicsIFsnc2V0JywgJ3ZlcnNpb24nLCBsYXRlc3RWZXJzaW9uXSwgY29uZmlnLmRpclBhdGgsIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3JlbGVhc2VzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocmVsZWFzZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihyZWxlYXNlc1BhdGgpKSB7XG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCd5YXJuLScpICYmICFmaWxlLnN0YXJ0c1dpdGgoYHlhcm4tJHtsYXRlc3RWZXJzaW9ufS5gKSkge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZWQnLCBwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFybnJjUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHlhbWwubG9hZChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh5YXJucmNZbWxQYXRoLCAndXRmOCcpKSBhcyBTZXR0aW5ncztcbiAgICBzZXR0aW5ncy5kZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXggPSAnJztcbiAgICBzZXR0aW5ncy5ub2RlTGlua2VyID0gJ25vZGUtbW9kdWxlcyc7XG4gICAgc2V0dGluZ3Mubm1Nb2RlID0gJ2hhcmRsaW5rcy1nbG9iYWwnO1xuICAgIHNldHRpbmdzLm5wbU1pbmltYWxBZ2VHYXRlID0gJzVkJztcbiAgICBzZXR0aW5ncy5ucG1QcmVhcHByb3ZlZFBhY2thZ2VzID0gW1xuICAgICAgJ0BleGVyY29kZS9wcm9ibGVtLXV0aWxzJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlncycsXG4gICAgICAnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZycsXG4gICAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cycsXG4gICAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvd2InLFxuICAgICAgLy8gVG8gZGVhbCB3aXRoIENWRSBsaWtlIGh0dHBzOi8vbmV4dGpzLm9yZy9ibG9nL0NWRS0yMDI1LTY2NDc4XG4gICAgICAnbmV4dCcsXG4gICAgICAnQG5leHQvKicsXG4gICAgICAncmVhY3QnLFxuICAgICAgJ3JlYWN0LWRvbScsXG4gICAgXTtcbiAgICBkZWxldGUgc2V0dGluZ3MuY29tcHJlc3Npb25MZXZlbDtcbiAgICBpZiAoc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcztcbiAgICB9XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L3B1bGwvNDY5OFxuICAgIHNldHRpbmdzLmVuYWJsZUdsb2JhbENhY2hlID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IHNldHRpbmdzLnBsdWdpbnM/Lmxlbmd0aCA/PyAwO1xuICAgIHNldHRpbmdzLnBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zPy5maWx0ZXIoKHApID0+IHAucGF0aCAhPT0gJy55YXJuL3BsdWdpbnMvdW5kZWZpbmVkLmNqcycpID8/IFtdO1xuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCAhPT0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJywgJ3VuZGVmaW5lZC5janMnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwbHVnaW5QYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MucGx1Z2lucztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHlhcm5yY1ltbFBhdGgsIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKTtcblxuICAgIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ3lhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB2ZXJzaW9uc0pzb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndmVyc2lvbnMnLCAnLS1qc29uJ10sIGRpclBhdGgpO1xuICBjb25zdCB2ZXJzaW9ucyA9IEpTT04ucGFyc2UodmVyc2lvbnNKc29uKSBhcyBzdHJpbmdbXTtcbiAgcmV0dXJuIHZlcnNpb25zLmF0KC0xKSBhcyBzdHJpbmc7XG59XG5mdW5jdGlvbiBnZXRNYWpvck51bWJlcih2ZXJzaW9uOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBbbWFqb3JdID0gdmVyc2lvbi5zcGxpdCgnLicpO1xuICByZXR1cm4gTnVtYmVyKG1ham9yKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QxOiB4LWVhc3kgOmhlZGdlaG9nOicsICdFREU5RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMjogZWFzeSA6cmFiYml0MjonLCAnRERENkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDM6IG1lZGl1bSA6b3g6JywgJ0M0QjVGRCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q0OiBoYXJkIDpzcXVpZDonLCAnQTc4QkZBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDU6IHgtaGFyZCA6d2hhbGUyOicsICc4QjVDRjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMTogY3JpdGljYWwgOmZpcmU6OmZpcmU6OmZpcmU6JywgJ0VGNDQ0NCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AyOiB1cmdlbnQgOmZpcmU6OmZpcmU6JywgJ0Y4NzE3MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AzOiBpbXBvcnRhbnQgOmZpcmU6JywgJ0ZDQTVBNScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3A0OiBuaWNlIHRvIGhhdmUgOmRyb3BsZXQ6JywgJ0ZFQ0FDQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGJsaXR6JywgJzUzMDBiYycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGZpcmViYXNlJywgJ2ZmY2EyOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHByaXNtYScsICcwYzM0NGInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiByZWFjdCcsICc2MWRhZmInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzdmVsdGUnLCAnZmYzZTAwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc2VtYW50aWMtcmVsZWFzZScsICc0OTQ5NDknKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeSA6cm9ja2V0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkIDptYWc6JywgJ0ZCQ0EwNCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkIDpib29rbWFyazonLCAnNjM2NkYxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMC41aCA6Y2xvY2sxMjMwOicsICdGM0Y0RjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxaCA6Y2xvY2sxOicsICdFNUU3RUInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAyaCA6Y2xvY2syOicsICdEMUQ1REInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAzaCA6Y2xvY2szOicsICc5Q0EzQUYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA1aCA6Y2xvY2s1OicsICc2QjcyODAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA4aCA6Y2xvY2s4OicsICc0QjU1NjMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxM2ggOmNsb2NrMTonLCAnMzc0MTUxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogYnVpbGQgOmhhbW1lcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2hvcmUgOmJyb29tOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaSA6Y29uc3RydWN0aW9uX3dvcmtlcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZG9jcyA6bWVtbzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZmVhdCA6c3BhcmtsZXM6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZpeCA6YnVnOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBwZXJmIDp6YXA6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHJlZmFjdG9yIDpyZWN5Y2xlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBzdHlsZSA6bGlwc3RpY2s6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHRlc3QgOnRlc3RfdHViZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncHJvamVjdCcsICcyNDI5MkYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdmb2N1c2VkIDpkYXJ0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItYWxsIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNsYXVkZSA6cm9ib3Q6JywgJzAwQjREOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jb2RleCA6cm9ib3Q6JywgJzAwQjREOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1nZW1pbmkgOnJvYm90OicsICcwMEI0RDgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnbGxtLXByIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYWktcHIgOnJvYm90OicpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBMYWJlbHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cExhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IGRvdGVudiBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHNvZGl1bSBmcm9tICdsaWJzb2RpdW0td3JhcHBlcnMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5jb25zdCBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyA9IFsnUkVBRFlfRElTQ09SRF9XRUJIT09LX1VSTCcsICdHSF9CT1RfUEFUJywgJ1BVQkxJQ19HSF9CT1RfUEFUJ107XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlY3JldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBTZWNyZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8gfHwgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSB8fCAhb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycykgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gZG90ZW52LmNvbmZpZygpLnBhcnNlZCA/PyB7fTtcbiAgICBpZiAoT2JqZWN0LmtleXMocGFyc2VkKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHNlY3JldE5hbWUgb2YgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBzZWNyZXRfbmFtZTogc2VjcmV0TmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXknLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IGtleSwga2V5X2lkOiBrZXlJZCB9ID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUicgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUInXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCBTZWNyZXQgJiBCYXNlNjQga2V5IHRvIFVpbnQ4QXJyYXkuXG4gICAgICAgIGNvbnN0IHJhd0tleSA9IHNvZGl1bS5mcm9tX2Jhc2U2NChrZXksIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuICAgICAgICBjb25zdCByYXdTZWMgPSBzb2RpdW0uZnJvbV9zdHJpbmcoc2VjcmV0KTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBzZWNyZXQgdXNpbmcgTGliU29kaXVtXG4gICAgICAgIGNvbnN0IGVuY0J5dGVzID0gc29kaXVtLmNyeXB0b19ib3hfc2VhbChyYXdTZWMsIHJhd0tleSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBlbmNyeXB0ZWQgVWludDhBcnJheSB0byBCYXNlNjRcbiAgICAgICAgY29uc3QgZW5jQmFzZTY0ID0gc29kaXVtLnRvX2Jhc2U2NChlbmNCeXRlcywgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG5cbiAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBHaXRIdWJTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gIC8vIEFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb25cbiAgYXdhaXQgd2l0aFJldHJ5KCgpID0+XG4gICAgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBhbGxvd19hdXRvX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfbWVyZ2VfY29tbWl0OiBmYWxzZSxcbiAgICAgIGFsbG93X3NxdWFzaF9tZXJnZTogdHJ1ZSxcbiAgICAgIGFsbG93X3JlYmFzZV9tZXJnZTogZmFsc2UsXG4gICAgICBhbGxvd191cGRhdGVfYnJhbmNoOiB0cnVlLFxuICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgIH0sXG4gICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIgPSAnX19QTV9SVU5fXyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIFRoZSB0ZXN0IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gdGVzdFxcYCkgcGFzc2VkLlxuICAtIFRoZSBsaW50IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gbGludFxcYCkgcGFzc2VkLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiB0aGUgR2l0SHViIGRpZmYgdmlldy5cbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdCBteSBjaGFuZ2VzLlxuLSBbIF0gSSd2ZSBhZGRlZCBzY3JlZW5zaG90cyAoaWYgdGhlIFVJIGNoYW5nZWQpLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG5ld0NvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUobmV3Q29udGVudCwgY29uZmlnKTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBjb250ZW50KSA+IGNvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZSh0ZW1wbGF0ZTogc3RyaW5nLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlckNvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlQWxsKHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIsIHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0J1bjogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLy8gZGVwZW5kZW5jeSBpbmZvcm1hdGlvblxuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcbiAgLy8gc291cmNlIGNvZGUgZmlsZXNcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGhhc1N0YXJ0VGVzdFNlcnZlcjogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgfTtcbiAgZXNsaW50QmFzZT86IEVzbGludEV4dGVuc2lvbkJhc2U7XG4gIGhhc1ZlcnNpb25TZXR0aW5nczogYm9vbGVhbjtcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnPzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcGx1Z2lucz86IHN0cmluZ1tdW107XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IGpzb24/LmJyYW5jaGVzID8/IFtdO1xuICAgICAgcmVsZWFzZVBsdWdpbnMgPSBqc29uPy5wbHVnaW5zPy5mbGF0KCkgPz8gW107XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgaXNSb290ID1cbiAgICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicpKSAhPT0gJ3BhY2thZ2VzJyB8fFxuICAgICAgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IGhhc1ZlcnNpb25TZXR0aW5ncyA9IGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBwcmVmaXggb2YgWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ10pIHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCkpKSB7XG4gICAgICAgIGhhc1ZlcnNpb25TZXR0aW5ncyA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0Z1bGxOYW1lID8gYGdpdGh1Yjoke3JlcG9GdWxsTmFtZX1gIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0J1bjogcm9vdENvbmZpZz8uaXNCdW4gfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcyhgJHtwYXRoLnNlcH13aWxsYm9vc3Rlci1jb25maWdzYCksXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbkdvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGhhc1N0YXJ0VGVzdFNlcnZlcjogISFwYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3Qtc2VydmVyJ10sXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzLmJsaXR6LFxuICAgICAgICBmaXJlYmFzZTogISFkZXZEZXBlbmRlbmNpZXNbJ2ZpcmViYXNlLXRvb2xzJ10sXG4gICAgICAgIGdlbkkxOG5UczogISFkZXZEZXBlbmRlbmNpZXNbJ2dlbi1pMThuLXRzJ10sXG4gICAgICAgIGxpdGVzdHJlYW06IGRvY2tlcmZpbGUuaW5jbHVkZXMoJ2luc3RhbGwtbGl0ZXN0cmVhbS5zaCcpLFxuICAgICAgICByZWFjdDogISFkZXBlbmRlbmNpZXMucmVhY3QsXG4gICAgICAgIG5leHQ6ICEhZGVwZW5kZW5jaWVzLm5leHQsXG4gICAgICAgIHBsYXl3cmlnaHRUZXN0OlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0LFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnByaXNtYSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXMucHlyaWdodCxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiAhIShcbiAgICAgICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgcmVsZWFzZVBsdWdpbnMubGVuZ3RoID4gMFxuICAgICAgICApLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHdiOiAhIWRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddLFxuICAgICAgfSxcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgYnJhbmNoZXM6IHJlbGVhc2VCcmFuY2hlcyxcbiAgICAgICAgZ2l0aHViOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyksXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpLFxuICAgICAgfSxcbiAgICAgIGhhc1ZlcnNpb25TZXR0aW5ncyxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgd2JmeUpzb24sXG4gICAgfTtcbiAgICBpZiAoIWNvbmZpZy5pc0J1bikge1xuICAgICAgY29uZmlnLmVzbGludEJhc2UgPSBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHJldHVybiAoXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJ21pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcubWlzZS50b21sJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy50b29sLXZlcnNpb25zJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuZXhwb3J0IHR5cGUgRXNsaW50RXh0ZW5zaW9uQmFzZSA9XG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJ1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JztcblxuZnVuY3Rpb24gZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBFc2xpbnRFeHRlbnNpb25CYXNlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCA/ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcgOiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnO1xuICB9IGVsc2Uge1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCkge1xuICAgICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJztcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZ2l0ID0gc2ltcGxlR2l0KGRpclBhdGgpO1xuICBjb25zdCByZW1vdGVzID0gYXdhaXQgZ2l0LmdldFJlbW90ZXModHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbiA9IHJlbW90ZXMuZmluZCgocikgPT4gci5uYW1lID09PSAnb3JpZ2luJyk7XG4gIGNvbnN0IHJlbW90ZVVybCA9IG9yaWdpbj8ucmVmcy5mZXRjaCA/PyBvcmlnaW4/LnJlZnMucHVzaDtcbiAgaWYgKHR5cGVvZiByZW1vdGVVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgY29uc3QgcmV0ID0geyBmdWxsX25hbWU6IGAke29yZ30vJHtuYW1lfWAgfTtcbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KCkucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24ocmV0LCByZXNwb25zZS5kYXRhKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWRpcmVjdGVkRnVsbE5hbWUgPSBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yKTtcbiAgICBpZiAocmVkaXJlY3RlZEZ1bGxOYW1lKSB7XG4gICAgICByZXQuZnVsbF9uYW1lID0gcmVkaXJlY3RlZEZ1bGxOYW1lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IEVTTElOVF9DT05GSUdfUFJFRklYID0gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzRXNsaW50UGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJiBjb25maWcucGFja2FnZUpzb24/Lm5hbWU/LnN0YXJ0c1dpdGgoRVNMSU5UX0NPTkZJR19QUkVGSVgpID09PSB0cnVlO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpeERvY2tlcmZpbGUgfSBmcm9tICcuL2ZpeGVycy9kb2NrZXJmaWxlLmpzJztcbmltcG9ydCB7IGZpeE5leHRDb25maWdKc29uIH0gZnJvbSAnLi9maXhlcnMvbmV4dENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQbGF5d3JpZ2h0Q29uZmlnIH0gZnJvbSAnLi9maXhlcnMvcGxheXdyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQcmlzbWFFbnZGaWxlcyB9IGZyb20gJy4vZml4ZXJzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9maXhlcnMvdGVzdERpcmVjdG9yeS5qcyc7XG5pbXBvcnQgeyBmaXhUeXBlRGVmaW5pdGlvbnMgfSBmcm9tICcuL2ZpeGVycy90eXBlRGVmaW5pdGlvbi5qcyc7XG5pbXBvcnQgeyBmaXhUeXBvcyB9IGZyb20gJy4vZml4ZXJzL3R5cG9zLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYWdlbnRzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQmlvbWVKc29uYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9iaW9tZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFc2xpbnRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lc2xpbnRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlbW92ZUdlbWluaVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGludHN0YWdlZHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGluc3RhbGxBZ2VudFNraWxscyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9za2lsbHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzRXNsaW50UGFja2FnZSB9IGZyb20gJy4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG4gIG9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMgPSBhcmd2LmVudjtcblxuICBmb3IgKGNvbnN0IHJvb3REaXJQYXRoIG9mIGFyZ3YucGF0aHMgYXMgc3RyaW5nW10pIHtcbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBkaXJlbnRzLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKS5tYXAoKGQpID0+IHBhdGguam9pbihwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuXG4gICAgYXdhaXQgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihbcm9vdERpclBhdGgsIC4uLnN1YkRpclBhdGhzXSk7XG5cbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgZ2V0UGFja2FnZUNvbmZpZyhyb290RGlyUGF0aCk7XG4gICAgY29uc29sZS5sb2coJ3Jvb3RDb25maWc6Jywgcm9vdENvbmZpZyk7XG4gICAgaWYgKCFyb290Q29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGB0aGVyZSBpcyBubyB2YWxpZCBwYWNrYWdlLmpzb24gaW4gJHtyb290RGlyUGF0aH1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhYmJyZXZpYXRpb25Qcm9taXNlID0gZml4VHlwb3Mocm9vdENvbmZpZyk7XG5cbiAgICBjb25zdCBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCwgcm9vdENvbmZpZykpXG4gICAgKTtcbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeERvY2tlcmZpbGUocm9vdENvbmZpZyksXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICByZW1vdmVHZW1pbmlTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwU2VjcmV0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGludHN0YWdlZHJjKHJvb3RDb25maWcpLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlKGNvbmZpZykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBhcmd2LnNraXBEZXBzKTtcblxuICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWcpKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24gJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgICAgICkge1xuICAgICAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVFc2xpbnRyYyhjb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICAvLyBSZWZyZXNoIGxvY2sgZmlsZXNcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgZnMucm1TeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ2J1bi5sb2NrJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsndXBkYXRlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnMucm1TeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnLCAnLS1uby1pbW11dGFibGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG4gICAgLy8gJ3lhcm4gaW5zdGFsbCcgc2hvdWxkIGJlIGFmdGVyIGB5YXJuIGNsZWFudXBgIGJlY2F1c2UgeWFybiBiZXJyeSBnZW5lcmF0ZXMgeWFybi5sb2NrXG4gICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgY29udGVudHMgb2YgZGVwZW5kYW50IHN1Yi1wYWNrYWdlIGluIG1vbm9yZXBvXG4gICAgaWYgKCFyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCcsICctLW5vLWltbXV0YWJsZSddLCByb290RGlyUGF0aCk7XG4gICAgfVxuXG4gICAgYXdhaXQgaW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJuYW1lcyI6WyJvcHRpb25zIiwiaXNWZXJib3NlIiwiZG9lc1VwbG9hZEVudlZhcnMiLCJsb2dnZXIiLCJmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uIiwibmFtZSIsImZ1bmMiLCJjb25zb2xlIiwiaW5mbyIsImVycm9yIiwiRXJyb3IiLCJzdGFjayIsIlN0cmluZyIsImFzeW5jIiwiZml4RG9ja2VyZmlsZSIsImNvbmZpZyIsImRvZXNDb250YWluRG9ja2VyZmlsZSIsIm9sZENvbnRlbnQiLCJkb2NrZXJmaWxlIiwibmV3Q29udGVudCIsImZzIiwid3JpdGVGaWxlIiwicGF0aCIsImpvaW4iLCJkaXJQYXRoIiwiZnNVdGlsIiwicmVhZEZpbGVJZ25vcmluZ0Vycm9yIiwiZmlsZVBhdGgiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwiZ2VuZXJhdGVGaWxlIiwiY29udGVudCIsIm1rZGlyIiwiZGlybmFtZSIsInJlY3Vyc2l2ZSIsIm5vcm1hbGl6ZWRDb250ZW50IiwicmVwbGFjZUFsbCIsInRyaW0iLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZml4TmV4dENvbmZpZ0pzb24iLCJtYXAiLCJleHQiLCJyZXNvbHZlIiwiZmluZCIsInAiLCJleGlzdHNTeW5jIiwicmVwbGFjZSIsIl8iLCJzZXR0aW5nc1RleHQiLCJpbmNsdWRlcyIsInJ1biIsImxpdGVyYWwiLCJ2YWx1ZSIsImtpbmQiLCJhc09iamVjdCIsImRlZmF1bHRDb25maWciLCJmb3JiaWRPbmx5IiwicmV0cmllcyIsInVzZSIsImJhc2VVUkwiLCJ0cmFjZSIsInNjcmVlbnNob3QiLCJ2aWRlbyIsIndlYlNlcnZlciIsImNvbW1hbmQiLCJ1cmwiLCJyZXVzZUV4aXN0aW5nU2VydmVyIiwidGltZW91dCIsInN0ZG91dCIsInN0ZGVyciIsImVudiIsImdyYWNlZnVsU2h1dGRvd24iLCJmaXhQbGF5d3JpZ2h0Q29uZmlnIiwibWF0Y2giLCJleGVjIiwib2JqZWN0TGl0ZXJhbCIsInBhcnNlZCIsInNvdXJjZSIsInRzIiwiY3JlYXRlU291cmNlRmlsZSIsIlNjcmlwdFRhcmdldCIsIkxhdGVzdCIsIlNjcmlwdEtpbmQiLCJUUyIsInN0YXRlbWVudCIsInN0YXRlbWVudHMiLCJpc1ZhcmlhYmxlU3RhdGVtZW50IiwiZGVjbGFyYXRpb24iLCJkZWNsYXJhdGlvbkxpc3QiLCJkZWNsYXJhdGlvbnMiLCJpbml0aWFsaXplciIsImlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uIiwicGFyc2VPYmplY3RMaXRlcmFsIiwibWVyZ2VkIiwibWVyZ2UiLCJhbGwiLCJCb29sZWFuIiwicGFja2FnZUpzb24iLCJzY3JpcHRzIiwiaGFzQmFzZVVybCIsImVudkZpbGVQYXRocyIsImVudkZpbGVQYXRoIiwidGVzdCIsImhhc05leHRQdWJsaWNCYXNlVXJsIiwidXNlQ29uZmlnIiwibmV3T2JqZWN0TGl0ZXJhbCIsInN0cmluZ2lmeU9iamVjdCIsInByb3BlcnR5IiwicHJvcGVydGllcyIsImlzUHJvcGVydHlBc3NpZ25tZW50IiwiaXNJZGVudGlmaWVyIiwiaXNTdHJpbmdMaXRlcmFsIiwicGFyc2VFeHByZXNzaW9uIiwidW5kZWZpbmVkIiwiZ2V0VGV4dCIsImV4cHJlc3Npb24iLCJwYXJzZWRPYmplY3QiLCJpc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24iLCJlbGVtZW50cyIsImVsZW1lbnQiLCJzb21lIiwic3RyaW5naWZ5VmFsdWUiLCJsZXZlbCIsInZhbHVlcyIsImxlbmd0aCIsImluZGVudCIsInJlcGVhdCIsImxpbmVzIiwic3RyaW5naWZpZWQiLCJzcGxpdCIsImF0IiwiaW5kZXgiLCJjbG9zaW5nSW5kZW50Iiwic3RyaW5naWZ5QXJyYXkiLCJvYmplY3QiLCJPYmplY3QiLCJlbnRyaWVzIiwia2V5IiwiZ2xvYklnbm9yZSIsImZpeFByaXNtYUVudkZpbGVzIiwiZW52RmlsZXMiLCJmZyIsImdsb2IiLCJkb3QiLCJjd2QiLCJpZ25vcmUiLCJlbnZGaWxlIiwiZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiIsInBhY2thZ2VEaXJQYXRocyIsIlByb21pc2UiLCJuZXdUZXN0RGlyUGF0aCIsInBhY2thZ2VEaXJQYXRoIiwib2xkVGVzdERpck5hbWUiLCJvbGRUZXN0RGlyUGF0aCIsInJlbmFtZSIsImZpeFR5cGVEZWZpbml0aW9ucyIsImNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbiIsImxpYlR5cGVEaXJQYXRoIiwic3JjVHlwZURpclBhdGgiLCJpc1Jvb3QiLCJkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyIsImRpcmVudHMiLCJpZ25vcmVFbm9lbnRBc3luYyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwiZGlyZW50IiwiZGlyTmFtZSIsInNsaWNlIiwiaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uIiwiZW5kc1dpdGgiLCJwYWNrYWdlTmFtZSIsImhhc0xpYnJhcnkiLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmNpZXMiLCJpc0ZpbGUiLCJpc0RpcmVjdG9yeSIsIm92ZXJ3cml0ZU1lcmdlIiwiZGVzdGluYXRpb25BcnJheSIsInNvdXJjZUFycmF5IiwiY29tYmluZU1lcmdlIiwidGFyZ2V0IiwiZGVzdGluYXRpb24iLCJpdGVtIiwiY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQiLCJpc01lcmdlYWJsZU9iamVjdCIsInB1c2giLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsInRvU29ydGVkIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwicHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyIsIm9uIiwicHVsbF9yZXF1ZXN0IiwiYnJhbmNoZXMiLCJwZXJtaXNzaW9ucyIsImNvbnRlbnRzIiwiY29uY3VycmVuY3kiLCJncm91cCIsImpvYnMiLCJhdXRvZml4IiwicHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3ciLCJ1c2VzIiwid29ya2Zsb3dzIiwicmVsZWFzZSIsInB1bGxfcmVxdWVzdF90YXJnZXQiLCJ0eXBlcyIsInN5bmMiLCJpc3N1ZXMiLCJpZiIsIndpdGgiLCJzZWNyZXRzIiwiQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4iLCJPUEVOQUlfQVBJX0tFWSIsIkdFTUlOSV9BUElfS0VZIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJyb290Q29uZmlnIiwiaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8iLCJyZXBvc2l0b3J5Iiwid29ya2Zsb3dzUGF0aCIsInNlbWFudGljWW1sUGF0aCIsInJtIiwiZm9yY2UiLCJmaWxlTmFtZVNldCIsIlNldCIsImZpbHRlciIsImRlcGVuZGluZyIsInNlbWFudGljUmVsZWFzZSIsImFkZCIsImZpbGVOYW1lIiwiYmFzZW5hbWUiLCJ3cml0ZVdvcmtmbG93WWFtbCIsImRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyIsIndyaXRlWWFtbCIsImlzUHVibGljUmVwbyIsImNsb25lRGVlcCIsInBhY2thZ2VNYW5hZ2VyIiwiaXNCdW4iLCJzdGVwcyIsImJ1aWxkIiwiYXV0b2ZpeFdvcmtmbG93IiwiYXV0b2ZpeEpvYiIsImdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93IiwibmV3U2V0dGluZ3MiLCJvbGRTZXR0aW5ncyIsInlhbWwiLCJsb2FkIiwiYXJyYXlNZXJnZSIsInN0YXJ0c1dpdGgiLCJtb3ZlVG9Cb3R0b20iLCJhY3Rpb25zIiwidHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3ciLCJpc1JldXNhYmxlV29ya2Zsb3ciLCJqb2IiLCJub3JtYWxpemVKb2IiLCJzY2hlZHVsZSIsImJyYW5jaCIsInBhcmFtcyIsInN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCIsIndvcmtmbG93X2Rpc3BhdGNoIiwiTlBNX1RPS0VOIiwiR0hfVE9LRU4iLCJGSVJFQkFTRV9UT0tFTiIsIkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UiLCJESVNDT1JEX1dFQkhPT0tfVVJMIiwic2VydmVyX3VybCIsImRvdF9lbnZfcGF0aCIsIkZMWV9BUElfVE9LRU4iLCJkZXBsb3lfY29tbWFuZCIsImNpX2xhYmVsIiwiZ2l0aHViX2hvc3RlZF9ydW5uZXIiLCJrZXlzIiwibmV3U2VjcmV0cyIsInlhbWxUZXh0IiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsImZpeFR5cG9zIiwicGFja2FnZUNvbmZpZyIsImRvY0ZpbGVzIiwibWRGaWxlIiwiZml4VHlwb3NJblRleHQiLCJyZXBsYWNlV2l0aENvbmZpZyIsInRzRmlsZXMiLCJ0c0ZpbGUiLCJmaXhUeXBvc0luQ29kZSIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwid2JmeUpzb24iLCJ0eXBvcyIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMiLCJhbGxDb25maWdzIiwiYWdlbnRzRXh0cmFQYXRoIiwiZXh0cmFDb250ZW50IiwidG9vbE5hbWUiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24iLCJjdXJzb3JSdWxlc1BhdGgiLCJjdXJzb3JSdWxlc0NvbnRlbnQiLCJmcm9udG1hdHRlciIsImJvZHkiLCJnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50IiwiYmFzZUNvbnRlbnQiLCJkZXNjcmlwdGlvbiIsImlzV2lsbEJvb3N0ZXJSZXBvIiwiYyIsImhhc1N0YXJ0VGVzdFNlcnZlciIsImdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSIsImhhc05ld1NlY3Rpb24iLCJnZW5JMThuVHMiLCJyZWFjdCIsIm5leHQiLCJnZW5lcmF0ZUJpb21lSnNvbmMiLCJyb290IiwiJHNjaGVtYSIsImV4dGVuZHMiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJuZXdDb250ZW50V2l0aEV4YWN0VHJ1ZSIsIm5ld0NvbnRlbnRXaXRoRXhhY3RGYWxzZSIsImdlbmVyYXRlQnVuZmlnVG9tbCIsInJlYWRGaWxlU3luYyIsInVzZXJDb250ZW50SGVhZGVyIiwidXNlckNvbnRlbnRIZWFkZXJSZWdleCIsInNlcGFyYXRvciIsImRlZmF1bHRIZWFkVXNlckNvbnRlbnQiLCJkZWZhdWx0VGFpbFVzZXJDb250ZW50IiwiaWdub3JlRmlsZVV0aWwiLCJzZXBhcmF0b3JQcmVmaXgiLCJyZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMiLCJsYXN0SGVhZGVySW5kZXgiLCJnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyIiwiZ2V0SGVhZFVzZXJDb250ZW50IiwiaW5kZXhPZiIsInRoaXMiLCJnZXRUYWlsVXNlckNvbnRlbnQiLCJpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkIiwibGFzdEluZGV4IiwibGFzdEluZGV4T2YiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsIm1hcmtkb3duTGlrZSIsImVzbGludCIsInByZXR0aWVyIiwiYmlvbWUiLCJnZW5lcmF0ZUV4dGVuc2lvbnMiLCJnZW5lcmF0ZUVkaXRvcmNvbmZpZyIsImdlbmVyYXRlRXNsaW50cmMiLCJlc2xpbnRCYXNlIiwiaGF2ZV9mdW4iLCJjb2RlX3JldmlldyIsImRpc2FibGUiLCJjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZCIsIm1heF9yZXZpZXdfY29tbWVudHMiLCJwdWxsX3JlcXVlc3Rfb3BlbmVkIiwiaGVscCIsInN1bW1hcnkiLCJpZ25vcmVfcGF0dGVybnMiLCJnZW5lcmF0ZUdlbWluaUNvbmZpZyIsImNvbmZpZ0ZpbGVQYXRoIiwic3R5bGVndWlkZUZpbGVQYXRoIiwibmV3Q29uZmlnIiwib2xkQ29uZmlnIiwieWFtbENvbnRlbnQiLCJzdHlsZWd1aWRlQ29udGVudCIsInRyaW1FbmQiLCJyZW1vdmVHZW1pbmlTZXR0aW5ncyIsImdlbmVyYXRlR2l0YXR0cmlidXRlcyIsImRlZmF1bHROYW1lcyIsImdlbmVyYXRlR2l0aWdub3JlIiwiaGVhZFVzZXJDb250ZW50IiwidGFpbFVzZXJDb250ZW50IiwibmFtZXMiLCJkb2VzQ29udGFpbkdlbWZpbGUiLCJkb2VzQ29udGFpbkdvTW9kIiwiZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiIsImRvZXNDb250YWluUG9tWG1sIiwiZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCIsImRvZXNDb250YWluVGVtcGxhdGVZYW1sIiwiZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIiwiYmxpdHoiLCJmaXJlYmFzZSIsInByaXNtYSIsInBsYXl3cmlnaHRUZXN0IiwicmVhY3ROYXRpdmUiLCJzdG9yeWJvb2siLCJsaXRlc3RyZWFtIiwiZ2VuZXJhdGVkIiwicmVhZENhY2hlIiwicmVzcG9uc2UiLCJmZXRjaCIsInJlc3BvbnNlVGV4dCIsInRleHQiLCJvayIsIndyaXRlQ2FjaGUiLCJvcyIsImhvbWVkaXIiLCJzdGF0IiwiRGF0ZSIsIm5vdyIsIm10aW1lTXMiLCJjcmVhdGVUYXNrT3B0aW9ucyIsInJ1bm5lciIsImFyZ3MiLCJleHRlbnNpb24iLCJwcmV0dGllckNvbnRlbnQiLCJiaW9tZUNvbnRlbnQiLCJnZW5lcmF0ZUlkZWFTZXR0aW5ncyIsImRvZXNDb250YWluSmF2YVNjcmlwdCIsImRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpblR5cGVTY3JpcHQiLCJkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzIiwic3Bhd25TeW5jIiwicmV0cnkiLCJuZXdDbWQiLCJuZXdBcmdzIiwiZ2V0U3Bhd25TeW5jQXJncyIsImNoaWxkX3Byb2Nlc3MiLCJzdGF0dXMiLCJzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQiLCJzdGRpbyIsInByb2MiLCJ0b1N0cmluZyIsInMiLCJtZXNzYWdlIiwicHJvY2VzcyIsIlBBVEgiLCJCRVJSWV9CSU5fRk9MREVSIiwiZW5jb2RpbmciLCJzaGVsbCIsImdldExhdGVzdENvbW1pdEhhc2giLCJvcmdhbml6YXRpb24iLCJyZXBvIiwicmVwb1VybCIsImNvbW1pdEhhc2giLCJyZWplY3QiLCJFc2xpbnRVdGlsIiwiZ2V0TGludEZpeFN1ZmZpeCIsImRvZXNDb250YWluSnN4T3JUc3giLCJnaXRIdWJVdGlsIiwiZ2V0T3JnQW5kTmFtZSIsInVybE9yRnVsbE5hbWUiLCJ1cmxXaXRob3V0UHJvdG9jb2wiLCJvY3Rva2l0Q2FjaGUiLCJNYXAiLCJnZXRPY3Rva2l0Iiwib3duZXIiLCJjYWNoZWQiLCJnZXQiLCJvY3Rva2l0IiwiT2N0b2tpdCIsImF1dGgiLCJnZXRHaXRIdWJUb2tlbiIsInNldCIsImhhc0dpdEh1YlRva2VuIiwiR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIiLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiIsIkdJVEhVQl9UT0tFTiIsImpzQ29tbW9uRGVwcyIsInRzQ29tbW9uRGVwcyIsInJlYWN0Q29tbW9uRGVwcyIsImVzbGludERlcHMiLCJnZW5lcmF0ZVBhY2thZ2VKc29uIiwic2tpcEFkZGluZ0RlcHMiLCJqc29uVGV4dCIsImpzb25PYmoiLCJwZWVyRGVwZW5kZW5jaWVzIiwiYXV0aG9yIiwidHNsaWIiLCJsZXJuYSIsInBpbnN0IiwicmVtb3ZlRGVwcmVjYXRlZFN0dWZmIiwiZ2VuZXJhdGVTY3JpcHRzIiwicHJldHRpZnkiLCJleGlzdGluZ0NvbnRlbnQiLCJvcmlnaW5hbENvbnRlbnQiLCJsaW5lIiwibmV3TGluZSIsImwiLCJnZW5lcmF0ZVByZXR0aWVyU3VmZml4IiwicG9ldHJ5RGV2RGVwZW5kZW5jaWVzIiwiaHVza3kiLCJwb3N0aW5zdGFsbCIsInBvc3RwdWJsaXNoIiwicHJlcHVibGlzaE9ubHkiLCJwcmVwYWNrIiwicG9zdHBhY2siLCJwcmVwYXJlIiwidmVyc2lvbiIsImFydGlsbGVyeSIsInBsYXl3cmlnaHQiLCJ3b3Jrc3BhY2VzIiwiQXJyYXkiLCJpc0FycmF5Iiwid29ya3NwYWNlIiwiZ2xvYlN5bmMiLCJ3YiIsIm1pY3JvbWF0Y2giLCJnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJpc1dpbGxCb29zdGVyQ29uZmlncyIsImRlcCIsInByaXZhdGUiLCJsaWNlbnNlIiwicHVibGlzaENvbmZpZyIsImFjY2VzcyIsIm1haW4iLCJyZXNvbHV0aW9ucyIsImxpbnQiLCJzY3JpcHROYW1lIiwic2NyaXB0IiwiZGlycyIsImRpciIsImZvcm1hdCIsInB5dGhvbkZpbGVzIiwiZGlyTmFtZVNldCIsInB5dGhvbkZpbGUiLCJmaXJzdCIsInNlY29uZCIsInNpemUiLCJkaXJOYW1lc1N0ciIsInR5cGUiLCJmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24iLCJwYWNrYWdlTmFtZXMiLCJoYXMiLCJpc1dvcmtzcGFjZVBhY2thZ2UiLCJ1cGRhdGVQcml2YXRlUGFja2FnZXMiLCJuZXdKc29uVGV4dCIsIm9sZEFuZE5ld1NjcmlwdE5hbWVzIiwib2xkTmFtZSIsIm5ld05hbWUiLCJmaWxlcyIsImZpeFNjcmlwdE5hbWVzIiwiZGVwZW5kZW5jeVNwZWNpZmllcnMiLCJnZXREZXBlbmRlbmN5U3BlY2lmaWVyIiwiZGV2RGVwZW5kZW5jeVNwZWNpZmllcnMiLCJjb3JlIiwiZGVwZW5kZW5jeSIsIm9sZFNjcmlwdHMiLCJoYXNUeXBlY2hlY2siLCJjbGVhbnVwIiwidHlwZWNoZWNrIiwib2xkVGVzdCIsInB5cmlnaHQiLCJiYXNlU2V0dGluZ3MiLCJwcmVDb21taXRTZXR0aW5ncyIsImNvbW1hbmRzIiwiZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24iLCJodXNreURpclBhdGgiLCJoYXNIdXNreURpciIsInNldHRpbmdzIiwiZ2V0Q2xlYW51cENvbW1hbmQiLCJwcmVQdXNoIiwidHlwZWNoZWNrQ29tbWFuZCIsImdldFByZVB1c2hTY3JpcHQiLCJta2RpclN5bmMiLCJtb2RlIiwicG9zdE1lcmdlQ29tbWFuZCIsInBvc3RNZXJnZUNvbW1hbmRzIiwiaGFzVmVyc2lvblNldHRpbmdzIiwidG9vbHNDaGFuZ2VkUGF0dGVybiIsInJhdyIsImluc3RhbGxDb21tYW5kIiwicm1OZXh0RGlyZWN0b3J5IiwiZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyIsInNyY0RpcmVjdG9yaWVzIiwibm9kZSIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwicGFja2FnZVByZWZpeCIsImdldEVzbGludEtleSIsInBhY2thZ2VzRmlsdGVyIiwiZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIiLCJnZXRTcmNEaXJzIiwiZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSIsImdpdGlnbm9yZUZpbGVQYXRoIiwiZ2l0aWdub3JlQ29udGVudCIsImFkZGl0aW9uYWxDb250ZW50IiwidmVudlBhdGgiLCJ2ZW52IiwiZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiIsImdlbmVyYXRlUmVhZG1lIiwiaW5zZXJ0QmFkZ2UiLCJmaWxlTmFtZXMiLCJyZWFkZGlyU3luYyIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwiYmFkZ2UiLCJyZWFkbWUiLCJpIiwiZ2VuZXJhdGVSZWxlYXNlcmMiLCJwbHVnaW5zIiwicGx1Z2luIiwicHJlc2V0Iiwic3VjY2Vzc0NvbW1lbnRDb25kaXRpb24iLCJmYWlsQ29tbWVudENvbmRpdGlvbiIsImxhYmVscyIsInJlbGVhc2VkTGFiZWxzIiwiZ2VuZXJhdGVSZW5vdmF0ZUpzb24iLCJwYWNrYWdlUnVsZXMiLCJydWxlIiwibWF0Y2hQYWNrYWdlTmFtZXMiLCJlbmFibGVkIiwiaW5zdGFsbFRhcmdldEFnZW50QXJncyIsImZsYXRNYXAiLCJhZ2VudCIsInNraWxsc1JlcG8iLCJwbGF5d3JpZ2h0U2tpbGxOYW1lIiwibm9uV2ViUmVtb3ZhbEFnZW50QXJncyIsImluc3RhbGxBZ2VudFNraWxscyIsImRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzIiwiaXNXZWJBcHBSZWxhdGVkIiwicmVtb3ZlU2tpbGxEaXJlY3RvcnkiLCJyZW1vdmVTa2lsbExvY2tFbnRyeSIsInJ1bkluc3RhbGxBZ2VudFNraWxscyIsInJvb3REaXJQYXRoIiwicmVsYXRpdmVQYXJlbnREaXJQYXRoIiwianNvbiIsInNraWxscyIsImlzU2tpbGxMb2NrSnNvbiIsImZyb21FbnRyaWVzIiwicm9vdEpzb25PYmoiLCJjb21waWxlck9wdGlvbnMiLCJhbHdheXNTdHJpY3QiLCJub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3MiLCJhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzIiwiZXNNb2R1bGVJbnRlcm9wIiwicmVzb2x2ZUpzb25Nb2R1bGUiLCJzb3VyY2VNYXAiLCJpbXBvcnRIZWxwZXJzIiwib3V0RGlyIiwidHlwZVJvb3RzIiwiZXhjbHVkZSIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImdldFRzY29uZmlnRXh0ZW5kcyIsImpzeCIsImdlbmVyYXRlZEV4dGVuZHMiLCJleGlzdGluZ0V4dGVuZHMiLCJtZXJnZWRFeHRlbmRzIiwibm9ybWFsaXplRXh0ZW5kcyIsInVuaXF1ZUV4dGVuZHMiLCJtZXJnZVRzY29uZmlnRXh0ZW5kcyIsInNvcnQiLCJleHBlcmltZW50YWxEZWNvcmF0b3JzIiwidmVyYmF0aW1Nb2R1bGVTeW50YXgiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwiZ2VuZXJhdGVZYXJucmNZbWwiLCJ5YXJucmNZbWxQYXRoIiwiY3VycmVudFZlcnNpb24iLCJsYXRlc3RWZXJzaW9uIiwidmVyc2lvbnNKc29uIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldE1ham9yTnVtYmVyIiwicmVsZWFzZXNQYXRoIiwieWFybnJjUGF0aCIsImRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCIsIm5vZGVMaW5rZXIiLCJubU1vZGUiLCJucG1NaW5pbWFsQWdlR2F0ZSIsIm5wbVByZWFwcHJvdmVkUGFja2FnZXMiLCJjb21wcmVzc2lvbkxldmVsIiwiaW5qZWN0RW52aXJvbm1lbnRGaWxlcyIsImVuYWJsZUdsb2JhbENhY2hlIiwib3JpZ2luYWxMZW5ndGgiLCJwbHVnaW5QYXRoIiwibWFqb3IiLCJOdW1iZXIiLCJzZXR1cExhYmVscyIsInNldHVwTGFiZWwiLCJkZWxldGVMYWJlbCIsIndhcm4iLCJjb2xvciIsInJlcXVlc3QiLCJERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyIsInNldHVwU2VjcmV0cyIsImRvdGVudiIsInNlY3JldE5hbWUiLCJzZWNyZXRfbmFtZSIsImtleV9pZCIsImtleUlkIiwiZGF0YSIsInNvZGl1bSIsInJlYWR5Iiwic2VjcmV0IiwicmF3S2V5IiwiZnJvbV9iYXNlNjQiLCJiYXNlNjRfdmFyaWFudHMiLCJPUklHSU5BTCIsInJhd1NlYyIsImZyb21fc3RyaW5nIiwiZW5jQnl0ZXMiLCJjcnlwdG9fYm94X3NlYWwiLCJlbmNCYXNlNjQiLCJ0b19iYXNlNjQiLCJlbmNyeXB0ZWRfdmFsdWUiLCJzZXR1cEdpdEh1YlNldHRpbmdzIiwid2l0aFJldHJ5IiwiYWxsb3dfYXV0b19tZXJnZSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImFsbG93X3VwZGF0ZV9icmFuY2giLCJkZWxldGVfYnJhbmNoX29uX21lcmdlIiwic3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZSIsInNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZSIsImhlYWRlcnMiLCJwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyIiwidGVtcGxhdGVzIiwiZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMiLCJhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUiLCJkaXN0YW5jZSIsInRlbXBsYXRlIiwicGFja2FnZU1hbmFnZXJDb21tYW5kIiwid2JmeUpzb25TY2hlbWEiLCJ6IiwicmVjb3JkIiwic3RyaW5nIiwib3B0aW9uYWwiLCJkb2MiLCJnZXRQYWNrYWdlQ29uZmlnIiwicGFja2FnZUpzb25QYXRoIiwiZXNtUGFja2FnZSIsInBhY2thZ2VKc29uVGV4dCIsInJlbGVhc2VCcmFuY2hlcyIsInJlbGVhc2VQbHVnaW5zIiwicmVsZWFzZXJjSnNvblBhdGgiLCJmc3AiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJmZXRjaFJlcG9JbmZvIiwiY3VycmVudCIsImhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUiLCJwcmVmaXgiLCJ3YmZ5SnNvblBhdGgiLCJ3YmZ5SnNvblRleHQiLCJyZXBvRnVsbE5hbWUiLCJmdWxsX25hbWUiLCJyZXBvQXV0aG9yIiwicmVwb05hbWUiLCJyZXBvUGFydHMiLCJpc1JlZmVycmVkQnlPdGhlclJlcG8iLCJpc0VzbVBhY2thZ2UiLCJzZXAiLCJjb250YWluc0FueSIsImRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uIiwiZ2l0aHViIiwibnBtIiwiZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZSIsInBhdHRlcm4iLCJvcmciLCJyZXQiLCJhc3NpZ24iLCJyZWRpcmVjdGVkRnVsbE5hbWUiLCJsb2NhdGlvbiIsImdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUiLCJzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzRXNsaW50UGFja2FnZSIsImFyZ3YiLCJ5YXJncyIsInBvc2l0aW9uYWwiLCJkZXNjcmliZSIsImFycmF5IiwiZGVmYXVsdCIsImFsaWFzIiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicGFja2FnZUpzb25EaXIiLCJVUkwiLCJwYXRobmFtZSIsImdldFZlcnNpb24iLCJzdHJpY3QiLCJwYXRocyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImQiLCJhYmJyZXZpYXRpb25Qcm9taXNlIiwic3ViUGFja2FnZUNvbmZpZ3MiLCJzdWJEaXJQYXRoIiwiYWxsUGFja2FnZUNvbmZpZ3MiLCJzaG91bGRSdW5Xb3JrZmxvd3MiLCJ0aGVuIiwicm1TeW5jIl0sIm1hcHBpbmdzIjoibW9CQUtPLE1BQU1BLEVBQVUsSUFMdkIsTUFDRUMsV0FBWSxFQUNaQyxtQkFBb0IsR0NnQmYsTUFBTUMsRUFBUyxJQWhCdEIsTUFDRSwrQkFBTUMsQ0FBMEJDLEVBQWNDLEdBQ3hDTixFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLGFBQWFILHFCQUU1QixVQUNRQyxHQUNSLENBQUUsTUFBT0csR0FDUEYsUUFBUUMsS0FBSyxxQkFBcUJILE1BQVNJLGFBQWlCQyxNQUFRRCxFQUFNRSxNQUFRQyxPQUFPSCxNQUMzRixDQUNJVCxFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLGNBQWNILG1CQUUvQixHQ1RLUSxlQUFlQyxFQUFjQyxHQUNsQyxPQUFPWixFQUFPQywwQkFBMEIsZ0JBQWlCUyxVQUN2RCxJQUFLRSxFQUFPQyxzQkFBdUIsT0FFbkMsTUFBTUMsRUFBYUYsRUFBT0csV0FDcEJDLEVBQWFGLEVBRWZBLElBQWVFLFNBQ2JDLEVBQUdDLFVBQVVDLEVBQUtDLEtBQUtSLEVBQU9TLFFBQVMsY0FBZUwsSUFFaEUsQ0NiTyxNQUFNTSxFQUFTLENBQ3BCLDJCQUFNQyxDQUFzQkMsR0FDMUIsSUFDRSxhQUFhUCxFQUFHUSxTQUFTQyxTQUFTRixFQUFVLE9BQzlDLENBQUUsTUFDQSxDQUVKLEVBQ0Esa0JBQU1HLENBQWFILEVBQWtCSSxTQUM3QlgsRUFBR1EsU0FBU0ksTUFBTVYsRUFBS1csUUFBUU4sR0FBVyxDQUFFTyxXQUFXLElBQzdELElBQUlDLEVBQW9CSixFQUFRSyxXQUFXLE9BQVEsTUFBTUMsT0FDckRGLElBQ0ZBLEdBQXFCLFlBRWpCZixFQUFHUSxTQUFTUCxVQUFVTSxFQUFVUSxFQUV4QyxHQ2pCV0csRUFBYyxJQUFJQyxFQ014QjFCLGVBQWUyQixFQUFrQnpCLEdBQ3RDLE9BQU9aLEVBQU9DLDBCQUEwQixvQkFBcUJTLFVBQzNELE1BQU1jLEVBQVcsQ0FBQyxLQUFNLE1BQU8sT0FDNUJjLElBQUtDLEdBQVFwQixFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsZUFBZWtCLE1BQ3pERSxLQUFNQyxHQUFNekIsRUFBRzBCLFdBQVdELElBQzdCLElBQUtsQixFQUFVLE9BRWYsTUFFTVIsU0FGbUJDLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsU0FFMUJvQixRQUFRLG1CQUFvQixDQUFDQyxFQUFHQyxLQUN2REEsRUFBYUMsU0FBUyxhQUN6QkQsR0FBZ0IseUNBRWJBLEVBQWFDLFNBQVMsaUJBQ3pCRCxHQUFnQiw0Q0FFWCxNQUFNQSxjQUVUWCxFQUFZYSxJQUFJLElBQU0xQixFQUFPSyxhQUFhSCxFQUFVUixLQUU5RCxDQ1hBLE1BQU1pQyxFQUFXQyxJQUFhLENBQXFCQyxLQUFNLFVBQVdELFVBRTlERSxFQUFZRixJQUFtQixDQUFxQkMsS0FBTSxTQUFVRCxVQUVwRUcsRUFBOEIsQ0FDbENDLFdBQVlMLEVBQVEsb0JBQ3BCTSxRQUFTTixFQUFRLG9EQUNqQk8sSUFBS0osRUFBUyxDQUNaSyxRQUFTUixFQUFRLG9DQUNqQlMsTUFBT1QsRUFBUSwyREFDZlUsV0FBWVYsRUFBUSwwREFDcEJXLE1BQU9YLEVBQVEsZ0VBRWpCWSxVQUFXVCxFQUFTLENBQ2xCVSxRQUFTYixFQUFRLDRCQUNqQmMsSUFBS2QsRUFBUSxvQ0FDYmUsb0JBQXFCZixFQUFRLG9CQUM3QmdCLFFBQVNoQixFQUFRLFdBQ2pCaUIsT0FBUWpCLEVBQVEsVUFDaEJrQixPQUFRbEIsRUFBUSxVQUNoQm1CLElBQUtuQixFQUFRLG1GQUlib0IsaUJBQWtCcEIsRUFBUSxrREFPdkJ2QyxlQUFlNEQsRUFBb0IxRCxHQUN4QyxPQUFPWixFQUFPQywwQkFBMEIsc0JBQXVCUyxVQUM3RCxNQUFNYyxFQUFXTCxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsd0JBQzlDLElBQUtKLEVBQUcwQixXQUFXbkIsR0FBVyxPQUU5QixNQUFNVixRQUFtQkcsRUFBR1EsU0FBU0MsU0FBU0YsRUFBVSxRQUNsRCtDLEVBQVEsMkNBQTJDQyxLQUFLMUQsR0FDeEQyRCxFQUFnQkYsSUFBUSxHQUM5QixJQUFLRSxFQUFlLE9BRXBCLE1BQU1DLEVBd0NWLFNBQTRCRCxHQUMxQixNQUFNRSxFQUFTQyxFQUFHQyxpQkFDaEIsdUJBQ0Esa0JBQWtCSixLQUNsQkcsRUFBR0UsYUFBYUMsUUFDaEIsRUFDQUgsRUFBR0ksV0FBV0MsSUFFVkMsRUFBWVAsRUFBT1EsV0FBVyxHQUNwQyxJQUFLRCxJQUFjTixFQUFHUSxvQkFBb0JGLEdBQVksT0FDdEQsTUFBTUcsRUFBY0gsRUFBVUksZ0JBQWdCQyxhQUFhLEdBQzNELElBQUtGLEdBQWFHLGNBQWdCWixFQUFHYSwwQkFBMEJKLEVBQVlHLGFBQWMsT0FDekYsT0FBT0UsRUFBNkJMLEVBQVlHLFlBQWFiLEVBQy9ELENBckRtQmdCLENBQW1CbEIsR0FDbEMsSUFBS0MsRUFBUSxPQUdiLE1BQU1rQixFQUFTQyxFQUFNQyxJQUFrQixDQUFDekMsRUFBZXFCLElBQzVCcUIsUUFBUW5GLEVBQU9vRixhQUFhQyxVQUFVLDhCQUV4REwsRUFBTy9CLFVBR2hCLE1BQU1xQyxRQWVWeEYsZUFBb0NXLEdBQ2xDLE1BQU04RSxFQUFlLENBQUNoRixFQUFLcUIsUUFBUW5CLEVBQVMsUUFBU0YsRUFBS3FCLFFBQVFuQixFQUFTLGNBQzNFLElBQUssTUFBTStFLEtBQWVELEVBQ3hCLElBQ0UsTUFBTXZFLFFBQWdCWCxFQUFHUSxTQUFTQyxTQUFTMEUsRUFBYSxRQUN4RCxHQUFJLDRCQUE0QkMsS0FBS3pFLEdBQ25DLE9BQU8sQ0FFWCxDQUFFLE1BQ0EsQ0FHSixPQUFPLENBQ1QsQ0E1QjZCMEUsQ0FBcUIxRixFQUFPUyxTQUNyRCxJQUFLNkUsRUFBWSxDQUNmLE1BQU1LLEVBQVlYLEVBQU9wQyxJQUNELFdBQXBCK0MsR0FBV3BELGFBQ05vRCxFQUFVckQsTUFBTU8sT0FFM0IsQ0FFQSxNQUFNK0MsRUFBbUJDLEVBQWdCYixFQUFRLEdBQzNDNUUsRUFBYUYsRUFBVzhCLFFBQVE2QixFQUFlK0IsU0FFL0NyRSxFQUFZYSxJQUFJLElBQU0xQixFQUFPSyxhQUFhSCxFQUFVUixLQUU5RCxDQWdDQSxTQUFTMEUsRUFDUGpCLEVBQ0FFLEdBRUEsTUFBTUQsRUFBdUIsQ0FBQSxFQUM3QixJQUFLLE1BQU1nQyxLQUFZakMsRUFBY2tDLFdBQVksQ0FDL0MsSUFBSy9CLEVBQUdnQyxxQkFBcUJGLEtBQWU5QixFQUFHaUMsYUFBYUgsRUFBU3hHLFFBQVUwRSxFQUFHa0MsZ0JBQWdCSixFQUFTeEcsTUFDekcsT0FFRixNQUFNZ0QsRUFBUTZELEVBQWdCTCxFQUFTbEIsWUFBYWIsR0FDcEQsUUFBY3FDLElBQVY5RCxFQUFxQixPQUN6QndCLEVBQU9nQyxFQUFTeEcsS0FBSytHLFFBQVF0QyxJQUFXekIsQ0FDMUMsQ0FDQSxPQUFPd0IsQ0FDVCxDQUVBLFNBQVNxQyxFQUFnQkcsRUFBMkJ2QyxHQUNsRCxHQUFJQyxFQUFHYSwwQkFBMEJ5QixHQUFhLENBQzVDLE1BQU1DLEVBQWV6QixFQUE2QndCLEVBQVl2QyxHQUM5RCxPQUFPd0MsRUFBZS9ELEVBQVMrRCxHQUFnQmxFLEVBQVFpRSxFQUFXRCxRQUFRdEMsR0FDNUUsQ0FDQSxHQUFJQyxFQUFHd0MseUJBQXlCRixHQUFhLENBQzNDLE1BQU1HLEVBQVdILEVBQVdHLFNBQVMvRSxJQUFLZ0YsR0FBWVAsRUFBZ0JPLEVBQVMzQyxJQUMvRSxPQUFJMEMsRUFBU0UsS0FBTUQsUUFBOENOLElBQVpNLEdBQzVDckUsRUFBUWlFLEVBQVdELFFBQVF0QyxJQXZISCxDQUFxQnhCLEtBQU0sUUFBU0QsTUF5SHREbUUsRUFDakIsQ0FDQSxPQUFPcEUsRUFBUWlFLEVBQVdELFFBQVF0QyxHQUNwQyxDQUVBLFNBQVM2QyxFQUFldEUsRUFBb0J1RSxHQUMxQyxNQUFtQixVQUFmdkUsRUFBTUMsS0FPWixTQUF3QnVFLEVBQXVCRCxHQUM3QyxHQUFzQixJQUFsQkMsRUFBT0MsT0FBYyxNQUFPLEtBQ2hDLE1BQU1DLEVBQVMsS0FBS0MsT0FBT0osRUFBUSxHQUM3QkssRUFBUUosRUFBT3BGLElBQUtZLElBQ3hCLE1BQU02RSxFQUFjUCxFQUFldEUsRUFBT3VFLEVBQVEsR0FBR08sTUFBTSxNQUUzRCxHQURBRCxFQUFZQSxFQUFZSixPQUFTLEdBQUssR0FBR0ksRUFBWUUsVUFDbEMsWUFBZi9FLEVBQU1DLEtBQ1IsSUFBSyxJQUFJK0UsRUFBUSxFQUFHQSxFQUFRSCxFQUFZSixPQUFRTyxHQUFTLEVBQ3ZESCxFQUFZRyxHQUFTLEdBQUdOLElBQVNHLEVBQVlHLEtBSWpELE9BREFILEVBQVksR0FBSyxHQUFHSCxJQUFTRyxFQUFZLEtBQ2xDQSxFQUFZM0csS0FBSyxRQUVwQitHLEVBQWdCLEtBQUtOLE9BQU9KLEdBQ2xDLE1BQU8sTUFBTUssRUFBTTFHLEtBQUssVUFBVStHLElBQ3BDLENBdEJXQyxDQUFlbEYsRUFBTUEsTUFBT3VFLEdBRWxCLFlBQWZ2RSxFQUFNQyxLQUEyQkQsRUFBTUEsTUFDcEN1RCxFQUFnQnZELEVBQU1BLE1BQU91RSxFQUN0QyxDQW9CQSxTQUFTaEIsRUFBZ0I0QixFQUFzQlosR0FDN0MsTUFBTUcsRUFBUyxLQUFLQyxPQUFPSixFQUFRLEdBQzdCSyxFQUFRUSxPQUFPQyxRQUFRRixHQUFRL0YsSUFBSSxFQUFFa0csRUFBS3RGLE1BQzlDLE1BQU02RSxFQUFjUCxFQUFldEUsRUFBT3VFLEVBQVEsR0FBR08sTUFBTSxNQUUzRCxHQURBRCxFQUFZQSxFQUFZSixPQUFTLEdBQUssR0FBR0ksRUFBWUUsVUFDbEMsWUFBZi9FLEVBQU1DLEtBQ1IsSUFBSyxJQUFJK0UsRUFBUSxFQUFHQSxFQUFRSCxFQUFZSixPQUFRTyxHQUFTLEVBQ3ZESCxFQUFZRyxHQUFTLEdBQUdOLElBQVNHLEVBQVlHLEtBSWpELE9BREFILEVBQVksR0FBSyxHQUFHSCxJQUFTWSxNQUFRVCxFQUFZLEtBQzFDQSxFQUFZM0csS0FBSyxRQUVwQitHLEVBQWdCLEtBQUtOLE9BQU9KLEdBQ2xDLE9BQXFCLElBQWpCSyxFQUFNSCxPQUFxQixNQUFNUSxLQUM5QixNQUFNTCxFQUFNMUcsS0FBSyxVQUFVK0csSUFDcEMsQ0MxTE8sTUFBTU0sRUFBYSxDQUN4QixxQkFDQSxjQUNBLHNCQUNBLHNCQUNBLGFBQ0EsY0FDQSxlQUNBLGFBQ0EsYUNBSy9ILGVBQWVnSSxFQUFrQjlILEdBQ3RDLE9BQU9aLEVBQU9DLDBCQUEwQixvQkFBcUJTLFVBQzNELE1BQU1pSSxRQUFpQkMsRUFBR0MsS0FBSyxDQUFDLFFBQVMsV0FBWSxDQUFFQyxLQUFLLEVBQU1DLElBQUtuSSxFQUFPUyxRQUFTMkgsT0FBUVAsSUFDL0YsSUFBSyxNQUFNUSxLQUFXTixFQUFVLENBQzlCLE1BQU12QyxFQUFjakYsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTNEgsR0FFM0NqSSxTQURnQkMsRUFBR1MsU0FBUzBFLEVBQWEsU0FDcEJ4RCxRQUN6QixzQ0FDQSxnREFFSTNCLEVBQUdDLFVBQVVrRixFQUFhcEYsRUFDbEMsR0FFSixDQ2pCT04sZUFBZXdJLEVBQXNDQyxHQUMxRCxPQUFPbkosRUFBT0MsMEJBQTBCLHdDQUF5Q1MsZ0JBQ3pFMEksUUFBUXRELElBQ1pxRCxFQUFnQjdHLElBQUk1QixVQUNsQixNQUFNMkksRUFBaUJsSSxFQUFLQyxLQUFLa0ksRUFBZ0IsUUFDakQsSUFBSyxNQUFNQyxJQUFrQixDQUFDLFlBQWEsU0FBVSxDQUNuRCxNQUFNQyxFQUFpQnJJLEVBQUtDLEtBQUtrSSxFQUFnQkMsR0FDakQsVUFDUXRJLEVBQUdRLFNBQVNnSSxPQUFPRCxFQUFnQkgsR0FDekMsTUFBTXZJLFFBQW1CRyxFQUFHUSxTQUFTQyxTQUFTUCxFQUFLQyxLQUFLa0ksRUFBZ0IsZ0JBQWlCLFFBQ25GdEksRUFBYUYsRUFBV21CLFdBQVdzSCxFQUFnQixRQUN6RCxHQUFJekksSUFBZUUsRUFBWSxhQUV6QkMsRUFBR1EsU0FBU1AsVUFBVUMsRUFBS0MsS0FBS2tJLEVBQWdCLGdCQUFpQnRJLEVBQ3pFLENBQUUsTUFDQSxDQUVKLE1BSVIsQ0NqQk9OLGVBQWVnSixFQUNwQjlJLEVBQ0ErSSxHQUVBLE9BQU8zSixFQUFPQywwQkFBMEIscUJBQXNCUyxVQUM1RCxNQUFNa0osRUFBaUJ6SSxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsVUFDOUN3SSxFQUNKakosRUFBT2tKLFFBQVVsSixFQUFPbUosZ0NBQTZCL0MsRUFBWTdGLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxNQUFPLFNBRWpHMkksUUFBZ0JDLEVBQWtCLElBQU1oSixFQUFHaUosUUFBUU4sRUFBZ0IsQ0FBRU8sZUFBZSxLQUMxRixHQUFLSCxFQUVMLElBQUssTUFBTUksS0FBVUosRUFBUyxDQUM1QixNQUFNSyxFQUFVRCxFQUFPbEssS0FBS29LLE1BQU0sR0FBRyxHQUMvQkMsRUFBOEJILEVBQU9sSyxLQUFLc0ssU0FBUyxTQUN6RCxJQUFJQyxFQUFjRixFQUE4QkYsRUFBVUQsRUFBT2xLLEtBQzdEdUssRUFBWTFILFNBQVMsUUFDdkIwSCxFQUFjLElBQUlBLEVBQVk3SCxRQUFRLEtBQU0sUUFFOUMsTUFBTThILEVBQWFmLEVBQXlCcEMsS0FDekMzRyxHQUNDQSxFQUFPb0YsYUFBYTJFLGVBQWVGLElBQWdCN0osRUFBT29GLGFBQWE0RSxrQkFBa0JILElBR3pGTCxFQUFPUyxVQUFZTixFQUNqQkcsU0FFSXpKLEVBQUdZLE1BQU1WLEVBQUtDLEtBQUt3SSxFQUFnQlMsVUFDbkNsSSxFQUFZYSxJQUFJLElBQ3BCL0IsRUFBR3dJLE9BQU90SSxFQUFLQyxLQUFLd0ksRUFBZ0JRLEVBQU9sSyxNQUFPaUIsRUFBS0MsS0FBS3dJLEVBQWdCUyxFQUFTLGlCQUU5RVIsVUFFSDVJLEVBQUdZLE1BQU1nSSxFQUFnQixDQUFFOUgsV0FBVyxVQUN0Q0ksRUFBWWEsSUFBSSxJQUNwQi9CLEVBQUd3SSxPQUFPdEksRUFBS0MsS0FBS3dJLEVBQWdCUSxFQUFPbEssTUFBT2lCLEVBQUtDLEtBQUt5SSxFQUFnQk8sRUFBT2xLLFNBRzlFa0ssRUFBT1UsZUFBaUJqQixJQUFtQmEsVUFFOUN6SixFQUFHWSxNQUFNZ0ksRUFBZ0IsQ0FBRTlILFdBQVcsVUFDdENJLEVBQVlhLElBQUksSUFDcEJpSCxFQUFrQixJQUNoQmhKLEVBQUd3SSxPQUNEdEksRUFBS0MsS0FBS3dJLEVBQWdCUSxFQUFPbEssS0FBTSxjQUN2Q2lCLEVBQUtDLEtBQUt5SSxFQUFnQixHQUFHTyxFQUFPbEssZ0JBSzlDLEdBRUosQ0N6RE8sU0FBUzZLLEVBQWtCQyxFQUF1QkMsR0FDdkQsT0FBT0EsQ0FDVCxDQUdPLFNBQVNDLEVBQWFDLEVBQWtCeEcsRUFBa0I5RSxHQUMvRCxNQUFNdUwsRUFBYyxJQUFJRCxHQUV4QixJQUFLLE1BQU9qRCxFQUFPbUQsS0FBUzFHLEVBQU80RCxlQUNOdkIsSUFBdkJvRSxFQUFZbEQsR0FDZGtELEVBQVlsRCxHQUFTckksRUFBUXlMLDhCQUE4QkQsRUFBTXhMLEdBQ3hEQSxFQUFRMEwsa0JBQWtCRixHQUNuQ0QsRUFBWWxELEdBQVNyQyxFQUFNc0YsRUFBT2pELEdBQWtCbUQsRUFBTXhMLEdBQ2hEc0wsRUFBT3BJLFNBQVNzSSxJQUMxQkQsRUFBWUksS0FBS0gsR0FHckIsT0FBT0QsQ0FDVCxDQ1hPLFNBQVNLLEVBQTRDQyxHQUMxRCxNQUFNQyxFQUFlckQsT0FBT0MsUUFBUW1ELEdBQUtFLFNBQVMsRUFBRUMsSUFBUUMsS0FBVUQsRUFBS0UsY0FBY0QsSUFDekYsSUFBSyxNQUFPdEQsRUFBS3RGLEtBQVV5SSxTQUVsQkQsRUFBSWxELEdBQ1ZrRCxFQUFnQ2xELEdBQU90RixFQUduQixpQkFBVkEsR0FBZ0MsT0FBVkEsR0FDL0J1SSxFQUFTdkksR0FHYixPQUFPd0ksQ0FDVCxDQytDQSxNQUFNTSxFQUFzQyxDQUMxQzlMLEtBQU0sYUFDTitMLEdBQUksQ0FDRkMsYUFBYyxLQUNkVixLQUFNLENBQ0pXLFNBQVUsQ0FBQyxVQUdmQyxZQUFhLENBQ1hDLFNBQVUsUUFFWkMsWUFBYSxDQUNYQyxNQUFPLGlDQUNQLHNCQUFzQixHQUV4QkMsS0FBTSxDQUNKQyxRQUFTLENBQUUsVUFBVyxtQkFJcEJDLEVBQXVDLENBQzNDeE0sS0FBTSx5QkFDTitMLEdBQUksQ0FDRkMsYUFBYyxNQUVoQkksWUFBYSxDQUNYQyxNQUFPLDJDQUNQLHNCQUFzQixHQUV4QkMsS0FBTSxDQUNKQyxRQUFTLENBQ1BFLEtBQU0sdUVBS05DLEVBQVksQ0FDaEJ2RyxLQUFNLENBQ0puRyxLQUFNLE9BQ04rTCxHQUFJLENBQ0ZDLGFBQWMsS0FDZFYsS0FBTSxDQUNKVyxTQUFVLENBQUMsT0FBUSxVQUl2QkcsWUFBYSxDQUNYQyxNQUFPLDJDQUNQLHNCQUFzQixHQUV4QkgsWUFBYSxDQUVYQyxTQUFVLFNBRVpHLEtBQU0sQ0FDSm5HLEtBQU0sQ0FDSnNHLEtBQU0sb0VBSVpFLFFBQVMsQ0FDUDNNLEtBQU0sVUFDTitMLEdBQUksQ0FDRlQsS0FBTSxDQUNKVyxTQUFVLEtBR2RHLFlBQWEsQ0FDWEMsTUFBTyx5QkFDUCxzQkFBc0IsR0FFeEJILFlBQWEsQ0FFWCxXQUFZLFFBRVpDLFNBQVUsU0FFWkcsS0FBTSxDQUNKSyxRQUFTLENBQ1BGLEtBQU0sdUVBSVosY0FBZSxDQUNiek0sS0FBTSxnQkFDTitMLEdBQUksQ0FDRmEsb0JBQXFCLENBQ25CQyxNQUFPLENBQUMsU0FBVSxTQUFVLGlCQUdoQ1AsS0FBTSxDQUNKLGNBQWUsQ0FDYkcsS0FBTSwyRUFJWkssS0FBTSxDQUNKOU0sS0FBTSxPQUNOK0wsR0FBSSxDQUFBLEVBQ0pHLFlBQWEsQ0FFWEMsU0FBVSxTQUVaRyxLQUFNLENBQ0pRLEtBQU0sQ0FBRUwsS0FBTSxvRUFHbEIsZ0JBQWlCLENBQ2Z6TSxLQUFNLG9CQUNOK0wsR0FBSSxDQUNGQyxhQUFjLENBQ1phLE1BQU8sQ0FBQyxZQUdaUCxLQUFNLENBQ0osZ0JBQWlCLENBQ2ZHLEtBQU0sNkVBSVosZ0JBQWlCLENBQ2Z6TSxLQUFNLCtCQUNOK0wsR0FBSSxDQUNGZ0IsT0FBUSxDQUNORixNQUFPLENBQUMsWUFFVmIsYUFBYyxDQUNaYSxNQUFPLENBQUMsYUFHWlAsS0FBTSxDQUNKLFNBQVUsQ0FDUlUsR0FBSSx3R0FDSlAsS0FBTSxtRUFDTlEsS0FBTSxDQUNKLGNBQWUsY0FDZixlQUFnQiwwREFDaEIsZUFBZ0IsNkJBRWxCQyxRQUFTLENBQ1BDLHdCQUF5Qiw2Q0FLakMsZUFBZ0IsQ0FDZG5OLEtBQU0sNkJBQ04rTCxHQUFJLENBQ0ZnQixPQUFRLENBQ05GLE1BQU8sQ0FBQyxZQUVWYixhQUFjLENBQ1phLE1BQU8sQ0FBQyxhQUdaUCxLQUFNLENBQ0osU0FBVSxDQUNSVSxHQUFJLHVHQUNKUCxLQUFNLG1FQUNOUSxLQUFNLENBQ0osY0FBZSxZQUNmLGVBQWdCLDBEQUNoQixlQUFnQiw2QkFFbEJDLFFBQVMsQ0FDUEUsZUFBZ0Isb0NBS3hCLGdCQUFpQixDQUNmcE4sS0FBTSw4QkFDTitMLEdBQUksQ0FDRmdCLE9BQVEsQ0FDTkYsTUFBTyxDQUFDLFlBRVZiLGFBQWMsQ0FDWmEsTUFBTyxDQUFDLGFBR1pQLEtBQU0sQ0FDSixTQUFVLENBQ1JVLEdBQUksd0dBQ0pQLEtBQU0sbUVBQ05RLEtBQU0sQ0FDSixjQUFlLGFBQ2YsZUFBZ0IsMERBQ2hCLGVBQWdCLDZCQUVsQkMsUUFBUyxDQUNQRyxlQUFnQixxQ0FTbkI3TSxlQUFlOE0sRUFBa0JDLEdBQ3RDLE9BQU96TixFQUFPQywwQkFBMEIsbUJBQW9CUyxVQUMxRCxHQUFJZ04sRUFBd0JELEVBQVdFLFlBRXJDLE9BR0YsTUFBTUMsRUFBZ0J6TSxFQUFLcUIsUUFBUWlMLEVBQVdwTSxRQUFTLFVBQVcsbUJBQzVESixFQUFHUSxTQUFTSSxNQUFNK0wsRUFBZSxDQUFFN0wsV0FBVyxJQUdwRCxNQUFNOEwsRUFBa0IxTSxFQUFLcUIsUUFBUWlMLEVBQVdwTSxRQUFTLFVBQVcsc0JBQzlEYyxFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTcU0sR0FBR0QsRUFBaUIsQ0FBRUUsT0FBTyxFQUFNaE0sV0FBVyxLQUV0RixNQUFNd0csUUFBZ0J0SCxFQUFHUSxTQUFTeUksUUFBUTBELEVBQWUsQ0FBRXpELGVBQWUsSUFDcEU2RCxFQUFjLElBQUlDLElBQUksQ0FDMUIsV0FDQSxjQUNBLGtCQUNBLG9CQUNBLG9CQUNBLG1CQUNBLHVCQUNHMUYsRUFBUTJGLE9BQVE5RCxHQUFXQSxFQUFPUyxVQUFZVCxFQUFPbEssS0FBS3NLLFNBQVMsU0FBU2xJLElBQUs4SCxHQUFXQSxFQUFPbEssUUFFcEd1TixFQUFXVSxVQUFVQyxpQkFDdkJKLEVBQVlLLElBQUksZUFHbEIsSUFBSyxNQUFNQyxLQUFZTixFQUFhLENBRWxDLE1BQU03SyxFQUFPaEMsRUFBS29OLFNBQVNELEVBQVUsY0FDL0JuTSxFQUFZYSxJQUFJLElBQU13TCxFQUFrQmYsRUFBWUcsRUFBZXpLLEdBQzNFLEdBRUosQ0FFTyxTQUFTdUssRUFBd0JDLEdBQ3RDLE9BQU9BLEdBQVluRCxTQUFTLHlCQUEwQixDQUN4RCxDQUVBOUosZUFBZThOLEVBQWtCNU4sRUFBdUJnTixFQUF1QnpLLEdBQzdFLE1BQU0zQixFQUFXTCxFQUFLQyxLQUFLd00sRUFBZSxHQUFHekssU0FDdkNzTCxFQUFpQ3hOLEVBQUcwQixXQUFXeEIsRUFBS0MsS0FBS3dNLEVBQWUsMEJBRTlFLEdBQWEsWUFBVHpLLEVBRUYsa0JBRE11TCxFQXFMVixTQUFpQzlOLEdBQy9CLElBQUtBLEVBQU8rTixhQUNWLE9BQU9DLEVBQVVsQyxHQUduQixNQUFNbUMsRUFBaUJqTyxFQUFPa08sTUFBUSxNQUFRLE9BQ3hDQyxFQUFnQixDQUNwQixDQUFFcEMsS0FBTSx1QkFDUixDQUFFQSxLQUFNLHdCQUF5QlEsS0FBTSxDQUFFLGdCQUFnQixPQUNyRHZNLEVBQU9rTyxNQUFRLENBQUMsQ0FBRW5DLEtBQU0sdUJBQXdCUSxLQUFNLENBQUUsY0FBZSxZQUFnQixHQUMzRixDQUFFbkssSUFBSyxHQUFHNkwsYUFDVixDQUFFN0wsSUFBSyxHQUFHNkwsa0JBRVJqTyxFQUFPb0YsYUFBYUMsU0FBUytJLE9BQy9CRCxFQUFNdkQsS0FBSyxDQUFFeEksSUFBSyxHQUFHNkwsZ0JBRXZCRSxFQUFNdkQsS0FBSyxDQUFFbUIsS0FBTSx5QkFFbkIsTUFBTXNDLEVBQWtCTCxFQUFVNUMsR0FDNUJrRCxFQUFhRCxFQUFnQnpDLEtBQUtDLFNBQVcsQ0FBRSxVQUFXLGlCQUVoRSxPQURBd0MsRUFBZ0J6QyxLQUFLQyxRQUFVLElBQUt5QyxFQUFZSCxTQUN6Q0UsQ0FDVCxDQTNNb0JFLENBQXdCdk8sR0FBU1ksR0FJbkQsSUFBSTROLEVBQWNSLEVBQVV6TCxLQUFReUosRUFBWUEsRUFBVXpKLEdBQWtDLElBRTVGLEtBQU0sU0FBVWlNLEdBQWMsT0FFOUIsSUFDRSxNQUFNdE8sUUFBbUJHLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsUUFDbEQ2TixFQUFjQyxFQUFLQyxLQUFLek8sR0FDOUJzTyxFQUFjdkosRUFBTUMsSUFBSSxDQUFDc0osRUFBYUMsRUFBYUQsR0FBYyxDQUFFSSxXQUFZdEUsR0FDakYsQ0FBRSxNQUNBLENBR0UvSCxFQUFLc00sV0FBVyxZQUNsQkwsRUFBYyxJQUNUQSxFQUNIOUMsWUFBYSxDQUNYQyxNQUFPLHlCQUNQLHNCQUFzQixJRGpWdkIsU0FDTGIsRUFDQWxELEdBRUEsTUFBTXRGLEVBQVF3SSxFQUFJbEQsVUFFWGtELEVBQUlsRCxHQUNWa0QsRUFBOEJsRCxHQUFPdEYsQ0FFeEMsQ0M0VUl3TSxDQUFhTixFQUFhLFFBQ3RCQSxFQUFZbkQsSUFBSVQsT0FDbEI0RCxFQUFZbkQsR0FBR1QsS0FBSyxnQkFBa0IsSUFDakMsSUFBSXlDLElBQUksQ0FBQyxRQUFTLGdCQUFrQm1CLEVBQVluRCxHQUFHVCxLQUFLLGlCQUFtQixRQUt2RSxZQUFUckksR0FBc0JpTSxFQUFZNUMsS0FBS0ssU0FBVzRCLElBQ3BEVyxFQUFZaEQsY0FBZ0IsQ0FBQSxFQUM1QmdELEVBQVloRCxZQUFZdUQsUUFBVSxRQUNsQ1AsRUFBWTVDLEtBQUtLLFFBQVFNLE9BQVMsQ0FBQSxFQUNsQ2lDLEVBQVk1QyxLQUFLSyxRQUFRTSxLQUFLeUMsd0JBQTBCLHlCQUcxRCxJQUFJQyxHQUFxQixFQUN6QixJQUFLLE1BQU1DLEtBQU94SCxPQUFPWixPQUFPMEgsRUFBWTVDLE1BRXJDc0QsRUFBSW5ELE1BQU01SixTQUFTLDBCQUV4QmdOLEVBQWFuUCxFQUFRa1AsRUFBSzNNLEdBQzFCME0sR0FBcUIsR0FFdkIsR0FBS0EsRUFBTCxDQUVBLE9BQVExTSxHQUNOLElBQUssVUFDSCxHQUFJaU0sRUFBWW5ELElBQUkrRCxnQkFDWFosRUFBWW5ELEdBQUdULFNBQ2pCLE1BQUk0RCxFQUFZbkQsSUFBSVQsTUFBUTVLLEVBQU9pTSxRQUFRVixTQUFTeEUsT0FBUyxHQUtsRSxrQkFETTFHLEVBQUdRLFNBQVNxTSxHQUFHM00sRUFBS0MsS0FBS3dNLEVBQWUsZUFBZ0IsQ0FBRUcsT0FBTyxJQUh2RXFCLEVBQVluRCxHQUFHVCxLQUFLVyxTQUFXdkwsRUFBT2lNLFFBQVFWLFFBS2hELENBQ0l2TCxFQUFPK04sY0FDVFMsRUFBWWhELGNBQWdCLENBQUEsRUFDNUJnRCxFQUFZaEQsWUFBWSxZQUFjLGdCQUUvQmdELEVBQVloRCxjQUFjLFlBRW5DLE1BRUYsSUFBSyxPQUVDZ0QsRUFBWW5ELElBQUlDLHFCQUNYa0QsRUFBWW5ELEdBQUdDLGFBQWEsZ0JBRWpDa0QsRUFBWW5ELElBQUlULGNBQ1g0RCxFQUFZbkQsR0FBR1QsS0FBSyxnQkFDM0I0RCxFQUFZbkQsR0FBR1QsS0FBS1csU0FBV2lELEVBQVluRCxHQUFHVCxLQUFLVyxTQUFTK0IsT0FBUStCLEdBQXNCLGdCQUFYQSxJQVFyRixTQUZNdkIsRUFBVVUsRUFBYTVOLEdBRWhCLFNBQVQyQixFQUFpQixDQUVuQixTQURNbEMsRUFBR1EsU0FBU3FNLEdBQUczTSxFQUFLQyxLQUFLd00sRUFBZSxpQkFBa0IsQ0FBRUcsT0FBTyxLQUNwRXFCLEVBQVk1QyxLQUFLUSxNQUFNRyxLQUFNLE9BR2xDaUMsRUFBWTVDLEtBQUssY0FBZ0I0QyxFQUFZNUMsS0FBS1EsS0FDbEQsTUFBTWtELEVBQVNkLEVBQVk1QyxLQUFLUSxLQUFLRyxLQUFLZ0QseUJBQzFDLEdBQXNCLGlCQUFYRCxFQUFxQixPQUVoQ2QsRUFBWTVDLEtBQUtRLEtBQUtHLEtBQUtnRCx5QkFBMkIsV0FBV0QsSUFDakVkLEVBQVlsUCxLQUFPLGdCQUNuQmtQLEVBQVluRCxHQUFLLENBQUVtRSxrQkFBbUIsYUFDL0JoQixFQUFZNUMsS0FBS1EsV0FDbEIwQixFQUFVVSxFQUFhak8sRUFBS0MsS0FBS3dNLEVBQWUsa0JBQ3hELENBbER5QixDQW1EM0IsQ0FFQSxTQUFTbUMsRUFBYW5QLEVBQXVCa1AsRUFBVTNNLEdBK0JyRCxHQTlCQTJNLEVBQUkzQyxPQUFTLENBQUEsRUFDYjJDLEVBQUkxQyxVQUFZLENBQUEsU0FFVDBDLEVBQUkxQyxRQUFRaUQsVUFHUixTQUFUbE4sR0FDUyxZQUFUQSxHQUNTLGtCQUFUQSxHQUNTLGlCQUFUQSxHQUNTLGtCQUFUQSxJQUVBMk0sRUFBSTFDLFFBQVFrRCxTQUFXLCtCQUlaLGtCQUFUbk4sR0FBcUMsaUJBQVRBLEdBQW9DLGtCQUFUQSxJQUN6RDJNLEVBQUkzQyxLQUFLLGdCQUFrQnZNLEVBQU9rTyxNQUFRLDJCQUE2Qix5QkFFckVnQixFQUFJMUMsUUFBUW1ELGlCQUNkVCxFQUFJMUMsUUFBUW9ELDZCQUErQixxREFDcENWLEVBQUkxQyxRQUFRbUQsaUJBR2xCVCxFQUFJMUMsUUFBUXFELHNCQUFpQyxZQUFUdE4sR0FBc0JBLEVBQUtzTSxXQUFXLFlBQzFFSyxFQUFJM0MsS0FBS3VELFlBQWN2TixFQUFLc00sV0FBVyxhQUV4Q0ssRUFBSTFDLFFBQVFxRCxvQkFBc0Isa0RBR3ZCLFNBQVR0TixFQUFpQixDQUNuQixNQUFNK00sRUFBU0osRUFBSTNDLEtBQUtnRCx5QkFDRixpQkFBWEQsSUFDVEosRUFBSTNDLEtBQUtnRCx5QkFBMkJELEVBQU90TixRQUFRLFFBQVMsSUFFaEUsQ0FrQ0EsR0FoQ0loQyxFQUFPK00sWUFBWThCLFdBQVcsdUJBQ2hDSyxFQUFJbkQsS0FBT21ELEVBQUluRCxNQUFNL0osUUFBUSxrQkFBbUIsZ0JBQ3ZDaEMsRUFBTytNLFlBQVk4QixXQUFXLDRCQUN2Q0ssRUFBSW5ELEtBQU9tRCxFQUFJbkQsTUFBTS9KLFFBQVEsZUFBZ0Isb0JBSWpCLFNBQTFCa04sRUFBSTNDLEtBQUt3RCxxQkFDSmIsRUFBSTNDLEtBQUt3RCxhQUlkeE4sRUFBS3NNLFdBQVcsV0FBYUssRUFBSTFDLFFBQVF3RCxlQUFvRCxpQkFBNUJkLEVBQUkzQyxLQUFLMEQsaUJBQzVFZixFQUFJM0MsS0FBSzBELGVBQWlCZixFQUFJM0MsS0FBSzBELGVBQWVqTyxRQUFRLFlBQWEsS0FFckVoQyxFQUFPQyx3QkFBMEJpUCxFQUFJM0MsS0FBSzJELFVBQVkzTixFQUFLc00sV0FBVyxVQUN4RUssRUFBSTNDLEtBQUsyRCxTQUFXLFNBR1QsWUFBVDNOLEdBQStCLFNBQVRBLEdBQW1CQSxFQUFLc00sV0FBVyxVQUN2RDdPLEVBQU8rTixlQUNUbUIsRUFBSTNDLEtBQUs0RCxzQkFBdUIsVUFHM0JqQixFQUFJM0MsS0FBSzRELHFCQUdkekksT0FBTzBJLEtBQUtsQixFQUFJM0MsTUFBTXhGLE9BQVMsRUFDakM4RCxFQUFTcUUsRUFBSTNDLGFBRU4yQyxFQUFJM0MsS0FFVDdFLE9BQU8wSSxLQUFLbEIsRUFBSTFDLFNBQVN6RixPQUFTLEVBQUcsQ0FFdkMsTUFBTXNKLEVBQWF4RixFQUFTcUUsRUFBSTFDLGdCQUN6QjBDLEVBQUkxQyxRQUNYMEMsRUFBSTFDLFFBQVU2RCxDQUNoQixhQUNTbkIsRUFBSTFDLE9BRWYsQ0EwQkExTSxlQUFlZ08sRUFBVVUsRUFBdUI1TixHQUM5QyxNQUFNMFAsRUFBVzVCLEVBQUs2QixLQUFLL0IsRUFBYSxDQUFFZ0MsV0FBVyxFQUFJQyxjQUFjLEVBQU1DLE9BQVEsQ0FBRSxTQUFVLGlCQUMzRnJRLEVBQUdRLFNBQVNQLFVBQVVNLEVBQVUwUCxFQUN4QyxDQy9mT3hRLGVBQWU2USxFQUFTQyxHQUM3QixPQUFPeFIsRUFBT0MsMEJBQTBCLFdBQVlTLFVBQ2xELEdBQUlnTixFQUF3QjhELEVBQWM3RCxZQUFhLE9BRXZELE1BQU10TSxFQUFVbVEsRUFBY25RLFFBQ3hCb1EsUUFBaUI3SSxFQUFHQyxLQUFLLFVBQVcsQ0FBRUMsS0FBSyxFQUFNQyxJQUFLMUgsRUFBUzJILE9BQVFQLElBQ3pFNUksRUFBUUMsV0FDVk0sUUFBUUMsS0FBSyxTQUFTb1IsRUFBUzlKLDRCQUE0QnRHLEtBRTdELElBQUssTUFBTXFRLEtBQVVELEVBQVUsQ0FDN0IsTUFBTWpRLEVBQVdMLEVBQUtDLEtBQUtDLEVBQVNxUSxTQUM5QnZQLEVBQVlhLElBQUl0QyxVQUNwQixNQUFNa0IsUUFBZ0JYLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsUUFDckQsSUFBSVIsRUFBYTJRLEVBQWUvUCxHQUNoQ1osRUFBYTRRLEVBQWtCNVEsRUFBWXdRLEVBQWUsT0FDdEQ1UCxJQUFZWixTQUNSTSxFQUFPSyxhQUFhSCxFQUFVUixJQUcxQyxDQUVBLE1BQU02USxRQUFnQmpKLEVBQUdDLEtBQ3ZCLENBQ0UsOERBQ0EsMkVBRUYsQ0FBRUMsS0FBSyxFQUFNQyxJQUFLMUgsRUFBUzJILE9BQVFQLElBRWpDNUksRUFBUUMsV0FDVk0sUUFBUUMsS0FBSyxTQUFTd1IsRUFBUWxLLDhCQUE4QnRHLEtBRTlELElBQUssTUFBTXlRLEtBQVVELEVBQVMsQ0FDNUIsTUFBTXJRLEVBQVdMLEVBQUtDLEtBQUtDLEVBQVN5USxHQUM5QmhSLFFBQW1CRyxFQUFHUSxTQUFTQyxTQUFTRixFQUFVLFFBQ3hELElBQUlSLEVBQWErUSxFQUFlalIsR0FDaENFLEVBQWE0USxFQUFrQjVRLEVBQVl3USxFQUFlLE1BRXREMVEsSUFBZUUsU0FDYk0sRUFBT0ssYUFBYUgsRUFBVVIsRUFDdEMsQ0FFQSxNQUFNZ1IsUUFBdUJwSixFQUFHQyxLQUFLLHVDQUF3QyxDQUMzRUMsS0FBSyxFQUNMQyxJQUFLMUgsRUFDTDJILE9BQVFQLElBRU41SSxFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLFNBQVMyUixFQUFlckssOEJBQThCdEcsS0FFckUsSUFBSyxNQUFNNFEsS0FBUUQsRUFBZ0IsQ0FDakMsTUFBTXhRLEVBQVdMLEVBQUtDLEtBQUtDLEVBQVM0USxHQUM5Qm5SLFFBQW1CRyxFQUFHUSxTQUFTQyxTQUFTRixFQUFVLFFBQ3hELElBQUlSLEVBQWEyUSxFQUFlN1EsR0FDaENFLEVBQWE0USxFQUFrQjVRLEVBQVl3USxFQUFlLFFBRXREMVEsSUFBZUUsU0FDYk0sRUFBT0ssYUFBYUgsRUFBVVIsRUFDdEMsT0FFTW1CLEVBQVkrUCxjQUV0QixDQUVPLFNBQVNQLEVBQWUvUCxHQUM3QixPQUFPQSxFQUNKSyxXQUFXLGtCQUFtQixTQUM5QkEsV0FBVyxnQkFBaUIsVUFDNUJBLFdBQVcsZ0JBQWlCLFNBQ2pDLENBRUEsU0FBUzhQLEVBQWVuUSxHQUN0QixPQUFPQSxFQUNKSyxXQUFXLGtCQUFtQixXQUM5QkEsV0FBVyxnQkFBaUIsWUFDNUJBLFdBQVcsZ0JBQWlCLFdBQ2pDLENBRUEsU0FBUzJQLEVBQWtCNVEsRUFBb0J3USxFQUE4QlcsR0FDM0UsSUFBSyxNQUFPQyxFQUFRQyxLQUFVL0osT0FBT0MsUUFBUWlKLEVBQWNjLFVBQVVDLE9BQU96TSxLQUFPLENBQUEsR0FDakY5RSxFQUFhQSxFQUFXaUIsV0FBV21RLEVBQVFDLEdBRTdDLElBQUssTUFBT0QsRUFBUUMsS0FBVS9KLE9BQU9DLFFBQVFpSixFQUFjYyxVQUFVQyxRQUFRSixJQUFhLENBQUEsR0FDeEZuUixFQUFhQSxFQUFXaUIsV0FBV21RLEVBQVFDLEdBRTdDLE9BQU9yUixDQUNULENDM0ZPTixlQUFlOFIsR0FBMEIvRSxFQUEyQmdGLEdBQ3pFLE9BQU96UyxFQUFPQywwQkFBMEIsNEJBQTZCUyxVQUNuRSxJQUFLK00sRUFBVzNELE9BQVEsT0FHeEIsTUFBTTRJLEVBQWtCdlIsRUFBS3FCLFFBQVFpTCxFQUFXcE0sUUFBUyxtQkFDbkRzUixRQUFxQnJSLEVBQU9DLHNCQUFzQm1SLEdBRXhELElBQUssTUFBT3BFLEVBQVVzRSxJQUFhLENBQ2pDLENBQUMsWUFBYSxhQUNkLENBQUMsWUFBYSxlQUNkLENBQUMsWUFBYSxlQUNKLENBQ1YsTUFBTWhSLEVBQVVpUixHQUF5QnBGLEVBQVlnRixFQUFZRyxFQUFVRCxHQUNyRW5SLEVBQVdMLEVBQUtxQixRQUFRaUwsRUFBV3BNLFFBQVNpTixTQUM1Q25NLEVBQVlhLElBQUksSUFBTTFCLEVBQU9LLGFBQWFILEVBQVVJLEdBQzVELENBRUEsTUFBTWtSLEVBQWtCM1IsRUFBS3FCLFFBQVFpTCxFQUFXcE0sUUFBUyw2QkFDbkQwUixFQXlGVixTQUNFblMsRUFDQTZSLEVBQ0FFLEdBRUEsTUFBTUssRUFBYyx5RUFDZEMsRUFBT0osR0FBeUJqUyxFQUFRNlIsRUFBWSxTQUFVRSxHQUNwRSxNQUFPLEdBQUdLLFFBQWtCQyxHQUM5QixDQWpHK0JDLENBQWdDekYsRUFBWWdGLEVBQVlFLFNBQzdFeFEsRUFBWWEsSUFBSSxJQUFNMUIsRUFBT0ssYUFBYW1SLEVBQWlCQyxLQUVyRSxDQUVBLFNBQVNGLEdBQ1BwRixFQUNBZ0YsRUFDQUcsRUFDQUQsR0FFQSxNQUFNOUQsRUFBaUJwQixFQUFXcUIsTUFBUSxNQUFRLE9BQzVDcUUsRUFBYyx5Q0FHVjFGLEVBQVd6SCxhQUFhOUYsTUFBUSwrQkFDM0J1TixFQUFXekgsYUFBYW9OLG1DQUNwQnZFLCtZQVNnQkEsNEVBQXlGQSxxZUFJekNwQixFQUFXNEYsa0JBQW9CLHlDQUF5Q1QsK0JBQXdDLGlFQUduTUgsRUFBV2xMLEtBQU0rTCxHQUFNQSxFQUFFQyxvQkFDckIsV0FBVzFFLDZFQUNYLFNBR0oyRSxHQUF5QmYsT0FFdEJ4USxXQUFXLFlBQWEsUUFDeEJBLFdBQVcsVUFBVyxRQUN0QkMsT0FFR3VSLEVBQWdCZCxHQUFjelEsT0FBT3VOLFdBQVcsS0FNdEQsT0FBTzBELEdBTHdCUixFQUMzQmMsRUFDRSxPQUFTZCxFQUFhelEsT0FDdEIsS0FBT3lRLEVBQ1QsR0FFTixDQUVPLFNBQVNhLEdBQXlCZixHQUN2QyxNQUFPLDh3QkFZUEEsRUFBV2xMLEtBQU0rTCxHQUFNQSxFQUFFbkYsVUFBVXVGLFdBQy9CLHVTQUNBLE9BR0pqQixFQUFXbEwsS0FBTStMLEdBQU1BLEVBQUVuRixVQUFVd0YsT0FBU0wsRUFBRW5GLFVBQVV5RixNQUNwRCx1RUFDQSxPQUdKbkIsRUFBV2xMLEtBQU0rTCxHQUFNQSxFQUFFbkYsVUFBVXlGLE1BQy9CLHNMQUlBLE9BR0QzUixXQUFXLFlBQWEsUUFDeEJBLFdBQVcsVUFBVyxRQUN0QkMsTUFDTCxDQ3RHT3hCLGVBQWVtVCxHQUFtQmpULEdBQ3ZDLE9BQU9aLEVBQU9DLDBCQUEwQixxQkFBc0JTLFVBQzVELElBQUkwTyxFQUFzQixDQUN4QjBFLEtBQU1sVCxFQUFPa0osT0FDYmlLLFFBQVMsMERBQ1RDLFFBQVMsQ0FBQyw4QkFFWixNQUFNeFMsRUFBV0wsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLGVBQzlDLElBQ0UsTUFBTVAsUUFBbUJHLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsUUFDbEQ2TixFQUFjNEUsS0FBS0MsTUFBTXBULEdBQy9Cc08sRUFBY3ZKLEVBQU1DLElBQUksQ0FBQ3NKLEVBQWFDLEVBQWFELEdBQWMsQ0FBRUksV0FBWXpFLEdBQ2pGLENBQUUsTUFDQSxDQUVGLE1BQU0vSixFQUFhaVQsS0FBS0UsVUFBVS9FLFNBQzVCak4sRUFBWWEsSUFBSSxJQUFNMUIsRUFBT0ssYUFBYUgsRUFBVVIsS0FFOUQsQ0NyQkEsTUFBTW9ULEdBQTBCLG1tQkEwQjFCQyxHQUEyQkQsR0FBd0J4UixRQUFRLGVBQWdCLGlCQUUxRWxDLGVBQWU0VCxHQUFtQjFULEdBQ3ZDLE9BQU9aLEVBQU9DLDBCQUEwQixxQkFBc0JTLFVBQzVELE1BQU1jLEVBQVdMLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxlQUN4Q08sRUFDSlgsRUFBRzBCLFdBQVduQixJQUFhUCxFQUFHc1QsYUFBYS9TLEVBQVUsUUFBUXVCLFNBQVMsaUJBQ2xFc1IsR0FDQUQsU0FDQWpTLEVBQVlhLElBQUksSUFBTTFCLEVBQU9LLGFBQWFILEVBQVVJLEtBRTlELENDM0NBLE1BQU00UyxHQUFvQiw4QkFDcEJDLEdBQXlCLHdDQUN6QkMsR0FBWSxzQkFFWkMsR0FBeUIsR0FBR0gsa0JBR2hDRSxPQUVJRSxHQUF5QixLQUM3QkosY0FHV0ssR0FBaUIsQ0FDNUJILGFBQ0FJLGdCQVpzQixrQkFhdEJILDBCQUNBQywwQkFDQSxvQ0FBTUcsQ0FBK0J2VCxHQUNuQyxJQUNFLElBQUlJLFFBQWdCWCxFQUFHUSxTQUFTQyxTQUFTRixFQUFVLFFBQ25ELE1BQU13VCxFQUFrQkMsR0FBZ0NyVCxHQUl4RCxPQUhJb1QsRUFBa0IsSUFDcEJwVCxFQUFVQSxFQUFRMEksTUFBTSxFQUFHMEssRUFBa0IsSUFHN0NwVCxFQUNHSyxXQUFXd1MsR0FBd0IsSUFDbkN4UyxXQUFXLDRCQUE2QixJQUN4Q0EsV0FBVyx1QkFBd0IsUUFDbkNDLE9BQVMsSUFFaEIsQ0FBRSxNQUNBLENBRUosRUFDQWdULGtCQUFBQSxDQUFtQnRULEdBQ2pCLE1BQU1zRyxFQUFRdEcsRUFBUXVULFFBQVFDLEtBQUtOLGlCQUNuQyxPQUFjLElBQVY1TSxFQUNLdEcsRUFDSjBJLE1BQU0sRUFBRzFJLEVBQVF1VCxRQUFRLEtBQU1qTixHQUFTLEdBQ3hDakcsV0FBV3dTLEdBQXdCLEdBQUdELGVBRXBDRyxFQUNULEVBQ0FVLGtCQUFBQSxDQUFtQnpULEdBQ2pCLE1BQU1vVCxFQUFrQkMsR0FBZ0NyVCxHQUN4RCxPQUFJb1QsRUFBa0IsRUFDYnBULEVBQVEwSSxNQUFNMEssRUFBa0IsR0FFbENKLEVBQ1QsRUFDQSwrQkFBTVUsQ0FBMEI5VCxHQUM5QixJQUVFLGFBRHNCUCxFQUFHUSxTQUFTQyxTQUFTRixFQUFVLFNBQ3RDdUIsU0FBUyxpQkFDMUIsQ0FBRSxNQUNBLE9BQU8sQ0FDVCxDQUNGLEdBR0YsU0FBU2tTLEdBQWdDclQsR0FDdkMsTUFBTXNHLEVBQVF0RyxFQUFRdVQsUUFBUVgsSUFDeEJlLEVBQVkzVCxFQUFRNFQsWUFBWWhCLElBQ3RDLE9BQU9lLEVBQVlyTixFQUFRcU4sR0FBWSxDQUN6QyxDQ25ETzdVLGVBQWUrVSxHQUFxQjdVLEdBQ3pDLE9BQU9aLEVBQU9DLDBCQUEwQix1QkFBd0JTLFVBQzlELE1BQU1jLEVBQVdMLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxpQkFDOUMsR0FBSVQsRUFBT0Msc0JBQXVCLENBQ2hDLE1BQU1lLFFBQWlCTixFQUFPQyxzQkFBc0JDLElBQWMsR0FJNURSLEVBSGtCNlQsR0FBZUssbUJBQW1CdFQsR0FaMUMsbUVBYVFpVCxHQUFlUSxtQkFBbUJ6VCxTQUdwRE8sRUFBWWEsSUFBSSxJQUFNMUIsRUFBT0ssYUFBYUgsRUFBVVIsR0FDNUQsWUFDUUMsRUFBR1EsU0FBU3FNLEdBQUd0TSxFQUFVLENBQUV1TSxPQUFPLEtBRzlDLENDL0JPLE1BQU0ySCxHQUFhLENBQ3hCQyxvQkFBcUIsQ0FDbkIsTUFDQSxNQUNBLEtBQ0EsTUFDQSxNQUNBLE1BQ0EsS0FDQSxNQUNBLE9BQ0EsUUFDQSxRQUNBLE1BQ0EsT0FDQSxNQUNBLE9BQ0EsS0FDQSxPQUNBLEtBQ0EsTUFDQSxNQUNBLE9BQ0EsTUFDQSxNQUNBL0osV0FDRmdLLG9CQUFxQixDQUFDLEtBQU0sU0FBVSxPQUFRLE1BQU1oSyxXQUNwRGlLLGFBQWMsQ0FBQyxNQUFNakssV0FDckJrSyxPQUFRLENBQUMsTUFBTyxNQUFPLEtBQU0sTUFBTyxNQUFPLEtBQU0sTUFBTyxPQUFPbEssV0FDL0RtSyxTQUFVLENBQ1IsTUFDQSxNQUNBLE9BQ0EsS0FDQSxNQUNBLE1BQ0EsTUFDQSxLQUNBLE1BQ0EsT0FDQSxRQUNBLFFBQ0EsTUFDQSxNQUNBLE9BQ0EsS0FDQSxPQUNBLE1BQ0EsT0FDQSxPQUNBbkssV0FFRm9LLE1BQU8sQ0FDTCxNQUNBLE1BQ0EsS0FDQSxNQUNBLE1BQ0EsTUFDQSxLQUNBLE1BQ0EsT0FDQSxRQUNBLFFBQ0EsTUFDQSxPQUNBLE1BQ0EsU0FDQSxRQUNBLE1BQ0EsT0FDQSxNQUNBLE9BQ0FwSyxZQ2pFRTVLLEdBQWEsMEhBUWpCaVYsR0FBbUJQLEdBQVdDLGtFQUk5Qk0sR0FBbUJQLEdBQVdFLGtFQUk5QkssR0FBbUJQLEdBQVdHLG9IQVF6Qm5WLGVBQWV3VixHQUFxQnRWLEdBQ3pDLE9BQU9aLEVBQU9DLDBCQUEwQix1QkFBd0JTLFVBQzlELE1BQU1jLEVBQVdMLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyx1QkFDeENjLEVBQVlhLElBQUksSUFBTTFCLEVBQU9LLGFBQWFILEVBQVVSLE1BRTlELENBRUEsU0FBU2lWLEdBQW1CUCxHQUMxQixPQUFPQSxFQUFXL04sT0FBUyxFQUFJLE9BQU8rTixFQUFXdFUsS0FBSyxTQUFXLE1BQU1zVSxFQUFXLEtBQ3BGLENDakNPaFYsZUFBZXlWLEdBQWlCdlYsR0FDckMsT0FBT1osRUFBT0MsMEJBQTBCLG1CQUFvQlMsVUFDMUQsTUFBTWMsRUFBV0wsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLHFCQUM5QyxHQUFJVCxFQUFPa08sWUFDSDNNLEVBQVlhLElBQUksSUFBTS9CLEVBQUdRLFNBQVNxTSxHQUFHdE0sRUFBVSxDQUFFdU0sT0FBTyxVQUloRSxHQUFLbk4sRUFBT3dWLFdBQVosQ0FFQSxJQUVFLFdBRHlCblYsRUFBR1EsU0FBU0MsU0FBU0YsRUFBVSxTQUN4Q3VCLFNBQVMsc0JBQXVCLE1BQ2xELENBQUUsTUFDQSxPQUdJWixFQUFZYSxJQUFJLElBQU0xQixFQUFPSyxhQUFhSCxFQUFVLDRCQUE0QlosRUFBT3dWLGdCQVRyRSxHQVc1QixDQ1pBLE1BQU0vUyxHQUFnQixDQUNwQmdULFVBQVUsRUFDVkMsWUFBYSxDQUNYQyxTQUFTLEVBQ1RDLDJCQUE0QixTQUM1QkMscUJBQXFCLEVBQ3JCQyxvQkFBcUIsQ0FDbkJDLE1BQU0sRUFDTkMsU0FBUyxFQUNUTixhQUFhLElBR2pCTyxnQkFBaUIsQ0FBQyxxQkFHYm5XLGVBQWVvVyxHQUFxQmxXLEVBQXVCNlIsR0FDaEUsT0FBT3pTLEVBQU9DLDBCQUEwQix1QkFBd0JTLFVBQzlELElBQUtFLEVBQU9rSixPQUFRLE9BRXBCLE1BQU16SSxFQUFVRixFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsV0FDdkMwVixFQUFpQjVWLEVBQUtxQixRQUFRbkIsRUFBUyxjQUN2QzJWLEVBQXFCN1YsRUFBS3FCLFFBQVFuQixFQUFTLGlCQUMzQ3FSLEVBQWtCdlIsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLG1CQUVyRCxJQUFJNFYsRUFBb0JySSxFQUFVdkwsSUFDbEMsSUFDRSxNQUFNdkMsUUFBbUJHLEVBQUdRLFNBQVNDLFNBQVNxVixFQUFnQixRQUN4REcsRUFBWTVILEVBQUtDLEtBQUt6TyxHQUM1Qm1XLEVBQVlwUixFQUFNQyxJQUFJLENBQUNtUixFQUFXQyxFQUFXRCxHQUFZLENBQUV6SCxXQUFZekUsR0FDekUsQ0FBRSxNQUNBLENBR0YsTUFBTW9NLEVBQWM3SCxFQUFLNkIsS0FBSzhGLEVBQVcsQ0FDdkM3RixXQUFXLEVBQ1hDLGNBQWMsRUFDZEMsT0FBUSxDQUNOLFNBQVUsV0FJUnFCLFFBQXFCclIsRUFBT0Msc0JBQXNCbVIsR0FDbEQwRSxFQUFvQix1Q0FBdUM1RCxHQUF5QmYsS0FDeEZFLEVBQWUsT0FBT0EsRUFBYTBFLFlBQWMsS0FHN0M1VixFQUFXLENBQUNVLEVBQVlhLElBQUksSUFBTTFCLEVBQU9LLGFBQWFvVixFQUFnQkksS0FDdkVsVyxFQUFHMEIsV0FBV3FVLElBQ2pCdlYsRUFBUytKLEtBQUtySixFQUFZYSxJQUFJLElBQU0xQixFQUFPSyxhQUFhcVYsRUFBb0JJLFdBRXhFaE8sUUFBUXRELElBQUlyRSxJQUV0QixDQzdET2YsZUFBZTRXLEdBQXFCMVcsR0FDekMsT0FBT1osRUFBT0MsMEJBQTBCLHlCQUEwQlMsVUFDaEUsSUFBS0UsRUFBT2tKLE9BQVEsT0FFcEIsTUFBTXpJLEVBQVVGLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxXQUN2Q0csRUFBV0wsRUFBS3FCLFFBQVFuQixFQUFTLHVCQUNqQ0osRUFBR1EsU0FBU3FNLEdBQUd0TSxFQUFVLENBQUV1TSxPQUFPLEtBRTVDLENDTEEsTUFBTS9NLEdBQWEsdUVBS2pCLElBQUkwVSxHQUFXQyx1QkFBd0JELEdBQVdFLHVCQUF3QkYsR0FBV0csY0FDcEZ2VCxJQUFLQyxHQUFRLEtBQUtBLGlCQUNsQm5CLEtBQUssNkNBS0RWLGVBQWU2VyxHQUFzQjNXLEdBQzFDLE9BQU9aLEVBQU9DLDBCQUEwQix3QkFBeUJTLFVBQy9ELE1BQU1jLEVBQVdMLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyx3QkFDeENjLEVBQVlhLElBQUksSUFBTTFCLEVBQU9LLGFBQWFILEVBQVVSLE1BRTlELENDZkEsTUFBTXdXLEdBQWUsQ0FBQyxVQUFXLFFBQVMsUUFBUyxZQUFhLG1CQUFvQixRQUFTLE1BQU8sUUFvQjdGOVcsZUFBZStXLEdBQWtCN1csRUFBdUI2TSxHQUM3RCxPQUFPek4sRUFBT0MsMEJBQTBCLG9CQUFxQlMsVUFDM0QsTUFBTWMsRUFBV0wsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLGNBQ3hDTyxRQUFpQk4sRUFBT0Msc0JBQXNCQyxJQUFjLEdBQ2xFLElBQUlrVyxFQUFrQjdDLEdBQWVLLG1CQUFtQnRULEdBdEJ0Qyw2TkF1QmxCLE1BQU0rVixFQUFrQjlDLEdBQWVRLG1CQUFtQnpULEdBRXBEZ1csRUFBUSxJQUFJSixJQUNkNVcsRUFBT2lYLG9CQUNURCxFQUFNcE0sS0FBSyxRQUVUNUssRUFBT2tYLG1CQUNURixFQUFNcE0sS0FBSyxNQUNYa00sR0FBbUIsR0FBR3ZXLEVBQUtvTixTQUFTM04sRUFBT1MsY0FHekNULEVBQU9tWCx3QkFDVEgsRUFBTXBNLEtBQUssUUFFVDVLLEVBQU9vWCxvQkFDVEosRUFBTXBNLEtBQUssU0FDWGtNLEdBQW1CLGtDQUdqQjlXLEVBQU9xWCx5QkFDVEwsRUFBTXBNLEtBQUssVUFBVyxnQkFBaUIsUUFDdkNrTSxHQUFtQixxR0FNakI5VyxFQUFPc1gsMEJBQ1RSLEdBQW1CLDhCQUtqQjlXLEVBQU91WCx3QkFDVFAsRUFBTXBNLEtBQUssVUFDWGtNLEdBQW1CLFlBSWpCOVcsRUFBT3VOLFVBQVVpSyxRQUNuQlYsR0FBbUIsdUJBSWpCOVcsRUFBT3VOLFVBQVV5RixNQUNuQmdFLEVBQU1wTSxLQUFLLFdBRVRpQyxFQUFXVSxVQUFVa0ssVUFBWXpYLEVBQU91TixVQUFVa0ssV0FDcERULEVBQU1wTSxLQUFLLFlBRVQ1SyxFQUFPdU4sVUFBVW1LLFNBQ25CWixHQUFtQixnQkFHakI5VyxFQUFPdU4sVUFBVW9LLGlCQUNuQmIsR0FBbUIsMERBS2pCakssRUFBV1UsVUFBVXFLLGFBQWU1WCxFQUFPdU4sVUFBVXFLLGVBQ3ZEWixFQUFNcE0sS0FBSyxlQUNYa00sR0FBbUIsd0RBSWpCOVcsRUFBT3VOLFVBQVVzSyxXQUNuQmIsRUFBTXBNLEtBQUssZUFFVDVLLEVBQU91TixVQUFVdUssYUFDbkJoQixHQUFtQixxQkFJckIsSUFBSWlCLEVBQVksR0FDaEIsSUFBSyxNQUFNelksS0FBUTBYLEVBQU8sQ0FDeEIsSUFBSWhXLFFBQWlCZ1gsR0FBVTFZLElBQVUsR0FDekMsSUFBSzBCLEVBQVMsQ0FDWixNQUFNbUMsRUFBTSxtREFBbUQ3RCxJQUN6RDJZLFFBQWlCQyxNQUFNL1UsR0FDdkJnVixRQUFxQkYsRUFBU0csT0FDcEMsSUFBS0gsRUFBU0ksSUFBTUYsRUFBYWhXLFNBQVMsd0JBQTBCZ1csRUFBYWhXLFNBQVMsV0FFeEYsWUFEQTNDLFFBQVFFLE1BQU0sbUJBQW1CeUQsS0FHbkNuQyxFQUFVbVgsRUFBYTdXLGFBQ2pCQyxFQUFZYSxJQUFJLElBQU1rVyxHQUFXaFosRUFBTTBCLElBQ3pDL0IsRUFBUUMsV0FDVk0sUUFBUUMsS0FBSyxXQUFXMEQsSUFFNUIsQ0FDSTRVLElBQVdBLEdBQWEsTUFDNUJBLEdBQWEvVyxFQUFVLElBQ3pCLE9BQ1lpVCxHQUFlUywwQkFBMEI5VCxLQUNuRG1YLEVBQVlBLEVBQVUvVixRQUFRLGVBQWdCLGtCQUFrQkEsUUFBUSxXQUFZLFlBRWxGaEMsRUFBT29YLG1CQUFxQnBYLEVBQU9xWCwwQkFDckNVLEVBQVlBLEVBQ1QxVyxXQUFXLHlCQUEwQixtQkFDckNBLFdBQVcsNEJBQTZCLHNCQUN4Q0EsV0FBVyxtQ0FBb0MsNkJBQy9DQSxXQUFXLDJCQUE0QixxQkFDdkNBLFdBQVcscUJBQXNCLGVBQ2pDQSxXQUFXLHVCQUF3QixpQkFDbkNBLFdBQVcsY0FBZSxTQUMxQkEsV0FBVyxjQUFlLFNBQ3pCckIsRUFBT3FYLHlCQUNUVSxFQUFZQSxFQUFVMVcsV0FBVyx5QkFBMEIseUJBRy9EMFcsRUFBWUEsRUFBVTFXLFdBQVcsZUFBZ0IsWUFDN0N3TCxFQUFXVSxVQUFVcUssYUFBZTVYLEVBQU91TixVQUFVcUssYUFBZTVYLEVBQU9xWCwwQkFDN0VVLEVBQVlBLEVBQVUxVyxXQUFXLGtCQUFtQixtQkFFdEQsTUFBTWpCLEVBQWEwVyxFQUFrQixLQUFPaUIsRUFBWWhCLFFBQ2xEeFYsRUFBWWEsSUFBSSxJQUFNMUIsRUFBT0ssYUFBYUgsRUFBVVIsS0FFOUQsQ0FFQSxNQUFNSyxHQUFVRixFQUFLQyxLQUFLK1gsRUFBR0MsVUFBVyxTQUFVLE9BQVEsYUFFMUQxWSxlQUFld1ksR0FBV2haLEVBQWMwQixTQUNoQ1gsRUFBR1EsU0FBU0ksTUFBTVIsR0FBUyxDQUFFVSxXQUFXLFVBQ3hDZCxFQUFHUSxTQUFTUCxVQUFVQyxFQUFLQyxLQUFLQyxHQUFTbkIsR0FBTzBCLEVBQ3hELENBRUFsQixlQUFla1ksR0FBVTFZLEdBQ3ZCLElBQ0UsTUFBTW1aLFFBQWFwWSxFQUFHUSxTQUFTNFgsS0FBS2xZLEVBQUtDLEtBQUtDLEdBQVNuQixJQUN2RCxHQUFJb1osS0FBS0MsTUFBUUYsRUFBS0csUUFBVSxNQUM5QixPQUVGLGFBQWF2WSxFQUFHUSxTQUFTQyxTQUFTUCxFQUFLQyxLQUFLQyxHQUFTbkIsR0FBTyxPQUM5RCxDQUFFLE1BQ0EsQ0FFSixDQ3BLQSxTQUFTdVosR0FBa0JDLEVBQWdCQyxFQUFjelosRUFBYzBaLEdBQ3JFLE1BQU8sNkVBQytCRCwwT0FJSUMsZ0dBRVQxWixPQUFVMFosd1BBTVBGLG9SQVF0QyxDQUVBLE1BQU1HLEdBQWtCLDRHQUd0Qm5FLEdBQVdLLFNBQVN6VCxJQUFLQyxHQUFRa1gsR0FBa0IsT0FBUSw2Q0FBOEMsV0FBWWxYLElBQU1uQixLQUFLLG9DQUs1SDBZLEdBQWUsNEdBR25CcEUsR0FBV0ssU0FBU3pULElBQUtDLEdBQVFrWCxHQUFrQixNQUFPLHlGQUEwRixRQUFTbFgsSUFBTW5CLEtBQUssb0NBS25LVixlQUFlcVosR0FBcUJuWixHQUN6QyxPQUFPWixFQUFPQywwQkFBMEIsdUJBQXdCUyxVQUM5RCxNQUFNVyxFQUFVRixFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsU0FDN0MsR0FBSUosRUFBRzBCLFdBQVd0QixHQUFVLENBQzFCLE1BQU1HLEVBQVdMLEVBQUtxQixRQUFRbkIsRUFBUywwQkFDaENULEVBQU9vWix1QkFDZHBaLEVBQU9xWixpQ0FDUHJaLEVBQU9zWix1QkFDUHRaLEVBQU91WixpQ0FDTnZaLEVBQU9tWCx5QkFDTG5YLEVBQU9xWCx5QkFDUHJYLEVBQU9pWCxxQkFDUGpYLEVBQU9rWCxtQkFDUGxYLEVBQU9vWCxrQkFDTjdWLEVBQVlhLElBQUksSUFBTTFCLEVBQU9LLGFBQWFILEVBQVVaLEVBQU9rTyxNQUFRZ0wsR0FBZUQsS0FDbEYxWCxFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTcU0sR0FBR3RNLEVBQVUsQ0FBRXVNLE9BQU8sS0FDOUQsR0FFSixDQ2hFTyxTQUFTcU0sR0FBVXRXLEVBQWlCNlYsRUFBZ0I1USxFQUFhc1IsRUFBUSxHQUM5RSxFQUFHLENBQ0QsTUFBT0MsRUFBUUMsRUFBUzFhLEdBQVcyYSxHQUFpQjFXLEVBQVM2VixFQUFNNVEsR0FHbkUsR0FBbUIsSUFEUDBSLEVBQWNMLFVBQVVFLEVBQVFDLEVBQVMxYSxHQUM3QzZhLE9BQWMsS0FDeEIsU0FBV0wsR0FBUyxFQUN0QixDQUVPLFNBQVNNLEdBQXlCN1csRUFBaUI2VixFQUFnQjVRLEdBQ3hFLE1BQU91UixFQUFRQyxFQUFTMWEsR0FBVzJhLEdBQWlCMVcsRUFBUzZWLEVBQU01USxHQUNuRWxKLEVBQVErYSxNQUFRLE9BQ2hCLE1BQU1DLEVBQU9KLEVBQWNMLFVBQVVFLEVBQVFDLEVBQVMxYSxHQUVoRHNFLEVBQVMwVyxFQUFLMVcsUUFBVSxHQUN4QjdELEVBQTBCLGlCQUFYNkQsRUFBc0JBLEVBQU9qQyxPQUFTaUMsRUFBTzJXLFdBQVc1WSxPQUN6RTJZLEVBQUt2YSxNQUNQRixRQUFRRSxNQUFNLEdBQUdnYSxNQUFXQyxFQUFRalksSUFBS3lZLEdBQU0sSUFBSUEsTUFBTTNaLEtBQUssdUJBQXVCeVosRUFBS3ZhLE1BQU0wYSxXQUN2RjFhLEdBQ1RGLFFBQVFFLE1BQ04sR0FBR2dhLE1BQVdDLEVBQVFqWSxJQUFLeVksR0FBTSxJQUFJQSxNQUFNM1osS0FBSyxvREFBb0RkLEtBSXhHLE1BQU00RCxFQUFTMlcsRUFBSzNXLFFBQVUsR0FDOUIsTUFBeUIsaUJBQVhBLEVBQXNCQSxFQUFPaEMsT0FBU2dDLEVBQU80VyxXQUFXNVksTUFDeEUsQ0FFTyxTQUFTc1ksR0FBaUIxVyxFQUFpQjZWLEVBQWdCNVEsR0FDaEUsTUFBTTNFLEVBQU0sSUFBSzZXLFFBQVE3VyxLQU16QixPQUpJQSxFQUFJOFcsTUFBUTlXLEVBQUkrVyxtQkFDbEIvVyxFQUFJOFcsS0FBTzlXLEVBQUk4VyxLQUFLdFksUUFBUSxHQUFHd0IsRUFBSStXLG9CQUFxQixLQUduRCxDQUNMclgsRUFDQTZWLEVBQ0EsQ0FDRTVRLE1BQ0EzRSxNQUNBZ1gsU0FBVSxPQUNWQyxPQUFPLEVBQ1BULE1BQU8sV0FHYixDQy9DTyxTQUFTVSxHQUFvQkMsRUFBc0JDLEdBQ3hELElBQ0UsTUFBTUMsRUFBVSxrQkFBa0JGLEtBQWdCQyxRQUU1Q0UsRUFEU2YsR0FBeUIsTUFBTyxDQUFDLFlBQWFjLEVBQVMsUUFBU1IsUUFBUWxTLE9BQzdEZixNQUFNLE9BQU8sR0FDdkMsSUFBSzBULEVBQ0gsTUFBTSxJQUFJbmIsTUFBTSx3QkFBd0JnYixLQUFnQkMsS0FFMUQsT0FBT3BTLFFBQVE1RyxRQUFRa1osRUFDekIsQ0FBRSxNQUFPcGIsR0FDUCxPQUFPOEksUUFBUXVTLE9BQU8sSUFBSXBiLE1BQU0sK0JBQStCZ2IsS0FBZ0JDLE1BQVMvYSxPQUFPSCxNQUNqRyxDQUNGLENDWk8sTUFBTXNiLEdBQWEsQ0FDeEJDLGlCQUFpQmpiLEdBQ1JBLEVBQU9rYixvQkFBc0IsK0NBQWlELElDT2xGLE1BQU1DLEdBQWEsSUFUMUIsTUFDRUMsYUFBQUEsQ0FBY0MsR0FDWixNQUFNQyxFQUFxQkQsRUFBY2pVLE1BQU0sS0FBS0MsT0FDOUMyUCxFQUFRc0UsR0FBb0JsVSxNQUFNLEtBR3hDLE1BQU8sQ0FGSzRQLEdBQU8zUCxJQUFHLElBQU8sR0FDaEIyUCxHQUFPM1AsSUFBRyxJQUFLckYsUUFBUSxRQUFTLEtBQU8sR0FFdEQsR0FJSXVaLEdBQWUsSUFBSUMsSUFFbEIsU0FBU0MsR0FBV0MsR0FDekIsTUFBTTlULEVBQU04VCxHQUFTLEdBQ2ZDLEVBQVNKLEdBQWFLLElBQUloVSxHQUNoQyxHQUFJK1QsRUFBUSxPQUFPQSxFQUVuQixNQUFNRSxFQUFVLElBQUlDLEVBQVEsQ0FDMUJDLEtBQU1DLEdBQWVOLFNBQVV0VixJQUdqQyxPQURBbVYsR0FBYVUsSUFBSXJVLEVBQUtpVSxHQUNmQSxDQUNULENBRU8sU0FBU0ssR0FBZVIsR0FDN0IsUUFBU00sR0FBZU4sRUFDMUIsQ0FFQSxTQUFTTSxHQUFlTixHQUN0QixNQUFjLGdCQUFWQSxFQUNLckIsUUFBUTdXLElBQUkyWSwyQkFFUCxtQkFBVlQsRUFDS3JCLFFBQVE3VyxJQUFJNFksOEJBR25CL0IsUUFBUTdXLElBQUkyWSw0QkFDWjlCLFFBQVE3VyxJQUFJNFksK0JBQ1ovQixRQUFRN1csSUFBSWtNLFVBQ1oySyxRQUFRN1csSUFBSTZZLFlBRWhCLENDeEJBLE1BQU1DLEdBQWUsQ0FDbkIsYUFDQSxTQUNBLCtCQUNBLHlCQUNBLHlCQUNBLG1DQUNBLHNDQUNBLHdCQUNBLCtCQUNBLFdBR0lDLEdBQWUsSUFBSUQsR0FBYyxvQkFBcUIscUNBRXRERSxHQUFrQixDQUFDLHNCQUF1Qiw0QkFBNkIsZ0NBRXZFQyxHQUFvRCxDQUN4RCxnQ0FBaUMsQ0FBQyxtQ0FBb0NILElBQ3RFLHNDQUF1QyxDQUFDLHlDQUEwQ0EsTUFBaUJFLElBQ25HLGdDQUFpQyxDQUFDLG1DQUFvQ0QsSUFDdEUsc0NBQXVDLENBQUMseUNBQTBDQSxNQUFpQkMsSUFDbkcsa0NBQW1DLENBQ2pDLGtDQUNBLDhCQUNHRCxNQUNBQyxLQUlBMWMsZUFBZTRjLEdBQ3BCMWMsRUFDQTZNLEVBQ0E4UCxHQUVBLE9BQU92ZCxFQUFPQywwQkFBMEIsc0JBQXVCUyxnQkFLakVBLGVBQW9CRSxFQUF1QjZNLEVBQTJCOFAsR0FDcEUsTUFBTS9iLEVBQVdMLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxnQkFDeENtYyxRQUFpQnZjLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsUUFDaERpYyxFQUFVeEosS0FBS0MsTUFBTXNKLEdBQzNCQyxFQUFReFgsUUFBVXdYLEVBQVF4WCxTQUFXLENBQUEsRUFDckN3WCxFQUFROVMsYUFBZThTLEVBQVE5UyxjQUFnQixDQUFBLEVBQy9DOFMsRUFBUTdTLGdCQUFrQjZTLEVBQVE3UyxpQkFBbUIsQ0FBQSxFQUNyRDZTLEVBQVFDLGlCQUFtQkQsRUFBUUMsa0JBQW9CLENBQUEsRUFDdkQsTUFBTTdPLEVBQWlCak8sRUFBT2tPLE1BQVEsTUFBUSxhQWdVaERwTyxlQUNFK2MsR0FFdUIsb0JBQW5CQSxFQUFRRSxTQUNWRixFQUFRRSxPQUFTLDJCQUVaRixFQUFReFgsUUFBUSw0QkFDaEJ3WCxFQUFReFgsUUFBUSxnQ0FDaEJ3WCxFQUFReFgsUUFBUSx5QkFDaEJ3WCxFQUFReFgsUUFBUSw2QkFDaEJ3WCxFQUFReFgsUUFBUSw0QkFDaEJ3WCxFQUFROVMsYUFBYWlULGFBQ3JCSCxFQUFRN1MsZ0JBQWdCLHFDQUN4QjZTLEVBQVE3UyxnQkFBZ0IsMkNBQ3hCNlMsRUFBUTdTLGdCQUFnQix1Q0FDeEI2UyxFQUFRN1MsZ0JBQWdCLGdDQUN4QjZTLEVBQVE3UyxnQkFBZ0Isc0NBQ3hCNlMsRUFBUTdTLGdCQUFnQixpQ0FDeEI2UyxFQUFRN1MsZ0JBQWdCaVQsYUFFeEJKLEVBQVE3UyxnQkFBZ0JrVCxhQUN4QkwsRUFBUXhYLFFBQVEseUJBQ2hCd1gsRUFBUXhYLFFBQVEseUJBQ2hCd1gsRUFBUXhYLFFBQVEsd0JBQ2hCd1gsRUFBUXhYLFFBQVEsd0JBQ2hCd1gsRUFBUXhYLFFBQVE4UCxnQkFDaEIwSCxFQUFReFgsUUFBUSxtQkFDakI5RCxFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTcU0sR0FBRyxhQUFjLENBQUVDLE9BQU8sWUFHM0QwUCxFQUFRN1MsZ0JBQWdCLDJDQUN4QjZTLEVBQVE3UyxnQkFBZ0Isb0NBQ3hCNlMsRUFBUTdTLGdCQUFnQix1QkFDakMsQ0EvVlFtVCxDQUFzQk4sR0FFNUIsSUFBSyxNQUFPalYsRUFBS3RGLEtBQVVvRixPQUFPQyxRQUFRa1YsRUFBUXhYLFNBRTNDL0MsRUFBTUgsU0FBUyxlQUNsQjBhLEVBQVF4WCxRQUFRdUMsR0FBT3RGLEVBQU1OLFFBQVEsZUFBZ0IsSUFBSUEsUUFBUSx5QkFBMEIsS0FJL0Y2YSxFQUFReFgsUUFBVUosRUFBTTRYLEVBQVF4WCxRQUFTK1gsR0FBZ0JwZCxFQUFRNmMsRUFBUXhYLFVBRXJFLGlCQUFrQndYLEVBQVF4WCxVQUN4QixhQUFjd1gsRUFBUXhYLFVBQ3hCd1gsRUFBUXhYLFFBQVEsZ0JBQWtCLEdBQUc0SSw2QkFBMEM0TyxFQUFReFgsUUFBUSxtQkFFakd3WCxFQUFReFgsUUFBUSxnQkFBa0IsR0FBRzRJLDRCQUF5QzRPLEVBQVF4WCxRQUFRLG1CQUc1RnJGLEVBQU9rTyxhQUNGMk8sRUFBUXhYLFFBQVFnWSxTQUV2QlIsRUFBUXhYLFFBQVFnWSxVQUFZUixFQUFReFgsUUFBUWdZLFVBQVksVUFtYTVEdmQsZUFBc0NXLEdBQ3BDLE1BQU1HLEVBQVdMLEVBQUtxQixRQUFRbkIsRUFBUyxtQkFDakM2YyxRQUF3QmpkLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsUUFDdkQwRyxFQUFRZ1csRUFBZ0IvSSxRQUFRTixHQUFlQyxpQkFDckQsSUFBYyxJQUFWNU0sRUFBYyxNQUFPLEdBRXpCLE1BQU1pVyxFQUFrQkQsRUFBZ0I1VCxNQUFNLEVBQUdwQyxHQVNqRCxNQUFPLEdBUk9pVyxFQUNYblcsTUFBTSxNQUNOMUYsSUFBSzhiLElBQ0osTUFBTUMsRUFBVUQsRUFBS2xjLE9BQ3JCLE9BQU9tYyxFQUFRN1QsU0FBUyxLQUFPNlQsRUFBUS9ULE1BQU0sR0FBRyxHQUFNK1QsSUFFdkRuUSxPQUFRb1EsR0FBTUEsSUFBTUEsRUFBRTdPLFdBQVcsT0FBUzZPLEVBQUV2YixTQUFTLE1BRXhDVCxJQUFLOGIsR0FBUyxTQUFTQSxTQUFZaGQsS0FBSyxhQUMxRCxDQW5ieUVtZCxDQUF1QjNkLEVBQU9TLFNBR3JHLElBQUssTUFBT21ILEVBQUt0RixLQUFVb0YsT0FBT0MsUUFBUWtWLEVBQVF4WCxTQUMzQy9DLEdBQU9ILFNBQVMsNkJBRW5CRyxFQUFNSCxTQUFTLFVBQ2ZHLEVBQU1ILFNBQVMsZ0JBQ2ZHLEVBQU1ILFNBQVMsWUFDZkcsRUFBTUgsU0FBUyxnQkFHakIwYSxFQUFReFgsUUFBUXVDLEdBQU90RixFQUFNTixRQUFRLDBCQUEyQixtQ0FHbEUsSUFBSStILEVBQXlCLEdBQ3pCQyxFQUFrQixDQUFDLFdBQVkscUJBQ25DLE1BQU00VCxFQUFrQyxHQUdyQ3ZkLEVBQUcwQixXQUFXeEIsRUFBS0MsS0FBS3FNLEVBQVdwTSxRQUFTLHNCQUM1Q0osRUFBRzBCLFdBQVd4QixFQUFLQyxLQUFLUixFQUFPUyxRQUFTLHVCQUV6Q29jLEVBQVExSCxTQUFXLCtCQUNuQm5MLEVBQWdCWSxLQUFLLHVCQUF3QixpQ0FHM0M1SyxFQUFPa08sYUFDRjJPLEVBQVE3UyxnQkFBZ0IsZUFFL0JBLEVBQWdCWSxLQUFLLGVBR3ZCLEdBQUk1SyxFQUFPa0osT0FBUSxDQXNCakIsVUFyQk8yVCxFQUFRN1MsZ0JBQWdCNlQsYUFDeEJoQixFQUFRN1MsZ0JBQWdCa1QsYUFDeEJMLEVBQVF4WCxRQUFReVksbUJBQ2hCakIsRUFBUXhYLFFBQVEwWSxtQkFDaEJsQixFQUFReFgsUUFBUTJZLHNCQUNoQm5CLEVBQVF4WCxRQUFRNFksZUFDaEJwQixFQUFReFgsUUFBUTZZLFNBQ3ZCckIsRUFBUXhYLFFBQVE4WSxRQUFVLDJCQUMxQm5VLEVBQWdCWSxLQUFLLFlBRWpCNUssRUFBT3VOLFVBQVVDLGtCQUVoQnFQLEVBQVE3UyxnQkFBZ0IscUJBQ3hCNlMsRUFBUTdTLGdCQUFnQiwyQkFDeEI2UyxFQUFRN1MsZ0JBQWdCLGlDQUV6QkEsRUFBZ0JZLEtBQUssb0JBRXZCaVMsRUFBUXVCLFFBQVUsK0JBR2hCcGUsRUFBT3VOLFVBQVVvSyxlQUFnQixDQUVka0YsRUFBUTlTLGFBQWFzVSxXQUFheEIsRUFBUTdTLGdCQUFnQnFVLFdBRXpEeEIsRUFBUTlTLGFBQWEsc0JBQ3pDQyxFQUFnQlksS0FBSywyQkFDZGlTLEVBQVE5UyxhQUFhLDRCQUV2QjhTLEVBQVE5UyxhQUFhdVUsa0JBQ3JCekIsRUFBUTdTLGdCQUFnQnNVLFVBQ2pDLENBRUl0ZSxFQUFPbUosMkJBRVQwVCxFQUFRMEIsV0FBYUMsTUFBTUMsUUFBUTVCLEVBQVEwQixZQUN2Q3RaLEVBQU1DLElBQUksQ0FBQzJYLEVBQVEwQixXQUFZLENBQUMsZUFBZ0IsQ0FDOUMzUCxXQUFZdEUsSUFFZCxDQUFDLGNBQ0lrVSxNQUFNQyxRQUFRNUIsRUFBUTBCLGNBQy9CMUIsRUFBUTBCLFdBQWExQixFQUFRMEIsV0FBV2pSLE9BQ3JDb1IsR0FDQzFXLEVBQUcyVyxTQUFTRCxFQUFXLENBQ3JCeFcsS0FBSyxFQUNMQyxJQUFLbkksRUFBT1MsUUFDWjJILE9BQVFQLElBQ1BkLE9BQVMsR0FFa0IsSUFBOUI4VixFQUFRMEIsV0FBV3hYLGVBQ2Q4VixFQUFRMEIsV0FHckIsQ0FFQSxHQUFJdmUsRUFBT3VOLFVBQVVxUixJQUFNNWUsRUFBT2tPLE1BQU8sQ0FDbkMyTyxFQUFROVMsYUFBYSxtQkFDdkJBLEVBQWFhLEtBQUssbUJBRWxCWixFQUFnQlksS0FBSyxtQkFFdkIsSUFBSyxNQUFPaEQsRUFBS3RGLEtBQVVvRixPQUFPQyxRQUFRa1YsRUFBUXhYLFNBQ2hEd1gsRUFBUXhYLFFBQVF1QyxHQUFPdEYsRUFBTU4sUUFBUSxVQUFXLFlBRXBELEVBR0VoQyxFQUFPb1osdUJBQ1BwWixFQUFPcVosaUNBQ1ByWixFQUFPc1osdUJBQ1B0WixFQUFPdVosbUNBRUh2WixFQUFPa08sT0FDVGxFLEVBQWdCWSxLQUFLLGlCQUFrQixvQ0FDaENpUyxFQUFRN1MsZ0JBQWdCa0wsY0FDeEIySCxFQUFRN1MsZ0JBQWdCNlUsa0JBQ3hCaEMsRUFBUTdTLGdCQUFnQixzQkFFL0JBLEVBQWdCWSxLQUFLLFNBQVUsZ0JBS2pDNUssRUFBT29aLHVCQUNQcFosRUFBT3FaLGlDQUNQclosRUFBT3NaLHVCQUNQdFosRUFBT3VaLGtDQUVQdlAsRUFBZ0JZLFFDek1iLFNBQXFDNUssR0FDMUMsT0FBSUEsRUFBT2tPLE1BQ0YsQ0FBQyxpQkFFTmxPLEVBQU91TixVQUFVcUssWUFDWixDQUFDLDBCQUVILENBQUMscUJBQXNCLG9CQUNoQyxDRGlNNEJrSCxDQUE0QjllLEtBR2xEQSxFQUFPc1osdUJBQXlCdFosRUFBT3VaLG1DQUN6Q3ZQLEVBQWdCWSxLQUFLLGNBQ2pCNUssRUFBT2tPLE9BQ1RsRSxFQUFnQlksS0FBSyxlQUlyQjVLLEVBQU93VixZQUNUeEwsRUFBZ0JZLFFBQVE2UixHQUFXemMsRUFBT3dWLGFBR3hDeFYsRUFBTytlLHVCQUNUaFYsRUFBZUEsRUFBYXVELE9BQVEwUixJQUFTQSxFQUFJN2MsU0FBUyxrQkFDMUQ2SCxFQUFrQkEsRUFBZ0JzRCxPQUFRMFIsSUFBU0EsRUFBSTdjLFNBQVMsbUJBRzdEMGEsRUFBUXZkLE9BQ1h1ZCxFQUFRdmQsS0FBT2lCLEVBQUtvTixTQUFTM04sRUFBT1MsVUFHbENULEVBQU9tSiw2QkFDVDBULEVBQVFvQyxTQUFVLEdBRWZwQyxFQUFRcUMsVUFDWHJDLEVBQVFxQyxRQUFVLGVBRWZyQyxFQUFRb0MsU0FBK0IsZUFBcEJwQyxFQUFRcUMsU0FBNEJyUyxFQUFXa0IsZUFDckU4TyxFQUFRc0MsZ0JBQWtCLENBQUEsRUFDMUJ0QyxFQUFRc0MsY0FBY0MsU0FBVyxVQUVuQyxNQUFPMUQsR0FBU1AsR0FBV0MsY0FBY3BiLEVBQU8rTSxZQUFjLElBQ2hELGdCQUFWMk8sR0FBcUMsbUJBQVZBLElBQzdCbUIsRUFBUUUsT0FBUyxvQkFFZC9jLEVBQU9rSixTQUFVMlQsRUFBUW9DLFNBQVlwQyxFQUFRd0MsT0FFaER4QyxFQUFRd0MsS0FBTyxTQU1qQixVQUZPeEMsRUFBUXlDLGNBQWMsY0FFeEJ0ZixFQUFPbUosMkJBQTRCLENBQ3RDLElBQUtuSixFQUFPa08sTUFDVixHQUFLbE8sRUFBT29aLHVCQUEwQnBaLEVBQU9zWixzQkFTM0N1RCxFQUFReFgsUUFBUSxhQUFld1gsRUFBUXhYLFFBQVEsYUFBZSxJQUFNMlYsR0FBV0MsaUJBQWlCamIsT0FUOUIsUUFDM0Q2YyxFQUFReFgsUUFBUWthLFlBQ2hCMUMsRUFBUXhYLFFBQVEsWUFDdkIsSUFBSyxNQUFNbWEsSUFBYyxDQUFDLFVBQVcsZ0JBQWlCLENBQ3BELE1BQU1DLEVBQVM1QyxFQUFReFgsUUFBUW1hLEdBQzFCQyxJQUNMNUMsRUFBUXhYLFFBQVFtYSxHQUFjQyxFQUFPemQsUUFBUSxtQ0FBb0MsSUFDbkYsQ0FDRixDQUtGLEdBQUloQyxFQUFPcVgsdUJBQXdCLENBQ2pDd0YsRUFBUXhYLFFBQVFrYSxLQUFPLGtCQUN2QjFDLEVBQVF4WCxRQUFRLFlBQWMsWUFDOUIsTUFBTXFhLEVBQU8sQ0FBQyxNQUFPLE9BQVEsZUFBZXBTLE9BQVFxUyxHQUFRdGYsRUFBRzBCLFdBQVd4QixFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVNrZixLQUNuR0QsRUFBSzNZLE9BQVMsSUFDaEI4VixFQUFReFgsUUFBUSxlQUFpQixzQkFBc0JxYSxFQUFLbGYsS0FDMUQsb0hBRUZxYyxFQUFReFgsUUFBUXVhLFFBQVUvQyxFQUFReFgsUUFBUXVhLFFBQVUsSUFBTSx1QkFFOUQsQ0FFQSxHQUFJNWYsRUFBT3VYLHNCQUF1QixDQUNJLG1CQUFoQ3NGLEVBQVF4WCxRQUFReVksb0JBQ1hqQixFQUFReFgsUUFBUXlZLFlBRXpCLE1BQU0rQixRQUFvQjdYLEVBQUdDLEtBQUssVUFBVyxDQUMzQ0UsSUFBS25JLEVBQU9TLFFBQ1p5SCxLQUFLLEVBQ0xFLE9BQVFQLElBRUppWSxFQUFhLElBQUl6UyxJQUN2QixJQUFLLE1BQU0wUyxLQUFjRixFQUFhLENBQ3BDLE1BQU9HLEVBQU9DLEdBQVVGLEVBQVczWSxNQUFNLFNBQ3JDNFksR0FBU0MsR0FDWEgsRUFBV3JTLElBQUl1UyxFQUVuQixDQUNBLEdBQUlGLEVBQVdJLEtBQU8sRUFBRyxDQUN2QixNQUFNQyxFQUFjLElBQUlMLEdBQVl0ZixLQUFLLEtBQ3pDcWMsRUFBUXhYLFFBQVEsZUFDZCxvQ0FBb0M4YSx5QkFBbUNBLElBQ3JFdEQsRUFBUXhYLFFBQVFrYSxLQUNsQjFDLEVBQVF4WCxRQUFRa2EsS0FBTyxxQkFBcUJZLFFBQWtCdEQsRUFBUXhYLFFBQVFrYSxRQUU5RTFDLEVBQVF4WCxRQUFRa2EsS0FBTyxxQkFBcUJZLElBQzVDdEQsRUFBUXhYLFFBQVEsWUFBYyxhQUVoQ3dYLEVBQVF4WCxRQUFRdWEsUUFBVS9DLEVBQVF4WCxRQUFRdWEsUUFBVSxJQUFNLHVCQUMxRGhDLEVBQXNCaFQsS0FBSyxRQUFTLFFBQVMsU0FDL0MsQ0FDRixDQUVJNUssRUFBTytNLGFBQ1Q4UCxFQUFROVAsV0FnSGQsU0FBd0NBLEdBQ3RDLEdBQTBCLGlCQUFmQSxJQUE0QkEsRUFBVzhCLFdBQVcsV0FDM0QsT0FBTzlCLEVBR1QsTUFBTzJPLEVBQU9kLEdBQVFPLEdBQVdDLGNBQWNyTyxHQUMvQyxJQUFLMk8sSUFBVWQsRUFDYixPQUFPN04sRUFHVCxNQUFPLENBQ0xxVCxLQUFNLE1BQ05qZCxJQUFLLDBCQUEwQnVZLEtBQVNkLFFBRTVDLENBOUgyQnlGLENBQStCcmdCLEVBQU8rTSxZQUUvRCxDQUVJL00sRUFBT3VOLFVBQVVpSyxNQUNkcUYsRUFBUXhYLFFBQVEsYUFBYXdKLFdBQVcsaUJBRWpDZ08sRUFBUXhYLFFBQVEsWUFBWWxELFNBQVMsMkJBQy9DMGEsRUFBUXhYLFFBQVEsWUFBY3dYLEVBQVF4WCxRQUFRLFlBQVlyRCxRQUN4RCxnQkFDQSwyQ0FKRjZhLEVBQVF4WCxRQUFRLFlBQWMsZ0JBT3ZCckYsRUFBT3VOLFVBQVVtSyxTQUFXbUYsRUFBUXhYLFFBQVEsYUFBYXdKLFdBQVcscUJBQzdFZ08sRUFBUXhYLFFBQVEsWUFBYyxtQkFHM0J3WCxFQUFROVMsYUFBYW9MLGlCQUVqQjBILEVBQVE3UyxnQkFBZ0IsbUJBR2dCLElBQTdDdEMsT0FBTzBJLEtBQUt5TSxFQUFROVMsY0FBY2hELGVBQzdCOFYsRUFBUTlTLGFBRW1DLElBQWhEckMsT0FBTzBJLEtBQUt5TSxFQUFRN1MsaUJBQWlCakQsZUFDaEM4VixFQUFRN1MsZ0JBRW9DLElBQWpEdEMsT0FBTzBJLEtBQUt5TSxFQUFRQyxrQkFBa0IvVixlQUNqQzhWLEVBQVFDLHVCQTRObkJoZCxlQUFxQytjLEdBQ25DQSxFQUFROVMsYUFBZThTLEVBQVE5UyxjQUFnQixDQUFBLEVBQy9DOFMsRUFBUTdTLGdCQUFrQjZTLEVBQVE3UyxpQkFBbUIsQ0FBQSxFQUNyRCxNQUFNc1csRUFBZSxJQUFJalQsSUFBSSxJQUFJM0YsT0FBTzBJLEtBQUt5TSxFQUFROVMsaUJBQWtCckMsT0FBTzBJLEtBQUt5TSxFQUFRN1MsbUJBQzNGLEdBQUlzVyxFQUFhQyxJQUFJLHVCQUF5QkMsR0FBbUIzRCxFQUFTLHFCQUFzQixRQUN2RkEsRUFBUTdTLGdCQUFnQixxQkFDL0IsTUFBTThRLFFBQW1CSixHQUFvQixpQkFBa0IsUUFDL0RtQyxFQUFROVMsYUFBYSxxQkFBdUIsMENBQTBDK1EsR0FDeEYsQ0FDQSxHQUFJd0YsRUFBYUMsSUFBSSx5QkFBMkJDLEdBQW1CM0QsRUFBUyx1QkFBd0IsUUFDM0ZBLEVBQVE3UyxnQkFBZ0IsdUJBQy9CLE1BQU04USxRQUFtQkosR0FBb0IsaUJBQWtCLGVBQy9EbUMsRUFBUTlTLGFBQWEsdUJBQXlCLGlEQUFpRCtRLEdBQ2pHLENBRUEsR0FBSXdGLEVBQWFDLElBQUksZ0NBQWtDQyxHQUFtQjNELEVBQVMsOEJBQStCLFFBQ3pHQSxFQUFROVMsYUFBYSw4QkFDNUIsTUFBTStRLFFBQW1CSixHQUFvQixpQkFBa0IsaUJBQy9EbUMsRUFBUTdTLGdCQUFnQiw4QkFDdEIsbURBQW1EOFEsR0FDdkQsQ0FDQSxHQUFJd0YsRUFBYUMsSUFBSSx3QkFBMEJDLEdBQW1CM0QsRUFBUyxzQkFBdUIsUUFDekZBLEVBQVE3UyxnQkFBZ0Isc0JBQy9CLE1BQU04USxRQUFtQkosR0FBb0IsaUJBQWtCLFNBQy9EbUMsRUFBUTlTLGFBQWEsc0JBQXdCLDJDQUEyQytRLEdBQzFGLENBQ0EsR0FBSXdGLEVBQWFDLElBQUksNEJBQThCQyxHQUFtQjNELEVBQVMsMEJBQTJCLFFBQ2pHQSxFQUFRN1MsZ0JBQWdCLDBCQUMvQixNQUFNOFEsUUFBbUJKLEdBQW9CLGlCQUFrQixhQUMvRG1DLEVBQVE5UyxhQUFhLDBCQUE0QiwrQ0FBK0MrUSxHQUNsRyxDQUNGLENBeFBRMkYsQ0FBc0I1RCxHQUV4QjdjLEVBQU9rTyxjQUFjMk8sRUFBUTVPLGVBQ2pDLElBQUl5UyxFQUFjck4sS0FBS0UsVUFBVXNKLEdBSWpDLEdBSEE2RCxRQStLRjVnQixlQUNFdUYsRUFDQXFiLEVBQ0ExZ0IsR0FFQSxNQUFNMmdCLEVBQTJDLEdBQ2pELElBQUssTUFBTy9ZLEtBQVFGLE9BQU8wSSxLQUFLL0ssR0FDMUJ1QyxJQUFRQSxFQUFJaUgsV0FBVyxNQUFRakgsRUFBSXpGLFNBQVMsTUFDOUN3ZSxFQUFxQi9WLEtBQUssQ0FBQ2hELEVBQUtBLEVBQUl2RyxXQUFXLElBQUssT0FHeEQsR0FBb0MsSUFBaENzZixFQUFxQjVaLE9BQWMsT0FBTzJaLEVBRTlDLElBQUssTUFBT0UsRUFBU0MsS0FBWUYsRUFDL0JELEVBQWNBLEVBQVlyZixXQUFXdWYsRUFBU0MsR0FFaEQsTUFBTUMsUUFBYzlZLEVBQUdDLEtBQUssQ0FBQywwQ0FBMkMsaUJBQWtCLENBQ3hGRSxJQUFLbkksRUFBT1MsUUFDWnlILEtBQUssRUFDTEUsT0FBUVAsSUFFVixJQUFLLE1BQU13SixLQUFReVAsUUFDWHZmLEVBQVlhLElBQUl0QyxVQUNwQixNQUFNYyxFQUFXTCxFQUFLQyxLQUFLUixFQUFPUyxRQUFTNFEsR0FDckNuUixRQUFtQkcsRUFBR1EsU0FBU0MsU0FBU0YsRUFBVSxRQUN4RCxJQUFJUixFQUFhRixFQUNqQixJQUFLLE1BQU8wZ0IsRUFBU0MsS0FBWUYsRUFDL0J2Z0IsRUFBYUEsRUFBV2lCLFdBQVd1ZixFQUFTQyxHQUUxQ3pnQixJQUFlRixTQUNYRyxFQUFHUSxTQUFTUCxVQUFVTSxFQUFVUixLQUs1QyxhQURNbUIsRUFBWStQLGFBQ1hvUCxDQUNULENBbk5zQkssQ0FBZWxFLEVBQVF4WCxRQUFTcWIsRUFBYTFnQixTQUMzREssRUFBR1EsU0FBU1AsVUFBVU0sRUFBVThmLElBRWpDL0QsRUFBZ0IsQ0FHbkIsR0FEQTVTLEVBQWVBLEVBQWF1RCxPQUFRMFIsSUFBU25DLEVBQVE3UyxrQkFBa0JnVixJQUNuRWpWLEVBQWFoRCxPQUFTLEVBQUcsQ0FDM0IsTUFBTWlhLEVBQXVCLElBQUksSUFBSTNULElBQUl0RCxJQUFlckksSUFBSXVmLElBQ3hEamhCLEVBQU9rTyxPQUNUc0wsR0FBVXZMLEVBQWdCLENBQUMsWUFBYSxJQUFJWixJQUFJdEQsSUFBZ0IvSixFQUFPUyxTQUN2RStZLEdBQVV2TCxFQUFnQixDQUFDLE1BQU8sYUFBYytTLEdBQXVCaGhCLEVBQU9TLFVBRzlFK1ksR0FBVXZMLEVBQWdCLENBQUMsU0FBVStTLEdBQXVCaGhCLEVBQU9TLFFBRXZFLENBR0EsR0FEQXVKLEVBQWtCQSxFQUFnQnNELE9BQVEwUixJQUFTbkMsRUFBUTlTLGVBQWVpVixJQUN0RWhWLEVBQWdCakQsT0FBUyxFQUFHLENBQzlCLE1BQU1tYSxFQUEwQixJQUFJLElBQUk3VCxJQUFJckQsSUFBa0J0SSxJQUFJdWYsSUFDOURqaEIsRUFBT2tPLE9BQ1RzTCxHQUFVdkwsRUFBZ0IsQ0FBQyxZQUFhLElBQUlaLElBQUlyRCxJQUFtQmhLLEVBQU9TLFNBQzFFK1ksR0FBVXZMLEVBQWdCLENBQUMsTUFBTyxLQUFNLGFBQWNpVCxHQUEwQmxoQixFQUFPUyxVQUd2RitZLEdBQVV2TCxFQUFnQixDQUFDLE1BQU8sUUFBU2lULEdBQTBCbGhCLEVBQU9TLFFBRWhGLENBQ0ltZCxFQUFzQjdXLE9BQVMsR0FDakN5UyxHQUFVLFNBQVUsQ0FBQyxNQUFPLFVBQVcsU0FBVSxJQUFJbk0sSUFBSXVRLElBQXlCNWQsRUFBT1MsUUFFN0YsQ0FDRixDQXpVVTBnQixDQUFLbmhCLEVBQVE2TSxFQUFZOFAsSUFFbkMsQ0E2V0EsU0FBU3NFLEdBQXVCRyxHQUU5QixNQUFtQixlQUFmQSxFQUFvQyxnQkFDakNBLENBQ1QsQ0FrQk8sU0FBU2hFLEdBQWdCcGQsRUFBdUJxaEIsR0FDckQsR0FBSXJoQixFQUFPa08sTUFBTyxDQUNoQixNQUFNb1QsRUFBZXRoQixFQUFPc1osdUJBQXlCdFosRUFBT3VaLGdDQUN0RGxVLEVBQWtDLENBQ3RDLG1CQUFvQix1Q0FDcEIsZUFBZ0IsbUJBQWtCaWMsRUFBZSx3QkFBMEIsSUFDM0VDLFFBQVMsbUNBQ1QzQixPQUFRLDZCQUNSTCxLQUFNLG9CQUNOLFdBQVksMEJBQ1o5WixLQUFNLGNBQ04rYixVQUFXLDBCQUtiLE9BSEtGLFVBQ0lqYyxFQUFRbWMsVUFFVm5jLENBQ1QsQ0FBTyxDQUNMLE1BQU1pYyxFQUFldGhCLEVBQU9zWix1QkFBeUJ0WixFQUFPdVosZ0NBQ3REa0ksRUFBVUosRUFBVzViLEtBQzNCLElBQUlKLEVBQWtDLENBQ3BDLG1CQUFvQixpQ0FDcEIsZUFBZ0IsK0NBQ2RpYyxFQUFlLHFCQUF1Qiw4QkFFeENDLFFBQVMsK0JBQ1QzQixPQUFRLHFDQUNSTCxLQUFNLGlCQUNOLFdBQVksa0JBQ1psQyxTQUFVLGlEQUFpRHZJLEdBQVdLLFNBQVMzVSxLQUFLLG9DQUNwRmdoQixVQUFXLGdCQStCYixPQTdCSXhoQixFQUFPbUosMkJBQ1Q5RCxFQUFVSixFQUNSLElBQUtJLEdBQ0wsQ0FDRXVhLE9BQVEsc0dBQ1JMLEtBQU0sOERBQ04sV0FBWSxrRUFDWmxDLFNBQVUsaURBQWlEdkksR0FBV0ssU0FBUzNVLEtBQzdFLHNEQUlGaUYsS0FBTSxzRUFDTitiLFVBQVcscUVBR054aEIsRUFBT3VOLFVBQVVtVSxVQUMxQnJjLEVBQVFtYyxVQUFZbmMsRUFBUW1jLFVBQVksR0FBR25jLEVBQVFtYyxnQkFBa0IsR0FDckVuYyxFQUFRbWMsV0FBYSxXQUVuQkMsR0FBU3RmLFNBQVMsYUFDcEJrRCxFQUFRSSxLQUFPZ2MsR0FHWkgsRUFFTXRoQixFQUFPdU4sVUFBVXFSLEtBQzFCdlosRUFBUW1jLFVBQVksdUJBRmJuYyxFQUFRbWMsVUFJVm5jLENBQ1QsQ0FDRixDQTJGQSxTQUFTbWIsR0FBbUIzRCxFQUFzQmhULEdBQ2hELE9BQVFnVCxFQUFRN1Msa0JBQWtCSCxJQUFnQmdULEVBQVE5UyxlQUFlRixJQUFnQixJQUFJMUgsU0FBUyxZQUN4RyxDRWhqQkEsTUFBTXdmLEdBQXFELENBQ3pELGFBQWMsQ0FDWnRjLFFBQVMsQ0FDUCxhQUFjLENBQ1p5VCxPQUFRLFVBSWQsV0FBWSxDQUNWelQsUUFBUyxDQUNQLFdBQVksQ0FDVnlULE9BQVEsV0FNVjhJLEdBQW9ELENBQ3hEQyxTQUFVLENBQ1JOLFFBQVMsQ0FDUHRaLEtBQU0sNkdBQ043RixJQUFLLElBRVAsbUJBQW9CLENBQ2xCNkYsS0FBTSxtQkFDTjdGLElBQUssK0tBS1RkLFVBS0krRCxHQUNPLDBNQVVYL0QsT0FHS3hCLGVBQWVnaUIsR0FBb0M5aEIsR0FDeEQsT0FBT1osRUFBT0MsMEJBQTBCLHNDQUF1Q1MsZ0JBS2pGQSxlQUFvQkUsR0FDbEIsTUFBTVMsRUFBVUYsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLGFBQ3ZDc2hCLEVBQWV4aEIsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLFVBQzVDdWhCLEVBQWMzaEIsRUFBRzBCLFdBQVdnZ0IsSUFDNUJQLFVBQUVBLEdBQWNwRSxHQUFnQnBkLEVBQVEsSUFDeENpaUIsRUFBc0MsSUFDdkNOLEdBQ0gsYUFBYyxJQUNUQyxHQUNIQyxTQUFVLElBQ0xELEdBQWtCQyxTQUNyQk4sUUFBUyxJQUNKSyxHQUFrQkMsU0FBU04sUUFDOUJuZixJQUFLOGYsR0FBa0JsaUIsT0FLMUJ3aEIsVUFDSVMsRUFBUyxrQkFFWnpaLFFBQVF0RCxJQUFJLENBQ2hCN0UsRUFBR1EsU0FBU1AsVUFDVkMsRUFBS0MsS0FBS1IsRUFBT1MsUUFBUyxnQkFDMUJpTyxFQUFLNkIsS0FBSzBSLEVBQVUsQ0FDbEJ6UixXQUFXLEVBQ1hDLGNBQWMsRUFDZEMsT0FBUSxDQUNOLFNBQVUsWUFJaEJyUSxFQUFHUSxTQUFTcU0sR0FBR3pNLEVBQVMsQ0FBRTBNLE9BQU8sRUFBTWhNLFdBQVcsTUFFaEQ2Z0IsVUFDSXhaLFFBQVF0RCxJQUFJLENBQ2hCN0UsRUFBR1EsU0FBU3FNLEdBQUc2VSxFQUFjLENBQUU1VSxPQUFPLEVBQU1oTSxXQUFXLElBQ3ZEZCxFQUFHUSxTQUFTcU0sR0FBRzNNLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxpQkFBa0IsQ0FBRTBNLE9BQU8sTUFFekVxTSxHQUFVLE1BQU8sQ0FBQyxTQUFVLFVBQVcsa0JBQW1CeFosRUFBT1MsVUFHbkUsR0FBSStnQixFQUFXLENBQ2IsTUFBTVcsRUFpQlYsU0FBMEJuaUIsR0FDeEIsSUFBSW9pQixFQUVGQSxFQURFcGlCLEVBQU9rTyxNQUNVbE8sRUFBT3VOLFVBQVVxUixHQUFLLHlCQUEyQixvQkFFakQ1ZSxFQUFPdU4sVUFBVXFSLEdBQUssb0JBQXNCLHFCQUVqRSxHQUFJNWUsRUFBTytNLFlBQVk4QixXQUFXLDBCQUNoQyxNQUFPLGdVQVVUdVQsTUFDQTlnQixPQUVBLE9BQU84Z0IsQ0FDVCxDQXZDb0JDLENBQWlCcmlCLEdBQ2pDSyxFQUFHaWlCLFVBQVUvaEIsRUFBS0MsS0FBS0MsRUFBUyxZQUFhLENBQUVVLFdBQVcsVUFDcERJLEVBQVlhLElBQUksSUFDcEIvQixFQUFHUSxTQUFTUCxVQUFVQyxFQUFLQyxLQUFLQyxFQUFTLFdBQVksWUFBYTBoQixFQUFVLEtBQU0sQ0FDaEZJLEtBQU0sTUFHWixDQUNBLE1BQU1DLEVBQW1CLEdBQUduZCxTQXlDOUIsU0FBbUNyRixHQUNqQyxNQUFNeWlCLEVBQThCLEdBQ3BDLEdBQUl6aUIsRUFBTzBpQixtQkFBb0IsQ0FDN0IsTUFBTUMsRUFBc0I5aUIsT0FBTytpQixHQUFHLHlEQUN0Q0gsRUFBa0I3WCxLQUFLL0ssT0FBTytpQixHQUFHLG1CQUFtQkQsb0JBQ3RELENBQ0EsTUFBTUUsRUFBaUI3aUIsRUFBT2tPLE1BQVEsY0FBZ0IsT0FDaEQ0VSxFQUFrQjlpQixFQUFPdU4sVUFBVWlLLE9BQVN4WCxFQUFPdU4sVUFBVXlGLEtBQU8sbUJBQXFCLEdBQy9GeVAsRUFBa0I3WCxLQUFLL0ssT0FBTytpQixHQUFHLG1DQUFtQ0MsSUFBaUJDLE1BQ2pGOWlCLEVBQU91WCx1QkFDVGtMLEVBQWtCN1gsS0FBSy9LLE9BQU8raUIsR0FBRyxrREFFL0I1aUIsRUFBT3VOLFVBQVVpSyxNQUNuQmlMLEVBQWtCN1gsS0FDaEIvSyxPQUFPK2lCLEdBQUcsbUZBQ1YvaUIsT0FBTytpQixHQUFHLDZFQUNWL2lCLE9BQU8raUIsR0FBRyxzRUFFSDVpQixFQUFPdU4sVUFBVW1LLFFBQzFCK0ssRUFBa0I3WCxLQUNoQi9LLE9BQU8raUIsR0FBRyw2SEFDVi9pQixPQUFPK2lCLEdBQUcsd0hBR2QsT0FBT0gsQ0FDVCxDQWxFc0RNLENBQTBCL2lCLEdBQVFRLEtBQUssVUFDM0ZILEVBQUdpaUIsVUFBVS9oQixFQUFLQyxLQUFLQyxFQUFTLGNBQWUsQ0FBRVUsV0FBVyxVQUN0REksRUFBWWEsSUFBSSxJQUNwQi9CLEVBQUdRLFNBQVNQLFVBQVVDLEVBQUtxQixRQUFRbkIsRUFBUyxhQUFjLGNBQWUraEIsRUFBa0IsQ0FDekZELEtBQU0sTUFHWixDQTlEVXBCLENBQUtuaEIsSUFFZixDQXNGQSxTQUFTa2lCLEdBQWtCbGlCLEdBQ3pCLE1BQU1pTyxFQUFpQmpPLEVBQU9rTyxNQUFRLE1BQVEsT0FJOUMsTUFBTyxHQUhTbE8sRUFBT3VOLFVBQVVxUixJQUMxQjVlLEVBQU9rTyxNQUFRLGVBQWlCLFdBQW5DLHlDQUNBLEdBQUdELG1CQUFnQ0EsK0NBRXpDLENDeExBLE1BQU0rVSxHQUFpQixDQUNyQkMsS0FBTSxDQUFDLE1BQU8sT0FBUSxXQUFXalksV0FDakN3TSxNQUFPLENBQUMsTUFBTyxPQUFRLFVBQVcsS0FBTSxlQUFnQixXQUFXeE0sWUNPOURsTCxlQUFlb2pCLEdBQXFCbGpCLEdBQ3pDLE9BQU9aLEVBQU9DLDBCQUEwQix1QkFBd0JTLGdCQUtsRUEsZUFBb0JFLEdBQ2xCLE1BQU1ZLEVBQVdMLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxxQkFDOUMsR0FBSVQsRUFBT2tPLE1BRVQsa0JBRE0zTSxFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTcU0sR0FBR3RNLEVBQVUsQ0FBRXVNLE9BQU8sS0FJaEUsTUFBTWdXLEVBQWdCbmpCLEVBQU9rSixPQUFTLDBCQUE0QixnQ0FDNURoQyxFQUFrQixHQUN4QixHQUFJbEgsRUFBT29aLHVCQUF5QnBaLEVBQU9zWixzQkFBdUIsQ0FDaEUsTUFBTXBFLEVBQVMsUUFDZGtPLEdBQWFwakIsU0FBY3FULEtBQUtFLFVBQ2pDLEdBQUc0UCxnQkFBNEJuSSxHQUFXQyxpQkFBaUJqYixXQUN0RG1qQiwrQkFDTGpjLEVBQU0wRCxLQUFLc0ssRUFDYixDQUNBLE1BQU1tTyxFQUFpQnJqQixFQUFPa0osT0FBUyxtQ0FBcUMsR0FDNUVoQyxFQUFNMEQsS0FBSyxnQkFDQWtLLEdBQVdLLFNBQVMzVSxLQUFLLDBJQUMrRTZpQixNQXVEckgsU0FBb0NyakIsR0FDbEMsT0FBT0EsRUFBT29aLHVCQUF5QnBaLEVBQU9zWixzQkFDMUMscUlBRStDOEosR0FBYXBqQiw4RUFFNUQsRUFDTixDQTlEd0lzakIsQ0FBMkJ0akIsK0VBRXpJbWpCLHlKQUVIQSwrYUFnQmpCbmpCLEVBQU9xWCx3QkFDVG5RLEVBQU0wRCxLQUFLLHlVQVFUNUssRUFBT3VYLHVCQUNUclEsRUFBTTBELEtBQUssc0lBUWIsTUFBTXhLLEVBQWEsNkRBRW5CSixFQUFPb1osdUJBQXlCcFosRUFBT3NaLHNCQUF3Qiw4Q0FBZ0QseUJBQzdGcFMsRUFBTTFHLEtBQUssa0JBSXZCZSxFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTcU0sR0FBRzNNLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxvQkFBcUIsQ0FBRTBNLE9BQU8sV0FDaEc1TCxFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTcU0sR0FBRzNNLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxzQkFBdUIsQ0FBRTBNLE9BQU8sV0FDbEc1TCxFQUFZYSxJQUFJLElBQU0xQixFQUFPSyxhQUFhSCxFQUFVUixHQUM1RCxDQXZFVStnQixDQUFLbmhCLElBRWYsQ0F1RUEsU0FBU29qQixHQUFhcGpCLEdBQ3BCLE1BQU0wZixFRGhGRCxTQUFvQjFmLEdBQ3pCLE9BQUlBLEVBQU91TixVQUFVaUssTUFDWndMLEdBQWV4TCxNQUVqQndMLEdBQWVDLElBQ3hCLENDMkVlTSxDQUFXdmpCLEdBQVEwQixJQUFLaWUsR0FBUSxHQUFHQSxTQUNoRCxNQUFPLEtBQUtELEVBQUtsZixLQUFLLFdBQVdzVSxHQUFXSSxPQUFPMVUsS0FBSyxPQUMxRCxDQ3BFT1YsZUFBZTBqQixHQUF1QnhqQixHQUMzQyxPQUFPWixFQUFPQywwQkFBMEIseUJBQTBCUyxVQUNoRSxNQUFNYyxFQUFXTCxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsbUJBQ3hDTyxRQUFpQk4sRUFBT0Msc0JBQXNCQyxJQUFjLEdBQzVEa1csRUFBa0I3QyxHQUFlSyxtQkFBbUJ0VCxHQUNwRCtWLEVBQWtCOUMsR0FBZVEsbUJBQW1CelQsR0FFcER5aUIsRUFBb0JsakIsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLGNBQ2pEaWpCLFFBQTBCelAsR0FBZUUsK0JBQStCc1AsSUFBdUIsR0FFckcsSUFBSUUsRUFBb0IsR0FDcEIzakIsRUFBT3FYLHlCQUNUc00sRUFBb0IsK0RBT3RCLE1BQU12akIsRUFBYTBXLEVBaENELGdIQWdDbUM2TSxFQUFvQkQsRUFBbUIzTSxRQUN0RnhWLEVBQVlhLElBQUksSUFBTTFCLEVBQU9LLGFBQWFILEVBQVVSLEtBRTlELENDL0JBLE1BQU15YyxHQUFVLENBQ2QrRyxTQUFVLElBQ1ZDLEtBQU0sU0FHRC9qQixlQUFlZ2tCLEdBQTBCOWpCLEdBQzlDLE9BQU9aLEVBQU9DLDBCQUEwQiw0QkFBNkJTLFVBQ25FLElBQUkwTyxFQUFzQlIsRUFBVTZPLElBQ3BDLE1BQU1qYyxFQUFXTCxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsc0JBQzlDLElBQ0UsTUFBTVAsUUFBbUJHLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsUUFDbEQ2TixFQUFjNEUsS0FBS0MsTUFBTXBULEdBQy9Cc08sRUFBY3ZKLEVBQU1DLElBQUksQ0FBQ3NKLEVBQWFDLEVBQWFELEdBQWMsQ0FBRUksV0FBWXpFLEdBQ2pGLENBQUUsTUFDQSxDQUVGLE1BQU0vSixFQUFhaVQsS0FBS0UsVUFBVS9FLFNBQzVCak4sRUFBWWEsSUFBSSxJQUFNMUIsRUFBT0ssYUFBYUgsRUFBVVIsS0FFOUQsQ0NwQk9OLGVBQWVpa0IsR0FBZS9qQixHQUNuQyxPQUFPWixFQUFPQywwQkFBMEIsaUJBQWtCUyxVQUN4RCxNQUFNYyxFQUFXTCxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsYUFDOUMsSUFBSUwsUUFBbUJDLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsUUFFbERQLEVBQUcwQixXQUFXeEIsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLHNCQUM3Q0wsRUFBYTRqQixHQUFZNWpCLEVBUjdCLDBLQVdFLE1BQU0yTSxFQUFhL00sRUFBTytNLFlBQVlyRCxNQUFNMUosRUFBTytNLFdBQVd3SCxRQUFRLEtBQU8sR0FDdkUwUCxFQUFZNWpCLEVBQUc2akIsWUFBWSxHQUFHbGtCLEVBQU9TLDZCQUMzQyxJQUFLLE1BQU1pTixLQUFZdVcsRUFBVyxDQUNoQyxJQUFLdlcsRUFBU21CLFdBQVcsVUFBWW5CLEVBQVNtQixXQUFXLFVBQVcsU0FFcEUsSUFBSXNWLEVBQVl6VyxFQUdoQixHQUZBeVcsR0FBYUEsRUFBVSxJQUFNLElBQUlDLGNBQWdCRCxFQUFVemEsTUFBTSxFQUFHeWEsRUFBVTVQLFFBQVEsTUFDdEY0UCxFQUFZQSxFQUFVbmlCLFFBQVEsSUFBSyxNQUM5QitLLEVBQVksU0FDakIsTUFBTXNYLEVBQVEsTUFBTUYseUJBQWlDcFgsdUJBQWdDVyxvQ0FBMkNYLHVCQUFnQ1csS0FDNUpyTixFQUFHMEIsV0FBV3hCLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxxQkFBcUJpTixRQUNsRXROLEVBQWE0akIsR0FBWTVqQixFQUFZaWtCLEdBRXpDLE9BRU05aUIsRUFBWWEsSUFBSSxJQUFNMUIsRUFBT0ssYUFBYUgsRUFBVVIsS0FFOUQsQ0FFTyxTQUFTNGpCLEdBQVlNLEVBQWdCRCxHQUUxQ0MsRUFBU0EsRUFBT3RpQixRQUFRcWlCLEVBQU8sSUFBSWhqQixXQUFXLFdBQVksUUFFMUQsSUFBSyxJQUFJa2pCLEVBQUksRUFBR0EsRUFBSUQsRUFBT3ZkLE9BQVF3ZCxJQUNqQyxHQUFzQixPQUFsQkQsRUFBT0MsRUFBSSxJQUE2QixPQUFkRCxFQUFPQyxHQUFhLENBQ2hELE1BQU0vUyxFQUFTOFMsRUFBTzVhLE1BQU0sRUFBRzZhLEVBQUksR0FDbkMsSUFBSTlTLEVBQVE2UyxFQUFPNWEsTUFBTTZhLEVBQUksR0FJN0IsT0FISzlTLEVBQU01QyxXQUFXLE1BQVM0QyxFQUFNNUMsV0FBVyxPQUM5QzRDLEVBQVEsS0FBS0EsS0FFUixHQUFHRCxJQUFTNlMsTUFBVTVTLEdBQy9CLENBRUYsTUFBTyxHQUFHNlMsTUFBV0QsS0FDdkIsQ0MzQ092a0IsZUFBZTBrQixHQUFrQjNYLEdBQ3RDLE9BQU96TixFQUFPQywwQkFBMEIsb0JBQXFCUyxVQUMzRCxNQUFNYyxFQUFXTCxFQUFLcUIsUUFBUWlMLEVBQVdwTSxRQUFTLG1CQUNsRCxJQUFLSixFQUFHMEIsV0FBV25CLEdBQVcsT0FFOUIsTUFBTXFoQixFQUFXNU8sS0FBS0MsWUFBWWpULEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsU0FHM0Q2akIsRUFBVXhDLEVBQVN3QyxTQUFXLEdBQ3BDLElBQUssSUFBSUYsRUFBSSxFQUFHQSxFQUFJRSxFQUFRMWQsT0FBUXdkLElBQUssQ0FDdkMsTUFBTUcsRUFBU2xHLE1BQU1DLFFBQVFnRyxFQUFRRixJQUFNRSxFQUFRRixLQUFLLEdBQUtFLEVBQVFGLEdBQy9Eak8sRUFBYWtJLE1BQU1DLFFBQVFnRyxFQUFRRixLQUFPRSxFQUFRRixLQUFLLElBQU8sQ0FBQSxFQUNyRCxzQ0FBWEcsRUFDRkQsRUFBUUYsR0FBSyxDQUNYLG9DQUNBdGYsRUFBTUMsSUFDSixDQUNFb1IsRUFDQSxDQUNFcU8sT0FBUSx3QkFHWixDQUFFL1YsV0FBWXpFLEtBR0UsNkJBQVh1YSxJQUNURCxFQUFRRixHQUFLLENBQ1gsMkJBQ0F0ZixFQUFNQyxJQUNKLENBQ0VvUixFQUNBLENBRUVzTyx5QkFBeUIsRUFDekJDLHNCQUFzQixFQUN0QkMsT0FBUSxDQUFDLHVCQUNUQyxlQUFnQixDQUFDLHlCQUdyQixDQUFFblcsV0FBWXpFLEtBSXRCLENBQ0EsTUFBTS9KLEVBQWFpVCxLQUFLRSxVQUFVME8sU0FDNUIxZ0IsRUFBWWEsSUFBSSxJQUFNMUIsRUFBT0ssYUFBYUgsRUFBVVIsS0FFOUQsQ0M5Q0EsTUFBTXljLEdBQVUsQ0FDZDFKLFFBQVMsb0RBQ1RDLFFBQVMsQ0FBQywwREFLTHRULGVBQWVrbEIsR0FBcUJobEIsR0FDekMsT0FBT1osRUFBT0MsMEJBQTBCLHVCQUF3QlMsVUFDOUQsSUFBSTBPLEVBQWNSLEVBQVU2TyxJQUM1QixNQUFNamMsRUFBV0wsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLGlCQUM5QyxHQUFJSixFQUFHMEIsV0FBVyxHQUFHbkIsTUFFbkIsT0FFRixJQUNFLE1BQU1WLFFBQW1CRyxFQUFHUSxTQUFTQyxTQUFTRixFQUFVLFFBQ2xENk4sRUFBYzRFLEtBQUtDLE1BQU1wVCxHQUMvQnNPLEVBQWN2SixFQUFNQyxJQUFJLENBQUNzSixFQUFhQyxFQUFhRCxHQUFjLENBQy9ESSxXQUFZekUsSUFFZHFFLEVBQVk0RSxRQUFVNUUsRUFBWTRFLFFBQVE5RixPQUFRN0MsR0FBMEIsaUJBQVRBLEVBQ3JFLENBQUUsTUFDQSxDQUlFekssRUFBT3VOLFVBQVVpSyxRQUNuQmhKLEVBQVl5VyxlQUFpQixHQUUxQnpXLEVBQVl5VyxhQUFhdGUsS0FBTXVlLEdBQzlCQSxFQUFLQyxtQkFBbUJoakIsU0FBUyxVQUduQ3FNLEVBQVl5VyxhQUFhcmEsS0FBSyxDQUFFdWEsa0JBQW1CLENBQUMsUUFBU0MsU0FBUyxXQUlwRTdqQixFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTcU0sR0FBRzNNLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxlQUFnQixDQUFFME0sT0FBTyxXQUMzRjVMLEVBQVlhLElBQUksSUFBTS9CLEVBQUdRLFNBQVNxTSxHQUFHM00sRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLG9CQUFxQixDQUFFME0sT0FBTyxLQUN0RyxNQUFNL00sRUFBYWlULEtBQUtFLFVBQVUvRSxTQUM1QmpOLEVBQVlhLElBQUksSUFBTTFCLEVBQU9LLGFBQWFILEVBQVVSLEtBRTlELENDaERBLE1BQ01pbEIsR0FEZSxDQUFDLGNBQWUsUUFBUyxTQUFVLGNBQ1pDLFFBQVNDLEdBQVUsQ0FBQyxVQUFXQSxJQUNyRUMsR0FBYSwyQkFDYkMsR0FBc0IsaUJBQ3RCQyxHQUF5QixDQUFDLFVBQVcsZUFBZ0JMLElBRXBEdmxCLGVBQWU2bEIsR0FBbUI5WSxHQUN2QyxPQUFPek4sRUFBT0MsMEJBQTBCLHFCQUFzQlMsZ0JBZ0JoRUEsZUFBcUMrTSxHQUNuQyxJQUFLQSxFQUFXM0QsT0FBUSxPQUt4QixHQUZBc1EsR0FBVSxNQURTLENBQUMsZ0JBQWlCLE1BQU9nTSxNQUFlSCxHQUF3QixVQUFXLElBQUssU0FDdEV4WSxFQUFXcE0sU0FmMUMsU0FBeUJULEdBQ3ZCLE9BQ0VBLEVBQU91TixVQUFVeUYsTUFDakJoVCxFQUFPdU4sVUFBVW9LLGdCQUNqQjNYLEVBQU91TixVQUFVd0YsT0FDakIvUyxFQUFPdU4sVUFBVXNLLFdBQ2pCN1gsRUFBT2tiLHFCQUNQbGIsRUFBTzRsQiw2QkFFWCxDQVFNQyxDQUFnQmhaLEdBQWEsT0FFakMyTSxHQUNFLE1BQ0EsQ0FBQyxnQkFBaUIsU0FBVWlNLE1BQXdCQyxHQUF3QixTQUM1RTdZLEVBQVdwTSxlQUVQK0gsUUFBUXRELElBQUksQ0FHaEI0Z0IsR0FBcUJqWixFQUFXcE0sUUFBUyxrQkFDekNxbEIsR0FBcUJqWixFQUFXcE0sUUFBUyxrQkFDekNxbEIsR0FBcUJqWixFQUFXcE0sUUFBUyxpQkFDekNxbEIsR0FBcUJqWixFQUFXcE0sUUFBUyxrQkFDekNxbEIsR0FBcUJqWixFQUFXcE0sUUFBUyxrQkFDekNxbEIsR0FBcUJqWixFQUFXcE0sUUFBUyxvQkFDekNzbEIsR0FBcUJsWixFQUFXcE0sVUFFcEMsQ0F2Q1V1bEIsQ0FBc0JuWixJQUVoQyxDQXVDQS9NLGVBQWVnbUIsR0FBcUJHLEVBQXFCQyxTQUNqRDdsQixFQUFHNk0sR0FBRzNNLEVBQUtxQixRQUFRcWtCLEVBQWFDLEVBQXVCVCxJQUFzQixDQUNqRnRZLE9BQU8sRUFDUGhNLFdBQVcsR0FFZixDQUVBckIsZUFBZWltQixHQUFxQkUsR0FDbEMsTUFBTXJsQixFQUFXTCxFQUFLcUIsUUFBUXFrQixFQUFhLG9CQUMzQyxJQUNFLE1BQU1ySixRQUFpQnZjLEVBQUdTLFNBQVNGLEVBQVUsUUFDdkN1bEIsRUFBZ0I5UyxLQUFLQyxNQUFNc0osR0FDakMsSUFRSixTQUF5QnVKLEdBQ3ZCLE1BQ2tCLGlCQUFUQSxHQUNFLE9BQVRBLEdBQ0EsV0FBWUEsR0FDVyxpQkFBaEJBLEVBQUtDLFFBQ0ksT0FBaEJELEVBQUtDLFNBQ0o1SCxNQUFNQyxRQUFRMEgsRUFBS0MsT0FFeEIsQ0FqQlNDLENBQWdCRixLQUFVQSxFQUFLQyxPQUFPWCxJQUFzQixPQUNqRVUsRUFBS0MsT0FBUzFlLE9BQU80ZSxZQUFZNWUsT0FBT0MsUUFBUXdlLEVBQUtDLFFBQVE5WSxPQUFPLEVBQUVoTyxLQUFVQSxJQUFTbW1CLFdBQ25GcGxCLEVBQUdDLFVBQVVNLEVBQVV5UyxLQUFLRSxVQUFVNFMsT0FBTS9mLEVBQVcsR0FBSyxLQUNwRSxDQUFFLE1BQ0EsQ0FFSixDQzNEQSxNQUFNbWdCLEdBQWMsQ0FDbEJDLGdCQUFpQixDQUNmQyxjQUFjLEVBQ2RDLDBCQUEwQixFQUMxQkMsOEJBQThCLEVBQzlCQyxpQkFBaUIsRUFDakJDLG1CQUFtQixFQUNuQnBpQixhQUFhLEVBQ2JxaUIsV0FBVyxFQUNYQyxlQUFlLEVBQ2ZDLE9BQVEsT0FDUkMsVUFBVyxDQUFDLHdCQUF5QixhQUV2Q0MsUUFBUyxDQUFDLDJCQUE0QixpQkFDdENDLFFBQVMsQ0FDUCwwQkFDQSxzQkFDQSx1QkFDQSxlQUNBLFdBQ0EsY0FJRUMsR0FBYSxDQUNqQlosZ0JBQWlCLENBQ2ZDLGNBQWMsRUFDZEMsMEJBQTBCLEVBQzFCQyw4QkFBOEIsRUFDOUJDLGlCQUFpQixFQUNqQkMsbUJBQW1CLEVBQ25CcGlCLGFBQWEsRUFDYnFpQixXQUFXLEVBQ1hDLGVBQWUsRUFDZkMsT0FBUSxPQUNSQyxVQUFXLENBQUMsNEJBQTZCLGVBQWdCLGFBRTNEQyxRQUFTLENBQUMsaUJBQ1ZDLFFBQVMsQ0FBQyxlQUFnQixXQUFZLGNBR2pDcm5CLGVBQWV1bkIsR0FBaUJybkIsR0FDckMsT0FBT1osRUFBT0MsMEJBQTBCLG1CQUFvQlMsVUFDMUQsR0FBSUUsRUFBT3VOLFVBQVVpSyxPQUFTeFgsRUFBT3VOLFVBQVV5RixLQUFNLE9BRXJELElBQUl4RSxFQUFjUixFQUFVaE8sRUFBT2tKLE9BQVNxZCxHQUFjYSxJQUMxRDVZLEVBQVk0RSxRVjNEVCxTQUE0QnBULEdBQ2pDLE9BQUlBLEVBQU9rTyxNQUNGLDhCQUVMbE8sRUFBT3VOLFVBQVVxSyxZQUNaLHVDQUVGLENBQUMsbUNBQW9DLGtDQUM5QyxDVW1EMEIwUCxDQUFtQnRuQixHQUNwQ0EsRUFBT2tiLHFCQUF3QmxiLEVBQU80bEIsOEJBRS9CNWxCLEVBQU9rTyxPQUFVbE8sRUFBT3VOLFVBQVVxSyxjQUM1Q3BKLEVBQVlnWSxnQkFBa0IsSUFBS2hZLEVBQVlnWSxnQkFBaUJlLElBQUsscUJBRjlEL1ksRUFBWWdZLGlCQUFpQmUsSUFJbEN2bkIsRUFBT2tKLFNBQVdsSixFQUFPbUosNkJBQzNCcUYsRUFBWTJZLFFBQVUzWSxFQUFZMlksU0FBUzdaLE9BQVE3TSxJQUFxQkEsRUFBUW9PLFdBQVcsZ0JBQzNGTCxFQUFZMFksUUFBVTFZLEVBQVkwWSxTQUFTNVosT0FBUTdNLElBQXFCQSxFQUFRb08sV0FBVyxpQkFHN0YsTUFBTWpPLEVBQVdMLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxpQkFDOUMsSUFDRSxNQUFNNmMsUUFBd0JqZCxFQUFHUSxTQUFTQyxTQUFTRixFQUFVLFFBQ3ZENk4sRUFBYzRFLEtBQUtDLE1BQU1nSyxHQUMvQjlPLEVBQVk0RSxRQXVCbEIsU0FDRW9VLEVBQ0FDLEdBRUEsTUFBTUMsRUFBZ0IsSUFBSUMsR0FBaUJILE1BQXNCRyxHQUFpQkYsSUFDNUVHLEVBQWdCLElBQUksSUFBSXZhLElBQUlxYSxJQUNsQyxPQUE2QixJQUF6QkUsRUFBYzdnQixZQUFjLEVBQ0gsSUFBekI2Z0IsRUFBYzdnQixPQUFxQjZnQixFQUFjLEdBQzlDQSxDQUNULENBaEM0QkMsQ0FBcUJyWixFQUFZNEUsUUFBUzNFLEVBQVkyRSxnQkFDckUzRSxFQUFZMkUsZUFDWjNFLEVBQVkrWCxpQkFBaUJlLElBQ3BDL1ksRUFBY3ZKLEVBQU1DLElBQUksQ0FBQ3NKLEVBQWFDLEVBQWFELEdBQWMsQ0FBRUksV0FBWXRFLElBQy9Fa0UsRUFBWTJZLFFBQVUzWSxFQUFZMlksU0FBUzdaLE9BQ3hDN00sSUFDRUEsRUFBUTBCLFNBQVMsWUFBYzFCLEVBQVEwQixTQUFTLGdCQUFrQjFCLEVBQVEwQixTQUFTLFVBRTFGLENBQUUsTUFDQSxDQUVGMEksRUFBUzJELEdBQ1RBLEVBQVkyWSxTQUFTVyxjQUVkdFosRUFBWWdZLGlCQUFpQnVCLHVCQUNoQy9uQixFQUFPdU4sVUFBVXFLLG9CQUNacEosRUFBWWdZLGlCQUFpQndCLHFCQUV0QyxNQUFNNW5CLEVBQWFpVCxLQUFLRSxVQUFVL0UsU0FDNUJqTixFQUFZYSxJQUFJLElBQU0xQixFQUFPSyxhQUFhSCxFQUFVUixLQUU5RCxDQWFBLFNBQVN1bkIsR0FBaUJybEIsR0FDeEIsT0FBS0EsRUFDRWtjLE1BQU1DLFFBQVFuYyxHQUFTQSxFQUFRLENBQUNBLEdBRHBCLEVBRXJCLENDdEdBLE1BQU0ybEIsR0FBc0IsQ0FDMUIscUJBQ0EsMkJBQ0EscUJBQ0EsWUFDQSxhQUNBLGNBR0tub0IsZUFBZW9vQixHQUF1QmxvQixHQUMzQyxPQUFPWixFQUFPQywwQkFBMEIseUJBQTBCUyxVQUNoRSxJQUNFLE1BQU1jLEVBQVdMLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxVQUFXLGlCQUNuRDZjLFFBQXdCamQsRUFBR1EsU0FBU0MsU0FBU0YsRUFBVSxRQUM3RCxJQUFJcWhCLEVBQVc1TyxLQUFLQyxNQUFNZ0ssR0FDMUIsSUFBSyxNQUFNNkssS0FBc0JGLEdBQy9CaEcsRUFBV2hkLEVBQU1DLElBQUksQ0FBQytjLEVBQVVtRyxHQUFlRCxLQUU3Q25vQixFQUFPdVgsd0JBQ1QwSyxFQUFXaGQsRUFBTUMsSUFBSSxDQUFDK2MsRUFBVW1HLEdBQWUsa0JBRTdDcG9CLEVBQU91TixVQUFVeUYsT0FDbkJpUCxFQUFXaGQsRUFBTUMsSUFBSSxDQUFDK2MsRUFBVW1HLEdBQWUsa0JBSTdDLDZCQUE4Qm5HLFVBQ3pCQSxFQUFTLDRCQUVkLHdCQUF5QkEsVUFDcEJBLEVBQVMsdUJBRWxCcFgsRUFBU29YLEdBQ1QsTUFBTTdoQixFQUFhaVQsS0FBS0UsVUFBVTBPLE9BQVU3YixFQUFXLFNBQ2pEN0UsRUFBWWEsSUFBSSxJQUFNMUIsRUFBT0ssYUFBYUgsRUFBVVIsR0FDNUQsQ0FBRSxNQUNBLEdBR04sQ0FFQSxTQUFTZ29CLEdBQWVELEdBQ3RCLE1BQU8sQ0FDTCx1QkFBd0IsQ0FDdEJBLENBQUNBLElBQXFCLEdBRzVCLENDaENPcm9CLGVBQWV1b0IsR0FBa0Jyb0IsR0FDdEMsT0FBT1osRUFBT0MsMEJBQTBCLG9CQUFxQlMsVUFDM0QsTUFBTXdvQixFQUFnQi9uQixFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsZUFDbkQsR0FBSVQsRUFBT2tPLE1BUVQsYUFQTTNNLEVBQVlhLElBQUksSUFBTS9CLEVBQUdRLFNBQVNxTSxHQUFHb2IsRUFBZSxDQUFFbmIsT0FBTyxXQUM3RDVMLEVBQVlhLElBQUksSUFDcEIvQixFQUFHUSxTQUFTcU0sR0FBRzNNLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxTQUFVLENBQUUwTSxPQUFPLEVBQU1oTSxXQUFXLGdCQUU1RUksRUFBWWEsSUFBSSxJQUNwQi9CLEVBQUdRLFNBQVNxTSxHQUFHM00sRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLGFBQWMsQ0FBRTBNLE9BQU8sRUFBTWhNLFdBQVcsS0FLeEYsTUFBTW9uQixFQUFpQnhPLEdBQXlCLE9BQVEsQ0FBQyxhQUFjL1osRUFBT1MsU0FDeEUrbkIsRUE2REgsU0FBMEIzZSxFQUFxQnBKLEdBQ3BELE1BQU1nb0IsRUFBZTFPLEdBQXlCLE1BQU8sQ0FBQyxPQUFRbFEsRUFBYSxXQUFZLFVBQVdwSixHQUVsRyxPQURpQjRTLEtBQUtDLE1BQU1tVixHQUNacGhCLE1BQ2xCLENBakUwQnFoQixDQUFpQixlQUFnQjFvQixFQUFPUyxTQUMxRGtvQixHQUFlSixJQUFtQkksR0FBZUgsSUFBa0JELElBQW1CQyxHQUN4RmhQLEdBQVUsT0FBUSxDQUFDLE1BQU8sVUFBV2dQLEdBQWdCeG9CLEVBQU9TLFFBQVMsR0FHdkUsTUFBTW1vQixFQUFlcm9CLEVBQUtDLEtBQUtSLEVBQU9TLFFBQVMsUUFBUyxrQkFDbERKLEVBQUdRLFNBQVNJLE1BQU0ybkIsRUFBYyxDQUFFem5CLFdBQVcsSUFDbkQsSUFBSyxNQUFNa1EsV0FBY2hSLEVBQUdRLFNBQVN5SSxRQUFRc2YsR0FDdkN2WCxFQUFLeEMsV0FBVyxXQUFhd0MsRUFBS3hDLFdBQVcsUUFBUTJaLGFBQ2pEam5CLEVBQVlhLElBQUksSUFBTS9CLEVBQUdRLFNBQVNxTSxHQUFHM00sRUFBS0MsS0FBS29vQixFQUFjdlgsS0FLdkUsTUFBTXdYLEVBQWF0b0IsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLGlCQUMxQ2MsRUFBWWEsSUFBSSxJQUFNL0IsRUFBR1EsU0FBU3FNLEdBQUcyYixFQUFZLENBQUUxYixPQUFPLEtBRWhFLE1BQU04VSxFQUFXdlQsRUFBS0MsV0FBV3RPLEVBQUdRLFNBQVNDLFNBQVN3bkIsRUFBZSxTQUNyRXJHLEVBQVM2Ryx5QkFBMkIsR0FDcEM3RyxFQUFTOEcsV0FBYSxlQUN0QjlHLEVBQVMrRyxPQUFTLG1CQUNsQi9HLEVBQVNnSCxrQkFBb0IsS0FDN0JoSCxFQUFTaUgsdUJBQXlCLENBQ2hDLDBCQUNBLDZCQUNBLDRCQUNBLGdDQUNBLHNDQUNBLGtDQUNBLGdDQUNBLHNDQUNBLCtCQUNBLDBCQUNBLGtCQUVBLE9BQ0EsVUFDQSxRQUNBLG9CQUVLakgsRUFBU2tILGlCQUNnQyxJQUE1Q2xILEVBQVNtSCx3QkFBd0JyaUIsZUFDNUJrYixFQUFTbUgsdUJBR2xCbkgsRUFBU29ILG1CQUFvQixFQUM3QixNQUFNQyxFQUFpQnJILEVBQVN3QyxTQUFTMWQsUUFBVSxFQUVuRCxHQURBa2IsRUFBU3dDLFFBQVV4QyxFQUFTd0MsU0FBU25YLE9BQVF4TCxHQUFpQixnQ0FBWEEsRUFBRXZCLE9BQTJDLEdBQzVGMGhCLEVBQVN3QyxRQUFRMWQsU0FBV3VpQixFQUFnQixDQUM5QyxNQUFNQyxFQUFhaHBCLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxVQUFXLHVCQUNyRGMsRUFBWWEsSUFBSSxJQUFNL0IsRUFBR1EsU0FBU3FNLEdBQUdxYyxFQUFZLENBQUVwYyxPQUFPLElBQ2xFLENBQ2dDLElBQTVCOFUsRUFBU3dDLFFBQVExZCxlQUNaa2IsRUFBU3dDLGNBRVpwa0IsRUFBR1EsU0FBU1AsVUFBVWdvQixFQUFlNVosRUFBSzZCLEtBQUswUixFQUFVLENBQUV6UixXQUFXLEtBRTVFZ0osR0FBVSxPQUFRLENBQUMsTUFBTyw0QkFBNkJ4WixFQUFPUyxVQUVsRSxDQU9BLFNBQVNrb0IsR0FBZXZLLEdBQ3RCLE1BQU9vTCxHQUFTcEwsRUFBUWhYLE1BQU0sS0FDOUIsT0FBT3FpQixPQUFPRCxFQUNoQixDQ3hHTzFwQixlQUFlNHBCLEdBQVkxcEIsR0FDaEMsT0FBT1osRUFBT0MsMEJBQTBCLGNBQWVTLFVBQ3JELE1BQU80YixFQUFPZCxHQUFRTyxHQUFXQyxjQUFjcGIsRUFBTytNLFlBQWMsSUFDcEUsSUFBSzJPLElBQVVkLEVBQU0sT0FDckIsR0FBYyxnQkFBVmMsR0FBcUMsbUJBQVZBLEVBQTRCLE9BQzNELElBQUtRLEdBQWVSLEdBQVEsT0FFNUIsTUFBTUcsRUFBVUosR0FBV0MsR0FFM0IsVUFDUWlPLEdBQVc5TixFQUFTSCxFQUFPZCxFQUFNLHdCQUF5QixnQkFDMUQrTyxHQUFXOU4sRUFBU0gsRUFBT2QsRUFBTSxxQkFBc0IsZ0JBQ3ZEK08sR0FBVzlOLEVBQVNILEVBQU9kLEVBQU0sa0JBQW1CLGdCQUNwRCtPLEdBQVc5TixFQUFTSCxFQUFPZCxFQUFNLG1CQUFvQixnQkFDckQrTyxHQUFXOU4sRUFBU0gsRUFBT2QsRUFBTSxzQkFBdUIsZ0JBQ3hEK08sR0FBVzlOLEVBQVNILEVBQU9kLEVBQU0sa0NBQW1DLGdCQUNwRStPLEdBQVc5TixFQUFTSCxFQUFPZCxFQUFNLDBCQUEyQixnQkFDNUQrTyxHQUFXOU4sRUFBU0gsRUFBT2QsRUFBTSx1QkFBd0IsZ0JBQ3pEK08sR0FBVzlOLEVBQVNILEVBQU9kLEVBQU0sNkJBQThCLGdCQUMvRCtPLEdBQVc5TixFQUFTSCxFQUFPZCxFQUFNLFdBQVksZ0JBQzdDK08sR0FBVzlOLEVBQVNILEVBQU9kLEVBQU0sY0FBZSxnQkFDaEQrTyxHQUFXOU4sRUFBU0gsRUFBT2QsRUFBTSxZQUFhLGdCQUM5QytPLEdBQVc5TixFQUFTSCxFQUFPZCxFQUFNLFdBQVksZ0JBQzdDK08sR0FBVzlOLEVBQVNILEVBQU9kLEVBQU0sWUFBYSxnQkFDOUMrTyxHQUFXOU4sRUFBU0gsRUFBT2QsRUFBTSxzQkFBdUIsZ0JBQ3hEK08sR0FBVzlOLEVBQVNILEVBQU9kLEVBQU0saUJBQWtCLGdCQUNuRCtPLEdBQVc5TixFQUFTSCxFQUFPZCxFQUFNLHlCQUEwQixnQkFDM0QrTyxHQUFXOU4sRUFBU0gsRUFBT2QsRUFBTSxzQkFBdUIsZ0JBQ3hEK08sR0FBVzlOLEVBQVNILEVBQU9kLEVBQU0sc0JBQXVCLGdCQUN4RCtPLEdBQVc5TixFQUFTSCxFQUFPZCxFQUFNLGlCQUFrQixnQkFDbkQrTyxHQUFXOU4sRUFBU0gsRUFBT2QsRUFBTSxpQkFBa0IsZ0JBQ25EK08sR0FBVzlOLEVBQVNILEVBQU9kLEVBQU0saUJBQWtCLGdCQUNuRCtPLEdBQVc5TixFQUFTSCxFQUFPZCxFQUFNLGlCQUFrQixnQkFDbkQrTyxHQUFXOU4sRUFBU0gsRUFBT2QsRUFBTSxpQkFBa0IsZ0JBQ25EK08sR0FBVzlOLEVBQVNILEVBQU9kLEVBQU0sa0JBQW1CLGdCQUNwRCtPLEdBQVc5TixFQUFTSCxFQUFPZCxFQUFNLG9CQUFxQixnQkFDdEQrTyxHQUFXOU4sRUFBU0gsRUFBT2QsRUFBTSxtQkFBb0IsZ0JBQ3JEK08sR0FBVzlOLEVBQVNILEVBQU9kLEVBQU0sOEJBQStCLGdCQUNoRStPLEdBQVc5TixFQUFTSCxFQUFPZCxFQUFNLGlCQUFrQixnQkFDbkQrTyxHQUFXOU4sRUFBU0gsRUFBT2QsRUFBTSxxQkFBc0IsZ0JBQ3ZEK08sR0FBVzlOLEVBQVNILEVBQU9kLEVBQU0sZUFBZ0IsZ0JBQ2pEK08sR0FBVzlOLEVBQVNILEVBQU9kLEVBQU0sZ0JBQWlCLGdCQUNsRCtPLEdBQVc5TixFQUFTSCxFQUFPZCxFQUFNLHdCQUF5QixnQkFDMUQrTyxHQUFXOU4sRUFBU0gsRUFBT2QsRUFBTSxzQkFBdUIsZ0JBQ3hEK08sR0FBVzlOLEVBQVNILEVBQU9kLEVBQU0sc0JBQXVCLGdCQUN4RCtPLEdBQVc5TixFQUFTSCxFQUFPZCxFQUFNLFVBQVcsZ0JBQzVDK08sR0FBVzlOLEVBQVNILEVBQU9kLEVBQU0saUJBQWtCLGdCQUNuRCtPLEdBQVc5TixFQUFTSCxFQUFPZCxFQUFNLHFCQUFzQixnQkFDdkQrTyxHQUFXOU4sRUFBU0gsRUFBT2QsRUFBTSx3QkFBeUIsZ0JBQzFEK08sR0FBVzlOLEVBQVNILEVBQU9kLEVBQU0sdUJBQXdCLGdCQUN6RCtPLEdBQVc5TixFQUFTSCxFQUFPZCxFQUFNLHdCQUF5QixnQkFFMURnUCxHQUFZL04sRUFBU0gsRUFBT2QsRUFBTSxhQUNsQ2dQLEdBQVkvTixFQUFTSCxFQUFPZCxFQUFNLHVCQUNsQ2dQLEdBQVkvTixFQUFTSCxFQUFPZCxFQUFNLG1CQUNsQ2dQLEdBQVkvTixFQUFTSCxFQUFPZCxFQUFNLHFCQUNsQ2dQLEdBQVkvTixFQUFTSCxFQUFPZCxFQUFNLDBCQUNsQ2dQLEdBQVkvTixFQUFTSCxFQUFPZCxFQUFNLHFCQUNsQ2dQLEdBQVkvTixFQUFTSCxFQUFPZCxFQUFNLGlCQUNsQ2dQLEdBQVkvTixFQUFTSCxFQUFPZCxFQUFNLGtCQUNsQ2dQLEdBQVkvTixFQUFTSCxFQUFPZCxFQUFNLGlCQUVsQ2dQLEdBQVkvTixFQUFTSCxFQUFPZCxFQUFNLGVBQ2xDZ1AsR0FBWS9OLEVBQVNILEVBQU9kLEVBQU0sMEJBQ2xDZ1AsR0FBWS9OLEVBQVNILEVBQU9kLEVBQU0sa0JBQ2xDZ1AsR0FBWS9OLEVBQVNILEVBQU9kLEVBQU0sMEJBQ2xDZ1AsR0FBWS9OLEVBQVNILEVBQU9kLEVBQU0sd0JBQ2xDZ1AsR0FBWS9OLEVBQVNILEVBQU9kLEVBQU0sZ0JBQzFDLENBQUUsTUFBT2xiLEdBQ1BGLFFBQVFxcUIsS0FBSywyQkFBNkJucUIsR0FBNkJFLE9BQVNGLEVBQ2xGLEdBRUosQ0FFQUksZUFBZTZwQixHQUFXOU4sRUFBa0JILEVBQWVkLEVBQWN0YixFQUFjd3FCLEdBQ3JGLFVBRVFqTyxFQUFRa08sUUFBUSxvQ0FBcUMsQ0FDekRyTyxRQUNBZCxPQUNBdGIsT0FDQXdxQixTQUVKLENBQUUsWUFFTWpPLEVBQVFrTyxRQUFRLDRDQUE2QyxDQUNqRXJPLFFBQ0FkLE9BQ0F0YixPQUNBd3FCLFNBRUosQ0FDRixDQUVBaHFCLGVBQWU4cEIsR0FBWS9OLEVBQWtCSCxFQUFlZCxFQUFjdGIsR0FDeEUsVUFFUXVjLEVBQVFrTyxRQUFRLDZDQUE4QyxDQUNsRXJPLFFBQ0FkLE9BQ0F0YixRQUVKLENBQUUsTUFDQSxDQUVKLENDdkdBLE1BQU0wcUIsR0FBMEIsQ0FBQyw0QkFBNkIsYUFBYyxxQkFFckVscUIsZUFBZW1xQixHQUFhanFCLEdBQ2pDLE9BQU9aLEVBQU9DLDBCQUEwQixlQUFnQlMsVUFDdEQsTUFBTzRiLEVBQU9kLEdBQVFPLEdBQVdDLGNBQWNwYixFQUFPK00sWUFBYyxJQUNwRSxJQUFLMk8sSUFBVWQsR0FBa0IsbUJBQVZjLEVBQTRCLE9BQ25ELElBQUtRLEdBQWVSLEtBQVd6YyxFQUFRRSxrQkFBbUIsT0FFMUQsTUFBTTJFLEVBQVNvbUIsRUFBT2xxQixTQUFTOEQsUUFBVSxDQUFBLEVBQ3pDLEdBQW1DLElBQS9CNEQsT0FBTzBJLEtBQUt0TSxHQUFRaUQsT0FBYyxPQUV0QyxNQUFNOFUsRUFBVUosR0FBV0MsR0FFM0IsSUFDRSxJQUFLLE1BQU15TyxLQUFjSCxHQUN2QixVQUVRbk8sRUFBUWtPLFFBQVEsNkRBQThELENBQ2xGck8sUUFDQWQsT0FDQXdQLFlBQWFELEdBRWpCLENBQUUsTUFDQSxDQUtKLE1BQU1sUyxRQUFpQjRELEVBQVFrTyxRQUFRLHVEQUF3RCxDQUM3RnJPLFFBQ0FkLFVBRUloVCxJQUFFQSxFQUFLeWlCLE9BQVFDLEdBQVVyUyxFQUFTc1MsV0FFbENDLEVBQU9DLE1BRWIsSUFBSyxNQUFPbnJCLEVBQU1vckIsS0FBV2hqQixPQUFPQyxRQUFRN0QsR0FBUyxDQUNuRCxHQUNXLGVBQVR4RSxHQUNTLCtCQUFUQSxHQUNTLGtDQUFUQSxFQUVBLFNBSUYsTUFBTXFyQixFQUFTSCxFQUFPSSxZQUFZaGpCLEVBQUs0aUIsRUFBT0ssZ0JBQWdCQyxVQUN4REMsRUFBU1AsRUFBT1EsWUFBWU4sR0FHNUJPLEVBQVdULEVBQU9VLGdCQUFnQkgsRUFBUUosR0FHMUNRLEVBQVlYLEVBQU9ZLFVBQVVILEVBQVVULEVBQU9LLGdCQUFnQkMsZ0JBRzlEalAsRUFBUWtPLFFBQVEsMERBQTJELENBQy9Fck8sUUFDQWQsT0FDQXdQLFlBQWE5cUIsRUFDYityQixnQkFBaUJGLEVBQ2pCZCxPQUFRQyxHQUVaLENBQ0YsQ0FBRSxNQUFPNXFCLEdBQ1BGLFFBQVFxcUIsS0FBSyw0QkFBOEJucUIsR0FBNkJFLE9BQVNGLEVBQ25GLEdBRUosQ0N2RU9JLGVBQWV3ckIsR0FBb0J0ckIsR0FDeEMsTUFBTzBiLEVBQU9kLEdBQVFPLEdBQVdDLGNBQWNwYixFQUFPK00sWUFBYyxJQUNwRSxJQUFLMk8sSUFBVWQsRUFBTSxPQUNyQixHQUFjLGdCQUFWYyxHQUFxQyxtQkFBVkEsRUFBNEIsT0FDM0QsSUFBS1EsR0FBZVIsR0FBUSxPQUU1QixNQUFNRyxFQUFVSixHQUFXQyxTQUdyQjZQLEVBQVUsSUFDZDFQLEVBQVFrTyxRQUFRLDhCQUErQixDQUM3Q3JPLFFBQ0FkLE9BQ0E0USxrQkFBa0IsRUFDbEJDLG9CQUFvQixFQUNwQkMsb0JBQW9CLEVBQ3BCQyxvQkFBb0IsRUFDcEJDLHFCQUFxQixFQUNyQkMsd0JBQXdCLEVBQ3hCQywwQkFBMkIsV0FDM0JDLDRCQUE2QixRQUM3QkMsUUFBUyxDQUNQLHVCQUF3QixpQkFFdEJoc0IsRUFBTytNLFlBQVk4QixXQUFXLHVCQUF5QixDQUFFMmMsa0JBQWtCLEdBQVMsQ0FBQSxJQUc5RixDQ3RCQSxNQUFNUyxHQUErQixhQUUvQkMsR0FBWSxDQUNoQiwyQkFBNEIsOFRBUUVELHFEQUNBQSxzZ0NBaUM5QjNxQixRQUdLeEIsZUFBZXFzQixHQUF3Qm5zQixHQUM1QyxPQUFPWixFQUFPQywwQkFBMEIsMEJBQTJCUyxVQUNqRSxJQUFLLE1BQU80TixFQUFVdE4sS0FBZXNILE9BQU9DLFFBQVF1a0IsSUFBWSxDQUM5RCxNQUFNbHJCLEVBQVVvckIsR0FBNEJoc0IsRUFBWUosR0FDbERZLEVBQVdMLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxVQUFXaU4sR0FDekQsR0FBSXJOLEVBQUcwQixXQUFXbkIsR0FBVyxDQUMzQixNQUFNVixRQUFtQkcsRUFBR1EsU0FBU0MsU0FBU0YsRUFBVSxRQUN4RCxHQUFJeXJCLEVBQVNuc0IsRUFBWWMsR0FBV0EsRUFBUStGLE9BQVMsRUFDbkQsUUFFSixPQUVNMUcsRUFBR1EsU0FBU0ksTUFBTVYsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLFdBQVksQ0FBRVUsV0FBVyxVQUN4RUksRUFBWWEsSUFBSSxJQUFNMUIsRUFBT0ssYUFBYUgsRUFBVUksR0FDNUQsR0FFSixDQUVBLFNBQVNvckIsR0FBNEJFLEVBQWtCdHNCLEdBQ3JELE1BQU11c0IsRUFBd0J2c0IsRUFBT2tPLE1BQVEsVUFBWSxPQUN6RCxPQUFPb2UsRUFBU2pyQixXQUFXNHFCLEdBQThCTSxFQUMzRCxDQ0xBLE1BQU1DLEdBQWlCQyxFQUFFaGxCLE9BQU8sQ0FDOUJrSyxNQUFPOGEsRUFDSmhsQixPQUFPLENBQ052QyxJQUFLdW5CLEVBQUVDLE9BQU9ELEVBQUVFLFNBQVVGLEVBQUVFLFVBQVVDLFdBQ3RDQyxJQUFLSixFQUFFQyxPQUFPRCxFQUFFRSxTQUFVRixFQUFFRSxVQUFVQyxXQUN0QzVvQixHQUFJeW9CLEVBQUVDLE9BQU9ELEVBQUVFLFNBQVVGLEVBQUVFLFVBQVVDLFdBQ3JDeFUsS0FBTXFVLEVBQUVDLE9BQU9ELEVBQUVFLFNBQVVGLEVBQUVFLFVBQVVDLGFBRXhDQSxhQUdFOXNCLGVBQWVndEIsR0FDcEJyc0IsRUFDQW9NLEdBRUEsTUFBTWtnQixFQUFrQnhzQixFQUFLcUIsUUFBUW5CLEVBQVMsZ0JBQzlDLElBQ0UsTUFBTTBXLEVBQXlCOVcsRUFBRzBCLFdBQVdnckIsR0FDN0MsSUFBSWhqQixFQUE0QyxDQUFBLEVBQzVDQyxFQUFrRCxDQUFBLEVBQ2xENUUsRUFBMkIsQ0FBQSxFQUMzQjRuQixHQUFhLEVBQ2pCLEdBQUk3VixFQUF3QixDQUMxQixNQUFNOFYsRUFBa0I1c0IsRUFBR3NULGFBQWFvWixFQUFpQixRQUN6RDNuQixFQUFjaU8sS0FBS0MsTUFBTTJaLEdBQ3pCbGpCLEVBQWUzRSxFQUFZMkUsY0FBZ0IsQ0FBQSxFQUMzQ0MsRUFBa0I1RSxFQUFZNEUsaUJBQW1CLENBQUEsRUFDakRnakIsRUFBa0MsV0FBckI1bkIsRUFBWWdiLElBQzNCLENBRUEsSUFBSThNLEVBQTRCLEdBQzVCQyxFQUEyQixHQUMvQixJQUNFLE1BQU1DLEVBQW9CN3NCLEVBQUtxQixRQUFRbkIsRUFBUyxtQkFDMUMwbEIsRUFBTzlTLEtBQUtDLFlBQVkrWixFQUFJdnNCLFNBQVNzc0IsRUFBbUIsU0FNOURGLEVBQWtCL0csR0FBTTVhLFVBQVksR0FDcEM0aEIsRUFBaUJoSCxHQUFNMUIsU0FBUzZJLFFBQVUsRUFDNUMsQ0FBRSxNQUNBLENBR0YsTUFBTXBrQixFQUMyQyxhQUEvQzNJLEVBQUtvTixTQUFTcE4sRUFBS3FCLFFBQVFuQixFQUFTLFNBQ25DSixFQUFHMEIsV0FBV3hCLEVBQUtxQixRQUFRbkIsRUFBUyxLQUFNLEtBQU0saUJBRW5ELElBQUk4c0IsRUFDQXJrQixJQUNGcWtCLFFBeUpOenRCLGVBQTZCVyxFQUFpQjJFLEdBQzVDLE1BQU1vb0IsRUFBTUMsRUFBVWh0QixHQUVoQml0QixTQURnQkYsRUFBSUcsWUFBVyxJQUNkOXJCLEtBQU0rckIsR0FBaUIsV0FBWEEsRUFBRXR1QixNQUMvQnV1QixFQUFZSCxHQUFRSSxLQUFLNVYsT0FBU3dWLEdBQVFJLEtBQUtsakIsS0FDckQsR0FBeUIsaUJBQWRpakIsRUFBd0IsQ0FDakMsTUFBTTFILFFBQWE0SCxHQUFnQkYsR0FDbkMsR0FBSTFILEVBQU0sT0FBT0EsQ0FDbkIsQ0FFQSxNQUFNaGpCLEVBQXdDLGlCQUEzQmlDLEVBQVkySCxXQUEwQjNILEVBQVkySCxXQUFhM0gsRUFBWTJILFlBQVk1SixJQUMxRyxHQUFJQSxFQUFLLENBQ1AsTUFBTWdqQixRQUFhNEgsR0FBZ0I1cUIsR0FDbkMsR0FBSWdqQixHQUF5QixjQUFqQkEsRUFBSy9MLFFBQXlCLE9BQU8rTCxDQUNuRCxDQUNGLENBeEt1QjZILENBQWN2dEIsRUFBUzJFLElBRzFDLElBQUlzZCxFQW9IUixTQUFnQ2ppQixHQUM5QixNQUFNd3RCLEVBQVUxdEIsRUFBS3FCLFFBQVFuQixHQUM3QixPQUNFSixFQUFHMEIsV0FBV3hCLEVBQUtDLEtBQUt5dEIsRUFBUyxlQUNqQzV0QixFQUFHMEIsV0FBV3hCLEVBQUtDLEtBQUt5dEIsRUFBUyxnQkFDakM1dEIsRUFBRzBCLFdBQVd4QixFQUFLQyxLQUFLeXRCLEVBQVMsa0JBRXJDLENBM0g2QkMsQ0FBdUJ6dEIsR0FDaEQsSUFBSyxNQUFNMHRCLElBQVUsQ0FBQyxPQUFRLE9BQVEsVUFDcEMsR0FBSTl0QixFQUFHMEIsV0FBV3hCLEVBQUtxQixRQUFRbkIsRUFBUyxJQUFJMHRCLGNBQW9CLENBQzlEekwsR0FBcUIsRUFDckIsS0FDRixDQUdGLElBQUl2aUIsRUFBYSxHQUNqQixJQUNFQSxRQUFtQmt0QixFQUFJdnNCLFNBQVNQLEVBQUtxQixRQUFRbkIsRUFBUyxjQUFlLE9BQ3ZFLENBQUUsTUFDQSxDQUlGLE1BQU0ydEIsRUFBZTd0QixFQUFLcUIsUUFBUW5CLEVBQVMsYUFDM0MsSUFBSWlSLEVBQ0osSUFDRSxNQUFNMmMsUUFBcUJoQixFQUFJdnNCLFNBQVNzdEIsRUFBYyxRQUN0RDFjLEVBQVc4YSxHQUFlbFosTUFBTUQsS0FBS0MsTUFBTSthLEdBQzdDLENBQUUsTUFDQSxDQUdGLE1BQU1DLEVBQThDLGlCQUF4QmYsR0FBVWdCLFVBQXlCaEIsRUFBU2dCLGVBQVlub0IsRUFDcEYsSUFBSW9vQixFQUNBQyxFQUNKLEdBQUlILEVBQWMsQ0FDaEIsTUFBTUksRUFBWUosRUFBYWxuQixNQUFNLEtBQ2pDc25CLEVBQVUzbkIsUUFBVSxJQUN0QnluQixFQUFhRSxFQUFVLEdBQ3ZCRCxFQUFXQyxFQUFVLEdBRXpCLENBQ0EsTUFBTTNoQixFQUFhdWhCLEVBQWUsVUFBVUEsU0FBaUJsb0IsRUFDdkRwRyxFQUF3QixDQUM1QlMsVUFDQU4sYUFDQStJLFNBQ0E2RSxjQUFvQyxJQUF0QndmLEdBQVV0TyxRQUN4QjBQLHdCQUF5QnZwQixFQUFZMGIsTUFDckMvVCxhQUNBeWhCLGFBQ0FDLFdBQ0FoYyxrQkFBbUJ0TixRQUNqQjRILEdBQVk4QixXQUFXLHdCQUEwQjlCLEdBQVk4QixXQUFXLDJCQUUxRVgsTUFBT3JCLEdBQVlxQixPQUFTN04sRUFBRzBCLFdBQVd4QixFQUFLQyxLQUFLQyxFQUFTLGFBQzdEbXVCLGFBQWM1QixFQUNkak8scUJBQXNCZ08sRUFBZ0I1cUIsU0FBUyxHQUFHNUIsRUFBS3N1QiwwQkFDdkQxbEIsMkJBQTRCMmxCLEdBQVksMkJBQTRCcnVCLEdBQ3BFUix3QkFBeUJFLEdBQWNFLEVBQUcwQixXQUFXeEIsRUFBS3FCLFFBQVFuQixFQUFTLHVCQUMzRXdXLG1CQUFvQjVXLEVBQUcwQixXQUFXeEIsRUFBS3FCLFFBQVFuQixFQUFTLFlBQ3hEeVcsaUJBQWtCN1csRUFBRzBCLFdBQVd4QixFQUFLcUIsUUFBUW5CLEVBQVMsV0FDdEQwVyx1QkFBd0I5VyxFQUFHMEIsV0FBV3hCLEVBQUtxQixRQUFRbkIsRUFBUyxpQkFDNUQ4VyxzQkFBdUJsWCxFQUFHMEIsV0FBV3hCLEVBQUtxQixRQUFRbkIsRUFBUyxnQkFDM0QyVyxrQkFBbUIvVyxFQUFHMEIsV0FBV3hCLEVBQUtxQixRQUFRbkIsRUFBUyxZQUN2RDRXLHVCQUF3QmhYLEVBQUcwQixXQUFXeEIsRUFBS3FCLFFBQVFuQixFQUFTLGlCQUM1RDZXLHdCQUF5QmpYLEVBQUcwQixXQUFXeEIsRUFBS3FCLFFBQVFuQixFQUFTLGtCQUM3RHN1Qiw4QkFBK0IxdUIsRUFBRzBCLFdBQVd4QixFQUFLcUIsUUFBUW5CLEVBQVMsVUFBVyxrQkFDOUUyWSxzQkFBdUIwVixHQUFZLCtDQUFnRHJ1QixHQUNuRjZZLHNCQUF1QndWLEdBQVksK0NBQWdEcnVCLEdBQ25GeWEsb0JBQXFCNFQsR0FBWSw4QkFBK0JydUIsR0FDaEU0WSxnQ0FBaUN5VixHQUFZLDJEQUE0RHJ1QixHQUN6RzhZLGdDQUFpQ3VWLEdBQVksMkRBQTREcnVCLEdBQ3pHbWxCLDhCQUErQmtKLEdBQVksMENBQTJDcnVCLEdBQ3RGa1MscUJBQXNCdk4sRUFBWUMsVUFBVSxxQkFDNUNrSSxVQUFXLENBQ1RpSyxRQUFTek4sRUFBYXlOLE1BQ3RCQyxXQUFZek4sRUFBZ0Isa0JBQzVCOEksWUFBYTlJLEVBQWdCLGVBQzdCOE4sV0FBWTNYLEVBQVdnQyxTQUFTLHlCQUNoQzRRLFFBQVNoSixFQUFhZ0osTUFDdEJDLE9BQVFqSixFQUFhaUosS0FDckIyRSxpQkFDSTVOLEVBQWEsdUJBQXlCQyxFQUFnQix1QkFBeUJBLEVBQWdCc1UsV0FDbkc1RyxTQUFVM04sRUFBYSxxQkFBdUJDLEVBQWdCME4sT0FDOURnSyxVQUFXMVgsRUFBZ0IwWCxRQUMzQjlKLGNBQWU3TixFQUFhLGdCQUM1QnlELG1CQUNFeEQsRUFBZ0IscUJBQ2hCa2pCLEVBQWdCbm1CLE9BQVMsR0FDekJvbUIsRUFBZXBtQixPQUFTLEdBRTFCOFEsWUFBYTdOLEVBQWdCLG9CQUM3QjRVLEtBQU03VSxFQUFhLHNCQUF3QkMsRUFBZ0Isb0JBRTdEaUMsUUFBUyxDQUNQVixTQUFVMmhCLEVBQ1Y4QixPQUFRN0IsRUFBZWhyQixTQUFTLDRCQUNoQzhzQixJQUFLOUIsRUFBZWhyQixTQUFTLDBCQUUvQnVnQixxQkFDQXRkLGNBQ0FzTSxZQUtGLEdBSEsxUixFQUFPa08sUUFDVmxPLEVBQU93VixXQXNDYixTQUFnQ3hWLEdBQzlCLEdBQUlBLEVBQU91TixVQUFVeUYsS0FDbkIsTUFBTyxrQ0FDRixHQUFJaFQsRUFBT3NaLHNCQUNoQixPQUFPdFosRUFBT2tiLG9CQUFzQixzQ0FBd0MsZ0NBRTVFLEdBQUlsYixFQUFPa2Isb0JBQ1QsTUFBTyxzQ0FDRixHQUFJbGIsRUFBT29aLHNCQUNoQixNQUFPLCtCQUdiLENBbEQwQjhWLENBQXVCbHZCLElBRzNDQSxFQUFPaVgsb0JBQ1BqWCxFQUFPa1gsa0JBQ1BsWCxFQUFPbVgsd0JBQ1BuWCxFQUFPdVgsdUJBQ1B2WCxFQUFPb1gsbUJBQ1BwWCxFQUFPcVgsd0JBQ1ByWCxFQUFPc1gsd0JBRVAsT0FBT3RYLENBRVgsQ0FBRSxNQUNBLENBRUosQ0FXQSxTQUFTOHVCLEdBQVlLLEVBQWlCMXVCLEdBQ3BDLE9BQU91SCxFQUFHMlcsU0FBU3dRLEVBQVMsQ0FBRWpuQixLQUFLLEVBQU1DLElBQUsxSCxFQUFTMkgsT0FBUVAsSUFBY2QsT0FBUyxDQUN4RixDQXdDQWpILGVBQWVpdUIsR0FBZ0IxUyxHQUM3QixNQUFPK1QsRUFBSzl2QixHQUFRNmIsR0FBV0MsY0FBY0MsR0FDN0MsSUFBSytULElBQVE5dkIsRUFBTSxPQUVuQixNQUFNK3ZCLEVBQU0sQ0FBRWQsVUFBVyxHQUFHYSxLQUFPOXZCLEtBQ25DLElBRUUsTUFBTTJZLFFBQWlCd0QsS0FBYXNPLFFBQVEsNEJBQTZCLENBQ3ZFck8sTUFBTzBULEVBQ1B4VSxLQUFNdGIsSUFFUm9JLE9BQU80bkIsT0FBT0QsRUFBS3BYLEVBQVNzUyxLQUM5QixDQUFFLE1BQU83cUIsR0FDUCxNQUFNNnZCLEVBUVYsU0FBbUM3dkIsR0FDakMsSUFBS0EsR0FBMEIsaUJBQVZBLEVBQW9CLE9BRXpDLE1BQU11WSxFQUNKLGFBQWN2WSxFQUNUQSxFQUEyRnVZLGNBQzVGN1IsRUFDQTBULEVBQVM3QixHQUFVNkIsUUFBV3BhLEVBQThCb2EsT0FDbEUsR0FBZSxNQUFYQSxHQUE2QixNQUFYQSxFQUFnQixPQUV0QyxNQUFNMFYsRUFBV3ZYLEdBQVUrVCxTQUFTd0QsU0FDcEMsR0FBd0IsaUJBQWJBLEVBQXVCLE9BRWxDLE1BQU9KLEVBQUs5dkIsR0FBUTZiLEdBQVdDLGNBQWNvVSxHQUM3QyxJQUFLSixJQUFROXZCLEVBQU0sT0FFbkIsTUFBTyxHQUFHOHZCLEtBQU85dkIsR0FDbkIsQ0F6QitCbXdCLENBQTBCL3ZCLEdBQ2pENnZCLElBQ0ZGLEVBQUlkLFVBQVlnQixFQUVwQixDQUNBLE9BQU9GLENBQ1QsQ0N2VE8sU0FBU0ssR0FBMEMxdkIsR0FDeEQsT0FBT0EsRUFBTytlLHVCQUF1RixJQUEvRC9lLEVBQU9vRixhQUFhOUYsTUFBTXVQLFdBSHJDLDhCQUk3QixPQ3lDQS9PLGlCQUNFLE1BQU02dkIsUUFBYUMsRUFBTXZWLFFBQVFzVixLQUFLam1CLE1BQU0sSUFDekN4RyxRQUFRLGVBQWdCLHVEQUF5RDBzQixJQUNoRkEsRUFBTUMsV0FBVyxRQUFTLENBQ3hCQyxTQUFVLDZCQUNWQyxPQUFPLEVBQ1AzUCxLQUFNLFNBQ040UCxRQUFTLENBQUMsU0FHYi93QixRQUFRLENBQ1B1RSxJQUFLLENBQ0hnUCxZQUFhLG9EQUNiNE4sS0FBTSxVQUNONFAsU0FBUyxFQUNUQyxNQUFPLEtBRVRDLFNBQVUsQ0FDUjFkLFlBQWEsK0JBQ2I0TixLQUFNLFVBQ040UCxTQUFTLEVBQ1RDLE1BQU8sS0FFVEUsUUFBUyxDQUNQM2QsWUFBYSx3Q0FDYjROLEtBQU0sVUFDTjRQLFNBQVMsRUFDVEMsTUFBTyxPQUdWN1IsUUFzSUwsV0FDRSxJQUFJZ1MsRUFBaUI3dkIsRUFBS1csUUFBUSxJQUFJbXZCLGdCQUFnQmx0QixLQUFLbXRCLFVBQzNELE1BQVFqd0IsRUFBRzBCLFdBQVd4QixFQUFLQyxLQUFLNHZCLEVBQWdCLGtCQUM5Q0EsRUFBaUI3dkIsRUFBS1csUUFBUWt2QixHQUtoQyxPQUhvQi9jLEtBQUtDLE1BQU1qVCxFQUFHc1QsYUFBYXBULEVBQUtDLEtBQUs0dkIsRUFBZ0IsZ0JBQWlCLFNBR3ZFaFMsT0FDckIsQ0EvSWFtUyxJQUNSQyxTQUFTYixLQUNaMXdCLEVBQVFDLFVBQVl5d0IsRUFBS1EsUUFDekJseEIsRUFBUUUsa0JBQW9Cd3dCLEVBQUtuc0IsSUFFakMsSUFBSyxNQUFNeWlCLEtBQWUwSixFQUFLYyxNQUFtQixDQUNoRCxNQUFNQyxFQUFrQm53QixFQUFLQyxLQUFLeWxCLEVBQWEsWUFFekMwSyxTQURpQkMsRUFBaUIsSUFBTXZ3QixFQUFHUSxTQUFTeUksUUFBUW9uQixFQUFpQixDQUFFbm5CLGVBQWUsTUFBYSxJQUNyRitELE9BQVF1akIsR0FBTUEsRUFBRTNtQixlQUFleEksSUFBS212QixHQUFNdHdCLEVBQUtDLEtBQUtrd0IsRUFBaUJHLEVBQUV2eEIsYUFFN0ZnSixFQUFzQyxDQUFDMmQsS0FBZ0IwSyxJQUU3RCxNQUFNOWpCLFFBQW1CaWdCLEdBQWlCN0csR0FFMUMsSUFBS3BaLEVBQVksQ0FDZnJOLFFBQVFFLE1BQU0scUNBQXFDdW1CLEtBQ25ELFFBQ0YsQ0FDQSxNQUFNNkssRUFBc0JuZ0IsRUFBUzlELEdBSy9Ca2tCLFNBSGtDdm9CLFFBQVF0RCxJQUM5Q3lyQixFQUFZanZCLElBQUtzdkIsR0FBZWxFLEdBQWlCa0UsRUFBWW5rQixNQUVYUyxPQUFRdE4sS0FBYUEsR0FDbkVpeEIsRUFBb0IsQ0FBQ3BrQixLQUFla2tCLEdBRTFDLEdBQUk5eEIsRUFBUUMsVUFDVixJQUFLLE1BQU1jLEtBQVVpeEIsRUFDbkJ6eEIsUUFBUUMsS0FBS08sU0FLWHFvQixHQUFrQnhiLEdBQ3BCQSxFQUFXcUIsYUFDUHdGLEdBQW1CN0csR0FHM0IsTUFBTXFrQixHQUNIcGtCLEVBQXdCRCxFQUFXRSxjQUNuQ0YsRUFBV0UsWUFBWThCLFdBQVcsd0JBQ2pDaEMsRUFBV0UsWUFBWThCLFdBQVcsaUNBQ2hDckcsUUFBUXRELElBQUksQ0FDaEJuRixFQUFjOE0sR0FDZC9FLEVBQWtCK0UsR0FDbEJpa0IsRUFBb0JLLEtBQUssSUFBTXBOLEdBQWVsWCxJQUM5QytFLEdBQTBCL0UsRUFBWW9rQixHQUN0Q3BjLEdBQXFCaEksR0FDckJ5SSxHQUFxQnpJLEdBQ3JCcUosR0FBcUJySixFQUFZb2tCLEdBQ2pDdmEsR0FBcUI3SixHQUNyQjhKLEdBQXNCOUosR0FDdEJzZixHQUF3QnRmLEdBQ3hCc00sR0FBcUJ0TSxHQUNyQm1ZLEdBQXFCblksR0FDckIyWCxHQUFrQjNYLE1BQ2Rxa0IsRUFBcUIsQ0FBQ3RrQixFQUFrQkMsSUFBZSxHQUMzRDZjLEdBQVk3YyxHQUNab2QsR0FBYXBkLEdBQ2J5ZSxHQUFvQnplLEdBQ3BCaVYsR0FBb0NqVixHQUNwQ3FXLEdBQXFCclcsV0FFakJ0TCxFQUFZK1AsYUFFbEIsTUFBTXpRLEVBQTRCLEdBQ2xDLElBQUssTUFBTWIsS0FBVWl4QixFQUNmdkIsR0FBMEMxdkIsTUFHMUNBLEVBQU9zWix1QkFBeUJ0WixFQUFPdVosa0NBQ3pDMVksRUFBUytKLEtBQUs5QixFQUFtQjlJLEVBQVFBLEVBQU9rSixPQUFTK25CLEVBQW9CLENBQUNqeEIsS0FFNUVBLEVBQU91TixVQUFVb0ssZ0JBQ25COVcsRUFBUytKLEtBQUtsSCxFQUFvQjFELElBRWhDQSxFQUFPdU4sVUFBVXlGLE1BQ25CblMsRUFBUytKLEtBQUtuSixFQUFrQnpCLFVBRTVCNlcsR0FBa0I3VyxFQUFRNk0sU0FDMUJ0TCxFQUFZK1AsY0FDYnRSLEVBQU9rSixRQUFXbEosRUFBT21YLGdDQUd4QnFNLEdBQXVCeGpCLFNBQ3ZCMGMsR0FBb0IxYyxFQUFRNk0sRUFBWThpQixFQUFLTyxVQUVuRHJ2QixFQUFTK0osS0FBS3NZLEdBQXFCbGpCLElBQy9CQSxFQUFPK3VCLCtCQUFpQy91QixFQUFPbVgsd0JBQ2pEdFcsRUFBUytKLEtBQUtzZCxHQUF1QmxvQixLQUVuQ0EsRUFBT3NaLHVCQUF5QnRaLEVBQU91WixrQ0FDekMxWSxFQUFTK0osS0FBS3ljLEdBQWlCcm5CLEtBRy9CQSxFQUFPb1osdUJBQ1BwWixFQUFPcVosaUNBQ1ByWixFQUFPc1osdUJBQ1B0WixFQUFPdVosbUNBRUgxTSxFQUFXcUIsT0FDYnJOLEVBQVMrSixLQUFLcUksR0FBbUJqVCxJQUU5QjZNLEVBQVdrUyxzQkFDZGxlLEVBQVMrSixLQUFLMkssR0FBaUJ2VixLQUcvQkEsRUFBT3VOLFVBQVVtVSxTQUNuQjdnQixFQUFTK0osS0FBS2taLEdBQTBCOWpCLFlBR3RDd0ksUUFBUXRELElBQUlyRSxTQUNaVSxFQUFZK1AsYUFFbEIsTUFBTXJELEVBQWlCcEIsRUFBV3FCLE1BQVEsTUFBUSxPQUU5Q3JCLEVBQVdxQixPQUNiN04sRUFBRyt3QixPQUFPN3dCLEVBQUtDLEtBQUt5bEIsRUFBYSxZQUFhLENBQUU5WSxPQUFPLElBQ3ZEcU0sR0FBVXZMLEVBQWdCLENBQUMsVUFBV2dZLEtBRXRDNWxCLEVBQUcrd0IsT0FBTzd3QixFQUFLQyxLQUFLeWxCLEVBQWEsYUFBYyxDQUFFOVksT0FBTyxJQUN4RHFNLEdBQVV2TCxFQUFnQixDQUFDLFVBQVcsa0JBQW1CZ1ksSUFFM0R6TSxHQUFVdkwsRUFBZ0IsQ0FBQyxXQUFZZ1ksR0FHbENwWixFQUFXcUIsT0FDZHNMLEdBQVV2TCxFQUFnQixDQUFDLFVBQVcsa0JBQW1CZ1ksU0FHckROLEdBQW1COVksRUFDM0IsQ0FDRixDQWFNd1MifQ==
|
|
1
|
+
import e from"node:fs";import t from"node:path";import{ignoreEnoentAsync as n,withRetry as s,ignoreErrorAsync as i}from"@willbooster/shared-lib";import r from"yargs";import o from"node:fs/promises";import{PromisePool as a}from"minimal-promise-pool";import c from"deepmerge";import l from"typescript";import p from"fast-glob";import d from"js-yaml";import u from"lodash.clonedeep";import m from"node:os";import f from"node:child_process";import{Octokit as g}from"@octokit/core";import h from"dotenv";import y from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";const k=new class{isVerbose=!1;doesUploadEnvVars=!1};const x=new class{async functionIgnoringException(e,t){k.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function j(e){return x.functionIgnoringException("fixDockerfile",async()=>{if(!e.doesContainDockerfile)return;const n=e.dockerfile,s=n;n!==s&&await o.writeFile(t.join(e.dirPath,"Dockerfile"),s)})}const _={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,s){await e.promises.mkdir(t.dirname(n),{recursive:!0});let i=s.replaceAll("\r\n","\n").trim();i&&(i+="\n"),await e.promises.writeFile(n,i)}},S=new a;async function P(n){return x.functionIgnoringException("fixNextConfigJson",async()=>{const s=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!s)return;const i=(await e.promises.readFile(s,"utf8")).replace(/=\s*{([\S\s]*)};/,(e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`));await S.run(()=>_.generateFile(s,i))})}const $=e=>({kind:"literal",value:e}),C=e=>({kind:"object",value:e}),E={forbidOnly:$("!!process.env.CI"),retries:$("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:C({baseURL:$("process.env.NEXT_PUBLIC_BASE_URL"),trace:$("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:$("process.env.CI ? 'only-on-failure' : 'only-on-failure'"),video:$("process.env.CI ? 'retain-on-failure' : 'retain-on-failure'")}),webServer:C({command:$("'yarn start-test-server'"),url:$("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:$("!!process.env.CI"),timeout:$("300_000"),stdout:$("'pipe'"),stderr:$("'pipe'"),env:$("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:$("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})};async function F(n){return x.functionIgnoringException("fixPlaywrightConfig",async()=>{const s=t.resolve(n.dirPath,"playwright.config.ts");if(!e.existsSync(s))return;const i=await e.promises.readFile(s,"utf8"),r=/defineConfig\s*\(\s*(\{[\s\S]*?})\s*\);?/.exec(i),o=r?.[1];if(!o)return;const a=function(e){const t=l.createSourceFile("playwright-config.ts",`const config = ${e};`,l.ScriptTarget.Latest,!0,l.ScriptKind.TS),n=t.statements[0];if(!n||!l.isVariableStatement(n))return;const s=n.declarationList.declarations[0];if(!s?.initializer||!l.isObjectLiteralExpression(s.initializer))return;return B(s.initializer,t)}(o);if(!a)return;const p=c.all([E,a]);Boolean(n.packageJson?.scripts?.["start-test-server"])||delete p.webServer;const d=await async function(n){const s=[t.resolve(n,".env"),t.resolve(n,"mise.toml")];for(const t of s)try{const n=await e.promises.readFile(t,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(n))return!0}catch{}return!1}(n.dirPath);if(!d){const e=p.use;"object"===e?.kind&&delete e.value.baseURL}const u=I(p,0),m=i.replace(o,u);await S.run(()=>_.generateFile(s,m))})}function B(e,t){const n={};for(const s of e.properties){if(!l.isPropertyAssignment(s)||!l.isIdentifier(s.name)&&!l.isStringLiteral(s.name))return;const e=O(s.initializer,t);if(void 0===e)return;n[s.name.getText(t)]=e}return n}function O(e,t){if(l.isObjectLiteralExpression(e)){const n=B(e,t);return n?C(n):$(e.getText(t))}if(l.isArrayLiteralExpression(e)){const n=e.elements.map(e=>O(e,t));return n.some(e=>void 0===e)?$(e.getText(t)):{kind:"array",value:n}}return $(e.getText(t))}function A(e,t){return"array"===e.kind?function(e,t){if(0===e.length)return"[]";const n=" ".repeat(t+1),s=e.map(e=>{const s=A(e,t+1).split("\n");if(s[s.length-1]=`${s.at(-1)},`,"literal"===e.kind)for(let e=1;e<s.length;e+=1)s[e]=`${n}${s[e]}`;return s[0]=`${n}${s[0]}`,s.join("\n")}),i=" ".repeat(t);return`[\n${s.join("\n")}\n${i}]`}(e.value,t):"literal"===e.kind?e.value:I(e.value,t)}function I(e,t){const n=" ".repeat(t+1),s=Object.entries(e).map(([e,s])=>{const i=A(s,t+1).split("\n");if(i[i.length-1]=`${i.at(-1)},`,"literal"===s.kind)for(let e=1;e<i.length;e+=1)i[e]=`${n}${i[e]}`;return i[0]=`${n}${e}: ${i[0]}`,i.join("\n")}),i=" ".repeat(t);return 0===s.length?`{\n${i}}`:`{\n${s.join("\n")}\n${i}}`}const T=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function R(e){return x.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await p.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:T});for(const s of n){const n=t.resolve(e.dirPath,s),i=(await o.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await o.writeFile(n,i)}})}async function W(n){return x.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const s=t.join(n,"test");for(const i of["__tests__","tests"]){const r=t.join(n,i);try{await e.promises.rename(r,s);const o=await e.promises.readFile(t.join(n,"package.json"),"utf8"),a=o.replaceAll(i,"test");if(o===a)return;await e.promises.writeFile(t.join(n,"package.json"),a)}catch{}}}))})}async function D(e,s){return x.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),r=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),a=await n(()=>o.readdir(i,{withFileTypes:!0}));if(a)for(const e of a){const a=e.name.slice(0,-5),c=e.name.endsWith(".d.ts");let l=c?a:e.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=s.some(e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]);e.isFile()&&c?p?(await o.mkdir(t.join(i,a)),await S.run(()=>o.rename(t.join(i,e.name),t.join(i,a,"index.d.ts")))):r&&(await o.mkdir(r,{recursive:!0}),await S.run(()=>o.rename(t.join(i,e.name),t.join(r,e.name)))):e.isDirectory()&&r&&!p&&(await o.mkdir(r,{recursive:!0}),await S.run(()=>n(()=>o.rename(t.join(i,e.name,"index.d.ts"),t.join(r,`${e.name}.d.ts`)))))}})}function L(e,t){return t}function N(e,t,n){const s=[...e];for(const[i,r]of t.entries())void 0===s[i]?s[i]=n.cloneUnlessOtherwiseSpecified(r,n):n.isMergeableObject(r)?s[i]=c(e[i],r,n):e.includes(r)||s.push(r);return s}function J(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&J(s);return e}const G={name:"autofix.ci",on:{pull_request:null,push:{branches:["main"]}},permissions:{contents:"read"},concurrency:{group:"autofix-${{ github.head_ref }}","cancel-in-progress":!0},jobs:{autofix:{"runs-on":"ubuntu-latest"}}},U={name:"Fix code automatically",on:{pull_request:null},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{autofix:{uses:"WillBooster/reusable-workflows/.github/workflows/autofix.yml@main"}}},z={test:{name:"Test",on:{pull_request:null,push:{branches:["main","wbfy"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},permissions:{contents:"write"},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/test.yml@main"}}},release:{name:"Release",on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},permissions:{"id-token":"write",contents:"write"},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},"semantic-pr":{name:"Lint PR title",on:{pull_request_target:{types:["opened","edited","synchronize"]}},jobs:{"semantic-pr":{uses:"WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main"}}},sync:{name:"Sync",on:{},permissions:{contents:"write"},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"gen-pr-claude":{name:"Generate PR with Claude Code",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-claude')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"claude-code","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{CLAUDE_CODE_OAUTH_TOKEN:"${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}"}}}},"gen-pr-codex":{name:"Generate PR with Codex CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-codex')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"codex-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{OPENAI_API_KEY:"${{ secrets.OPENAI_API_KEY }}"}}}},"gen-pr-gemini":{name:"Generate PR with Gemini CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-gemini')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"gemini-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{GEMINI_API_KEY:"${{ secrets.GEMINI_API_KEY }}"}}}}};async function M(n){return x.functionIgnoringException("generateWorkflow",async()=>{if(q(n.repository))return;const s=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(s,{recursive:!0});const i=t.resolve(n.dirPath,".github","semantic.yml");await S.run(()=>e.promises.rm(i,{force:!0,recursive:!0}));const r=await e.promises.readdir(s,{withFileTypes:!0}),o=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml","gen-pr-claude.yml","gen-pr-codex.yml","gen-pr-gemini.yml",...r.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&o.add("release.yml");for(const e of o){const i=t.basename(e,".yml");await S.run(()=>H(n,s,i))}})}function q(e){return e?.endsWith("/reusable-workflows")??!1}async function H(n,s,i){const r=t.join(s,`${i}.yml`),o=e.existsSync(t.join(s,"deploy-production.yml"));if("autofix"===i)return void await K(function(e){if(!e.isPublicRepo)return u(U);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0}},...e.isBun?[{uses:"oven-sh/setup-bun@v1",with:{"bun-version":"latest"}}]:[],{run:`${t} install`},{run:`${t} run cleanup`}];e.packageJson?.scripts?.build&&n.push({run:`${t} run build`});n.push({uses:"autofix-ci/action@v1"});const s=u(G),i=s.jobs.autofix??{"runs-on":"ubuntu-latest"};return s.jobs.autofix={...i,steps:n},s}(n),r);let a=u(i in z?z[i]:{});if(!("jobs"in a))return;try{const t=await e.promises.readFile(r,"utf8"),n=d.load(t);a=c.all([a,n,a],{arrayMerge:N})}catch{}i.startsWith("deploy")&&(a={...a,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},function(e,t){const n=e[t];delete e[t],e[t]=n}(a,"jobs"),a.on?.push&&(a.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...a.on.push["paths-ignore"]??[]])])),"release"===i&&a.jobs.release&&o&&(a.permissions??={},a.permissions.actions="write",a.jobs.release.with??={},a.jobs.release.with.trigger_deploy_workflow="deploy-production.yml");let l=!1;for(const e of Object.values(a.jobs))e.uses?.includes("/reusable-workflows/")&&(Y(n,e,i),l=!0);if(l){switch(i){case"release":if(a.on?.schedule)delete a.on.push;else{if(!(a.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});a.on.push.branches=n.release.branches}n.isPublicRepo?(a.permissions??={},a.permissions["id-token"]="write"):delete a.permissions?.["id-token"];break;case"test":a.on?.pull_request&&delete a.on.pull_request["paths-ignore"],a.on?.push&&(delete a.on.push["paths-ignore"],a.on.push.branches=a.on.push.branches.filter(e=>"renovate/**"!==e))}if(await K(a,r),"sync"===i){if(await e.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!a.jobs.sync?.with)return;a.jobs["sync-force"]=a.jobs.sync;const n=a.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;a.jobs.sync.with.sync_params_without_dest=`--force ${n}`,a.name="Force to Sync",a.on={workflow_dispatch:null},delete a.jobs.sync,await K(a,t.join(s,"sync-force.yml"))}}}function Y(e,t,n){if(t.with??={},t.secrets??={},delete t.secrets.NPM_TOKEN,"test"!==n&&"release"!==n&&"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.with["test-command"]=e.isBun?"bun run check-all-for-ai":"yarn check-all-for-ai"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with.sync_params_without_dest;"string"==typeof e&&(t.with.sync_params_without_dest=e.replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses?.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses?.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&"string"==typeof t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.replace(/\s+--json/,"")),e.doesContainDockerfile&&!t.with.ci_label&&n.startsWith("test")&&(t.with.ci_label="large"),"release"===n||"test"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?J(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=J(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function K(t,n){const s=d.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function V(n){return x.functionIgnoringException("fixTypos",async()=>{if(q(n.repository))return;const s=n.dirPath,i=await p.glob("**/*.md",{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const r of i){const i=t.join(s,r);await S.run(async()=>{const t=await e.promises.readFile(i,"utf8");let s=X(t);s=Z(s,n,"doc"),t!==s&&await _.generateFile(i,s)})}const r=await p.glob(["{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${r.length} TypeScript files in ${s}`);for(const i of r){const r=t.join(s,i),o=await e.promises.readFile(r,"utf8");let a=Q(o);a=Z(a,n,"ts"),o!==a&&await _.generateFile(r,a)}const o=await p.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${o.length} text-based files in ${s}`);for(const i of o){const r=t.join(s,i),o=await e.promises.readFile(r,"utf8");let a=X(o);a=Z(a,n,"text"),o!==a&&await _.generateFile(r,a)}await S.promiseAll()})}function X(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function Q(e){return e.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.")}function Z(e,t,n){for(const[n,s]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,s);for(const[s,i]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(s,i);return e}async function ee(e,n){return x.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const s=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),i=await _.readFileIgnoringError(s);for(const[s,r]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const o=te(e,n,r,i),a=t.resolve(e.dirPath,s);await S.run(()=>_.generateFile(a,o))}const r=t.resolve(e.dirPath,".cursor/rules/general.mdc"),o=function(e,t,n){const s="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",i=te(e,t,"Cursor",n);return`${s}\n\n${i}`}(e,n,i);await S.run(()=>_.generateFile(r,o))})}function te(e,t,n,s){const i=e.isBun?"bun":"yarn",r=`\n## Project Information\n\n- Name: \`${e.packageJson?.name||"unknown"}\`\n- Description: ${e.packageJson?.description}\n- Package Manager: ${i}\n\n## General Instructions\n\n- Create a new branch if the current branch is \`main\`.\n- Run any \`git\` commands sequentially.\n- Write tests ONLY if explicitly requested.\n - Make sure to continue to modify the tests and code until the tests pass.\n- When fixing tests, gather debug information through logging and screenshots before modifying the code.\n- After making code changes, run \`${i} check-all-for-ai\` to execute all tests (takes up to 1 hour), or run \`${i} check-for-ai\` for type checking and linting only (takes up to 10 minutes).\n - If you are confident your changes will not break any tests, you may use \`check-for-ai\`.\n- Once you have verified your changes, commit and push them to the current (non-main) branch then create a PR via \`gh\`.\n - Follow the conventional commits; your commit message should start with \`feat:\`, \`fix:\`, etc.\n - If not specified, make sure to add a new line at the end of your commit message${e.isWillBoosterRepo?` with: \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\``:""}.\n - Always create new commits. Avoid using \`--amend\`.\n${t.some(e=>e.hasStartTestServer)?`- Use \`${i} run start-test-server\` to launch a web server for debugging or testing.`:""}\n\n${ne(t)}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim(),o=s?.trim().startsWith("#");return r+(s?o?"\n\n"+s.trim():"\n"+s:"")}function ne(e){return`\n## Coding Style\n\n- Simplify code as much as possible to eliminate redundancy.\n- Design each module with high cohesion, grouping related functionality together.\n - Refactor existing large modules into smaller, focused modules when necessary.\n - Create well-organized directory structures with low coupling and high cohesion.\n- When adding new functions or classes, define them below any functions or classes that call them to maintain a clear top-down call order.\n- Write comments that explain "why" rather than "what". Avoid stating what can be understood from the code itself.\n- Prefer \`undefined\` over \`null\` unless explicitly required by APIs or libraries.\n- Prefer using a single template literal for prompts instead of \`join()\` with an array of strings.\n${e.some(e=>e.depending.genI18nTs)?'- When introducing new string literals in React components, update the language resource files in the `i18n` directory (e.g., `i18n/ja-JP.json`). Reference these strings using the `i18n` utility. For example, use `i18n.pages.home.title()` for `{ "pages": { "home": { "title": "My App" } } }`.':""}\n${e.some(e=>e.depending.react||e.depending.next)?"- Prefer `useImmer` for storing an array or an object to `useState`.":""}\n${e.some(e=>e.depending.next)?"\n- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.\n- Assume there is only a single server instance.\n":""}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim()}async function se(n){return x.functionIgnoringException("generateBiomeJsonc",async()=>{let s={root:n.isRoot,$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};const i=t.resolve(n.dirPath,"biome.jsonc");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=c.all([s,n,s],{arrayMerge:L})}catch{}const r=JSON.stringify(s);await S.run(()=>_.generateFile(i,r))})}const ie='env = false\ntelemetry = false\n\n[install]\nexact = true\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n "@exercode/problem-utils",\n "@willbooster/babel-configs",\n "@willbooster/biome-config",\n "@willbooster/eslint-config-js",\n "@willbooster/eslint-config-js-react",\n "@willbooster/eslint-config-next",\n "@willbooster/eslint-config-ts",\n "@willbooster/eslint-config-ts-react",\n "@willbooster/prettier-config",\n "@willbooster/shared-lib",\n "@willbooster/wb",\n "next",\n "@next/*",\n "react",\n "react-dom"\n]\n',re=ie.replace("exact = true","exact = false");async function oe(n){return x.functionIgnoringException("generateBunfigToml",async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(s)&&e.readFileSync(s,"utf8").includes("exact = false")?re:ie;await S.run(()=>_.generateFile(s,i))})}const ae="# Project-specific settings",ce=/# Project-specific settings[^\n]*\n/gm,le="# Generated by wbfy",pe=`${ae} (head)\n\n\n${le}\n`,de=`\n${ae} (tail)\n`,ue={separator:le,separatorPrefix:"# Generated by ",defaultHeadUserContent:pe,defaultTailUserContent:de,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=me(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(ce,"").replaceAll(/# Generated by [^\n]*\n/gm,"").replaceAll(/\r?\n\r?\n(\r?\n)+/gm,"\n\n").trim()+"\n"}catch{}},getHeadUserContent(e){const t=e.indexOf(this.separatorPrefix);return-1!==t?e.slice(0,e.indexOf("\n",t)+1).replaceAll(ce,`${ae} (head)\n`):pe},getTailUserContent(e){const t=me(e);return t>0?e.slice(t-1):de},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function me(e){const t=e.indexOf(ae),n=e.lastIndexOf(ae);return n>t?n:-1}async function fe(n){return x.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await _.readFileIgnoringError(s)??"",t=ue.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+ue.getTailUserContent(e);await S.run(()=>_.generateFile(s,t))}else await e.promises.rm(s,{force:!0})})}const ge={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].toSorted(),codeWith4IndentSize:["go","gradle","java","py"].toSorted(),markdownLike:["md"].toSorted(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].toSorted(),prettier:["cjs","mjs","java","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].toSorted(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].toSorted()},he=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${we(ge.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${we(ge.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${we(ge.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function ye(e){return x.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await S.run(()=>_.generateFile(n,he))})}function we(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function be(n){return x.functionIgnoringException("generateEslintrc",async()=>{const s=t.resolve(n.dirPath,"eslint.config.mjs");if(n.isBun)await S.run(()=>e.promises.rm(s,{force:!0}));else if(n.eslintBase){try{if(!(await e.promises.readFile(s,"utf8")).includes("export { default }"))return}catch{}await S.run(()=>_.generateFile(s,`export { default } from '${n.eslintBase}';`))}})}const ve={have_fun:!0,code_review:{disable:!1,comment_severity_threshold:"MEDIUM",max_review_comments:-1,pull_request_opened:{help:!1,summary:!0,code_review:!0}},ignore_patterns:["**/__generated__"]};async function ke(n,s){return x.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const i=t.resolve(n.dirPath,".gemini"),r=t.resolve(i,"config.yml"),o=t.resolve(i,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let l=u(ve);try{const t=await e.promises.readFile(r,"utf8"),n=d.load(t);l=c.all([l,n,l],{arrayMerge:L})}catch{}const p=d.dump(l,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),m=await _.readFileIgnoringError(a),f=`以下のコーディング規約を踏まえて、日本語でレビューしてください。\n\n${ne(s)}${m?`\n\n${m.trimEnd()}`:""}`,g=[S.run(()=>_.generateFile(r,p))];e.existsSync(o)||g.push(S.run(()=>_.generateFile(o,f))),await Promise.all(g)})}async function xe(n){return x.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),i=t.resolve(s,"settings.json");await e.promises.rm(i,{force:!0})})}const je=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...ge.codeWith2IndentSize,...ge.codeWith4IndentSize,...ge.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function _e(e){return x.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await S.run(()=>_.generateFile(n,je))})}const Se=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Pe(e,n){return x.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await _.readFileIgnoringError(s)??"";let r=ue.getHeadUserContent(i)+"\n!.keep\n.aider*\n.env.production\n*/mount/*.hash\n.devcontainer/\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot.*\n.idea/copilot/chatSessions/\n.serena/\n.tmp/\n__generated__/\n@willbooster/\ndist/\ntemp/\ntmp/\n";const o=ue.getTailUserContent(i),a=[...Se];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),r+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),r+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),r+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(r+=".aws-sam/\npackaged.yaml\n"),e.doesContainPoetryLock&&(a.push("python"),r+=".venv/\n"),e.depending.blitz&&(r+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(r+="*.sqlite3*\n"),e.depending.playwrightTest&&(r+="playwright-report/\ntest-results/\n.playwright-cli/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),r+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(r+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Ee(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,s=await fetch(n),i=await s.text();if(!s.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await S.run(()=>Ce(e,t)),k.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await ue.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=r+"\n"+c+o;await S.run(()=>_.generateFile(s,l))})}const $e=t.join(m.homedir(),".cache","wbfy","gitignore");async function Ce(n,s){await e.promises.mkdir($e,{recursive:!0}),await e.promises.writeFile(t.join($e,n),s)}async function Ee(n){try{const s=await e.promises.stat(t.join($e,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join($e,n),"utf8")}catch{}}function Fe(e,t,n,s){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${s}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${s})" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="${e}" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n`}const Be=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ge.prettier.map(e=>Fe("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,Oe=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ge.prettier.map(e=>Fe("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-parse-errors","Biome",e)).join("")}\n </component>\n</project>\n`;async function Ae(n){return x.functionIgnoringException("generateIdeaSettings",async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const i=t.resolve(s,"watcherTasks.xml");await(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages||n.doesContainPackageJson&&!n.doesContainPubspecYaml&&!n.doesContainGemfile&&!n.doesContainGoMod&&!n.doesContainPomXml?S.run(()=>_.generateFile(i,n.isBun?Oe:Be)):S.run(()=>e.promises.rm(i,{force:!0})))}})}function Ie(e,t,n,s=0){do{const[s,i,r]=Re(e,t,n);if(0===f.spawnSync(s,i,r).status)break}while(--s>=0)}function Te(e,t,n){const[s,i,r]=Re(e,t,n);r.stdio="pipe";const o=f.spawnSync(s,i,r),a=o.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();o.error?console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] failed with: ${o.error.message}`):c&&console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${c}`);const l=o.stdout??"";return"string"==typeof l?l.trim():l.toString().trim()}function Re(e,t,n){const s={...process.env};return s.PATH&&s.BERRY_BIN_FOLDER&&(s.PATH=s.PATH.replace(`${s.BERRY_BIN_FOLDER}:`,"")),[e,t,{cwd:n,env:s,encoding:"utf8",shell:!1,stdio:"inherit"}]}function We(e,t){try{const n=`git@github.com:${e}/${t}.git`,s=Te("git",["ls-remote",n,"HEAD"],process.cwd()).split(/\s+/)[0];if(!s)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(s)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}const De={getLintFixSuffix:e=>e.doesContainJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""};const Le=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},Ne=new Map;function Je(e){const t=e??"",n=Ne.get(t);if(n)return n;const s=new g({auth:Ue(e)||void 0});return Ne.set(t,s),s}function Ge(e){return!!Ue(e)}function Ue(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER:"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB:process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN}const ze=["@eslint/js","eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-import-x","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],Me=[...ze,"typescript-eslint","eslint-import-resolver-typescript"],qe=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],He={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...ze],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...ze,...qe],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...Me],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...Me,...qe],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","@next/eslint-plugin-next",...Me,...qe]};async function Ye(n,s,i){return x.functionIgnoringException("generatePackageJson",async()=>{await async function(n,s,i){const r=t.resolve(n.dirPath,"package.json"),o=await e.promises.readFile(r,"utf8"),a=JSON.parse(o);a.scripts=a.scripts??{},a.dependencies=a.dependencies??{},a.devDependencies=a.devDependencies??{},a.peerDependencies=a.peerDependencies??{};const l=n.isBun?"bun":"yarn";await async function(t){"WillBooster LLC"===t.author&&(t.author="WillBooster Inc.");delete t.scripts["sort-package-json"],delete t.scripts["sort-all-package-json"],delete t.scripts["typecheck/warn"],delete t.scripts["typecheck:gen-code"],delete t.scripts["typecheck:codegen"],delete t.dependencies.tslib,delete t.devDependencies["@willbooster/eslint-config"],delete t.devDependencies["@willbooster/eslint-config-react"],delete t.devDependencies["@willbooster/renovate-config"],delete t.devDependencies["@willbooster/tsconfig"],delete t.devDependencies["eslint-import-resolver-node"],delete t.devDependencies["eslint-plugin-prettier"],delete t.devDependencies.lerna,delete t.devDependencies.pinst,delete t.scripts["flutter-format"],delete t.scripts["format-flutter"],delete t.scripts["python-format"],delete t.scripts["format-python"],delete t.scripts.prettier,delete t.scripts["check-all"],await S.run(()=>e.promises.rm("lerna.json",{force:!0})),delete t.devDependencies["@typescript-eslint/eslint-plugin"],delete t.devDependencies["@typescript-eslint/parser"],delete t.devDependencies["eslint-plugin-import"]}(a);for(const[e,t]of Object.entries(a.scripts))t.includes("git clone")||(a.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));a.scripts=c(a.scripts,Qe(n,a.scripts)),"check-for-ai"in a.scripts&&("gen-code"in a.scripts&&(a.scripts["check-for-ai"]=`${l} gen-code > /dev/null && ${a.scripts["check-for-ai"]}`),a.scripts["check-for-ai"]=`${l} install > /dev/null && ${a.scripts["check-for-ai"]}`);n.isBun?delete a.scripts.prettify:a.scripts.prettify=(a.scripts.prettify??"")+await async function(n){const s=t.resolve(n,".prettierignore"),i=await e.promises.readFile(s,"utf8"),r=i.indexOf(ue.separatorPrefix);if(-1===r)return"";const o=i.slice(0,r);return`${o.split("\n").map(e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t}).filter(e=>e&&!e.startsWith("#")&&!e.includes("/")).map(e=>` "!**/${e}/**"`).join("")} || true`}(n.dirPath);for(const[e,t]of Object.entries(a.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(a.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let d=[],u=["prettier","sort-package-json"];const m=[];e.existsSync(t.join(s.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(a.prettier="@willbooster/prettier-config",u.push("prettier-plugin-java","@willbooster/prettier-config"));n.isBun?delete a.devDependencies["lint-staged"]:u.push("lint-staged");if(n.isRoot){if(delete a.devDependencies.husky,delete a.devDependencies.pinst,delete a.scripts.postinstall,delete a.scripts.postpublish,delete a.scripts.prepublishOnly,delete a.scripts.prepack,delete a.scripts.postpack,a.scripts.prepare="lefthook install || true",u.push("lefthook"),n.depending.semanticRelease&&(a.devDependencies["semantic-release"]||a.devDependencies["multi-semantic-release"]||a.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),a.version="0.0.0-semantically-released"),n.depending.playwrightTest){a.dependencies.artillery||a.devDependencies.artillery||a.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete a.dependencies["@playwright/test"]),delete a.dependencies.playwright,delete a.devDependencies.playwright}n.doesContainSubPackageJsons?a.workspaces=Array.isArray(a.workspaces)?c.all([a.workspaces,["packages/*"]],{arrayMerge:N}):["packages/*"]:Array.isArray(a.workspaces)&&(a.workspaces=a.workspaces.filter(e=>p.globSync(e,{dot:!0,cwd:n.dirPath,ignore:T}).length>0),0===a.workspaces.length&&delete a.workspaces)}if(n.depending.wb||n.isBun){a.dependencies["@willbooster/wb"]?d.push("@willbooster/wb"):u.push("@willbooster/wb");for(const[e,t]of Object.entries(a.scripts))a.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(n.isBun?(u.push("@biomejs/biome","@willbooster/biome-config"),delete a.devDependencies.eslint,delete a.devDependencies.micromatch,delete a.devDependencies["typescript-eslint"]):u.push("eslint","micromatch"));(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&u.push(...function(e){return e.isBun?["@tsconfig/bun"]:e.depending.reactNative?["@tsconfig/react-native"]:["@tsconfig/node-lts","@tsconfig/node-ts"]}(n));(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(u.push("typescript"),n.isBun&&u.push("@types/bun"));n.eslintBase&&u.push(...He[n.eslintBase]);n.isWillBoosterConfigs&&(d=d.filter(e=>!e.includes("@willbooster/")),u=u.filter(e=>!e.includes("@willbooster/")));a.name||(a.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(a.private=!0);a.license||(a.license="UNLICENSED");!a.private&&"UNLICENSED"!==a.license&&s.isPublicRepo&&(a.publishConfig??={},a.publishConfig.access??="public");const[f]=Le.getOrgAndName(n.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(a.author="WillBooster Inc.");n.isRoot||!a.private||a.main||(a.main="./src");if(delete a.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)a.scripts["lint-fix"]=(a.scripts["lint-fix"]??"")+De.getLintFixSuffix(n);else{delete a.scripts.lint,delete a.scripts["lint-fix"];for(const e of["cleanup","check-for-ai"]){const t=a.scripts[e];t&&(a.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){a.scripts.lint="flutter analyze",a.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter(s=>e.existsSync(t.resolve(n.dirPath,s)));s.length>0&&(a.scripts["format-code"]=`dart format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,a.scripts.format=(a.scripts.format??"")+" && yarn format-code")}if(n.doesContainPoetryLock){"poetry install"===a.scripts.postinstall&&delete a.scripts.postinstall;const e=await p.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:T}),t=new Set;for(const n of e){const[e,s]=n.split(/[/\\]/);e&&s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");a.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,a.scripts.lint?a.scripts.lint=`poetry run flake8 ${e} && ${a.scripts.lint}`:(a.scripts.lint=`poetry run flake8 ${e}`,a.scripts["lint-fix"]="yarn lint"),a.scripts.format=(a.scripts.format??"")+" && yarn format-code",m.push("black","isort","flake8")}}}(n.repository||a.repository)&&(a.repository=function(e,t){const n=Ve(e);if(n)return Xe(n,e,t);const s=Ve(t);if(s)return Xe(s,t);return e}(n.repository??a.repository,a.repository));n.depending.blitz?a.scripts["gen-code"]?.startsWith("blitz codegen")?a.scripts["gen-code"].includes("blitz prisma generate")||(a.scripts["gen-code"]=a.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):a.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!a.scripts["gen-code"]?.startsWith("prisma generate")&&(a.scripts["gen-code"]="prisma generate");a.dependencies.prettier||delete a.devDependencies["@types/prettier"];0===Object.keys(a.dependencies).length&&delete a.dependencies;0===Object.keys(a.devDependencies).length&&delete a.devDependencies;0===Object.keys(a.peerDependencies).length&&delete a.peerDependencies;await async function(e){e.dependencies=e.dependencies??{},e.devDependencies=e.devDependencies??{};const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]);if(t.has("@willbooster/auth")&&!Ze(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await We("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!Ze(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await We("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!Ze(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await We("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#${t}`}if(t.has("@willbooster/judge")&&!Ze(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await We("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!Ze(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await We("WillBoosterLab","llm-proxy");e.dependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#${t}`}}(a),n.isBun&&delete a.packageManager;let g=JSON.stringify(a);if(g=await async function(n,s,i){const r=[];for(const[e]of Object.keys(n))e&&!e.startsWith(":")&&e.includes(":")&&r.push([e,e.replaceAll(":","-")]);if(0===r.length)return s;for(const[e,t]of r)s=s.replaceAll(e,t);const o=await p.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,ignore:T});for(const n of o)await S.run(async()=>{const s=t.join(i.dirPath,n),o=await e.promises.readFile(s,"utf8");let a=o;for(const[e,t]of r)a=a.replaceAll(e,t);a!==o&&await e.promises.writeFile(s,a)});return await S.promiseAll(),s}(a.scripts,g,n),await e.promises.writeFile(r,g),!i){if(d=d.filter(e=>!a.devDependencies?.[e]),d.length>0){const e=[...new Set(d)].map(Ke);n.isBun?(Ie(l,["remove",...new Set(d)],n.dirPath),Ie(l,["add","--exact",...e],n.dirPath)):Ie(l,["add",...e],n.dirPath)}if(u=u.filter(e=>!a.dependencies?.[e]),u.length>0){const e=[...new Set(u)].map(Ke);n.isBun?(Ie(l,["remove",...new Set(u)],n.dirPath),Ie(l,["add","-D","--exact",...e],n.dirPath)):Ie(l,["add","-D",...e],n.dirPath)}m.length>0&&Ie("poetry",["add","--group","dev",...new Set(m)],n.dirPath)}}(n,s,i)})}function Ke(e){return"typescript"===e?"typescript@^5":"@eslint/js"===e||"eslint"===e?`${e}@^9`:e}function Ve(e){if("string"==typeof e){if(!e.startsWith("github:"))return;const[t,n]=Le.getOrgAndName(e);if(!t||!n)return;return`git+https://github.com/${t}/${n}.git`}const t=e?.url;if("string"!=typeof t)return;const n=/^(?:git\+)?https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/u.exec(t);if(!n)return;const[,s,i]=n;return`git+https://github.com/${s}/${i}.git`}function Xe(e,t,n){return{..."object"==typeof t?t:"object"==typeof n?n:void 0,type:"git",url:e}}function Qe(e,t){if(e.isBun){const t=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,n={"check-all-for-ai":"bun run check-for-ai && bun run test","check-for-ai":"bun run cleanup"+(t?" && bun run typecheck":""),cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun wb test",typecheck:"bun --bun wb typecheck"};return t||delete n.typecheck,n}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,s=t.test;let i={"check-all-for-ai":"yarn check-for-ai && yarn test","check-for-ai":`yarn format > /dev/null 2> /dev/null || true${n?" && yarn typecheck":""} && yarn lint-fix --quiet`,cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:"eslint --color","lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ge.prettier.join(",")}}" "!**/test{-,/}fixtures/**"`,typecheck:"tsc --noEmit"};return e.doesContainSubPackageJsons?i=c({...i},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ge.prettier.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}):e.depending.pyright&&(i.typecheck=i.typecheck?`${i.typecheck} && `:"",i.typecheck+="pyright"),s?.includes("wb test")&&(i.test=s),n?e.depending.wb&&(i.typecheck="wb typecheck"):delete i.typecheck,i}}function Ze(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const et={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},tt={commands:{cleanup:{glob:"*.{astro,cjs,css,cts,gql,htm,html,java,js,json,json5,jsonc,jsx,md,mjs,mts,scss,svelte,ts,tsx,vue,yaml,yml}",run:""},"check-migrations":{glob:"**/migration.sql",run:"\nif grep -q 'Warnings:' {staged_files}; then\n echo \"Migration SQL files ({staged_files}) contain warnings! Please solve the warnings and commit again.\"\n exit 1\nfi\n".trim()}}},nt='\n#!/bin/bash\n\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim();async function st(n){return x.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook"),i=t.resolve(n.dirPath,".husky"),r=e.existsSync(i),{typecheck:o}=Qe(n,{}),a={...et,"pre-commit":{...tt,commands:{...tt.commands,cleanup:{...tt.commands.cleanup,run:it(n)}}}};o||delete a["pre-push"];await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),d.dump(a,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]),r&&(await Promise.all([e.promises.rm(i,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})]),Ie("git",["config","--unset","core.hooksPath"],n.dirPath));if(o){const i=function(e){let t;t=e.isBun?e.depending.wb?"bun --bun wb typecheck":"bun run typecheck":e.depending.wb?"yarn wb typecheck":"yarn run typecheck";if(e.repository?.startsWith("github:WillBoosterLab/"))return`\n#!/bin/bash\n\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don't push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\n${t}\n`.trim();return t}(n);e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await S.run(()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),i+"\n",{mode:493}))}const c=`${nt}\n\n${function(e){const t=[];if(e.hasVersionSettings){const e=String.raw`(mise\.toml|\.mise\.toml|\.tool-versions|\..+-version)`;t.push(String.raw`run_if_changed "${e}" "mise install"`)}const n=e.isBun?"bun install":"yarn",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";t.push(String.raw`run_if_changed "package\.json" "${n}${s}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`);e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`);return t}(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await S.run(()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),c,{mode:493}))}(n)})}function it(e){const t=e.isBun?"bun":"yarn";return`${e.depending.wb?(e.isBun?"bun --bun wb":"yarn wb")+" lint --fix --format -- {staged_files}":`${t} run format && ${t} run lint-fix`} && git add -- {staged_files}`}const rt={node:["src","test","scripts"].toSorted(),blitz:["src","test","scripts","db","integrations","mailers"].toSorted()};async function ot(n){return x.functionIgnoringException("generateLintstagedrc",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lintstagedrc.cjs");if(n.isBun)return void await S.run(()=>e.promises.rm(s,{force:!0}));const i=n.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",r=[];if(n.doesContainJavaScript||n.doesContainTypeScript){const e=`\n '${at(n)}': [${JSON.stringify(`${i}eslint --fix${De.getLintFixSuffix(n)}`)}, '${i}prettier --cache --write'],`;r.push(e)}const o=n.isRoot?" && !file.includes('/packages/')":"";r.push(`\n './**/*.{${ge.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/') && !file.includes('/test/fixtures/')${o});${function(e){return e.doesContainJavaScript||e.doesContainTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${at(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(n)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${i}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${i}sort-package-json');\n }\n return commands;\n },\n './**/migration.sql': (files) => {\n for (const file of files) {\n const content = fs.readFileSync(file, 'utf-8');\n if (content.includes('Warnings:')) {\n return [\n \`echo '!!! Migration SQL file (\${path.relative('', file)}) contains warnings !!! Solve the warnings and commit again.'\`,\n 'false',\n ];\n }\n }\n return [];\n},`),n.doesContainPubspecYaml&&r.push("\n './{lib,test,test_driver}/**/*.dart': files => {\n const filteredFiles = files.filter(file => !file.includes('generated'))\n .filter(file => !file.endsWith('.freezed.dart') && !file.endsWith('.g.dart'));\n if (filteredFiles.length === 0) return [];\n return [`dart format ${filteredFiles.join(' ')}`];\n },");n.doesContainPoetryLock&&r.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const a=`const fs = require('fs');\nconst path = require('path');\n${n.doesContainJavaScript||n.doesContainTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${r.join("")}\n};\n`;await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.js"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.json"),{force:!0})),await S.run(()=>_.generateFile(s,a))}(n)})}function at(e){const t=function(e){return e.depending.blitz?rt.blitz:rt.node}(e).map(e=>`${e}/**/`);return`{,${t.join(",")}}*.{${ge.eslint.join(",")}}`}async function ct(e){return x.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await _.readFileIgnoringError(n)??"",i=ue.getHeadUserContent(s),r=ue.getTailUserContent(s),o=t.resolve(e.dirPath,".gitignore"),a=await ue.readGitignoreWithoutSeparators(o)||"";let c="";e.doesContainPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+r;await S.run(()=>_.generateFile(n,l))})}const lt={venvPath:".",venv:".venv"};async function pt(n){return x.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=u(lt);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=c.all([s,n,s],{arrayMerge:L})}catch{}const r=JSON.stringify(s);await S.run(()=>_.generateFile(i,r))})}async function dt(n){return x.functionIgnoringException("generateReadme",async()=>{const s=t.resolve(n.dirPath,"README.md");let i=await e.promises.readFile(s,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(i=ut(i,"[](https://github.com/semantic-release/semantic-release)"));const r=n.repository?.slice(n.repository.indexOf(":")+1),o=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const s of o){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let o=s;if(o=(o[0]||"").toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," "),!r)continue;const a=`[](https://github.com/${r}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(i=ut(i,a))}await S.run(()=>_.generateFile(s,i))})}function ut(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const s=e.slice(0,n+1);let i=e.slice(n+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${s}${t}\n${i}`}return`${e}\n${t}\n`}async function mt(n){return x.functionIgnoringException("generateReleaserc",async()=>{const s=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(s))return;const i=JSON.parse(await e.promises.readFile(s,"utf8")),r=i.plugins??[];for(let e=0;e<r.length;e++){const t=Array.isArray(r[e])?r[e]?.[0]:r[e],n=Array.isArray(r[e])&&r[e]?.[1]||{};"@semantic-release/commit-analyzer"===t?r[e]=["@semantic-release/commit-analyzer",c.all([n,{preset:"conventionalcommits"}],{arrayMerge:L})]:"@semantic-release/github"===t&&(r[e]=["@semantic-release/github",c.all([n,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:L})])}const o=JSON.stringify(i);await S.run(()=>_.generateFile(s,o))})}const ft={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function gt(n){return x.functionIgnoringException("generateRenovateJson",async()=>{let s=u(ft);const i=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${i}5`))return;try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=c.all([s,n,s],{arrayMerge:L}),s.extends=s.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(s.packageRules??=[],s.packageRules.some(e=>e.matchPackageNames?.includes("next"))||s.packageRules.push({matchPackageNames:["next"],enabled:!1})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const r=JSON.stringify(s);await S.run(()=>_.generateFile(i,r))})}const ht=["claude-code","codex","cursor","gemini-cli"].flatMap(e=>["--agent",e]),yt="WillBooster/agent-skills",wt="playwright-cli",bt=["--agent","universal",...ht];async function vt(e){return x.functionIgnoringException("installAgentSkills",async()=>{await async function(e){if(!e.isRoot)return;if(Ie("npx",["skills@latest","add",yt,...ht,"--skill","*","--yes"],e.dirPath),function(e){return e.depending.next||e.depending.playwrightTest||e.depending.react||e.depending.storybook||e.doesContainJsxOrTsx||e.doesContainJsxOrTsxInPackages}(e))return;Ie("npx",["skills@latest","remove",wt,...bt,"--yes"],e.dirPath),await Promise.all([kt(e.dirPath,".agents/skills"),kt(e.dirPath,".claude/skills"),kt(e.dirPath,".codex/skills"),kt(e.dirPath,".cursor/skills"),kt(e.dirPath,".gemini/skills"),kt(e.dirPath,".gemini/commands"),xt(e.dirPath)])}(e)})}async function kt(e,n){await o.rm(t.resolve(e,n,wt),{force:!0,recursive:!0})}async function xt(e){const n=t.resolve(e,"skills-lock.json");try{const e=await o.readFile(n,"utf8"),t=JSON.parse(e);if(!function(e){return"object"==typeof e&&null!==e&&"skills"in e&&"object"==typeof e.skills&&null!==e.skills&&!Array.isArray(e.skills)}(t)||!t.skills[wt])return;t.skills=Object.fromEntries(Object.entries(t.skills).filter(([e])=>e!==wt)),await o.writeFile(n,JSON.stringify(t,void 0,2)+"\n")}catch{}}const jt={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},_t={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function St(n){return x.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=u(n.isRoot?jt:_t);s.extends=function(e){return e.isBun?"@tsconfig/bun/tsconfig.json":e.depending.reactNative?"@tsconfig/react-native/tsconfig.json":["@tsconfig/node-lts/tsconfig.json","@tsconfig/node-ts/tsconfig.json"]}(n),n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?n.isBun||n.depending.reactNative||(s.compilerOptions={...s.compilerOptions,jsx:"react-jsx"}):delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(s.include=s.include?.filter(e=>!e.startsWith("packages/*/")),s.exclude=s.exclude?.filter(e=>!e.startsWith("packages/*/")));const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s.extends=function(e,t){const n=[...Pt(e),...Pt(t)],s=[...new Set(n)];return 0===s.length?void 0:1===s.length?s[0]:s}(s.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,s=c.all([s,n,s],{arrayMerge:N}),s.include=s.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/"))}catch{}J(s),s.include?.sort(),delete s.compilerOptions?.experimentalDecorators,n.depending.reactNative&&delete s.compilerOptions?.verbatimModuleSyntax;const r=JSON.stringify(s);await S.run(()=>_.generateFile(i,r))})}function Pt(e){return e?Array.isArray(e)?e:[e]:[]}const $t=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function Ct(n){return x.functionIgnoringException("generateVscodeSettings",async()=>{try{const s=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(s,"utf8");let r=JSON.parse(i);for(const e of $t)r=c.all([r,Et(e)]);n.doesContainPoetryLock&&(r=c.all([r,Et("**/.venv/**")])),n.depending.next&&(r=c.all([r,Et("**/.next/**")])),"editor.codeActionsOnSave"in r&&delete r["editor.codeActionsOnSave"],"editor.formatOnSave"in r&&delete r["editor.formatOnSave"],J(r);const o=JSON.stringify(r,void 0,2);await S.run(()=>_.generateFile(s,o))}catch{}})}function Et(e){return{"files.watcherExclude":{[e]:!0}}}async function Ft(n){return x.functionIgnoringException("generateYarnrcYml",async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await S.run(()=>e.promises.rm(s,{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await S.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const i=Te("yarn",["--version"],n.dirPath),r=function(e,t){const n=Te("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);Bt(i)<=Bt(r)&&i!==r&&Ie("yarn",["set","version",r],n.dirPath,1);const o=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(o,{recursive:!0});for(const n of await e.promises.readdir(o))n.startsWith("yarn-")&&!n.startsWith(`yarn-${r}.`)&&await S.run(()=>e.promises.rm(t.join(o,n)));const a=t.resolve(n.dirPath,".yarnrc");await S.run(()=>e.promises.rm(a,{force:!0}));const c=d.load(await e.promises.readFile(s,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.npmPreapprovedPackages=["@exercode/problem-utils","@willbooster/babel-configs","@willbooster/biome-config","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","@willbooster/prettier-config","@willbooster/shared-lib","@willbooster/wb","next","@next/*","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const s=t.resolve(n.dirPath,".yarnrc","undefined.cjs");await S.run(()=>e.promises.rm(s,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,d.dump(c,{lineWidth:-1})),Ie("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}function Bt(e){const[t]=e.split(".");return Number(t)}async function Ot(e){return x.functionIgnoringException("setupLabels",async()=>{const[t,n]=Le.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ge(t))return;const s=Je(t);try{await At(s,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await At(s,t,n,"d2: easy :rabbit2:","DDD6FE"),await At(s,t,n,"d3: medium :ox:","C4B5FD"),await At(s,t,n,"d4: hard :squid:","A78BFA"),await At(s,t,n,"d5: x-hard :whale2:","8B5CF6"),await At(s,t,n,"p1: critical :fire::fire::fire:","EF4444"),await At(s,t,n,"p2: urgent :fire::fire:","F87171"),await At(s,t,n,"p3: important :fire:","FCA5A5"),await At(s,t,n,"p4: nice to have :droplet:","FECACA"),await At(s,t,n,"r: blitz","5300bc"),await At(s,t,n,"r: firebase","ffca28"),await At(s,t,n,"r: prisma","0c344b"),await At(s,t,n,"r: react","61dafb"),await At(s,t,n,"r: svelte","ff3e00"),await At(s,t,n,"r: semantic-release","494949"),await At(s,t,n,"ready :rocket:","22C55E"),await At(s,t,n,"review requested :mag:","FBCA04"),await At(s,t,n,"released :bookmark:","6366F1"),await At(s,t,n,"s: 0.5h :clock1230:","F3F4F6"),await At(s,t,n,"s: 1h :clock1:","E5E7EB"),await At(s,t,n,"s: 2h :clock2:","D1D5DB"),await At(s,t,n,"s: 3h :clock3:","9CA3AF"),await At(s,t,n,"s: 5h :clock5:","6B7280"),await At(s,t,n,"s: 8h :clock8:","4B5563"),await At(s,t,n,"s: 13h :clock1:","374151"),await At(s,t,n,"t: build :hammer:","BFDBFE"),await At(s,t,n,"t: chore :broom:","BFDBFE"),await At(s,t,n,"t: ci :construction_worker:","BFDBFE"),await At(s,t,n,"t: docs :memo:","BFDBFE"),await At(s,t,n,"t: feat :sparkles:","BFDBFE"),await At(s,t,n,"t: fix :bug:","BFDBFE"),await At(s,t,n,"t: perf :zap:","BFDBFE"),await At(s,t,n,"t: refactor :recycle:","BFDBFE"),await At(s,t,n,"t: style :lipstick:","BFDBFE"),await At(s,t,n,"t: test :test_tube:","BFDBFE"),await At(s,t,n,"project","24292F"),await At(s,t,n,"focused :dart:","22C55E"),await At(s,t,n,"gen-pr-all :robot:","00B4D8"),await At(s,t,n,"gen-pr-claude :robot:","00B4D8"),await At(s,t,n,"gen-pr-codex :robot:","00B4D8"),await At(s,t,n,"gen-pr-gemini :robot:","00B4D8"),await It(s,t,n,"bug"),await It(s,t,n,"documentation"),await It(s,t,n,"duplicate"),await It(s,t,n,"enhancement"),await It(s,t,n,"good first issue"),await It(s,t,n,"help wanted"),await It(s,t,n,"invalid"),await It(s,t,n,"question"),await It(s,t,n,"wontfix"),await It(s,t,n,"ready"),await It(s,t,n,"review requested"),await It(s,t,n,"released"),await It(s,t,n,"semantic-release"),await It(s,t,n,"llm-pr :robot:"),await It(s,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function At(e,t,n,s,i){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:s,color:i})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s,color:i})}}async function It(e,t,n,s){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s})}catch{}}const Tt=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function Rt(e){return x.functionIgnoringException("setupSecrets",async()=>{const[t,n]=Le.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;if(!Ge(t)||!k.doesUploadEnvVars)return;const s=h.config().parsed??{};if(0===Object.keys(s).length)return;const i=Je(t);try{for(const e of Tt)try{await i.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const e=await i.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:r,key_id:o}=e.data;await y.ready;for(const[e,a]of Object.entries(s)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const s=y.from_base64(r,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,s),p=y.to_base64(l,y.base64_variants.ORIGINAL);await i.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e,encrypted_value:p,key_id:o})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Wt(e){const[t,n]=Le.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ge(t))return;const i=Je(t);await s(()=>i.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}))}const Dt="__PM_RUN__",Lt={"pull_request_template.md":`\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I've confirmed \`All checks have passed\` on this page.\n - PR title follows [Angular's commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn't have \`WIP:\`.\n - The test command (e.g., \`${Dt} test\`) passed.\n - The lint command (e.g., \`${Dt} lint\`) passed.\n - You may leave this box unchecked due to long workflows.\n- [ ] I've reviewed my changes on the GitHub diff view.\n- [ ] I've written the steps to test my changes.\n- [ ] I've added screenshots (if the UI changed).\n - You may leave this box unchecked if you didn't modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language \`C\`.\n3. Write the following code:\n \`\`\`c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n \`\`\`\n4. Push \`Submit\` button.\n5. ...\n--\x3e\n`.trim()};async function Nt(n){return x.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(Lt)){const r=Jt(i,n),o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(w(t,r)>r.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await S.run(()=>_.generateFile(o,r))}})}function Jt(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Dt,n)}const Gt=v.object({typos:v.object({all:v.record(v.string(),v.string()).optional(),doc:v.record(v.string(),v.string()).optional(),ts:v.record(v.string(),v.string()).optional(),text:v.record(v.string(),v.string()).optional()}).optional()});async function Ut(n,s){const i=t.resolve(n,"package.json");try{const r=e.existsSync(i);let a={},c={},l={},p=!1;if(r){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),s=JSON.parse(await o.readFile(e,"utf8"));d=s?.branches??[],u=s?.plugins?.flat()??[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=b(e),s=(await n.getRemotes(!0)).find(e=>"origin"===e.name),i=s?.refs.fetch??s?.refs.push;if("string"==typeof i){const e=await Mt(i);if(e)return e}const r="string"==typeof t.repository?t.repository:t.repository?.url;if(r){const e=await Mt(r);if(e&&"Not Found"!==e.message)return e}}(n,l));let g=function(n){const s=t.resolve(n);return e.existsSync(t.join(s,"mise.toml"))||e.existsSync(t.join(s,".mise.toml"))||e.existsSync(t.join(s,".tool-versions"))}(n);for(const s of["java","node","python"])if(e.existsSync(t.resolve(n,`.${s}-version`))){g=!0;break}let h="";try{h=await o.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let w;try{const e=await o.readFile(y,"utf8");w=Gt.parse(JSON.parse(e))}catch{}const v="string"==typeof f?.full_name?f.full_name:void 0;let k,x;if(v){const e=v.split("/");e.length>=2&&(k=e[0],x=e[1])}const j=v?`github:${v}`:void 0,_={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:j,repoAuthor:k,repoName:x,isWillBoosterRepo:Boolean(j?.startsWith("github:WillBooster/")||j?.startsWith("github:WillBoosterLab/")),isBun:s?.isBun||e.existsSync(t.join(n,"bun.lock")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainSubPackageJsons:zt("packages/**/package.json",n),doesContainDockerfile:!!h||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainJavaScript:zt("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:zt("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:zt("{app,src,test}/**/*.{t,j}sx",n),doesContainJavaScriptInPackages:zt("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:zt("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:zt("packages/**/{app,src,test}/**/*.{t,j}sx",n),hasStartTestServer:!!l.scripts?.["start-test-server"],depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!c["gen-i18n-ts"],litestream:h.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},hasVersionSettings:g,packageJson:l,wbfyJson:w};if(_.isBun||(_.eslintBase=function(e){if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainTypeScript)return e.doesContainJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainJavaScript)return"@willbooster/eslint-config-js"}(_)),_.doesContainGemfile||_.doesContainGoMod||_.doesContainPackageJson||_.doesContainPoetryLock||_.doesContainPomXml||_.doesContainPubspecYaml||_.doesContainTemplateYaml)return _}catch{}}function zt(e,t){return p.globSync(e,{dot:!0,cwd:t,ignore:T}).length>0}async function Mt(e){const[t,n]=Le.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await Je().request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch(e){const t=function(e){if(!e||"object"!=typeof e)return;const t="response"in e?e.response:void 0,n=t?.status??e.status;if(301!==n&&302!==n)return;const s=t?.headers?.location;if("string"!=typeof s)return;const[i,r]=Le.getOrgAndName(s);if(!i||!r)return;return`${i}/${r}`}(e);t&&(s.full_name=t)}return s}function qt(e){return e.isWillBoosterConfigs&&!0===e.packageJson?.name?.startsWith("@willbooster/eslint-config-")}await async function(){const n=await r(process.argv.slice(2)).command("$0 [paths..]","Make a given project follow the WillBooster standard",e=>{e.positional("paths",{describe:"project paths to be wbfied",array:!0,type:"string",default:["."]})}).options({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;k.isVerbose=n.verbose,k.doesUploadEnvVars=n.env;for(const s of n.paths){const r=t.join(s,"packages"),o=(await i(()=>e.promises.readdir(r,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(r,e.name));await W([s,...o]);const a=await Ut(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=V(a),l=(await Promise.all(o.map(e=>Ut(e,a)))).filter(e=>!!e),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await Ft(a),a.isBun&&await oe(a);const d=!q(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([j(a),R(a),c.then(()=>dt(a)),ee(a,p),fe(a),ye(a),ke(a,p),xe(a),_e(a),Nt(a),Ae(a),gt(a),mt(a),...d?[M(a)]:[],Ot(a),Rt(a),Wt(a),st(a),ot(a)]),await S.promiseAll();const u=[];for(const e of p)qt(e)||((e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(D(e,e.isRoot?p:[e])),e.depending.playwrightTest&&u.push(F(e)),e.depending.next&&u.push(P(e)),await Pe(e,a),await S.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await ct(e),await Ye(e,a,n.skipDeps),u.push(ot(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push(Ct(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(St(e)),(e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&(a.isBun&&u.push(se(e)),a.isWillBoosterConfigs||u.push(be(e))),e.depending.pyright&&u.push(pt(e))));await Promise.all(u),await S.promiseAll();const m=a.isBun?"bun":"yarn";a.isBun?(e.rmSync(t.join(s,"bun.lock"),{force:!0}),Ie(m,["update"],s)):(e.rmSync(t.join(s,"yarn.lock"),{force:!0}),Ie(m,["install","--no-immutable"],s)),Ie(m,["cleanup"],s),a.isBun||Ie(m,["install","--no-immutable"],s),await vt(a)}}();
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9iaW9tZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy9lc2xpbnRVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy91dGlscy90c2NvbmZpZ0Jhc2UudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9sZWZ0aG9vay50cyIsIi4uL3NyYy91dGlscy9zcmNEaXJlY3Rvcmllcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3NraWxscy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3RzY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy95YXJucmMudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9zZWNyZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy9wYWNrYWdlQ29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xuICBkb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4RG9ja2VyZmlsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhEb2NrZXJmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGNvbmZpZy5kb2NrZXJmaWxlO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuXG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnRG9ja2VyZmlsZScpLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoJ1xcclxcbicsICdcXG4nKS50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCArPSAnXFxuJztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgLy8gUmVwbGFjZSB0aGUgSlNPTiBvYmplY3QgZnJvbSB0aGUgZmlsZVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoLz1cXHMqeyhbXFxTXFxzXSopfTsvLCAoXywgc2V0dGluZ3NUZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCdlc2xpbnQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICdlc2xpbnQ6IHsgaWdub3JlRHVyaW5nQnVpbGRzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCd0eXBlc2NyaXB0OicpKSB7XG4gICAgICAgIHNldHRpbmdzVGV4dCArPSAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9LCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gYD0geyR7c2V0dGluZ3NUZXh0fX07YDtcbiAgICB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbnR5cGUgUGFyc2VkVmFsdWUgPVxuICB8IHsga2luZDogJ2FycmF5JzsgdmFsdWU6IFBhcnNlZFZhbHVlW10gfVxuICB8IHsga2luZDogJ2xpdGVyYWwnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdvYmplY3QnOyB2YWx1ZTogUGFyc2VkT2JqZWN0IH07XG50eXBlIFBhcnNlZE9iamVjdCA9IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcblxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHZhbHVlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnb2JqZWN0JywgdmFsdWUgfSk7XG5cbmNvbnN0IGRlZmF1bHRDb25maWc6IFBhcnNlZE9iamVjdCA9IHtcbiAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICByZXRyaWVzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEnKSxcbiAgdXNlOiBhc09iamVjdCh7XG4gICAgYmFzZVVSTDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb25seS1vbi1mYWlsdXJlJ1wiKSxcbiAgICB2aWRlbzogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ3JldGFpbi1vbi1mYWlsdXJlJyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gIH0pLFxuICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICBjb21tYW5kOiBsaXRlcmFsKFwiJ3lhcm4gc3RhcnQtdGVzdC1zZXJ2ZXInXCIpLFxuICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICB9KSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBwbGF5d3JpZ2h0LmNvbmZpZy50c2ApO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBtYXRjaCA9IC9kZWZpbmVDb25maWdcXHMqXFwoXFxzKihcXHtbXFxzXFxTXSo/fSlcXHMqXFwpOz8vLmV4ZWMob2xkQ29udGVudCk7XG4gICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IG1hdGNoPy5bMV07XG4gICAgaWYgKCFvYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWwob2JqZWN0TGl0ZXJhbCk7XG4gICAgaWYgKCFwYXJzZWQpIHJldHVybjtcblxuICAgIC8vIEtlZXAgZmlsbGluZyBtaXNzaW5nIGRlZmF1bHRzLCBidXQgZG9uJ3Qgb3ZlcndyaXRlIGxvY2FsIGFkanVzdG1lbnRzIG9uIGV2ZXJ5IHJlZ2VuZXJhdGlvbi5cbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZS5hbGw8UGFyc2VkT2JqZWN0PihbZGVmYXVsdENvbmZpZywgcGFyc2VkXSk7XG4gICAgY29uc3QgaGFzU3RhcnRUZXN0U2VydmVyID0gQm9vbGVhbihjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHM/Llsnc3RhcnQtdGVzdC1zZXJ2ZXInXSk7XG4gICAgaWYgKCFoYXNTdGFydFRlc3RTZXJ2ZXIpIHtcbiAgICAgIGRlbGV0ZSBtZXJnZWQud2ViU2VydmVyO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0Jhc2VVcmwgPSBhd2FpdCBoYXNOZXh0UHVibGljQmFzZVVybChjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKCFoYXNCYXNlVXJsKSB7XG4gICAgICBjb25zdCB1c2VDb25maWcgPSBtZXJnZWQudXNlO1xuICAgICAgaWYgKHVzZUNvbmZpZz8ua2luZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZGVsZXRlIHVzZUNvbmZpZy52YWx1ZS5iYXNlVVJMO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5ld09iamVjdExpdGVyYWwgPSBzdHJpbmdpZnlPYmplY3QobWVyZ2VkLCAwKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKG9iamVjdExpdGVyYWwsIG5ld09iamVjdExpdGVyYWwpO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc05leHRQdWJsaWNCYXNlVXJsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBlbnZGaWxlUGF0aHMgPSBbcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZW52JyksIHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnbWlzZS50b21sJyldO1xuICBmb3IgKGNvbnN0IGVudkZpbGVQYXRoIG9mIGVudkZpbGVQYXRocykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoL05FWFRfUFVCTElDX0JBU0VfVVJMXFxzKj0vbS50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBlbnYgZmlsZXMgYXJlIGV4cGVjdGVkIGluIHNvbWUgcmVwb3MuXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsKG9iamVjdExpdGVyYWw6IHN0cmluZyk6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgJ3BsYXl3cmlnaHQtY29uZmlnLnRzJyxcbiAgICBgY29uc3QgY29uZmlnID0gJHtvYmplY3RMaXRlcmFsfTtgLFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgICB0cy5TY3JpcHRLaW5kLlRTXG4gICk7XG4gIGNvbnN0IHN0YXRlbWVudCA9IHNvdXJjZS5zdGF0ZW1lbnRzWzBdO1xuICBpZiAoIXN0YXRlbWVudCB8fCAhdHMuaXNWYXJpYWJsZVN0YXRlbWVudChzdGF0ZW1lbnQpKSByZXR1cm47XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gc3RhdGVtZW50LmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbMF07XG4gIGlmICghZGVjbGFyYXRpb24/LmluaXRpYWxpemVyIHx8ICF0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXRpYWxpemVyKSkgcmV0dXJuO1xuICByZXR1cm4gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihkZWNsYXJhdGlvbi5pbml0aWFsaXplciwgc291cmNlKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogdHMuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7fTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoIXRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fCAoIXRzLmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhdHMuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHBhcnNlZFtwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbiwgc291cmNlOiB0cy5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc291cmNlKTtcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0ID8gYXNPYmplY3QocGFyc2VkT2JqZWN0KSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmICh0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUudmFsdWUsIGxldmVsKTtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG4gIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUudmFsdWUsIGxldmVsKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkodmFsdWVzOiBQYXJzZWRWYWx1ZVtdLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZSh2YWx1ZSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgfSk7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3Qob2JqZWN0OiBQYXJzZWRPYmplY3QsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBsaW5lcyA9IE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKHZhbHVlLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gIH0pO1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyouZW52JywgJyouZW52LionXSwgeyBkb3Q6IHRydWUsIGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9EQVRBQkFTRV9VUkw9XCI/KC4rXFwuc3FsaXRlMylcIj9bXFxuJF0vLFxuICAgICAgICAnREFUQUJBU0VfVVJMPVwiJDE/Y29ubmVjdGlvbl9saW1pdD0xXCJcXG4nXG4gICAgICApO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGVudkZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24ocGFja2FnZURpclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlRGlyUGF0aHMubWFwKGFzeW5jIChwYWNrYWdlRGlyUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3Rlc3QnKTtcbiAgICAgICAgZm9yIChjb25zdCBvbGRUZXN0RGlyTmFtZSBvZiBbJ19fdGVzdHNfXycsICd0ZXN0cyddKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsIG9sZFRlc3REaXJOYW1lKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4Jyk7XG4gICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlQWxsKG9sZFRlc3REaXJOYW1lLCAndGVzdCcpO1xuICAgICAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBuZXdDb250ZW50KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBlRGVmaW5pdGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuOiBQYWNrYWdlQ29uZmlnW11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cGVEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsaWJUeXBlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0B0eXBlcycpO1xuICAgIGNvbnN0IHNyY1R5cGVEaXJQYXRoID1cbiAgICAgIGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zID8gdW5kZWZpbmVkIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnc3JjJywgJ3R5cGVzJyk7XG5cbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucmVhZGRpcihsaWJUeXBlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKTtcbiAgICBpZiAoIWRpcmVudHMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBkaXJlbnQubmFtZS5zbGljZSgwLCAtNSk7XG4gICAgICBjb25zdCBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPSBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgICAgIGxldCBwYWNrYWdlTmFtZSA9IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA/IGRpck5hbWUgOiBkaXJlbnQubmFtZTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZS5pbmNsdWRlcygnX18nKSkge1xuICAgICAgICBwYWNrYWdlTmFtZSA9IGBAJHtwYWNrYWdlTmFtZS5yZXBsYWNlKCdfXycsICcvJyl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0xpYnJhcnkgPSBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNvbmZpZykgPT5cbiAgICAgICAgICBjb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGhhc0xpYnJhcnkpIHtcbiAgICAgICAgICAvLyBNb3ZlIEB0eXBlcy88bmFtZT4vaW5kZXguZC50cyBpZiBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUpKTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lLCAnaW5kZXguZC50cycpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjVHlwZURpclBhdGgpIHtcbiAgICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4gaWYgbm90IGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBzcmNUeXBlRGlyUGF0aCAmJiAhaGFzTGlicmFyeSkge1xuICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4uZC50cyBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgaWdub3JlRW5vZW50QXN5bmMoKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ2luZGV4LmQudHMnKSxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBgJHtkaXJlbnQubmFtZX0uZC50c2ApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50ICovXG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVNZXJnZSh0YXJnZXQ6IG9iamVjdFtdLCBzb3VyY2U6IG9iamVjdFtdLCBvcHRpb25zOiBhbnkpOiBvYmplY3RbXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdIGFzIG9iamVjdCwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCBwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ2F1dG9maXguY2knLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICBwdXNoOiB7XG4gICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgfSxcbiAgfSxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBjb250ZW50czogJ3JlYWQnLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnYXV0b2ZpeC0ke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ0ZpeCBjb2RlIGF1dG9tYXRpY2FsbHknLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDoge1xuICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hdXRvZml4LnltbEBtYWluJyxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgbGludGVyIGZpeFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jbGF1ZGUnOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggQ2xhdWRlIENvZGUnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY2xhdWRlJylcIixcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9nZW4tcHIueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2NvZGluZy10b29sJzogJ2NsYXVkZS1jb2RlJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogJyR7eyBzZWNyZXRzLkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jb2RleCc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDb2RleCBDTEknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY29kZXgnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY29kZXgtY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBPUEVOQUlfQVBJX0tFWTogJyR7eyBzZWNyZXRzLk9QRU5BSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1nZW1pbmknOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggR2VtaW5pIENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1nZW1pbmknKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnZ2VtaW5pLWNsaScsXG4gICAgICAgICAgJ2lzc3VlLW51bWJlcic6ICcke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB8fCBnaXRodWIuZXZlbnQubnVtYmVyIH19JyxcbiAgICAgICAgICAndGVzdC1jb21tYW5kJzogJ3lhcm58YnVuIGNoZWNrLWFsbC1mb3ItYWknLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0VNSU5JX0FQSV9LRVk6ICcke3sgc2VjcmV0cy5HRU1JTklfQVBJX0tFWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JyB8ICdhdXRvZml4JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpKSB7XG4gICAgICAvLyBEb24ndCB0b3VjaCByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBiZWNhdXNlIGl0IGhvc3RzIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlbW92ZSBjb25maWcgb2Ygc2VtYW50aWMgcHVsbCByZXF1ZXN0XG4gICAgY29uc3Qgc2VtYW50aWNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnc2VtYW50aWMueW1sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHNlbWFudGljWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICdhdXRvZml4LnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAnZ2VuLXByLWNsYXVkZS55bWwnLFxuICAgICAgJ2dlbi1wci1jb2RleC55bWwnLFxuICAgICAgJ2dlbi1wci1nZW1pbmkueW1sJyxcbiAgICAgIC4uLmVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lU2V0KSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGNvbnN0IGtpbmQgPSBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lLCAnLnltbCcpIGFzIEtub3duS2luZDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9zaXRvcnk/LmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG4gIGNvbnN0IGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnKSk7XG5cbiAgaWYgKGtpbmQgPT09ICdhdXRvZml4Jykge1xuICAgIGF3YWl0IHdyaXRlWWFtbChnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWcpLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG4gIC8vIFNraXAgYSBicm9rZW4gd29ya2Zsb3dcbiAgaWYgKCEoJ2pvYnMnIGluIG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9ICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnO1xuICB9XG5cbiAgbGV0IGlzUmV1c2FibGVXb3JrZmxvdyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcygnL3JldXNhYmxlLXdvcmtmbG93cy8nKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCB1c2UgcmVsZWFzZS55bWwgaWYgcmVsZWFzZSBicmFuY2ggaXMgbm90IHNwZWNpZmllZFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3JlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBObyBkZWZhdWx0XG4gIH1cbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jPy53aXRoKSByZXR1cm47XG5cbiAgICAvLyBHZW5lcmF0ZSBzeW5jLWZvcmNlLnltbCBiYXNlZCBvbiBzeW5jLnltbCBpZiBpdCBleGlzdHMuXG4gICAgbmV3U2V0dGluZ3Muam9ic1snc3luYy1mb3JjZSddID0gbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IGAtLWZvcmNlICR7cGFyYW1zfWA7XG4gICAgbmV3U2V0dGluZ3MubmFtZSA9ICdGb3JjZSB0byBTeW5jJztcbiAgICBuZXdTZXR0aW5ncy5vbiA9IHsgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwgfTtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWZvcmNlLnltbCcpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgam9iLnNlY3JldHMgPz89IHt9O1xuICAvLyBVc2UgdHJ1c3RlZCBwdWJsaXNoaW5nIGluc3RlYWQgb2YgTlBNX1RPS0VOXG4gIGRlbGV0ZSBqb2Iuc2VjcmV0cy5OUE1fVE9LRU47XG5cbiAgaWYgKFxuICAgIGtpbmQgPT09ICd0ZXN0JyB8fFxuICAgIGtpbmQgPT09ICdyZWxlYXNlJyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItY29kZXgnIHx8XG4gICAga2luZCA9PT0gJ2dlbi1wci1nZW1pbmknXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkdIX1RPS0VOID0gJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fSc7XG4gIH1cblxuICAvLyBTZXQgdGVzdC1jb21tYW5kIGZvciBnZW4tcHIgd29ya2Zsb3dzIGJhc2VkIG9uIHBhY2thZ2UgbWFuYWdlclxuICBpZiAoa2luZCA9PT0gJ2dlbi1wci1jbGF1ZGUnIHx8IGtpbmQgPT09ICdnZW4tcHItY29kZXgnIHx8IGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJykge1xuICAgIGpvYi53aXRoWyd0ZXN0LWNvbW1hbmQnXSA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuIGNoZWNrLWFsbC1mb3ItYWknIDogJ3lhcm4gY2hlY2stYWxsLWZvci1haSc7XG4gIH1cbiAgaWYgKGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOKSB7XG4gICAgam9iLnNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSA9ICcke3sgc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIH19JztcbiAgICBkZWxldGUgam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU47XG4gIH1cbiAgaWYgKFxuICAgIChqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkpIHx8XG4gICAgKGpvYi53aXRoLnNlcnZlcl91cmwgJiYga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSlcbiAgKSB7XG4gICAgam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCA9ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUxFQVNFIH19JztcbiAgfVxuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBwYXJhbXMucmVwbGFjZSgnc3luYyAnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3RlckxhYi8nLCAnV2lsbEJvb3N0ZXIvJyk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGguZG90X2Vudl9wYXRoID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGguZG90X2Vudl9wYXRoO1xuICB9XG5cbiAgLy8gRG9uJ3QgdXNlIGBmbHkgZGVwbG95IC0tanNvbmAgc2luY2UgaXQgY2F1c2VzIGFuIGVycm9yXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmIGpvYi5zZWNyZXRzLkZMWV9BUElfVE9LRU4gJiYgdHlwZW9mIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID09PSAnc3RyaW5nJykge1xuICAgIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID0gam9iLndpdGguZGVwbG95X2NvbW1hbmQucmVwbGFjZSgvXFxzKy0tanNvbi8sICcnKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSAmJiAham9iLndpdGguY2lfbGFiZWwgJiYga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9ICdsYXJnZSc7XG4gIH1cbiAgLy8gQmVjYXVzZSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5wcml2YXRlIGlzIGFsd2F5cyB0cnVlIGlmIGpvYiBpcyBzY2hlZHVsZWRcbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kID09PSAndGVzdCcgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lcjtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi5zZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gTW92ZSBzZWNyZXRzIHByb3AgYWZ0ZXIgd2l0aCBwcm9wXG4gICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKGpvYi5zZWNyZXRzKTtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBXb3JrZmxvdyB7XG4gIGlmICghY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIHJldHVybiBjbG9uZURlZXAocHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3cpO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgY29uc3Qgc3RlcHM6IFN0ZXBbXSA9IFtcbiAgICB7IHVzZXM6ICdhY3Rpb25zL2NoZWNrb3V0QHY2JyB9LFxuICAgIHsgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NicsIHdpdGg6IHsgJ2NoZWNrLWxhdGVzdCc6IHRydWUgfSB9LFxuICAgIC4uLihjb25maWcuaXNCdW4gPyBbeyB1c2VzOiAnb3Zlbi1zaC9zZXR1cC1idW5AdjEnLCB3aXRoOiB7ICdidW4tdmVyc2lvbic6ICdsYXRlc3QnIH0gfV0gOiBbXSksXG4gICAgeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsYCB9LFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGNsZWFudXBgIH0sXG4gIF07XG4gIGlmIChjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHM/LmJ1aWxkKSB7XG4gICAgc3RlcHMucHVzaCh7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBidWlsZGAgfSk7XG4gIH1cbiAgc3RlcHMucHVzaCh7IHVzZXM6ICdhdXRvZml4LWNpL2FjdGlvbkB2MScgfSk7XG5cbiAgY29uc3QgYXV0b2ZpeFdvcmtmbG93ID0gY2xvbmVEZWVwKHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3cpO1xuICBjb25zdCBhdXRvZml4Sm9iID0gYXV0b2ZpeFdvcmtmbG93LmpvYnMuYXV0b2ZpeCA/PyB7ICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnIH07XG4gIGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPSB7IC4uLmF1dG9maXhKb2IsIHN0ZXBzIH07XG4gIHJldHVybiBhdXRvZml4V29ya2Zsb3c7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeWFtbFRleHQgPSB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSwgbm9Db21wYXRNb2RlOiB0cnVlLCBzdHlsZXM6IHsgJyEhbnVsbCc6ICdlbXB0eScgfSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCB5YW1sVGV4dCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLihbXiRdKS9nLCAnY2YuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLihbXiRdKS9nLCAnZS5nLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oW14kXSkvZywgJ2kuZS4kMScpO1xufVxuXG5mdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopZWdcXC4vZywgJy8vJDFlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWllXFwuL2csICcvLyQxaS5lLicpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXJvb3RDb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiBBR0VOVFNfRVhUUkEubWQgZXhpc3RzIGFuZCByZWFkIGl0cyBjb250ZW50XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiBcXGAke3Jvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgJ3Vua25vd24nfVxcYFxuLSBEZXNjcmlwdGlvbjogJHtyb290Q29uZmlnLnBhY2thZ2VKc29uPy5kZXNjcmlwdGlvbn1cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIENyZWF0ZSBhIG5ldyBicmFuY2ggaWYgdGhlIGN1cnJlbnQgYnJhbmNoIGlzIFxcYG1haW5cXGAuXG4tIFJ1biBhbnkgXFxgZ2l0XFxgIGNvbW1hbmRzIHNlcXVlbnRpYWxseS5cbi0gV3JpdGUgdGVzdHMgT05MWSBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAgLSBNYWtlIHN1cmUgdG8gY29udGludWUgdG8gbW9kaWZ5IHRoZSB0ZXN0cyBhbmQgY29kZSB1bnRpbCB0aGUgdGVzdHMgcGFzcy5cbi0gV2hlbiBmaXhpbmcgdGVzdHMsIGdhdGhlciBkZWJ1ZyBpbmZvcm1hdGlvbiB0aHJvdWdoIGxvZ2dpbmcgYW5kIHNjcmVlbnNob3RzIGJlZm9yZSBtb2RpZnlpbmcgdGhlIGNvZGUuXG4tIEFmdGVyIG1ha2luZyBjb2RlIGNoYW5nZXMsIHJ1biBcXGAke3BhY2thZ2VNYW5hZ2VyfSBjaGVjay1hbGwtZm9yLWFpXFxgIHRvIGV4ZWN1dGUgYWxsIHRlc3RzICh0YWtlcyB1cCB0byAxIGhvdXIpLCBvciBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stZm9yLWFpXFxgIGZvciB0eXBlIGNoZWNraW5nIGFuZCBsaW50aW5nIG9ubHkgKHRha2VzIHVwIHRvIDEwIG1pbnV0ZXMpLlxuICAtIElmIHlvdSBhcmUgY29uZmlkZW50IHlvdXIgY2hhbmdlcyB3aWxsIG5vdCBicmVhayBhbnkgdGVzdHMsIHlvdSBtYXkgdXNlIFxcYGNoZWNrLWZvci1haVxcYC5cbi0gT25jZSB5b3UgaGF2ZSB2ZXJpZmllZCB5b3VyIGNoYW5nZXMsIGNvbW1pdCBhbmQgcHVzaCB0aGVtIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoIHRoZW4gY3JlYXRlIGEgUFIgdmlhIFxcYGdoXFxgLlxuICAtIEZvbGxvdyB0aGUgY29udmVudGlvbmFsIGNvbW1pdHM7IHlvdXIgY29tbWl0IG1lc3NhZ2Ugc2hvdWxkIHN0YXJ0IHdpdGggXFxgZmVhdDpcXGAsIFxcYGZpeDpcXGAsIGV0Yy5cbiAgLSBJZiBub3Qgc3BlY2lmaWVkLCBtYWtlIHN1cmUgdG8gYWRkIGEgbmV3IGxpbmUgYXQgdGhlIGVuZCBvZiB5b3VyIGNvbW1pdCBtZXNzYWdlJHtyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvID8gYCB3aXRoOiBcXGBDby1hdXRob3JlZC1ieTogV2lsbEJvb3N0ZXIgKCR7dG9vbE5hbWV9KSA8YWdlbnRAd2lsbGJvb3N0ZXIuY29tPlxcYGAgOiAnJ30uXG4gIC0gQWx3YXlzIGNyZWF0ZSBuZXcgY29tbWl0cy4gQXZvaWQgdXNpbmcgXFxgLS1hbWVuZFxcYC5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5oYXNTdGFydFRlc3RTZXJ2ZXIpXG4gICAgPyBgLSBVc2UgXFxgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIHN0YXJ0LXRlc3Qtc2VydmVyXFxgIHRvIGxhdW5jaCBhIHdlYiBzZXJ2ZXIgZm9yIGRlYnVnZ2luZyBvciB0ZXN0aW5nLmBcbiAgICA6ICcnXG59XG5cbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3MpfVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG5cbiAgY29uc3QgaGFzTmV3U2VjdGlvbiA9IGV4dHJhQ29udGVudD8udHJpbSgpLnN0YXJ0c1dpdGgoJyMnKTtcbiAgY29uc3Qgbm9ybWFsaXplZEV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudFxuICAgID8gaGFzTmV3U2VjdGlvblxuICAgICAgPyAnXFxuXFxuJyArIGV4dHJhQ29udGVudC50cmltKClcbiAgICAgIDogJ1xcbicgKyBleHRyYUNvbnRlbnRcbiAgICA6ICcnO1xuICByZXR1cm4gYmFzZUNvbnRlbnQgKyBub3JtYWxpemVkRXh0cmFDb250ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBlYWNoIG1vZHVsZSB3aXRoIGhpZ2ggY29oZXNpb24sIGdyb3VwaW5nIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSB0b2dldGhlci5cbiAgLSBSZWZhY3RvciBleGlzdGluZyBsYXJnZSBtb2R1bGVzIGludG8gc21hbGxlciwgZm9jdXNlZCBtb2R1bGVzIHdoZW4gbmVjZXNzYXJ5LlxuICAtIENyZWF0ZSB3ZWxsLW9yZ2FuaXplZCBkaXJlY3Rvcnkgc3RydWN0dXJlcyB3aXRoIGxvdyBjb3VwbGluZyBhbmQgaGlnaCBjb2hlc2lvbi5cbi0gV2hlbiBhZGRpbmcgbmV3IGZ1bmN0aW9ucyBvciBjbGFzc2VzLCBkZWZpbmUgdGhlbSBiZWxvdyBhbnkgZnVuY3Rpb25zIG9yIGNsYXNzZXMgdGhhdCBjYWxsIHRoZW0gdG8gbWFpbnRhaW4gYSBjbGVhciB0b3AtZG93biBjYWxsIG9yZGVyLlxuLSBXcml0ZSBjb21tZW50cyB0aGF0IGV4cGxhaW4gXCJ3aHlcIiByYXRoZXIgdGhhbiBcIndoYXRcIi4gQXZvaWQgc3RhdGluZyB3aGF0IGNhbiBiZSB1bmRlcnN0b29kIGZyb20gdGhlIGNvZGUgaXRzZWxmLlxuLSBQcmVmZXIgXFxgdW5kZWZpbmVkXFxgIG92ZXIgXFxgbnVsbFxcYCB1bmxlc3MgZXhwbGljaXRseSByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gUHJlZmVyIHVzaW5nIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgZm9yIHByb21wdHMgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgd2l0aCBhbiBhcnJheSBvZiBzdHJpbmdzLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBXaGVuIGludHJvZHVjaW5nIG5ldyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgdXBkYXRlIHRoZSBsYW5ndWFnZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUgXFxgaTE4blxcYCBkaXJlY3RvcnkgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkuIFJlZmVyZW5jZSB0aGVzZSBzdHJpbmdzIHVzaW5nIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkuIEZvciBleGFtcGxlLCB1c2UgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIGZvciBzdG9yaW5nIGFuIGFycmF5IG9yIGFuIG9iamVjdCB0byBcXGB1c2VTdGF0ZVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYFxuLSBTaW5jZSB0aGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgXFxgdXNlQ2FsbGJhY2tcXGAgb3IgXFxgdXNlTWVtb1xcYCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxuLSBBc3N1bWUgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UuXG5gXG4gICAgOiAnJ1xufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCBleHRyYUNvbnRlbnQpO1xuICByZXR1cm4gYCR7ZnJvbnRtYXR0ZXJ9XFxuXFxuJHtib2R5fWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQmlvbWVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHtcbiAgICAgIHJvb3Q6IGNvbmZpZy5pc1Jvb3QsXG4gICAgICAkc2NoZW1hOiAnLi9ub2RlX21vZHVsZXMvQGJpb21lanMvYmlvbWUvY29uZmlndXJhdGlvbl9zY2hlbWEuanNvbicsXG4gICAgICBleHRlbmRzOiBbJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnXSxcbiAgICB9O1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYmlvbWUuanNvbmMnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudFdpdGhFeGFjdFRydWUgPSBgZW52ID0gZmFsc2VcbnRlbGVtZXRyeSA9IGZhbHNlXG5cbltpbnN0YWxsXVxuZXhhY3QgPSB0cnVlXG5saW5rZXIgPSBcImhvaXN0ZWRcIlxubWluaW11bVJlbGVhc2VBZ2UgPSA0MzIwMDAgIyA1IGRheXNcbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gICAgXCJAZXhlcmNvZGUvcHJvYmxlbS11dGlsc1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2JhYmVsLWNvbmZpZ3NcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9iaW9tZS1jb25maWdcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdFwiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dFwiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHNcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0XCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYlwiLFxuICAgIFwiQHdpbGxib29zdGVyL3diXCIsXG4gICAgXCJuZXh0XCIsXG4gICAgXCJAbmV4dC8qXCIsXG4gICAgXCJyZWFjdFwiLFxuICAgIFwicmVhY3QtZG9tXCJcbl1cbmA7XG5cbmNvbnN0IG5ld0NvbnRlbnRXaXRoRXhhY3RGYWxzZSA9IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlLnJlcGxhY2UoJ2V4YWN0ID0gdHJ1ZScsICdleGFjdCA9IGZhbHNlJyk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJ1bmZpZ1RvbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCdW5maWdUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgICBjb25zdCBjb250ZW50ID1cbiAgICAgIGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpICYmIGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKS5pbmNsdWRlcygnZXhhY3QgPSBmYWxzZScpXG4gICAgICAgID8gbmV3Q29udGVudFdpdGhFeGFjdEZhbHNlXG4gICAgICAgIDogbmV3Q29udGVudFdpdGhFeGFjdFRydWU7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGXjgafjga9ub2RlX21vZHVsZXPjgpJDT1BZ44GZ44KL5b+F6KaB44GM44GC44KL44Gf44KB44CBbm9kZV9tb2R1bGVz44KS6Zmk5aSW44GX44Gm44Gv44GE44GR44Gq44GE44CCXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuKiovLmlkZWFcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IHtcbiAgY29kZVdpdGgySW5kZW50U2l6ZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjcHAnLFxuICAgICdkYXJ0JyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3B1JyxcbiAgICAncHVtbCcsXG4gICAgJ3JiJyxcbiAgICAndnVlJyxcbiAgICAneG1sJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ3NoJyxcbiAgXS50b1NvcnRlZCgpLFxuICBjb2RlV2l0aDRJbmRlbnRTaXplOiBbJ2dvJywgJ2dyYWRsZScsICdqYXZhJywgJ3B5J10udG9Tb3J0ZWQoKSxcbiAgbWFya2Rvd25MaWtlOiBbJ21kJ10udG9Tb3J0ZWQoKSxcbiAgZXNsaW50OiBbJ2NqcycsICdtanMnLCAnanMnLCAnY3RzJywgJ210cycsICd0cycsICd0c3gnLCAnanN4J10udG9Tb3J0ZWQoKSxcbiAgcHJldHRpZXI6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnamF2YScsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NzcycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdtZCcsXG4gICAgJ3Njc3MnLFxuICAgICd2dWUnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS50b1NvcnRlZCgpLFxuICAvLyBjZi4gaHR0cHM6Ly9iaW9tZWpzLmRldi9pbnRlcm5hbHMvbGFuZ3VhZ2Utc3VwcG9ydC9cbiAgYmlvbWU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ2FzdHJvJyxcbiAgICAnY3NzJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ2dxbCcsXG4gIF0udG9Tb3J0ZWQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFc2xpbnRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVzbGludHJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5tanMnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLmVzbGludEJhc2UpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoIW9sZENvbnRlbnQuaW5jbHVkZXMoJ2V4cG9ydCB7IGRlZmF1bHQgfScpKSByZXR1cm47XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnJHtjb25maWcuZXNsaW50QmFzZX0nO2ApKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUgfSBmcm9tICcuL2FnZW50cy5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gIGhhdmVfZnVuOiB0cnVlLFxuICBjb2RlX3Jldmlldzoge1xuICAgIGRpc2FibGU6IGZhbHNlLFxuICAgIGNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkOiAnTUVESVVNJyxcbiAgICBtYXhfcmV2aWV3X2NvbW1lbnRzOiAtMSxcbiAgICBwdWxsX3JlcXVlc3Rfb3BlbmVkOiB7XG4gICAgICBoZWxwOiBmYWxzZSxcbiAgICAgIHN1bW1hcnk6IHRydWUsXG4gICAgICBjb2RlX3JldmlldzogdHJ1ZSxcbiAgICB9LFxuICB9LFxuICBpZ25vcmVfcGF0dGVybnM6IFsnKiovX19nZW5lcmF0ZWRfXyddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2VtaW5pQ29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueW1sJyk7XG4gICAgY29uc3Qgc3R5bGVndWlkZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzdHlsZWd1aWRlLm1kJyk7XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBjbG9uZURlZXAoZGVmYXVsdENvbmZpZyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShjb25maWdGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSBwYXJzZWRcbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChuZXdDb25maWcsIHtcbiAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYOS7peS4i+OBruOCs+ODvOODh+OCo+ODs+OCsOimj+e0hOOCkui4j+OBvuOBiOOBpuOAgeaXpeacrOiqnuOBp+ODrOODk+ODpeODvOOBl+OBpuOBj+OBoOOBleOBhOOAglxcblxcbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3MpfSR7XG4gICAgICBleHRyYUNvbnRlbnQgPyBgXFxuXFxuJHtleHRyYUNvbnRlbnQudHJpbUVuZCgpfWAgOiAnJ1xuICAgIH1gO1xuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSldO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhzdHlsZWd1aWRlRmlsZVBhdGgpKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHN0eWxlZ3VpZGVGaWxlUGF0aCwgc3R5bGVndWlkZUNvbnRlbnQpKSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHZW1pbmlTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc2V0dGluZ3MuanNvbicpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy9pbnN0YWxsL2dpdC1kaWZmLWJ1bi1sb2NrZmlsZVxuY29uc3QgbmV3Q29udGVudCA9IGAqIHRleHQ9YXV0b1xuXG4qLmxvY2tiIGJpbmFyeSBkaWZmPWxvY2tiXG4qLnZjcHJvaiB0ZXh0IGVvbD1jcmxmXG5cbiR7Wy4uLmV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLm1hcmtkb3duTGlrZV1cbiAgLm1hcCgoZXh0KSA9PiBgKi4ke2V4dH0gdGV4dCBlb2w9bGZgKVxuICAuam9pbignXFxuJyl9XG5cbmRpc3QvKiogbGluZ3Vpc3QtZ2VuZXJhdGVkPXRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGF0dHJpYnV0ZXMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBkZWZhdWx0TmFtZXMgPSBbJ3dpbmRvd3MnLCAnbWFjb3MnLCAnbGludXgnLCAnamV0YnJhaW5zJywgJ3Zpc3VhbHN0dWRpb2NvZGUnLCAnZW1hY3MnLCAndmltJywgJ3lhcm4nXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbiEua2VlcFxuLmFpZGVyKlxuLmVudi5wcm9kdWN0aW9uXG4qL21vdW50LyouaGFzaFxuLmRldmNvbnRhaW5lci9cbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4uc2VyZW5hL1xuLnRtcC9cbl9fZ2VuZXJhdGVkX18vXG5Ad2lsbGJvb3N0ZXIvXG5kaXN0L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Hb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAqLnNxbGl0ZTMqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBwbGF5d3JpZ2h0LXJlcG9ydC9cbnRlc3QtcmVzdWx0cy9cbi5wbGF5d3JpZ2h0LWNsaS9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdyZWFjdG5hdGl2ZScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnb29nbGUtc2VydmljZXMuanNvblxuYW5kcm9pZC9hcHAvc3JjL21haW4vYXNzZXRzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc3Rvcnlib29rKSB7XG4gICAgICBuYW1lcy5wdXNoKCdzdG9yeWJvb2tqcycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdGVkID0gJyc7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IChhd2FpdCByZWFkQ2FjaGUobmFtZSkpID8/ICcnO1xuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy50b3B0YWwuY29tL2RldmVsb3BlcnMvZ2l0aWdub3JlL2FwaS8ke25hbWV9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdBdHRlbnRpb24gUmVxdWlyZWQhJykgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCc8dGl0bGU+JykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSByZXNwb25zZVRleHQudHJpbSgpO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVDYWNoZShuYW1lLCBjb250ZW50KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRmV0Y2hlZCAke3VybH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdlbmVyYXRlZCkgZ2VuZXJhdGVkICs9ICdcXG4nO1xuICAgICAgZ2VuZXJhdGVkICs9IGNvbnRlbnQgKyAnXFxuJztcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaWdub3JlRmlsZVV0aWwuaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aCkpKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZSgnIS55YXJuL2NhY2hlJywgJyMgIS55YXJuL2NhY2hlJykucmVwbGFjZSgnIyAucG5wLionLCAnLnBucC4qJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eKC5pZGVhXFwvLispJC9nbSwgJyQxXFxuYW5kcm9pZC8kMScpO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgJ1xcbicgKyBnZW5lcmF0ZWQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNhY2hlJywgJ3diZnknLCAnZ2l0aWdub3JlJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FjaGUobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpO1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhdC5tdGltZU1zID4gNiAqIDYwICogNjAgKiAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cblxuY29uc3QgcHJldHRpZXJDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnLCAnUHJldHRpZXInLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5jb25zdCBiaW9tZUNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdidW4nLCAnLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vYmlvbWUgY2hlY2sgLS1maXggLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0tc2tpcC1wYXJzZS1lcnJvcnMnLCAnQmlvbWUnLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5Hb01vZCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluUG9tWG1sKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWcuaXNCdW4gPyBiaW9tZUNvbnRlbnQgOiBwcmV0dGllckNvbnRlbnQpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBpZiAocmV0LnN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3RkZXJyIG9uIEVOT0VOVC5cbiAgY29uc3Qgc3RkZXJyID0gcHJvYy5zdGRlcnIgPz8gJyc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycgPyBzdGRlcnIudHJpbSgpIDogc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAocHJvYy5lcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIGZhaWxlZCB3aXRoOiAke3Byb2MuZXJyb3IubWVzc2FnZX1gKTtcbiAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gb3V0cHV0cyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdG8gc3RkZXJyOlxcbiR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRvdXQgb24gRU5PRU5ULlxuICBjb25zdCBzdGRvdXQgPSBwcm9jLnN0ZG91dCA/PyAnJztcbiAgcmV0dXJuIHR5cGVvZiBzdGRvdXQgPT09ICdzdHJpbmcnID8gc3Rkb3V0LnRyaW0oKSA6IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5yZXBsYWNlKGAke2Vudi5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJyk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb1VybCA9IGBnaXRAZ2l0aHViLmNvbToke29yZ2FuaXphdGlvbn0vJHtyZXBvfS5naXRgO1xuICAgIGNvbnN0IG91dHB1dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydscy1yZW1vdGUnLCByZXBvVXJsLCAnSEVBRCddLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gb3V0cHV0LnNwbGl0KC9cXHMrLylbMF07XG4gICAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29tbWl0SGFzaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCkpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IEVzbGludFV0aWwgPSB7XG4gIGdldExpbnRGaXhTdWZmaXgoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggPyAnIC0tcnVsZSBcInsgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzOiAwIH1cIicgOiAnJztcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmNsYXNzIEdpdEh1YlV0aWwge1xuICBnZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGNvbnN0IHVybFdpdGhvdXRQcm90b2NvbCA9IHVybE9yRnVsbE5hbWUuc3BsaXQoJzonKS5hdCgtMSk7XG4gICAgY29uc3QgbmFtZXMgPSB1cmxXaXRob3V0UHJvdG9jb2w/LnNwbGl0KCcvJyk7XG4gICAgY29uc3Qgb3JnID0gbmFtZXM/LmF0KC0yKSA/PyAnJztcbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvLmdpdCQvLCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICBjb25zdCBrZXkgPSBvd25lciA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVI7XG4gIH1cbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFc2xpbnRFeHRlbnNpb25CYXNlLCBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcblxuY29uc3QganNDb21tb25EZXBzID0gW1xuICAnQGVzbGludC9qcycsXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbiAgJ2VzbGludC1wbHVnaW4tdW51c2VkLWltcG9ydHMnLFxuICAnZ2xvYmFscycsXG5dO1xuXG5jb25zdCB0c0NvbW1vbkRlcHMgPSBbLi4uanNDb21tb25EZXBzLCAndHlwZXNjcmlwdC1lc2xpbnQnLCAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0J107XG5cbmNvbnN0IHJlYWN0Q29tbW9uRGVwcyA9IFsnZXNsaW50LXBsdWdpbi1yZWFjdCcsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJywgJ2VzbGludC1wbHVnaW4tcmVhY3QtY29tcGlsZXInXTtcblxuY29uc3QgZXNsaW50RGVwczogUmVjb3JkPEVzbGludEV4dGVuc2lvbkJhc2UsIHN0cmluZ1tdPiA9IHtcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsIC4uLmpzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLCAuLi5qc0NvbW1vbkRlcHMsIC4uLnJlYWN0Q29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLCAuLi50c0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JywgLi4udHNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICAgJ0BuZXh0L2VzbGludC1wbHVnaW4tbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoanNvbk9iaiBhcyBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz4pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgIC8vIEZyZXNoIHJlcG8gc3RpbGwgcmVxdWlyZXMgJ3lhcm4gaW5zdGFsbCdcbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC95YXJuXFxzKiYmXFxzKi8sICcnKS5yZXBsYWNlKC95YXJuXFxzKmluc3RhbGxcXHMqJiZcXHMqLywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGpzb25PYmouc2NyaXB0cyA9IG1lcmdlKGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSk7XG5cbiAgaWYgKCdjaGVjay1mb3ItYWknIGluIGpzb25PYmouc2NyaXB0cykge1xuICAgIGlmICgnZ2VuLWNvZGUnIGluIGpzb25PYmouc2NyaXB0cykge1xuICAgICAganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZSA+IC9kZXYvbnVsbCAmJiAke2pzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbiAgICB9XG4gICAganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsID4gL2Rldi9udWxsICYmICR7anNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXX1gO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5ID0gKGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeSA/PyAnJykgKyAoYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCkpO1xuICB9XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1hbGwnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tcmVjdXJzaXZlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXNpbmNlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXdvcmt0cmVlJylcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJywgJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsJyk7XG4gIH1cblxuICBsZXQgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZGV2RGVwZW5kZW5jaWVzID0gWydwcmV0dGllcicsICdzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBwb2V0cnlEZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKFxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICB9IGVsc2Uge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdsaW50LXN0YWdlZCcpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuaHVza3k7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcGFjaztcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrO1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xlZnRob29rJyk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgY29uZmlnLmlzQnVuKSB7XG4gICAgaWYgKGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHdpbGxib29zdGVyL3diJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC93YlxccytkYi8sICd3YiBwcmlzbWEnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAYmlvbWVqcy9iaW9tZScsICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyk7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuZXNsaW50O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLm1pY3JvbWF0Y2g7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3R5cGVzY3JpcHQtZXNsaW50J107XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdlc2xpbnQnLCAnbWljcm9tYXRjaCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4uZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZykpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgndHlwZXNjcmlwdCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5lc2xpbnRCYXNlKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4uZXNsaW50RGVwc1tjb25maWcuZXNsaW50QmFzZV0pO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIH1cblxuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gQmVjYXVzZSBgXCJyZXNvbHV0aW9uc1wiOiB7IFwibnBtL2NoYWxrXCI6IFwiXjQuMS4yXCIgfSxgIGNhdXNlcyBcIkludmFsaWQgbnBtIHRva2VuXCJcbiAgZGVsZXRlIGpzb25PYmoucmVzb2x1dGlvbnM/LlsnbnBtL2NoYWxrJ107XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBpZiAoIWNvbmZpZy5pc0J1bikge1xuICAgICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMubGludDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXTtcbiAgICAgICAgZm9yIChjb25zdCBzY3JpcHROYW1lIG9mIFsnY2xlYW51cCcsICdjaGVjay1mb3ItYWknXSkge1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICAgICAgICBpZiAoIXNjcmlwdCkgY29udGludWU7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdID0gc2NyaXB0LnJlcGxhY2UoLyA/JiYgP3lhcm4gbGludC1maXgoPzogLS1xdWlldCk/LywgJycpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAoanNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID8/ICcnKSArIEVzbGludFV0aWwuZ2V0TGludEZpeFN1ZmZpeChjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGRhcnQgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IChqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID8/ICcnKSArIGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPT09ICdwb2V0cnkgaW5zdGFsbCcpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KC9bL1xcXFxdLyk7XG4gICAgICAgIGlmIChmaXJzdCAmJiBzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgcG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgcG9ldHJ5IHJ1biBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IChqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID8/ICcnKSArIGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICAgIHBvZXRyeURldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnkgfHwganNvbk9iai5yZXBvc2l0b3J5KSB7XG4gICAganNvbk9iai5yZXBvc2l0b3J5ID0gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKGNvbmZpZy5yZXBvc2l0b3J5ID8/IGpzb25PYmoucmVwb3NpdG9yeSwganNvbk9iai5yZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ2JsaXR6IGNvZGVnZW4nKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ2JsaXR6IGNvZGVnZW4nO1xuICAgIH0gZWxzZSBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5pbmNsdWRlcygnYmxpdHogcHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5yZXBsYWNlKFxuICAgICAgICAnYmxpdHogY29kZWdlbicsXG4gICAgICAgICdibGl0eiBjb2RlZ2VuICYmIGJsaXR6IHByaXNtYSBnZW5lcmF0ZSdcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hICYmICFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ3ByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ3ByaXNtYSBnZW5lcmF0ZSc7XG4gIH1cblxuICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzLnByZXR0aWVyKSB7XG4gICAgLy8gQmVjYXVzZSBAdHlwZXMvcHJldHRpZXIgYmxvY2tzIHByZXR0aWVyIGV4ZWN1dGlvbi5cbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlcy9wcmV0dGllciddO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmoucGVlckRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmoucGVlckRlcGVuZGVuY2llcztcbiAgfVxuXG4gIGF3YWl0IHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqKTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgbGV0IG5ld0pzb25UZXh0ID0gSlNPTi5zdHJpbmdpZnkoanNvbk9iaik7XG4gIG5ld0pzb25UZXh0ID0gYXdhaXQgZml4U2NyaXB0TmFtZXMoanNvbk9iai5zY3JpcHRzLCBuZXdKc29uVGV4dCwgY29uZmlnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdKc29uVGV4dCk7XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRldkRlcGVuZGVuY2llcy5cbiAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZGVwZW5kZW5jeVNwZWNpZmllcnMgPSBbLi4ubmV3IFNldChkZXBlbmRlbmNpZXMpXS5tYXAoZ2V0RGVwZW5kZW5jeVNwZWNpZmllcik7XG4gICAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydyZW1vdmUnLCAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLS1leGFjdCcsIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBvbWl0IHZlcnNpb25zIHRvIHVwZGF0ZSBkZXBlbmRlbmNpZXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9ucyB3aXRoIFlhcm4uXG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gV2UgY2Fubm90IGFkZCBkZXZEZXBlbmRlbmNpZXMgd2hpY2ggYXJlIGFscmVhZHkgaW5jbHVkZWQgaW4gZGVwZW5kZW5jaWVzLlxuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaWYgKGRldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkZXZEZXBlbmRlbmN5U3BlY2lmaWVycyA9IFsuLi5uZXcgU2V0KGRldkRlcGVuZGVuY2llcyldLm1hcChnZXREZXBlbmRlbmN5U3BlY2lmaWVyKTtcbiAgICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3JlbW92ZScsIC4uLm5ldyBTZXQoZGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctRCcsICctLWV4YWN0JywgLi4uZGV2RGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJbnRlbnRpb25hbGx5IG9taXQgdmVyc2lvbnMgdG8gdXBkYXRlIGRlcGVuZGVuY2llcyB0byB0aGUgbGF0ZXN0IHZlcnNpb25zIHdpdGggWWFybi5cbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctRCcsIC4uLmRldkRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocG9ldHJ5RGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwYXduU3luYygncG9ldHJ5JywgWydhZGQnLCAnLS1ncm91cCcsICdkZXYnLCAuLi5uZXcgU2V0KHBvZXRyeURldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0aGUgZm9sbG93aW5nIG1pZ3JhdGlvbiBjb2RlIGluIGZ1dHVyZVxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz5cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoanNvbk9iai5hdXRob3IgPT09ICdXaWxsQm9vc3RlciBMTEMnKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1hbGwtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjay93YXJuJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpnZW4tY29kZSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Y29kZWdlbiddO1xuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMudHNsaWI7XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1yZWFjdCddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvdHNjb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtaW1wb3J0LXJlc29sdmVyLW5vZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtcGx1Z2luLXByZXR0aWVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5sZXJuYTtcbiAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5waW5zdDtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZmx1dHRlci1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWZsdXR0ZXInXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHl0aG9uLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtcHl0aG9uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZXI7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWFsbCddO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oJ2xlcm5hLmpzb24nLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAvLyBNaWdyYXRlIGZyb20gRVNMaW50IGxlZ2FjeSBjb25maWdzIHRvIGZsYXQgY29uZmlncyxcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpbiddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtcGx1Z2luLWltcG9ydCddO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFRoZSBjdXJyZW50IEVTTGludCBzdGFjayBpbiBnZW5lcmF0ZWQgcmVwb3MgZG9lcyBub3Qgc3VwcG9ydCBUeXBlU2NyaXB0IDYgeWV0LlxuICBpZiAoZGVwZW5kZW5jeSA9PT0gJ3R5cGVzY3JpcHQnKSByZXR1cm4gJ3R5cGVzY3JpcHRAXjUnO1xuICAvLyBUaGUgY3VycmVudCBSZWFjdCBFU0xpbnQgc3RhY2sgaW4gZ2VuZXJhdGVkIHJlcG9zIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggRVNMaW50IDEwIHlldC5cbiAgaWYgKGRlcGVuZGVuY3kgPT09ICdAZXNsaW50L2pzJyB8fCBkZXBlbmRlbmN5ID09PSAnZXNsaW50JykgcmV0dXJuIGAke2RlcGVuZGVuY3l9QF45YDtcbiAgcmV0dXJuIGRlcGVuZGVuY3k7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnkpO1xuICBpZiAobm9ybWFsaXplZFJlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRSZXBvc2l0b3J5LCByZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihleGlzdGluZ1JlcG9zaXRvcnkpO1xuICBpZiAobm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIHJldHVybiByZXBvc2l0b3J5O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIXJlcG9zaXRvcnkuc3RhcnRzV2l0aCgnZ2l0aHViOicpKSByZXR1cm47XG5cbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHJlcG9zaXRvcnkpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xuICB9XG5cbiAgY29uc3QgcmVwb3NpdG9yeVVybCA9IHJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5VXJsICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IG1hdGNoZWQgPSAvXig/OmdpdFxcKyk/aHR0cHM6XFwvXFwvZ2l0aHViXFwuY29tXFwvKFteL10rKVxcLyhbXi9dKz8pKD86XFwuZ2l0KT8kL3UuZXhlYyhyZXBvc2l0b3J5VXJsKTtcbiAgaWYgKCFtYXRjaGVkKSByZXR1cm47XG5cbiAgY29uc3QgWywgb3duZXIsIHJlcG9dID0gbWF0Y2hlZDtcbiAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbn1cblxuZnVuY3Rpb24gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICBub3JtYWxpemVkVXJsOiBzdHJpbmcsXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCByZXBvc2l0b3J5T2JqID1cbiAgICB0eXBlb2YgcmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgID8gcmVwb3NpdG9yeVxuICAgICAgOiB0eXBlb2YgZXhpc3RpbmdSZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgICA/IGV4aXN0aW5nUmVwb3NpdG9yeVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIC4uLnJlcG9zaXRvcnlPYmosXG4gICAgdHlwZTogJ2dpdCcsXG4gICAgdXJsOiBub3JtYWxpemVkVXJsLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2NoZWNrLWFsbC1mb3ItYWknOiAnYnVuIHJ1biBjaGVjay1mb3ItYWkgJiYgYnVuIHJ1biB0ZXN0JyxcbiAgICAgICdjaGVjay1mb3ItYWknOiBgYnVuIHJ1biBjbGVhbnVwJHtoYXNUeXBlY2hlY2sgPyAnICYmIGJ1biBydW4gdHlwZWNoZWNrJyA6ICcnfWAsXG4gICAgICBjbGVhbnVwOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgICAgZm9ybWF0OiBgYnVuIC0tYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgICAgbGludDogYGJ1biAtLWJ1biB3YiBsaW50YCxcbiAgICAgICdsaW50LWZpeCc6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCcsXG4gICAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgICAgdHlwZWNoZWNrOiAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgfTtcbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IG9sZFRlc3QgPSBvbGRTY3JpcHRzLnRlc3Q7XG4gICAgbGV0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnY2hlY2stYWxsLWZvci1haSc6ICd5YXJuIGNoZWNrLWZvci1haSAmJiB5YXJuIHRlc3QnLFxuICAgICAgJ2NoZWNrLWZvci1haSc6IGB5YXJuIGZvcm1hdCA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwgfHwgdHJ1ZSR7XG4gICAgICAgIGhhc1R5cGVjaGVjayA/ICcgJiYgeWFybiB0eXBlY2hlY2snIDogJydcbiAgICAgIH0gJiYgeWFybiBsaW50LWZpeCAtLXF1aWV0YCxcbiAgICAgIGNsZWFudXA6ICd5YXJuIGZvcm1hdCAmJiB5YXJuIGxpbnQtZml4JyxcbiAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnlgLFxuICAgICAgbGludDogYGVzbGludCAtLWNvbG9yYCxcbiAgICAgICdsaW50LWZpeCc6ICd5YXJuIGxpbnQgLS1maXgnLFxuICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgLFxuICAgICAgdHlwZWNoZWNrOiAndHNjIC0tbm9FbWl0JyxcbiAgICB9O1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIHNjcmlwdHMgPSBtZXJnZShcbiAgICAgICAgeyAuLi5zY3JpcHRzIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKFxuICAgICAgICAgICAgJywnXG4gICAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYCxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLlxuICAgICAgICAgIC8vIEZPUkNFX0NPTE9SPTMgbWFrZSB3YiBlbmFibGUgY29sb3Igb3V0cHV0LlxuICAgICAgICAgIHRlc3Q6ICdDST0xIEZPUkNFX0NPTE9SPTMgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgIH1cblxuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLndiKSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9ICd3YiB0eXBlY2hlY2snO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGluZGV4ID0gZXhpc3RpbmdDb250ZW50LmluZGV4T2YoaWdub3JlRmlsZVV0aWwuc2VwYXJhdG9yUHJlZml4KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGV4aXN0aW5nQ29udGVudC5zbGljZSgwLCBpbmRleCk7XG4gIGNvbnN0IGxpbmVzID0gb3JpZ2luYWxDb250ZW50XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0xpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIHJldHVybiBuZXdMaW5lLmVuZHNXaXRoKCcvJykgPyBuZXdMaW5lLnNsaWNlKDAsIC0xKSA6IG5ld0xpbmU7XG4gICAgfSlcbiAgICAuZmlsdGVyKChsKSA9PiBsICYmICFsLnN0YXJ0c1dpdGgoJyMnKSAmJiAhbC5pbmNsdWRlcygnLycpKTtcblxuICByZXR1cm4gYCR7bGluZXMubWFwKChsaW5lKSA9PiBgIFwiISoqLyR7bGluZX0vKipcImApLmpvaW4oJycpfSB8fCB0cnVlYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4U2NyaXB0TmFtZXMoXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5ld0pzb25UZXh0OiBzdHJpbmcsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgb2xkQW5kTmV3U2NyaXB0TmFtZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXldIG9mIE9iamVjdC5rZXlzKHNjcmlwdHMpKSB7XG4gICAgaWYgKGtleSAmJiAha2V5LnN0YXJ0c1dpdGgoJzonKSAmJiBrZXkuaW5jbHVkZXMoJzonKSkge1xuICAgICAgb2xkQW5kTmV3U2NyaXB0TmFtZXMucHVzaChba2V5LCBrZXkucmVwbGFjZUFsbCgnOicsICctJyldKTtcbiAgICB9XG4gIH1cbiAgaWYgKG9sZEFuZE5ld1NjcmlwdE5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ld0pzb25UZXh0O1xuXG4gIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgbmV3SnNvblRleHQgPSBuZXdKc29uVGV4dC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICB9XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyoqLyoue21kLGNqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsICcqKi9Eb2NrZXJmaWxlJ10sIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuICAgICAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBvbGRDb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICByZXR1cm4gbmV3SnNvblRleHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2F1dGgnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvYXV0aCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdhdXRoJyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9hdXRoJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvYXV0aC5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0BkaXNjb3JkLWJvdC9zaGFyZWQnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAZGlzY29yZC1ib3Qvc2hhcmVkJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BkaXNjb3JkLWJvdC9zaGFyZWQnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnZGlzY29yZC1ib3QnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGRpc2NvcmQtYm90L3NoYXJlZCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2Rpc2NvcmQtYm90LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuXG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2NvZGUtYW5hbHl6ZXInKTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXSA9XG4gICAgICBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvY29kZS1hbmFseXplci5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9qdWRnZScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnanVkZ2UnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2p1ZGdlJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvanVkZ2UuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2xsbS1wcm94eScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2xsbS1wcm94eScpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvbGxtLXByb3h5LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvYnVuL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvcmVhY3QtbmF0aXZlL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIHJldHVybiBbJ0B0c2NvbmZpZy9ub2RlLWx0cy90c2NvbmZpZy5qc29uJywgJ0B0c2NvbmZpZy9ub2RlLXRzL3RzY29uZmlnLmpzb24nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzJywgJ0B0c2NvbmZpZy9ub2RlLXRzJ107XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuaW50ZXJmYWNlIExlZnRob29rU2V0dGluZ3Mge1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAncHJlcGFyZS5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCc7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGNvbW1hbmRzOiB7XG4gICAgICBjbGVhbnVwOiB7XG4gICAgICAgIGdsb2I6IHN0cmluZztcbiAgICAgICAgcnVuOiBzdHJpbmc7XG4gICAgICB9O1xuICAgICAgJ2NoZWNrLW1pZ3JhdGlvbnMnOiB7XG4gICAgICAgIGdsb2I6IHN0cmluZztcbiAgICAgICAgcnVuOiBzdHJpbmc7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG4gICdwcmUtcHVzaCc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAnY2hlY2suc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xufVxuXG5jb25zdCBiYXNlU2V0dGluZ3M6IE9taXQ8TGVmdGhvb2tTZXR0aW5ncywgJ3ByZS1jb21taXQnPiA9IHtcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ3ByZXBhcmUuc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ2NoZWNrLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHByZUNvbW1pdFNldHRpbmdzOiBMZWZ0aG9va1NldHRpbmdzWydwcmUtY29tbWl0J10gPSB7XG4gIGNvbW1hbmRzOiB7XG4gICAgY2xlYW51cDoge1xuICAgICAgZ2xvYjogJyoue2FzdHJvLGNqcyxjc3MsY3RzLGdxbCxodG0saHRtbCxqYXZhLGpzLGpzb24sanNvbjUsanNvbmMsanN4LG1kLG1qcyxtdHMsc2NzcyxzdmVsdGUsdHMsdHN4LHZ1ZSx5YW1sLHltbH0nLFxuICAgICAgcnVuOiAnJyxcbiAgICB9LFxuICAgICdjaGVjay1taWdyYXRpb25zJzoge1xuICAgICAgZ2xvYjogJyoqL21pZ3JhdGlvbi5zcWwnLFxuICAgICAgcnVuOiBgXG5pZiBncmVwIC1xICdXYXJuaW5nczonIHtzdGFnZWRfZmlsZXN9OyB0aGVuXG4gIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGVzICh7c3RhZ2VkX2ZpbGVzfSkgY29udGFpbiB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gIGV4aXQgMVxuZmlcbmAudHJpbSgpLFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwb3N0TWVyZ2U6IGBcbiMhL2Jpbi9iYXNoXG5cbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IGh1c2t5RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreScpO1xuICBjb25zdCBoYXNIdXNreURpciA9IGZzLmV4aXN0c1N5bmMoaHVza3lEaXJQYXRoKTtcbiAgY29uc3QgeyB0eXBlY2hlY2sgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIHt9KTtcbiAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8TGVmdGhvb2tTZXR0aW5ncz4gPSB7XG4gICAgLi4uYmFzZVNldHRpbmdzLFxuICAgICdwcmUtY29tbWl0Jzoge1xuICAgICAgLi4ucHJlQ29tbWl0U2V0dGluZ3MsXG4gICAgICBjb21tYW5kczoge1xuICAgICAgICAuLi5wcmVDb21taXRTZXR0aW5ncy5jb21tYW5kcyxcbiAgICAgICAgY2xlYW51cDoge1xuICAgICAgICAgIC4uLnByZUNvbW1pdFNldHRpbmdzLmNvbW1hbmRzLmNsZWFudXAsXG4gICAgICAgICAgcnVuOiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWcpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuICBpZiAoIXR5cGVjaGVjaykge1xuICAgIGRlbGV0ZSBzZXR0aW5nc1sncHJlLXB1c2gnXTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAoc2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuICBpZiAoaGFzSHVza3lEaXIpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5wcm9taXNlcy5ybShodXNreURpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSxcbiAgICBdKTtcbiAgICBzcGF3blN5bmMoJ2dpdCcsIFsnY29uZmlnJywgJy0tdW5zZXQnLCAnY29yZS5ob29rc1BhdGgnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKHR5cGVjaGVjaykge1xuICAgIGNvbnN0IHByZVB1c2ggPSBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZyk7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgICAgbW9kZTogMG83NTUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnLCAncHJlcGFyZS5zaCcpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGxldCB0eXBlY2hlY2tDb21tYW5kOiBzdHJpbmc7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICB0eXBlY2hlY2tDb21tYW5kID0gY29uZmlnLmRlcGVuZGluZy53YiA/ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyA6ICdidW4gcnVuIHR5cGVjaGVjayc7XG4gIH0gZWxzZSB7XG4gICAgdHlwZWNoZWNrQ29tbWFuZCA9IGNvbmZpZy5kZXBlbmRpbmcud2IgPyAneWFybiB3YiB0eXBlY2hlY2snIDogJ3lhcm4gcnVuIHR5cGVjaGVjayc7XG4gIH1cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICByZXR1cm4gYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbiR7dHlwZWNoZWNrQ29tbWFuZH1cbmAudHJpbSgpO1xuICB9XG4gIHJldHVybiB0eXBlY2hlY2tDb21tYW5kO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBjb21tYW5kID0gY29uZmlnLmRlcGVuZGluZy53YlxuICAgID8gYCR7Y29uZmlnLmlzQnVuID8gJ2J1biAtLWJ1biB3YicgOiAneWFybiB3Yid9IGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31gXG4gICAgOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGZvcm1hdCAmJiAke3BhY2thZ2VNYW5hZ2VyfSBydW4gbGludC1maXhgO1xuICByZXR1cm4gYCR7Y29tbWFuZH0gJiYgZ2l0IGFkZCAtLSB7c3RhZ2VkX2ZpbGVzfWA7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5oYXNWZXJzaW9uU2V0dGluZ3MpIHtcbiAgICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWx8XFwudG9vbC12ZXJzaW9uc3xcXC4uKy12ZXJzaW9uKWA7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3Qgc3JjRGlyZWN0b3JpZXMgPSB7XG4gIG5vZGU6IFsnc3JjJywgJ3Rlc3QnLCAnc2NyaXB0cyddLnRvU29ydGVkKCksXG4gIGJsaXR6OiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnLCAnZGInLCAnaW50ZWdyYXRpb25zJywgJ21haWxlcnMnXS50b1NvcnRlZCgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNyY0RpcnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ibGl0ejtcbiAgfVxuICByZXR1cm4gc3JjRGlyZWN0b3JpZXMubm9kZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFNyY0RpcnMgfSBmcm9tICcuLi91dGlscy9zcmNEaXJlY3Rvcmllcy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxpbnRzdGFnZWRyYycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuY2pzJyk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VQcmVmaXggPSBjb25maWcuaXNSb290ID8gJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vJyA6ICdub2RlIC4uLy4uL25vZGVfbW9kdWxlcy8uYmluLyc7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgY29uc3QgZXNsaW50ID0gYFxuICAnJHtnZXRFc2xpbnRLZXkoY29uZmlnKX0nOiBbJHtKU09OLnN0cmluZ2lmeShcbiAgICBgJHtwYWNrYWdlUHJlZml4fWVzbGludCAtLWZpeCR7RXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyl9YFxuICApfSwgJyR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnXSxgO1xuICAgIGxpbmVzLnB1c2goZXNsaW50KTtcbiAgfVxuICBjb25zdCBwYWNrYWdlc0ZpbHRlciA9IGNvbmZpZy5pc1Jvb3QgPyBcIiAmJiAhZmlsZS5pbmNsdWRlcygnL3BhY2thZ2VzLycpXCIgOiAnJztcbiAgbGluZXMucHVzaChgXG4gICcuLyoqLyoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fSc6IGZpbGVzID0+IHtcbiAgICBsZXQgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKSAmJiAhZmlsZS5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykke3BhY2thZ2VzRmlsdGVyfSk7JHtnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWcpfVxuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gW1xcYCR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMuc29tZShmaWxlID0+IGZpbGUuZW5kc1dpdGgoJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnJHtwYWNrYWdlUHJlZml4fXNvcnQtcGFja2FnZS1qc29uJyk7XG4gICAgfVxuICAgIHJldHVybiBjb21tYW5kcztcbiAgfSxcbiAgJy4vKiovbWlncmF0aW9uLnNxbCc6IChmaWxlcykgPT4ge1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpO1xuICAgIGlmIChjb250ZW50LmluY2x1ZGVzKCdXYXJuaW5nczonKSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXFxgZWNobyAnISEhIE1pZ3JhdGlvbiBTUUwgZmlsZSAoXFwke3BhdGgucmVsYXRpdmUoJycsIGZpbGUpfSkgY29udGFpbnMgd2FybmluZ3MgISEhIFNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLidcXGAsXG4gICAgICAgICdmYWxzZScsXG4gICAgICBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59LGApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4ve2xpYix0ZXN0LHRlc3RfZHJpdmVyfS8qKi8qLmRhcnQnOiBmaWxlcyA9PiB7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCdnZW5lcmF0ZWQnKSlcbiAgICAgIC5maWx0ZXIoZmlsZSA9PiAhZmlsZS5lbmRzV2l0aCgnLmZyZWV6ZWQuZGFydCcpICYmICFmaWxlLmVuZHNXaXRoKCcuZy5kYXJ0JykpO1xuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBbXFxgZGFydCBmb3JtYXQgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gIH0sYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4vKiovKi5weSc6IFtcbiAgICAncG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMnLFxuICAgICdwb2V0cnkgcnVuIGJsYWNrJyxcbiAgICAncG9ldHJ5IHJ1biBmbGFrZTgnXG4gIF0sYCk7XG4gIH1cblxuICBjb25zdCBuZXdDb250ZW50ID0gYGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG4ke2NvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCA/IFwiY29uc3QgbWljcm9tYXRjaCA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcXG5cIiA6ICcnfVxubW9kdWxlLmV4cG9ydHMgPSB7JHtsaW5lcy5qb2luKCcnKX1cbn07XG5gO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRLZXkoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgZGlycyA9IGdldFNyY0RpcnMoY29uZmlnKS5tYXAoKGRpcikgPT4gYCR7ZGlyfS8qKi9gKTtcbiAgcmV0dXJuIGB7LCR7ZGlycy5qb2luKCcsJyl9fSoueyR7ZXh0ZW5zaW9ucy5lc2xpbnQuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0XG4gICAgPyBgXFxuXG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKSk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IG1pY3JvbWF0Y2gubm90KGZpbHRlcmVkRmlsZXMsICcke2dldEVzbGludEtleShjb25maWcpfScpO1xuICAgIGZpbHRlcmVkRmlsZXMgPSBmaWx0ZXJlZEZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZXNvbHZlKGZpbGUpKTtgXG4gICAgOiAnJztcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMucmVhZGRpclN5bmMoYCR7Y29uZmlnLmRpclBhdGh9Ly5naXRodWIvd29ya2Zsb3dzYCk7XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IChiYWRnZU5hbWVbMF0gfHwgJycpLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBpZiAoIXJlcG9zaXRvcnkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYmFkZ2UgPSBgWyFbJHtiYWRnZU5hbWV9XShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfS9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfSlgO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLmdpdGh1Yi93b3JrZmxvd3MvJHtmaWxlTmFtZX1gKSkpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIGJhZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g5pei44GrYmFkZ2XjgYzjgYLjgovloLTlkIjjga/liYrpmaRcbiAgcmVhZG1lID0gcmVhZG1lLnJlcGxhY2UoYmFkZ2UsICcnKS5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWRtZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZWFkbWVbaSAtIDFdID09PSAnXFxuJyAmJiByZWFkbWVbaV0gPT09ICdcXG4nKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSByZWFkbWUuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgbGV0IGFmdGVyID0gcmVhZG1lLnNsaWNlKGkgKyAxKTtcbiAgICAgIGlmICghYWZ0ZXIuc3RhcnRzV2l0aCgnWycpICYmICFhZnRlci5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgYWZ0ZXIgPSBgXFxuJHthZnRlcn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2JlZm9yZX0ke2JhZGdlfVxcbiR7YWZ0ZXJ9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3JlYWRtZX1cXG4ke2JhZGdlfVxcbmA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zID8/IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luID0gQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSA/IHBsdWdpbnNbaV0/LlswXSA6IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSAmJiBwbHVnaW5zW2ldPy5bMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczpyZW5vdmF0ZS5qc29uNSddLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IHR5cGVvZiBqc29uT2JqICYgeyBwYWNrYWdlUnVsZXM/OiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoanNvbk9iaikgYXMgU2V0dGluZ3M7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdyZW5vdmF0ZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7ZmlsZVBhdGh9NWApKSB7XG4gICAgICAvLyBTaW5jZSBpdCBpcyBkaWZmaWN1bHQgZm9yIHBhcnNpbmcgcmVub3ZhdGUuanNvbjUsIHdlIGRvIG5vdGhpbmdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBEb24ndCB1cGdyYWRlIE5leHQuanMgYXV0b21hdGljYWxseVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMgPz89IFtdO1xuICAgICAgaWYgKFxuICAgICAgICAhbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnNvbWUoKHJ1bGU6IHsgbWF0Y2hQYWNrYWdlTmFtZXM/OiBzdHJpbmdbXSB9KSA9PlxuICAgICAgICAgIHJ1bGUubWF0Y2hQYWNrYWdlTmFtZXM/LmluY2x1ZGVzKCduZXh0JylcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5wdXNoKHsgbWF0Y2hQYWNrYWdlTmFtZXM6IFsnbmV4dCddLCBlbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRlcGVuZGFib3QnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZW5vdmF0ZXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmNvbnN0IHRhcmdldEFnZW50cyA9IFsnY2xhdWRlLWNvZGUnLCAnY29kZXgnLCAnY3Vyc29yJywgJ2dlbWluaS1jbGknXTtcbmNvbnN0IGluc3RhbGxUYXJnZXRBZ2VudEFyZ3MgPSB0YXJnZXRBZ2VudHMuZmxhdE1hcCgoYWdlbnQpID0+IFsnLS1hZ2VudCcsIGFnZW50XSk7XG5jb25zdCBza2lsbHNSZXBvID0gJ1dpbGxCb29zdGVyL2FnZW50LXNraWxscyc7XG5jb25zdCBwbGF5d3JpZ2h0U2tpbGxOYW1lID0gJ3BsYXl3cmlnaHQtY2xpJztcbmNvbnN0IG5vbldlYlJlbW92YWxBZ2VudEFyZ3MgPSBbJy0tYWdlbnQnLCAndW5pdmVyc2FsJywgLi4uaW5zdGFsbFRhcmdldEFnZW50QXJnc107XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQWdlbnRTa2lsbHMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2luc3RhbGxBZ2VudFNraWxscycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBydW5JbnN0YWxsQWdlbnRTa2lsbHMocm9vdENvbmZpZyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc1dlYkFwcFJlbGF0ZWQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8XG4gICAgY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCB8fFxuICAgIGNvbmZpZy5kZXBlbmRpbmcucmVhY3QgfHxcbiAgICBjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vayB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICBjb25zdCBjb21tb25BcmdzID0gWydza2lsbHNAbGF0ZXN0JywgJ2FkZCcsIHNraWxsc1JlcG8sIC4uLmluc3RhbGxUYXJnZXRBZ2VudEFyZ3MsICctLXNraWxsJywgJyonLCAnLS15ZXMnXTtcbiAgc3Bhd25TeW5jKCducHgnLCBjb21tb25BcmdzLCByb290Q29uZmlnLmRpclBhdGgpO1xuXG4gIGlmIChpc1dlYkFwcFJlbGF0ZWQocm9vdENvbmZpZykpIHJldHVybjtcblxuICBzcGF3blN5bmMoXG4gICAgJ25weCcsXG4gICAgWydza2lsbHNAbGF0ZXN0JywgJ3JlbW92ZScsIHBsYXl3cmlnaHRTa2lsbE5hbWUsIC4uLm5vbldlYlJlbW92YWxBZ2VudEFyZ3MsICctLXllcyddLFxuICAgIHJvb3RDb25maWcuZGlyUGF0aFxuICApO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgLy8gVGhlIFZlcmNlbCBDTEkgbGVhdmVzIHRoZSBzaGFyZWQgdW5pdmVyc2FsIGluc3RhbGwgYmVoaW5kIGluIHRoaXMgZmxvdyxcbiAgICAvLyBzbyBub24td2ViIHJlcG9zIG5lZWQgYW4gZXhwbGljaXQgY2xlYW51cCBwYXNzIHRvIGVuZm9yY2UgdGhlIGZpbmFsIHN0YXRlLlxuICAgIHJlbW92ZVNraWxsRGlyZWN0b3J5KHJvb3RDb25maWcuZGlyUGF0aCwgJy5hZ2VudHMvc2tpbGxzJyksXG4gICAgcmVtb3ZlU2tpbGxEaXJlY3Rvcnkocm9vdENvbmZpZy5kaXJQYXRoLCAnLmNsYXVkZS9za2lsbHMnKSxcbiAgICByZW1vdmVTa2lsbERpcmVjdG9yeShyb290Q29uZmlnLmRpclBhdGgsICcuY29kZXgvc2tpbGxzJyksXG4gICAgcmVtb3ZlU2tpbGxEaXJlY3Rvcnkocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9za2lsbHMnKSxcbiAgICByZW1vdmVTa2lsbERpcmVjdG9yeShyb290Q29uZmlnLmRpclBhdGgsICcuZ2VtaW5pL3NraWxscycpLFxuICAgIHJlbW92ZVNraWxsRGlyZWN0b3J5KHJvb3RDb25maWcuZGlyUGF0aCwgJy5nZW1pbmkvY29tbWFuZHMnKSxcbiAgICByZW1vdmVTa2lsbExvY2tFbnRyeShyb290Q29uZmlnLmRpclBhdGgpLFxuICBdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlU2tpbGxEaXJlY3Rvcnkocm9vdERpclBhdGg6IHN0cmluZywgcmVsYXRpdmVQYXJlbnREaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucm0ocGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCByZWxhdGl2ZVBhcmVudERpclBhdGgsIHBsYXl3cmlnaHRTa2lsbE5hbWUpLCB7XG4gICAgZm9yY2U6IHRydWUsXG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlU2tpbGxMb2NrRW50cnkocm9vdERpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ3NraWxscy1sb2NrLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IGpzb246IHVua25vd24gPSBKU09OLnBhcnNlKGpzb25UZXh0KTtcbiAgICBpZiAoIWlzU2tpbGxMb2NrSnNvbihqc29uKSB8fCAhanNvbi5za2lsbHNbcGxheXdyaWdodFNraWxsTmFtZV0pIHJldHVybjtcbiAgICBqc29uLnNraWxscyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhqc29uLnNraWxscykuZmlsdGVyKChbbmFtZV0pID0+IG5hbWUgIT09IHBsYXl3cmlnaHRTa2lsbE5hbWUpKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGpzb24sIHVuZGVmaW5lZCwgMikgKyAnXFxuJyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElnbm9yZSBpZiB0aGUgc2tpbGwgbG9jayBkb2VzIG5vdCBleGlzdCB5ZXQgb3IgaXMgdW5yZWFkYWJsZS5cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NraWxsTG9ja0pzb24oanNvbjogdW5rbm93bik6IGpzb24gaXMgeyBza2lsbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBqc29uID09PSAnb2JqZWN0JyAmJlxuICAgIGpzb24gIT09IG51bGwgJiZcbiAgICAnc2tpbGxzJyBpbiBqc29uICYmXG4gICAgdHlwZW9mIGpzb24uc2tpbGxzID09PSAnb2JqZWN0JyAmJlxuICAgIGpzb24uc2tpbGxzICE9PSBudWxsICYmXG4gICAgIUFycmF5LmlzQXJyYXkoanNvbi5za2lsbHMpXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gICAgdHlwZVJvb3RzOiBbJy4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuL0B0eXBlcyddLFxuICB9LFxuICBleGNsdWRlOiBbJ3BhY2thZ2VzLyovdGVzdC9maXh0dXJlcycsICd0ZXN0L2ZpeHR1cmVzJ10sXG4gIGluY2x1ZGU6IFtcbiAgICAncGFja2FnZXMvKi9zY3JpcHRzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NyYy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi90ZXN0LyoqLyonLFxuICAgICdzY3JpcHRzLyoqLyonLFxuICAgICdzcmMvKiovKicsXG4gICAgJ3Rlc3QvKiovKicsXG4gIF0sXG59O1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgc291cmNlTWFwOiB0cnVlLFxuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICAgIHR5cGVSb290czogWycuLi8uLi9ub2RlX21vZHVsZXMvQHR5cGVzJywgJy4uLy4uL0B0eXBlcycsICcuL0B0eXBlcyddLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogWydzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkgcmV0dXJuO1xuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGNvbmZpZy5pc1Jvb3QgPyByb290SnNvbk9iaiA6IHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCAmJiAhY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmlzQnVuICYmICFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywganN4OiAncmVhY3QtanN4JyB9O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgICAgbmV3U2V0dGluZ3MuZXhjbHVkZSA9IG5ld1NldHRpbmdzLmV4Y2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBUc0NvbmZpZ0pzb247XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMobmV3U2V0dGluZ3MuZXh0ZW5kcywgb2xkU2V0dGluZ3MuZXh0ZW5kcyk7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSk7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKFxuICAgICAgICAoZGlyUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fLycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCd0ZXN0cy8nKVxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZVRzY29uZmlnRXh0ZW5kcyhcbiAgZ2VuZXJhdGVkRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ10sXG4gIGV4aXN0aW5nRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ11cbik6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddIHtcbiAgY29uc3QgbWVyZ2VkRXh0ZW5kcyA9IFsuLi5ub3JtYWxpemVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHMpLCAuLi5ub3JtYWxpemVFeHRlbmRzKGV4aXN0aW5nRXh0ZW5kcyldO1xuICBjb25zdCB1bmlxdWVFeHRlbmRzID0gWy4uLm5ldyBTZXQobWVyZ2VkRXh0ZW5kcyldO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHVuaXF1ZUV4dGVuZHNbMF07XG4gIHJldHVybiB1bmlxdWVFeHRlbmRzO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFeHRlbmRzKHZhbHVlOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIC8vIExMTeOBq+OCiOOCi3ZpYmUgY29kaW5n44Gn44Gv44CB6Ieq5YuV44OV44Kp44O844Oe44OD44OI44KE44Kz44O844OJ44Ki44Kv44K344On44Oz44KS54Sh5Yq55YyW44GZ44KL44GT44Go44GnXG4gICAgICAvLyDnlJ/miJDjgZXjgozjgZ/jgrPjg7zjg4njga7lhYPjga7lvaLlvI/jgpLntq3mjIHjgafjgY3jgotcbiAgICAgIGlmICgnZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZSddO1xuICAgICAgfVxuICAgICAgaWYgKCdlZGl0b3IuZm9ybWF0T25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5mb3JtYXRPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG50eXBlIFNldHRpbmdzID0ge1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgbnBtTWluaW1hbEFnZUdhdGU/OiBzdHJpbmc7XG4gIG5wbVByZWFwcHJvdmVkUGFja2FnZXM/OiBzdHJpbmdbXTtcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufSAmIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPjtcblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGdldE1ham9yTnVtYmVyKGN1cnJlbnRWZXJzaW9uKSA8PSBnZXRNYWpvck51bWJlcihsYXRlc3RWZXJzaW9uKSAmJiBjdXJyZW50VmVyc2lvbiAhPT0gbGF0ZXN0VmVyc2lvbikge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0geWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzO1xuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgc2V0dGluZ3MubnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuICAgIHNldHRpbmdzLm5wbVByZWFwcHJvdmVkUGFja2FnZXMgPSBbXG4gICAgICAnQGV4ZXJjb2RlL3Byb2JsZW0tdXRpbHMnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9iYWJlbC1jb25maWdzJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsXG4gICAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsXG4gICAgICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gICAgICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInLFxuICAgICAgJ0B3aWxsYm9vc3Rlci93YicsXG4gICAgICAvLyBUbyBkZWFsIHdpdGggQ1ZFIGxpa2UgaHR0cHM6Ly9uZXh0anMub3JnL2Jsb2cvQ1ZFLTIwMjUtNjY0NzhcbiAgICAgICduZXh0JyxcbiAgICAgICdAbmV4dC8qJyxcbiAgICAgICdyZWFjdCcsXG4gICAgICAncmVhY3QtZG9tJyxcbiAgICBdO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb25zSnNvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9ucycsICctLWpzb24nXSwgZGlyUGF0aCk7XG4gIGNvbnN0IHZlcnNpb25zID0gSlNPTi5wYXJzZSh2ZXJzaW9uc0pzb24pIGFzIHN0cmluZ1tdO1xuICByZXR1cm4gdmVyc2lvbnMuYXQoLTEpIGFzIHN0cmluZztcbn1cbmZ1bmN0aW9uIGdldE1ham9yTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IFttYWpvcl0gPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiBOdW1iZXIobWFqb3IpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1hbGwgOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY2xhdWRlIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNvZGV4IDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWdlbWluaSA6cm9ib3Q6JywgJzAwQjREOCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdsbG0tcHIgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdhaS1wciA6cm9ib3Q6Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgc29kaXVtIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IERFUFJFQ0FURURfU0VDUkVUX05BTUVTID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJywgJ0dIX0JPVF9QQVQnLCAnUFVCTElDX0dIX0JPVF9QQVQnXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VjcmV0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFNlY3JldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbyB8fCBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKCkucGFyc2VkID8/IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBhd2FpdCBzb2RpdW0ucmVhZHk7XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNlY3JldF0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQidcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IFNlY3JldCAmIEJhc2U2NCBrZXkgdG8gVWludDhBcnJheS5cbiAgICAgICAgY29uc3QgcmF3S2V5ID0gc29kaXVtLmZyb21fYmFzZTY0KGtleSwgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG4gICAgICAgIGNvbnN0IHJhd1NlYyA9IHNvZGl1bS5mcm9tX3N0cmluZyhzZWNyZXQpO1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIHNlY3JldCB1c2luZyBMaWJTb2RpdW1cbiAgICAgICAgY29uc3QgZW5jQnl0ZXMgPSBzb2RpdW0uY3J5cHRvX2JveF9zZWFsKHJhd1NlYywgcmF3S2V5KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGVuY3J5cHRlZCBVaW50OEFycmF5IHRvIEJhc2U2NFxuICAgICAgICBjb25zdCBlbmNCYXNlNjQgPSBzb2RpdW0udG9fYmFzZTY0KGVuY0J5dGVzLCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcblxuICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgc2VjcmV0X25hbWU6IG5hbWUsXG4gICAgICAgICAgZW5jcnlwdGVkX3ZhbHVlOiBlbmNCYXNlNjQsXG4gICAgICAgICAga2V5X2lkOiBrZXlJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFNlY3JldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgLy8gQWRtaW5pc3RyYXRpb24gcGVybWlzc2lvblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgfSxcbiAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgcGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciA9ICdfX1BNX1JVTl9fJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuIyMgU2VsZiBDaGVja1xuXG4tIFsgXSBJJ3ZlIGNvbmZpcm1lZCBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIG9uIHRoaXMgcGFnZS5cbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gIC0gUFIgdGl0bGUgZG9lc24ndCBoYXZlIFxcYFdJUDpcXGAuXG4gIC0gVGhlIHRlc3QgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSB0ZXN0XFxgKSBwYXNzZWQuXG4gIC0gVGhlIGxpbnQgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSBsaW50XFxgKSBwYXNzZWQuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgZHVlIHRvIGxvbmcgd29ya2Zsb3dzLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIHRoZSBHaXRIdWIgZGlmZiB2aWV3LlxuLSBbIF0gSSd2ZSB3cml0dGVuIHRoZSBzdGVwcyB0byB0ZXN0IG15IGNoYW5nZXMuXG4tIFsgXSBJJ3ZlIGFkZGVkIHNjcmVlbnNob3RzIChpZiB0aGUgVUkgY2hhbmdlZCkuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgaWYgeW91IGRpZG4ndCBtb2RpZnkgdGhlIFVJLlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuXG48IS0tIFBsZWFzZSBhZGQgc3RlcHMgdG8gdGVzdCB5b3VyIGNoYW5nZXMuXG4jIyBTdGVwcyB0byBUZXN0XG5cbjEuIE9wZW4gaHR0cDovL2xvY2FsaG9zdC1leGVyY29kZS53aWxsYm9vc3Rlci5uZXQ6MzAwMC9qYS1KUC9jb3Vyc2VzL19leGFtcGxlL2xlc3NvbnMvX2V4YW1wbGVfYV9wbHVzX2IvcHJvYmxlbXMvX2V4YW1wbGVfYV9wbHVzX2IgYWZ0ZXIgbG9naW4uXG4yLiBTZWxlY3QgdGhlIGxhbmd1YWdlIFxcYENcXGAuXG4zLiBXcml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6XG4gICBcXGBcXGBcXGBjXG4gICAjaW5jbHVkZSA8c3RkaW8uaD5cblxuICAgaW50IG1haW4odm9pZCkge1xuICAgICBpbnQgYSwgYjtcblxuICAgICBzY2FuZihcIiVkICVkXCIsICZhLCAmYik7XG4gICAgIHByaW50ZihcIiVkXCIsIGEgKyBiKTtcbiAgICAgcmV0dXJuIDA7XG4gICB9XG4gICBcXGBcXGBcXGBcbjQuIFB1c2ggXFxgU3VibWl0XFxgIGJ1dHRvbi5cbjUuIC4uLlxuLS0+XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgbmV3Q29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZShuZXdDb250ZW50LCBjb25maWcpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlKG9sZENvbnRlbnQsIGNvbnRlbnQpID4gY29udGVudC5sZW5ndGggLyAyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2VBbGwocGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciwgcGFja2FnZU1hbmFnZXJDb21tYW5kKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IHNpbXBsZUdpdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiBib29sZWFuO1xuICByZXBvc2l0b3J5Pzogc3RyaW5nO1xuICByZXBvQXV0aG9yPzogc3RyaW5nO1xuICByZXBvTmFtZT86IHN0cmluZztcbiAgaXNXaWxsQm9vc3RlclJlcG86IGJvb2xlYW47XG4gIGlzQnVuOiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICAvLyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uXG4gIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Hb01vZDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBib29sZWFuO1xuICAvLyBzb3VyY2UgY29kZSBmaWxlc1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG5cbiAgaGFzU3RhcnRUZXN0U2VydmVyOiBib29sZWFuO1xuXG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGdlbkkxOG5UczogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3Q6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHN0b3J5Ym9vazogYm9vbGVhbjtcbiAgICB3YjogYm9vbGVhbjtcbiAgfTtcbiAgcmVsZWFzZToge1xuICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICBnaXRodWI6IGJvb2xlYW47XG4gICAgbnBtOiBib29sZWFuO1xuICB9O1xuICBlc2xpbnRCYXNlPzogRXNsaW50RXh0ZW5zaW9uQmFzZTtcbiAgaGFzVmVyc2lvblNldHRpbmdzOiBib29sZWFuO1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc/OiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpblBhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgICAgICAgICBwbHVnaW5zPzogc3RyaW5nW11bXTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgPz8gW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSA/PyBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzVmVyc2lvblNldHRpbmdzID0gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXSkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSkpIHtcbiAgICAgICAgaGFzVmVyc2lvblNldHRpbmdzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvRnVsbE5hbWUgPyBgZ2l0aHViOiR7cmVwb0Z1bGxOYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnksXG4gICAgICByZXBvQXV0aG9yLFxuICAgICAgcmVwb05hbWUsXG4gICAgICBpc1dpbGxCb29zdGVyUmVwbzogQm9vbGVhbihcbiAgICAgICAgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8IHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgKSxcbiAgICAgIGlzQnVuOiByb290Q29uZmlnPy5pc0J1biB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKSksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogcGFja2FnZUpzb25QYXRoLmluY2x1ZGVzKGAke3BhdGguc2VwfXdpbGxib29zdGVyLWNvbmZpZ3NgKSxcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgaGFzU3RhcnRUZXN0U2VydmVyOiAhIXBhY2thZ2VKc29uLnNjcmlwdHM/Llsnc3RhcnQtdGVzdC1zZXJ2ZXInXSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXMuYmxpdHosXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucHJpc21hLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llcy5weXJpZ2h0LFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6ICEhKFxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwXG4gICAgICAgICksXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgaGFzVmVyc2lvblNldHRpbmdzLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25maWcuZXNsaW50QmFzZSA9IGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWxcbiAgICApIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgY3VycmVudCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgcmV0dXJuIChcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnbWlzZS50b21sJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy5taXNlLnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLnRvb2wtdmVyc2lvbnMnKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNBbnkocGF0dGVybjogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KS5sZW5ndGggPiAwO1xufVxuXG5leHBvcnQgdHlwZSBFc2xpbnRFeHRlbnNpb25CYXNlID1cbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJ1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuXG5mdW5jdGlvbiBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IEVzbGludEV4dGVuc2lvbkJhc2UgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JztcbiAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ID8gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyA6ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBnaXQgPSBzaW1wbGVHaXQoZGlyUGF0aCk7XG4gIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCBnaXQuZ2V0UmVtb3Rlcyh0cnVlKTtcbiAgY29uc3Qgb3JpZ2luID0gcmVtb3Rlcy5maW5kKChyKSA9PiByLm5hbWUgPT09ICdvcmlnaW4nKTtcbiAgY29uc3QgcmVtb3RlVXJsID0gb3JpZ2luPy5yZWZzLmZldGNoID8/IG9yaWdpbj8ucmVmcy5wdXNoO1xuICBpZiAodHlwZW9mIHJlbW90ZVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICBjb25zdCByZXQgPSB7IGZ1bGxfbmFtZTogYCR7b3JnfS8ke25hbWV9YCB9O1xuICB0cnkge1xuICAgIC8vIE1ldGFkYXRhIHBlcm1pc3Npb25cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQoKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihyZXQsIHJlc3BvbnNlLmRhdGEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlZGlyZWN0ZWRGdWxsTmFtZSA9IGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3IpO1xuICAgIGlmIChyZWRpcmVjdGVkRnVsbE5hbWUpIHtcbiAgICAgIHJldC5mdWxsX25hbWUgPSByZWRpcmVjdGVkRnVsbE5hbWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBjb25zdCByZXNwb25zZSA9XG4gICAgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgPyAoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyOyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9IH0pLnJlc3BvbnNlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2U/LnN0YXR1cyA/PyAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSAzMDEgJiYgc3RhdHVzICE9PSAzMDIpIHJldHVybjtcblxuICBjb25zdCBsb2NhdGlvbiA9IHJlc3BvbnNlPy5oZWFkZXJzPy5sb2NhdGlvbjtcbiAgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShsb2NhdGlvbik7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgcmV0dXJuIGAke29yZ30vJHtuYW1lfWA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3QgRVNMSU5UX0NPTkZJR19QUkVGSVggPSAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmIGNvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZT8uc3RhcnRzV2l0aChFU0xJTlRfQ09ORklHX1BSRUZJWCkgPT09IHRydWU7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4RG9ja2VyZmlsZSB9IGZyb20gJy4vZml4ZXJzL2RvY2tlcmZpbGUuanMnO1xuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFByaXNtYUVudkZpbGVzIH0gZnJvbSAnLi9maXhlcnMvcHJpc21hLmpzJztcbmltcG9ydCB7IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2ZpeGVycy90ZXN0RGlyZWN0b3J5LmpzJztcbmltcG9ydCB7IGZpeFR5cGVEZWZpbml0aW9ucyB9IGZyb20gJy4vZml4ZXJzL3R5cGVEZWZpbml0aW9uLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCaW9tZUpzb25jIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2Jpb21lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQnVuZmlnVG9tbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9idW5maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEb2NrZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRWRpdG9yY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVzbGludHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VzbGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdlbWluaUNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcuanMnO1xuaW1wb3J0IHsgcmVtb3ZlR2VtaW5pU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbGVmdGhvb2suanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMaW50c3RhZ2VkcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcGFja2FnZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWFkbWUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVhZG1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVsZWFzZXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlbGVhc2VyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbm92YXRlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb24uanMnO1xuaW1wb3J0IHsgaW5zdGFsbEFnZW50U2tpbGxzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3NraWxscy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRzY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3RzY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MsIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlWWFybnJjWW1sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3lhcm5yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwU2VjcmV0cyB9IGZyb20gJy4vZ2l0aHViL3NlY3JldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VDb25maWcgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlIH0gZnJvbSAnLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZW52OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzZWNyZXRzIHRvIEdpdEh1YicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZScsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdTa2lwIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCB5YXJuIGJlcnJ5XG4gICAgYXdhaXQgZ2VuZXJhdGVZYXJucmNZbWwocm9vdENvbmZpZyk7XG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSdW5Xb3JrZmxvd3MgPVxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgIChyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fFxuICAgICAgICByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZml4RG9ja2VyZmlsZShyb290Q29uZmlnKSxcbiAgICAgIGZpeFByaXNtYUVudkZpbGVzKHJvb3RDb25maWcpLFxuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2VtaW5pQ29uZmlnKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICAuLi4oc2hvdWxkUnVuV29ya2Zsb3dzID8gW2dlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMaW50c3RhZ2VkcmMocm9vdENvbmZpZyksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoc2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UoY29uZmlnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4VHlwZURlZmluaXRpb25zKGNvbmZpZywgY29uZmlnLmlzUm9vdCA/IGFsbFBhY2thZ2VDb25maWdzIDogW2NvbmZpZ10pKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4UGxheXdyaWdodENvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhOZXh0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZywgcm9vdENvbmZpZyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWcpO1xuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbihjb25maWcsIHJvb3RDb25maWcsIGFyZ3Yuc2tpcERlcHMpO1xuXG4gICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZykpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiAmJiBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICAgICAgKSB7XG4gICAgICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUVzbGludHJjKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIC8vIFJlZnJlc2ggbG9jayBmaWxlc1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBmcy5ybVN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAnYnVuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWyd1cGRhdGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcy5ybVN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCcsICctLW5vLWltbXV0YWJsZSddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcbiAgICAvLyAneWFybiBpbnN0YWxsJyBzaG91bGQgYmUgYWZ0ZXIgYHlhcm4gY2xlYW51cGAgYmVjYXVzZSB5YXJuIGJlcnJ5IGdlbmVyYXRlcyB5YXJuLmxvY2tcbiAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb250ZW50cyBvZiBkZXBlbmRhbnQgc3ViLXBhY2thZ2UgaW4gbW9ub3JlcG9cbiAgICBpZiAoIXJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG5cbiAgICBhd2FpdCBpbnN0YWxsQWdlbnRTa2lsbHMocm9vdENvbmZpZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxuYXdhaXQgbWFpbigpO1xuIl0sIm5hbWVzIjpbIm9wdGlvbnMiLCJpc1ZlcmJvc2UiLCJkb2VzVXBsb2FkRW52VmFycyIsImxvZ2dlciIsImZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24iLCJuYW1lIiwiZnVuYyIsImNvbnNvbGUiLCJpbmZvIiwiZXJyb3IiLCJFcnJvciIsInN0YWNrIiwiU3RyaW5nIiwiYXN5bmMiLCJmaXhEb2NrZXJmaWxlIiwiY29uZmlnIiwiZG9lc0NvbnRhaW5Eb2NrZXJmaWxlIiwib2xkQ29udGVudCIsImRvY2tlcmZpbGUiLCJuZXdDb250ZW50IiwiZnMiLCJ3cml0ZUZpbGUiLCJwYXRoIiwiam9pbiIsImRpclBhdGgiLCJmc1V0aWwiLCJyZWFkRmlsZUlnbm9yaW5nRXJyb3IiLCJmaWxlUGF0aCIsInByb21pc2VzIiwicmVhZEZpbGUiLCJnZW5lcmF0ZUZpbGUiLCJjb250ZW50IiwibWtkaXIiLCJkaXJuYW1lIiwicmVjdXJzaXZlIiwibm9ybWFsaXplZENvbnRlbnQiLCJyZXBsYWNlQWxsIiwidHJpbSIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJmaXhOZXh0Q29uZmlnSnNvbiIsIm1hcCIsImV4dCIsInJlc29sdmUiLCJmaW5kIiwicCIsImV4aXN0c1N5bmMiLCJyZXBsYWNlIiwiXyIsInNldHRpbmdzVGV4dCIsImluY2x1ZGVzIiwicnVuIiwibGl0ZXJhbCIsInZhbHVlIiwia2luZCIsImFzT2JqZWN0IiwiZGVmYXVsdENvbmZpZyIsImZvcmJpZE9ubHkiLCJyZXRyaWVzIiwidXNlIiwiYmFzZVVSTCIsInRyYWNlIiwic2NyZWVuc2hvdCIsInZpZGVvIiwid2ViU2VydmVyIiwiY29tbWFuZCIsInVybCIsInJldXNlRXhpc3RpbmdTZXJ2ZXIiLCJ0aW1lb3V0Iiwic3Rkb3V0Iiwic3RkZXJyIiwiZW52IiwiZ3JhY2VmdWxTaHV0ZG93biIsImZpeFBsYXl3cmlnaHRDb25maWciLCJtYXRjaCIsImV4ZWMiLCJvYmplY3RMaXRlcmFsIiwicGFyc2VkIiwic291cmNlIiwidHMiLCJjcmVhdGVTb3VyY2VGaWxlIiwiU2NyaXB0VGFyZ2V0IiwiTGF0ZXN0IiwiU2NyaXB0S2luZCIsIlRTIiwic3RhdGVtZW50Iiwic3RhdGVtZW50cyIsImlzVmFyaWFibGVTdGF0ZW1lbnQiLCJkZWNsYXJhdGlvbiIsImRlY2xhcmF0aW9uTGlzdCIsImRlY2xhcmF0aW9ucyIsImluaXRpYWxpemVyIiwiaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsInBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJwYXJzZU9iamVjdExpdGVyYWwiLCJtZXJnZWQiLCJtZXJnZSIsImFsbCIsIkJvb2xlYW4iLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJoYXNCYXNlVXJsIiwiZW52RmlsZVBhdGhzIiwiZW52RmlsZVBhdGgiLCJ0ZXN0IiwiaGFzTmV4dFB1YmxpY0Jhc2VVcmwiLCJ1c2VDb25maWciLCJuZXdPYmplY3RMaXRlcmFsIiwic3RyaW5naWZ5T2JqZWN0IiwicHJvcGVydHkiLCJwcm9wZXJ0aWVzIiwiaXNQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc0lkZW50aWZpZXIiLCJpc1N0cmluZ0xpdGVyYWwiLCJwYXJzZUV4cHJlc3Npb24iLCJ1bmRlZmluZWQiLCJnZXRUZXh0IiwiZXhwcmVzc2lvbiIsInBhcnNlZE9iamVjdCIsImlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbiIsImVsZW1lbnRzIiwiZWxlbWVudCIsInNvbWUiLCJzdHJpbmdpZnlWYWx1ZSIsImxldmVsIiwidmFsdWVzIiwibGVuZ3RoIiwiaW5kZW50IiwicmVwZWF0IiwibGluZXMiLCJzdHJpbmdpZmllZCIsInNwbGl0IiwiYXQiLCJpbmRleCIsImNsb3NpbmdJbmRlbnQiLCJzdHJpbmdpZnlBcnJheSIsIm9iamVjdCIsIk9iamVjdCIsImVudHJpZXMiLCJrZXkiLCJnbG9iSWdub3JlIiwiZml4UHJpc21hRW52RmlsZXMiLCJlbnZGaWxlcyIsImZnIiwiZ2xvYiIsImRvdCIsImN3ZCIsImlnbm9yZSIsImVudkZpbGUiLCJmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIiwicGFja2FnZURpclBhdGhzIiwiUHJvbWlzZSIsIm5ld1Rlc3REaXJQYXRoIiwicGFja2FnZURpclBhdGgiLCJvbGRUZXN0RGlyTmFtZSIsIm9sZFRlc3REaXJQYXRoIiwicmVuYW1lIiwiZml4VHlwZURlZmluaXRpb25zIiwiY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuIiwibGliVHlwZURpclBhdGgiLCJzcmNUeXBlRGlyUGF0aCIsImlzUm9vdCIsImRvZXNDb250YWluU3ViUGFja2FnZUpzb25zIiwiZGlyZW50cyIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJkaXJlbnQiLCJkaXJOYW1lIiwic2xpY2UiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaGFzTGlicmFyeSIsImRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY2llcyIsImlzRmlsZSIsImlzRGlyZWN0b3J5Iiwib3ZlcndyaXRlTWVyZ2UiLCJkZXN0aW5hdGlvbkFycmF5Iiwic291cmNlQXJyYXkiLCJjb21iaW5lTWVyZ2UiLCJ0YXJnZXQiLCJkZXN0aW5hdGlvbiIsIml0ZW0iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwicHVzaCIsInNvcnRLZXlzIiwib2JqIiwia2V5QW5kVmFsdWVzIiwidG9Tb3J0ZWQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93Iiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsInBlcm1pc3Npb25zIiwiY29udGVudHMiLCJjb25jdXJyZW5jeSIsImdyb3VwIiwiam9icyIsImF1dG9maXgiLCJwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdyIsInVzZXMiLCJ3b3JrZmxvd3MiLCJyZWxlYXNlIiwicHVsbF9yZXF1ZXN0X3RhcmdldCIsInR5cGVzIiwic3luYyIsImlzc3VlcyIsImlmIiwid2l0aCIsInNlY3JldHMiLCJDTEFVREVfQ09ERV9PQVVUSF9UT0tFTiIsIk9QRU5BSV9BUElfS0VZIiwiR0VNSU5JX0FQSV9LRVkiLCJnZW5lcmF0ZVdvcmtmbG93cyIsInJvb3RDb25maWciLCJpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyIsInJlcG9zaXRvcnkiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwicm0iLCJmb3JjZSIsImZpbGVOYW1lU2V0IiwiU2V0IiwiZmlsdGVyIiwiZGVwZW5kaW5nIiwic2VtYW50aWNSZWxlYXNlIiwiYWRkIiwiZmlsZU5hbWUiLCJiYXNlbmFtZSIsIndyaXRlV29ya2Zsb3dZYW1sIiwiZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzIiwid3JpdGVZYW1sIiwiaXNQdWJsaWNSZXBvIiwiY2xvbmVEZWVwIiwicGFja2FnZU1hbmFnZXIiLCJpc0J1biIsInN0ZXBzIiwiYnVpbGQiLCJhdXRvZml4V29ya2Zsb3ciLCJhdXRvZml4Sm9iIiwiZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3ciLCJuZXdTZXR0aW5ncyIsIm9sZFNldHRpbmdzIiwieWFtbCIsImxvYWQiLCJhcnJheU1lcmdlIiwic3RhcnRzV2l0aCIsIm1vdmVUb0JvdHRvbSIsImFjdGlvbnMiLCJ0cmlnZ2VyX2RlcGxveV93b3JrZmxvdyIsImlzUmV1c2FibGVXb3JrZmxvdyIsImpvYiIsIm5vcm1hbGl6ZUpvYiIsInNjaGVkdWxlIiwiYnJhbmNoIiwicGFyYW1zIiwic3luY19wYXJhbXNfd2l0aG91dF9kZXN0Iiwid29ya2Zsb3dfZGlzcGF0Y2giLCJOUE1fVE9LRU4iLCJHSF9UT0tFTiIsIkZJUkVCQVNFX1RPS0VOIiwiR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJzZXJ2ZXJfdXJsIiwiZG90X2Vudl9wYXRoIiwiRkxZX0FQSV9UT0tFTiIsImRlcGxveV9jb21tYW5kIiwiY2lfbGFiZWwiLCJnaXRodWJfaG9zdGVkX3J1bm5lciIsImtleXMiLCJuZXdTZWNyZXRzIiwieWFtbFRleHQiLCJkdW1wIiwibGluZVdpZHRoIiwibm9Db21wYXRNb2RlIiwic3R5bGVzIiwiZml4VHlwb3MiLCJwYWNrYWdlQ29uZmlnIiwiZG9jRmlsZXMiLCJtZEZpbGUiLCJmaXhUeXBvc0luVGV4dCIsInJlcGxhY2VXaXRoQ29uZmlnIiwidHNGaWxlcyIsInRzRmlsZSIsImZpeFR5cG9zSW5Db2RlIiwidGV4dEJhc2VkRmlsZXMiLCJmaWxlIiwicHJvbWlzZUFsbCIsInByb3BOYW1lIiwiYmVmb3JlIiwiYWZ0ZXIiLCJ3YmZ5SnNvbiIsInR5cG9zIiwiZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyIsImFsbENvbmZpZ3MiLCJhZ2VudHNFeHRyYVBhdGgiLCJleHRyYUNvbnRlbnQiLCJ0b29sTmFtZSIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbiIsImN1cnNvclJ1bGVzUGF0aCIsImN1cnNvclJ1bGVzQ29udGVudCIsImZyb250bWF0dGVyIiwiYm9keSIsImdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQiLCJiYXNlQ29udGVudCIsImRlc2NyaXB0aW9uIiwiaXNXaWxsQm9vc3RlclJlcG8iLCJjIiwiaGFzU3RhcnRUZXN0U2VydmVyIiwiZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlIiwiaGFzTmV3U2VjdGlvbiIsImdlbkkxOG5UcyIsInJlYWN0IiwibmV4dCIsImdlbmVyYXRlQmlvbWVKc29uYyIsInJvb3QiLCIkc2NoZW1hIiwiZXh0ZW5kcyIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsIm5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlIiwibmV3Q29udGVudFdpdGhFeGFjdEZhbHNlIiwiZ2VuZXJhdGVCdW5maWdUb21sIiwicmVhZEZpbGVTeW5jIiwidXNlckNvbnRlbnRIZWFkZXIiLCJ1c2VyQ29udGVudEhlYWRlclJlZ2V4Iiwic2VwYXJhdG9yIiwiZGVmYXVsdEhlYWRVc2VyQ29udGVudCIsImRlZmF1bHRUYWlsVXNlckNvbnRlbnQiLCJpZ25vcmVGaWxlVXRpbCIsInNlcGFyYXRvclByZWZpeCIsInJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyIsImxhc3RIZWFkZXJJbmRleCIsImdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIiLCJnZXRIZWFkVXNlckNvbnRlbnQiLCJpbmRleE9mIiwidGhpcyIsImdldFRhaWxVc2VyQ29udGVudCIsImlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQiLCJsYXN0SW5kZXgiLCJsYXN0SW5kZXhPZiIsImdlbmVyYXRlRG9ja2VyaWdub3JlIiwiZXh0ZW5zaW9ucyIsImNvZGVXaXRoMkluZGVudFNpemUiLCJjb2RlV2l0aDRJbmRlbnRTaXplIiwibWFya2Rvd25MaWtlIiwiZXNsaW50IiwicHJldHRpZXIiLCJiaW9tZSIsImdlbmVyYXRlRXh0ZW5zaW9ucyIsImdlbmVyYXRlRWRpdG9yY29uZmlnIiwiZ2VuZXJhdGVFc2xpbnRyYyIsImVzbGludEJhc2UiLCJoYXZlX2Z1biIsImNvZGVfcmV2aWV3IiwiZGlzYWJsZSIsImNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkIiwibWF4X3Jldmlld19jb21tZW50cyIsInB1bGxfcmVxdWVzdF9vcGVuZWQiLCJoZWxwIiwic3VtbWFyeSIsImlnbm9yZV9wYXR0ZXJucyIsImdlbmVyYXRlR2VtaW5pQ29uZmlnIiwiY29uZmlnRmlsZVBhdGgiLCJzdHlsZWd1aWRlRmlsZVBhdGgiLCJuZXdDb25maWciLCJvbGRDb25maWciLCJ5YW1sQ29udGVudCIsInN0eWxlZ3VpZGVDb250ZW50IiwidHJpbUVuZCIsInJlbW92ZUdlbWluaVNldHRpbmdzIiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJoZWFkVXNlckNvbnRlbnQiLCJ0YWlsVXNlckNvbnRlbnQiLCJuYW1lcyIsImRvZXNDb250YWluR2VtZmlsZSIsImRvZXNDb250YWluR29Nb2QiLCJkb2VzQ29udGFpblBhY2thZ2VKc29uIiwiZG9lc0NvbnRhaW5Qb21YbWwiLCJkb2VzQ29udGFpblB1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwiLCJkb2VzQ29udGFpblBvZXRyeUxvY2siLCJibGl0eiIsImZpcmViYXNlIiwicHJpc21hIiwicGxheXdyaWdodFRlc3QiLCJyZWFjdE5hdGl2ZSIsInN0b3J5Ym9vayIsImxpdGVzdHJlYW0iLCJnZW5lcmF0ZWQiLCJyZWFkQ2FjaGUiLCJyZXNwb25zZSIsImZldGNoIiwicmVzcG9uc2VUZXh0IiwidGV4dCIsIm9rIiwid3JpdGVDYWNoZSIsIm9zIiwiaG9tZWRpciIsInN0YXQiLCJEYXRlIiwibm93IiwibXRpbWVNcyIsImNyZWF0ZVRhc2tPcHRpb25zIiwicnVubmVyIiwiYXJncyIsImV4dGVuc2lvbiIsInByZXR0aWVyQ29udGVudCIsImJpb21lQ29udGVudCIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0IiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyIsImRvZXNDb250YWluVHlwZVNjcmlwdCIsImRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMiLCJzcGF3blN5bmMiLCJyZXRyeSIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwiY2hpbGRfcHJvY2VzcyIsInN0YXR1cyIsInNwYXduU3luY0FuZFJldHVyblN0ZG91dCIsInN0ZGlvIiwicHJvYyIsInRvU3RyaW5nIiwicyIsIm1lc3NhZ2UiLCJwcm9jZXNzIiwiUEFUSCIsIkJFUlJZX0JJTl9GT0xERVIiLCJlbmNvZGluZyIsInNoZWxsIiwiZ2V0TGF0ZXN0Q29tbWl0SGFzaCIsIm9yZ2FuaXphdGlvbiIsInJlcG8iLCJyZXBvVXJsIiwiY29tbWl0SGFzaCIsInJlamVjdCIsIkVzbGludFV0aWwiLCJnZXRMaW50Rml4U3VmZml4IiwiZG9lc0NvbnRhaW5Kc3hPclRzeCIsImdpdEh1YlV0aWwiLCJnZXRPcmdBbmROYW1lIiwidXJsT3JGdWxsTmFtZSIsInVybFdpdGhvdXRQcm90b2NvbCIsIm9jdG9raXRDYWNoZSIsIk1hcCIsImdldE9jdG9raXQiLCJvd25lciIsImNhY2hlZCIsImdldCIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdldEdpdEh1YlRva2VuIiwic2V0IiwiaGFzR2l0SHViVG9rZW4iLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiIsIkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIiwiR0lUSFVCX1RPS0VOIiwianNDb21tb25EZXBzIiwidHNDb21tb25EZXBzIiwicmVhY3RDb21tb25EZXBzIiwiZXNsaW50RGVwcyIsImdlbmVyYXRlUGFja2FnZUpzb24iLCJza2lwQWRkaW5nRGVwcyIsImpzb25UZXh0IiwianNvbk9iaiIsInBlZXJEZXBlbmRlbmNpZXMiLCJhdXRob3IiLCJ0c2xpYiIsImxlcm5hIiwicGluc3QiLCJyZW1vdmVEZXByZWNhdGVkU3R1ZmYiLCJnZW5lcmF0ZVNjcmlwdHMiLCJwcmV0dGlmeSIsImV4aXN0aW5nQ29udGVudCIsIm9yaWdpbmFsQ29udGVudCIsImxpbmUiLCJuZXdMaW5lIiwibCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJwb2V0cnlEZXZEZXBlbmRlbmNpZXMiLCJodXNreSIsInBvc3RpbnN0YWxsIiwicG9zdHB1Ymxpc2giLCJwcmVwdWJsaXNoT25seSIsInByZXBhY2siLCJwb3N0cGFjayIsInByZXBhcmUiLCJ2ZXJzaW9uIiwiYXJ0aWxsZXJ5IiwicGxheXdyaWdodCIsIndvcmtzcGFjZXMiLCJBcnJheSIsImlzQXJyYXkiLCJ3b3Jrc3BhY2UiLCJnbG9iU3luYyIsIndiIiwibWljcm9tYXRjaCIsImdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwiZGVwIiwicHJpdmF0ZSIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsInNjcmlwdE5hbWUiLCJzY3JpcHQiLCJkaXJzIiwiZGlyIiwiZm9ybWF0IiwicHl0aG9uRmlsZXMiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwic2l6ZSIsImRpck5hbWVzU3RyIiwiZXhpc3RpbmdSZXBvc2l0b3J5Iiwibm9ybWFsaXplZFJlcG9zaXRvcnkiLCJub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24iLCJidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24iLCJub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5IiwiZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uIiwicGFja2FnZU5hbWVzIiwiaGFzIiwiaXNXb3Jrc3BhY2VQYWNrYWdlIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwibmV3SnNvblRleHQiLCJvbGRBbmROZXdTY3JpcHROYW1lcyIsIm9sZE5hbWUiLCJuZXdOYW1lIiwiZmlsZXMiLCJmaXhTY3JpcHROYW1lcyIsImRlcGVuZGVuY3lTcGVjaWZpZXJzIiwiZ2V0RGVwZW5kZW5jeVNwZWNpZmllciIsImRldkRlcGVuZGVuY3lTcGVjaWZpZXJzIiwiY29yZSIsImRlcGVuZGVuY3kiLCJyZXBvc2l0b3J5VXJsIiwibWF0Y2hlZCIsIm5vcm1hbGl6ZWRVcmwiLCJ0eXBlIiwib2xkU2NyaXB0cyIsImhhc1R5cGVjaGVjayIsImNsZWFudXAiLCJ0eXBlY2hlY2siLCJvbGRUZXN0IiwicHlyaWdodCIsImJhc2VTZXR0aW5ncyIsInByZUNvbW1pdFNldHRpbmdzIiwiY29tbWFuZHMiLCJnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiIsImh1c2t5RGlyUGF0aCIsImhhc0h1c2t5RGlyIiwic2V0dGluZ3MiLCJnZXRDbGVhbnVwQ29tbWFuZCIsInByZVB1c2giLCJ0eXBlY2hlY2tDb21tYW5kIiwiZ2V0UHJlUHVzaFNjcmlwdCIsIm1rZGlyU3luYyIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwicG9zdE1lcmdlQ29tbWFuZHMiLCJoYXNWZXJzaW9uU2V0dGluZ3MiLCJ0b29sc0NoYW5nZWRQYXR0ZXJuIiwicmF3IiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzIiwic3JjRGlyZWN0b3JpZXMiLCJub2RlIiwiZ2VuZXJhdGVMaW50c3RhZ2VkcmMiLCJwYWNrYWdlUHJlZml4IiwiZ2V0RXNsaW50S2V5IiwicGFja2FnZXNGaWx0ZXIiLCJnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllciIsImdldFNyY0RpcnMiLCJnZW5lcmF0ZVByZXR0aWVyaWdub3JlIiwiZ2l0aWdub3JlRmlsZVBhdGgiLCJnaXRpZ25vcmVDb250ZW50IiwiYWRkaXRpb25hbENvbnRlbnQiLCJ2ZW52UGF0aCIsInZlbnYiLCJnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIiwiZ2VuZXJhdGVSZWFkbWUiLCJpbnNlcnRCYWRnZSIsImZpbGVOYW1lcyIsInJlYWRkaXJTeW5jIiwiYmFkZ2VOYW1lIiwidG9VcHBlckNhc2UiLCJiYWRnZSIsInJlYWRtZSIsImkiLCJnZW5lcmF0ZVJlbGVhc2VyYyIsInBsdWdpbnMiLCJwbHVnaW4iLCJwcmVzZXQiLCJzdWNjZXNzQ29tbWVudENvbmRpdGlvbiIsImZhaWxDb21tZW50Q29uZGl0aW9uIiwibGFiZWxzIiwicmVsZWFzZWRMYWJlbHMiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJtYXRjaFBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJpbnN0YWxsVGFyZ2V0QWdlbnRBcmdzIiwiZmxhdE1hcCIsImFnZW50Iiwic2tpbGxzUmVwbyIsInBsYXl3cmlnaHRTa2lsbE5hbWUiLCJub25XZWJSZW1vdmFsQWdlbnRBcmdzIiwiaW5zdGFsbEFnZW50U2tpbGxzIiwiZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMiLCJpc1dlYkFwcFJlbGF0ZWQiLCJyZW1vdmVTa2lsbERpcmVjdG9yeSIsInJlbW92ZVNraWxsTG9ja0VudHJ5IiwicnVuSW5zdGFsbEFnZW50U2tpbGxzIiwicm9vdERpclBhdGgiLCJyZWxhdGl2ZVBhcmVudERpclBhdGgiLCJqc29uIiwic2tpbGxzIiwiaXNTa2lsbExvY2tKc29uIiwiZnJvbUVudHJpZXMiLCJyb290SnNvbk9iaiIsImNvbXBpbGVyT3B0aW9ucyIsImFsd2F5c1N0cmljdCIsIm5vVW5jaGVja2VkSW5kZXhlZEFjY2VzcyIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsInNvdXJjZU1hcCIsImltcG9ydEhlbHBlcnMiLCJvdXREaXIiLCJ0eXBlUm9vdHMiLCJleGNsdWRlIiwiaW5jbHVkZSIsInN1Ykpzb25PYmoiLCJnZW5lcmF0ZVRzY29uZmlnIiwiZ2V0VHNjb25maWdFeHRlbmRzIiwianN4IiwiZ2VuZXJhdGVkRXh0ZW5kcyIsImV4aXN0aW5nRXh0ZW5kcyIsIm1lcmdlZEV4dGVuZHMiLCJub3JtYWxpemVFeHRlbmRzIiwidW5pcXVlRXh0ZW5kcyIsIm1lcmdlVHNjb25maWdFeHRlbmRzIiwic29ydCIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJ2ZXJiYXRpbU1vZHVsZVN5bnRheCIsImV4Y2x1ZGVGaWxlUGF0dGVybnMiLCJnZW5lcmF0ZVZzY29kZVNldHRpbmdzIiwiZXhjbHVkZUZpbGVQYXR0ZXJuIiwiZXhjbHVkZVNldHRpbmciLCJnZW5lcmF0ZVlhcm5yY1ltbCIsInlhcm5yY1ltbFBhdGgiLCJjdXJyZW50VmVyc2lvbiIsImxhdGVzdFZlcnNpb24iLCJ2ZXJzaW9uc0pzb24iLCJnZXRMYXRlc3RWZXJzaW9uIiwiZ2V0TWFqb3JOdW1iZXIiLCJyZWxlYXNlc1BhdGgiLCJ5YXJucmNQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsIm5wbU1pbmltYWxBZ2VHYXRlIiwibnBtUHJlYXBwcm92ZWRQYWNrYWdlcyIsImNvbXByZXNzaW9uTGV2ZWwiLCJpbmplY3RFbnZpcm9ubWVudEZpbGVzIiwiZW5hYmxlR2xvYmFsQ2FjaGUiLCJvcmlnaW5hbExlbmd0aCIsInBsdWdpblBhdGgiLCJtYWpvciIsIk51bWJlciIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwid2FybiIsImNvbG9yIiwicmVxdWVzdCIsIkRFUFJFQ0FURURfU0VDUkVUX05BTUVTIiwic2V0dXBTZWNyZXRzIiwiZG90ZW52Iiwic2VjcmV0TmFtZSIsInNlY3JldF9uYW1lIiwia2V5X2lkIiwia2V5SWQiLCJkYXRhIiwic29kaXVtIiwicmVhZHkiLCJzZWNyZXQiLCJyYXdLZXkiLCJmcm9tX2Jhc2U2NCIsImJhc2U2NF92YXJpYW50cyIsIk9SSUdJTkFMIiwicmF3U2VjIiwiZnJvbV9zdHJpbmciLCJlbmNCeXRlcyIsImNyeXB0b19ib3hfc2VhbCIsImVuY0Jhc2U2NCIsInRvX2Jhc2U2NCIsImVuY3J5cHRlZF92YWx1ZSIsInNldHVwR2l0SHViU2V0dGluZ3MiLCJ3aXRoUmV0cnkiLCJhbGxvd19hdXRvX21lcmdlIiwiYWxsb3dfbWVyZ2VfY29tbWl0IiwiYWxsb3dfc3F1YXNoX21lcmdlIiwiYWxsb3dfcmViYXNlX21lcmdlIiwiYWxsb3dfdXBkYXRlX2JyYW5jaCIsImRlbGV0ZV9icmFuY2hfb25fbWVyZ2UiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlIiwic3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlIiwiaGVhZGVycyIsInBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIiLCJ0ZW1wbGF0ZXMiLCJnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyIsImFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZSIsImRpc3RhbmNlIiwidGVtcGxhdGUiLCJwYWNrYWdlTWFuYWdlckNvbW1hbmQiLCJ3YmZ5SnNvblNjaGVtYSIsInoiLCJyZWNvcmQiLCJzdHJpbmciLCJvcHRpb25hbCIsImRvYyIsImdldFBhY2thZ2VDb25maWciLCJwYWNrYWdlSnNvblBhdGgiLCJlc21QYWNrYWdlIiwicGFja2FnZUpzb25UZXh0IiwicmVsZWFzZUJyYW5jaGVzIiwicmVsZWFzZVBsdWdpbnMiLCJyZWxlYXNlcmNKc29uUGF0aCIsImZzcCIsImZsYXQiLCJyZXBvSW5mbyIsImdpdCIsInNpbXBsZUdpdCIsIm9yaWdpbiIsImdldFJlbW90ZXMiLCJyIiwicmVtb3RlVXJsIiwicmVmcyIsInJlcXVlc3RSZXBvSW5mbyIsImZldGNoUmVwb0luZm8iLCJjdXJyZW50IiwiaGFzVmVyc2lvblNldHRpbmdzRmlsZSIsInByZWZpeCIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsInJlcG9GdWxsTmFtZSIsImZ1bGxfbmFtZSIsInJlcG9BdXRob3IiLCJyZXBvTmFtZSIsInJlcG9QYXJ0cyIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsImlzRXNtUGFja2FnZSIsInNlcCIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24iLCJnaXRodWIiLCJucG0iLCJnZXRFc2xpbnRFeHRlbnNpb25CYXNlIiwicGF0dGVybiIsIm9yZyIsInJldCIsImFzc2lnbiIsInJlZGlyZWN0ZWRGdWxsTmFtZSIsImxvY2F0aW9uIiwiZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZSIsInNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlIiwiYXJndiIsInlhcmdzIiwicG9zaXRpb25hbCIsImRlc2NyaWJlIiwiYXJyYXkiLCJkZWZhdWx0IiwiYWxpYXMiLCJza2lwRGVwcyIsInZlcmJvc2UiLCJwYWNrYWdlSnNvbkRpciIsIlVSTCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsInN0cmljdCIsInBhdGhzIiwicGFja2FnZXNEaXJQYXRoIiwic3ViRGlyUGF0aHMiLCJpZ25vcmVFcnJvckFzeW5jIiwiZCIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInNob3VsZFJ1bldvcmtmbG93cyIsInRoZW4iLCJybVN5bmMiXSwibWFwcGluZ3MiOiJtb0JBS08sTUFBTUEsRUFBVSxJQUx2QixNQUNFQyxXQUFZLEVBQ1pDLG1CQUFvQixHQ2dCZixNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENOLEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssYUFBYUgscUJBRTVCLFVBQ1FDLEdBQ1IsQ0FBRSxNQUFPRyxHQUNQRixRQUFRQyxLQUFLLHFCQUFxQkgsTUFBU0ksYUFBaUJDLE1BQVFELEVBQU1FLE1BQVFDLE9BQU9ILE1BQzNGLENBQ0lULEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssY0FBY0gsbUJBRS9CLEdDVEtRLGVBQWVDLEVBQWNDLEdBQ2xDLE9BQU9aLEVBQU9DLDBCQUEwQixnQkFBaUJTLFVBQ3ZELElBQUtFLEVBQU9DLHNCQUF1QixPQUVuQyxNQUFNQyxFQUFhRixFQUFPRyxXQUNwQkMsRUFBYUYsRUFFZkEsSUFBZUUsU0FDYkMsRUFBR0MsVUFBVUMsRUFBS0MsS0FBS1IsRUFBT1MsUUFBUyxjQUFlTCxJQUVoRSxDQ2JPLE1BQU1NLEVBQVMsQ0FDcEIsMkJBQU1DLENBQXNCQyxHQUMxQixJQUNFLGFBQWFQLEVBQUdRLFNBQVNDLFNB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
|