@willbooster/wbfy 1.6.2 → 1.6.4
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 +7 -7
- package/package.json +4 -3
package/dist/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import e from"node:fs";import t from"node:path";import n from"yargs";import i from"typescript";import{PromisePool as r}from"minimal-promise-pool";import s from"node:fs/promises";import o from"fast-glob";import a from"semver/functions/compare.js";import c from"semver/ranges/min-version.js";import l from"deepmerge";import p from"js-yaml";import u,{parse as d}from"smol-toml";import f from"node:os";import m from"node:child_process";import{Octokit as g}from"@octokit/core";import y from"semver";import{createRequire as h}from"node:module";import b from"dotenv";import{distance as w}from"fastest-levenshtein";import{simpleGit as v}from"simple-git";import{z as k}from"zod";async function x(e){return new Promise(t=>setTimeout(t,e))}async function j(e){try{return await e()}catch{}}async function _(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}const $=new class{isVerbose=!1;doesUploadEnvVars=!1};const S=new class{async functionIgnoringException(e,t){$.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}$.isVerbose&&console.info(`---------- ${e} end ----------`)}},P={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,i){await e.promises.mkdir(t.dirname(n),{recursive:!0});let r=i.trim();r&&(r+="\n"),await e.promises.writeFile(n,r)}},O=new r;async function E(n){return S.functionIgnoringException("fixNextConfigJson",async()=>{const r=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!r)return;const s=await e.promises.readFile(r,"utf8"),o=function(e){const t=i.createSourceFile("next.config.js",e,i.ScriptTarget.Latest,!0,i.ScriptKind.JS);let n;const r=e=>{n||(i.isExportAssignment(e)&&i.isObjectLiteralExpression(e.expression)?n=e.expression:i.isBinaryExpression(e)&&e.operatorToken.kind===i.SyntaxKind.EqualsToken&&"module.exports"===e.left.getText(t)&&i.isObjectLiteralExpression(e.right)?n=e.right:i.forEachChild(e,r))};return r(t),n}(s);if(!o)return;const a=[];if(new Set(o.properties.map(e=>e.name?.getText())).has("typescript")||a.push("typescript: { ignoreBuildErrors: true }"),0===a.length)return;const c=o.getEnd()-1,l=o.properties.at(-1),p=!!l&&s.slice(l.getEnd(),c).includes(","),u=o.properties.length>0&&!p?", ":"",d=`${s.slice(0,c)}${u}${a.join(", ")}${s.slice(c)}`;await O.run(()=>P.generateFile(r,d))})}const C=e=>({kind:"literal",value:e}),A=(e,t=[])=>({kind:"object",value:F(e,t)}),B=F({forbidOnly:C("!!process.env.CI"),retries:C("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:A({baseURL:C("process.env.NEXT_PUBLIC_BASE_URL"),trace:C("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:C("process.env.CI ? 'only-on-failure' : 'on'"),video:C("process.env.CI ? 'on-first-retry' : 'retain-on-failure'")}),webServer:A({command:C("'yarn start-test-server'"),url:C("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:C("!!process.env.CI"),timeout:C("300_000"),stdout:C("'pipe'"),stderr:C("'pipe'"),env:C("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:C("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})});function F(e,t=[]){return{extraMembers:t,memberOrder:[...Object.keys(e).map(e=>({kind:"property",key:e})),...t.map((e,t)=>({kind:"extra",index:t}))],properties:e}}async function I(n){const r=t.resolve(n.dirPath,"playwright.config.ts");if(e.existsSync(r))return S.functionIgnoringException("fixPlaywrightConfig",async()=>{await async function(n){for(const i of function(n){const i=[".env",".env.test",".env.example","mise.toml","mise.test.toml"],r=[];for(let s=t.resolve(n);r.push(...i.map(e=>t.resolve(s,e))),!e.existsSync(t.resolve(s,".git"));s=t.dirname(s)){if(t.dirname(s)===s)break}return r}(n))try{const t=await e.promises.readFile(i,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(t))return}catch{}throw new Error("NEXT_PUBLIC_BASE_URL is required for Playwright. Define NEXT_PUBLIC_BASE_URL in the target repo.")}(n.dirPath);const s=await e.promises.readFile(r,"utf8"),o=function(e){const t=i.createSourceFile("playwright.config.ts",e,i.ScriptTarget.Latest,!0,i.ScriptKind.TS);let n;const r=e=>{if(!n){if(i.isCallExpression(e)&&"defineConfig"===e.expression.getText(t)){const t=e.arguments[0];if(t&&i.isObjectLiteralExpression(t))return void(n=t)}i.forEachChild(e,r)}};return r(t),n?{source:t,node:n}:void 0}(s);if(!o)return;const a=W(o.node,o.source);if(!a)return;const c=R(B,a),l=Boolean(n.packageJson?.scripts?.["start-test-server"]),p=Boolean(a.properties.webServer);l||p||delete c.properties.webServer,function(e,t){const n=t.properties.webServer;if("object"!==n?.kind)return;n.value.properties.command=C(e.isBun?"'bun start-test-server'":"'yarn start-test-server'")}(n,c);const u=N({kind:"object",value:c},0),d=o.node.getStart(o.source),f=o.node.getEnd(),m=`${s.slice(0,d)}${u}${s.slice(f)}`;await O.run(()=>P.generateFile(r,m))})}function R(e,t){const n=new Set(Object.keys(t.properties)),i=[...e.extraMembers,...t.extraMembers],r=[...e.memberOrder.filter(e=>"property"!==e.kind||!n.has(e.key)),...t.memberOrder.map(t=>"property"===t.kind?t:{kind:"extra",index:e.extraMembers.length+t.index})],s={...e.properties};for(const[e,n]of Object.entries(t.properties))s[e]=D(s[e],n);return{extraMembers:i,memberOrder:r,properties:s}}function D(e,t){return"object"===e?.kind&&"object"===t.kind?{kind:"object",value:R(e.value,t.value)}:t}function T(e,t){if(i.isObjectLiteralExpression(e)){const n=W(e,t);return n?{kind:"object",value:n}:C(e.getText(t))}if(i.isArrayLiteralExpression(e)){const n=e.elements.map(e=>T(e,t));return n.some(e=>void 0===e)?C(e.getText(t)):{kind:"array",value:n}}return C(e.getText(t))}function W(e,t){const n={extraMembers:[],memberOrder:[],properties:{}};for(const r of e.properties){if(i.isShorthandPropertyAssignment(r)){const e=r.name.getText(t);n.properties[e]=C(e),n.memberOrder.push({kind:"property",key:e});continue}if(!i.isPropertyAssignment(r)||!i.isIdentifier(r.name)&&!i.isStringLiteral(r.name)){const e=n.extraMembers.push(r.getText(t))-1;n.memberOrder.push({kind:"extra",index:e});continue}const e=T(r.initializer,t);if(void 0===e)return;const s=r.name.getText(t);n.properties[s]=e,n.memberOrder.push({kind:"property",key:s})}return n}function N(e,t){const n=" ".repeat(t);if("array"===e.kind){if(0===e.value.length)return"[]";const i=" ".repeat(t+1);return`[\n${e.value.map(e=>{const n=N(e,t+1).split("\n");if(n[n.length-1]=`${n.at(-1)},`,"literal"===e.kind)for(let e=1;e<n.length;e+=1)n[e]=`${i}${n[e]}`;return n[0]=`${i}${n[0]}`,n.join("\n")}).join("\n")}\n${n}]`}if("literal"===e.kind)return e.value;const i=" ".repeat(t+1),r=new Set,s=function(e){const t=new Map;for(const[n,i]of e.entries())"property"===i.kind&&t.set(i.key,n);return t}(e.value.memberOrder),o=e.value.memberOrder.flatMap((n,o)=>{if("extra"===n.kind)return[J(e.value.extraMembers[n.index]??"",i)];if(s.get(n.key)!==o)return[];const a=e.value.properties[n.key];return!a||r.has(n.key)?[]:(r.add(n.key),[L(n.key,a,t,i)])});return o.push(...Object.entries(e.value.properties).filter(([e])=>!r.has(e)).map(([e,n])=>L(e,n,t,i))),0===o.length?`{\n${n}}`:`{\n${o.join("\n")}\n${n}}`}function L(e,t,n,i){const r=N(t,n+1).split("\n");if(r[r.length-1]=`${r.at(-1)},`,"literal"===t.kind)for(let e=1;e<r.length;e+=1)r[e]=`${i}${r[e]}`;return r[0]=`${i}${e}: ${r[0]}`,r.join("\n")}function J(e,t){const n=e.split("\n");n[n.length-1]=`${n.at(-1)},`;for(const[e,i]of n.entries())n[e]=`${t}${i}`;return n.join("\n")}const U=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function M(e){return S.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=function(e){if(!e.depending.prisma)return!1;const t={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};return!t["@prisma/adapter-better-sqlite3"]&&!t["@prisma/adapter-libsql"]}(e),i=await o.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:U});for(const r of i){const i=t.resolve(e.dirPath,r),o=await s.readFile(i,"utf8"),a=o.replaceAll(/DATABASE_URL\s*=\s*"?([^"#\n]+?\.sqlite3[^"#\n]*)"?/g,(e,t)=>`DATABASE_URL="${G(t,n)}"`);a!==o&&await s.writeFile(i,a)}})}function G(e,t){const n=e.indexOf("?"),i=-1!==n?e.slice(0,n):e,r=-1!==n?e.slice(n+1):"",s=new URLSearchParams(r);s.delete("connection_limit"),t&&s.set("connection_limit","1");const o=s.toString();return o?`${i}?${o}`:i}const q=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function z(e,t){let n,i,r;"function"==typeof t?i=t:n=t;const s={},o=[...n??[],...Object.keys(e).sort(i)];for(r of o)q(e,r)&&(s[r]=e[r]);return s}const H=/^(?:( )+|\t+)/,Y="space";function K(e,t,n){return e&&t===Y&&1===n}function V(e,t){const n=new Map;let i,r,s=0;for(const o of e.split(/\n/g)){if(!o)continue;const e=o.match(H);if(null===e)s=0,i="";else{const o=e[0].length,a=e[1]?Y:"tab";if(K(t,a,o))continue;a!==i&&(s=0),i=a;let c=1,l=0;const p=o-s;if(s=o,0===p)c=0,l=1;else{const e=Math.abs(p);if(K(t,a,e))continue;r=X(a,e)}const u=n.get(r);n.set(r,void 0===u?[1,0]:[u[0]+c,u[1]+l])}}return n}function X(e,t){return(e===Y?"s":"t")+String(t)}function Z(e){if("string"!=typeof e)throw new TypeError("Expected a string");let t=V(e,!0);0===t.size&&(t=V(e,!1));const n=function(e){let t,n=0,i=0;for(const[r,[s,o]]of e)(s>n||s===n&&o>i)&&(n=s,i=o,t=r);return t}(t);let i,r=0,s="";var o;return void 0!==n&&(({type:i,amount:r}={type:"s"===(o=n)[0]?Y:"tab",amount:Number(o.slice(1))}),s=function(e,t){return(e===Y?" ":"\t").repeat(t)}(i,r)),{amount:r,type:i,indent:s}}function Q(e){return"string"==typeof e&&function(e){if("string"!=typeof e)throw new TypeError("Expected a string");const t=e.match(/(?:\r?\n)/g)||[];if(0===t.length)return;const n=t.filter(e=>"\r\n"===e).length;return n>t.length-n?"\r\n":"\n"}(e)||"\n"}const ee=e=>(t,...n)=>e.reduce((e,t)=>t(e,...n),t),te=e=>t=>Array.isArray(t)?e(t):t,ne=e=>t=>Array.isArray(t)&&t.every(e=>"string"==typeof e)?e(t):t,ie=ne(e=>[...new Set(e)]),re=ne(e=>e.toSorted()),se=ee([ie,re]),oe=e=>(t,...n)=>function(e){if("object"!=typeof e||null===e)return!1;const t=Object.getPrototypeOf(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)}(t)?e(t,...n):t,ae=(e,t)=>{const n=oe(i=>(t&&(i=Object.fromEntries(Object.entries(i).map(([e,t])=>[e,n(t)]))),z(i,e)));return n},ce=Object.groupBy||((e,t)=>{const n=Object.create(null);for(const i of e){const e=t(i);n[e]?n[e].push(i):n[e]=[i]}return n}),le=ae(),pe=ae(["type","url"]),ue=ae(["name","email","url"]),de=ae(["lib","bin","man","doc","example","test"]),fe=(e,t)=>oe((n,...i)=>Object.hasOwn(n,e)?{...n,[e]:t(n[e],...i)}:n),me=ae(["applypatch-msg","pre-applypatch","post-applypatch","pre-commit","pre-merge-commit","prepare-commit-msg","commit-msg","post-commit","pre-rebase","post-checkout","post-merge","pre-push","pre-receive","update","proc-receive","post-receive","post-update","reference-transaction","push-to-checkout","pre-auto-gc","post-rewrite","sendemail-validate","fsmonitor-watchman","p4-changelist","p4-prepare-changelist","p4-post-changelist","p4-pre-submit","post-index-change"]),ge=e=>{const[t]=e.split(">"),n=[...t.matchAll("@")];if(!n.length||1===n.length&&0===n[0].index)return{name:e};const i=n.pop().index;return{name:t.substring(0,i),range:t.substring(i+1)}},ye=ae((e,t)=>{const{name:n,range:i}=ge(e),{name:r,range:s}=ge(t);return n!==r?n.localeCompare(r,"en"):i?s?a(c(i),c(s)):1:-1}),he=e=>{const t=e.indexOf("@",e.startsWith("@")?1:0);return-1===t?e:e.slice(0,t)},be=new Map;function we(t){return"string"==typeof t.packageManager?t.packageManager.startsWith("npm@"):t.devEngines?.packageManager?.name?"npm"===t.devEngines.packageManager.name:!t.pnpm&&(!!t.engines?.npm||!(()=>{const t=process.cwd();return be.has(t)||be.set(t,e.existsSync("yarn.lock")||e.existsSync(".yarn/")||e.existsSync(".yarnrc.yml")||e.existsSync("pnpm-lock.yaml")||e.existsSync("pnpm-workspace.yaml")),be.get(t)})())}const ve=oe((e,t)=>Object.keys(e).length<2?e:we(t)?z(e,(e,t)=>e.localeCompare(t,"en")):z(e)),ke=ee([ae(["packages","catalog"]),fe("packages",se),fe("catalog",ve)]),xe=ee([ae(["files","excludedFiles","env","parser","parserOptions","settings","plugins","extends","rules","overrides","globals","processor","noInlineConfig","reportUnusedDisableDirectives"]),fe("env",le),fe("globals",le),fe("overrides",te(e=>e.map(xe))),fe("parserOptions",le),fe("rules",ae((e,t)=>e.split("/").length-t.split("/").length||e.localeCompare(t))),fe("settings",le)]),je=ae(["description","url","href"]),_e=ee([oe(e=>z(e,[...Object.keys(e).filter(e=>"overrides"!==e).sort(),"overrides"])),fe("overrides",te(e=>e.map(ee([le,fe("options",le)]))))]),$e=ae(["node","npm","yarn"]),Se=fe("packageManager",ae(["name","version","onFail"])),Pe=ee([ae(["peerDependencyRules","neverBuiltDependencies","onlyBuiltDependencies","onlyBuiltDependenciesFile","allowedDeprecatedVersions","allowNonAppliedPatches","updateConfig","auditConfig","requiredScripts","supportedArchitectures","overrides","patchedDependencies","packageExtensions"],!0),fe("overrides",ye)]),Oe=new Set(["install","pack","prepare","publish","restart","shrinkwrap","start","stop","test","uninstall","version"]),Ee=(e,t)=>Object.hasOwn(t,"devDependencies")&&Object.hasOwn(t.devDependencies,e),Ce=/(?<=^|[\s&;<>|(])(?:run-s|npm-run-all2? .*(?:--sequential|--serial|-s))(?=$|[\s&;<>|)])/,Ae=e=>{if(!Ee("npm-run-all",e)&&!Ee("npm-run-all2",e))return!1;return["scripts","betterScripts"].flatMap(t=>e[t]?Object.values(e[t]):[]).some(e=>{return(t=e).includes("*")&&Ce.test(t);var t})};function Be(e,t=""){const n=new Map;for(const i of e){const e=(t?i.slice(t.length+1):i).indexOf(":");if(e>0){const r=i.slice(0,(t?t.length+1:0)+e);n.has(r)||n.set(r,[]),n.get(r).push(i)}else n.has(i)||n.set(i,[]),n.get(i).push(i)}return Array.from(n.keys()).sort().flatMap(e=>{const t=n.get(e);if(t.length>1&&t.some(t=>t!==e&&t.startsWith(e+":"))){return[...t.filter(t=>t===e||!t.startsWith(e+":")).sort(),...Be(t.filter(t=>t.startsWith(e+":")),e)]}return t.sort()})}const Fe=oe((e,t)=>{let n=Object.keys(e);const i=new Set;return n=n.map(e=>{const t=e.replace(/^(?:pre|post)/,"");return Oe.has(t)||n.includes(t)?(i.add(t),t):e}),Ae(t)||(n=Be(n)),n=n.flatMap(e=>i.has(e)?[`pre${e}`,e,`post${e}`]:[e]),z(e,n)}),Ie=e=>{const{defaultConditions:t=[],restConditions:n=[]}=ce(e,e=>"default"===e?"defaultConditions":"restConditions");return[...n,...t]},Re=oe(e=>{const{paths:t=[],conditions:n=[]}=ce(Object.keys(e),e=>e.startsWith(".")?"paths":"conditions");return Object.fromEntries([...t,...Ie(n)].map(t=>[t,Re(e[t])]))}),De=[{key:"$schema"},{key:"name"},{key:"displayName"},{key:"version"},{key:"stableVersion"},{key:"private"},{key:"description"},{key:"categories",over:ie},{key:"keywords",over:ie},{key:"homepage"},{key:"bugs",over:ae(["url","email"])},{key:"repository",over:pe},{key:"funding",over:pe},{key:"license",over:pe},{key:"qna"},{key:"author",over:ue},{key:"maintainers",over:te(e=>e.map(ue))},{key:"contributors",over:te(e=>e.map(ue))},{key:"publisher"},{key:"sideEffects"},{key:"type"},{key:"imports"},{key:"exports",over:Re},{key:"main"},{key:"svelte"},{key:"umd:main"},{key:"jsdelivr"},{key:"unpkg"},{key:"module"},{key:"source"},{key:"jsnext:main"},{key:"browser"},{key:"react-native"},{key:"types"},{key:"typesVersions"},{key:"typings"},{key:"style"},{key:"example"},{key:"examplestyle"},{key:"assets"},{key:"bin",over:le},{key:"man"},{key:"directories",over:de},{key:"files",over:ie},{key:"workspaces",over:ke},{key:"binary",over:ae(["module_name","module_path","remote_path","package_name","host"])},{key:"scripts",over:Fe},{key:"betterScripts",over:Fe},{key:"l10n"},{key:"contributes",over:le},{key:"activationEvents",over:ie},{key:"husky",over:fe("hooks",me)},{key:"simple-git-hooks",over:me},{key:"pre-commit"},{key:"commitlint",over:le},{key:"lint-staged"},{key:"nano-staged"},{key:"config",over:le},{key:"nodemonConfig",over:le},{key:"browserify",over:le},{key:"babel",over:le},{key:"browserslist"},{key:"xo",over:le},{key:"prettier",over:_e},{key:"eslintConfig",over:xe},{key:"eslintIgnore"},{key:"npmpkgjsonlint",over:le},{key:"npmPackageJsonLintConfig",over:le},{key:"npmpackagejsonlint",over:le},{key:"release",over:le},{key:"remarkConfig",over:le},{key:"stylelint"},{key:"ava",over:le},{key:"jest",over:le},{key:"jest-junit",over:le},{key:"jest-stare",over:le},{key:"mocha",over:le},{key:"nyc",over:le},{key:"c8",over:le},{key:"tap",over:le},{key:"oclif",over:ae(void 0,!0)},{key:"resolutions",over:le},{key:"overrides",over:ve},{key:"dependencies",over:ve},{key:"devDependencies",over:ve},{key:"dependenciesMeta",over:ae((e,t)=>{const n=he(e),i=he(t);return n<i?-1:n>i?1:0},!0)},{key:"peerDependencies",over:ve},{key:"peerDependenciesMeta",over:ae(void 0,!0)},{key:"optionalDependencies",over:ve},{key:"bundledDependencies",over:se},{key:"bundleDependencies",over:se},{key:"extensionPack",over:se},{key:"extensionDependencies",over:se},{key:"flat"},{key:"packageManager"},{key:"engines",over:le},{key:"engineStrict",over:le},{key:"devEngines",over:Se},{key:"volta",over:$e},{key:"languageName"},{key:"os"},{key:"cpu"},{key:"preferGlobal",over:le},{key:"publishConfig",over:le},{key:"icon"},{key:"badges",over:te(e=>e.map(je))},{key:"galleryBanner",over:le},{key:"preview"},{key:"markdown"},{key:"pnpm",over:Pe}],Te=De.map(({key:e})=>e),We=ee(De.map(({key:e,over:t})=>t?fe(e,t):void 0).filter(Boolean));function Ne(e,t={}){return function(e,t){if("string"==typeof e){const{indent:n,type:i}=Z(e),r="\n"===e.slice(-1)?"\n":"",s=Q(e);e=JSON.parse(e);let o=JSON.stringify(t(e),null,"tab"===i?"\t":n)+r;return"\r\n"===s&&(o=o.replace(/\n/g,s)),o}return t(e)}(e,oe(e=>{let n=t.sortOrder||Te;if(Array.isArray(n)){const t=Object.keys(e),{privateKeys:i=[],publicKeys:r=[]}=ce(t,e=>"_"===e[0]?"privateKeys":"publicKeys");n=[...n,...Te,...r.sort(),...i.sort()]}return We(z(e,n),e)}))}async function Le(n){return S.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const i=t.join(n,"package.json");if(!e.existsSync(i))return;const r=t.join(n,"test");for(const s of["__tests__","tests"]){const o=t.join(n,s);try{await Je(o,r);const t=JSON.parse(await e.promises.readFile(i,"utf8"));let n=!1;const a=t.scripts??{};for(const[e,t]of Object.entries(a)){const i=t.replaceAll(s,"test");t!==i&&(a[e]=i,n=!0)}if(t.scripts=a,!n)return;await P.generateFile(i,JSON.stringify(Ne(t),void 0,2))}catch{}}}))})}async function Je(n,i){if(!e.existsSync(i))return void await e.promises.rename(n,i);const r=await e.promises.readdir(n,{withFileTypes:!0});await Promise.all(r.map(async r=>{const s=t.join(n,r.name),o=t.join(i,r.name),a=e.existsSync(o)?await e.promises.stat(o):void 0;r.isDirectory()&&a?.isDirectory()?await Je(s,o):await e.promises.rename(s,o)})),await e.promises.rm(n,{recursive:!0})}async function Ue(e,n){return S.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),r=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),o=await _(()=>s.readdir(i,{withFileTypes:!0}));if(o)for(const e of o){const o=e.name.slice(0,-5),a=e.name.endsWith(".d.ts");let c=a?o:e.name;c.includes("__")&&(c=`@${c.replace("__","/")}`);const l=n.some(e=>e.packageJson?.dependencies?.[c]||e.packageJson?.devDependencies?.[c]);e.isFile()&&a?l?(await s.mkdir(t.join(i,o),{recursive:!0}),await O.run(()=>s.rename(t.join(i,e.name),t.join(i,o,"index.d.ts")))):r&&(await s.mkdir(r,{recursive:!0}),await O.run(()=>s.rename(t.join(i,e.name),t.join(r,e.name)))):e.isDirectory()&&r&&!l&&(await s.mkdir(r,{recursive:!0}),await O.run(()=>_(()=>s.rename(t.join(i,e.name,"index.d.ts"),t.join(r,`${e.name}.d.ts`)))))}})}function Me(e,t){return t}function Ge(e,t,n){const i=[...e];for(const[r,s]of t.entries())void 0===i[r]?i[r]=qe(s,n):ze(e[r],n)&&ze(s,n)?i[r]=l(e[r],s,n):e.includes(s)||i.push(s);return i}function qe(e,t){return ze(e,t)?t.cloneUnlessOtherwiseSpecified(e,t):e}function ze(e,t){return!!e&&"object"==typeof e&&t.isMergeableObject(e)}function He(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,i]of t)delete e[n],e[n]=i,i&&"object"==typeof i&&!Array.isArray(i)&&He(i);return e}const Ye={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"}}},Ke={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"}}},Ve={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 Xe(n){return S.functionIgnoringException("generateWorkflow",async()=>{if(Ze(n.repository))return;const i=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(i,{recursive:!0});const r=t.resolve(n.dirPath,".github","semantic.yml");await O.run(()=>e.promises.rm(r,{force:!0,recursive:!0}));const s=await e.promises.readdir(i,{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",...s.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 r=t.basename(e,".yml");await O.run(()=>Qe(n,i,r))}})}function Ze(e){return e?.endsWith("/reusable-workflows")??!1}async function Qe(n,i,r){const s=t.join(i,`${r}.yml`),o=e.existsSync(t.join(i,"deploy-production.yml"));if("autofix"===r)return void await tt(function(e){if(!e.isPublicRepo)return structuredClone(Ke);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0,"node-version":"lts/*"}},...e.isBun?[{uses:"oven-sh/setup-bun@v2",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 i=structuredClone(Ye),r=i.jobs.autofix??{"runs-on":"ubuntu-latest"};return i.jobs.autofix={...r,steps:n},i}(n),s);let a=structuredClone(r in Ve?Ve[r]:{});try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);a=l.all([a,n,a],{arrayMerge:Ge})}catch{}if(!("jobs"in a))return;r.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"===r&&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 c=!1;for(const e of Object.values(a.jobs))e.uses?.includes("/reusable-workflows/")&&(et(n,e,r),c=!0);if(c){switch(r){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(i,"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 tt(a,s),"sync"===r){if(await e.promises.rm(t.join(i,"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 tt(a,t.join(i,"sync-force.yml"))}}}function et(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?He(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=He(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function tt(t,n){const i=p.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}).replaceAll(/[ \t]+$/gm,"");await e.promises.writeFile(n,i)}async function nt(n){return S.functionIgnoringException("fixTypos",async()=>{if(Ze(n.repository))return;const i=n.dirPath,r=await o.glob("**/*.md",{dot:!0,cwd:i,ignore:U});$.isVerbose&&console.info(`Found ${r.length} markdown files in ${i}`);for(const s of r){const r=t.join(i,s);O.run(async()=>{const t=await e.promises.readFile(r,"utf8");let i=it(t);i=rt(i,n,"doc"),t!==i&&await P.generateFile(r,i)})}const s=await o.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:i,ignore:U});$.isVerbose&&console.info(`Found ${s.length} TypeScript files in ${i}`);for(const r of s){const s=t.join(i,r);O.run(async()=>{const t=await e.promises.readFile(s,"utf8");let i=t.replaceAll(/\/\*[\s\S]*?\*\//g,e=>it(e)).replaceAll(/(^|\s)\/\/(.*?)c\.f\./g,"$1//$2cf.").replaceAll(/(^|\s)\/\/(.*?)eg\./g,"$1//$2e.g.").replaceAll(/(^|\s)\/\/(.*?)ie\./g,"$1//$2i.e.");i=rt(i,n,"ts"),t!==i&&await P.generateFile(s,i)})}const a=await o.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:i,ignore:U});$.isVerbose&&console.info(`Found ${a.length} text-based files in ${i}`);for(const r of a){const s=t.join(i,r);O.run(async()=>{const t=await e.promises.readFile(s,"utf8");let i=it(t);i=rt(i,n,"text"),t!==i&&await P.generateFile(s,i)})}await O.promiseAll()})}function it(e){return e.replaceAll(/\bc\.f\.(?=\s|$)/g,"cf.").replaceAll(/\beg\.(?=\s|$)/g,"e.g.").replaceAll(/\bie\.(?=\s)/g,"i.e.")}function rt(e,t,n){for(const[n,i]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,i);for(const[i,r]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(i,r);return e}async function st(e,n){return S.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const i=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),r=await P.readFileIgnoringError(i);for(const[i,s]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const o=ot(e,n,s,r),a=t.resolve(e.dirPath,i);await O.run(()=>P.generateFile(a,o))}const s=t.resolve(e.dirPath,".cursor/rules/general.mdc"),o=function(e,t,n){const i="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",r=ot(e,t,"Cursor",n);return`${i}\n\n${r}`}(e,n,r);await O.run(()=>P.generateFile(s,o))})}function ot(e,t,n,i){const r=e.isBun?"bun":"yarn",s=`\n## Project Information\n\n- Name: \`${e.packageJson?.name||"unknown"}\`\n- Description: ${e.packageJson?.description}\n- Package Manager: ${r}\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. If requested, follow these rules:\n - Continue modifying tests and/or code until all tests pass.\n - Ensure tests are idempotent and independent (e.g., reset persistent data) so they can run repeatedly or in parallel.\n - Prefer actual API calls over mocks, unless actual calls are impractical, have unintended side effects, or mocks are explicitly requested.\n - Always investigate the root cause of a test failure before fixing it.\n - Avoid adding wait functions in E2E tests unless strictly necessary.\n- When fixing issues, follow these rules:\n - Investigate the root cause first (e.g., by gathering debug logs, taking screenshots, etc.).\n - Fix the actual root cause instead of applying workarounds.\n- After making code changes, run \`${r} check-all-for-ai\` to execute all tests (takes up to 1 hour), or \`${r} check-for-ai\` for only type checking and linting (takes up to 10 minutes).\n - If you are confident that your changes will not break any tests, you may use \`check-for-ai\`.\n - Use \`oxlint\` ignore comments with reasons (e.g., \`// oxlint-disable-next-line <rule> -- <reason>\`) if lint errors or warnings cannot be fixed.\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- Always use heredoc syntax when passing multi-line content to any command.\n${o=t,o.some(e=>!!e.hasStartTestServer||e.depending.playwrightTest&&(e.depending.wb||e.isBun))?`- Use \`${r} start-test-server\` to launch a web server for debugging or testing.`:""}\n\n${at(t)}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim();var o;const a=i?.trim().startsWith("#");return s+(i?a?"\n\n"+i.trim():"\n"+i:"")}function at(e){return`\n## Coding Style\n\n- Use camelCase for JavaScript and TypeScript files (or PascalCase for React components).\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- Place calling functions above the functions they call to maintain a clear top-down order.\n - e.g., \`function caller() { callee(); } function callee() { ... }\`\n - Unlike functions, place variable and type declarations ABOVE their usage.\n- Write comments and JSDoc for complex or hard-to-understand code.\n - Explain "why" in comments and "what" in JSDoc.\n - Avoid stating what can be easily 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 a pre-computable array literal of strings.\n- Assume that all environment variables are properly defined.\n - If validation is required, use \`assert\` to fail fast (e.g., during startup).\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\n${e.some(e=>e.depending.react||e.depending.next)?"- Prefer lambda over `function` for React components, e.g., `const Button: React.FC = () => {`.\n- 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()}const ct=["@exercode/problem-utils","@willbooster/agent-skills","@willbooster/babel-configs","@willbooster/monaco-loader","@willbooster/monaco-react","@willbooster/oxfmt-config","@willbooster/oxlint-config","@willbooster/prettier-config","@willbooster/renovate-config","@willbooster/shared-lib","@willbooster/shared-lib-blitz-next","@willbooster/shared-lib-next","@willbooster/shared-lib-node","@willbooster/shared-lib-react","@willbooster/wb","agent-runtime-kit","at-decorators","build-ts","gen-i18n-ts","one-way-git-sync","@typescript/native-preview","@typescript/native-preview-darwin-arm64","@typescript/native-preview-darwin-x64","@typescript/native-preview-linux-arm","@typescript/native-preview-linux-arm64","@typescript/native-preview-linux-x64","@typescript/native-preview-win32-arm64","@typescript/native-preview-win32-x64","oxfmt","@oxfmt/binding-android-arm-eabi","@oxfmt/binding-android-arm64","@oxfmt/binding-darwin-arm64","@oxfmt/binding-darwin-x64","@oxfmt/binding-freebsd-x64","@oxfmt/binding-linux-arm-gnueabihf","@oxfmt/binding-linux-arm-musleabihf","@oxfmt/binding-linux-arm64-gnu","@oxfmt/binding-linux-arm64-musl","@oxfmt/binding-linux-ppc64-gnu","@oxfmt/binding-linux-riscv64-gnu","@oxfmt/binding-linux-riscv64-musl","@oxfmt/binding-linux-s390x-gnu","@oxfmt/binding-linux-x64-gnu","@oxfmt/binding-linux-x64-musl","@oxfmt/binding-openharmony-arm64","@oxfmt/binding-win32-arm64-msvc","@oxfmt/binding-win32-ia32-msvc","@oxfmt/binding-win32-x64-msvc","oxlint","@oxlint/binding-android-arm-eabi","@oxlint/binding-android-arm64","@oxlint/binding-darwin-arm64","@oxlint/binding-darwin-x64","@oxlint/binding-freebsd-x64","@oxlint/binding-linux-arm-gnueabihf","@oxlint/binding-linux-arm-musleabihf","@oxlint/binding-linux-arm64-gnu","@oxlint/binding-linux-arm64-musl","@oxlint/binding-linux-ppc64-gnu","@oxlint/binding-linux-riscv64-gnu","@oxlint/binding-linux-riscv64-musl","@oxlint/binding-linux-s390x-gnu","@oxlint/binding-linux-x64-gnu","@oxlint/binding-linux-x64-musl","@oxlint/binding-openharmony-arm64","@oxlint/binding-win32-arm64-msvc","@oxlint/binding-win32-ia32-msvc","@oxlint/binding-win32-x64-msvc","oxlint-tsgolint","@oxlint-tsgolint/darwin-arm64","@oxlint-tsgolint/darwin-x64","@oxlint-tsgolint/linux-arm64","@oxlint-tsgolint/linux-x64","@oxlint-tsgolint/win32-arm64","@oxlint-tsgolint/win32-x64","@next/env","@next/font","@next/rspack-binding-linux-arm64-gnu","@next/rspack-binding-linux-arm64-musl","@next/rspack-binding-linux-x64-gnu","@next/rspack-binding-linux-x64-musl","@next/swc-android-arm-eabi","@next/swc-android-arm64","@next/swc-darwin-arm64","@next/swc-darwin-x64","@next/swc-freebsd-x64","@next/swc-linux-arm-gnueabihf","@next/swc-linux-arm64-gnu","@next/swc-linux-arm64-musl","@next/swc-linux-x64-gnu","@next/swc-linux-x64-musl","@next/swc-wasm-nodejs","@next/swc-wasm-web","@next/third-parties","next","react","react-dom"];async function lt(n){return S.functionIgnoringException("generateBunfigToml",async()=>{const i=t.resolve(n.dirPath,"bunfig.toml"),r=e.existsSync(i)?e.readFileSync(i,"utf8"):void 0,s=pt(r);await O.run(()=>P.generateFile(i,s))})}const pt=e=>{const t=function(e){if(!e)return;try{return d(e)}catch{return}}(e);return`env = false\ntelemetry = false\n\n${function(e){return"boolean"==typeof e?.run?.bun?`[run]\nbun = ${e.run.bun}\n`:""}(t)}\n[install]\nexact = ${!1===t?.install?.exact?"false":"true"}\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n${ct.map(e=>` "${e}",`).join("\n")}\n]\n`};const ut="# Project-specific settings",dt=/# Project-specific settings[^\n]*\n/gm,ft="# Generated by wbfy",mt=`${ut} (head)\n\n\n${ft}\n`,gt=`\n${ut} (tail)\n`,yt={separator:ft,separatorPrefix:"# Generated by ",defaultHeadUserContent:mt,defaultTailUserContent:gt,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const i=ht(n);return i>0&&(n=n.slice(0,i-1)),n.replaceAll(dt,"").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(dt,`${ut} (head)\n`):mt},getTailUserContent(e){const t=ht(e);return t>0?e.slice(t-1):gt},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function ht(e){const t=e.indexOf(ut),n=e.lastIndexOf(ut);return n>t?n:-1}async function bt(n){return S.functionIgnoringException("generateDockerignore",async()=>{const i=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await P.readFileIgnoringError(i)??"",t=yt.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+yt.getTailUserContent(e);await O.run(()=>P.generateFile(i,t))}else await e.promises.rm(i,{force:!0})})}const wt={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(),oxlint:["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"].toSorted(),oxfmt:["astro","cjs","css","cts","gql","graphql","hbs","htm","html","js","json","json5","jsonc","jsx","less","md","mdx","mjs","mts","scss","svelte","toml","ts","tsx","vue","yaml","yml"].toSorted(),prettierOnly:["java"].toSorted()},vt=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${xt(wt.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${xt(wt.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${xt(wt.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function kt(e){return S.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await O.run(()=>P.generateFile(n,vt))})}function xt(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}const jt={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 _t(n,i){return S.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const r=t.resolve(n.dirPath,".gemini"),s=t.resolve(r,"config.yml"),o=t.resolve(r,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let c=structuredClone(jt);try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);c=l.all([c,n,c],{arrayMerge:Me})}catch{}const u=p.dump(c,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),d=await P.readFileIgnoringError(a),f=d?.trimStart().startsWith("#")?void 0:d,m=`${n.isPublicRepo?"Review in English based on the following coding standards.":"以下のコーディング規約を踏まえて、日本語でレビューしてください。"}\n\n${at(i)}${f?`\n${f.trimEnd()}`:""}`,g=[O.run(()=>P.generateFile(s,u)),O.run(()=>P.generateFile(o,m))];await Promise.all(g)})}async function $t(n){return S.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const i=t.resolve(n.dirPath,".gemini"),r=t.resolve(i,"settings.json");await e.promises.rm(r,{force:!0})})}const St=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...wt.codeWith2IndentSize,...wt.codeWith4IndentSize,...wt.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function Pt(e){return S.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await O.run(()=>P.generateFile(n,St))})}const Ot=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Et(e,n){return S.functionIgnoringException("generateGitignore",async()=>{const i=t.resolve(e.dirPath,".gitignore"),r=await P.readFileIgnoringError(i)??"";let s=yt.getHeadUserContent(r)+"\n!.keep\n.aider*\n.env.production\n*/mount/*.hash\n.devcontainer/\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot.*\n.idea/copilot/chatSessions/\n.playwright-cli/\n.serena/\n.tmp/\n.wb/\n__generated__/\n@willbooster/\ndist/\ndrizzle/mount/\ntemp/\ntmp/\n";const o=yt.getTailUserContent(r),a=[...Ot];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),s+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),s+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),s+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(s+=".aws-sam/\npackaged.yaml\n"),(e.doesContainPoetryLock||e.doesContainUvLock)&&(a.push("python"),s+=".venv/\n"),e.depending.blitz&&(s+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(s+="*.sqlite3*\n"),e.depending.playwrightTest&&(s+="playwright-report/\ntest-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),s+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(s+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Bt(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,i=await fetch(n),r=await i.text();if(!i.ok||r.includes("Attention Required!")||r.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=r.trim(),await O.run(()=>At(e,t)),$.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await yt.isBerryZeroInstallEnabled(i)||(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=s+"\n"+c+o;await O.run(()=>P.generateFile(i,l))})}const Ct=t.join(f.homedir(),".cache","wbfy","gitignore");async function At(n,i){await e.promises.mkdir(Ct,{recursive:!0}),await e.promises.writeFile(t.join(Ct,n),i)}async function Bt(n){try{const i=await e.promises.stat(t.join(Ct,n));if(Date.now()-i.mtimeMs>216e5)return;return await e.promises.readFile(t.join(Ct,n),"utf8")}catch{}}function Ft(e){return e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages}function It(e){return e.doesContainJava||e.doesContainJavaInPackages}async function Rt(n){return S.functionIgnoringException("generateIdeaSettings",async()=>{const i=t.resolve(n.dirPath,".idea");if(e.existsSync(i)){const r=t.resolve(i,"watcherTasks.xml");await(Ft(n)||It(n)?O.run(()=>P.generateFile(r,function(e){return`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${Ft(e)?wt.oxfmt.map(e=>Dt("node","node_modules/.bin/oxfmt --write --no-error-on-unmatched-pattern !**/package.json","Oxfmt",e)).join(""):""}\n${It(e)?wt.prettierOnly.map(e=>Dt("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join(""):""}\n </component>\n</project>\n`}(n))):O.run(()=>e.promises.rm(r,{force:!0})))}})}function Dt(e,t,n,i){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="${i}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${i})" />\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`}function Tt(e,t){if(e.depending.genI18nTs&&t?.["gen-i18n-ts"])return(e.isBun?"bun":"yarn")+" run gen-i18n-ts > /dev/null"}function Wt(e,t,n,i=0){Nt(e,t,n,i)}function Nt(e,t,n,i=0){do{const[r,s,o]=Jt(e,t,n),a=m.spawnSync(r,s,o).status??1;if(0===a)break;if(i<=0)return a}while(--i>=0);return 0}function Lt(e,t,n){const[i,r,s]=Jt(e,t,n);s.stdio="pipe";const o=m.spawnSync(i,r,s),a=o.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();o.error?console.error(`${i} [${r.map(e=>`"${e}"`).join(", ")}] failed with: ${o.error.message}`):c&&console.error(`${i} [${r.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 Jt(e,t,n){const i={...process.env};return i.PATH&&i.BERRY_BIN_FOLDER&&(i.PATH=i.PATH.split(":").filter(e=>e!==i.BERRY_BIN_FOLDER).join(":")),[e,t,{cwd:n,env:i,encoding:"utf8",shell:!1,stdio:"inherit"}]}const Ut=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},Mt=new Map;function Gt(e){const t=e??"",n=Mt.get(t);if(n)return n;const i=new g({auth:zt(e)||void 0});return Mt.set(t,i),i}function qt(e){return!!zt(e)}function zt(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER||Yt():"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||Yt():process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN||Yt()}let Ht;function Yt(){if(void 0!==Ht)return Ht||void 0;try{Ht=m.execFileSync("gh",["auth","token"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||""}catch{Ht=""}return Ht||void 0}const Kt=["@tsconfig/bun","@tsconfig/node-lts","@tsconfig/node-ts","@tsconfig/react-native"];function Vt(e){return e.isWillBoosterConfigs&&!e.isRoot&&!0!==e.packageJson?.private&&Array.isArray(e.packageJson?.files)&&e.packageJson.files.length>0}const Xt=["@willbooster/oxfmt-config","@willbooster/oxlint-config","oxfmt","oxlint","oxlint-tsgolint"],Zt="@typescript/native-preview",Qt="typescript",en="@willbooster/wb",tn="build-ts",nn=["@willbooster/prettier-config",en,...Xt.filter(e=>e.startsWith("@willbooster/"))],rn=["@biomejs/biome","@eslint-react/eslint-plugin","@eslint/js","@next/eslint-plugin-next","@types/eslint","@types/micromatch","@typescript-eslint/eslint-plugin","@typescript-eslint/parser","@willbooster/biome-config","@willbooster/eslint-config","@willbooster/eslint-config-blitz-next","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-react","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","biome","eslint","eslint-config-flat-gitignore","eslint-config-next","eslint-config-prettier","eslint-import-resolver-node","eslint-import-resolver-typescript","eslint-plugin-import","eslint-plugin-import-x","eslint-plugin-perfectionist","eslint-plugin-prettier","eslint-plugin-react","eslint-plugin-react-compiler","eslint-plugin-react-hooks","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-storybook","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals","micromatch","typescript-eslint"],sn=new Set(["micromatch","@types/micromatch"]),on=/\bfrom\s+['"]micromatch['"]|\brequire\(\s*['"]micromatch['"]\s*\)|\bimport\(\s*['"]micromatch['"]\s*\)/u,an=new Map,cn=["dependencies","devDependencies","optionalDependencies","peerDependencies"];async function ln(n,r,s){return S.functionIgnoringException("generatePackageJson",async()=>{await async function(n,r,s){const a=t.resolve(n.dirPath,"package.json"),c=await async function(t){const n=await e.promises.readFile(t,"utf8"),i=JSON.parse(n);return i.scripts=i.scripts??{},i.dependencies=i.dependencies??{},i.devDependencies=i.devDependencies??{},i.peerDependencies=i.peerDependencies??{},i}(a),p=n.isBun?"bun":"yarn";await async function(n,i){"WillBooster LLC"===i.author&&(i.author="WillBooster Inc.");(function(e,n){const i=n.name||t.basename(e.dirPath);for(const e of hn(n))Reflect.deleteProperty(e,i)})(n,i),function(e,t){if(!e.isWillBoosterConfigs)return;for(const e of hn(t))for(const[t,n]of Object.entries(e))n&&xn(n)&&(e[t]=bn(t))}(n,i),delete i.scripts["sort-package-json"],delete i.scripts["sort-all-package-json"],delete i.scripts["typecheck/warn"],delete i.scripts["typecheck:gen-code"],delete i.scripts["typecheck:codegen"],delete i.dependencies.tslib,delete i.devDependencies["@willbooster/renovate-config"],delete i.devDependencies["@willbooster/tsconfig"],n.depending.next||delete i.devDependencies[Qt];delete i.devDependencies.lerna,delete i.devDependencies.pinst,delete i.scripts["flutter-format"],delete i.scripts["format-flutter"],delete i.scripts["python-format"],delete i.scripts["format-python"],delete i.scripts.prettier,delete i.scripts["check-all"],delete i.scripts["verify-code"],delete i.scripts["verify-code-with-tests"],await O.run(()=>e.promises.rm(t.resolve(n.dirPath,"lerna.json"),{force:!0})),function(e,t){if(!e.isWillBoosterConfigs)return;const n=hn(t);for(const e of nn)for(const t of n)Reflect.deleteProperty(t,e)}(n,i),function(n,i){const r=function(n){return n.isWillBoosterConfigs&&!n.isRoot||function(n){const i=o.globSync("src/**/*.{js,jsx,mjs,cjs,ts,tsx,mts,cts}",{cwd:n,dot:!0,ignore:U});return i.some(i=>{try{return on.test(e.readFileSync(t.resolve(n,i),"utf8"))}catch{return!1}})}(n.dirPath)}(i);for(const e of rn)r&&sn.has(e)||vn(n,i,e)||(delete n.dependencies[e],delete n.devDependencies[e],delete n.peerDependencies[e])}(i,n)}(n,c),await async function(n,i,r){(function(e){for(const[t,n]of Object.entries(e))"string"==typeof n&&(n.includes("git clone")||(e[t]=n.replaceAll(/yarn\s*(?:install\s*)?&&\s*/gu,"")))})(i.scripts),i.scripts={...i.scripts,...$n(n,i.scripts)},function(e,t){if(!e.depending.playwrightTest||!e.depending.wb&&!e.isBun||t.scripts?.["start-test-server"])return;t.scripts??={};const n=function(e,t){return t.find(t=>Pn(e,t)&&!On(e,t))}(e,["start-test-server","start"]);t.scripts["start-test-server"]=n?`mise run ${n}`:"wb start --mode test"}(n,i),function(e,t){if(!("check-for-ai"in e))return;"gen-code"in e&&(e["check-for-ai"]=`${t} gen-code > /dev/null && ${e["check-for-ai"]}`);e["check-for-ai"]=`${t} install > /dev/null && ${e["check-for-ai"]}`}(i.scripts,r);const s=i.scripts;n.isBun||!It(n)?delete s.prettify:s.prettify=(s.prettify??"")+await async function(n){const i=t.resolve(n,".prettierignore"),r=await e.promises.readFile(i,"utf8").catch(()=>""),s=r.indexOf(yt.separatorPrefix);if(-1===s)return"";const o=r.slice(0,s);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);!function(e){for(const[t,n]of Object.entries(e))n?.includes("yarn workspaces foreach")&&(e[t]=n.replaceAll(/yarn workspaces foreach(?!\s+(?:-A|-R|--(?:all|recursive|since|worktree|from|include|exclude|public|private)))/gu,"yarn workspaces foreach --all"))}(s)}(n,c,p),function(e){for(const t of[en,tn])e.dependencies[t]&&(e.devDependencies[t]??=e.dependencies[t],delete e.dependencies[t])}(c);const u=await async function(n,r,s){const a=[],c=["sort-package-json"],p=[],u=It(n);!u||e.existsSync(t.join(r.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(s.prettier="@willbooster/prettier-config",c.push("prettier-plugin-java","@willbooster/prettier-config"));u?c.push("prettier"):function(e){delete e.prettier;const t=[e.dependencies,e.devDependencies,e.peerDependencies];for(const e of t)e&&(delete e.prettier,delete e["prettier-plugin-java"],delete e["prettier-plugin-prisma"],delete e["@willbooster/prettier-config"],delete e["@types/prettier"])}(s);if(delete s.devDependencies["lint-staged"],delete s["lint-staged"],n.isRoot){if(delete s.devDependencies.husky,delete s.scripts.postinstall,delete s.scripts.postpublish,delete s.scripts.prepublishOnly,delete s.scripts.prepack,delete s.scripts.postpack,s.scripts.prepare="lefthook install || true",c.push("lefthook"),n.depending.semanticRelease&&(s.devDependencies["semantic-release"]||s.devDependencies["multi-semantic-release"]||s.devDependencies["@qiwi/multi-semantic-release"]||c.push("semantic-release"),s.version="0.0.0-semantically-released"),n.depending.playwrightTest){s.dependencies.artillery||s.devDependencies.artillery||s.dependencies["@playwright/test"]||c.push("@playwright/test"),delete s.dependencies.playwright,delete s.devDependencies.playwright}n.doesContainSubPackageJsons?s.workspaces=Array.isArray(s.workspaces)?l.all([s.workspaces,["packages/*"]],{arrayMerge:Ge}):["packages/*"]:Array.isArray(s.workspaces)&&(s.workspaces=s.workspaces.filter(e=>o.globSync(e,{dot:!0,cwd:n.dirPath,ignore:U}).length>0),0===s.workspaces.length&&delete s.workspaces)}if(n.depending.wb||n.isBun){c.push(en);for(const[e,t]of Object.entries(s.scripts))"string"==typeof t&&(s.scripts[e]=t.replaceAll(/wb\s+db/gu,"wb prisma"))}(s.dependencies[tn]||s.devDependencies[tn]||Object.values(s.scripts).some(e=>e?.includes(tn)))&&c.push(tn);Ft(n)&&c.push(...Xt);const d=Ft(n)?function(e){return e.depending.blitz||e.depending.next?[]:e.isBun?["@tsconfig/bun"]:e.depending.reactNative?["@tsconfig/react-native"]:["@tsconfig/node-lts","@tsconfig/node-ts"]}(n):[];await async function(n,r,s){const a=new Set(s),c=await async function(n){const r=new Set,s=await o.glob("**/tsconfig*.json",{cwd:n.dirPath,dot:!0,ignore:U});for(const o of s){const s=t.resolve(n.dirPath,o);try{const t=i.parseConfigFileTextToJson(s,await e.promises.readFile(s,"utf8"));if(t.error)return console.warn(`Preserve managed @tsconfig dependencies because ${s} could not be parsed: ${gn(t.error)}`),new Set(Kt);for(const e of yn(t.config?.extends))for(const t of Kt)(e===t||e.startsWith(`${t}/`))&&r.add(t)}catch(e){return console.warn(`Preserve managed @tsconfig dependencies because ${s} could not be read: ${e instanceof Error?e.message:String(e)}`),new Set(Kt)}}return r}(n);for(const e of Kt)if(!a.has(e)&&!c.has(e))for(const t of hn(r))Reflect.deleteProperty(t,e)}(n,s,d),c.push(...d),(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(c.push(Zt),n.depending.next&&c.push(Qt),n.isBun?c.push("@types/bun"):n.depending.reactNative||c.push("@types/node"),(s.dependencies.jest||s.devDependencies.jest||s.dependencies["@jest/globals"]||s.devDependencies["@jest/globals"]||s.dependencies["ts-jest"]||s.devDependencies["ts-jest"])&&c.push("@types/jest"));if(n.isWillBoosterConfigs)return{dependencies:a.filter(e=>!e.includes("@willbooster/")),devDependencies:c.filter(e=>!e.includes("@willbooster/")),pythonDevDependencies:p};return{dependencies:a,devDependencies:c,pythonDevDependencies:p}}(n,r,c);await async function(n,i,r,s){r.name||(r.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(r.private=!0);r.license||(r.license="UNLICENSED");!r.private&&"UNLICENSED"!==r.license&&i.isPublicRepo&&(r.publishConfig??={},r.publishConfig.access??="public");const[a]=Ut.getOrgAndName(n.repository??"");"WillBooster"!==a&&"WillBoosterLab"!==a||(r.author="WillBooster Inc.");await async function(n,i){if(!Vt(n))return;const r=t.resolve(n.dirPath,"config.mjs");if(!e.existsSync(r))return;i.type="module";const s=t.resolve(n.dirPath,"config.d.ts");if(!e.existsSync(s))return;i.files=[...new Set([...i.files??[],"config.d.mts"])],await O.run(()=>P.generateFile(t.resolve(n.dirPath,"config.d.mts"),un))}(n,r),n.isRoot||!r.private||r.main||(r.main="./src");if(delete r.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)r.scripts["lint-fix"]=r.scripts["lint-fix"]??"yarn lint --fix";else{delete r.scripts.lint,delete r.scripts["lint-fix"];for(const e of["cleanup","check-for-ai"]){const t=r.scripts[e];t&&(r.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){r.scripts.lint="flutter analyze",r.scripts["lint-fix"]="yarn lint";const i=["lib","test","test_driver"].filter(i=>e.existsSync(t.resolve(n.dirPath,i)));i.length>0&&(r.scripts["format-code"]=`dart format $(find ${i.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,r.scripts.format=pn(r.scripts.format,n))}const i=dn(n);if(i){"poetry install"===r.scripts.postinstall&&delete r.scripts.postinstall,r.scripts["common/ci-setup"]=`yarn setup-${i}`,delete r.scripts["setup-"+("poetry"===i?"uv":"poetry")],delete r.scripts["setup-poetry-asdf"],r.scripts[`setup-${i}`]="uv"===i?"uv sync --frozen":"poetry config virtualenvs.in-project true && poetry env use $(mise current python) && poetry run pip install --upgrade pip && poetry install";const e=await o.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:U}),t=new Set;for(const n of e){const[e,i]=n.split("/");e&&i&&t.add(e)}if(t.size>0){const e=[...t].join(" "),o=`${i} run`;r.scripts["format-code"]=`${o} isort --profile black ${e} && ${o} black ${e}`,r.scripts.lint?r.scripts.lint=`${o} flake8 ${e} && ${r.scripts.lint}`:(r.scripts.lint=`${o} flake8 ${e}`,r.scripts["lint-fix"]="yarn lint"),r.scripts.format=pn(r.scripts.format,n),s.pythonDevDependencies.push("black","isort","flake8")}}}(n.repository||r.repository)&&(r.repository=function(e,t){const n=jn(e);if(n)return _n(n,e,t);const i=jn(t);if(i)return _n(i,t);return e}(n.repository??r.repository,r.repository));n.depending.blitz?r.scripts["gen-code"]?.startsWith("blitz codegen")?r.scripts["gen-code"].includes("blitz prisma generate")||(r.scripts["gen-code"]=r.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):r.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!r.scripts["gen-code"]?.startsWith("prisma generate")&&(r.scripts["gen-code"]="prisma generate");(function(e,t){const n=Tt(e,t.scripts);if(!n)return;const i=t.scripts.postinstall;i?i.includes(n)||(t.scripts.postinstall=`${i} && ${n}`):t.scripts.postinstall=n})(n,r),r.dependencies.prettier||delete r.devDependencies["@types/prettier"]}(n,r,c,u),function(e,t){const n=e.dependencies,i=e.devDependencies;t.dependencies=mn(n,t.dependencies),t.devDependencies=t.devDependencies.filter(e=>!n[e]),t.devDependencies=mn(i,t.devDependencies)}(c,u),await async function(e){const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]),n=[{packageName:"@willbooster/auth",repo:"auth",target:"dependencies"},{packageName:"@discord-bot/shared",repo:"discord-bot",target:"dependencies"},{packageName:"@willbooster/code-analyzer",repo:"code-analyzer",target:"devDependencies"},{packageName:"@willbooster/judge",repo:"judge",target:"dependencies"},{packageName:"@willbooster/llm-proxy",repo:"llm-proxy",target:"dependencies"}];await Promise.all(n.map(async({packageName:n,repo:i,target:r})=>{if(!t.has(n)||function(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}(e,n))return;const s="dependencies"===r?"devDependencies":"dependencies";Reflect.deleteProperty(e[s],n),e[r][n]=await async function(e){const t=await function(e,t){try{const n=Lt("git",["ls-remote",`git@github.com:${e}/${t}.git`,"HEAD"],process.cwd()).split(/\s+/)[0];if(!n)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(n)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}("WillBoosterLab",e);return`git@github.com:WillBoosterLab/${e}.git#${t}`}(i)}))}(c),function(e){for(const t of cn){const n=e[t];n&&0===Object.keys(n).length&&Reflect.deleteProperty(e,t)}}(c),n.isBun&&delete c.packageManager;await P.generateFile(a,function(e){return JSON.stringify(Ne(e),void 0,2)}(c)),s||(function(e,t,n,i){const r=n.dependencies.filter(e=>!t.devDependencies?.[e]);fn(e,i,t.dependencies??{},r,!1);const s=n.devDependencies.filter(e=>!t.dependencies?.[e]);fn(e,i,t.devDependencies??{},s,!0);const o=dn(e);if(o&&n.pythonDevDependencies.length>0){const t=[...new Set(n.pythonDevDependencies)];"poetry"===o?Wt("poetry",["add","--group","dev",...t],e.dirPath):Wt("uv",["add","--dev",...t],e.dirPath)}}(n,c,u,p),function(e,n,i){const r=t.relative(e.dirPath,i);if(!r)return;Wt("bun"===n?"bunx":n,["sort-package-json",r],e.dirPath)}(n,p,a))}(n,r,s)})}function pn(e,t){const n=t.isBun?"bun run":"yarn";return e?`${e} && ${n} format-code`:`${n} format-code`}const un="export { default } from './config.js';\n";function dn(e){return e.doesContainUvLock?"uv":e.doesContainPoetryLock?"poetry":void 0}function fn(e,t,n,i,r){if(0===i.length)return;const s=[...new Set(i.map(e=>function(e,t,n){if("yarn"===n&&t&&!xn(t))return`${e}@${t}`;return wn(e)}(e,n[e],t)))];Wt(t,["add",...r?["-D"]:[],...e.isBun?["--exact"]:[],...s],e.dirPath)}function mn(e,t){const n=[];for(const i of new Set(t)){const t=kn(i,e[i]);t&&n.push(i),e[i]&&!t&&"*"!==e[i]||(e[i]=bn(i))}return n}function gn(e){return i.flattenDiagnosticMessageText(e.messageText,"\n")}function yn(e){return"string"==typeof e?[e]:Array.isArray(e)?e.filter(e=>"string"==typeof e):[]}function hn(e){return cn.map(t=>e[t]).filter(e=>!!e)}function bn(e){const t=an.get(e);if(t)return t;const n=function(e){return Lt("npm",["show",wn(e),"version","--workspaces=false"],process.cwd())||"*"}(e);return an.set(e,n),n}function wn(e){return e===Zt?`${e}@beta`:e}function vn(e,t,n){return!!Vt(t)&&(!!e.peerDependencies[n]||"@types/eslint"===n&&!!e.peerDependencies.eslint)}function kn(e,t){return!t||("*"===t||(!!xn(t)||("@willbooster/wb"===e||e===tn||Xt.includes(e)||e===Zt)))}function xn(e){return e.startsWith("workspace:")}function jn(e){if("string"==typeof e){if(!e.startsWith("github:"))return;const[t,n]=Ut.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[,i,r]=n;return`git+https://github.com/${i}/${r}.git`}function _n(e,t,n){return{..."object"==typeof t?t:"object"==typeof n?n:void 0,type:"git",url:e}}function $n(e,t){if(e.isBun){const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,i={"check-all-for-ai":"bun run check-for-ai && bun run test","check-for-ai":"bun run cleanup",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",verify:"bun --bun wb verify","verify-full":"bun --bun wb verify --full"};return Sn(e,i,t,["build","dev","start","test","typecheck"]),n?e.depending.pyright&&(i.typecheck+=" && pyright"):delete i.typecheck,i}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,i=Ft(e),r=It(e),s=t.test;let o={"check-all-for-ai":"yarn check-for-ai && yarn test","check-for-ai":"yarn format > /dev/null 2> /dev/null || true && yarn lint-fix --quiet",cleanup:"yarn format && yarn lint-fix",format:Cn(i,r),lint:"oxlint --no-error-on-unmatched-pattern .","lint-fix":"yarn lint --fix","format-code":"oxfmt --write --no-error-on-unmatched-pattern . '!**/package.json'",typecheck:"tsgo --noEmit"};return r&&(o.prettify=`prettier --cache --color --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${wt.prettierOnly.join(",")}}" "!**/test{-,/}fixtures/**"`),e.doesContainSubPackageJsons?(o=l({...o},{format:`${o.format} && 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",test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}),r&&(o.prettify=`prettier --cache --color --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${wt.prettierOnly.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`)):e.depending.pyright&&(o.typecheck=o.typecheck?`${o.typecheck} && `:"",o.typecheck+="pyright"),s?.includes("wb test")&&(o.test=s),i||(delete o["format-code"],delete o.lint,delete o["lint-fix"]),n?e.depending.wb&&(o.typecheck="wb typecheck"):delete o.typecheck,e.depending.wb&&(o.verify="wb verify",o["verify-full"]="wb verify --full"),Sn(e,o,t,["build","dev","start","test","typecheck"]),o}}function Sn(e,t,n,i){for(const r of i)Pn(e,r)&&(On(e,r)||(!n[r]||En(n[r],r)||r in t)&&(t[r]=`mise run ${r}`))}function Pn(e,t){return Object.hasOwn(e.miseTasks,t)}function On(e,t){const n=e.miseTasks[t];if(!n)return!1;return["bun","yarn","npm","pnpm"].some(e=>{return new RegExp(String.raw`\b${e}\s+(?:run\s+)?${i=t,i.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}(?![a-zA-Z0-9_\-:.])`,"u").test(n);var i})}function En(e,t){return e===`mise run ${t}`}function Cn(e,t){const n=["sort-package-json"];return e&&n.push("yarn format-code"),t&&n.push("yarn prettify"),n.join(" && ")}const An={glob_matcher:"doublestar","post-merge":{jobs:[{name:"prepare",script:"prepare.sh",runner:"bash"}]},"pre-push":{jobs:[{name:"check",script:"check.sh",runner:"bash"}]}},Bn={jobs:[{name:"cleanup",glob:"",run:"",stage_fixed:!0},{name:"check-migrations",glob:"**/migration.sql",run:'\nfailed=0\n# Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.\nfor file in {staged_files}; do\n if grep -q \'Warnings:\' "$file"; then\n echo "Migration SQL file ($file) contains warnings! Please solve the warnings and commit again."\n failed=1\n fi\ndone\nexit "$failed"\n'.trim()}]},Fn='\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 In(n){return S.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const i=t.resolve(n.dirPath,".lefthook"),r=t.resolve(n.dirPath,".husky"),s=e.existsSync(r),{lint:o}=$n(n,{}),a={...An,"pre-commit":{jobs:Rn(n)}};o||delete a["pre-push"];await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),p.dump(a,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(i,{force:!0,recursive:!0})]),s&&(await Promise.all([e.promises.rm(r,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})]),Wt("git",["config","--unset","core.hooksPath"],n.dirPath));if(o){const r=function(e){let t;t=e.isBun?"bun --bun wb lint":e.depending.wb?"yarn wb lint":"yarn run lint";const n=`${t} --quiet`;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${n}\n`.trim();return n}(n);e.mkdirSync(t.join(i,"pre-push"),{recursive:!0}),await e.promises.writeFile(t.join(i,"pre-push","check.sh"),r+"\n",{mode:493})}const c=`${Fn}\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",i=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";t.push(String.raw`run_if_changed "package\.json" "${n}${i}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`);e.doesContainUvLock&&t.push(String.raw`run_if_changed "uv\.lock" "uv sync --frozen"`);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"`);const r=Tt(e,e.packageJson?.scripts);r&&t.push(String.raw`run_if_changed "(^|/)i18n/.*\.json$" "${r}"`);return t}(n).join("\n")}\n`;e.mkdirSync(t.join(i,"post-merge"),{recursive:!0}),await e.promises.writeFile(t.resolve(i,"post-merge","prepare.sh"),c,{mode:493})}(n)})}function Rn(e){return Bn.jobs.map(t=>"cleanup"===t.name?{...t,glob:Dn(e),run:Tn(e)}:t)}function Dn(e){const t=e.isBun||e.depending.wb||It(e)?[...wt.prettierOnly]:[];Ft(e)&&t.push(...wt.oxfmt,...wt.oxlint),(e.doesContainPoetryLock||e.doesContainUvLock)&&t.push("py"),e.doesContainPubspecYaml&&t.push("dart");return`**/*.{${[...new Set(t)].toSorted().join(",")}}`}function Tn(n){if(function(n){if(!n.isRoot)return!1;const i=t.resolve(n.dirPath,"packages","wb","package.json");if(!e.existsSync(i))return!1;try{return"@willbooster/wb"===JSON.parse(e.readFileSync(i,"utf8")).name}catch{return!1}}(n))return String.raw`
|
|
1
|
+
import e from"node:fs";import t from"node:path";import n from"yargs";import r from"typescript";import{PromisePool as i}from"minimal-promise-pool";import s from"node:fs/promises";import o from"fast-glob";import a from"semver/functions/compare.js";import c from"semver/ranges/min-version.js";import l from"deepmerge";import p from"js-yaml";import u,{parse as d}from"smol-toml";import f from"node:os";import m from"node:child_process";import{Octokit as g}from"@octokit/core";import y from"semver";import{createRequire as h}from"node:module";import w from"dotenv";import{distance as b}from"fastest-levenshtein";import{simpleGit as v}from"simple-git";import{z as k}from"zod";async function x(e){return new Promise(t=>setTimeout(t,e))}async function j(e){try{return await e()}catch{}}async function $(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}const _=new class{isVerbose=!1;doesUploadEnvVars=!1};const S=new class{async functionIgnoringException(e,t){_.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}_.isVerbose&&console.info(`---------- ${e} end ----------`)}},P={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,r){await e.promises.mkdir(t.dirname(n),{recursive:!0});let i=r.trim();i&&(i+="\n"),await e.promises.writeFile(n,i)}},O=new i;async function E(n){return S.functionIgnoringException("fixNextConfigJson",async()=>{const i=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!i)return;const s=await e.promises.readFile(i,"utf8"),o=function(e){const t=r.createSourceFile("next.config.js",e,r.ScriptTarget.Latest,!0,r.ScriptKind.JS);let n;const i=e=>{n||(r.isExportAssignment(e)&&r.isObjectLiteralExpression(e.expression)?n=e.expression:r.isBinaryExpression(e)&&e.operatorToken.kind===r.SyntaxKind.EqualsToken&&"module.exports"===e.left.getText(t)&&r.isObjectLiteralExpression(e.right)?n=e.right:r.forEachChild(e,i))};return i(t),n}(s);if(!o)return;const a=[];if(new Set(o.properties.map(e=>e.name?.getText())).has("typescript")||a.push("typescript: { ignoreBuildErrors: true }"),0===a.length)return;const c=o.getEnd()-1,l=o.properties.at(-1),p=!!l&&s.slice(l.getEnd(),c).includes(","),u=o.properties.length>0&&!p?", ":"",d=`${s.slice(0,c)}${u}${a.join(", ")}${s.slice(c)}`;await O.run(()=>P.generateFile(i,d))})}const C=e=>({kind:"literal",value:e}),A=(e,t=[])=>({kind:"object",value:B(e,t)}),F=B({forbidOnly:C("!!process.env.CI"),retries:C("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:A({baseURL:C("process.env.NEXT_PUBLIC_BASE_URL"),trace:C("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:C("process.env.CI ? 'only-on-failure' : 'on'"),video:C("process.env.CI ? 'on-first-retry' : 'retain-on-failure'")}),webServer:A({command:C("'wb start --mode test'"),url:C("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:C("!!process.env.CI"),timeout:C("300_000"),stdout:C("'pipe'"),stderr:C("'pipe'"),env:C("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:C("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})});function B(e,t=[]){return{extraMembers:t,memberOrder:[...Object.keys(e).map(e=>({kind:"property",key:e})),...t.map((e,t)=>({kind:"extra",index:t}))],properties:e}}async function I(n){const i=t.resolve(n.dirPath,"playwright.config.ts");if(e.existsSync(i))return S.functionIgnoringException("fixPlaywrightConfig",async()=>{await async function(n){for(const r of function(n){const r=[".env",".env.test",".env.example","mise.toml","mise.test.toml"],i=[];for(let s=t.resolve(n);i.push(...r.map(e=>t.resolve(s,e))),!e.existsSync(t.resolve(s,".git"));s=t.dirname(s)){if(t.dirname(s)===s)break}return i}(n))try{const t=await e.promises.readFile(r,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(t))return}catch{}throw new Error("NEXT_PUBLIC_BASE_URL is required for Playwright. Define NEXT_PUBLIC_BASE_URL in the target repo.")}(n.dirPath);const s=await e.promises.readFile(i,"utf8"),o=function(e){const t=r.createSourceFile("playwright.config.ts",e,r.ScriptTarget.Latest,!0,r.ScriptKind.TS);let n;const i=e=>{if(!n){if(r.isCallExpression(e)&&"defineConfig"===e.expression.getText(t)){const t=e.arguments[0];if(t&&r.isObjectLiteralExpression(t))return void(n=t)}r.forEachChild(e,i)}};return i(t),n?{source:t,node:n}:void 0}(s);if(!o)return;const a=W(o.node,o.source);if(!a)return;const c=R(F,a);!function(e){const t=e.properties.webServer;if("object"!==t?.kind)return;t.value.properties.command=C("'wb start --mode test'")}(c);const l=L({kind:"object",value:c},0),p=o.node.getStart(o.source),u=o.node.getEnd(),d=`${s.slice(0,p)}${l}${s.slice(u)}`;await O.run(()=>P.generateFile(i,d))})}function R(e,t){const n=new Set(Object.keys(t.properties)),r=[...e.extraMembers,...t.extraMembers],i=[...e.memberOrder.filter(e=>"property"!==e.kind||!n.has(e.key)),...t.memberOrder.map(t=>"property"===t.kind?t:{kind:"extra",index:e.extraMembers.length+t.index})],s={...e.properties};for(const[e,n]of Object.entries(t.properties))s[e]=D(s[e],n);return{extraMembers:r,memberOrder:i,properties:s}}function D(e,t){return"object"===e?.kind&&"object"===t.kind?{kind:"object",value:R(e.value,t.value)}:t}function T(e,t){if(r.isObjectLiteralExpression(e)){const n=W(e,t);return n?{kind:"object",value:n}:C(e.getText(t))}if(r.isArrayLiteralExpression(e)){const n=e.elements.map(e=>T(e,t));return n.some(e=>void 0===e)?C(e.getText(t)):{kind:"array",value:n}}return C(e.getText(t))}function W(e,t){const n={extraMembers:[],memberOrder:[],properties:{}};for(const i of e.properties){if(r.isShorthandPropertyAssignment(i)){const e=i.name.getText(t);n.properties[e]=C(e),n.memberOrder.push({kind:"property",key:e});continue}if(!r.isPropertyAssignment(i)||!r.isIdentifier(i.name)&&!r.isStringLiteral(i.name)){const e=n.extraMembers.push(i.getText(t))-1;n.memberOrder.push({kind:"extra",index:e});continue}const e=T(i.initializer,t);if(void 0===e)return;const s=i.name.getText(t);n.properties[s]=e,n.memberOrder.push({kind:"property",key:s})}return n}function L(e,t){const n=" ".repeat(t);if("array"===e.kind){if(0===e.value.length)return"[]";const r=" ".repeat(t+1);return`[\n${e.value.map(e=>{const n=L(e,t+1).split("\n");if(n[n.length-1]=`${n.at(-1)},`,"literal"===e.kind)for(let e=1;e<n.length;e+=1)n[e]=`${r}${n[e]}`;return n[0]=`${r}${n[0]}`,n.join("\n")}).join("\n")}\n${n}]`}if("literal"===e.kind)return e.value;const r=" ".repeat(t+1),i=new Set,s=function(e){const t=new Map;for(const[n,r]of e.entries())"property"===r.kind&&t.set(r.key,n);return t}(e.value.memberOrder),o=e.value.memberOrder.flatMap((n,o)=>{if("extra"===n.kind)return[J(e.value.extraMembers[n.index]??"",r)];if(s.get(n.key)!==o)return[];const a=e.value.properties[n.key];return!a||i.has(n.key)?[]:(i.add(n.key),[N(n.key,a,t,r)])});return o.push(...Object.entries(e.value.properties).filter(([e])=>!i.has(e)).map(([e,n])=>N(e,n,t,r))),0===o.length?`{\n${n}}`:`{\n${o.join("\n")}\n${n}}`}function N(e,t,n,r){const i=L(t,n+1).split("\n");if(i[i.length-1]=`${i.at(-1)},`,"literal"===t.kind)for(let e=1;e<i.length;e+=1)i[e]=`${r}${i[e]}`;return i[0]=`${r}${e}: ${i[0]}`,i.join("\n")}function J(e,t){const n=e.split("\n");n[n.length-1]=`${n.at(-1)},`;for(const[e,r]of n.entries())n[e]=`${t}${r}`;return n.join("\n")}const U=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function M(e){return S.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=function(e){if(!e.depending.prisma)return!1;const t={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};return!t["@prisma/adapter-better-sqlite3"]&&!t["@prisma/adapter-libsql"]}(e),r=await o.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:U});for(const i of r){const r=t.resolve(e.dirPath,i),o=await s.readFile(r,"utf8"),a=o.replaceAll(/DATABASE_URL\s*=\s*"?([^"#\n]+?\.sqlite3[^"#\n]*)"?/g,(e,t)=>`DATABASE_URL="${G(t,n)}"`);a!==o&&await s.writeFile(r,a)}})}function G(e,t){const n=e.indexOf("?"),r=-1!==n?e.slice(0,n):e,i=-1!==n?e.slice(n+1):"",s=new URLSearchParams(i);s.delete("connection_limit"),t&&s.set("connection_limit","1");const o=s.toString();return o?`${r}?${o}`:r}const z=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function q(e,t){let n,r,i;"function"==typeof t?r=t:n=t;const s={},o=[...n??[],...Object.keys(e).sort(r)];for(i of o)z(e,i)&&(s[i]=e[i]);return s}const H=/^(?:( )+|\t+)/,Y="space";function V(e,t,n){return e&&t===Y&&1===n}function K(e,t){const n=new Map;let r,i,s=0;for(const o of e.split(/\n/g)){if(!o)continue;const e=o.match(H);if(null===e)s=0,r="";else{const o=e[0].length,a=e[1]?Y:"tab";if(V(t,a,o))continue;a!==r&&(s=0),r=a;let c=1,l=0;const p=o-s;if(s=o,0===p)c=0,l=1;else{const e=Math.abs(p);if(V(t,a,e))continue;i=X(a,e)}const u=n.get(i);n.set(i,void 0===u?[1,0]:[u[0]+c,u[1]+l])}}return n}function X(e,t){return(e===Y?"s":"t")+String(t)}function Z(e){if("string"!=typeof e)throw new TypeError("Expected a string");let t=K(e,!0);0===t.size&&(t=K(e,!1));const n=function(e){let t,n=0,r=0;for(const[i,[s,o]]of e)(s>n||s===n&&o>r)&&(n=s,r=o,t=i);return t}(t);let r,i=0,s="";var o;return void 0!==n&&(({type:r,amount:i}={type:"s"===(o=n)[0]?Y:"tab",amount:Number(o.slice(1))}),s=function(e,t){return(e===Y?" ":"\t").repeat(t)}(r,i)),{amount:i,type:r,indent:s}}function Q(e){return"string"==typeof e&&function(e){if("string"!=typeof e)throw new TypeError("Expected a string");const t=e.match(/(?:\r?\n)/g)||[];if(0===t.length)return;const n=t.filter(e=>"\r\n"===e).length;return n>t.length-n?"\r\n":"\n"}(e)||"\n"}const ee=e=>(t,...n)=>e.reduce((e,t)=>t(e,...n),t),te=e=>t=>Array.isArray(t)?e(t):t,ne=e=>t=>Array.isArray(t)&&t.every(e=>"string"==typeof e)?e(t):t,re=ne(e=>[...new Set(e)]),ie=ne(e=>e.toSorted()),se=ee([re,ie]),oe=e=>(t,...n)=>function(e){if("object"!=typeof e||null===e)return!1;const t=Object.getPrototypeOf(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)}(t)?e(t,...n):t,ae=(e,t)=>{const n=oe(r=>(t&&(r=Object.fromEntries(Object.entries(r).map(([e,t])=>[e,n(t)]))),q(r,e)));return n},ce=Object.groupBy||((e,t)=>{const n=Object.create(null);for(const r of e){const e=t(r);n[e]?n[e].push(r):n[e]=[r]}return n}),le=ae(),pe=ae(["type","url"]),ue=ae(["name","email","url"]),de=ae(["lib","bin","man","doc","example","test"]),fe=(e,t)=>oe((n,...r)=>Object.hasOwn(n,e)?{...n,[e]:t(n[e],...r)}:n),me=ae(["applypatch-msg","pre-applypatch","post-applypatch","pre-commit","pre-merge-commit","prepare-commit-msg","commit-msg","post-commit","pre-rebase","post-checkout","post-merge","pre-push","pre-receive","update","proc-receive","post-receive","post-update","reference-transaction","push-to-checkout","pre-auto-gc","post-rewrite","sendemail-validate","fsmonitor-watchman","p4-changelist","p4-prepare-changelist","p4-post-changelist","p4-pre-submit","post-index-change"]),ge=e=>{const[t]=e.split(">"),n=[...t.matchAll("@")];if(!n.length||1===n.length&&0===n[0].index)return{name:e};const r=n.pop().index;return{name:t.substring(0,r),range:t.substring(r+1)}},ye=ae((e,t)=>{const{name:n,range:r}=ge(e),{name:i,range:s}=ge(t);return n!==i?n.localeCompare(i,"en"):r?s?a(c(r),c(s)):1:-1}),he=e=>{const t=e.indexOf("@",e.startsWith("@")?1:0);return-1===t?e:e.slice(0,t)},we=new Map;function be(t){return"string"==typeof t.packageManager?t.packageManager.startsWith("npm@"):t.devEngines?.packageManager?.name?"npm"===t.devEngines.packageManager.name:!t.pnpm&&(!!t.engines?.npm||!(()=>{const t=process.cwd();return we.has(t)||we.set(t,e.existsSync("yarn.lock")||e.existsSync(".yarn/")||e.existsSync(".yarnrc.yml")||e.existsSync("pnpm-lock.yaml")||e.existsSync("pnpm-workspace.yaml")),we.get(t)})())}const ve=oe((e,t)=>Object.keys(e).length<2?e:be(t)?q(e,(e,t)=>e.localeCompare(t,"en")):q(e)),ke=ee([ae(["packages","catalog"]),fe("packages",se),fe("catalog",ve)]),xe=ee([ae(["files","excludedFiles","env","parser","parserOptions","settings","plugins","extends","rules","overrides","globals","processor","noInlineConfig","reportUnusedDisableDirectives"]),fe("env",le),fe("globals",le),fe("overrides",te(e=>e.map(xe))),fe("parserOptions",le),fe("rules",ae((e,t)=>e.split("/").length-t.split("/").length||e.localeCompare(t))),fe("settings",le)]),je=ae(["description","url","href"]),$e=ee([oe(e=>q(e,[...Object.keys(e).filter(e=>"overrides"!==e).sort(),"overrides"])),fe("overrides",te(e=>e.map(ee([le,fe("options",le)]))))]),_e=ae(["node","npm","yarn"]),Se=fe("packageManager",ae(["name","version","onFail"])),Pe=ee([ae(["peerDependencyRules","neverBuiltDependencies","onlyBuiltDependencies","onlyBuiltDependenciesFile","allowedDeprecatedVersions","allowNonAppliedPatches","updateConfig","auditConfig","requiredScripts","supportedArchitectures","overrides","patchedDependencies","packageExtensions"],!0),fe("overrides",ye)]),Oe=new Set(["install","pack","prepare","publish","restart","shrinkwrap","start","stop","test","uninstall","version"]),Ee=(e,t)=>Object.hasOwn(t,"devDependencies")&&Object.hasOwn(t.devDependencies,e),Ce=/(?<=^|[\s&;<>|(])(?:run-s|npm-run-all2? .*(?:--sequential|--serial|-s))(?=$|[\s&;<>|)])/,Ae=e=>{if(!Ee("npm-run-all",e)&&!Ee("npm-run-all2",e))return!1;return["scripts","betterScripts"].flatMap(t=>e[t]?Object.values(e[t]):[]).some(e=>{return(t=e).includes("*")&&Ce.test(t);var t})};function Fe(e,t=""){const n=new Map;for(const r of e){const e=(t?r.slice(t.length+1):r).indexOf(":");if(e>0){const i=r.slice(0,(t?t.length+1:0)+e);n.has(i)||n.set(i,[]),n.get(i).push(r)}else n.has(r)||n.set(r,[]),n.get(r).push(r)}return Array.from(n.keys()).sort().flatMap(e=>{const t=n.get(e);if(t.length>1&&t.some(t=>t!==e&&t.startsWith(e+":"))){return[...t.filter(t=>t===e||!t.startsWith(e+":")).sort(),...Fe(t.filter(t=>t.startsWith(e+":")),e)]}return t.sort()})}const Be=oe((e,t)=>{let n=Object.keys(e);const r=new Set;return n=n.map(e=>{const t=e.replace(/^(?:pre|post)/,"");return Oe.has(t)||n.includes(t)?(r.add(t),t):e}),Ae(t)||(n=Fe(n)),n=n.flatMap(e=>r.has(e)?[`pre${e}`,e,`post${e}`]:[e]),q(e,n)}),Ie=e=>{const{defaultConditions:t=[],restConditions:n=[]}=ce(e,e=>"default"===e?"defaultConditions":"restConditions");return[...n,...t]},Re=oe(e=>{const{paths:t=[],conditions:n=[]}=ce(Object.keys(e),e=>e.startsWith(".")?"paths":"conditions");return Object.fromEntries([...t,...Ie(n)].map(t=>[t,Re(e[t])]))}),De=[{key:"$schema"},{key:"name"},{key:"displayName"},{key:"version"},{key:"stableVersion"},{key:"private"},{key:"description"},{key:"categories",over:re},{key:"keywords",over:re},{key:"homepage"},{key:"bugs",over:ae(["url","email"])},{key:"repository",over:pe},{key:"funding",over:pe},{key:"license",over:pe},{key:"qna"},{key:"author",over:ue},{key:"maintainers",over:te(e=>e.map(ue))},{key:"contributors",over:te(e=>e.map(ue))},{key:"publisher"},{key:"sideEffects"},{key:"type"},{key:"imports"},{key:"exports",over:Re},{key:"main"},{key:"svelte"},{key:"umd:main"},{key:"jsdelivr"},{key:"unpkg"},{key:"module"},{key:"source"},{key:"jsnext:main"},{key:"browser"},{key:"react-native"},{key:"types"},{key:"typesVersions"},{key:"typings"},{key:"style"},{key:"example"},{key:"examplestyle"},{key:"assets"},{key:"bin",over:le},{key:"man"},{key:"directories",over:de},{key:"files",over:re},{key:"workspaces",over:ke},{key:"binary",over:ae(["module_name","module_path","remote_path","package_name","host"])},{key:"scripts",over:Be},{key:"betterScripts",over:Be},{key:"l10n"},{key:"contributes",over:le},{key:"activationEvents",over:re},{key:"husky",over:fe("hooks",me)},{key:"simple-git-hooks",over:me},{key:"pre-commit"},{key:"commitlint",over:le},{key:"lint-staged"},{key:"nano-staged"},{key:"config",over:le},{key:"nodemonConfig",over:le},{key:"browserify",over:le},{key:"babel",over:le},{key:"browserslist"},{key:"xo",over:le},{key:"prettier",over:$e},{key:"eslintConfig",over:xe},{key:"eslintIgnore"},{key:"npmpkgjsonlint",over:le},{key:"npmPackageJsonLintConfig",over:le},{key:"npmpackagejsonlint",over:le},{key:"release",over:le},{key:"remarkConfig",over:le},{key:"stylelint"},{key:"ava",over:le},{key:"jest",over:le},{key:"jest-junit",over:le},{key:"jest-stare",over:le},{key:"mocha",over:le},{key:"nyc",over:le},{key:"c8",over:le},{key:"tap",over:le},{key:"oclif",over:ae(void 0,!0)},{key:"resolutions",over:le},{key:"overrides",over:ve},{key:"dependencies",over:ve},{key:"devDependencies",over:ve},{key:"dependenciesMeta",over:ae((e,t)=>{const n=he(e),r=he(t);return n<r?-1:n>r?1:0},!0)},{key:"peerDependencies",over:ve},{key:"peerDependenciesMeta",over:ae(void 0,!0)},{key:"optionalDependencies",over:ve},{key:"bundledDependencies",over:se},{key:"bundleDependencies",over:se},{key:"extensionPack",over:se},{key:"extensionDependencies",over:se},{key:"flat"},{key:"packageManager"},{key:"engines",over:le},{key:"engineStrict",over:le},{key:"devEngines",over:Se},{key:"volta",over:_e},{key:"languageName"},{key:"os"},{key:"cpu"},{key:"preferGlobal",over:le},{key:"publishConfig",over:le},{key:"icon"},{key:"badges",over:te(e=>e.map(je))},{key:"galleryBanner",over:le},{key:"preview"},{key:"markdown"},{key:"pnpm",over:Pe}],Te=De.map(({key:e})=>e),We=ee(De.map(({key:e,over:t})=>t?fe(e,t):void 0).filter(Boolean));function Le(e,t={}){return function(e,t){if("string"==typeof e){const{indent:n,type:r}=Z(e),i="\n"===e.slice(-1)?"\n":"",s=Q(e);e=JSON.parse(e);let o=JSON.stringify(t(e),null,"tab"===r?"\t":n)+i;return"\r\n"===s&&(o=o.replace(/\n/g,s)),o}return t(e)}(e,oe(e=>{let n=t.sortOrder||Te;if(Array.isArray(n)){const t=Object.keys(e),{privateKeys:r=[],publicKeys:i=[]}=ce(t,e=>"_"===e[0]?"privateKeys":"publicKeys");n=[...n,...Te,...i.sort(),...r.sort()]}return We(q(e,n),e)}))}async function Ne(n){return S.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const r=t.join(n,"package.json");if(!e.existsSync(r))return;const i=t.join(n,"test");for(const s of["__tests__","tests"]){const o=t.join(n,s);try{await Je(o,i);const t=JSON.parse(await e.promises.readFile(r,"utf8"));let n=!1;const a=t.scripts??{};for(const[e,t]of Object.entries(a)){const r=t.replaceAll(s,"test");t!==r&&(a[e]=r,n=!0)}if(t.scripts=a,!n)return;await P.generateFile(r,JSON.stringify(Le(t),void 0,2))}catch{}}}))})}async function Je(n,r){if(!e.existsSync(r))return void await e.promises.rename(n,r);const i=await e.promises.readdir(n,{withFileTypes:!0});await Promise.all(i.map(async i=>{const s=t.join(n,i.name),o=t.join(r,i.name),a=e.existsSync(o)?await e.promises.stat(o):void 0;i.isDirectory()&&a?.isDirectory()?await Je(s,o):await e.promises.rename(s,o)})),await e.promises.rm(n,{recursive:!0})}async function Ue(e,n){return S.functionIgnoringException("fixTypeDefinitions",async()=>{const r=t.resolve(e.dirPath,"@types"),i=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),o=await $(()=>s.readdir(r,{withFileTypes:!0}));if(o)for(const e of o){const o=e.name.slice(0,-5),a=e.name.endsWith(".d.ts");let c=a?o:e.name;c.includes("__")&&(c=`@${c.replace("__","/")}`);const l=n.some(e=>e.packageJson?.dependencies?.[c]||e.packageJson?.devDependencies?.[c]);e.isFile()&&a?l?(await s.mkdir(t.join(r,o),{recursive:!0}),await O.run(()=>s.rename(t.join(r,e.name),t.join(r,o,"index.d.ts")))):i&&(await s.mkdir(i,{recursive:!0}),await O.run(()=>s.rename(t.join(r,e.name),t.join(i,e.name)))):e.isDirectory()&&i&&!l&&(await s.mkdir(i,{recursive:!0}),await O.run(()=>$(()=>s.rename(t.join(r,e.name,"index.d.ts"),t.join(i,`${e.name}.d.ts`)))))}})}function Me(e,t){return t}function Ge(e,t,n){const r=[...e];for(const[i,s]of t.entries())void 0===r[i]?r[i]=ze(s,n):qe(e[i],n)&&qe(s,n)?r[i]=l(e[i],s,n):e.includes(s)||r.push(s);return r}function ze(e,t){return qe(e,t)?t.cloneUnlessOtherwiseSpecified(e,t):e}function qe(e,t){return!!e&&"object"==typeof e&&t.isMergeableObject(e)}function He(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,r]of t)delete e[n],e[n]=r,r&&"object"==typeof r&&!Array.isArray(r)&&He(r);return e}const Ye={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"}}},Ve={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"}}},Ke={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"}}}};async function Xe(n){return S.functionIgnoringException("generateWorkflow",async()=>{if(Ze(n.repository))return;const r=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(r,{recursive:!0});const i=t.resolve(n.dirPath,".github","semantic.yml");await O.run(()=>e.promises.rm(i,{force:!0,recursive:!0}));const s=await e.promises.readdir(r,{withFileTypes:!0});for(const n of s)n.isFile()&&Qe(n.name)&&await O.run(()=>e.promises.rm(t.join(r,n.name),{force:!0}));const o=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml",...s.filter(e=>e.isFile()&&e.name.endsWith(".yml")&&!Qe(e.name)).map(e=>e.name)]);n.depending.semanticRelease&&o.add("release.yml");for(const e of o){const i=t.basename(e,".yml");await O.run(()=>et(n,r,i))}})}function Ze(e){return e?.endsWith("/reusable-workflows")??!1}function Qe(e){return/^gen-pr(?:-.+)?\.ya?ml$/u.test(e)}async function et(n,r,i){const s=t.join(r,`${i}.yml`),o=e.existsSync(t.join(r,"deploy-production.yml"));if("autofix"===i)return void await nt(function(e){if(!e.isPublicRepo)return structuredClone(Ve);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0,"node-version":"lts/*"}},...e.isBun?[{uses:"oven-sh/setup-bun@v2",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 r=structuredClone(Ye),i=r.jobs.autofix??{"runs-on":"ubuntu-latest"};return r.jobs.autofix={...i,steps:n},r}(n),s);let a=structuredClone(i in Ke?Ke[i]:{});try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);a=l.all([a,n,a],{arrayMerge:Ge})}catch{}if(!("jobs"in a))return;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 c=!1;for(const e of Object.values(a.jobs))e.uses?.includes("/reusable-workflows/")&&(tt(n,e,i),c=!0);if(c){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(r,"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 nt(a,s),"sync"===i){if(await e.promises.rm(t.join(r,"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 nt(a,t.join(r,"sync-force.yml"))}}}function tt(e,t,n){if(t.with??={},t.secrets??={},delete t.secrets.NPM_TOKEN,"test"!==n&&"release"!==n||(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),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?He(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=He(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function nt(t,n){const r=p.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}).replaceAll(/[ \t]+$/gm,"");await e.promises.writeFile(n,r)}async function rt(e){return S.functionIgnoringException("fixTypos",async()=>{if(Ze(e.repository))return;const n=e.dirPath,r=await o.glob("**/*.md",{dot:!0,cwd:n,ignore:U});_.isVerbose&&console.info(`Found ${r.length} markdown files in ${n}`);for(const i of r){const r=t.join(n,i);O.run(async()=>{const t=await P.readFileIgnoringError(r);if(void 0===t)return;let n=it(t);n=st(n,e,"doc"),t!==n&&await P.generateFile(r,n)})}const i=await o.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:n,ignore:U});_.isVerbose&&console.info(`Found ${i.length} TypeScript files in ${n}`);for(const r of i){const i=t.join(n,r);O.run(async()=>{const t=await P.readFileIgnoringError(i);if(void 0===t)return;let n=t.replaceAll(/\/\*[\s\S]*?\*\//g,e=>it(e)).replaceAll(/(^|\s)\/\/(.*?)c\.f\./g,"$1//$2cf.").replaceAll(/(^|\s)\/\/(.*?)eg\./g,"$1//$2e.g.").replaceAll(/(^|\s)\/\/(.*?)ie\./g,"$1//$2i.e.");n=st(n,e,"ts"),t!==n&&await P.generateFile(i,n)})}const s=await o.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:n,ignore:U});_.isVerbose&&console.info(`Found ${s.length} text-based files in ${n}`);for(const r of s){const i=t.join(n,r);O.run(async()=>{const t=await P.readFileIgnoringError(i);if(void 0===t)return;let n=it(t);n=st(n,e,"text"),t!==n&&await P.generateFile(i,n)})}await O.promiseAll()})}function it(e){return e.replaceAll(/\bc\.f\.(?=\s|$)/g,"cf.").replaceAll(/\beg\.(?=\s|$)/g,"e.g.").replaceAll(/\bie\.(?=\s)/g,"i.e.")}function st(e,t,n){for(const[n,r]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,r);for(const[r,i]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(r,i);return e}async function ot(e,n){return S.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const r=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),i=await P.readFileIgnoringError(r);for(const[r,s]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const o=at(e,n,s,i),a=t.resolve(e.dirPath,r);await O.run(()=>P.generateFile(a,o))}const s=t.resolve(e.dirPath,".cursor/rules/general.mdc"),o=function(e,t,n){const r="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",i=at(e,t,"Cursor",n);return`${r}\n\n${i}`}(e,n,i);await O.run(()=>P.generateFile(s,o))})}function at(e,t,n,r){const i=e.isBun?"bun":"yarn",s=`\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. If requested, follow these rules:\n - Continue modifying tests and/or code until all tests pass.\n - Ensure tests are idempotent and independent (e.g., reset persistent data) so they can run repeatedly or in parallel.\n - Prefer actual API calls over mocks, unless actual calls are impractical, have unintended side effects, or mocks are explicitly requested.\n - Always investigate the root cause of a test failure before fixing it.\n - Avoid adding wait functions in E2E tests unless strictly necessary.\n- When fixing issues, follow these rules:\n - Investigate the root cause first (e.g., by gathering debug logs, taking screenshots, etc.).\n - Fix the actual root cause instead of applying workarounds.\n- After making code changes, run \`${i} verify-full\` to execute all tests (takes up to 1 hour), or \`${i} verify\` for only type checking and linting (takes up to 10 minutes).\n - If you are confident that your changes will not break any tests, you may use \`verify\`.\n - Use \`oxlint\` ignore comments with reasons (e.g., \`// oxlint-disable-next-line <rule> -- <reason>\`) if lint errors or warnings cannot be fixed.\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- Always use heredoc syntax when passing multi-line content to any command.\n${o=t,o.some(e=>e.depending.playwrightTest)?"- Use `wb start --mode test` to launch a web server for debugging or testing.":""}\n\n${ct(t)}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim();var o;const a=r?.trim().startsWith("#");return s+(r?a?"\n\n"+r.trim():"\n"+r:"")}function ct(e){return`\n## Coding Style\n\n- Use camelCase for JavaScript and TypeScript files (or PascalCase for React components).\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- Place calling functions above the functions they call to maintain a clear top-down order.\n - e.g., \`function caller() { callee(); } function callee() { ... }\`\n - Unlike functions, place variable and type declarations ABOVE their usage.\n- Write comments and JSDoc for complex or hard-to-understand code.\n - Explain "why" in comments and "what" in JSDoc.\n - Avoid stating what can be easily 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 a pre-computable array literal of strings.\n- Assume that all environment variables are properly defined.\n - If validation is required, use \`assert\` to fail fast (e.g., during startup).\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\n${e.some(e=>e.depending.react||e.depending.next)?"- Prefer lambda over `function` for React components, e.g., `const Button: React.FC = () => {`.\n- 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()}const lt=["@exercode/problem-utils","@willbooster/agent-skills","@willbooster/babel-configs","@willbooster/monaco-loader","@willbooster/monaco-react","@willbooster/oxfmt-config","@willbooster/oxlint-config","@willbooster/prettier-config","@willbooster/renovate-config","@willbooster/shared-lib","@willbooster/shared-lib-blitz-next","@willbooster/shared-lib-next","@willbooster/shared-lib-node","@willbooster/shared-lib-react","@willbooster/wb","agent-runtime-kit","at-decorators","build-ts","gen-i18n-ts","one-way-git-sync","@typescript/native-preview","@typescript/native-preview-darwin-arm64","@typescript/native-preview-darwin-x64","@typescript/native-preview-linux-arm","@typescript/native-preview-linux-arm64","@typescript/native-preview-linux-x64","@typescript/native-preview-win32-arm64","@typescript/native-preview-win32-x64","oxfmt","@oxfmt/binding-android-arm-eabi","@oxfmt/binding-android-arm64","@oxfmt/binding-darwin-arm64","@oxfmt/binding-darwin-x64","@oxfmt/binding-freebsd-x64","@oxfmt/binding-linux-arm-gnueabihf","@oxfmt/binding-linux-arm-musleabihf","@oxfmt/binding-linux-arm64-gnu","@oxfmt/binding-linux-arm64-musl","@oxfmt/binding-linux-ppc64-gnu","@oxfmt/binding-linux-riscv64-gnu","@oxfmt/binding-linux-riscv64-musl","@oxfmt/binding-linux-s390x-gnu","@oxfmt/binding-linux-x64-gnu","@oxfmt/binding-linux-x64-musl","@oxfmt/binding-openharmony-arm64","@oxfmt/binding-win32-arm64-msvc","@oxfmt/binding-win32-ia32-msvc","@oxfmt/binding-win32-x64-msvc","oxlint","@oxlint/binding-android-arm-eabi","@oxlint/binding-android-arm64","@oxlint/binding-darwin-arm64","@oxlint/binding-darwin-x64","@oxlint/binding-freebsd-x64","@oxlint/binding-linux-arm-gnueabihf","@oxlint/binding-linux-arm-musleabihf","@oxlint/binding-linux-arm64-gnu","@oxlint/binding-linux-arm64-musl","@oxlint/binding-linux-ppc64-gnu","@oxlint/binding-linux-riscv64-gnu","@oxlint/binding-linux-riscv64-musl","@oxlint/binding-linux-s390x-gnu","@oxlint/binding-linux-x64-gnu","@oxlint/binding-linux-x64-musl","@oxlint/binding-openharmony-arm64","@oxlint/binding-win32-arm64-msvc","@oxlint/binding-win32-ia32-msvc","@oxlint/binding-win32-x64-msvc","oxlint-tsgolint","@oxlint-tsgolint/darwin-arm64","@oxlint-tsgolint/darwin-x64","@oxlint-tsgolint/linux-arm64","@oxlint-tsgolint/linux-x64","@oxlint-tsgolint/win32-arm64","@oxlint-tsgolint/win32-x64","@next/env","@next/font","@next/rspack-binding-linux-arm64-gnu","@next/rspack-binding-linux-arm64-musl","@next/rspack-binding-linux-x64-gnu","@next/rspack-binding-linux-x64-musl","@next/swc-android-arm-eabi","@next/swc-android-arm64","@next/swc-darwin-arm64","@next/swc-darwin-x64","@next/swc-freebsd-x64","@next/swc-linux-arm-gnueabihf","@next/swc-linux-arm64-gnu","@next/swc-linux-arm64-musl","@next/swc-linux-x64-gnu","@next/swc-linux-x64-musl","@next/swc-wasm-nodejs","@next/swc-wasm-web","@next/third-parties","next","react","react-dom"];async function pt(n){return S.functionIgnoringException("generateBunfigToml",async()=>{const r=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(r)?e.readFileSync(r,"utf8"):void 0,s=ut(i);await O.run(()=>P.generateFile(r,s))})}const ut=e=>{const t=function(e){if(!e)return;try{return d(e)}catch{return}}(e);return`env = false\ntelemetry = false\n\n${function(e){return"boolean"==typeof e?.run?.bun?`[run]\nbun = ${e.run.bun}\n`:""}(t)}\n[install]\nexact = ${!1===t?.install?.exact?"false":"true"}\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n${lt.map(e=>` "${e}",`).join("\n")}\n]\n`};const dt="# Project-specific settings",ft=/# Project-specific settings[^\n]*\n/gm,mt="# Generated by wbfy",gt=`${dt} (head)\n\n\n${mt}\n`,yt=`\n${dt} (tail)\n`,ht={separator:mt,separatorPrefix:"# Generated by ",defaultHeadUserContent:gt,defaultTailUserContent:yt,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const r=wt(n);return r>0&&(n=n.slice(0,r-1)),n.replaceAll(ft,"").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(ft,`${dt} (head)\n`):gt},getTailUserContent(e){const t=wt(e);return t>0?e.slice(t-1):yt},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function wt(e){const t=e.indexOf(dt),n=e.lastIndexOf(dt);return n>t?n:-1}async function bt(n){return S.functionIgnoringException("generateDockerignore",async()=>{const r=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await P.readFileIgnoringError(r)??"",t=ht.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+ht.getTailUserContent(e);await O.run(()=>P.generateFile(r,t))}else await e.promises.rm(r,{force:!0})})}const vt={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(),oxlint:["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"].toSorted(),oxfmt:["astro","cjs","css","cts","gql","graphql","hbs","htm","html","js","json","json5","jsonc","jsx","less","md","mdx","mjs","mts","scss","svelte","toml","ts","tsx","vue","yaml","yml"].toSorted(),prettierOnly:["java"].toSorted()},kt=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${jt(vt.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${jt(vt.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${jt(vt.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function xt(e){return S.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await O.run(()=>P.generateFile(n,kt))})}function jt(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}const $t={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 _t(n,r){return S.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const i=t.resolve(n.dirPath,".gemini"),s=t.resolve(i,"config.yml"),o=t.resolve(i,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let c=structuredClone($t);try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);c=l.all([c,n,c],{arrayMerge:Me})}catch{}const u=p.dump(c,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),d=await P.readFileIgnoringError(a),f=d?.trimStart().startsWith("#")?void 0:d,m=`${n.isPublicRepo?"Review in English based on the following coding standards.":"以下のコーディング規約を踏まえて、日本語でレビューしてください。"}\n\n${ct(r)}${f?`\n${f.trimEnd()}`:""}`,g=[O.run(()=>P.generateFile(s,u)),O.run(()=>P.generateFile(o,m))];await Promise.all(g)})}async function St(n){return S.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const r=t.resolve(n.dirPath,".gemini"),i=t.resolve(r,"settings.json");await e.promises.rm(i,{force:!0})})}const Pt=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...vt.codeWith2IndentSize,...vt.codeWith4IndentSize,...vt.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function Ot(e){return S.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await O.run(()=>P.generateFile(n,Pt))})}const Et=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Ct(e,n){return S.functionIgnoringException("generateGitignore",async()=>{const r=t.resolve(e.dirPath,".gitignore"),i=await P.readFileIgnoringError(r)??"";let s=ht.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.playwright-cli/\n.serena/\n.tmp/\n.wb/\n__generated__/\n@willbooster/\ndist/\ndrizzle/mount/\ntemp/\ntmp/\n";const o=ht.getTailUserContent(i),a=[...Et];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),s+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),s+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),s+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(s+=".aws-sam/\npackaged.yaml\n"),(e.doesContainPoetryLock||e.doesContainUvLock)&&(a.push("python"),s+=".venv/\n"),e.depending.blitz&&(s+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(s+="*.sqlite3*\n"),e.depending.playwrightTest&&(s+="playwright-report/\ntest-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),s+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(s+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Bt(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,r=await fetch(n),i=await r.text();if(!r.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await O.run(()=>Ft(e,t)),_.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await ht.isBerryZeroInstallEnabled(r)||(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=s+"\n"+c+o;await O.run(()=>P.generateFile(r,l))})}const At=t.join(f.homedir(),".cache","wbfy","gitignore");async function Ft(n,r){await e.promises.mkdir(At,{recursive:!0}),await e.promises.writeFile(t.join(At,n),r)}async function Bt(n){try{const r=await e.promises.stat(t.join(At,n));if(Date.now()-r.mtimeMs>216e5)return;return await e.promises.readFile(t.join(At,n),"utf8")}catch{}}function It(e){return e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages}function Rt(e){return e.doesContainJava||e.doesContainJavaInPackages}async function Dt(n){return S.functionIgnoringException("generateIdeaSettings",async()=>{const r=t.resolve(n.dirPath,".idea");if(e.existsSync(r)){const i=t.resolve(r,"watcherTasks.xml");await(It(n)||Rt(n)?O.run(()=>P.generateFile(i,function(e){return`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${It(e)?vt.oxfmt.map(e=>Tt("node","node_modules/.bin/oxfmt --write --no-error-on-unmatched-pattern !**/package.json","Oxfmt",e)).join(""):""}\n${Rt(e)?vt.prettierOnly.map(e=>Tt("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join(""):""}\n </component>\n</project>\n`}(n))):O.run(()=>e.promises.rm(i,{force:!0})))}})}function Tt(e,t,n,r){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="${r}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${r})" />\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`}function Wt(e,t){if(e.depending.genI18nTs&&t?.["gen-i18n-ts"])return(e.isBun?"bun":"yarn")+" run gen-i18n-ts > /dev/null"}function Lt(e,t,n,r=0){Nt(e,t,n,r)}function Nt(e,t,n,r=0){do{const[i,s,o]=Ut(e,t,n),a=m.spawnSync(i,s,o).status??1;if(0===a)break;if(r<=0)return a}while(--r>=0);return 0}function Jt(e,t,n){const[r,i,s]=Ut(e,t,n);s.stdio="pipe";const o=m.spawnSync(r,i,s),a=o.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();o.error?console.error(`${r} [${i.map(e=>`"${e}"`).join(", ")}] failed with: ${o.error.message}`):c&&console.error(`${r} [${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 Ut(e,t,n){const r={...process.env};return r.PATH&&r.BERRY_BIN_FOLDER&&(r.PATH=r.PATH.split(":").filter(e=>e!==r.BERRY_BIN_FOLDER).join(":")),[e,t,{cwd:n,env:r,encoding:"utf8",shell:!1,stdio:"inherit"}]}const Mt=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},Gt=new Map;function zt(e){const t=e??"",n=Gt.get(t);if(n)return n;const r=new g({auth:Ht(e)||void 0});return Gt.set(t,r),r}function qt(e){return!!Ht(e)}function Ht(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER||Vt():"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||Vt():process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN||Vt()}let Yt;function Vt(){if(void 0!==Yt)return Yt||void 0;try{Yt=m.execFileSync("gh",["auth","token"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||""}catch{Yt=""}return Yt||void 0}const Kt=["@tsconfig/bun","@tsconfig/node-lts","@tsconfig/node-ts","@tsconfig/react-native"];function Xt(e){return e.isWillBoosterConfigs&&!e.isRoot&&!0!==e.packageJson?.private&&Array.isArray(e.packageJson?.files)&&e.packageJson.files.length>0}const Zt=["@willbooster/oxfmt-config","@willbooster/oxlint-config","oxfmt","oxlint","oxlint-tsgolint"],Qt="@typescript/native-preview",en="typescript",tn="@willbooster/wb",nn="build-ts",rn=["@willbooster/prettier-config",...Zt.filter(e=>e.startsWith("@willbooster/"))],sn=["@biomejs/biome","@eslint-react/eslint-plugin","@eslint/js","@next/eslint-plugin-next","@types/eslint","@types/micromatch","@typescript-eslint/eslint-plugin","@typescript-eslint/parser","@willbooster/biome-config","@willbooster/eslint-config","@willbooster/eslint-config-blitz-next","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-react","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","biome","eslint","eslint-config-flat-gitignore","eslint-config-next","eslint-config-prettier","eslint-import-resolver-node","eslint-import-resolver-typescript","eslint-plugin-import","eslint-plugin-import-x","eslint-plugin-perfectionist","eslint-plugin-prettier","eslint-plugin-react","eslint-plugin-react-compiler","eslint-plugin-react-hooks","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-storybook","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals","micromatch","typescript-eslint"],on=new Set(["micromatch","@types/micromatch"]),an=/\bfrom\s+['"]micromatch['"]|\brequire\(\s*['"]micromatch['"]\s*\)|\bimport\(\s*['"]micromatch['"]\s*\)/u,cn=new Map,ln=["dependencies","devDependencies","optionalDependencies","peerDependencies"];async function pn(n,i,s){return S.functionIgnoringException("generatePackageJson",async()=>{await async function(n,i,s){const a=t.resolve(n.dirPath,"package.json"),c=await async function(t){const n=await e.promises.readFile(t,"utf8"),r=JSON.parse(n);return r.scripts=r.scripts??{},r.dependencies=r.dependencies??{},r.devDependencies=r.devDependencies??{},r.peerDependencies=r.peerDependencies??{},r}(a),p=n.isBun?"bun":"yarn";await async function(n,r){"WillBooster LLC"===r.author&&(r.author="WillBooster Inc.");(function(e,n){const r=n.name||t.basename(e.dirPath);for(const e of wn(n))Reflect.deleteProperty(e,r)})(n,r),function(e,t){if(!e.isWillBoosterConfigs)return;for(const e of wn(t))for(const[t,n]of Object.entries(e))n&&jn(n)&&(e[t]=bn(t))}(n,r),delete r.scripts["sort-package-json"],delete r.scripts["sort-all-package-json"],delete r.scripts["typecheck/warn"],delete r.scripts["typecheck:gen-code"],delete r.scripts["typecheck:codegen"],delete r.dependencies.tslib,delete r.devDependencies["@willbooster/renovate-config"],delete r.devDependencies["@willbooster/tsconfig"],n.depending.next||delete r.devDependencies[en];delete r.devDependencies.lerna,delete r.devDependencies.pinst,delete r.scripts["flutter-format"],delete r.scripts["format-flutter"],delete r.scripts["python-format"],delete r.scripts["format-python"],delete r.scripts.prettier,delete r.scripts["check-all"],delete r.scripts["verify-code"],delete r.scripts["verify-code-with-tests"],await O.run(()=>e.promises.rm(t.resolve(n.dirPath,"lerna.json"),{force:!0})),function(e,t){if(!e.isWillBoosterConfigs)return;const n=wn(t);for(const e of rn)for(const t of n)Reflect.deleteProperty(t,e)}(n,r),function(n,r){const i=function(n){return n.isWillBoosterConfigs&&!n.isRoot||function(n){const r=o.globSync("src/**/*.{js,jsx,mjs,cjs,ts,tsx,mts,cts}",{cwd:n,dot:!0,ignore:U});return r.some(r=>{try{return an.test(e.readFileSync(t.resolve(n,r),"utf8"))}catch{return!1}})}(n.dirPath)}(r);for(const e of sn)i&&on.has(e)||kn(n,r,e)||(delete n.dependencies[e],delete n.devDependencies[e],delete n.peerDependencies[e])}(r,n)}(n,c),await async function(n,r,i){(function(e){for(const[t,n]of Object.entries(e))"string"==typeof n&&(n.includes("git clone")||(e[t]=n.replaceAll(/yarn\s*(?:install\s*)?&&\s*/gu,"")))})(r.scripts),r.scripts={...r.scripts,...Sn(n,r.scripts)},delete r.scripts["start-test-server"],function(e,t){if(!("check-for-ai"in e))return;"gen-code"in e&&(e["check-for-ai"]=`${t} gen-code > /dev/null && ${e["check-for-ai"]}`);e["check-for-ai"]=`${t} install > /dev/null && ${e["check-for-ai"]}`}(r.scripts,i);const s=r.scripts;n.isBun||!Rt(n)?delete s.prettify:s.prettify=(s.prettify??"")+await async function(n){const r=t.resolve(n,".prettierignore"),i=await e.promises.readFile(r,"utf8").catch(()=>""),s=i.indexOf(ht.separatorPrefix);if(-1===s)return"";const o=i.slice(0,s);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);!function(e){for(const[t,n]of Object.entries(e))n?.includes("yarn workspaces foreach")&&(e[t]=n.replaceAll(/yarn workspaces foreach(?!\s+(?:-A|-R|--(?:all|recursive|since|worktree|from|include|exclude|public|private)))/gu,"yarn workspaces foreach --all"))}(s)}(n,c,p),function(e){for(const t of[tn,nn])e.dependencies[t]&&(e.devDependencies[t]??=e.dependencies[t],delete e.dependencies[t])}(c);const u=await async function(n,i,s){const a=[],c=["sort-package-json"],p=[],u=Rt(n);!u||e.existsSync(t.join(i.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(s.prettier="@willbooster/prettier-config",c.push("prettier-plugin-java","@willbooster/prettier-config"));u?c.push("prettier"):function(e){delete e.prettier;const t=[e.dependencies,e.devDependencies,e.peerDependencies];for(const e of t)e&&(delete e.prettier,delete e["prettier-plugin-java"],delete e["prettier-plugin-prisma"],delete e["@willbooster/prettier-config"],delete e["@types/prettier"])}(s);if(delete s.devDependencies["lint-staged"],delete s["lint-staged"],n.isRoot){if(delete s.devDependencies.husky,delete s.scripts.postinstall,delete s.scripts.postpublish,delete s.scripts.prepublishOnly,delete s.scripts.prepack,delete s.scripts.postpack,s.scripts.prepare="lefthook install || true",c.push("lefthook"),n.depending.semanticRelease&&(s.devDependencies["semantic-release"]||s.devDependencies["multi-semantic-release"]||s.devDependencies["@qiwi/multi-semantic-release"]||c.push("semantic-release"),s.version="0.0.0-semantically-released"),n.depending.playwrightTest){s.dependencies.artillery||s.devDependencies.artillery||s.dependencies["@playwright/test"]||c.push("@playwright/test"),delete s.dependencies.playwright,delete s.devDependencies.playwright}n.doesContainSubPackageJsons?s.workspaces=Array.isArray(s.workspaces)?l.all([s.workspaces,["packages/*"]],{arrayMerge:Ge}):["packages/*"]:Array.isArray(s.workspaces)&&(s.workspaces=s.workspaces.filter(e=>o.globSync(e,{dot:!0,cwd:n.dirPath,ignore:U}).length>0),0===s.workspaces.length&&delete s.workspaces)}Pn(s)||c.push(tn);if(n.depending.wb||n.isBun)for(const[e,t]of Object.entries(s.scripts))"string"==typeof t&&(s.scripts[e]=t.replaceAll(/wb\s+db/gu,"wb prisma"));(s.dependencies[nn]||s.devDependencies[nn]||Object.values(s.scripts).some(e=>e?.includes(nn)))&&c.push(nn);It(n)&&c.push(...Zt);const d=It(n)?function(e){return e.depending.blitz||e.depending.next?[]:e.isBun?["@tsconfig/bun"]:e.depending.reactNative?["@tsconfig/react-native"]:["@tsconfig/node-lts","@tsconfig/node-ts"]}(n):[];await async function(n,i,s){const a=new Set(s),c=await async function(n){const i=new Set,s=await o.glob("**/tsconfig*.json",{cwd:n.dirPath,dot:!0,ignore:U});for(const o of s){const s=t.resolve(n.dirPath,o);try{const t=r.parseConfigFileTextToJson(s,await e.promises.readFile(s,"utf8"));if(t.error)return console.warn(`Preserve managed @tsconfig dependencies because ${s} could not be parsed: ${yn(t.error)}`),new Set(Kt);for(const e of hn(t.config?.extends))for(const t of Kt)(e===t||e.startsWith(`${t}/`))&&i.add(t)}catch(e){return console.warn(`Preserve managed @tsconfig dependencies because ${s} could not be read: ${e instanceof Error?e.message:String(e)}`),new Set(Kt)}}return i}(n);for(const e of Kt)if(!a.has(e)&&!c.has(e))for(const t of wn(i))Reflect.deleteProperty(t,e)}(n,s,d),c.push(...d),(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(c.push(Qt),n.depending.next&&c.push(en),n.isBun?c.push("@types/bun"):n.depending.reactNative||c.push("@types/node"),(s.dependencies.jest||s.devDependencies.jest||s.dependencies["@jest/globals"]||s.devDependencies["@jest/globals"]||s.dependencies["ts-jest"]||s.devDependencies["ts-jest"])&&c.push("@types/jest"));if(n.isWillBoosterConfigs)return{dependencies:a.filter(e=>!e.includes("@willbooster/")),devDependencies:c.filter(e=>!e.includes("@willbooster/")),pythonDevDependencies:p};return{dependencies:a,devDependencies:c,pythonDevDependencies:p}}(n,i,c);await async function(n,r,i,s){i.name||(i.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(i.private=!0);i.license||(i.license="UNLICENSED");!i.private&&"UNLICENSED"!==i.license&&r.isPublicRepo&&(i.publishConfig??={},i.publishConfig.access??="public");const[a]=Mt.getOrgAndName(n.repository??"");"WillBooster"!==a&&"WillBoosterLab"!==a||(i.author="WillBooster Inc.");await async function(n,r){if(!Xt(n))return;const i=t.resolve(n.dirPath,"config.mjs");if(!e.existsSync(i))return;r.type="module";const s=t.resolve(n.dirPath,"config.d.ts");if(!e.existsSync(s))return;r.files=[...new Set([...r.files??[],"config.d.mts"])],await O.run(()=>P.generateFile(t.resolve(n.dirPath,"config.d.mts"),dn))}(n,i),n.isRoot||!i.private||i.main||(i.main="./src");if(delete i.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)i.scripts["lint-fix"]=i.scripts["lint-fix"]??"yarn lint --fix";else{delete i.scripts.lint,delete i.scripts["lint-fix"];for(const e of["cleanup","check-for-ai"]){const t=i.scripts[e];t&&(i.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){i.scripts.lint="flutter analyze",i.scripts["lint-fix"]="yarn lint";const r=["lib","test","test_driver"].filter(r=>e.existsSync(t.resolve(n.dirPath,r)));r.length>0&&(i.scripts["format-code"]=`dart format $(find ${r.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,i.scripts.format=un(i.scripts.format,n))}const r=fn(n);if(r){"poetry install"===i.scripts.postinstall&&delete i.scripts.postinstall,i.scripts["common/ci-setup"]=`yarn setup-${r}`,delete i.scripts["setup-"+("poetry"===r?"uv":"poetry")],delete i.scripts["setup-poetry-asdf"],i.scripts[`setup-${r}`]="uv"===r?"uv sync --frozen":"poetry config virtualenvs.in-project true && poetry env use $(mise current python) && poetry run pip install --upgrade pip && poetry install";const e=await o.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:U}),t=new Set;for(const n of e){const[e,r]=n.split("/");e&&r&&t.add(e)}if(t.size>0){const e=[...t].join(" "),o=`${r} run`;i.scripts["format-code"]=`${o} isort --profile black ${e} && ${o} black ${e}`,i.scripts.lint?i.scripts.lint=`${o} flake8 ${e} && ${i.scripts.lint}`:(i.scripts.lint=`${o} flake8 ${e}`,i.scripts["lint-fix"]="yarn lint"),i.scripts.format=un(i.scripts.format,n),s.pythonDevDependencies.push("black","isort","flake8")}}}(n.repository||i.repository)&&(i.repository=function(e,t){const n=$n(e);if(n)return _n(n,e,t);const r=$n(t);if(r)return _n(r,t);return e}(n.repository??i.repository,i.repository));n.depending.blitz?i.scripts["gen-code"]?.startsWith("blitz codegen")?i.scripts["gen-code"].includes("blitz prisma generate")||(i.scripts["gen-code"]=i.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):i.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!i.scripts["gen-code"]?.startsWith("prisma generate")&&(i.scripts["gen-code"]="prisma generate");(function(e,t){const n=Wt(e,t.scripts);if(!n)return;const r=t.scripts.postinstall;r?r.includes(n)||(t.scripts.postinstall=`${r} && ${n}`):t.scripts.postinstall=n})(n,i),i.dependencies.prettier||delete i.devDependencies["@types/prettier"]}(n,i,c,u),function(e,t){const n=e.dependencies,r=e.devDependencies;t.dependencies=gn(n,t.dependencies),t.devDependencies=t.devDependencies.filter(e=>!n[e]),t.devDependencies=gn(r,t.devDependencies)}(c,u),await async function(e){const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]),n=[{packageName:"@willbooster/auth",repo:"auth",target:"dependencies"},{packageName:"@discord-bot/shared",repo:"discord-bot",target:"dependencies"},{packageName:"@willbooster/code-analyzer",repo:"code-analyzer",target:"devDependencies"},{packageName:"@willbooster/judge",repo:"judge",target:"dependencies"},{packageName:"@willbooster/llm-proxy",repo:"llm-proxy",target:"dependencies"}];await Promise.all(n.map(async({packageName:n,repo:r,target:i})=>{if(!t.has(n)||function(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}(e,n))return;const s="dependencies"===i?"devDependencies":"dependencies";Reflect.deleteProperty(e[s],n),e[i][n]=await async function(e){const t=await function(e,t){try{const n=Jt("git",["ls-remote",`git@github.com:${e}/${t}.git`,"HEAD"],process.cwd()).split(/\s+/)[0];if(!n)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(n)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}("WillBoosterLab",e);return`git@github.com:WillBoosterLab/${e}.git#${t}`}(r)}))}(c),function(e){for(const t of ln){const n=e[t];n&&0===Object.keys(n).length&&Reflect.deleteProperty(e,t)}}(c),n.isBun&&delete c.packageManager;await P.generateFile(a,function(e){return JSON.stringify(Le(e),void 0,2)}(c)),s||(function(e,t,n,r){const i=n.dependencies.filter(e=>!t.devDependencies?.[e]);mn(e,r,t.dependencies??{},i,!1);const s=n.devDependencies.filter(e=>!t.dependencies?.[e]);mn(e,r,t.devDependencies??{},s,!0);const o=fn(e);if(o&&n.pythonDevDependencies.length>0){const t=[...new Set(n.pythonDevDependencies)];"poetry"===o?Lt("poetry",["add","--group","dev",...t],e.dirPath):Lt("uv",["add","--dev",...t],e.dirPath)}}(n,c,u,p),function(e,n,r){const i=t.relative(e.dirPath,r);if(!i)return;Lt("bun"===n?"bunx":n,["sort-package-json",i],e.dirPath)}(n,p,a))}(n,i,s)})}function un(e,t){const n=t.isBun?"bun run":"yarn";return e?`${e} && ${n} format-code`:`${n} format-code`}const dn="export { default } from './config.js';\n";function fn(e){return e.doesContainUvLock?"uv":e.doesContainPoetryLock?"poetry":void 0}function mn(e,t,n,r,i){if(0===r.length)return;const s=[...new Set(r.map(e=>function(e,t,n){if("yarn"===n&&t&&!jn(t))return`${e}@${t}`;return vn(e)}(e,n[e],t)))];Lt(t,["add",...i?["-D"]:[],...e.isBun?["--exact"]:[],...s],e.dirPath)}function gn(e,t){const n=[];for(const r of new Set(t)){const t=xn(r,e[r]);t&&n.push(r),e[r]&&!t&&"*"!==e[r]||(e[r]=bn(r))}return n}function yn(e){return r.flattenDiagnosticMessageText(e.messageText,"\n")}function hn(e){return"string"==typeof e?[e]:Array.isArray(e)?e.filter(e=>"string"==typeof e):[]}function wn(e){return ln.map(t=>e[t]).filter(e=>!!e)}function bn(e){const t=cn.get(e);if(t)return t;const n=function(e){return Jt("npm",["show",vn(e),"version","--workspaces=false"],process.cwd())||"*"}(e);return cn.set(e,n),n}function vn(e){return e===Qt?`${e}@beta`:e}function kn(e,t,n){return!!Xt(t)&&(!!e.peerDependencies[n]||"@types/eslint"===n&&!!e.peerDependencies.eslint)}function xn(e,t){return!t||("*"===t||(!!jn(t)||("@willbooster/wb"===e||e===nn||Zt.includes(e)||e===Qt)))}function jn(e){return e.startsWith("workspace:")}function $n(e){if("string"==typeof e){if(!e.startsWith("github:"))return;const[t,n]=Mt.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[,r,i]=n;return`git+https://github.com/${r}/${i}.git`}function _n(e,t,n){return{..."object"==typeof t?t:"object"==typeof n?n:void 0,type:"git",url:e}}function Sn(e,t){if(e.isBun){const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,r={"check-all-for-ai":"bun run check-for-ai && bun run test","check-for-ai":"bun run cleanup",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",verify:"bun --bun wb verify","verify-full":"bun --bun wb verify --full"};return On(e,r,t,["build","dev","start","test","typecheck"]),n?e.depending.pyright&&(r.typecheck+=" && pyright"):delete r.typecheck,r}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,r=It(e),i=Rt(e),s=t.test;let o={"check-all-for-ai":"yarn check-for-ai && yarn test","check-for-ai":"yarn format > /dev/null 2> /dev/null || true && yarn lint-fix --quiet",cleanup:"yarn format && yarn lint-fix",format:Fn(r,i),lint:"oxlint --no-error-on-unmatched-pattern .","lint-fix":"yarn lint --fix","format-code":"oxfmt --write --no-error-on-unmatched-pattern . '!**/package.json'",typecheck:"tsgo --noEmit"};return i&&(o.prettify=`prettier --cache --color --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${vt.prettierOnly.join(",")}}" "!**/test{-,/}fixtures/**"`),e.doesContainSubPackageJsons?(o=l({...o},{format:`${o.format} && 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",test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}),i&&(o.prettify=`prettier --cache --color --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${vt.prettierOnly.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`)):e.depending.pyright&&(o.typecheck=o.typecheck?`${o.typecheck} && `:"",o.typecheck+="pyright"),s?.includes("wb test")&&(o.test=s),r||(delete o["format-code"],delete o.lint,delete o["lint-fix"]),n?e.depending.wb&&(o.typecheck="wb typecheck"):delete o.typecheck,Pn(e.packageJson)?(o.verify=t.verify??'yarn workspace @willbooster/wb start --working-dir "$INIT_CWD" verify',o["verify-full"]=t["verify-full"]??"yarn verify --full"):(o.verify="wb verify",o["verify-full"]="wb verify --full"),On(e,o,t,["build","dev","start","test","typecheck"]),o}}function Pn(e){return e?.name===tn}function On(e,t,n,r){for(const i of r)En(e,i)&&(Cn(e,i)||(!n[i]||An(n[i],i)||i in t)&&(t[i]=`mise run ${i}`))}function En(e,t){return Object.hasOwn(e.miseTasks,t)}function Cn(e,t){const n=e.miseTasks[t];if(!n)return!1;return["bun","yarn","npm","pnpm"].some(e=>{return new RegExp(String.raw`\b${e}\s+(?:run\s+)?${r=t,r.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}(?![a-zA-Z0-9_\-:.])`,"u").test(n);var r})}function An(e,t){return e===`mise run ${t}`}function Fn(e,t){const n=["sort-package-json"];return e&&n.push("yarn format-code"),t&&n.push("yarn prettify"),n.join(" && ")}const Bn={glob_matcher:"doublestar","post-merge":{jobs:[{name:"prepare",script:"prepare.sh",runner:"bash"}]},"pre-push":{jobs:[{name:"check",script:"check.sh",runner:"bash"}]}},In={jobs:[{name:"cleanup",glob:"",run:"",stage_fixed:!0},{name:"check-migrations",glob:"**/migration.sql",run:'\nfailed=0\n# Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.\nfor file in {staged_files}; do\n if grep -q \'Warnings:\' "$file"; then\n echo "Migration SQL file ($file) contains warnings! Please solve the warnings and commit again."\n failed=1\n fi\ndone\nexit "$failed"\n'.trim()}]},Rn='\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 Dn(n){return S.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const r=t.resolve(n.dirPath,".lefthook"),i=t.resolve(n.dirPath,".husky"),s=e.existsSync(i),{lint:o}=Sn(n,{}),a={...Bn,"pre-commit":{jobs:Tn(n)}};o||delete a["pre-push"];await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),p.dump(a,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(r,{force:!0,recursive:!0})]),s&&(await Promise.all([e.promises.rm(i,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})]),Lt("git",["config","--unset","core.hooksPath"],n.dirPath));if(o){const i=function(e){let t;t=e.isBun?"bun --bun wb lint":e.depending.wb?"yarn wb lint":"yarn run lint";const n=`${t} --quiet`;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${n}\n`.trim();return n}(n);e.mkdirSync(t.join(r,"pre-push"),{recursive:!0}),await e.promises.writeFile(t.join(r,"pre-push","check.sh"),i+"\n",{mode:493})}const c=`${Rn}\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",r=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";t.push(String.raw`run_if_changed "package\.json" "${n}${r}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`);e.doesContainUvLock&&t.push(String.raw`run_if_changed "uv\.lock" "uv sync --frozen"`);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"`);const i=Wt(e,e.packageJson?.scripts);i&&t.push(String.raw`run_if_changed "(^|/)i18n/.*\.json$" "${i}"`);return t}(n).join("\n")}\n`;e.mkdirSync(t.join(r,"post-merge"),{recursive:!0}),await e.promises.writeFile(t.resolve(r,"post-merge","prepare.sh"),c,{mode:493})}(n)})}function Tn(e){return In.jobs.map(t=>"cleanup"===t.name?{...t,glob:Wn(e),run:Ln(e)}:t)}function Wn(e){const t=e.isBun||e.depending.wb||Rt(e)?[...vt.prettierOnly]:[];It(e)&&t.push(...vt.oxfmt,...vt.oxlint),(e.doesContainPoetryLock||e.doesContainUvLock)&&t.push("py"),e.doesContainPubspecYaml&&t.push("dart");return`**/*.{${[...new Set(t)].toSorted().join(",")}}`}function Ln(n){if(function(n){if(!n.isRoot)return!1;const r=t.resolve(n.dirPath,"packages","wb","package.json");if(!e.existsSync(r))return!1;try{return"@willbooster/wb"===JSON.parse(e.readFileSync(r,"utf8")).name}catch{return!1}}(n))return String.raw`
|
|
2
2
|
# Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.
|
|
3
3
|
yarn workspace @willbooster/wb start --working-dir "$(git rev-parse --show-toplevel)" lint --fix --format -- {staged_files}
|
|
4
|
-
`.trim();const
|
|
4
|
+
`.trim();const r=It(n)||Rt(n);if((n.isBun||n.depending.wb)&&r)return`\n# Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.\n${n.isBun?"bun --bun wb":"yarn wb"} lint --fix --format -- {staged_files}\n`.trim();const i=vt.oxlint.map(e=>String.raw`\.${e}$`).join("|"),s=vt.oxfmt.map(e=>String.raw`\.${e}$`).join("|"),o=vt.prettierOnly.map(e=>String.raw`\.${e}$`).join("|"),a=It(n),c=Rt(n);return String.raw`
|
|
5
5
|
# Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.
|
|
6
|
-
${a?String.raw`oxlint_files="$(printf '%s\n' {staged_files} | grep -E '(${
|
|
6
|
+
${a?String.raw`oxlint_files="$(printf '%s\n' {staged_files} | grep -E '(${i})' || true)"`:""}
|
|
7
7
|
${a?String.raw`oxfmt_files="$(printf '%s\n' {staged_files} | grep -E '(${s})' | grep -v -E '(^|/)package\.json$' || true)"`:""}
|
|
8
8
|
${c?String.raw`prettier_files="$(printf '%s\n' {staged_files} | grep -E '(${o})' || true)"`:""}
|
|
9
9
|
package_json_files="$(printf '%s\n' {staged_files} | grep -E '(^|/)package\.json$' || true)"
|
|
10
|
-
${
|
|
10
|
+
${Nn(n)?String.raw`python_files="$(printf '%s\n' {staged_files} | grep -E '\.py$' || true)"`:""}
|
|
11
11
|
${n.doesContainPubspecYaml?String.raw`dart_files="$(printf '%s\n' {staged_files} | grep -E '\.dart$' | grep -v 'generated' | grep -v '\.freezed\.dart$' | grep -v '\.g\.dart$' || true)"`:""}
|
|
12
12
|
|
|
13
13
|
${a?String.raw`
|
|
@@ -26,7 +26,7 @@ fi
|
|
|
26
26
|
if [ -n "$package_json_files" ]; then
|
|
27
27
|
node node_modules/.bin/sort-package-json -- $package_json_files
|
|
28
28
|
fi
|
|
29
|
-
${
|
|
29
|
+
${Nn(n)?`if [ -n "$python_files" ]; then\n ${Jn(n)} isort --profile black --filter-files $python_files\n ${Jn(n)} black $python_files\n ${Jn(n)} flake8 $python_files\nfi`:""}
|
|
30
30
|
${n.doesContainPubspecYaml?'if [ -n "$dart_files" ]; then\n dart format $dart_files\nfi':""}
|
|
31
|
-
`.trim()}function Wn(e){return e.doesContainPoetryLock||e.doesContainUvLock}function Nn(e){return e.doesContainUvLock?"uv run":"poetry run"}async function Ln(t){return S.functionIgnoringException("generateLintstagedrc",async()=>{await Promise.all([O.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.cjs`,{force:!0})),O.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.js`,{force:!0})),O.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.json`,{force:!0}))])})}function Jn(e){return e?.trim()}async function Un(n){return S.functionIgnoringException("generateOxfmtConfig",async()=>{const i=t.resolve(n.dirPath,".oxfmtrc.json"),r=t.resolve(n.dirPath,"oxfmt.config.ts"),s=await P.readFileIgnoringError(r),o=function(e){return function(e,t){return e.isEsmPackage?`import config from '${t.packageName}';\n\nexport default config;\n`:`// oxlint-disable unicorn/prefer-module -- ${t.toolName} only auto-discovers .ts config files, and CommonJS avoids Node typeless ESM warnings.\nconst ${t.commonJsVariableName} = require('${t.packageName}');\n\nmodule.exports = ${t.commonJsVariableName}.default ?? ${t.commonJsVariableName};\n`}(e,{commonJsVariableName:"oxfmtConfig",packageName:"@willbooster/oxfmt-config",toolName:"Oxfmt"})}(n),a=[O.run(()=>e.promises.rm(i,{force:!0}))];Jn(s)!==Jn(o)&&a.push(O.run(()=>P.generateFile(r,o))),await Promise.all(a)})}async function Mn(n,i){return S.functionIgnoringException("generateOxlintConfig",async()=>{const i=Vt(n),r=t.resolve(n.dirPath,"oxlint.config.ts"),s=await P.readFileIgnoringError(r),o=i&&s?s:function(e,t,n){const i=function(e){if(e.isEsmPackage)return`${Hn("base","import config from '@willbooster/oxlint-config';")}\n\n${Hn("export","export default config;")}\n`;return`${Hn("base","// oxlint-disable unicorn/prefer-module -- Oxlint only auto-discovers .ts config files, and CommonJS avoids Node typeless ESM warnings.\nconst oxlintBaseConfig = require('@willbooster/oxlint-config');\n\nconst config = oxlintBaseConfig.default ?? oxlintBaseConfig;")}\n\n${Hn("export","module.exports = config;")}\n`}(e);return t&&function(e){return e.includes(Yn("base"))||e.includes(Yn("export"))}(t)?function(e,t,n){let i=e;for(const r of["base","export"]){const s=Gn(t,r);if(!s)continue;const o=qn(i,r,s);if(!o)return console.warn(`Skipped updating incomplete ${r} block in oxlint config: ${n}`),e;i=o}return i}(t,i,n):i}(n,s,r),a=[];i||a.push(O.run(()=>e.promises.rm(t.resolve(n.dirPath,".oxlintrc.json"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.json"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.jsonc"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.cjs"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.js"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yaml"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yml"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.cjs"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.mjs"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.ts"),{force:!0}))),Jn(s)!==Jn(o)&&a.push(O.run(()=>P.generateFile(r,o))),await Promise.all(a)})}function Gn(e,t){return zn(t).exec(e)?.[0]}function qn(e,t,n){const i=zn(t);if(i.test(e))return e.replace(i,n)}function zn(e){return new RegExp(`${Vn(Yn(e))}[\\s\\S]*?${Vn(Kn(e))}`)}function Hn(e,t){return`${Yn(e)}\n${t}\n${Kn(e)}`}function Yn(e){return`// wbfy:start oxlint-${e}`}function Kn(e){return`// wbfy:end oxlint-${e}`}function Vn(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}async function Xn(n){return S.functionIgnoringException("generatePrettierignore",async()=>{const i=t.resolve(n.dirPath,".prettierignore");if(!It(n))return void await O.run(()=>e.promises.rm(i,{force:!0}));const r=await P.readFileIgnoringError(i)??"",s=yt.getHeadUserContent(r),o=yt.getTailUserContent(r),a=t.resolve(n.dirPath,".gitignore"),c=await yt.readGitignoreWithoutSeparators(a)||"";let l="";n.doesContainPubspecYaml&&(l="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const p=s+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+l+c+o;await O.run(()=>P.generateFile(i,p))})}const Zn={venvPath:".",venv:".venv"};async function Qn(n){return S.functionIgnoringException("generatePyrightConfigJson",async()=>{let i=structuredClone(Zn);const r=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(r,"utf8"),n=JSON.parse(t);i=l.all([i,n,i],{arrayMerge:Me})}catch{}const s=JSON.stringify(i,void 0,2);await O.run(()=>P.generateFile(r,s))})}async function ei(n){return S.functionIgnoringException("generateReadme",async()=>{const i=t.resolve(n.dirPath,"README.md");let r=await e.promises.readFile(i,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(r=ti(r,"[](https://github.com/semantic-release/semantic-release)"));const s=n.repository?.slice(n.repository.indexOf(":")+1),o=t.resolve(n.dirPath,".github","workflows"),a=e.existsSync(o)?e.readdirSync(o):[];for(const i of a){if(!i.startsWith("test")&&!i.startsWith("deploy"))continue;let o=i;if(o=(o[0]||"").toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," "),!s)continue;const a=`[](https://github.com/${s}/actions/workflows/${i})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${i}`))&&(r=ni(r,o,i),r=ti(r,a))}await O.run(()=>P.generateFile(i,r))})}function ti(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 i=e.slice(0,n+1);let r=e.slice(n+1);return r.startsWith("[")||r.startsWith("!")||(r=`\n${r}`),`${i}${t}\n${r}`}return`${e}\n${t}\n`}function ni(e,t,n){const i=ii(t),r=ii(n);return e.replaceAll(new RegExp(String.raw`\[!\[${i}\]\(https://github\.com/[^/\s)]+/[^/\s)]+/actions/workflows/${r}/badge\.svg\)\]\(https://github\.com/[^/\s)]+/[^/\s)]+/actions/workflows/${r}\)\n?`,"gu"),"").replaceAll(/\n\n\n+/g,"\n\n")}function ii(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}async function ri(n){return S.functionIgnoringException("generateReleaserc",async()=>{const i=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(i))return;const r=JSON.parse(await e.promises.readFile(i,"utf8")),s=r.plugins??[];for(let e=0;e<s.length;e++){const t=s[e],n=Array.isArray(t),i=n?t[0]:t,r=n&&t[1]||{};"@semantic-release/commit-analyzer"===i?s[e]=["@semantic-release/commit-analyzer",l.all([r,{preset:"conventionalcommits"}],{arrayMerge:Me})]:"@semantic-release/github"===i&&(s[e]=["@semantic-release/github",l.all([r,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:Me})])}const o=JSON.stringify(r,void 0,2);await O.run(()=>P.generateFile(i,o))})}const si={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function oi(n){return S.functionIgnoringException("generateRenovateJson",async()=>{let i=structuredClone(si);const r=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${r}5`))return;try{const t=await e.promises.readFile(r,"utf8"),n=JSON.parse(t);i=l.all([i,n,i],{arrayMerge:Me}),i.extends=i.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(i.packageRules??=[],i.packageRules.some(e=>e.matchPackageNames?.includes("next"))||i.packageRules.push({matchPackageNames:["next"],enabled:!1})),await O.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await O.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const s=JSON.stringify(i,void 0,2);await O.run(()=>P.generateFile(r,s))})}async function ai(e){return S.functionIgnoringException("installAgentSkills",async()=>{await Promise.all([s.rm(t.resolve(e.dirPath,".agents"),{force:!0,recursive:!0}),s.rm(t.resolve(e.dirPath,".claude"),{force:!0,recursive:!0}),s.rm(t.resolve(e.dirPath,"skills-lock.json"),{force:!0})])})}const ci={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["packages/*/test/fixtures","test/fixtures"],include:["*.config.ts","packages/*/*.config.ts","packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},li={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["test/fixtures"],include:["*.config.ts","scripts/**/*","src/**/*","test/**/*"]};async function pi(n){return S.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return void await async function(n){const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=JSON.parse(await e.promises.readFile(i,"utf8"));!function(e){if(!e)return;"node"!==e.moduleResolution&&"Node"!==e.moduleResolution&&"node10"!==e.moduleResolution&&void 0!==e.moduleResolution||(e.moduleResolution="bundler")}(t.compilerOptions),function(e){if(!e)return;if(delete e.baseUrl,!e.paths)return;for(const[t,n]of Object.entries(e.paths))e.paths[t]=ui(n)}(t.compilerOptions),await O.run(()=>P.generateFile(i,JSON.stringify(t,void 0,2)))}catch{}}(n);let i=structuredClone(n.isRoot?ci:li);const r=function(e){const t=new Set,n={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};e.isBun?t.add("bun"):e.depending.reactNative||t.add("node");(n.jest||n["@jest/globals"]||n["jest-environment-jsdom"]||n["ts-jest"])&&t.add("jest");n.vitest&&t.add("vitest/globals");n.mocha&&t.add("mocha");n.cypress&&t.add("cypress");return[...t]}(n);i.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),i.compilerOptions??={},i.compilerOptions.rootDir=function(n){return n.isRoot?".":e.existsSync(t.resolve(n.dirPath,"..","..","package.json"))?"../..":"."}(n),r.length>0&&(i.compilerOptions={...i.compilerOptions,types:r}),n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?n.isBun||n.depending.reactNative||(i.compilerOptions={...i.compilerOptions,jsx:"react-jsx"}):delete i.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(i.include=i.include?.filter(e=>!e.startsWith("packages/*/")),i.exclude=i.exclude?.filter(e=>!e.startsWith("packages/*/"))),n.depending.prisma&&function(e,t){e.include??=[],e.include.includes(t)||e.include.push(t)}(i,"prisma/**/*");const s=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(s,"utf8"),n=JSON.parse(t),a=(o=n.compilerOptions?.types,"string"==typeof o?[o]:Array.isArray(o)?o.filter(e=>"string"==typeof e):[]),c=function(e){const t={};for(const n of["declaration","declarationMap","sourceMap"]){const i=e?.[n];void 0!==i&&(t[n]=i)}return t}(n.compilerOptions);i.extends=function(e,t){const n=[...di(e),...di(t)],i=[...new Set(n)];return 0===i.length?void 0:1===i.length?i[0]:i}(i.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,i=l.all([i,n,i],{arrayMerge:Ge}),i.include=i.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/")),i.compilerOptions??={},i.compilerOptions={...i.compilerOptions,...c},function(e){if(!e)return;if(!1!==e.noEmit||!0===e.emitDeclarationOnly)return;e.rewriteRelativeImportExtensions=!0}(i.compilerOptions);const p=[...new Set([...fi(a,r),...r])];p.length>0?i.compilerOptions.types=p:delete i.compilerOptions.types,r.some(e=>"cypress"===e||e.includes("/"))&&delete i.compilerOptions.typeRoots}catch{}var o;He(i),i.include?.sort(),delete i.compilerOptions?.experimentalDecorators,delete i.compilerOptions?.baseUrl,function(e,t){if(!e)return;"node"!==e.moduleResolution&&"Node"!==e.moduleResolution&&"node10"!==e.moduleResolution||delete e.moduleResolution;if(t.isBun||t.depending.reactNative||"ESNext"!==e.module)return;delete e.module}(i.compilerOptions,n),n.depending.reactNative&&delete i.compilerOptions?.verbatimModuleSyntax;const a=JSON.stringify(i,void 0,2);await O.run(()=>P.generateFile(s,a))})}function ui(e){return e.map(e=>e.startsWith("./")||e.startsWith("../")||t.isAbsolute(e)?e:`./${e}`)}function di(e){return e?Array.isArray(e)?e:[e]:[]}function fi(e,t){const n=new Set(t);return e.filter(e=>!(function(e){return"cypress"===e||"jest"===e||"mocha"===e||"vitest/globals"===e}(e)&&!n.has(e)))}const mi=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function gi(n){return S.functionIgnoringException("generateVscodeSettings",async()=>{try{const i=t.resolve(n.dirPath,".vscode","settings.json"),r=await e.promises.readFile(i,"utf8");let s=JSON.parse(r);for(const e of mi)s=l.all([s,yi(e)]);(n.doesContainPoetryLock||n.doesContainUvLock)&&(s=l.all([s,yi("**/.venv/**")])),n.depending.next&&(s=l.all([s,yi("**/.next/**")])),"editor.codeActionsOnSave"in s&&delete s["editor.codeActionsOnSave"],"editor.formatOnSave"in s&&delete s["editor.formatOnSave"],He(s);const o=JSON.stringify(s,void 0,2);await O.run(()=>P.generateFile(i,o))}catch{}})}function yi(e){return{"files.watcherExclude":{[e]:!0}}}async function hi(n){return S.functionIgnoringException("generateYarnrcYml",async()=>{const i=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await O.run(()=>e.promises.rm(i,{force:!0})),await O.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await O.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const r=Lt("yarn",["--version"],n.dirPath),s=function(e,t){return Lt("npm",["show",e,"version"],t)||"0.0.0"}("@yarnpkg/cli",n.dirPath);(function(e,t){const n=y.valid(e);return!!n&&y.gt(n,y.valid(t)??"0.0.0")})(s,r)&&Wt("yarn",["set","version",s],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-${s}.`)&&await O.run(()=>e.promises.rm(t.join(o,n)));const a=t.resolve(n.dirPath,".yarnrc");await O.run(()=>e.promises.rm(a,{force:!0}));let c={};try{c=p.load(await e.promises.readFile(i,"utf8"))??c}catch{}c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.approvedGitRepositories=["https://github.com/WillBoosterLab/*.git","ssh://git@github.com/WillBoosterLab/*.git"],c.npmPreapprovedPackages=["@exercode/*","@willbooster/*","agent-runtime-kit","at-decorators","build-ts","gen-i18n-ts","one-way-git-sync","next","@next/*","@typescript/*","@oxfmt/*","@oxlint/*","@oxlint-tsgolint/*","oxfmt","oxlint","oxlint-tsgolint","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 i=t.resolve(n.dirPath,".yarn","plugins","undefined.cjs");await O.run(()=>e.promises.rm(i,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(i,p.dump(c,{lineWidth:-1})),Wt("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath),Wt("yarn",function(e,n){return["dlx","prettier","--no-config","--write",t.relative(e,n)]}(n.dirPath,i),n.dirPath)})}async function bi(e){return S.functionIgnoringException("setupLabels",async()=>{const[t,n]=Ut.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!qt(t))return;const i=Gt(t);try{await wi(i,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await wi(i,t,n,"d2: easy :rabbit2:","DDD6FE"),await wi(i,t,n,"d3: medium :ox:","C4B5FD"),await wi(i,t,n,"d4: hard :squid:","A78BFA"),await wi(i,t,n,"d5: x-hard :whale2:","8B5CF6"),await wi(i,t,n,"p1: critical :fire::fire::fire:","EF4444"),await wi(i,t,n,"p2: urgent :fire::fire:","F87171"),await wi(i,t,n,"p3: important :fire:","FCA5A5"),await wi(i,t,n,"p4: nice to have :droplet:","FECACA"),await wi(i,t,n,"r: blitz","5300bc"),await wi(i,t,n,"r: firebase","ffca28"),await wi(i,t,n,"r: prisma","0c344b"),await wi(i,t,n,"r: react","61dafb"),await wi(i,t,n,"r: svelte","ff3e00"),await wi(i,t,n,"r: semantic-release","494949"),await wi(i,t,n,"ready :rocket:","22C55E"),await wi(i,t,n,"review requested :mag:","FBCA04"),await wi(i,t,n,"released :bookmark:","6366F1"),await wi(i,t,n,"s: 0.5h :clock1230:","F3F4F6"),await wi(i,t,n,"s: 1h :clock1:","E5E7EB"),await wi(i,t,n,"s: 2h :clock2:","D1D5DB"),await wi(i,t,n,"s: 3h :clock3:","9CA3AF"),await wi(i,t,n,"s: 5h :clock5:","6B7280"),await wi(i,t,n,"s: 8h :clock8:","4B5563"),await wi(i,t,n,"s: 13h :clock1:","374151"),await wi(i,t,n,"t: build :hammer:","BFDBFE"),await wi(i,t,n,"t: chore :broom:","BFDBFE"),await wi(i,t,n,"t: ci :construction_worker:","BFDBFE"),await wi(i,t,n,"t: docs :memo:","BFDBFE"),await wi(i,t,n,"t: feat :sparkles:","BFDBFE"),await wi(i,t,n,"t: fix :bug:","BFDBFE"),await wi(i,t,n,"t: perf :zap:","BFDBFE"),await wi(i,t,n,"t: refactor :recycle:","BFDBFE"),await wi(i,t,n,"t: style :lipstick:","BFDBFE"),await wi(i,t,n,"t: test :test_tube:","BFDBFE"),await wi(i,t,n,"project","24292F"),await wi(i,t,n,"focused :dart:","22C55E"),await wi(i,t,n,"gen-pr-all :robot:","00B4D8"),await wi(i,t,n,"gen-pr-claude :robot:","00B4D8"),await wi(i,t,n,"gen-pr-codex :robot:","00B4D8"),await wi(i,t,n,"gen-pr-gemini :robot:","00B4D8"),await vi(i,t,n,"bug"),await vi(i,t,n,"documentation"),await vi(i,t,n,"duplicate"),await vi(i,t,n,"enhancement"),await vi(i,t,n,"good first issue"),await vi(i,t,n,"help wanted"),await vi(i,t,n,"invalid"),await vi(i,t,n,"question"),await vi(i,t,n,"wontfix"),await vi(i,t,n,"ready"),await vi(i,t,n,"review requested"),await vi(i,t,n,"released"),await vi(i,t,n,"semantic-release"),await vi(i,t,n,"llm-pr :robot:"),await vi(i,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function wi(e,t,n,i,r){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:i,color:r})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:i,color:r})}}async function vi(e,t,n,i){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:i})}catch{}}const ki=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"],xi=h(import.meta.url);async function ji(e){return S.functionIgnoringException("setupSecrets",async()=>{const[n,i]=Ut.getOrgAndName(e.repository??"");if(!n||!i||"WillBoosterLab"!==n)return;if(!qt(n)||!$.doesUploadEnvVars)return;const r=b.config({path:t.resolve(e.dirPath,".env"),quiet:!0}).parsed??{};if(0===Object.keys(r).length)return;const s=Gt(n);try{for(const e of ki)try{await s.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:i,secret_name:e})}catch{}const e=await s.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:n,repo:i}),{key:t,key_id:o}=e.data,a=xi("libsodium-wrappers");await a.ready;for(const[e,c]of Object.entries(r)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const r=a.from_base64(t,a.base64_variants.ORIGINAL),l=a.from_string(c),p=a.crypto_box_seal(l,r),u=a.to_base64(p,a.base64_variants.ORIGINAL);await s.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:i,secret_name:e,encrypted_value:u,key_id:o})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function _i(e){const[t,n]=Ut.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!qt(t))return;const i=Gt(t);await async function(e,{beforeRetry:t,handleError:n,retryCount:i=3,retryLogger:r,shouldRetry:s,sleepMilliseconds:o=0,updateSleepMilliseconds:a}={}){let c=0;for(;;)try{return await e(c)}catch(e){if(await(n?.(e)),c++,c>=i)throw e;if(s&&!s(e))throw e;o>0&&await x(o),a&&(o=a(o)),r?.(`Retry due to: ${e}\n${e instanceof Error?"---\n"+(e.stack??""):""}`),await(t?.(e))}}(()=>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 $i="__PM_RUN__",Si={"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., \`${$i} test\`) passed.\n - The lint command (e.g., \`${$i} 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 Pi(n){return S.functionIgnoringException("generateGitHubTemplates",async()=>{if(n.isWillBoosterRepo)for(const[i,r]of Object.entries(Si)){const s=Oi(r,n),o=t.resolve(n.dirPath,".github",i);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(w(t,s)>s.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await O.run(()=>P.generateFile(o,s))}})}function Oi(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll($i,n)}const Ei=k.object({typos:k.object({all:k.record(k.string(),k.string()).optional(),doc:k.record(k.string(),k.string()).optional(),ts:k.record(k.string(),k.string()).optional(),text:k.record(k.string(),k.string()).optional()}).optional()});async function Ci(n,i){const r=t.resolve(n,"package.json");try{const o=e.existsSync(r);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(r,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let u=[],d=[];try{const e=t.resolve(n,".releaserc.json"),i=JSON.parse(await s.readFile(e,"utf8"));u=i?.branches??[],d=i?.plugins?.flat()??[]}catch{}const f="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let m;f&&(m=await async function(e,t){const n=v(e),i=(await n.getRemotes(!0)).find(e=>"origin"===e.name),r=i?.refs.fetch??i?.refs.push;if("string"==typeof r){const e=await Ii(r);if(e)return e}const s="string"==typeof t.repository?t.repository:t.repository?.url;if(s){const e=await Ii(s);if(e&&"Not Found"!==e.message)return e}}(n,l));let g=function(n){const i=t.resolve(n);return e.existsSync(t.join(i,"mise.toml"))||e.existsSync(t.join(i,".mise.toml"))||e.existsSync(t.join(i,".tool-versions"))}(n);for(const i of["java","node","python"])if(e.existsSync(t.resolve(n,`.${i}-version`))){g=!0;break}let y="";try{y=await s.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const h=t.resolve(n,"wbfy.json");let b;try{const e=await s.readFile(h,"utf8");b=Ei.parse(JSON.parse(e))}catch{}const w="string"==typeof m?.full_name?m.full_name:void 0;let k,x;if(w){const e=w.split("/");e.length>=2&&(k=e[0],x=e[1])}const j=w?`github:${w}`:void 0,_={dirPath:n,dockerfile:y,isRoot:f,isPublicRepo:!1===m?.private,isReferredByOtherRepo:!!l.files,repository:j,repoAuthor:k,repoName:x,isWillBoosterRepo:Boolean(j?.startsWith("github:WillBooster/")||j?.startsWith("github:WillBoosterLab/")),isBun:i?.isBun||e.existsSync(t.join(n,"bun.lock")),isEsmPackage:p,isWillBoosterConfigs:r.includes("/willbooster-configs"),doesContainSubPackageJsons:Fi("packages/**/package.json",n),doesContainDockerfile:!!y||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")),doesContainUvLock:e.existsSync(t.resolve(n,"uv.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:Fi("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Fi("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Fi("{app,src,test}/**/*.{t,j}sx",n),doesContainJava:Fi("**/*.java",n),doesContainJavaScriptInPackages:Fi("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Fi("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Fi("packages/**/{app,src,test}/**/*.{t,j}sx",n),doesContainJavaInPackages:Fi("packages/**/*.java",n),hasStartTestServer:!!l.scripts?.["start-test-server"],depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!a["gen-i18n-ts"]||!!c["gen-i18n-ts"],litestream:y.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"]||u.length>0||d.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:u,github:d.includes("@semantic-release/github"),npm:d.includes("@semantic-release/npm")},hasVersionSettings:g,miseTasks:await Ai(n),packageJson:l,wbfyJson:b};if(_.doesContainGemfile||_.doesContainGoMod||_.doesContainPackageJson||_.doesContainPoetryLock||_.doesContainUvLock||_.doesContainPomXml||_.doesContainPubspecYaml||_.doesContainTemplateYaml)return _}catch{}}async function Ai(e){const n={};for(const i of["mise.toml",".mise.toml"]){const r=t.resolve(e,i);try{const e=u.parse(await s.readFile(r,"utf8"));for(const[t,i]of Object.entries(e.tasks??{}))n[t]=Bi(i)}catch{}}return n}function Bi(e){return"string"==typeof e?e:Array.isArray(e)?e.filter(e=>"string"==typeof e).join("\n"):e&&"object"==typeof e?Bi(e.run):""}function Fi(e,t){return o.globSync(e,{dot:!0,cwd:t,ignore:U}).length>0}async function Ii(e){const[t,n]=Ut.getOrgAndName(e);if(t&&n)try{return(await Gt().request("GET /repos/{owner}/{repo}",{owner:t,repo:n})).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 i=t?.headers?.location;if("string"!=typeof i)return;const[r,s]=Ut.getOrgAndName(i);if(!r||!s)return;return`${r}/${s}`}(e);if(t)return{full_name:t}}}function Ri(e){const t=Nt("bun",["install"],e);if(0!==t)throw new Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await async function(){const i=await n(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;$.isVerbose=i.verbose,$.doesUploadEnvVars=i.env;let r=!1;for(const n of i.paths){const s=t.join(n,"packages"),o=(await j(()=>e.promises.readdir(s,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(s,e.name));await Le([n,...o]);const a=await Ci(n);if($.isVerbose,!a){console.error(`there is no valid package.json in ${n}`),r=!0;continue}const c=nt(a),l=(await Promise.all(o.map(e=>Ci(e,a)))).filter(e=>!!e),p=[a,...l];if($.isVerbose)for(const e of p)console.info(e);await hi(a),a.isBun&&await lt(a);const u=!Ze(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([M(a),c.then(()=>ei(a)),st(a,p),bt(a),kt(a),_t(a,p),$t(a),Pt(a),Pi(a),Rt(a),oi(a),ri(a),...u?[Xe(a)]:[],bi(a),ji(a),_i(a),In(a),Ln(a)]),await O.promiseAll();const d=[];for(const e of p)(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Ue(e,e.isRoot?p:[e])),e.depending.playwrightTest&&d.push(I(e)),e.depending.next&&d.push(E(e)),await Et(e,a),await O.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await Xn(e),await ln(e,a,i.skipDeps),d.push(Ln(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&d.push(gi(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(pi(e)),Ft(e)&&(d.push(Un(e)),d.push(Mn(e))),e.depending.pyright&&d.push(Qn(e)));await Promise.all(d),await O.promiseAll();const f=a.isBun?"bun":"yarn";a.isBun?await S.functionIgnoringException("refreshBunLock",async()=>{await Promise.resolve(),Ri(n)}):Wt(f,["install","--no-immutable"],n),Wt(f,["cleanup"],n),await ai(a)}r&&(process.exitCode=1)}();
|
|
32
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2dsb2JVdGlsLnRzIiwiLi4vc3JjL2ZpeGVycy9wcmlzbWEudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kZXRlY3QtaW5kZW50L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1uZXdsaW5lL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lzLXBsYWluLW9iai9pbmRleC5qcyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9nZW5JMThuVHMudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90b29sQ29uZmlnQ29udGVudC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294Zm10Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2tpbGxzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlID0gZmFsc2U7XG4gIGRvZXNVcGxvYWRFbnZWYXJzID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnRyaW0oKTtcbiAgICBpZiAobm9ybWFsaXplZENvbnRlbnQpIHtcbiAgICAgIG5vcm1hbGl6ZWRDb250ZW50ICs9ICdcXG4nO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGVkL1VwZGF0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeE5leHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeE5leHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gWydqcycsICdtanMnLCAnY2pzJ11cbiAgICAgIC5tYXAoKGV4dCkgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgbmV4dC5jb25maWcuJHtleHR9YCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChvbGRDb250ZW50KTtcbiAgICBpZiAoIW9iamVjdExpdGVyYWwpIHJldHVybjtcblxuICAgIGNvbnN0IGV4aXN0aW5nUHJvcGVydGllcyA9IG5ldyBTZXQob2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWU/LmdldFRleHQoKSkpO1xuICAgIGNvbnN0IHByb3BlcnR5VGV4dHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKCFleGlzdGluZ1Byb3BlcnRpZXMuaGFzKCd0eXBlc2NyaXB0JykpIHtcbiAgICAgIHByb3BlcnR5VGV4dHMucHVzaCgndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9Jyk7XG4gICAgfVxuICAgIGlmIChwcm9wZXJ0eVRleHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaW5zZXJ0aW9uUG9pbnQgPSBvYmplY3RMaXRlcmFsLmdldEVuZCgpIC0gMTtcbiAgICBjb25zdCBsYXN0UHJvcGVydHkgPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMuYXQoLTEpO1xuICAgIGNvbnN0IGhhc1RyYWlsaW5nQ29tbWEgPSBsYXN0UHJvcGVydHlcbiAgICAgID8gb2xkQ29udGVudC5zbGljZShsYXN0UHJvcGVydHkuZ2V0RW5kKCksIGluc2VydGlvblBvaW50KS5pbmNsdWRlcygnLCcpXG4gICAgICA6IGZhbHNlO1xuICAgIGNvbnN0IHByZWZpeCA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5sZW5ndGggPiAwICYmICFoYXNUcmFpbGluZ0NvbW1hID8gJywgJyA6ICcnO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIGluc2VydGlvblBvaW50KX0ke3ByZWZpeH0ke3Byb3BlcnR5VGV4dHMuam9pbignLCAnKX0ke29sZENvbnRlbnQuc2xpY2UoXG4gICAgICBpbnNlcnRpb25Qb2ludFxuICAgICl9YDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwoY29udGVudDogc3RyaW5nKTogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBzb3VyY2UgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKCduZXh0LmNvbmZpZy5qcycsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUsIHRzLlNjcmlwdEtpbmQuSlMpO1xuICBsZXQgb2JqZWN0TGl0ZXJhbDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IHRzLk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAob2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuICAgIGlmICh0cy5pc0V4cG9ydEFzc2lnbm1lbnQobm9kZSkgJiYgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pKSB7XG4gICAgICBvYmplY3RMaXRlcmFsID0gbm9kZS5leHByZXNzaW9uO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0cy5pc0JpbmFyeUV4cHJlc3Npb24obm9kZSkgJiZcbiAgICAgIG5vZGUub3BlcmF0b3JUb2tlbi5raW5kID09PSB0cy5TeW50YXhLaW5kLkVxdWFsc1Rva2VuICYmXG4gICAgICBub2RlLmxlZnQuZ2V0VGV4dChzb3VyY2UpID09PSAnbW9kdWxlLmV4cG9ydHMnICYmXG4gICAgICB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKG5vZGUucmlnaHQpXG4gICAgKSB7XG4gICAgICBvYmplY3RMaXRlcmFsID0gbm9kZS5yaWdodDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcbiAgfTtcbiAgdmlzaXQoc291cmNlKTtcbiAgcmV0dXJuIG9iamVjdExpdGVyYWw7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxudHlwZSBQYXJzZWRWYWx1ZSA9XG4gIHwgeyBraW5kOiAnYXJyYXknOyB2YWx1ZTogUGFyc2VkVmFsdWVbXSB9XG4gIHwgeyBraW5kOiAnbGl0ZXJhbCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ29iamVjdCc7IHZhbHVlOiBQYXJzZWRPYmplY3QgfTtcbnR5cGUgT2JqZWN0TWVtYmVyID0geyBraW5kOiAnZXh0cmEnOyBpbmRleDogbnVtYmVyIH0gfCB7IGtpbmQ6ICdwcm9wZXJ0eSc7IGtleTogc3RyaW5nIH07XG5pbnRlcmZhY2UgUGFyc2VkT2JqZWN0IHtcbiAgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXTtcbiAgbWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT47XG59XG5pbnRlcmZhY2UgRXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB7XG4gIHNvdXJjZTogdHMuU291cmNlRmlsZTtcbiAgbm9kZTogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb247XG59XG5cbmNvbnN0IGxpdGVyYWwgPSAodmFsdWU6IHN0cmluZyk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdsaXRlcmFsJywgdmFsdWUgfSk7XG5jb25zdCBhc0FycmF5ID0gKHZhbHVlOiBQYXJzZWRWYWx1ZVtdKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2FycmF5JywgdmFsdWUgfSk7XG5jb25zdCBhc09iamVjdCA9IChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZFZhbHVlID0+ICh7XG4gIGtpbmQ6ICdvYmplY3QnLFxuICB2YWx1ZTogdG9QYXJzZWRPYmplY3QocHJvcGVydGllcywgZXh0cmFNZW1iZXJzKSxcbn0pO1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnID0gdG9QYXJzZWRPYmplY3Qoe1xuICBmb3JiaWRPbmx5OiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICB1c2U6IGFzT2JqZWN0KHtcbiAgICBiYXNlVVJMOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgIHRyYWNlOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgICBzY3JlZW5zaG90OiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb25seS1vbi1mYWlsdXJlJyA6ICdvbidcIiksXG4gICAgdmlkZW86IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICB9KSxcbiAgd2ViU2VydmVyOiBhc09iamVjdCh7XG4gICAgY29tbWFuZDogbGl0ZXJhbChcIid5YXJuIHN0YXJ0LXRlc3Qtc2VydmVyJ1wiKSxcbiAgICB1cmw6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyksXG4gICAgcmV1c2VFeGlzdGluZ1NlcnZlcjogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgIHRpbWVvdXQ6IGxpdGVyYWwoJzMwMF8wMDAnKSxcbiAgICBzdGRvdXQ6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgc3RkZXJyOiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgIGVudjogbGl0ZXJhbChge1xuICAuLi5wcm9jZXNzLmVudixcbiAgUFJJU01BX1VTRVJfQ09OU0VOVF9GT1JfREFOR0VST1VTX0FJX0FDVElPTjogJ3RydWUnLFxufWApLFxuICAgIGdyYWNlZnVsU2h1dGRvd246IGxpdGVyYWwoYHtcbiAgc2lnbmFsOiAnU0lHVEVSTScsXG4gIHRpbWVvdXQ6IDUwMCxcbn1gKSxcbiAgfSksXG59KTtcblxuZnVuY3Rpb24gdG9QYXJzZWRPYmplY3QocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRPYmplY3Qge1xuICByZXR1cm4ge1xuICAgIGV4dHJhTWVtYmVycyxcbiAgICBtZW1iZXJPcmRlcjogW1xuICAgICAgLi4uT2JqZWN0LmtleXMocHJvcGVydGllcykubWFwKChrZXkpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pKSxcbiAgICAgIC4uLmV4dHJhTWVtYmVycy5tYXAoKF8sIGluZGV4KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pKSxcbiAgICBdLFxuICAgIHByb3BlcnRpZXMsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYHBsYXl3cmlnaHQuY29uZmlnLnRzYCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgYXNzZXJ0TmV4dFB1YmxpY0Jhc2VVcmwoY29uZmlnLmRpclBhdGgpO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IGV4dHJhY3RlZE9iamVjdExpdGVyYWwgPSBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChvbGRDb250ZW50KTtcbiAgICBpZiAoIWV4dHJhY3RlZE9iamVjdExpdGVyYWwpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgaWYgKCFwYXJzZWQpIHJldHVybjtcblxuICAgIC8vIEtlZXAgZmlsbGluZyBtaXNzaW5nIGRlZmF1bHRzLCBidXQgZG9uJ3Qgb3ZlcndyaXRlIGxvY2FsIGFkanVzdG1lbnRzIG9uIGV2ZXJ5IHJlZ2VuZXJhdGlvbi5cbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVBhcnNlZE9iamVjdHMoZGVmYXVsdENvbmZpZywgcGFyc2VkKTtcbiAgICBjb25zdCBoYXNTdGFydFRlc3RTZXJ2ZXIgPSBCb29sZWFuKGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uWydzdGFydC10ZXN0LXNlcnZlciddKTtcbiAgICBjb25zdCBoYXNFeGlzdGluZ1dlYlNlcnZlciA9IEJvb2xlYW4ocGFyc2VkLnByb3BlcnRpZXMud2ViU2VydmVyKTtcbiAgICAvLyBPbmx5IGRyb3Agd2JmeSdzIGRlZmF1bHQgc2VydmVyIGNvbW1hbmQuIFJlcG9zIHdpdGggY3VzdG9tIFBsYXl3cmlnaHRcbiAgICAvLyBzZXJ2ZXIgc2V0dXAgc3RpbGwgbmVlZCBpdCBldmVuIHdoZW4gdGhleSBkbyBub3QgZXhwb3NlIHN0YXJ0LXRlc3Qtc2VydmVyLlxuICAgIGlmICghaGFzU3RhcnRUZXN0U2VydmVyICYmICFoYXNFeGlzdGluZ1dlYlNlcnZlcikge1xuICAgICAgZGVsZXRlIG1lcmdlZC5wcm9wZXJ0aWVzLndlYlNlcnZlcjtcbiAgICB9XG4gICAgc2V0V2ViU2VydmVyQ29tbWFuZChjb25maWcsIG1lcmdlZCk7XG5cbiAgICBjb25zdCBuZXdPYmplY3RMaXRlcmFsID0gc3RyaW5naWZ5VmFsdWUoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlZCB9LCAwKTtcbiAgICBjb25zdCBzdGFydCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRTdGFydChleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgY29uc3QgZW5kID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldEVuZCgpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIHN0YXJ0KX0ke25ld09iamVjdExpdGVyYWx9JHtvbGRDb250ZW50LnNsaWNlKGVuZCl9YDtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZTogUGFyc2VkT2JqZWN0LCBvdmVycmlkZTogUGFyc2VkT2JqZWN0KTogUGFyc2VkT2JqZWN0IHtcbiAgY29uc3Qgb3ZlcnJpZGVQcm9wZXJ0eUtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG92ZXJyaWRlLnByb3BlcnRpZXMpKTtcbiAgY29uc3QgZXh0cmFNZW1iZXJzID0gWy4uLmJhc2UuZXh0cmFNZW1iZXJzLCAuLi5vdmVycmlkZS5leHRyYU1lbWJlcnNdO1xuICAvLyBLZWVwIGRlZmF1bHQtb25seSBtZW1iZXJzIGJlZm9yZSBwYXJzZWQgbWVtYmVycyBzbyBzcHJlYWRzIGFuZCBleHBsaWNpdCBsb2NhbCBwcm9wZXJ0aWVzIHJldGFpbiBwcmVjZWRlbmNlLlxuICBjb25zdCBtZW1iZXJPcmRlciA9IFtcbiAgICAuLi5iYXNlLm1lbWJlck9yZGVyLmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIua2luZCAhPT0gJ3Byb3BlcnR5JyB8fCAhb3ZlcnJpZGVQcm9wZXJ0eUtleXMuaGFzKG1lbWJlci5rZXkpKSxcbiAgICAuLi5vdmVycmlkZS5tZW1iZXJPcmRlci5tYXAoKG1lbWJlcik6IE9iamVjdE1lbWJlciA9PiB7XG4gICAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHJldHVybiBtZW1iZXI7XG4gICAgICByZXR1cm4geyBraW5kOiAnZXh0cmEnLCBpbmRleDogYmFzZS5leHRyYU1lbWJlcnMubGVuZ3RoICsgbWVtYmVyLmluZGV4IH07XG4gICAgfSksXG4gIF07XG4gIGNvbnN0IHByb3BlcnRpZXMgPSB7IC4uLmJhc2UucHJvcGVydGllcyB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvdmVycmlkZS5wcm9wZXJ0aWVzKSkge1xuICAgIHByb3BlcnRpZXNba2V5XSA9IG1lcmdlUGFyc2VkVmFsdWUocHJvcGVydGllc1trZXldLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHsgZXh0cmFNZW1iZXJzLCBtZW1iZXJPcmRlciwgcHJvcGVydGllcyB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZFZhbHVlKGJhc2U6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkLCBvdmVycmlkZTogUGFyc2VkVmFsdWUpOiBQYXJzZWRWYWx1ZSB7XG4gIGlmIChiYXNlPy5raW5kID09PSAnb2JqZWN0JyAmJiBvdmVycmlkZS5raW5kID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2UudmFsdWUsIG92ZXJyaWRlLnZhbHVlKSB9O1xuICB9XG4gIHJldHVybiBvdmVycmlkZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXNzZXJ0TmV4dFB1YmxpY0Jhc2VVcmwoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3QgZW52RmlsZVBhdGggb2YgZ2V0RW52RmlsZVBhdGhzKGRpclBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICgvTkVYVF9QVUJMSUNfQkFTRV9VUkxcXHMqPS9tLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBlbnYgZmlsZXMgYXJlIGV4cGVjdGVkIGluIHNvbWUgcmVwb3MuXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdORVhUX1BVQkxJQ19CQVNFX1VSTCBpcyByZXF1aXJlZCBmb3IgUGxheXdyaWdodC4gRGVmaW5lIE5FWFRfUFVCTElDX0JBU0VfVVJMIGluIHRoZSB0YXJnZXQgcmVwby4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0RW52RmlsZVBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZW52RmlsZU5hbWVzID0gWycuZW52JywgJy5lbnYudGVzdCcsICcuZW52LmV4YW1wbGUnLCAnbWlzZS50b21sJywgJ21pc2UudGVzdC50b21sJ107XG4gIGNvbnN0IGVudkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTsgOyBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCkpIHtcbiAgICBlbnZGaWxlUGF0aHMucHVzaCguLi5lbnZGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gcGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCBmaWxlTmFtZSkpKTtcblxuICAgIC8vIFBsYXl3cmlnaHQgY29uZmlncyBvZnRlbiBsaXZlIGluIHBhY2thZ2VzLyogd2hpbGUgc2hhcmVkIGVudiBmaWxlcyBsaXZlIGF0IHRoZVxuICAgIC8vIHJlcG9zaXRvcnkgcm9vdCwgc28gd2FsayB1cHdhcmQgdW50aWwgdGhlIHRhcmdldCByZXBvIGJvdW5kYXJ5LlxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgJy5naXQnKSkpIGJyZWFrO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBlbnZGaWxlUGF0aHM7XG59XG5cbmZ1bmN0aW9uIHNldFdlYlNlcnZlckNvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvYmplY3Q6IFBhcnNlZE9iamVjdCk6IHZvaWQge1xuICBjb25zdCB3ZWJTZXJ2ZXIgPSBvYmplY3QucHJvcGVydGllcy53ZWJTZXJ2ZXI7XG4gIGlmICh3ZWJTZXJ2ZXI/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgLy8gd2JmeSBvd25zIHRoZSBwYWNrYWdlIHNjcmlwdCwgc28gUGxheXdyaWdodCBzaG91bGQgY29uc2lzdGVudGx5IGNhbGwgdGhhdFxuICAvLyBzY3JpcHQgd2hpbGUgcHJlc2VydmluZyB0aGUgcmVzdCBvZiBlYWNoIHJlcG9zaXRvcnkncyB3ZWJTZXJ2ZXIgc2V0dGluZ3MuXG4gIHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQgPSBsaXRlcmFsKGNvbmZpZy5pc0J1biA/IFwiJ2J1biBzdGFydC10ZXN0LXNlcnZlcidcIiA6IFwiJ3lhcm4gc3RhcnQtdGVzdC1zZXJ2ZXInXCIpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChjb250ZW50OiBzdHJpbmcpOiBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gdHMuY3JlYXRlU291cmNlRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnLCBjb250ZW50LCB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LCB0cnVlLCB0cy5TY3JpcHRLaW5kLlRTKTtcblxuICAvLyBUeXBlU2NyaXB0IGFscmVhZHkgdW5kZXJzdGFuZHMgbmVzdGVkIG9iamVjdCBsaXRlcmFscyBhbmQgdGVtcGxhdGUgc3RyaW5ncywgc28gdXNlXG4gIC8vIGl0cyBBU1QgcmFuZ2VzIGluc3RlYWQgb2YgYSByZWdleCB0aGF0IGNhbiBzdG9wIGF0IHRoZSBmaXJzdCBpbm5lciBjbG9zaW5nIGJyYWNlLlxuICBsZXQgZm91bmQ6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiB0cy5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgaWYgKHRzLmlzQ2FsbEV4cHJlc3Npb24obm9kZSkgJiYgbm9kZS5leHByZXNzaW9uLmdldFRleHQoc291cmNlKSA9PT0gJ2RlZmluZUNvbmZpZycpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXJndW1lbnQgPSBub2RlLmFyZ3VtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdEFyZ3VtZW50ICYmIHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZmlyc3RBcmd1bWVudCkpIHtcbiAgICAgICAgZm91bmQgPSBmaXJzdEFyZ3VtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdCk7XG4gIH07XG4gIHZpc2l0KHNvdXJjZSk7XG5cbiAgcmV0dXJuIGZvdW5kID8geyBzb3VyY2UsIG5vZGU6IGZvdW5kIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiB0cy5FeHByZXNzaW9uLCBzb3VyY2U6IHRzLlNvdXJjZUZpbGUpOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uLCBzb3VyY2UpO1xuICAgIHJldHVybiBwYXJzZWRPYmplY3QgPyB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkT2JqZWN0IH0gOiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgfVxuICBpZiAodHMuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBleHByZXNzaW9uLmVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gcGFyc2VFeHByZXNzaW9uKGVsZW1lbnQsIHNvdXJjZSkpO1xuICAgIGlmIChlbGVtZW50cy5zb21lKChlbGVtZW50KTogZWxlbWVudCBpcyB1bmRlZmluZWQgPT4gZWxlbWVudCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYXNBcnJheShlbGVtZW50cyBhcyBQYXJzZWRWYWx1ZVtdKTtcbiAgfVxuICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oXG4gIG9iamVjdExpdGVyYWw6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uLFxuICBzb3VyY2U6IHRzLlNvdXJjZUZpbGVcbik6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZDogUGFyc2VkT2JqZWN0ID0geyBleHRyYU1lbWJlcnM6IFtdLCBtZW1iZXJPcmRlcjogW10sIHByb3BlcnRpZXM6IHt9IH07XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgaWYgKHRzLmlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSkge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gbGl0ZXJhbChrZXkpO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCF0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgfHwgKCF0cy5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgJiYgIXRzLmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSkpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VkLmV4dHJhTWVtYmVycy5wdXNoKHByb3BlcnR5LmdldFRleHQoc291cmNlKSkgLSAxO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlWYWx1ZSh2YWx1ZTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgIGlmICh2YWx1ZS52YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICAgIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gICAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICAgIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbMF19YDtcbiAgICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYFtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH1dYDtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG5cbiAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgY29uc3QgZW1pdHRlZFByb3BlcnRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkodmFsdWUudmFsdWUubWVtYmVyT3JkZXIpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyLmZsYXRNYXAoKG1lbWJlciwgaW5kZXgpID0+IHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdleHRyYScpIHtcbiAgICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0TWVtYmVyKHZhbHVlLnZhbHVlLmV4dHJhTWVtYmVyc1ttZW1iZXIuaW5kZXhdID8/ICcnLCBpbmRlbnQpXTtcbiAgICB9XG5cbiAgICBpZiAobGFzdFByb3BlcnR5SW5kZXhCeUtleS5nZXQobWVtYmVyLmtleSkgIT09IGluZGV4KSByZXR1cm4gW107XG4gICAgY29uc3QgaXRlbSA9IHZhbHVlLnZhbHVlLnByb3BlcnRpZXNbbWVtYmVyLmtleV07XG4gICAgaWYgKCFpdGVtIHx8IGVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhtZW1iZXIua2V5KSkgcmV0dXJuIFtdO1xuICAgIGVtaXR0ZWRQcm9wZXJ0aWVzLmFkZChtZW1iZXIua2V5KTtcbiAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdFByb3BlcnR5KG1lbWJlci5rZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpXTtcbiAgfSk7XG4gIGxpbmVzLnB1c2goXG4gICAgLi4uT2JqZWN0LmVudHJpZXModmFsdWUudmFsdWUucHJvcGVydGllcylcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhZW1pdHRlZFByb3BlcnRpZXMuaGFzKGtleSkpXG4gICAgICAubWFwKChba2V5LCBpdGVtXSkgPT4gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KSlcbiAgKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGB7XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xuICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH19YDtcbn1cblxuZnVuY3Rpb24gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleShtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW10pOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBtZW1iZXJdIG9mIG1lbWJlck9yZGVyLmVudHJpZXMoKSkge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgbGFzdFByb3BlcnR5SW5kZXhCeUtleS5zZXQobWVtYmVyLmtleSwgaW5kZXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGFzdFByb3BlcnR5SW5kZXhCeUtleTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5OiBzdHJpbmcsIGl0ZW06IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICB9XG4gIH1cbiAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtrZXl9OiAke3N0cmluZ2lmaWVkWzBdfWA7XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0TWVtYmVyKG1lbWJlcjogc3RyaW5nLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gbWVtYmVyLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBzdHJpbmdpZmllZC5lbnRyaWVzKCkpIHtcbiAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtsaW5lfWA7XG4gIH1cbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNob3VsZEFkZENvbm5lY3Rpb25MaW1pdCA9IHNob3VsZEFkZFNxbGl0ZUNvbm5lY3Rpb25MaW1pdChjb25maWcpO1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyouZW52JywgJyouZW52LionXSwgeyBkb3Q6IHRydWUsIGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoXG4gICAgICAgIC9EQVRBQkFTRV9VUkxcXHMqPVxccypcIj8oW15cIiNcXG5dKz9cXC5zcWxpdGUzW15cIiNcXG5dKilcIj8vZyxcbiAgICAgICAgKG1hdGNoLCB1cmw6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJldHVybiBgREFUQUJBU0VfVVJMPVwiJHtub3JtYWxpemVTcWxpdGVEYXRhYmFzZVVybCh1cmwsIHNob3VsZEFkZENvbm5lY3Rpb25MaW1pdCl9XCJgO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKG5ld0NvbnRlbnQgIT09IGNvbnRlbnQpIHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGVudkZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzaG91bGRBZGRTcWxpdGVDb25uZWN0aW9uTGltaXQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gIH07XG5cbiAgLy8gYGNvbm5lY3Rpb25fbGltaXQ9MWAgb25seSBhcHBsaWVzIHRvIFByaXNtYSdzIFNRTGl0ZSBkYXRhc291cmNlIGhhbmRsaW5nLlxuICAvLyBSZXBvcyB0aGF0IG9wdCBpbnRvIG5vbi1wdXJlIFNRTGl0ZSBhZGFwdGVycyBzaG91bGQga2VlcCB0aGVpciBVUkwgYXMtaXMuXG4gIHJldHVybiAhZGVwZW5kZW5jaWVzWydAcHJpc21hL2FkYXB0ZXItYmV0dGVyLXNxbGl0ZTMnXSAmJiAhZGVwZW5kZW5jaWVzWydAcHJpc21hL2FkYXB0ZXItbGlic3FsJ107XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNxbGl0ZURhdGFiYXNlVXJsKHVybDogc3RyaW5nLCBzaG91bGRBZGRDb25uZWN0aW9uTGltaXQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBxdWVyeVN0YXJ0ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgY29uc3QgcGF0aFBhcnQgPSBxdWVyeVN0YXJ0ICE9PSAtMSA/IHVybC5zbGljZSgwLCBxdWVyeVN0YXJ0KSA6IHVybDtcbiAgY29uc3QgcXVlcnlQYXJ0ID0gcXVlcnlTdGFydCAhPT0gLTEgPyB1cmwuc2xpY2UocXVlcnlTdGFydCArIDEpIDogJyc7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocXVlcnlQYXJ0KTtcblxuICBwYXJhbXMuZGVsZXRlKCdjb25uZWN0aW9uX2xpbWl0Jyk7XG4gIGlmIChzaG91bGRBZGRDb25uZWN0aW9uTGltaXQpIHtcbiAgICBwYXJhbXMuc2V0KCdjb25uZWN0aW9uX2xpbWl0JywgJzEnKTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRRdWVyeSA9IHBhcmFtcy50b1N0cmluZygpO1xuICByZXR1cm4gbm9ybWFsaXplZFF1ZXJ5ID8gYCR7cGF0aFBhcnR9PyR7bm9ybWFsaXplZFF1ZXJ5fWAgOiBwYXRoUGFydDtcbn1cbiIsImNvbnN0IGhhcyA9IChvYmplY3QsIGtleSkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0T2JqZWN0QnlLZXlOYW1lTGlzdChvYmplY3QsIHNvcnRXaXRoKSB7XG4gIGxldCBrZXlzLCBzb3J0Rm4sIGtleVxuXG4gIGlmICh0eXBlb2Ygc29ydFdpdGggPT09ICdmdW5jdGlvbicpIHtcbiAgICBzb3J0Rm4gPSBzb3J0V2l0aFxuICB9IGVsc2Uge1xuICAgIGtleXMgPSBzb3J0V2l0aFxuICB9XG5cbiAgY29uc3QgdG90YWwgPSB7fVxuICBjb25zdCBvYmplY3RLZXlzID0gWy4uLihrZXlzID8/IFtdKSwgLi4uT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KHNvcnRGbildXG5cbiAgZm9yIChrZXkgb2Ygb2JqZWN0S2V5cykge1xuICAgIGlmIChoYXMob2JqZWN0LCBrZXkpKSB7XG4gICAgICB0b3RhbFtrZXldID0gb2JqZWN0W2tleV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG90YWxcbn1cbiIsIi8vIERldGVjdCBlaXRoZXIgc3BhY2VzIG9yIHRhYnMgYnV0IG5vdCBib3RoIHRvIHByb3Blcmx5IGhhbmRsZSB0YWJzIGZvciBpbmRlbnRhdGlvbiBhbmQgc3BhY2VzIGZvciBhbGlnbm1lbnRcbmNvbnN0IElOREVOVF9SRUdFWCA9IC9eKD86KCApK3xcXHQrKS87XG5cbmNvbnN0IElOREVOVF9UWVBFX1NQQUNFID0gJ3NwYWNlJztcbmNvbnN0IElOREVOVF9UWVBFX1RBQiA9ICd0YWInO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIGlnbm9yZSBzaW5nbGUgc3BhY2UgcGF0dGVybnNcbmZ1bmN0aW9uIHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgdmFsdWUpIHtcblx0cmV0dXJuIGlnbm9yZVNpbmdsZVNwYWNlcyAmJiBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSAmJiB2YWx1ZSA9PT0gMTtcbn1cblxuLyoqXG5NYWtlIGEgTWFwIHRoYXQgY291bnRzIGhvdyBtYW55IGluZGVudHMvdW5pbmRlbnRzIGhhdmUgb2NjdXJyZWQgZm9yIGEgZ2l2ZW4gc2l6ZSBhbmQgaG93IG1hbnkgbGluZXMgZm9sbG93IGEgZ2l2ZW4gaW5kZW50YXRpb24uXG5cblRoZSBrZXkgaXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBpbmRlbnRhdGlvbiB0eXBlIChzID0gc3BhY2UgYW5kIHQgPSB0YWIpIGFuZCB0aGUgc2l6ZSBvZiB0aGUgaW5kZW50cy91bmluZGVudHMuXG5cbmBgYFxuaW5kZW50cyA9IHtcblx0dDM6IFsxLCAwXSxcblx0dDQ6IFsxLCA1XSxcblx0czU6IFsxLCAwXSxcblx0czEyOiBbMSwgMF0sXG59XG5gYGBcbiovXG5mdW5jdGlvbiBtYWtlSW5kZW50c01hcChzdHJpbmcsIGlnbm9yZVNpbmdsZVNwYWNlcykge1xuXHRjb25zdCBpbmRlbnRzID0gbmV3IE1hcCgpO1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBzaXplIG9mIHByZXZpb3VzIGxpbmUncyBpbmRlbnRhdGlvblxuXHRsZXQgcHJldmlvdXNTaXplID0gMDtcblx0bGV0IHByZXZpb3VzSW5kZW50VHlwZTtcblxuXHQvLyBJbmRlbnRzIGtleSAoaWRlbnQgdHlwZSArIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzKVxuXHRsZXQga2V5O1xuXG5cdGZvciAoY29uc3QgbGluZSBvZiBzdHJpbmcuc3BsaXQoL1xcbi9nKSkge1xuXHRcdGlmICghbGluZSkge1xuXHRcdFx0Ly8gSWdub3JlIGVtcHR5IGxpbmVzXG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCBtYXRjaGVzID0gbGluZS5tYXRjaChJTkRFTlRfUkVHRVgpO1xuXG5cdFx0aWYgKG1hdGNoZXMgPT09IG51bGwpIHtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHRwcmV2aW91c0luZGVudFR5cGUgPSAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgaW5kZW50ID0gbWF0Y2hlc1swXS5sZW5ndGg7XG5cdFx0XHRjb25zdCBpbmRlbnRUeXBlID0gbWF0Y2hlc1sxXSA/IElOREVOVF9UWVBFX1NQQUNFIDogSU5ERU5UX1RZUEVfVEFCO1xuXG5cdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIHVubGVzcyBpdCdzIHRoZSBvbmx5IGluZGVudCBkZXRlY3RlZCB0byBwcmV2ZW50IGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXNcblx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGluZGVudCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpbmRlbnRUeXBlICE9PSBwcmV2aW91c0luZGVudFR5cGUpIHtcblx0XHRcdFx0cHJldmlvdXNTaXplID0gMDtcblx0XHRcdH1cblxuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gaW5kZW50VHlwZTtcblxuXHRcdFx0bGV0IHVzZSA9IDE7XG5cdFx0XHRsZXQgd2VpZ2h0ID0gMDtcblxuXHRcdFx0Y29uc3QgaW5kZW50RGlmZmVyZW5jZSA9IGluZGVudCAtIHByZXZpb3VzU2l6ZTtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IGluZGVudDtcblxuXHRcdFx0Ly8gUHJldmlvdXMgbGluZSBoYXZlIHNhbWUgaW5kZW50P1xuXHRcdFx0aWYgKGluZGVudERpZmZlcmVuY2UgPT09IDApIHtcblx0XHRcdFx0Ly8gTm90IGEgbmV3IFwidXNlXCIgb2YgdGhlIGN1cnJlbnQgaW5kZW50OlxuXHRcdFx0XHR1c2UgPSAwO1xuXHRcdFx0XHQvLyBCdXQgZG8gYWRkIGEgYml0IHRvIGl0IGZvciBicmVha2luZyB0aWVzOlxuXHRcdFx0XHR3ZWlnaHQgPSAxO1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIGtleSBmcm9tIHByZXZpb3VzIGxvb3Bcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSA9IE1hdGguYWJzKGluZGVudERpZmZlcmVuY2UpO1xuXG5cdFx0XHRcdC8vIElnbm9yZSBzaW5nbGUgc3BhY2UgY2hhbmdlcyB3aGVuIGlnbm9yZVNpbmdsZVNwYWNlcyBpcyB0cnVlXG5cdFx0XHRcdC8vIFRoaXMgcHJldmVudHMgY29tbW9uIGZhbHNlIHBvc2l0aXZlcyBmcm9tIHRoaW5ncyBsaWtlIGFsaWduZWQgY29tbWVudHNcblx0XHRcdFx0aWYgKHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0gZW5jb2RlSW5kZW50c0tleShpbmRlbnRUeXBlLCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHN0YXRzXG5cdFx0XHRjb25zdCBlbnRyeSA9IGluZGVudHMuZ2V0KGtleSk7XG5cdFx0XHRpbmRlbnRzLnNldChrZXksIGVudHJ5ID09PSB1bmRlZmluZWQgPyBbMSwgMF0gOiBbZW50cnlbMF0gKyB1c2UsIGVudHJ5WzFdICsgd2VpZ2h0XSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGluZGVudHM7XG59XG5cbi8vIEVuY29kZSB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBhcyBhIHN0cmluZyAoZS5nLiAnczQnKSBmb3IgdXNlIGFzIGEgY29tcG91bmQga2V5IGluIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgaW5kZW50QW1vdW50KSB7XG5cdGNvbnN0IHR5cGVDaGFyYWN0ZXIgPSBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICdzJyA6ICd0Jztcblx0cmV0dXJuIHR5cGVDaGFyYWN0ZXIgKyBTdHJpbmcoaW5kZW50QW1vdW50KTtcbn1cblxuLy8gRXh0cmFjdCB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBmcm9tIGEga2V5IG9mIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGRlY29kZUluZGVudHNLZXkoaW5kZW50c0tleSkge1xuXHRjb25zdCBrZXlIYXNUeXBlU3BhY2UgPSBpbmRlbnRzS2V5WzBdID09PSAncyc7XG5cdGNvbnN0IHR5cGUgPSBrZXlIYXNUeXBlU3BhY2UgPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRjb25zdCBhbW91bnQgPSBOdW1iZXIoaW5kZW50c0tleS5zbGljZSgxKSk7XG5cblx0cmV0dXJuIHt0eXBlLCBhbW91bnR9O1xufVxuXG4vLyBSZXR1cm4gdGhlIGtleSAoZS5nLiAnczQnKSBmcm9tIHRoZSBpbmRlbnRzIE1hcCB0aGF0IHJlcHJlc2VudHMgdGhlIG1vc3QgY29tbW9uIGluZGVudCxcbi8vIG9yIHJldHVybiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIGluZGVudHMuXG5mdW5jdGlvbiBnZXRNb3N0VXNlZEtleShpbmRlbnRzKSB7XG5cdGxldCByZXN1bHQ7XG5cdGxldCBtYXhVc2VkID0gMDtcblx0bGV0IG1heFdlaWdodCA9IDA7XG5cblx0Zm9yIChjb25zdCBba2V5LCBbdXNlZENvdW50LCB3ZWlnaHRdXSBvZiBpbmRlbnRzKSB7XG5cdFx0aWYgKHVzZWRDb3VudCA+IG1heFVzZWQgfHwgKHVzZWRDb3VudCA9PT0gbWF4VXNlZCAmJiB3ZWlnaHQgPiBtYXhXZWlnaHQpKSB7XG5cdFx0XHRtYXhVc2VkID0gdXNlZENvdW50O1xuXHRcdFx0bWF4V2VpZ2h0ID0gd2VpZ2h0O1xuXHRcdFx0cmVzdWx0ID0ga2V5O1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KSB7XG5cdGNvbnN0IGluZGVudENoYXJhY3RlciA9IHR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFID8gJyAnIDogJ1xcdCc7XG5cdHJldHVybiBpbmRlbnRDaGFyYWN0ZXIucmVwZWF0KGFtb3VudCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdEluZGVudChzdHJpbmcpIHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdC8vIElkZW50aWZ5IGluZGVudHMgd2hpbGUgc2tpcHBpbmcgc2luZ2xlIHNwYWNlIGluZGVudHMgdG8gYXZvaWQgY29tbW9uIGVkZ2UgY2FzZXMgKGUuZy4gY29kZSBjb21tZW50cylcblx0Ly8gSWYgbm8gaW5kZW50cyBhcmUgaWRlbnRpZmllZCwgcnVuIGFnYWluIGFuZCBpbmNsdWRlIGFsbCBpbmRlbnRzIGZvciBjb21wcmVoZW5zaXZlIGRldGVjdGlvblxuXHRsZXQgaW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgdHJ1ZSk7XG5cdGlmIChpbmRlbnRzLnNpemUgPT09IDApIHtcblx0XHRpbmRlbnRzID0gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBmYWxzZSk7XG5cdH1cblxuXHRjb25zdCBrZXlPZk1vc3RVc2VkSW5kZW50ID0gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cyk7XG5cblx0bGV0IHR5cGU7XG5cdGxldCBhbW91bnQgPSAwO1xuXHRsZXQgaW5kZW50ID0gJyc7XG5cblx0aWYgKGtleU9mTW9zdFVzZWRJbmRlbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdCh7dHlwZSwgYW1vdW50fSA9IGRlY29kZUluZGVudHNLZXkoa2V5T2ZNb3N0VXNlZEluZGVudCkpO1xuXHRcdGluZGVudCA9IG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0YW1vdW50LFxuXHRcdHR5cGUsXG5cdFx0aW5kZW50LFxuXHR9O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGRldGVjdE5ld2xpbmUoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHRjb25zdCBuZXdsaW5lcyA9IHN0cmluZy5tYXRjaCgvKD86XFxyP1xcbikvZykgfHwgW107XG5cblx0aWYgKG5ld2xpbmVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGNybGYgPSBuZXdsaW5lcy5maWx0ZXIobmV3bGluZSA9PiBuZXdsaW5lID09PSAnXFxyXFxuJykubGVuZ3RoO1xuXHRjb25zdCBsZiA9IG5ld2xpbmVzLmxlbmd0aCAtIGNybGY7XG5cblx0cmV0dXJuIGNybGYgPiBsZiA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lR3JhY2VmdWwoc3RyaW5nKSB7XG5cdHJldHVybiAodHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycgJiYgZGV0ZWN0TmV3bGluZShzdHJpbmcpKSB8fCAnXFxuJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHNvcnRPYmplY3RLZXlzIGZyb20gJ3NvcnQtb2JqZWN0LWtleXMnXG5pbXBvcnQgZGV0ZWN0SW5kZW50IGZyb20gJ2RldGVjdC1pbmRlbnQnXG5pbXBvcnQgeyBkZXRlY3ROZXdsaW5lR3JhY2VmdWwgYXMgZGV0ZWN0TmV3bGluZSB9IGZyb20gJ2RldGVjdC1uZXdsaW5lJ1xuaW1wb3J0IGdpdEhvb2tzIGZyb20gJ2dpdC1ob29rcy1saXN0J1xuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnaXMtcGxhaW4tb2JqJ1xuaW1wb3J0IHNlbXZlckNvbXBhcmUgZnJvbSAnc2VtdmVyL2Z1bmN0aW9ucy9jb21wYXJlLmpzJ1xuaW1wb3J0IHNlbXZlck1pblZlcnNpb24gZnJvbSAnc2VtdmVyL3Jhbmdlcy9taW4tdmVyc2lvbi5qcydcblxuY29uc3QgcGlwZSA9XG4gIChmbnMpID0+XG4gICh4LCAuLi5hcmdzKSA9PlxuICAgIGZucy5yZWR1Y2UoKHJlc3VsdCwgZm4pID0+IGZuKHJlc3VsdCwgLi4uYXJncyksIHgpXG5jb25zdCBvbkFycmF5ID0gKGZuKSA9PiAoeCkgPT4gKEFycmF5LmlzQXJyYXkoeCkgPyBmbih4KSA6IHgpXG5jb25zdCBvblN0cmluZ0FycmF5ID0gKGZuKSA9PiAoeCkgPT5cbiAgQXJyYXkuaXNBcnJheSh4KSAmJiB4LmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpID8gZm4oeCkgOiB4XG5jb25zdCB1bmlxID0gb25TdHJpbmdBcnJheSgoeHMpID0+IFsuLi5uZXcgU2V0KHhzKV0pXG5jb25zdCBzb3J0QXJyYXkgPSBvblN0cmluZ0FycmF5KChhcnJheSkgPT4gYXJyYXkudG9Tb3J0ZWQoKSlcbmNvbnN0IHVuaXFBbmRTb3J0QXJyYXkgPSBwaXBlKFt1bmlxLCBzb3J0QXJyYXldKVxuY29uc3Qgb25PYmplY3QgPVxuICAoZm4pID0+XG4gICh4LCAuLi5hcmdzKSA9PlxuICAgIGlzUGxhaW5PYmplY3QoeCkgPyBmbih4LCAuLi5hcmdzKSA6IHhcbmNvbnN0IHNvcnRPYmplY3RCeSA9IChjb21wYXJhdG9yLCBkZWVwKSA9PiB7XG4gIGNvbnN0IG92ZXIgPSBvbk9iamVjdCgob2JqZWN0KSA9PiB7XG4gICAgaWYgKGRlZXApIHtcbiAgICAgIG9iamVjdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMob2JqZWN0KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgb3Zlcih2YWx1ZSldKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydE9iamVjdEtleXMob2JqZWN0LCBjb21wYXJhdG9yKVxuICB9KVxuXG4gIHJldHVybiBvdmVyXG59XG5jb25zdCBvYmplY3RHcm91cEJ5ID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvZXMtYnVpbHRpbnMsIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvZXMtc3ludGF4IC0tIFNhZmVcbiAgT2JqZWN0Lmdyb3VwQnkgfHxcbiAgLy8gUmVtb3ZlIHRoaXMgd2hlbiB3ZSBkcm9wIHN1cHBvcnQgZm9yIE5vZGUuanMgMjBcbiAgKChhcnJheSwgY2FsbGJhY2spID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhcnJheSkge1xuICAgICAgY29uc3Qga2V5ID0gY2FsbGJhY2sodmFsdWUpXG4gICAgICBpZiAocmVzdWx0W2tleV0pIHtcbiAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gW3ZhbHVlXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH0pXG5jb25zdCBzb3J0T2JqZWN0ID0gc29ydE9iamVjdEJ5KClcbmNvbnN0IHNvcnRVUkxPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyd0eXBlJywgJ3VybCddKVxuY29uc3Qgc29ydFBlb3BsZU9iamVjdCA9IHNvcnRPYmplY3RCeShbJ25hbWUnLCAnZW1haWwnLCAndXJsJ10pXG5jb25zdCBzb3J0RGlyZWN0b3JpZXMgPSBzb3J0T2JqZWN0QnkoW1xuICAnbGliJyxcbiAgJ2JpbicsXG4gICdtYW4nLFxuICAnZG9jJyxcbiAgJ2V4YW1wbGUnLFxuICAndGVzdCcsXG5dKVxuY29uc3Qgb3ZlclByb3BlcnR5ID0gKHByb3BlcnR5LCBvdmVyKSA9PlxuICBvbk9iamVjdCgob2JqZWN0LCAuLi5hcmdzKSA9PlxuICAgIE9iamVjdC5oYXNPd24ob2JqZWN0LCBwcm9wZXJ0eSlcbiAgICAgID8geyAuLi5vYmplY3QsIFtwcm9wZXJ0eV06IG92ZXIob2JqZWN0W3Byb3BlcnR5XSwgLi4uYXJncykgfVxuICAgICAgOiBvYmplY3QsXG4gIClcbmNvbnN0IHNvcnRHaXRIb29rcyA9IHNvcnRPYmplY3RCeShnaXRIb29rcylcblxuY29uc3QgcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlID0gKHNwZWNpZmllcikgPT4ge1xuICAvLyBJZ25vcmUgYW55dGhpbmcgYWZ0ZXIgPiAmIHJlbHkgb24gZmFsbGJhY2sgYWxwaGFudW1lcmljIHNvcnRpbmcgZm9yIHRoYXRcbiAgY29uc3QgW25hbWVBbmRWZXJzaW9uXSA9IHNwZWNpZmllci5zcGxpdCgnPicpXG4gIGNvbnN0IGF0TWF0Y2hlcyA9IFsuLi5uYW1lQW5kVmVyc2lvbi5tYXRjaEFsbCgnQCcpXVxuICBpZiAoXG4gICAgIWF0TWF0Y2hlcy5sZW5ndGggfHxcbiAgICAoYXRNYXRjaGVzLmxlbmd0aCA9PT0gMSAmJiBhdE1hdGNoZXNbMF0uaW5kZXggPT09IDApXG4gICkge1xuICAgIHJldHVybiB7IG5hbWU6IHNwZWNpZmllciB9XG4gIH1cbiAgY29uc3Qgc3BsaXRJbmRleCA9IGF0TWF0Y2hlcy5wb3AoKS5pbmRleFxuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZygwLCBzcGxpdEluZGV4KSxcbiAgICByYW5nZTogbmFtZUFuZFZlcnNpb24uc3Vic3RyaW5nKHNwbGl0SW5kZXggKyAxKSxcbiAgfVxufVxuXG5jb25zdCBzb3J0T2JqZWN0QnlTZW12ZXIgPSBzb3J0T2JqZWN0QnkoKGEsIGIpID0+IHtcbiAgY29uc3QgeyBuYW1lOiBhTmFtZSwgcmFuZ2U6IGFSYW5nZSB9ID0gcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlKGEpXG4gIGNvbnN0IHsgbmFtZTogYk5hbWUsIHJhbmdlOiBiUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShiKVxuXG4gIGlmIChhTmFtZSAhPT0gYk5hbWUpIHtcbiAgICByZXR1cm4gYU5hbWUubG9jYWxlQ29tcGFyZShiTmFtZSwgJ2VuJylcbiAgfVxuICBpZiAoIWFSYW5nZSkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmICghYlJhbmdlKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuICByZXR1cm4gc2VtdmVyQ29tcGFyZShzZW12ZXJNaW5WZXJzaW9uKGFSYW5nZSksIHNlbXZlck1pblZlcnNpb24oYlJhbmdlKSlcbn0pXG5cbmNvbnN0IGdldFBhY2thZ2VOYW1lID0gKGlkZW50KSA9PiB7XG4gIGNvbnN0IGluZGV4ID0gaWRlbnQuaW5kZXhPZignQCcsIGlkZW50LnN0YXJ0c1dpdGgoJ0AnKSA/IDEgOiAwKVxuICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCB1bmxlc3MgdXNlciBtYW51YWxseSBlZGl0IHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICByZXR1cm4gaW5kZXggPT09IC0xID8gaWRlbnQgOiBpZGVudC5zbGljZSgwLCBpbmRleClcbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5SWRlbnQgPSAoYSwgYikgPT4ge1xuICBjb25zdCBwYWNrYWdlTmFtZUEgPSBnZXRQYWNrYWdlTmFtZShhKVxuICBjb25zdCBwYWNrYWdlTmFtZUIgPSBnZXRQYWNrYWdlTmFtZShiKVxuXG4gIGlmIChwYWNrYWdlTmFtZUEgPCBwYWNrYWdlTmFtZUIpIHJldHVybiAtMVxuICBpZiAocGFja2FnZU5hbWVBID4gcGFja2FnZU5hbWVCKSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBDYWNoZSBieSBgcHJvY2Vzcy5jd2QoKWAgaW5zdGVhZCBvZiBhIHZhcmlhYmxlIHRvIGFsbG93IHVzZXIgY2FsbCBgcHJvY2Vzcy5jaGRpcigpYFxuY29uc3QgY2FjaGUgPSBuZXcgTWFwKClcbmNvbnN0IGhhc1lhcm5PclBucG1GaWxlcyA9ICgpID0+IHtcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKVxuICBpZiAoIWNhY2hlLmhhcyhjd2QpKSB7XG4gICAgY2FjaGUuc2V0KFxuICAgICAgY3dkLFxuICAgICAgZnMuZXhpc3RzU3luYygneWFybi5sb2NrJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygnLnlhcm4vJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygnLnlhcm5yYy55bWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLWxvY2sueWFtbCcpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJ3BucG0td29ya3NwYWNlLnlhbWwnKSxcbiAgICApXG4gIH1cbiAgcmV0dXJuIGNhY2hlLmdldChjd2QpXG59XG5cbi8qKlxuICogRGV0ZWN0cyB0aGUgcGFja2FnZSBtYW5hZ2VyIGZyb20gcGFja2FnZS5qc29uIGFuZCBsb2NrIGZpbGVzXG4gKiBAcGFyYW0ge29iamVjdH0gcGFja2FnZUpzb24gLSBUaGUgcGFyc2VkIHBhY2thZ2UuanNvbiBvYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFRoZSBkZXRlY3RlZCBwYWNrYWdlIG1hbmFnZXIuIERlZmF1bHQgdG8gbnBtIGlmIG5vdCBkZXRlY3RlZC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pIHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9jb3JlcGFja1xuICBpZiAodHlwZW9mIHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlci5zdGFydHNXaXRoKCducG1AJylcbiAgfVxuXG4gIGlmIChwYWNrYWdlSnNvbi5kZXZFbmdpbmVzPy5wYWNrYWdlTWFuYWdlcj8ubmFtZSkge1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5kZXZFbmdpbmVzLnBhY2thZ2VNYW5hZ2VyLm5hbWUgPT09ICducG0nXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24ucG5wbSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gT3B0aW1pc2F0aW9uOiBDaGVjayBpZiBucG0gaXMgZXhwbGljaXQgYmVmb3JlIHJlYWRpbmcgRlMuXG4gIGlmIChwYWNrYWdlSnNvbi5lbmdpbmVzPy5ucG0pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKGhhc1lhcm5PclBucG1GaWxlcygpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIFNvcnQgZGVwZW5kZW5jaWVzIGFscGhhYmV0aWNhbGx5LCBkZXRlY3RpbmcgcGFja2FnZSBtYW5hZ2VyIHRvIHVzZSB0aGVcbiAqIGFwcHJvcHJpYXRlIGNvbXBhcmlzb24uIG5wbSB1c2VzIGxvY2FsZS1hd2FyZSBjb21wYXJpc29uLCB5YXJuIGFuZCBwbnBtIHVzZVxuICogc2ltcGxlIHN0cmluZyBjb21wYXJpc29uXG4gKi9cbmNvbnN0IHNvcnREZXBlbmRlbmNpZXMgPSBvbk9iamVjdCgoZGVwZW5kZW5jaWVzLCBwYWNrYWdlSnNvbikgPT4ge1xuICAvLyBBdm9pZCBmaWxlIGFjY2Vzc1xuICBpZiAoT2JqZWN0LmtleXMoZGVwZW5kZW5jaWVzKS5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIGRlcGVuZGVuY2llc1xuICB9XG5cbiAgLy8gc29ydCBkZXBzIGxpa2UgdGhlIG5wbSBDTEkgZG9lcyAodmlhIHRoZSBwYWNrYWdlIEBucG1jbGkvcGFja2FnZS1qc29uKVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbnBtL3BhY2thZ2UtanNvbi9ibG9iL2I2NDY1ZjQ0YzcyN2Q2NTEzZGI2ODk4YzdjYmU0MWRkMzU1Y2ViZTgvbGliL3VwZGF0ZS1kZXBlbmRlbmNpZXMuanMjTDgtTDIxXG4gIGlmIChzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbShwYWNrYWdlSnNvbikpIHtcbiAgICByZXR1cm4gc29ydE9iamVjdEtleXMoZGVwZW5kZW5jaWVzLCAoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIsICdlbicpKVxuICB9XG5cbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcylcbn0pXG5cbi8qKlxuICogXCJ3b3Jrc3BhY2VzXCIgY2FuIGJlIGFuIGFycmF5IChucG0gb3IgeWFybiBjbGFzc2ljKSBvciBhbiBvYmplY3QgKHBucG0vYnVuKS5cbiAqIEluIHRoZSBjYXNlIG9mIGFuIGFycmF5LCB3ZSBkbyBub3Qgd2FudCB0byBhbHBoYWJldGljYWxseSBzb3J0IGl0IGluIGNhc2VcbiAqIHNjcmlwdHMgbmVlZCB0byBydW4gaW4gYSBzcGVjaWZpYyBvcmRlci5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vY2xpL3Y3L3VzaW5nLW5wbS93b3Jrc3BhY2VzP3Y9dHJ1ZSNydW5uaW5nLWNvbW1hbmRzLWluLXRoZS1jb250ZXh0LW9mLXdvcmtzcGFjZXNcbiAqL1xuY29uc3Qgc29ydFdvcmtzcGFjZXMgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KFsncGFja2FnZXMnLCAnY2F0YWxvZyddKSxcbiAgb3ZlclByb3BlcnR5KCdwYWNrYWdlcycsIHVuaXFBbmRTb3J0QXJyYXkpLFxuICBvdmVyUHJvcGVydHkoJ2NhdGFsb2cnLCBzb3J0RGVwZW5kZW5jaWVzKSxcbl0pXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2Jsb2IvYWNjMGU0NzU3MmE5MzkwMjkyYjRlMzEzYjRhNGJmMzYwZDIzNjM1OC9jb25mL2NvbmZpZy1zY2hlbWEuanNcbmNvbnN0IGVzbGludEJhc2VDb25maWdQcm9wZXJ0aWVzID0gW1xuICAvLyBgZmlsZXNgIGFuZCBgZXhjbHVkZWRGaWxlc2AgYXJlIG9ubHkgb24gYG92ZXJyaWRlc1tdYFxuICAvLyBmb3IgZWFzaWVyIHNvcnQgYG92ZXJyaWRlc1tdYCxcbiAgLy8gYWRkIHRoZW0gdG8gaGVyZSwgc28gd2UgZG9uJ3QgbmVlZCBzb3J0IGBvdmVycmlkZXNbXWAgdHdpY2VcbiAgJ2ZpbGVzJyxcbiAgJ2V4Y2x1ZGVkRmlsZXMnLFxuICAvLyBiYXNlQ29uZmlnXG4gICdlbnYnLFxuICAncGFyc2VyJyxcbiAgJ3BhcnNlck9wdGlvbnMnLFxuICAnc2V0dGluZ3MnLFxuICAncGx1Z2lucycsXG4gICdleHRlbmRzJyxcbiAgJ3J1bGVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdnbG9iYWxzJyxcbiAgJ3Byb2Nlc3NvcicsXG4gICdub0lubGluZUNvbmZpZycsXG4gICdyZXBvcnRVbnVzZWREaXNhYmxlRGlyZWN0aXZlcycsXG5dXG5jb25zdCBzb3J0RXNsaW50Q29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyksXG4gIG92ZXJQcm9wZXJ0eSgnZW52Jywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eSgnZ2xvYmFscycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgb25BcnJheSgob3ZlcnJpZGVzKSA9PiBvdmVycmlkZXMubWFwKHNvcnRFc2xpbnRDb25maWcpKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KCdwYXJzZXJPcHRpb25zJywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAncnVsZXMnLFxuICAgIHNvcnRPYmplY3RCeShcbiAgICAgIChydWxlMSwgcnVsZTIpID0+XG4gICAgICAgIHJ1bGUxLnNwbGl0KCcvJykubGVuZ3RoIC0gcnVsZTIuc3BsaXQoJy8nKS5sZW5ndGggfHxcbiAgICAgICAgcnVsZTEubG9jYWxlQ29tcGFyZShydWxlMiksXG4gICAgKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KCdzZXR0aW5ncycsIHNvcnRPYmplY3QpLFxuXSlcbmNvbnN0IHNvcnRWU0NvZGVCYWRnZU9iamVjdCA9IHNvcnRPYmplY3RCeShbJ2Rlc2NyaXB0aW9uJywgJ3VybCcsICdocmVmJ10pXG5cbmNvbnN0IHNvcnRQcmV0dGllckNvbmZpZyA9IHBpcGUoW1xuICAvLyBzb3J0IGtleXMgYWxwaGFiZXRpY2FsbHksIGJ1dCBwdXQgYG92ZXJyaWRlc2AgYXQgYm90dG9tXG4gIG9uT2JqZWN0KChjb25maWcpID0+XG4gICAgc29ydE9iamVjdEtleXMoY29uZmlnLCBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhjb25maWcpXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSAnb3ZlcnJpZGVzJylcbiAgICAgICAgLnNvcnQoKSxcbiAgICAgICdvdmVycmlkZXMnLFxuICAgIF0pLFxuICApLFxuICAvLyBpZiBgY29uZmlnLm92ZXJyaWRlc2AgZXhpc3RzXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnb3ZlcnJpZGVzJyxcbiAgICAvLyBhbmQgYGNvbmZpZy5vdmVycmlkZXNgIGlzIGFuIGFycmF5XG4gICAgb25BcnJheSgob3ZlcnJpZGVzKSA9PlxuICAgICAgb3ZlcnJpZGVzLm1hcChcbiAgICAgICAgcGlwZShbXG4gICAgICAgICAgLy8gc29ydCBgY29uZmlnLm92ZXJyaWRlc1tdYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIHNvcnRPYmplY3QsXG4gICAgICAgICAgLy8gc29ydCBgY29uZmlnLm92ZXJyaWRlc1tdLm9wdGlvbnNgIGFscGhhYmV0aWNhbGx5XG4gICAgICAgICAgb3ZlclByb3BlcnR5KCdvcHRpb25zJywgc29ydE9iamVjdCksXG4gICAgICAgIF0pLFxuICAgICAgKSxcbiAgICApLFxuICApLFxuXSlcblxuY29uc3Qgc29ydFZvbHRhID0gc29ydE9iamVjdEJ5KFsnbm9kZScsICducG0nLCAneWFybiddKVxuY29uc3Qgc29ydERldkVuZ2luZXMgPSBvdmVyUHJvcGVydHkoXG4gICdwYWNrYWdlTWFuYWdlcicsXG4gIHNvcnRPYmplY3RCeShbJ25hbWUnLCAndmVyc2lvbicsICdvbkZhaWwnXSksXG4pXG5cbmNvbnN0IHBucG1CYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgJ3BlZXJEZXBlbmRlbmN5UnVsZXMnLFxuICAnbmV2ZXJCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzRmlsZScsXG4gICdhbGxvd2VkRGVwcmVjYXRlZFZlcnNpb25zJyxcbiAgJ2FsbG93Tm9uQXBwbGllZFBhdGNoZXMnLFxuICAndXBkYXRlQ29uZmlnJyxcbiAgJ2F1ZGl0Q29uZmlnJyxcbiAgJ3JlcXVpcmVkU2NyaXB0cycsXG4gICdzdXBwb3J0ZWRBcmNoaXRlY3R1cmVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdwYXRjaGVkRGVwZW5kZW5jaWVzJyxcbiAgJ3BhY2thZ2VFeHRlbnNpb25zJyxcbl1cblxuY29uc3Qgc29ydFBucG1Db25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KHBucG1CYXNlQ29uZmlnUHJvcGVydGllcywgdHJ1ZSksXG4gIG92ZXJQcm9wZXJ0eSgnb3ZlcnJpZGVzJywgc29ydE9iamVjdEJ5U2VtdmVyKSxcbl0pXG5cbi8vIFNlZSBodHRwczovL2RvY3MubnBtanMuY29tL21pc2Mvc2NyaXB0c1xuY29uc3QgZGVmYXVsdE5wbVNjcmlwdHMgPSBuZXcgU2V0KFtcbiAgJ2luc3RhbGwnLFxuICAncGFjaycsXG4gICdwcmVwYXJlJyxcbiAgJ3B1Ymxpc2gnLFxuICAncmVzdGFydCcsXG4gICdzaHJpbmt3cmFwJyxcbiAgJ3N0YXJ0JyxcbiAgJ3N0b3AnLFxuICAndGVzdCcsXG4gICd1bmluc3RhbGwnLFxuICAndmVyc2lvbicsXG5dKVxuXG5jb25zdCBoYXNEZXZEZXBlbmRlbmN5ID0gKGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uKSA9PiB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbiwgJ2RldkRlcGVuZGVuY2llcycpICYmXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3kpXG4gIClcbn1cblxuY29uc3QgcnVuU1JlZ0V4cCA9XG4gIC8oPzw9XnxbXFxzJjs8PnwoXSkoPzpydW4tc3xucG0tcnVuLWFsbDI/IC4qKD86LS1zZXF1ZW50aWFsfC0tc2VyaWFsfC1zKSkoPz0kfFtcXHMmOzw+fCldKS9cblxuY29uc3QgaXNTZXF1ZW50aWFsU2NyaXB0ID0gKGNvbW1hbmQpID0+XG4gIGNvbW1hbmQuaW5jbHVkZXMoJyonKSAmJiBydW5TUmVnRXhwLnRlc3QoY29tbWFuZClcblxuY29uc3QgaGFzU2VxdWVudGlhbFNjcmlwdCA9IChwYWNrYWdlSnNvbikgPT4ge1xuICBpZiAoXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsJywgcGFja2FnZUpzb24pICYmXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsMicsIHBhY2thZ2VKc29uKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBzY3JpcHRzID0gWydzY3JpcHRzJywgJ2JldHRlclNjcmlwdHMnXS5mbGF0TWFwKChmaWVsZCkgPT5cbiAgICBwYWNrYWdlSnNvbltmaWVsZF0gPyBPYmplY3QudmFsdWVzKHBhY2thZ2VKc29uW2ZpZWxkXSkgOiBbXSxcbiAgKVxuICByZXR1cm4gc2NyaXB0cy5zb21lKChzY3JpcHQpID0+IGlzU2VxdWVudGlhbFNjcmlwdChzY3JpcHQpKVxufVxuXG5mdW5jdGlvbiBzb3J0U2NyaXB0TmFtZXMoa2V5cywgcHJlZml4ID0gJycpIHtcbiAgY29uc3QgZ3JvdXBNYXAgPSBuZXcgTWFwKClcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHJlc3QgPSBwcmVmaXggPyBrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCArIDEpIDoga2V5XG4gICAgY29uc3QgaWR4ID0gcmVzdC5pbmRleE9mKCc6JylcbiAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgY29uc3QgYmFzZSA9IGtleS5zbGljZSgwLCAocHJlZml4ID8gcHJlZml4Lmxlbmd0aCArIDEgOiAwKSArIGlkeClcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGJhc2UpKSBncm91cE1hcC5zZXQoYmFzZSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoYmFzZSkucHVzaChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGtleSkpIGdyb3VwTWFwLnNldChrZXksIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGtleSkucHVzaChrZXkpXG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKGdyb3VwTWFwLmtleXMoKSlcbiAgICAuc29ydCgpXG4gICAgLmZsYXRNYXAoKGdyb3VwS2V5KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGdyb3VwTWFwLmdldChncm91cEtleSlcbiAgICAgIGlmIChcbiAgICAgICAgY2hpbGRyZW4ubGVuZ3RoID4gMSAmJlxuICAgICAgICBjaGlsZHJlbi5zb21lKChrKSA9PiBrICE9PSBncm91cEtleSAmJiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdCA9IGNoaWxkcmVuXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gayA9PT0gZ3JvdXBLZXkgfHwgIWsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICBjb25zdCBuZXN0ZWQgPSBjaGlsZHJlbi5maWx0ZXIoKGspID0+IGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgIHJldHVybiBbLi4uZGlyZWN0LCAuLi5zb3J0U2NyaXB0TmFtZXMobmVzdGVkLCBncm91cEtleSldXG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGRyZW4uc29ydCgpXG4gICAgfSlcbn1cblxuY29uc3Qgc29ydFNjcmlwdHMgPSBvbk9iamVjdCgoc2NyaXB0cywgcGFja2FnZUpzb24pID0+IHtcbiAgbGV0IG5hbWVzID0gT2JqZWN0LmtleXMoc2NyaXB0cylcbiAgY29uc3QgcHJlZml4YWJsZSA9IG5ldyBTZXQoKVxuXG4gIG5hbWVzID0gbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgY29uc3Qgb21pdHRlZCA9IG5hbWUucmVwbGFjZSgvXig/OnByZXxwb3N0KS8sICcnKVxuICAgIGlmIChkZWZhdWx0TnBtU2NyaXB0cy5oYXMob21pdHRlZCkgfHwgbmFtZXMuaW5jbHVkZXMob21pdHRlZCkpIHtcbiAgICAgIHByZWZpeGFibGUuYWRkKG9taXR0ZWQpXG4gICAgICByZXR1cm4gb21pdHRlZFxuICAgIH1cbiAgICByZXR1cm4gbmFtZVxuICB9KVxuXG4gIGlmICghaGFzU2VxdWVudGlhbFNjcmlwdChwYWNrYWdlSnNvbikpIHtcbiAgICBuYW1lcyA9IHNvcnRTY3JpcHROYW1lcyhuYW1lcylcbiAgfVxuICBuYW1lcyA9IG5hbWVzLmZsYXRNYXAoKGtleSkgPT5cbiAgICBwcmVmaXhhYmxlLmhhcyhrZXkpID8gW2BwcmUke2tleX1gLCBrZXksIGBwb3N0JHtrZXl9YF0gOiBba2V5XSxcbiAgKVxuICByZXR1cm4gc29ydE9iamVjdEtleXMoc2NyaXB0cywgbmFtZXMpXG59KVxuXG4vKlxuLSBNb3ZlIGBkZWZhdWx0YCBjb25kaXRpb24gdG8gYm90dG9tXG4qL1xuY29uc3Qgc29ydENvbmRpdGlvbnMgPSAoY29uZGl0aW9ucykgPT4ge1xuICBjb25zdCB7IGRlZmF1bHRDb25kaXRpb25zID0gW10sIHJlc3RDb25kaXRpb25zID0gW10gfSA9IG9iamVjdEdyb3VwQnkoXG4gICAgY29uZGl0aW9ucyxcbiAgICAoY29uZGl0aW9uKSA9PiB7XG4gICAgICBpZiAoY29uZGl0aW9uID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgcmV0dXJuICdkZWZhdWx0Q29uZGl0aW9ucydcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdyZXN0Q29uZGl0aW9ucydcbiAgICB9LFxuICApXG5cbiAgcmV0dXJuIFsuLi5yZXN0Q29uZGl0aW9ucywgLi4uZGVmYXVsdENvbmRpdGlvbnNdXG59XG5cbmNvbnN0IHNvcnRFeHBvcnRzID0gb25PYmplY3QoKGV4cG9ydHMpID0+IHtcbiAgY29uc3QgeyBwYXRocyA9IFtdLCBjb25kaXRpb25zID0gW10gfSA9IG9iamVjdEdyb3VwQnkoXG4gICAgT2JqZWN0LmtleXMoZXhwb3J0cyksXG4gICAgKGtleSkgPT4gKGtleS5zdGFydHNXaXRoKCcuJykgPyAncGF0aHMnIDogJ2NvbmRpdGlvbnMnKSxcbiAgKVxuXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgWy4uLnBhdGhzLCAuLi5zb3J0Q29uZGl0aW9ucyhjb25kaXRpb25zKV0ubWFwKChrZXkpID0+IFtcbiAgICAgIGtleSxcbiAgICAgIHNvcnRFeHBvcnRzKGV4cG9ydHNba2V5XSksXG4gICAgXSksXG4gIClcbn0pXG5cbi8vIGZpZWxkcyBtYXJrZWQgYHZzY29kZWAgYXJlIGZvciBgVmlzdWFsIFN0dWRpbyBDb2RlIGV4dGVuc2lvbiBtYW5pZmVzdGAgb25seVxuLy8gaHR0cHM6Ly9jb2RlLnZpc3VhbHN0dWRpby5jb20vYXBpL3JlZmVyZW5jZXMvZXh0ZW5zaW9uLW1hbmlmZXN0XG4vLyBTdXBwb3J0ZWQgZmllbGRzOlxuLy8gcHVibGlzaGVyLCBkaXNwbGF5TmFtZSwgY2F0ZWdvcmllcywgZ2FsbGVyeUJhbm5lciwgcHJldmlldywgY29udHJpYnV0ZXMsXG4vLyBhY3RpdmF0aW9uRXZlbnRzLCBiYWRnZXMsIG1hcmtkb3duLCBxbmEsIGV4dGVuc2lvblBhY2ssXG4vLyBleHRlbnNpb25EZXBlbmRlbmNpZXMsIGljb25cblxuLy8gZmllbGQua2V5e3N0cmluZ306IGZpZWxkIG5hbWVcbi8vIGZpZWxkLm92ZXJ7ZnVuY3Rpb259OiBzb3J0IGZpZWxkIHN1YktleVxuY29uc3QgZmllbGRzID0gW1xuICB7IGtleTogJyRzY2hlbWEnIH0sXG4gIHsga2V5OiAnbmFtZScgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZGlzcGxheU5hbWUnIH0sXG4gIHsga2V5OiAndmVyc2lvbicgfSxcbiAgLyogeWFybiAqLyB7IGtleTogJ3N0YWJsZVZlcnNpb24nIH0sXG4gIHsga2V5OiAncHJpdmF0ZScgfSxcbiAgeyBrZXk6ICdkZXNjcmlwdGlvbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY2F0ZWdvcmllcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdrZXl3b3JkcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdob21lcGFnZScgfSxcbiAgeyBrZXk6ICdidWdzJywgb3Zlcjogc29ydE9iamVjdEJ5KFsndXJsJywgJ2VtYWlsJ10pIH0sXG4gIHsga2V5OiAncmVwb3NpdG9yeScsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdmdW5kaW5nJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICB7IGtleTogJ2xpY2Vuc2UnLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3FuYScgfSxcbiAgeyBrZXk6ICdhdXRob3InLCBvdmVyOiBzb3J0UGVvcGxlT2JqZWN0IH0sXG4gIHtcbiAgICBrZXk6ICdtYWludGFpbmVycycsXG4gICAgb3Zlcjogb25BcnJheSgobWFpbnRhaW5lcnMpID0+IG1haW50YWluZXJzLm1hcChzb3J0UGVvcGxlT2JqZWN0KSksXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjb250cmlidXRvcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGNvbnRyaWJ1dG9ycykgPT4gY29udHJpYnV0b3JzLm1hcChzb3J0UGVvcGxlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3B1Ymxpc2hlcicgfSxcbiAgeyBrZXk6ICdzaWRlRWZmZWN0cycgfSxcbiAgeyBrZXk6ICd0eXBlJyB9LFxuICB7IGtleTogJ2ltcG9ydHMnIH0sXG4gIHsga2V5OiAnZXhwb3J0cycsIG92ZXI6IHNvcnRFeHBvcnRzIH0sXG4gIHsga2V5OiAnbWFpbicgfSxcbiAgeyBrZXk6ICdzdmVsdGUnIH0sXG4gIHsga2V5OiAndW1kOm1haW4nIH0sXG4gIHsga2V5OiAnanNkZWxpdnInIH0sXG4gIHsga2V5OiAndW5wa2cnIH0sXG4gIHsga2V5OiAnbW9kdWxlJyB9LFxuICB7IGtleTogJ3NvdXJjZScgfSxcbiAgeyBrZXk6ICdqc25leHQ6bWFpbicgfSxcbiAgeyBrZXk6ICdicm93c2VyJyB9LFxuICB7IGtleTogJ3JlYWN0LW5hdGl2ZScgfSxcbiAgeyBrZXk6ICd0eXBlcycgfSxcbiAgeyBrZXk6ICd0eXBlc1ZlcnNpb25zJyB9LFxuICB7IGtleTogJ3R5cGluZ3MnIH0sXG4gIHsga2V5OiAnc3R5bGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZScgfSxcbiAgeyBrZXk6ICdleGFtcGxlc3R5bGUnIH0sXG4gIHsga2V5OiAnYXNzZXRzJyB9LFxuICB7IGtleTogJ2JpbicsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtYW4nIH0sXG4gIHsga2V5OiAnZGlyZWN0b3JpZXMnLCBvdmVyOiBzb3J0RGlyZWN0b3JpZXMgfSxcbiAgeyBrZXk6ICdmaWxlcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICd3b3Jrc3BhY2VzJywgb3Zlcjogc29ydFdvcmtzcGFjZXMgfSxcbiAgLy8gbm9kZS1wcmUtZ3lwIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL25vZGUtcHJlLWd5cCMxLWFkZC1uZXctZW50cmllcy10by15b3VyLXBhY2thZ2Vqc29uXG4gIHtcbiAgICBrZXk6ICdiaW5hcnknLFxuICAgIG92ZXI6IHNvcnRPYmplY3RCeShbXG4gICAgICAnbW9kdWxlX25hbWUnLFxuICAgICAgJ21vZHVsZV9wYXRoJyxcbiAgICAgICdyZW1vdGVfcGF0aCcsXG4gICAgICAncGFja2FnZV9uYW1lJyxcbiAgICAgICdob3N0JyxcbiAgICBdKSxcbiAgfSxcbiAgeyBrZXk6ICdzY3JpcHRzJywgb3Zlcjogc29ydFNjcmlwdHMgfSxcbiAgeyBrZXk6ICdiZXR0ZXJTY3JpcHRzJywgb3Zlcjogc29ydFNjcmlwdHMgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbDEwbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY29udHJpYnV0ZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2FjdGl2YXRpb25FdmVudHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaHVza3knLCBvdmVyOiBvdmVyUHJvcGVydHkoJ2hvb2tzJywgc29ydEdpdEhvb2tzKSB9LFxuICB7IGtleTogJ3NpbXBsZS1naXQtaG9va3MnLCBvdmVyOiBzb3J0R2l0SG9va3MgfSxcbiAgeyBrZXk6ICdwcmUtY29tbWl0JyB9LFxuICB7IGtleTogJ2NvbW1pdGxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbGludC1zdGFnZWQnIH0sXG4gIHsga2V5OiAnbmFuby1zdGFnZWQnIH0sXG4gIHsga2V5OiAnY29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25vZGVtb25Db25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcmlmeScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdiYWJlbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2Vyc2xpc3QnIH0sXG4gIHsga2V5OiAneG8nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHJldHRpZXInLCBvdmVyOiBzb3J0UHJldHRpZXJDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRDb25maWcnLCBvdmVyOiBzb3J0RXNsaW50Q29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50SWdub3JlJyB9LFxuICB7IGtleTogJ25wbXBrZ2pzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbVBhY2thZ2VKc29uTGludENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1wYWNrYWdlanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVsZWFzZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZW1hcmtDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnc3R5bGVsaW50JyB9LFxuICB7IGtleTogJ2F2YScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QtanVuaXQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1zdGFyZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtb2NoYScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdueWMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYzgnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAndGFwJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ29jbGlmJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdyZXNvbHV0aW9ucycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvdmVycmlkZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RldkRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHNvcnRPYmplY3RCeUlkZW50LCB0cnVlKSB9LFxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIC8vIFRPRE86IG9ubHkgc29ydCBkZXB0aCA9IDJcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnYnVuZGxlZERlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdidW5kbGVEZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvblBhY2snLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvbkRlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdmbGF0JyB9LFxuICB7IGtleTogJ3BhY2thZ2VNYW5hZ2VyJyB9LFxuICB7IGtleTogJ2VuZ2luZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZW5naW5lU3RyaWN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2RldkVuZ2luZXMnLCBvdmVyOiBzb3J0RGV2RW5naW5lcyB9LFxuICB7IGtleTogJ3ZvbHRhJywgb3Zlcjogc29ydFZvbHRhIH0sXG4gIHsga2V5OiAnbGFuZ3VhZ2VOYW1lJyB9LFxuICB7IGtleTogJ29zJyB9LFxuICB7IGtleTogJ2NwdScgfSxcbiAgeyBrZXk6ICdwcmVmZXJHbG9iYWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHVibGlzaENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnaWNvbicgfSxcbiAgLyogdnNjb2RlICovIHtcbiAgICBrZXk6ICdiYWRnZXMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGJhZGdlKSA9PiBiYWRnZS5tYXAoc29ydFZTQ29kZUJhZGdlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2dhbGxlcnlCYW5uZXInLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3ByZXZpZXcnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ21hcmtkb3duJyB9LFxuICB7IGtleTogJ3BucG0nLCBvdmVyOiBzb3J0UG5wbUNvbmZpZyB9LFxuXVxuXG5jb25zdCBkZWZhdWx0U29ydE9yZGVyID0gZmllbGRzLm1hcCgoeyBrZXkgfSkgPT4ga2V5KVxuY29uc3Qgb3ZlckZpZWxkcyA9IHBpcGUoXG4gIGZpZWxkc1xuICAgIC5tYXAoKHsga2V5LCBvdmVyIH0pID0+IChvdmVyID8gb3ZlclByb3BlcnR5KGtleSwgb3ZlcikgOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoQm9vbGVhbiksXG4pXG5cbmZ1bmN0aW9uIGVkaXRTdHJpbmdKU09OKGpzb24sIG92ZXIpIHtcbiAgaWYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHsgaW5kZW50LCB0eXBlIH0gPSBkZXRlY3RJbmRlbnQoanNvbilcbiAgICBjb25zdCBlbmRDaGFyYWN0ZXJzID0ganNvbi5zbGljZSgtMSkgPT09ICdcXG4nID8gJ1xcbicgOiAnJ1xuICAgIGNvbnN0IG5ld2xpbmUgPSBkZXRlY3ROZXdsaW5lKGpzb24pXG4gICAganNvbiA9IEpTT04ucGFyc2UoanNvbilcblxuICAgIGxldCByZXN1bHQgPVxuICAgICAgSlNPTi5zdHJpbmdpZnkob3Zlcihqc29uKSwgbnVsbCwgdHlwZSA9PT0gJ3RhYicgPyAnXFx0JyA6IGluZGVudCkgK1xuICAgICAgZW5kQ2hhcmFjdGVyc1xuICAgIGlmIChuZXdsaW5lID09PSAnXFxyXFxuJykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1xcbi9nLCBuZXdsaW5lKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByZXR1cm4gb3Zlcihqc29uKVxufVxuXG5mdW5jdGlvbiBzb3J0UGFja2FnZUpzb24oanNvbklzaCwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBlZGl0U3RyaW5nSlNPTihcbiAgICBqc29uSXNoLFxuICAgIG9uT2JqZWN0KChqc29uKSA9PiB7XG4gICAgICBsZXQgc29ydE9yZGVyID0gb3B0aW9ucy5zb3J0T3JkZXIgfHwgZGVmYXVsdFNvcnRPcmRlclxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3J0T3JkZXIpKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhqc29uKVxuICAgICAgICBjb25zdCB7IHByaXZhdGVLZXlzID0gW10sIHB1YmxpY0tleXMgPSBbXSB9ID0gb2JqZWN0R3JvdXBCeShcbiAgICAgICAgICBrZXlzLFxuICAgICAgICAgIChrZXkpID0+IChrZXlbMF0gPT09ICdfJyA/ICdwcml2YXRlS2V5cycgOiAncHVibGljS2V5cycpLFxuICAgICAgICApXG4gICAgICAgIHNvcnRPcmRlciA9IFtcbiAgICAgICAgICAuLi5zb3J0T3JkZXIsXG4gICAgICAgICAgLi4uZGVmYXVsdFNvcnRPcmRlcixcbiAgICAgICAgICAuLi5wdWJsaWNLZXlzLnNvcnQoKSxcbiAgICAgICAgICAuLi5wcml2YXRlS2V5cy5zb3J0KCksXG4gICAgICAgIF1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG92ZXJGaWVsZHMoc29ydE9iamVjdEtleXMoanNvbiwgc29ydE9yZGVyKSwganNvbilcbiAgICB9KSxcbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBzb3J0UGFja2FnZUpzb25cbmV4cG9ydCB7IHNvcnRQYWNrYWdlSnNvbiwgZGVmYXVsdFNvcnRPcmRlciBhcyBzb3J0T3JkZXIgfVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG5cdHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbHVlKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcGFja2FnZURpclBhdGhzLm1hcChhc3luYyAocGFja2FnZURpclBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgbmV3VGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICd0ZXN0Jyk7XG4gICAgICAgIGZvciAoY29uc3Qgb2xkVGVzdERpck5hbWUgb2YgWydfX3Rlc3RzX18nLCAndGVzdHMnXSkge1xuICAgICAgICAgIGNvbnN0IG9sZFRlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCBvbGRUZXN0RGlyTmFtZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IG1vdmVUZXN0RGlyZWN0b3J5KG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICAgICAgICAgIHNjcmlwdHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBkaWRVcGRhdGVTY3JpcHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBbc2NyaXB0TmFtZSwgc2NyaXB0XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgICAgICAgICAgICBjb25zdCBuZXdTY3JpcHQgPSBzY3JpcHQucmVwbGFjZUFsbChvbGRUZXN0RGlyTmFtZSwgJ3Rlc3QnKTtcbiAgICAgICAgICAgICAgaWYgKHNjcmlwdCAhPT0gbmV3U2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG5ld1NjcmlwdDtcbiAgICAgICAgICAgICAgICBkaWRVcGRhdGVTY3JpcHQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWNrYWdlSnNvbi5zY3JpcHRzID0gc2NyaXB0cztcbiAgICAgICAgICAgIGlmICghZGlkVXBkYXRlU2NyaXB0KSByZXR1cm47XG5cbiAgICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShzb3J0UGFja2FnZUpzb24ocGFja2FnZUpzb24pLCB1bmRlZmluZWQsIDIpKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1vdmVUZXN0RGlyZWN0b3J5KG9sZFRlc3REaXJQYXRoOiBzdHJpbmcsIG5ld1Rlc3REaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG5ld1Rlc3REaXJQYXRoKSkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShvbGRUZXN0RGlyUGF0aCwgbmV3VGVzdERpclBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKG9sZFRlc3REaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGRpcmVudHMubWFwKGFzeW5jIChkaXJlbnQpID0+IHtcbiAgICAgIGNvbnN0IG9sZFBhdGggPSBwYXRoLmpvaW4ob2xkVGVzdERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGNvbnN0IG5ld1BhdGggPSBwYXRoLmpvaW4obmV3VGVzdERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGNvbnN0IG5ld1BhdGhTdGF0ID0gZnMuZXhpc3RzU3luYyhuZXdQYXRoKSA/IGF3YWl0IGZzLnByb21pc2VzLnN0YXQobmV3UGF0aCkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgbmV3UGF0aFN0YXQ/LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgYXdhaXQgbW92ZVRlc3REaXJlY3Rvcnkob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICB9KVxuICApO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ybShvbGRUZXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwZURlZmluaXRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbjogUGFja2FnZUNvbmZpZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBlRGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGliVHlwZURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdAdHlwZXMnKTtcbiAgICBjb25zdCBzcmNUeXBlRGlyUGF0aCA9XG4gICAgICBjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyA/IHVuZGVmaW5lZCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3NyYycsICd0eXBlcycpO1xuXG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnJlYWRkaXIobGliVHlwZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSk7XG4gICAgaWYgKCFkaXJlbnRzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBjb25zdCBkaXJOYW1lID0gZGlyZW50Lm5hbWUuc2xpY2UoMCwgLTUpO1xuICAgICAgY29uc3QgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID0gZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5kLnRzJyk7XG4gICAgICBsZXQgcGFja2FnZU5hbWUgPSBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPyBkaXJOYW1lIDogZGlyZW50Lm5hbWU7XG4gICAgICBpZiAocGFja2FnZU5hbWUuaW5jbHVkZXMoJ19fJykpIHtcbiAgICAgICAgcGFja2FnZU5hbWUgPSBgQCR7cGFja2FnZU5hbWUucmVwbGFjZSgnX18nLCAnLycpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNMaWJyYXJ5ID0gY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuLnNvbWUoXG4gICAgICAgIChjb25maWcpID0+XG4gICAgICAgICAgY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICAgICk7XG5cbiAgICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uKSB7XG4gICAgICAgIGlmIChoYXNMaWJyYXJ5KSB7XG4gICAgICAgICAgLy8gTW92ZSBAdHlwZXMvPG5hbWU+L2luZGV4LmQudHMgaWYgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSwgJ2luZGV4LmQudHMnKSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNyY1R5cGVEaXJQYXRoKSB7XG4gICAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+IGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgc3JjVHlwZURpclBhdGggJiYgIWhhc0xpYnJhcnkpIHtcbiAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+LmQudHMgaWYgbm90IGluc3RhbGxlZFxuICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgIGlnbm9yZUVub2VudEFzeW5jKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUoXG4gICAgICAgICAgICAgIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdpbmRleC5kLnRzJyksXG4gICAgICAgICAgICAgIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgYCR7ZGlyZW50Lm5hbWV9LmQudHNgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTWVyZ2UodGFyZ2V0OiB1bmtub3duW10sIHNvdXJjZTogdW5rbm93bltdLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHVua25vd25bXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QodGFyZ2V0W2luZGV4XSwgb3B0aW9ucykgJiYgaXNNZXJnZWFibGVPYmplY3QoaXRlbSwgb3B0aW9ucykpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuXG5mdW5jdGlvbiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlLCBvcHRpb25zKSA/IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWUsIG9wdGlvbnMpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCh2YWx1ZSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIHBhY2thZ2UuanNvbi1zdHlsZSBrZXlzIGFyZSBub24tYXJyYXktaW5kZXgga2V5cywgc28gSlNPTi5zdHJpbmdpZnkgcHJlc2VydmVzIHRoaXMgaW5zZXJ0aW9uIG9yZGVyLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHNvcnRLZXlzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBsb2FkL2R1bXAgdXNhZ2UgY2xlYXJlci5cbi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIC8vIEdpdEh1YiBBY3Rpb25zIHRyZWF0cyBgZXZlbnQ6IG51bGxgIGFzIGEgdmFsdWVsZXNzIGV2ZW50IG1hcHBpbmcsIGUuZy5cbiAgLy8gYHB1bGxfcmVxdWVzdDpgLiBgdW5kZWZpbmVkYCB3b3VsZCBvbWl0IHRoZSBldmVudCBlbnRpcmVseSB3aGVuIGR1bXBpbmcgWUFNTC5cbiAgaXNzdWVzPzogVHlwZXMgfCBudWxsO1xuICBwdWxsX3JlcXVlc3Q/OiBQdWxsUmVxdWVzdCB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcyB8IG51bGw7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgJ3J1bnMtb24nPzogc3RyaW5nO1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHN0ZXBzPzogU3RlcFtdO1xuICB1c2VzPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgdXNlcz86IHN0cmluZztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBydW4/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICBuYW1lOiAnYXV0b2ZpeC5jaScsXG4gIG9uOiB7XG4gICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgIHB1c2g6IHtcbiAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICB9LFxuICB9LFxuICBwZXJtaXNzaW9uczoge1xuICAgIGNvbnRlbnRzOiAncmVhZCcsXG4gIH0sXG4gIGNvbmN1cnJlbmN5OiB7XG4gICAgZ3JvdXA6ICdhdXRvZml4LSR7eyBnaXRodWIuaGVhZF9yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDogeyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9LFxuICB9LFxufTtcblxuY29uc3QgcHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICBuYW1lOiAnRml4IGNvZGUgYXV0b21hdGljYWxseScsXG4gIG9uOiB7XG4gICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gIH0sXG4gIGpvYnM6IHtcbiAgICBhdXRvZml4OiB7XG4gICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2F1dG9maXgueW1sQG1haW4nLFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBsaW50ZXIgZml4XG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS90cnVzdGVkLXB1Ymxpc2hlcnMjc3RlcC0yLWNvbmZpZ3VyZS15b3VyLWNpY2Qtd29ya2Zsb3dcbiAgICAgICdpZC10b2tlbic6ICd3cml0ZScsXG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgY29tbWl0aW5nIGNoYW5nZXNcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWNsYXVkZSc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDbGF1ZGUgQ29kZScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1jbGF1ZGUnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY2xhdWRlLWNvZGUnLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIENMQVVERV9DT0RFX09BVVRIX1RPS0VOOiAnJHt7IHNlY3JldHMuQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4gfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWNvZGV4Jzoge1xuICAgIG5hbWU6ICdHZW5lcmF0ZSBQUiB3aXRoIENvZGV4IENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1jb2RleCcpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdjb2RleC1jbGknLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIE9QRU5BSV9BUElfS0VZOiAnJHt7IHNlY3JldHMuT1BFTkFJX0FQSV9LRVkgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWdlbWluaSc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBHZW1pbmkgQ0xJJyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdnZW4tcHInOiB7XG4gICAgICAgIGlmOiBcImNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWFsbCcpIHx8IGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWdlbWluaScpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdnZW1pbmktY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBHRU1JTklfQVBJX0tFWTogJyR7eyBzZWNyZXRzLkdFTUlOSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knIHwgJ2F1dG9maXgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZpZyBvZiBzZW1hbnRpYyBwdWxsIHJlcXVlc3RcbiAgICBjb25zdCBzZW1hbnRpY1ltbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICdzZW1hbnRpYy55bWwnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oc2VtYW50aWNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGZpbGVOYW1lU2V0ID0gbmV3IFNldChbXG4gICAgICAndGVzdC55bWwnLFxuICAgICAgJ2F1dG9maXgueW1sJyxcbiAgICAgICdzZW1hbnRpYy1wci55bWwnLFxuICAgICAgJ2Nsb3NlLWNvbW1lbnQueW1sJyxcbiAgICAgICdnZW4tcHItY2xhdWRlLnltbCcsXG4gICAgICAnZ2VuLXByLWNvZGV4LnltbCcsXG4gICAgICAnZ2VuLXByLWdlbWluaS55bWwnLFxuICAgICAgLi4uZW50cmllcy5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lLmVuZHNXaXRoKCcueW1sJykpLm1hcCgoZGlyZW50KSA9PiBkaXJlbnQubmFtZSksXG4gICAgXSk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdyZWxlYXNlLnltbCcpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVTZXQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgY29uc3Qga2luZCA9IHBhdGguYmFzZW5hbWUoZmlsZU5hbWUsICcueW1sJykgYXMgS25vd25LaW5kO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocmVwb3NpdG9yeT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVwb3NpdG9yeT8uZW5kc1dpdGgoJy9yZXVzYWJsZS13b3JrZmxvd3MnKSA/PyBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGtpbmQ6IEtub3duS2luZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBgJHtraW5kfS55bWxgKTtcbiAgY29uc3QgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2RlcGxveS1wcm9kdWN0aW9uLnltbCcpKTtcblxuICBpZiAoa2luZCA9PT0gJ2F1dG9maXgnKSB7XG4gICAgYXdhaXQgd3JpdGVZYW1sKGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZyksIGZpbGVQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoa2luZCBpbiB3b3JrZmxvd3MgPyB3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA6IHt9KSBhcyBXb3JrZmxvdztcblxuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICAvLyBTa2lwIGEgYnJva2VuIHdvcmtmbG93XG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTW92ZSBqb2JzIHRvIHRoZSBib3R0b21cbiAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgJiYgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlICYmIGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cykge1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucy5hY3Rpb25zID0gJ3dyaXRlJztcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aCA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGgudHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3cgPSAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJztcbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBub24tcmV1c2FibGUgd29ya2Zsb3dzXG4gICAgaWYgKCFqb2IudXNlcz8uaW5jbHVkZXMoJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIGNvbnRpbnVlO1xuXG4gICAgbm9ybWFsaXplSm9iKGNvbmZpZywgam9iLCBraW5kKTtcbiAgICBpc1JldXNhYmxlV29ya2Zsb3cgPSB0cnVlO1xuICB9XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93KSByZXR1cm47XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zWydpZC10b2tlbiddID0gJ3dyaXRlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uWydpZC10b2tlbiddO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAvLyBEb24ndCB1c2UgYHBhdGhzLWlnbm9yZWAgZm9yIHRlc3QgYmVjYXVzZSBHaXRIdWIncyBCcmFuY2ggUHJvdGVjdGlvbiBhbmQgUnVsZXNldHMgcmVxdWlyZSBqb2IgcnVubmluZy5cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVsbF9yZXF1ZXN0KSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdWxsX3JlcXVlc3RbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXTtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMuZmlsdGVyKChicmFuY2gpID0+IGJyYW5jaCAhPT0gJ3Jlbm92YXRlLyoqJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm8gZGVmYXVsdFxuICB9XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtaW5pdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIGpvYi5zZWNyZXRzID8/PSB7fTtcbiAgLy8gVXNlIHRydXN0ZWQgcHVibGlzaGluZyBpbnN0ZWFkIG9mIE5QTV9UT0tFTlxuICBkZWxldGUgam9iLnNlY3JldHMuTlBNX1RPS0VOO1xuXG4gIGlmIChcbiAgICBraW5kID09PSAndGVzdCcgfHxcbiAgICBraW5kID09PSAncmVsZWFzZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNsYXVkZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJ1xuICApIHtcbiAgICBqb2Iuc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgLy8gU2V0IHRlc3QtY29tbWFuZCBmb3IgZ2VuLXByIHdvcmtmbG93cyBiYXNlZCBvbiBwYWNrYWdlIG1hbmFnZXJcbiAgaWYgKGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fCBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fCBraW5kID09PSAnZ2VuLXByLWdlbWluaScpIHtcbiAgICBqb2Iud2l0aFsndGVzdC1jb21tYW5kJ10gPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1biBjaGVjay1hbGwtZm9yLWFpJyA6ICd5YXJuIGNoZWNrLWFsbC1mb3ItYWknO1xuICB9XG4gIGlmIChqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTikge1xuICAgIGpvYi5zZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgICAgam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gcGFyYW1zLnJlcGxhY2UoJ3N5bmMgJywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoLmRvdF9lbnZfcGF0aCA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmRvdF9lbnZfcGF0aDtcbiAgfVxuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0cy5GTFlfQVBJX1RPS0VOICYmIHR5cGVvZiBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9IGpvYi53aXRoLmRlcGxveV9jb21tYW5kLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXIgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXI7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogV29ya2Zsb3cge1xuICBpZiAoIWNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NicgfSxcbiAgICB7IHVzZXM6ICdhY3Rpb25zL3NldHVwLW5vZGVAdjYnLCB3aXRoOiB7ICdjaGVjay1sYXRlc3QnOiB0cnVlLCAnbm9kZS12ZXJzaW9uJzogJ2x0cy8qJyB9IH0sXG4gICAgLi4uKGNvbmZpZy5pc0J1biA/IFt7IHVzZXM6ICdvdmVuLXNoL3NldHVwLWJ1bkB2MicsIHdpdGg6IHsgJ2J1bi12ZXJzaW9uJzogJ2xhdGVzdCcgfSB9XSA6IFtdKSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgIH0sXG4gICAgeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gY2xlYW51cGAgfSxcbiAgXTtcbiAgaWYgKGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uYnVpbGQpIHtcbiAgICBzdGVwcy5wdXNoKHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGJ1aWxkYCB9KTtcbiAgfVxuICBzdGVwcy5wdXNoKHsgdXNlczogJ2F1dG9maXgtY2kvYWN0aW9uQHYxJyB9KTtcblxuICBjb25zdCBhdXRvZml4V29ya2Zsb3cgPSBzdHJ1Y3R1cmVkQ2xvbmUocHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyk7XG4gIGNvbnN0IGF1dG9maXhKb2IgPSBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID8/IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfTtcbiAgYXV0b2ZpeFdvcmtmbG93LmpvYnMuYXV0b2ZpeCA9IHsgLi4uYXV0b2ZpeEpvYiwgc3RlcHMgfTtcbiAgcmV0dXJuIGF1dG9maXhXb3JrZmxvdztcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVZYW1sKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB5YW1sVGV4dCA9IHJlbW92ZVRyYWlsaW5nU3BhY2VzKFxuICAgIHlhbWwuZHVtcChuZXdTZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xLCBub0NvbXBhdE1vZGU6IHRydWUsIHN0eWxlczogeyAnISFudWxsJzogJ2VtcHR5JyB9IH0pXG4gICk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVUcmFpbGluZ1NwYWNlcyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBqcy15YW1sIGVtaXRzIHZhbHVlbGVzcyBHaXRIdWIgQWN0aW9ucyBldmVudHMgYXMgYGV2ZW50OiBgIHdoZW4gdXNpbmcgdGhlIGVtcHR5IG51bGwgc3R5bGUuXG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoL1sgXFx0XSskL2dtLCAnJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgIF0sXG4gICAgICB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndGV4dCcpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnY2YuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oPz1cXHN8JCkvZywgJ2UuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLig/PVxccykvZywgJ2kuZS4nKTtcbn1cblxuZnVuY3Rpb24gZml4VHlwb3NJbkNvZGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAoY29tbWVudCkgPT4gZml4VHlwb3NJblRleHQoY29tbWVudCkpXG4gICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KWNcXC5mXFwuL2csICckMS8vJDJjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPyllZ1xcLi9nLCAnJDEvLyQyZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KWllXFwuL2csICckMS8vJDJpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIEFHRU5UU19FWFRSQS5tZCBleGlzdHMgYW5kIHJlYWQgaXRzIGNvbnRlbnRcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBgLS0tXFxuZGVzY3JpcHRpb246IEdlbmVyYWwgQ29kaW5nIFJ1bGVzXFxuZ2xvYnM6XFxuYWx3YXlzQXBwbHk6IHRydWVcXG4tLS1gO1xuICBjb25zdCBib2R5ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKGNvbmZpZywgYWxsQ29uZmlncywgJ0N1cnNvcicsIGV4dHJhQ29udGVudCk7XG4gIHJldHVybiBgJHtmcm9udG1hdHRlcn1cXG5cXG4ke2JvZHl9YDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6IFxcYCR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZSB8fCAndW5rbm93bid9XFxgXG4tIERlc2NyaXB0aW9uOiAke3Jvb3RDb25maWcucGFja2FnZUpzb24/LmRlc2NyaXB0aW9ufVxuLSBQYWNrYWdlIE1hbmFnZXI6ICR7cGFja2FnZU1hbmFnZXJ9XG5cbiMjIEdlbmVyYWwgSW5zdHJ1Y3Rpb25zXG5cbi0gQ3JlYXRlIGEgbmV3IGJyYW5jaCBpZiB0aGUgY3VycmVudCBicmFuY2ggaXMgXFxgbWFpblxcYC5cbi0gUnVuIGFueSBcXGBnaXRcXGAgY29tbWFuZHMgc2VxdWVudGlhbGx5LlxuLSBXcml0ZSB0ZXN0cyBPTkxZIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiBJZiByZXF1ZXN0ZWQsIGZvbGxvdyB0aGVzZSBydWxlczpcbiAgLSBDb250aW51ZSBtb2RpZnlpbmcgdGVzdHMgYW5kL29yIGNvZGUgdW50aWwgYWxsIHRlc3RzIHBhc3MuXG4gIC0gRW5zdXJlIHRlc3RzIGFyZSBpZGVtcG90ZW50IGFuZCBpbmRlcGVuZGVudCAoZS5nLiwgcmVzZXQgcGVyc2lzdGVudCBkYXRhKSBzbyB0aGV5IGNhbiBydW4gcmVwZWF0ZWRseSBvciBpbiBwYXJhbGxlbC5cbiAgLSBQcmVmZXIgYWN0dWFsIEFQSSBjYWxscyBvdmVyIG1vY2tzLCB1bmxlc3MgYWN0dWFsIGNhbGxzIGFyZSBpbXByYWN0aWNhbCwgaGF2ZSB1bmludGVuZGVkIHNpZGUgZWZmZWN0cywgb3IgbW9ja3MgYXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuICAtIEFsd2F5cyBpbnZlc3RpZ2F0ZSB0aGUgcm9vdCBjYXVzZSBvZiBhIHRlc3QgZmFpbHVyZSBiZWZvcmUgZml4aW5nIGl0LlxuICAtIEF2b2lkIGFkZGluZyB3YWl0IGZ1bmN0aW9ucyBpbiBFMkUgdGVzdHMgdW5sZXNzIHN0cmljdGx5IG5lY2Vzc2FyeS5cbi0gV2hlbiBmaXhpbmcgaXNzdWVzLCBmb2xsb3cgdGhlc2UgcnVsZXM6XG4gIC0gSW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2UgZmlyc3QgKGUuZy4sIGJ5IGdhdGhlcmluZyBkZWJ1ZyBsb2dzLCB0YWtpbmcgc2NyZWVuc2hvdHMsIGV0Yy4pLlxuICAtIEZpeCB0aGUgYWN0dWFsIHJvb3QgY2F1c2UgaW5zdGVhZCBvZiBhcHBseWluZyB3b3JrYXJvdW5kcy5cbi0gQWZ0ZXIgbWFraW5nIGNvZGUgY2hhbmdlcywgcnVuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IGNoZWNrLWFsbC1mb3ItYWlcXGAgdG8gZXhlY3V0ZSBhbGwgdGVzdHMgKHRha2VzIHVwIHRvIDEgaG91ciksIG9yIFxcYCR7cGFja2FnZU1hbmFnZXJ9IGNoZWNrLWZvci1haVxcYCBmb3Igb25seSB0eXBlIGNoZWNraW5nIGFuZCBsaW50aW5nICh0YWtlcyB1cCB0byAxMCBtaW51dGVzKS5cbiAgLSBJZiB5b3UgYXJlIGNvbmZpZGVudCB0aGF0IHlvdXIgY2hhbmdlcyB3aWxsIG5vdCBicmVhayBhbnkgdGVzdHMsIHlvdSBtYXkgdXNlIFxcYGNoZWNrLWZvci1haVxcYC5cbiAgLSBVc2UgXFxgb3hsaW50XFxgIGlnbm9yZSBjb21tZW50cyB3aXRoIHJlYXNvbnMgKGUuZy4sIFxcYC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSA8cnVsZT4gLS0gPHJlYXNvbj5cXGApIGlmIGxpbnQgZXJyb3JzIG9yIHdhcm5pbmdzIGNhbm5vdCBiZSBmaXhlZC5cbi0gT25jZSB5b3UgaGF2ZSB2ZXJpZmllZCB5b3VyIGNoYW5nZXMsIGNvbW1pdCBhbmQgcHVzaCB0aGVtIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoLCB0aGVuIGNyZWF0ZSBhIFBSIHZpYSBcXGBnaFxcYC5cbiAgLSBGb2xsb3cgdGhlIGNvbnZlbnRpb25hbCBjb21taXRzOyB5b3VyIGNvbW1pdCBtZXNzYWdlIHNob3VsZCBzdGFydCB3aXRoIFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgLCBldGMuXG4gIC0gSWYgbm90IHNwZWNpZmllZCwgbWFrZSBzdXJlIHRvIGFkZCBhIG5ldyBsaW5lIGF0IHRoZSBlbmQgb2YgeW91ciBjb21taXQgbWVzc2FnZSR7cm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwbyA/IGAgd2l0aDogXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGBgIDogJyd9LlxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHMuIEF2b2lkIHVzaW5nIFxcYC0tYW1lbmRcXGAuXG4tIEFsd2F5cyB1c2UgaGVyZWRvYyBzeW50YXggd2hlbiBwYXNzaW5nIG11bHRpLWxpbmUgY29udGVudCB0byBhbnkgY29tbWFuZC5cbiR7aGFzU3RhcnRUZXN0U2VydmVyU2NyaXB0KGFsbENvbmZpZ3MpID8gYC0gVXNlIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHN0YXJ0LXRlc3Qtc2VydmVyXFxgIHRvIGxhdW5jaCBhIHdlYiBzZXJ2ZXIgZm9yIGRlYnVnZ2luZyBvciB0ZXN0aW5nLmAgOiAnJ31cblxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBoYXNOZXdTZWN0aW9uID0gZXh0cmFDb250ZW50Py50cmltKCkuc3RhcnRzV2l0aCgnIycpO1xuICBjb25zdCBub3JtYWxpemVkRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50XG4gICAgPyBoYXNOZXdTZWN0aW9uXG4gICAgICA/ICdcXG5cXG4nICsgZXh0cmFDb250ZW50LnRyaW0oKVxuICAgICAgOiAnXFxuJyArIGV4dHJhQ29udGVudFxuICAgIDogJyc7XG4gIHJldHVybiBiYXNlQ29udGVudCArIG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgLy8gS2VlcCB0b3AtZG93biBvcmRlcmluZyBndWlkYW5jZSBmdW5jdGlvbi1vbmx5IGJlY2F1c2UgY2xhc3NlcyBhcmUgbm90IGhvaXN0ZWQgYW5kIGNhbiBmYWlsIHdoZW4gaW5oZXJpdGFuY2Ugb3IgdG9wLWxldmVsIGluc3RhbnRpYXRpb24gZGVwZW5kcyBvbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAgcmV0dXJuIGBcbiMjIENvZGluZyBTdHlsZVxuXG4tIFVzZSBjYW1lbENhc2UgZm9yIEphdmFTY3JpcHQgYW5kIFR5cGVTY3JpcHQgZmlsZXMgKG9yIFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMpLlxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBlYWNoIG1vZHVsZSB3aXRoIGhpZ2ggY29oZXNpb24sIGdyb3VwaW5nIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSB0b2dldGhlci5cbiAgLSBSZWZhY3RvciBleGlzdGluZyBsYXJnZSBtb2R1bGVzIGludG8gc21hbGxlciwgZm9jdXNlZCBtb2R1bGVzIHdoZW4gbmVjZXNzYXJ5LlxuICAtIENyZWF0ZSB3ZWxsLW9yZ2FuaXplZCBkaXJlY3Rvcnkgc3RydWN0dXJlcyB3aXRoIGxvdyBjb3VwbGluZyBhbmQgaGlnaCBjb2hlc2lvbi5cbi0gUGxhY2UgY2FsbGluZyBmdW5jdGlvbnMgYWJvdmUgdGhlIGZ1bmN0aW9ucyB0aGV5IGNhbGwgdG8gbWFpbnRhaW4gYSBjbGVhciB0b3AtZG93biBvcmRlci5cbiAgLSBlLmcuLCBcXGBmdW5jdGlvbiBjYWxsZXIoKSB7IGNhbGxlZSgpOyB9IGZ1bmN0aW9uIGNhbGxlZSgpIHsgLi4uIH1cXGBcbiAgLSBVbmxpa2UgZnVuY3Rpb25zLCBwbGFjZSB2YXJpYWJsZSBhbmQgdHlwZSBkZWNsYXJhdGlvbnMgQUJPVkUgdGhlaXIgdXNhZ2UuXG4tIFdyaXRlIGNvbW1lbnRzIGFuZCBKU0RvYyBmb3IgY29tcGxleCBvciBoYXJkLXRvLXVuZGVyc3RhbmQgY29kZS5cbiAgLSBFeHBsYWluIFwid2h5XCIgaW4gY29tbWVudHMgYW5kIFwid2hhdFwiIGluIEpTRG9jLlxuICAtIEF2b2lkIHN0YXRpbmcgd2hhdCBjYW4gYmUgZWFzaWx5IHVuZGVyc3Rvb2QgZnJvbSB0aGUgY29kZSBpdHNlbGYuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyBleHBsaWNpdGx5IHJlcXVpcmVkIGJ5IEFQSXMgb3IgbGlicmFyaWVzLlxuLSBQcmVmZXIgdXNpbmcgYSBzaW5nbGUgdGVtcGxhdGUgbGl0ZXJhbCBmb3IgcHJvbXB0cyBpbnN0ZWFkIG9mIFxcYGpvaW4oKVxcYCB3aXRoIGEgcHJlLWNvbXB1dGFibGUgYXJyYXkgbGl0ZXJhbCBvZiBzdHJpbmdzLlxuLSBBc3N1bWUgdGhhdCBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBwcm9wZXJseSBkZWZpbmVkLlxuICAtIElmIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQsIHVzZSBcXGBhc3NlcnRcXGAgdG8gZmFpbCBmYXN0IChlLmcuLCBkdXJpbmcgc3RhcnR1cCkuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLmdlbkkxOG5UcylcbiAgICA/IGAtIFdoZW4gaW50cm9kdWNpbmcgbmV3IHN0cmluZyBsaXRlcmFscyBpbiBSZWFjdCBjb21wb25lbnRzLCB1cGRhdGUgdGhlIGxhbmd1YWdlIHJlc291cmNlIGZpbGVzIGluIHRoZSBcXGBpMThuXFxgIGRpcmVjdG9yeSAoZS5nLiwgXFxgaTE4bi9qYS1KUC5qc29uXFxgKS4gUmVmZXJlbmNlIHRoZXNlIHN0cmluZ3MgdXNpbmcgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eS4gRm9yIGV4YW1wbGUsIHVzZSBcXGBpMThuLnBhZ2VzLmhvbWUudGl0bGUoKVxcYCBmb3IgXFxgeyBcInBhZ2VzXCI6IHsgXCJob21lXCI6IHsgXCJ0aXRsZVwiOiBcIk15IEFwcFwiIH0gfSB9XFxgLmBcbiAgICA6ICcnXG59XG5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcucmVhY3QgfHwgYy5kZXBlbmRpbmcubmV4dClcbiAgICA/IGAtIFByZWZlciBsYW1iZGEgb3ZlciBcXGBmdW5jdGlvblxcYCBmb3IgUmVhY3QgY29tcG9uZW50cywgZS5nLiwgXFxgY29uc3QgQnV0dG9uOiBSZWFjdC5GQyA9ICgpID0+IHtcXGAuXG4tIFByZWZlciBcXGB1c2VJbW1lclxcYCBmb3Igc3RvcmluZyBhbiBhcnJheSBvciBhbiBvYmplY3QgdG8gXFxgdXNlU3RhdGVcXGAuYFxuICAgIDogJydcbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcubmV4dClcbiAgICA/IGBcbi0gU2luY2UgdGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIFxcYHVzZUNhbGxiYWNrXFxgIG9yIFxcYHVzZU1lbW9cXGAgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi5cbi0gQXNzdW1lIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlLlxuYFxuICAgIDogJydcbn1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNTdGFydFRlc3RTZXJ2ZXJTY3JpcHQoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWdzLnNvbWUoKGNvbmZpZykgPT4ge1xuICAgIGlmIChjb25maWcuaGFzU3RhcnRUZXN0U2VydmVyKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyB3YmZ5IGdlbmVyYXRlcyBzdGFydC10ZXN0LXNlcnZlciBsYXRlciBmb3IgUGxheXdyaWdodCByZXBvcyBvbmNlIHdiIGlzXG4gICAgLy8gcHJlc2VudC4gQnVuIHJlcG9zIGdldCB3YiBhcyBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIHRvb2xjaGFpbiwgc28gYWdlbnRcbiAgICAvLyBpbnN0cnVjdGlvbnMgbXVzdCBhbnRpY2lwYXRlIHRoZSBnZW5lcmF0ZWQgc2NyaXB0IGR1cmluZyB0aGUgZmlyc3QgcnVuLlxuICAgIHJldHVybiBjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0ICYmIChjb25maWcuZGVwZW5kaW5nLndiIHx8IGNvbmZpZy5pc0J1bik7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdzbW9sLXRvbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBCdW5maWdUb21sIHtcbiAgaW5zdGFsbD86IHtcbiAgICBleGFjdD86IGJvb2xlYW47XG4gIH07XG4gIHJ1bj86IHtcbiAgICBidW4/OiBib29sZWFuO1xuICB9O1xufVxuXG5jb25zdCBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuICAvLyAtLS0tLS0tLS0tIFNUQVJUOiBXZSBiZWxpZXZlIG91ciBwYWNrYWdlcyBhcmUgc2FmZSAtLS0tLS0tLS0tXG4gICdAZXhlcmNvZGUvcHJvYmxlbS11dGlscycsXG4gICdAd2lsbGJvb3N0ZXIvYWdlbnQtc2tpbGxzJyxcbiAgJ0B3aWxsYm9vc3Rlci9iYWJlbC1jb25maWdzJyxcbiAgJ0B3aWxsYm9vc3Rlci9tb25hY28tbG9hZGVyJyxcbiAgJ0B3aWxsYm9vc3Rlci9tb25hY28tcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItYmxpdHotbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL3diJyxcbiAgJ2FnZW50LXJ1bnRpbWUta2l0JyxcbiAgJ2F0LWRlY29yYXRvcnMnLFxuICAnYnVpbGQtdHMnLFxuICAnZ2VuLWkxOG4tdHMnLFxuICAnb25lLXdheS1naXQtc3luYycsXG4gIC8vIC0tLS0tLS0tLS0gRU5EOiBXZSBiZWxpZXZlIG91ciBwYWNrYWdlcyBhcmUgc2FmZSAtLS0tLS0tLS0tXG5cbiAgLy8gd2JmeSBwaW5zIHRoZXNlIHRvb2xpbmcgcGFja2FnZXMgYW5kIG1heSBhcHBseSB0aGVtIGltbWVkaWF0ZWx5IGFmdGVyIGFcbiAgLy8gcmVsZWFzZSwgYmVmb3JlIHRoZSBnbG9iYWwgbWluaW11bS1yZWxlYXNlLWFnZSB3aW5kb3cgaGFzIGVsYXBzZWQuXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldycsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy1kYXJ3aW4tYXJtNjQnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctZGFyd2luLXg2NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy1saW51eC1hcm0nLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctbGludXgtYXJtNjQnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctbGludXgteDY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LXdpbjMyLWFybTY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LXdpbjMyLXg2NCcsXG4gICdveGZtdCcsXG4gICdAb3hmbXQvYmluZGluZy1hbmRyb2lkLWFybS1lYWJpJyxcbiAgJ0BveGZtdC9iaW5kaW5nLWFuZHJvaWQtYXJtNjQnLFxuICAnQG94Zm10L2JpbmRpbmctZGFyd2luLWFybTY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWRhcndpbi14NjQnLFxuICAnQG94Zm10L2JpbmRpbmctZnJlZWJzZC14NjQnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtLWdudWVhYmloZicsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1hcm0tbXVzbGVhYmloZicsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1hcm02NC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtNjQtbXVzbCcsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1wcGM2NC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtcmlzY3Y2NC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtcmlzY3Y2NC1tdXNsJyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXMzOTB4LWdudScsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC14NjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXg2NC1tdXNsJyxcbiAgJ0BveGZtdC9iaW5kaW5nLW9wZW5oYXJtb255LWFybTY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLXdpbjMyLWFybTY0LW1zdmMnLFxuICAnQG94Zm10L2JpbmRpbmctd2luMzItaWEzMi1tc3ZjJyxcbiAgJ0BveGZtdC9iaW5kaW5nLXdpbjMyLXg2NC1tc3ZjJyxcbiAgJ294bGludCcsXG4gICdAb3hsaW50L2JpbmRpbmctYW5kcm9pZC1hcm0tZWFiaScsXG4gICdAb3hsaW50L2JpbmRpbmctYW5kcm9pZC1hcm02NCcsXG4gICdAb3hsaW50L2JpbmRpbmctZGFyd2luLWFybTY0JyxcbiAgJ0BveGxpbnQvYmluZGluZy1kYXJ3aW4teDY0JyxcbiAgJ0BveGxpbnQvYmluZGluZy1mcmVlYnNkLXg2NCcsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtYXJtLWdudWVhYmloZicsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtYXJtLW11c2xlYWJpaGYnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybTY0LWdudScsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtYXJtNjQtbXVzbCcsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtcHBjNjQtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1yaXNjdjY0LWdudScsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtcmlzY3Y2NC1tdXNsJyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1zMzkweC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXg2NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXg2NC1tdXNsJyxcbiAgJ0BveGxpbnQvYmluZGluZy1vcGVuaGFybW9ueS1hcm02NCcsXG4gICdAb3hsaW50L2JpbmRpbmctd2luMzItYXJtNjQtbXN2YycsXG4gICdAb3hsaW50L2JpbmRpbmctd2luMzItaWEzMi1tc3ZjJyxcbiAgJ0BveGxpbnQvYmluZGluZy13aW4zMi14NjQtbXN2YycsXG4gICdveGxpbnQtdHNnb2xpbnQnLFxuICAnQG94bGludC10c2dvbGludC9kYXJ3aW4tYXJtNjQnLFxuICAnQG94bGludC10c2dvbGludC9kYXJ3aW4teDY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvbGludXgtYXJtNjQnLFxuICAnQG94bGludC10c2dvbGludC9saW51eC14NjQnLFxuICAnQG94bGludC10c2dvbGludC93aW4zMi1hcm02NCcsXG4gICdAb3hsaW50LXRzZ29saW50L3dpbjMyLXg2NCcsXG4gICdAbmV4dC9lbnYnLFxuICAnQG5leHQvZm9udCcsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC1hcm02NC1nbnUnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgtYXJtNjQtbXVzbCcsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC14NjQtZ251JyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LXg2NC1tdXNsJyxcbiAgJ0BuZXh0L3N3Yy1hbmRyb2lkLWFybS1lYWJpJyxcbiAgJ0BuZXh0L3N3Yy1hbmRyb2lkLWFybTY0JyxcbiAgJ0BuZXh0L3N3Yy1kYXJ3aW4tYXJtNjQnLFxuICAnQG5leHQvc3djLWRhcndpbi14NjQnLFxuICAnQG5leHQvc3djLWZyZWVic2QteDY0JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ0BuZXh0L3N3Yy1saW51eC1hcm02NC1nbnUnLFxuICAnQG5leHQvc3djLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG5leHQvc3djLWxpbnV4LXg2NC1nbnUnLFxuICAnQG5leHQvc3djLWxpbnV4LXg2NC1tdXNsJyxcbiAgJ0BuZXh0L3N3Yy13YXNtLW5vZGVqcycsXG4gICdAbmV4dC9zd2Mtd2FzbS13ZWInLFxuICAnQG5leHQvdGhpcmQtcGFydGllcycsXG4gICduZXh0JyxcbiAgJ3JlYWN0JyxcbiAgJ3JlYWN0LWRvbScsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgPyBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29udGVudCA9IG5ld0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgbmV3Q29udGVudCA9IChleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGJ1bmZpZ1RvbWwgPSBwYXJzZUJ1bmZpZ1RvbWwoZXhpc3RpbmdDb250ZW50KTtcbiAgcmV0dXJuIGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuJHtnZW5lcmF0ZVJ1blNlY3Rpb24oYnVuZmlnVG9tbCl9XG5baW5zdGFsbF1cbmV4YWN0ID0gJHtidW5maWdUb21sPy5pbnN0YWxsPy5leGFjdCA9PT0gZmFsc2UgPyAnZmFsc2UnIDogJ3RydWUnfVxubGlua2VyID0gXCJob2lzdGVkXCJcbm1pbmltdW1SZWxlYXNlQWdlID0gNDMyMDAwICMgNSBkYXlzXG5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuJHttaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLm1hcCgocGFja2FnZU5hbWUpID0+IGAgICAgXCIke3BhY2thZ2VOYW1lfVwiLGApLmpvaW4oJ1xcbicpfVxuXVxuYDtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlQnVuZmlnVG9tbChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb250ZW50KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBwYXJzZShjb250ZW50KSBhcyBCdW5maWdUb21sO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUnVuU2VjdGlvbihidW5maWdUb21sOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBidW5maWdUb21sPy5ydW4/LmJ1biA9PT0gJ2Jvb2xlYW4nID8gYFtydW5dXFxuYnVuID0gJHtidW5maWdUb21sLnJ1bi5idW59XFxuYCA6ICcnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2Rl44Gn44Gvbm9kZV9tb2R1bGVz44KSQ09QWeOBmeOCi+W/heimgeOBjOOBguOCi+OBn+OCgeOAgW5vZGVfbW9kdWxlc+OCkumZpOWkluOBl+OBpuOBr+OBhOOBkeOBquOBhOOAglxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5pZGVhXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gIGNvZGVXaXRoMkluZGVudFNpemU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3BwJyxcbiAgICAnZGFydCcsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdwdScsXG4gICAgJ3B1bWwnLFxuICAgICdyYicsXG4gICAgJ3Z1ZScsXG4gICAgJ3htbCcsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdzaCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAnamF2YScsICdweSddLnRvU29ydGVkKCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnRvU29ydGVkKCksXG4gIG94bGludDogWydhc3RybycsICdjanMnLCAnY3RzJywgJ2pzJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3N2ZWx0ZScsICd0cycsICd0c3gnLCAndnVlJ10udG9Tb3J0ZWQoKSxcbiAgb3hmbXQ6IFtcbiAgICAnYXN0cm8nLFxuICAgICdjanMnLFxuICAgICdjc3MnLFxuICAgICdjdHMnLFxuICAgICdncWwnLFxuICAgICdncmFwaHFsJyxcbiAgICAnaGJzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ2pzJyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdqc3gnLFxuICAgICdsZXNzJyxcbiAgICAnbWQnLFxuICAgICdtZHgnLFxuICAgICdtanMnLFxuICAgICdtdHMnLFxuICAgICdzY3NzJyxcbiAgICAnc3ZlbHRlJyxcbiAgICAndG9tbCcsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgcHJldHRpZXJPbmx5OiBbJ2phdmEnXS50b1NvcnRlZCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCIvLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBOYW1lc3BhY2UgWUFNTCBjYWxscyBtYWtlIGxvYWQvZHVtcCB1c2FnZSBjbGVhcmVyLlxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUgfSBmcm9tICcuL2FnZW50cy5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gIGhhdmVfZnVuOiB0cnVlLFxuICBjb2RlX3Jldmlldzoge1xuICAgIGRpc2FibGU6IGZhbHNlLFxuICAgIGNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkOiAnTUVESVVNJyxcbiAgICBtYXhfcmV2aWV3X2NvbW1lbnRzOiAtMSxcbiAgICBwdWxsX3JlcXVlc3Rfb3BlbmVkOiB7XG4gICAgICBoZWxwOiBmYWxzZSxcbiAgICAgIHN1bW1hcnk6IHRydWUsXG4gICAgICBjb2RlX3JldmlldzogdHJ1ZSxcbiAgICB9LFxuICB9LFxuICBpZ25vcmVfcGF0dGVybnM6IFsnKiovX19nZW5lcmF0ZWRfXyddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2VtaW5pQ29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueW1sJyk7XG4gICAgY29uc3Qgc3R5bGVndWlkZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzdHlsZWd1aWRlLm1kJyk7XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoZGVmYXVsdENvbmZpZyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShjb25maWdGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSBwYXJzZWRcbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChuZXdDb25maWcsIHtcbiAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuICAgIGNvbnN0IGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnQ/LnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoJyMnKSA/IHVuZGVmaW5lZCA6IGV4dHJhQ29udGVudDtcbiAgICBjb25zdCByZXZpZXdMYW5ndWFnZUluc3RydWN0aW9uID0gY29uZmlnLmlzUHVibGljUmVwb1xuICAgICAgPyAnUmV2aWV3IGluIEVuZ2xpc2ggYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjb2Rpbmcgc3RhbmRhcmRzLidcbiAgICAgIDogJ+S7peS4i+OBruOCs+ODvOODh+OCo+ODs+OCsOimj+e0hOOCkui4j+OBvuOBiOOBpuOAgeaXpeacrOiqnuOBp+ODrOODk+ODpeODvOOBl+OBpuOBj+OBoOOBleOBhOOAgic7XG4gICAgY29uc3Qgc3R5bGVndWlkZUNvbnRlbnQgPSBgJHtyZXZpZXdMYW5ndWFnZUluc3RydWN0aW9ufVxcblxcbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3MpfSR7XG4gICAgICBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID8gYFxcbiR7Y29kaW5nUnVsZUV4dHJhQ29udGVudC50cmltRW5kKCl9YCA6ICcnXG4gICAgfWA7XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGNvbmZpZ0ZpbGVQYXRoLCB5YW1sQ29udGVudCkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoc3R5bGVndWlkZUZpbGVQYXRoLCBzdHlsZWd1aWRlQ29udGVudCkpLFxuICAgIF07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbWluaVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIERvIG5vdCByZW1vdmUgYHdpbmRvd3NgOiBnZW5lcmF0ZWQgLmdpdGlnbm9yZSBmaWxlcyBtdXN0IGtlZXAgaWdub3JpbmcgV2luZG93cy1jcmVhdGVkIGxvY2FsIGFydGlmYWN0cy5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuIS5rZWVwXG4uYWlkZXIqXG4uZW52LnByb2R1Y3Rpb25cbiovbW91bnQvKi5oYXNoXG4uZGV2Y29udGFpbmVyL1xuLmlkZWEvQXVnbWVudFdlYnZpZXdTdGF0ZVN0b3JlLnhtbFxuLmlkZWEvY29waWxvdC4qXG4uaWRlYS9jb3BpbG90L2NoYXRTZXNzaW9ucy9cbi5wbGF5d3JpZ2h0LWNsaS9cbi5zZXJlbmEvXG4udG1wL1xuLndiL1xuX19nZW5lcmF0ZWRfXy9cbkB3aWxsYm9vc3Rlci9cbmRpc3QvXG5kcml6emxlL21vdW50L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Hb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkphdmEoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5KYXZhIHx8IGNvbmZpZy5kb2VzQ29udGFpbkphdmFJblBhY2thZ2VzO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZykpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuXG5mdW5jdGlvbiBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2RvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBleHRlbnNpb25zLm94Zm10Lm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9veGZtdCAtLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gISoqL3BhY2thZ2UuanNvbicsICdPeGZtdCcsIGV4dCkpLmpvaW4oJycpIDogJyd9XG4ke2RvZXNDb250YWluSmF2YShjb25maWcpID8gZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdub2RlJywgJ25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZScsICdQcmV0dGllcicsIGV4dCkpLmpvaW4oJycpIDogJyd9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbkkxOG5Uc0NvbW1hbmQoXG4gIGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGVwZW5kaW5nJyB8ICdpc0J1bic+LFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8ICFzY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBgJHtjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJ30gcnVuIGdlbi1pMThuLXRzID4gL2Rldi9udWxsYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQsIGFyZ3MsIGN3ZCwgcmV0cnkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiBudW1iZXIge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgY29uc3Qgc3RhdHVzID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgIGlmIChzdGF0dXMgPT09IDApIGJyZWFrO1xuICAgIGlmIChyZXRyeSA8PSAwKSByZXR1cm4gc3RhdHVzO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0ZG91dChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRlcnIgb24gRU5PRU5ULlxuICBjb25zdCBzdGRlcnIgPSBwcm9jLnN0ZGVyciA/PyAnJztcbiAgY29uc3QgZXJyb3IgPSB0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJyA/IHN0ZGVyci50cmltKCkgOiBzdGRlcnIudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChwcm9jLmVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gZmFpbGVkIHdpdGg6ICR7cHJvYy5lcnJvci5tZXNzYWdlfWApO1xuICB9IGVsc2UgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBvdXRwdXRzIHRoZSBmb2xsb3dpbmcgY29udGVudCB0byBzdGRlcnI6XFxuJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZG91dCBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZG91dCA9IHByb2Muc3Rkb3V0ID8/ICcnO1xuICByZXR1cm4gdHlwZW9mIHN0ZG91dCA9PT0gJ3N0cmluZycgPyBzdGRvdXQudHJpbSgpIDogc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ1tdLCBTcGF3blN5bmNPcHRpb25zXSB7XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgLy8gUmVtb3ZlIGJlcnJ5IGZyb20gUEFUSFxuICBpZiAoZW52LlBBVEggJiYgZW52LkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRILnNwbGl0KCc6JylcbiAgICAgIC5maWx0ZXIoKHApID0+IHAgIT09IGVudi5CRVJSWV9CSU5fRk9MREVSKVxuICAgICAgLmpvaW4oJzonKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIGNvbnN0IGtleSA9IG93bmVyID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gICAgZ2V0R2l0SHViQ2xpVG9rZW4oKVxuICApO1xufVxuXG5sZXQgZ2l0SHViQ2xpVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0R2l0SHViQ2xpVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGdpdEh1YkNsaVRva2VuICE9PSB1bmRlZmluZWQpIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTb21lIGxvY2FsIHJ1bnMgcmVseSBvbiBHaXRIdWIgQ0xJIGF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZXhwb3J0ZWQgZW52IHRva2Vucy5cbiAgICBnaXRIdWJDbGlUb2tlbiA9XG4gICAgICBjaGlsZFByb2Nlc3NcbiAgICAgICAgLmV4ZWNGaWxlU3luYygnZ2gnLCBbJ2F1dGgnLCAndG9rZW4nXSwge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICAgIH0pXG4gICAgICAgIC50cmltKCkgfHwgJyc7XG4gIH0gY2F0Y2gge1xuICAgIGdpdEh1YkNsaVRva2VuID0gJyc7XG4gIH1cbiAgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IFtcbiAgJ0B0c2NvbmZpZy9idW4nLFxuICAnQHRzY29uZmlnL25vZGUtbHRzJyxcbiAgJ0B0c2NvbmZpZy9ub2RlLXRzJyxcbiAgJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnLFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9idW4vdHNjb25maWcuanNvbic7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUvdHNjb25maWcuanNvbic7XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzL3RzY29uZmlnLmpzb24nLCAnQHRzY29uZmlnL25vZGUtdHMvdHNjb25maWcuanNvbiddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzJywgJ0B0c2NvbmZpZy9ub2RlLXRzJ107XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiZcbiAgICAhY29uZmlnLmlzUm9vdCAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8ucHJpdmF0ZSAhPT0gdHJ1ZSAmJlxuICAgIEFycmF5LmlzQXJyYXkoY29uZmlnLnBhY2thZ2VKc29uPy5maWxlcykgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24uZmlsZXMubGVuZ3RoID4gMFxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdldEdlbkkxOG5Uc0NvbW1hbmQgfSBmcm9tICcuLi91dGlscy9nZW5JMThuVHMuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5jb25zdCBveGxpbnREZXBzID0gWydAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJywgJ294Zm10JywgJ294bGludCcsICdveGxpbnQtdHNnb2xpbnQnXTtcbmNvbnN0IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgPSAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnO1xuY29uc3QgdHlwZXNjcmlwdERlcGVuZGVuY3kgPSAndHlwZXNjcmlwdCc7XG5jb25zdCB3YkRlcGVuZGVuY3kgPSAnQHdpbGxib29zdGVyL3diJztcbmNvbnN0IGJ1aWxkVHNEZXBlbmRlbmN5ID0gJ2J1aWxkLXRzJztcbmNvbnN0IHdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMgPSBbXG4gICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyxcbiAgd2JEZXBlbmRlbmN5LFxuICAuLi5veGxpbnREZXBzLmZpbHRlcigoZGVwZW5kZW5jeSkgPT4gZGVwZW5kZW5jeS5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpLFxuXTtcbmNvbnN0IG9ic29sZXRlTGludERlcGVuZGVuY2llcyA9IFtcbiAgJ0BiaW9tZWpzL2Jpb21lJyxcbiAgJ0Blc2xpbnQtcmVhY3QvZXNsaW50LXBsdWdpbicsXG4gICdAZXNsaW50L2pzJyxcbiAgJ0BuZXh0L2VzbGludC1wbHVnaW4tbmV4dCcsXG4gICdAdHlwZXMvZXNsaW50JyxcbiAgJ0B0eXBlcy9taWNyb21hdGNoJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInLFxuICAnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnLFxuICAnYmlvbWUnLFxuICAnZXNsaW50JyxcbiAgJ2VzbGludC1jb25maWctZmxhdC1naXRpZ25vcmUnLFxuICAnZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgJ2VzbGludC1jb25maWctcHJldHRpZXInLFxuICAnZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJyxcbiAgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItdHlwZXNjcmlwdCcsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydCcsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydC14JyxcbiAgJ2VzbGludC1wbHVnaW4tcGVyZmVjdGlvbmlzdCcsXG4gICdlc2xpbnQtcGx1Z2luLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4tcmVhY3QnLFxuICAnZXNsaW50LXBsdWdpbi1yZWFjdC1jb21waWxlcicsXG4gICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tc3Rvcnlib29rJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG4gICdlc2xpbnQtcGx1Z2luLXVudXNlZC1pbXBvcnRzJyxcbiAgJ2dsb2JhbHMnLFxuICAnbWljcm9tYXRjaCcsXG4gICd0eXBlc2NyaXB0LWVzbGludCcsXG5dO1xuY29uc3QgbWljcm9tYXRjaFBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWydtaWNyb21hdGNoJywgJ0B0eXBlcy9taWNyb21hdGNoJ10pO1xuY29uc3QgbWljcm9tYXRjaEltcG9ydFBhdHRlcm4gPVxuICAvXFxiZnJvbVxccytbJ1wiXW1pY3JvbWF0Y2hbJ1wiXXxcXGJyZXF1aXJlXFwoXFxzKlsnXCJdbWljcm9tYXRjaFsnXCJdXFxzKlxcKXxcXGJpbXBvcnRcXChcXHMqWydcIl1taWNyb21hdGNoWydcIl1cXHMqXFwpL3U7XG5cbmNvbnN0IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcblxudHlwZSBXcml0YWJsZVBhY2thZ2VKc29uID0gU2V0UmVxdWlyZWQ8XG4gIFBhY2thZ2VKc29uLFxuICAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnXG4+O1xuXG5pbnRlcmZhY2UgRGVwZW5kZW5jeVVwZGF0ZXMge1xuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBkZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcEFkZGluZ0RlcHMpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHNraXBBZGRpbmdEZXBzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25PYmogPSBhd2FpdCByZWFkUGFja2FnZUpzb24oZmlsZVBhdGgpO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuXG4gIGF3YWl0IHJlbW92ZURlcHJlY2F0ZWRTdHVmZihjb25maWcsIGpzb25PYmopO1xuICBhd2FpdCB1cGRhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iaiwgcGFja2FnZU1hbmFnZXIpO1xuICBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgY29uc3QgZGVwZW5kZW5jeVVwZGF0ZXMgPSBhd2FpdCBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuICByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgLy8gWWFybiByZWFkcyBwYWNrYWdlLmpzb24gZnJvbSBkaXNrIGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIGB5YXJuIGFkZCAtRGBcbiAgLy8gY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgcmVndWxhciBkZXBlbmRlbmN5LCBzbyB0aGlzIHdyaXRlIG11c3QgZmluaXNoXG4gIC8vIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlcyBiZWxvdy4gS2VlcCB0aGlzIGJhc2VsaW5lXG4gIC8vIGZpbGUgc29ydGVkIGV2ZW4gd2hlbiB3ZSBsYXRlciBydW4gdGhlIHRhcmdldCByZXBvc2l0b3J5J3MgZm9ybWF0dGVyIHNvIGFcbiAgLy8gbWlkLXJ1biBpbnRlcnJ1cHRpb24gbmV2ZXIgbGVhdmVzIHBhY2thZ2UuanNvbiBpbiBhIHBhcnRpYWxseSBtYW5hZ2VkIG9yZGVyLlxuICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqKSk7XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhjb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzLCBwYWNrYWdlTWFuYWdlcik7XG4gICAgZm9ybWF0UGFja2FnZUpzb25XaXRoUHJvamVjdEZvcm1hdHRlcihjb25maWcsIHBhY2thZ2VNYW5hZ2VyLCBmaWxlUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHN0cmluZyB7XG4gIC8vIGZzVXRpbC5nZW5lcmF0ZUZpbGUoKSBub3JtYWxpemVzIHRoZSB0cmFpbGluZyBuZXdsaW5lLCBzbyBrZWVwIHRoZSBzZXJpYWxpemVyXG4gIC8vIGZvY3VzZWQgb24gdGhlIEpTT04gcGF5bG9hZCBpdHNlbGYuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShzb3J0UGFja2FnZUpzb24oanNvbk9iaiksIHVuZGVmaW5lZCwgMik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxXcml0YWJsZVBhY2thZ2VKc29uPiB7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzID8/IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPz8ge307XG4gIHJldHVybiBqc29uT2JqIGFzIFdyaXRhYmxlUGFja2FnZUpzb247XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmVtb3ZlTGVnYWN5SW5zdGFsbENvbW1hbmRzKGpzb25PYmouc2NyaXB0cyk7XG5cbiAganNvbk9iai5zY3JpcHRzID0geyAuLi5qc29uT2JqLnNjcmlwdHMsIC4uLmdlbmVyYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmouc2NyaXB0cykgfTtcbiAgYWRkU3RhcnRUZXN0U2VydmVyU2NyaXB0SWZOZWVkZWQoY29uZmlnLCBqc29uT2JqKTtcbiAgYWRkSW5zdGFsbFN0ZXBUb0NoZWNrRm9yQWkoanNvbk9iai5zY3JpcHRzLCBwYWNrYWdlTWFuYWdlcik7XG5cbiAgY29uc3Qgc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cztcbiAgaWYgKGNvbmZpZy5pc0J1biB8fCAhZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIHtcbiAgICBkZWxldGUgc2NyaXB0cy5wcmV0dGlmeTtcbiAgfSBlbHNlIHtcbiAgICBzY3JpcHRzLnByZXR0aWZ5ID0gKHNjcmlwdHMucHJldHRpZnkgPz8gJycpICsgKGF3YWl0IGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoY29uZmlnLmRpclBhdGgpKTtcbiAgfVxuICBub3JtYWxpemVZYXJuV29ya3NwYWNlRm9yZWFjaFNjcmlwdHMoc2NyaXB0cyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgIC8vIEZyZXNoIHJlcG9zIHN0aWxsIHJlcXVpcmUgc3RhbmRhbG9uZSBgeWFybiBpbnN0YWxsYDsgb25seSByZW1vdmUgbGVnYWN5IGluc3RhbGwgcHJlZml4ZXMgYmVmb3JlIGFub3RoZXIgY29tbWFuZC5cbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbCgveWFyblxccyooPzppbnN0YWxsXFxzKik/JiZcXHMqL2d1LCAnJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEluc3RhbGxTdGVwVG9DaGVja0ZvckFpKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyk6IHZvaWQge1xuICBpZiAoISgnY2hlY2stZm9yLWFpJyBpbiBzY3JpcHRzKSkgcmV0dXJuO1xuXG4gIGlmICgnZ2VuLWNvZGUnIGluIHNjcmlwdHMpIHtcbiAgICBzY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZSA+IC9kZXYvbnVsbCAmJiAke3NjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG4gIH1cbiAgc2NyaXB0c1snY2hlY2stZm9yLWFpJ10gPSBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbCA+IC9kZXYvbnVsbCAmJiAke3NjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoIXZhbHVlPy5pbmNsdWRlcygneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnKSkgY29udGludWU7XG4gICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbChcbiAgICAgIC95YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCg/IVxccysoPzotQXwtUnwtLSg/OmFsbHxyZWN1cnNpdmV8c2luY2V8d29ya3RyZWV8ZnJvbXxpbmNsdWRlfGV4Y2x1ZGV8cHVibGljfHByaXZhdGUpKSkvZ3UsXG4gICAgICAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnXG4gICAgKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTxEZXBlbmRlbmN5VXBkYXRlcz4ge1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG5cbiAgaWYgKFxuICAgIGhhc0phdmEgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyJyk7XG4gIH0gZWxzZSB7XG4gICAgcmVtb3ZlUHJldHRpZXJBcnRpZmFjdHMoanNvbk9iaik7XG4gIH1cblxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIGRlbGV0ZSAoanNvbk9iaiBhcyBQYWNrYWdlSnNvbiAmIHsgJ2xpbnQtc3RhZ2VkJz86IHVua25vd24gfSlbJ2xpbnQtc3RhZ2VkJ107XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuaHVza3k7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwdWJsaXNoO1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcHVibGlzaE9ubHk7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmVwYWNrO1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdHBhY2s7XG4gICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPSAnbGVmdGhvb2sgaW5zdGFsbCB8fCB0cnVlJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnbGVmdGhvb2snKTtcblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXVxuICAgICAgKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnZlcnNpb24gPSAnMC4wLjAtc2VtYW50aWNhbGx5LXJlbGVhc2VkJztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgLy8gU2luY2UgYXJ0aWxsZXJ5IHJlcXVpcmVzIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBAcGxheXdyaWdodC90ZXN0XG4gICAgICBjb25zdCBoYXNBcnRpbGxlcnkgPSBqc29uT2JqLmRlcGVuZGVuY2llcy5hcnRpbGxlcnkgfHwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5O1xuICAgICAgLy8gU2luY2UgbGxtLXRvb2xib3ggcmVxdWlyZXMgQHBsYXl3cmlnaHQvdGVzdCBpbiBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICghaGFzQXJ0aWxsZXJ5ICYmICFqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAcGxheXdyaWdodC90ZXN0Jyk7XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLlxuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpXG4gICAgICAgID8gbWVyZ2UuYWxsKFtqc29uT2JqLndvcmtzcGFjZXMsIFsncGFja2FnZXMvKiddXSwge1xuICAgICAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogWydwYWNrYWdlcy8qJ107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLndiIHx8IGNvbmZpZy5pc0J1bikge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKC93YlxccytkYi9ndSwgJ3diIHByaXNtYScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGJ1aWxkLXRzIG93bnMgVHlwZVNjcmlwdCBleGVjdXRpb24gYW5kIGRlY2xhcmF0aW9uIGVtaXQuIHdiZnkgbXVzdCBhbHdheXNcbiAgLy8ga2VlcCBleGlzdGluZyBidWlsZC10cyB1c2VycyBjdXJyZW50IGJlY2F1c2Ugb2xkZXIgcmVsZWFzZXMgY2FuIGVtaXQgLmQudHNcbiAgLy8gZmlsZXMgYXQgcGF0aHMgdGhhdCBubyBsb25nZXIgbWF0Y2ggcGFja2FnZSBleHBvcnRzLlxuICBpZiAoXG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAgT2JqZWN0LnZhbHVlcyhqc29uT2JqLnNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gc2NyaXB0Py5pbmNsdWRlcyhidWlsZFRzRGVwZW5kZW5jeSkpXG4gICkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgfVxuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLm94bGludERlcHMpO1xuICB9XG5cbiAgY29uc3QgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSA/IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpIDogW107XG4gIGF3YWl0IHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmosIHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLnRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh0eXBlc2NyaXB0R29EZXBlbmRlbmN5KTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAvLyBOZXh0LmpzIHN0aWxsIHVzZXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGR1cmluZyBkZXYvYnVpbGQgc3RhcnR1cCBmb3JcbiAgICAgIC8vIFR5cGVTY3JpcHQgYXBwcyBldmVuIHdoZW4gcmVwb3NpdG9yaWVzIGRlbGVnYXRlIGV4cGxpY2l0IHR5cGVjaGVja2luZyB0byB0c2dvLlxuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdERlcGVuZGVuY3kpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2J1bicpO1xuICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvbm9kZScpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1sndHMtamVzdCddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICAgKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2plc3QnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlcGVuZGVuY2llczogZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgZGV2RGVwZW5kZW5jaWVzOiBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBweXRob25EZXZEZXBlbmRlbmNpZXMsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCBweXRob25EZXZEZXBlbmRlbmNpZXMgfTtcbn1cblxuZnVuY3Rpb24gbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgW3diRGVwZW5kZW5jeSwgYnVpbGRUc0RlcGVuZGVuY3ldKSB7XG4gICAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgY29udGludWU7XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPz89IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFqc29uT2JqLm5hbWUpIHtcbiAgICBqc29uT2JqLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgYXdhaXQgbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKGNvbmZpZywganNvbk9iaik7XG4gIGlmICghY29uZmlnLmlzUm9vdCAmJiBqc29uT2JqLnByaXZhdGUgJiYgIWpzb25PYmoubWFpbikge1xuICAgIC8vIE1ha2UgVlNDb2RlIHBvc3NpYmxlIHRvIHJlZmFjdG9yIGNvZGUgYWNyb3NzIHN1YnBhY2thZ2VzLlxuICAgIGpzb25PYmoubWFpbiA9ICcuL3NyYyc7XG4gIH1cblxuICAvLyBZYXJuIHRyZWF0cyB0aGUgbGVnYWN5IG5wbS9jaGFsayByZXNvbHV0aW9uIGFsaWFzIGFzIGFuIGludmFsaWQgcGFja2FnZSB0b2tlbi5cbiAgZGVsZXRlIGpzb25PYmoucmVzb2x1dGlvbnM/LlsnbnBtL2NoYWxrJ107XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBpZiAoIWNvbmZpZy5pc0J1bikge1xuICAgICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMubGludDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXTtcbiAgICAgICAgZm9yIChjb25zdCBzY3JpcHROYW1lIG9mIFsnY2xlYW51cCcsICdjaGVjay1mb3ItYWknXSkge1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICAgICAgICBpZiAoIXNjcmlwdCkgY29udGludWU7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdID0gc2NyaXB0LnJlcGxhY2UoLyA/JiYgP3lhcm4gbGludC1maXgoPzogLS1xdWlldCk/LywgJycpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPz8gJ3lhcm4gbGludCAtLWZpeCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCwgY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICBpZiAoanNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID09PSAncG9ldHJ5IGluc3RhbGwnKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2NvbW1vbi9jaS1zZXR1cCddID0gYHlhcm4gc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScgPyAndXYnIDogJ3BvZXRyeSd9YF07XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzZXR1cC1wb2V0cnktYXNkZiddO1xuICAgICAganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWBdID0gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHB5dGhvblBhY2thZ2VNYW5hZ2VyKTtcbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChmaXJzdCAmJiBzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAgY29uc3QgcHl0aG9uUnVubmVyID0gYCR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9IHJ1bmA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYCR7cHl0aG9uUnVubmVyfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgJHtweXRob25SdW5uZXJ9IGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQsIGNvbmZpZyk7XG4gICAgICAgIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnkgfHwganNvbk9iai5yZXBvc2l0b3J5KSB7XG4gICAganNvbk9iai5yZXBvc2l0b3J5ID0gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKGNvbmZpZy5yZXBvc2l0b3J5ID8/IGpzb25PYmoucmVwb3NpdG9yeSwganNvbk9iai5yZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ2JsaXR6IGNvZGVnZW4nKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ2JsaXR6IGNvZGVnZW4nO1xuICAgIH0gZWxzZSBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5pbmNsdWRlcygnYmxpdHogcHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5yZXBsYWNlKFxuICAgICAgICAnYmxpdHogY29kZWdlbicsXG4gICAgICAgICdibGl0eiBjb2RlZ2VuICYmIGJsaXR6IHByaXNtYSBnZW5lcmF0ZSdcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hICYmICFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ3ByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ3ByaXNtYSBnZW5lcmF0ZSc7XG4gIH1cbiAgYWRkR2VuSTE4blRzUG9zdGluc3RhbGxTY3JpcHQoY29uZmlnLCBqc29uT2JqKTtcblxuICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzLnByZXR0aWVyKSB7XG4gICAgLy8gQmVjYXVzZSBAdHlwZXMvcHJldHRpZXIgYmxvY2tzIHByZXR0aWVyIGV4ZWN1dGlvbi5cbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlcy9wcmV0dGllciddO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGZvcm1hdFNjcmlwdDogc3RyaW5nIHwgdW5kZWZpbmVkLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBCdW4gcHJvamVjdHMgbWF5IG5vdCBoYXZlIGEgWWFybiBsb2NrZmlsZSwgc28gZ2VuZXJhdGVkIHBhY2thZ2Ugc2NyaXB0c1xuICAvLyBtdXN0IGludm9rZSBsb2NhbCBwYWNrYWdlIHNjcmlwdHMgdGhyb3VnaCB0aGUgcmVwb3NpdG9yeSdzIHBhY2thZ2UgbWFuYWdlci5cbiAgY29uc3Qgc2NyaXB0UnVubmVyID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICByZXR1cm4gZm9ybWF0U2NyaXB0ID8gYCR7Zm9ybWF0U2NyaXB0fSAmJiAke3NjcmlwdFJ1bm5lcn0gZm9ybWF0LWNvZGVgIDogYCR7c2NyaXB0UnVubmVyfSBmb3JtYXQtY29kZWA7XG59XG5cbmZ1bmN0aW9uIGFkZEdlbkkxOG5Uc1Bvc3RpbnN0YWxsU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBjb21tYW5kID0gZ2V0R2VuSTE4blRzQ29tbWFuZChjb25maWcsIGpzb25PYmouc2NyaXB0cyk7XG4gIGlmICghY29tbWFuZCkgcmV0dXJuO1xuXG4gIGNvbnN0IHBvc3RpbnN0YWxsID0ganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICBpZiAoIXBvc3RpbnN0YWxsKSB7XG4gICAganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID0gY29tbWFuZDtcbiAgfSBlbHNlIGlmICghcG9zdGluc3RhbGwuaW5jbHVkZXMoY29tbWFuZCkpIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPSBgJHtwb3N0aW5zdGFsbH0gJiYgJHtjb21tYW5kfWA7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpKSByZXR1cm47XG5cbiAgY29uc3QgY29uZmlnTWpzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5tanMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ01qc1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai50eXBlID0gJ21vZHVsZSc7XG5cbiAgY29uc3QgY29uZmlnRHRzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLnRzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdEdHNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmouZmlsZXMgPSBbLi4ubmV3IFNldChbLi4uKGpzb25PYmouZmlsZXMgPz8gW10pLCAnY29uZmlnLmQubXRzJ10pXTtcbiAgLy8gTm9kZU5leHQgcmVzb2x2ZXMgYSByZWxhdGl2ZSBgLi9jb25maWcubWpzYCBpbXBvcnQgdG8gYGNvbmZpZy5kLm10c2AsIG5vdFxuICAvLyB0aGUgcGFja2FnZS1sZXZlbCBgdHlwZXNgIGZpZWxkLiBLZWVwIHRoZSBwdWJsaXNoZWQgY29uZmlnIGltcG9ydGFibGUgZnJvbVxuICAvLyBwYWNrYWdlLWxvY2FsIFR5cGVTY3JpcHQgbGludGVyIHNldHRpbmdzLlxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC5tdHMnKSwgY29uZmlnRG10c0NvbnRlbnQpKTtcbn1cblxuY29uc3QgY29uZmlnRG10c0NvbnRlbnQgPSBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vY29uZmlnLmpzJztcbmA7XG5cbmZ1bmN0aW9uIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbiwgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzKTogdm9pZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzLCBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMpO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBdKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsXG4gICAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBqc29uT2JqW2tleV07XG4gICAgaWYgKHNlY3Rpb24gJiYgT2JqZWN0LmtleXMoc2VjdGlvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmosIGtleSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybidcbik6IHZvaWQge1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9LCBkZXBlbmRlbmNpZXMsIGZhbHNlKTtcblxuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9LCBkZXZEZXBlbmRlbmNpZXMsIHRydWUpO1xuXG4gIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyICYmIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gWy4uLm5ldyBTZXQoZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzKV07XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5Jykge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKCd1dicsIFsnYWRkJywgJy0tZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5JyB8ICd1dicgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSByZXR1cm4gJ3V2JztcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHJldHVybiAncG9ldHJ5Jztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHBhY2thZ2VNYW5hZ2VyOiAncG9ldHJ5JyB8ICd1dicpOiBzdHJpbmcge1xuICBpZiAocGFja2FnZU1hbmFnZXIgPT09ICd1dicpIHJldHVybiAndXYgc3luYyAtLWZyb3plbic7XG4gIHJldHVybiAncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUgJiYgcG9ldHJ5IGVudiB1c2UgJChtaXNlIGN1cnJlbnQgcHl0aG9uKSAmJiBwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAgJiYgcG9ldHJ5IGluc3RhbGwnO1xufVxuXG5mdW5jdGlvbiBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyxcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIGRldjogYm9vbGVhblxuKTogdm9pZCB7XG4gIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGVwZW5kZW5jeVNwZWNpZmllcnMgPSBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIGRlcGVuZGVuY2llcy5tYXAoKGRlcGVuZGVuY3kpID0+XG4gICAgICAgIGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldLCBwYWNrYWdlTWFuYWdlcilcbiAgICAgIClcbiAgICApLFxuICBdO1xuICBzcGF3blN5bmMoXG4gICAgcGFja2FnZU1hbmFnZXIsXG4gICAgWydhZGQnLCAuLi4oZGV2ID8gWyctRCddIDogW10pLCAuLi4oY29uZmlnLmlzQnVuID8gWyctLWV4YWN0J10gOiBbXSksIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSxcbiAgICBjb25maWcuZGlyUGF0aFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihcbiAgZGVwZW5kZW5jeTogc3RyaW5nLFxuICBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybidcbik6IHN0cmluZyB7XG4gIC8vIFlhcm4gcHJlZmVycyBsb2NhbCB3b3Jrc3BhY2VzIHdoZW4gYWRkaW5nIGEgYmFyZSBwYWNrYWdlIG5hbWUuIFBhc3NpbmcgdGhlXG4gIC8vIHJlc29sdmVkIHZlcnNpb24ga2VlcHMgbWFuYWdlZCB0b29scyBhcyBucG0gZGVwZW5kZW5jaWVzIGluIGNvbmZpZy1wYWNrYWdlXG4gIC8vIG1vbm9yZXBvcywgd2hlcmUgdGhvc2UgcGFja2FnZSBuYW1lcyBjYW4gYWxzbyBleGlzdCBhcyB3b3Jrc3BhY2VzLlxuICBpZiAocGFja2FnZU1hbmFnZXIgPT09ICd5YXJuJyAmJiBjdXJyZW50VmVyc2lvbiAmJiAhaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKGN1cnJlbnRWZXJzaW9uKSkge1xuICAgIHJldHVybiBgJHtkZXBlbmRlbmN5fUAke2N1cnJlbnRWZXJzaW9ufWA7XG4gIH1cblxuICByZXR1cm4gZ2V0RGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llc1RvSW5zdGFsbDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG5ldyBTZXQoZGVwZW5kZW5jaWVzKSkge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSA9IHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koXG4gICAgICBkZXBlbmRlbmN5LFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV1cbiAgICApO1xuICAgIGlmIChzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kpIHtcbiAgICAgIGRlcGVuZGVuY2llc1RvSW5zdGFsbC5wdXNoKGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAmJlxuICAgICAgIXNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSAmJlxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gIT09ICcqJ1xuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSk7XG4gIH1cbiAgcmV0dXJuIGRlcGVuZGVuY2llc1RvSW5zdGFsbDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UGFja2FnZUpzb25XaXRoUHJvamVjdEZvcm1hdHRlcihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybicsXG4gIGZpbGVQYXRoOiBzdHJpbmdcbik6IHZvaWQge1xuICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICBpZiAoIXJlbGF0aXZlRmlsZVBhdGgpIHJldHVybjtcblxuICAvLyBSZXVzZSB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBvd24gZm9ybWF0dGVyIGFmdGVyIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uIHNvXG4gIC8vIHBhY2thZ2UuanNvbiBtYXRjaGVzIHdoYXRldmVyIGl0cyBjdXJyZW50IHNvcnQtcGFja2FnZS1qc29uIHZlcnNpb24gZXhwZWN0cy5cbiAgLy8gVGhpcyBhdm9pZHMgZm9sbG93LXVwIGF1dG9maXggY29tbWl0cyBjYXVzZWQgb25seSBieSBmb3JtYXR0ZXIgdmVyc2lvbiBkcmlmdFxuICAvLyBiZXR3ZWVuIHdiZnkgYW5kIHRoZSBwcm9qZWN0IGJlaW5nIHVwZGF0ZWQuXG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ2J1bicpIHtcbiAgICBzcGF3blN5bmMoJ2J1bngnLCBbJ3NvcnQtcGFja2FnZS1qc29uJywgcmVsYXRpdmVGaWxlUGF0aF0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0aGUgZm9sbG93aW5nIG1pZ3JhdGlvbiBjb2RlIGluIGZ1dHVyZVxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChqc29uT2JqLmF1dGhvciA9PT0gJ1dpbGxCb29zdGVyIExMQycpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICByZW1vdmVTZWxmRGVwZW5kZW5jeShjb25maWcsIGpzb25PYmopO1xuICByZXBsYWNlV2lsbEJvb3N0ZXJDb25maWdzV29ya3NwYWNlRGVwZW5kZW5jeVJhbmdlcyhjb25maWcsIGpzb25PYmopO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LWFsbC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrL3dhcm4nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmdlbi1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpjb2RlZ2VuJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy50c2xpYjtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3RzY29uZmlnJ107XG4gIC8vIE5leHQuanMgc3RpbGwgcmVxdWlyZXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGF0IGJ1aWxkL2RldiB0aW1lIGZvclxuICAvLyBUeXBlU2NyaXB0IHByb2plY3RzIGV2ZW4gd2hlbiByZXBvcyB1c2UgdHNnbyBmb3IgZXhwbGljaXQgdHlwZWNoZWNraW5nLlxuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gIH1cbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmxlcm5hO1xuICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmbHV0dGVyLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtZmx1dHRlciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydweXRob24tZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1weXRob24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGllcjtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stYWxsJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3ZlcmlmeS1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3ZlcmlmeS1jb2RlLXdpdGgtdGVzdHMnXTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2xlcm5hLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgcmVtb3ZlV2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmopO1xuICByZW1vdmVPYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMoanNvbk9iaiwgY29uZmlnKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU2VsZkRlcGVuZGVuY3koXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBqc29uT2JqLm5hbWUgfHwgcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG5cbiAgLy8gQSBwYWNrYWdlIGNhbiBpbXBvcnQgaXRzZWxmIHRocm91Z2ggTm9kZSdzIHBhY2thZ2Ugc2VsZi1yZWZlcmVuY2Ugd2l0aG91dFxuICAvLyBkZWNsYXJpbmcgaXRzZWxmOyBrZWVwaW5nIHRoYXQgZWRnZSBicmVha3MgbW9ub3JlcG8gcmVsZWFzZSB0b3BvbG9naWNhbCBzb3J0aW5nLlxuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZWN0aW9uLCBwYWNrYWdlTmFtZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpbGxCb29zdGVyQ29uZmlnc1dvcmtzcGFjZURlcGVuZGVuY3lSYW5nZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5LCB2ZXJzaW9uXSBvZiBPYmplY3QuZW50cmllcyhzZWN0aW9uKSkge1xuICAgICAgaWYgKCF2ZXJzaW9uKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKHZlcnNpb24pKSBjb250aW51ZTtcbiAgICAgIC8vIHdpbGxib29zdGVyLWNvbmZpZ3MgcHVibGlzaGVzIHRoZXNlIHBhY2thZ2VzIGluZGVwZW5kZW50bHksIHNvIGdlbmVyYXRlZFxuICAgICAgLy8gcGFja2FnZSBtZXRhZGF0YSBtdXN0IGRlc2NyaWJlIG5wbSByZWxlYXNlIGVkZ2VzIGluc3RlYWQgb2YgbG9jYWxcbiAgICAgIC8vIHdvcmtzcGFjZSBlZGdlcyB0aGF0IHJlbGVhc2UgdG9vbGluZyB0cmVhdHMgYXMgbW9ub3JlcG8gZ3JhcGggbGlua3MuXG4gICAgICAvLyBUaGUgZmluYWwgYHlhcm4gaW5zdGFsbCAtLW5vLWltbXV0YWJsZWAgc3luY3MgdGhlIGxvY2tmaWxlIGFmdGVyIHRoaXNcbiAgICAgIC8vIG1pZ3JhdGlvbiwgZXZlbiB3aGVuIHRoZSBkZXBlbmRlbmN5IGlzIG5vdCBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIGxpc3QuXG4gICAgICBzZWN0aW9uW2RlcGVuZGVuY3ldID0gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHJldHVybjtcblxuICBjb25zdCBzZWN0aW9ucyA9IGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMpIHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyB0aGVzZSBtYW5hZ2VkIGNvbmZpZyBwYWNrYWdlcyBmcm9tIHRoZSBzYW1lXG4gICAgLy8gbW9ub3JlcG8uIEtlZXBpbmcgdGhlbSBpbiBzdWJwYWNrYWdlIG1ldGFkYXRhIGNyZWF0ZXMgbG9jYWwgd29ya3NwYWNlXG4gICAgLy8gZ3JhcGggZWRnZXMgdGhhdCBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlIHNvcnRzIGFzIHJlbGVhc2UgZGVwZW5kZW5jaWVzLlxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZWN0aW9uLCBkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHVzZWREZXBlbmRlbmNpZXM6IHN0cmluZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdXNlZERlcGVuZGVuY3lTZXQgPSBuZXcgU2V0KHVzZWREZXBlbmRlbmNpZXMpO1xuICBjb25zdCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGF3YWl0IGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgaWYgKHVzZWREZXBlbmRlbmN5U2V0LmhhcyhkZXBlbmRlbmN5KSB8fCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5oYXMoZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBiYXNlLWNvbmZpZyBwYWNrYWdlcy4gUmVtb3ZlIHN0YWxlIHZhcmlhbnRzIHdoZW4gcmVwb1xuICAgIC8vIGNhcGFiaWxpdGllcyBjaGFuZ2UsIHN1Y2ggYXMgTmV4dC5qcyB0YWtpbmcgb3duZXJzaGlwIG9mIHRzY29uZmlnLmpzb24uXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZWN0aW9uLCBkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxTZXQ8c3RyaW5nPj4ge1xuICBjb25zdCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCBmZy5nbG9iKCcqKi90c2NvbmZpZyouanNvbicsIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgY29uc3QgYWJzb2x1dGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB0cy5wYXJzZUNvbmZpZ0ZpbGVUZXh0VG9Kc29uKFxuICAgICAgICBhYnNvbHV0ZUZpbGVQYXRoLFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShhYnNvbHV0ZUZpbGVQYXRoLCAndXRmOCcpXG4gICAgICApO1xuICAgICAgaWYgKHBhcnNlZC5lcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFByZXNlcnZlIG1hbmFnZWQgQHRzY29uZmlnIGRlcGVuZGVuY2llcyBiZWNhdXNlICR7YWJzb2x1dGVGaWxlUGF0aH0gY291bGQgbm90IGJlIHBhcnNlZDogJHtmb3JtYXRUc0RpYWdub3N0aWMocGFyc2VkLmVycm9yKX1gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBub3JtYWxpemVUc2NvbmZpZ0V4dGVuZHMoKHBhcnNlZC5jb25maWcgYXMgeyBleHRlbmRzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uZXh0ZW5kcykpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IGRlcGVuZGVuY3kgfHwgdmFsdWUuc3RhcnRzV2l0aChgJHtkZXBlbmRlbmN5fS9gKSkge1xuICAgICAgICAgICAgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBQcmVzZXJ2ZSBtYW5hZ2VkIEB0c2NvbmZpZyBkZXBlbmRlbmNpZXMgYmVjYXVzZSAke2Fic29sdXRlRmlsZVBhdGh9IGNvdWxkIG5vdCBiZSByZWFkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIG5ldyBTZXQobWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUc0RpYWdub3N0aWMoZGlhZ25vc3RpYzogdHMuRGlhZ25vc3RpYyk6IHN0cmluZyB7XG4gIHJldHVybiB0cy5mbGF0dGVuRGlhZ25vc3RpY01lc3NhZ2VUZXh0KGRpYWdub3N0aWMubWVzc2FnZVRleHQsICdcXG4nKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVHNjb25maWdFeHRlbmRzKHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIFt2YWx1ZV07XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIHZhbHVlLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj5bXSB7XG4gIHJldHVybiBkZXBlbmRlbmN5U2VjdGlvbktleXNcbiAgICAubWFwKChrZXkpID0+IGpzb25PYmpba2V5XSlcbiAgICAuZmlsdGVyKChzZWN0aW9uKTogc2VjdGlvbiBpcyBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+ICEhc2VjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhY2hlZFZlcnNpb24gPSBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLmdldChkZXBlbmRlbmN5KTtcbiAgaWYgKGNhY2hlZFZlcnNpb24pIHJldHVybiBjYWNoZWRWZXJzaW9uO1xuXG4gIGNvbnN0IHZlcnNpb24gPSBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuc2V0KGRlcGVuZGVuY3ksIHZlcnNpb24pO1xuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIG5wbSdzIGxhdGVzdCBkaXN0LXRhZyBzdGlsbCB0cmFja3MgVFM3IGRldiBzbmFwc2hvdHM7IHdiZnkgc2hvdWxkIGZvbGxvd1xuICAvLyB0aGUgcHVibGljIGJldGEgY2hhbm5lbCB1bnRpbCB0aGUgc3RhYmxlIFRTNyBwYWNrYWdlIGxheW91dCBpcyBmaW5hbGl6ZWQuXG4gIHJldHVybiAoXG4gICAgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICAgJ25wbScsXG4gICAgICBbJ3Nob3cnLCBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3kpLCAndmVyc2lvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSxcbiAgICAgIHByb2Nlc3MuY3dkKClcbiAgICApIHx8ICcqJ1xuICApO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBkZXBlbmRlbmN5ID09PSB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID8gYCR7ZGVwZW5kZW5jeX1AYmV0YWAgOiBkZXBlbmRlbmN5O1xufVxuXG5mdW5jdGlvbiByZW1vdmVPYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMoXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPixcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnXG4pOiB2b2lkIHtcbiAgY29uc3QgcHJlc2VydmVNaWNyb21hdGNoID0gc2hvdWxkUHJlc2VydmVNaWNyb21hdGNoKGNvbmZpZyk7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBvYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAocHJlc2VydmVNaWNyb21hdGNoICYmIG1pY3JvbWF0Y2hQYWNrYWdlTmFtZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICBpZiAoc2hvdWxkUHJlc2VydmVDb25maWdQYWNrYWdlTGludERlcGVuZGVuY3koanNvbk9iaiwgY29uZmlnLCBkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5KFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz4sXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZGVwZW5kZW5jeTogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgaWYgKCFpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBQdWJsaXNoZWQgY29uZmlnIHBhY2thZ2VzIG5lZWQgbG9jYWwgdHlwZS1vbmx5IGRlcHMgdG8gdmFsaWRhdGUgdGhlXG4gIC8vIHBhY2thZ2UtcHJvdmlkZWQgY29uZmlnIGRlY2xhcmF0aW9ucyB1bmRlciBZYXJuIFBuUC5cbiAgcmV0dXJuIGRlcGVuZGVuY3kgPT09ICdAdHlwZXMvZXNsaW50JyAmJiAhIWpzb25PYmoucGVlckRlcGVuZGVuY2llcy5lc2xpbnQ7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXNlcnZlTWljcm9tYXRjaChjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBzdWJwYWNrYWdlcyBwdWJsaXNoIGNvbmZpZyBmaWxlcyBhcyB0aGVpciBwcm9kdWN0LCBzb1xuICAvLyBtaWNyb21hdGNoIGlzIHBhY2thZ2UgZGF0YSB0aGVyZS4gT3RoZXIgcmVwb3Mga2VlcCBtaWNyb21hdGNoIG9ubHkgd2hlblxuICAvLyBwcm9kdWN0IGNvZGUgaW1wb3J0cyBpdDsgb3RoZXJ3aXNlIGl0IGlzIHRyZWF0ZWQgYXMgb2Jzb2xldGUgRVNMaW50LWVyYVxuICAvLyB0b29saW5nLlxuICByZXR1cm4gKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJiAhY29uZmlnLmlzUm9vdCkgfHwgZG9lc1Byb2R1Y3RDb2RlSW1wb3J0TWljcm9tYXRjaChjb25maWcuZGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2goZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGZpbGVQYXRocyA9IGZnLmdsb2JTeW5jKCdzcmMvKiovKi57anMsanN4LG1qcyxjanMsdHMsdHN4LG10cyxjdHN9Jywge1xuICAgIGN3ZDogZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcbiAgcmV0dXJuIGZpbGVQYXRocy5zb21lKChmaWxlUGF0aCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbWljcm9tYXRjaEltcG9ydFBhdHRlcm4udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVQYXRoKSwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShkZXBlbmRlbmN5OiBzdHJpbmcsIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFjdXJyZW50VmVyc2lvbikgcmV0dXJuIHRydWU7XG4gIGlmIChjdXJyZW50VmVyc2lvbiA9PT0gJyonKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZShjdXJyZW50VmVyc2lvbikpIHJldHVybiB0cnVlO1xuICAvLyB3YmZ5LW1hbmFnZWQgdG9vbHMgbXVzdCBiZSBrZXB0IGN1cnJlbnQgZXZlbiB3aGVuIHRoZSBwYWNrYWdlIGFscmVhZHkgcGluc1xuICAvLyBhIGNvbmNyZXRlIHZlcnNpb24uIEluIHBhcnRpY3VsYXIsIGJ1aWxkLXRzIG93bnMgZGVjbGFyYXRpb24gb3V0cHV0IHBhdGhzLlxuICByZXR1cm4gKFxuICAgIGRlcGVuZGVuY3kgPT09ICdAd2lsbGJvb3N0ZXIvd2InIHx8XG4gICAgZGVwZW5kZW5jeSA9PT0gYnVpbGRUc0RlcGVuZGVuY3kgfHxcbiAgICBveGxpbnREZXBzLmluY2x1ZGVzKGRlcGVuZGVuY3kpIHx8XG4gICAgZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdEdvRGVwZW5kZW5jeVxuICApO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB2ZXJzaW9uLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKTtcbn1cblxuZnVuY3Rpb24gYWRkU3RhcnRUZXN0U2VydmVyU2NyaXB0SWZOZWVkZWQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoXG4gICAgIWNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QgfHxcbiAgICAhKGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgY29uZmlnLmlzQnVuKSB8fFxuICAgIGpzb25PYmouc2NyaXB0cz8uWydzdGFydC10ZXN0LXNlcnZlciddXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGpzb25PYmouc2NyaXB0cyA/Pz0ge307XG4gIC8vIG1pc2Ugb2Z0ZW4gb3ducyBlbnYgbG9hZGluZyBhbmQgZGF0YWJhc2UgcHJlcGFyYXRpb24gZm9yIGxvY2FsIHdlYiBzZXJ2ZXJzLlxuICAvLyBQcmVmZXIgYSBkZWRpY2F0ZWQgbm9uLXJlY3Vyc2l2ZSB0ZXN0LXNlcnZlciB0YXNrIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gdGhlIGdlbmVyaWMgc3RhcnQgdGFzay5cbiAgY29uc3QgdGFza05hbWUgPSBnZXRTYWZlTWlzZVRhc2tOYW1lKGNvbmZpZywgWydzdGFydC10ZXN0LXNlcnZlcicsICdzdGFydCddKTtcbiAganNvbk9iai5zY3JpcHRzWydzdGFydC10ZXN0LXNlcnZlciddID0gdGFza05hbWUgPyBgbWlzZSBydW4gJHt0YXNrTmFtZX1gIDogJ3diIHN0YXJ0IC0tbW9kZSB0ZXN0Jztcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3Qgbm9ybWFsaXplZFJlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZFJlcG9zaXRvcnksIHJlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9zaXRvcnk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICghcmVwb3NpdG9yeS5zdGFydHNXaXRoKCdnaXRodWI6JykpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUocmVwb3NpdG9yeSk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG4gIH1cblxuICBjb25zdCByZXBvc2l0b3J5VXJsID0gcmVwb3NpdG9yeT8udXJsO1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnlVcmwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgbWF0Y2hlZCA9IC9eKD86Z2l0XFwrKT9odHRwczpcXC9cXC9naXRodWJcXC5jb21cXC8oW14vXSspXFwvKFteL10rPykoPzpcXC5naXQpPyQvdS5leGVjKHJlcG9zaXRvcnlVcmwpO1xuICBpZiAoIW1hdGNoZWQpIHJldHVybjtcblxuICBjb25zdCBbLCBvd25lciwgcmVwb10gPSBtYXRjaGVkO1xuICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xufVxuXG5mdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIG5vcm1hbGl6ZWRVcmw6IHN0cmluZyxcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IHJlcG9zaXRvcnlPYmogPVxuICAgIHR5cGVvZiByZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgPyByZXBvc2l0b3J5XG4gICAgICA6IHR5cGVvZiBleGlzdGluZ1JlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICAgID8gZXhpc3RpbmdSZXBvc2l0b3J5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucmVwb3NpdG9yeU9iaixcbiAgICB0eXBlOiAnZ2l0JyxcbiAgICB1cmw6IG5vcm1hbGl6ZWRVcmwsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnY2hlY2stYWxsLWZvci1haSc6ICdidW4gcnVuIGNoZWNrLWZvci1haSAmJiBidW4gcnVuIHRlc3QnLFxuICAgICAgJ2NoZWNrLWZvci1haSc6ICdidW4gcnVuIGNsZWFudXAnLFxuICAgICAgY2xlYW51cDogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0JyxcbiAgICAgIGZvcm1hdDogYGJ1biAtLWJ1biB3YiBsaW50IC0tZm9ybWF0YCxcbiAgICAgIGxpbnQ6IGBidW4gLS1idW4gd2IgbGludGAsXG4gICAgICAnbGludC1maXgnOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXgnLFxuICAgICAgdGVzdDogJ2J1biB3YiB0ZXN0JyxcbiAgICAgIHR5cGVjaGVjazogJ2J1biAtLWJ1biB3YiB0eXBlY2hlY2snLFxuICAgICAgdmVyaWZ5OiAnYnVuIC0tYnVuIHdiIHZlcmlmeScsXG4gICAgICAndmVyaWZ5LWZ1bGwnOiAnYnVuIC0tYnVuIHdiIHZlcmlmeSAtLWZ1bGwnLFxuICAgIH07XG4gICAgYXBwbHlNaXNlVGFza1NjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ2J1aWxkJywgJ2RldicsICdzdGFydCcsICd0ZXN0JywgJ3R5cGVjaGVjayddKTtcbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAnICYmIHB5cmlnaHQnO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG4gICAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuICAgIGNvbnN0IG9sZFRlc3QgPSBvbGRTY3JpcHRzLnRlc3Q7XG4gICAgbGV0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnY2hlY2stYWxsLWZvci1haSc6ICd5YXJuIGNoZWNrLWZvci1haSAmJiB5YXJuIHRlc3QnLFxuICAgICAgJ2NoZWNrLWZvci1haSc6IGB5YXJuIGZvcm1hdCA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwgfHwgdHJ1ZSAmJiB5YXJuIGxpbnQtZml4IC0tcXVpZXRgLFxuICAgICAgY2xlYW51cDogJ3lhcm4gZm9ybWF0ICYmIHlhcm4gbGludC1maXgnLFxuICAgICAgZm9ybWF0OiBnZW5lcmF0ZUZvcm1hdFNjcmlwdChoYXNKc09yVHMsIGhhc0phdmEpLFxuICAgICAgbGludDogYG94bGludCAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC5gLFxuICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gbGludCAtLWZpeCcsXG4gICAgICAnZm9ybWF0LWNvZGUnOiBgb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC4gJyEqKi9wYWNrYWdlLmpzb24nYCxcbiAgICAgIHR5cGVjaGVjazogJ3RzZ28gLS1ub0VtaXQnLFxuICAgIH07XG4gICAgaWYgKGhhc0phdmEpIHtcbiAgICAgIHNjcmlwdHMucHJldHRpZnkgPSBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkuam9pbignLCcpfX1cIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgc2NyaXB0cyA9IG1lcmdlKFxuICAgICAgICB7IC4uLnNjcmlwdHMgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZvcm1hdDogYCR7c2NyaXB0cy5mb3JtYXR9ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgLy8gQ0k9MSBwcmV2ZW50cyB2aXRlc3QgZnJvbSBlbmFibGluZyB3YXRjaC5cbiAgICAgICAgICAvLyBGT1JDRV9DT0xPUj0zIG1ha2Ugd2IgZW5hYmxlIGNvbG9yIG91dHB1dC5cbiAgICAgICAgICB0ZXN0OiAnQ0k9MSBGT1JDRV9DT0xPUj0zIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tdmVyYm9zZSBydW4gdGVzdCcsXG4gICAgICAgICAgdHlwZWNoZWNrOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIHR5cGVjaGVjaycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAoaGFzSmF2YSkge1xuICAgICAgICBzY3JpcHRzLnByZXR0aWZ5ID0gYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXJPbmx5LmpvaW4oXG4gICAgICAgICAgJywnXG4gICAgICAgICl9fVwiIFwiISoqL3BhY2thZ2VzLyoqXCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gc2NyaXB0cy50eXBlY2hlY2sgPyBgJHtzY3JpcHRzLnR5cGVjaGVja30gJiYgYCA6ICcnO1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJ3B5cmlnaHQnO1xuICAgIH1cbiAgICBpZiAob2xkVGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgICAgc2NyaXB0cy50ZXN0ID0gb2xkVGVzdDtcbiAgICB9XG4gICAgaWYgKCFoYXNKc09yVHMpIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzWydmb3JtYXQtY29kZSddO1xuICAgICAgZGVsZXRlIHNjcmlwdHMubGludDtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzWydsaW50LWZpeCddO1xuICAgIH1cbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSAnd2IgdHlwZWNoZWNrJztcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICAgIHNjcmlwdHMudmVyaWZ5ID0gJ3diIHZlcmlmeSc7XG4gICAgICBzY3JpcHRzWyd2ZXJpZnktZnVsbCddID0gJ3diIHZlcmlmeSAtLWZ1bGwnO1xuICAgIH1cbiAgICBhcHBseU1pc2VUYXNrU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsnYnVpbGQnLCAnZGV2JywgJ3N0YXJ0JywgJ3Rlc3QnLCAndHlwZWNoZWNrJ10pO1xuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5TWlzZVRhc2tTY3JpcHRzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5hbWVzOiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIGlmICghaGFzTWlzZVRhc2soY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgaWYgKGRvZXNNaXNlVGFza0NhbGxQYWNrYWdlU2NyaXB0KGNvbmZpZywgbmFtZSkpIGNvbnRpbnVlO1xuICAgIGlmIChvbGRTY3JpcHRzW25hbWVdICYmICFpc1diZnlNYW5hZ2VkTWlzZUJyaWRnZShvbGRTY3JpcHRzW25hbWVdLCBuYW1lKSAmJiAhKG5hbWUgaW4gc2NyaXB0cykpIGNvbnRpbnVlO1xuICAgIHNjcmlwdHNbbmFtZV0gPSBgbWlzZSBydW4gJHtuYW1lfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzTWlzZVRhc2soY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5oYXNPd24oY29uZmlnLm1pc2VUYXNrcywgbmFtZSk7XG59XG5cbmZ1bmN0aW9uIGdldFNhZmVNaXNlVGFza05hbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lczogc3RyaW5nW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gbmFtZXMuZmluZCgobmFtZSkgPT4gaGFzTWlzZVRhc2soY29uZmlnLCBuYW1lKSAmJiAhZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnLCBuYW1lKSk7XG59XG5cbmZ1bmN0aW9uIGRvZXNNaXNlVGFza0NhbGxQYWNrYWdlU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRhc2sgPSBjb25maWcubWlzZVRhc2tzW25hbWVdO1xuICBpZiAoIXRhc2spIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJzID0gWydidW4nLCAneWFybicsICducG0nLCAncG5wbSddO1xuICByZXR1cm4gcGFja2FnZU1hbmFnZXJzLnNvbWUoKHBhY2thZ2VNYW5hZ2VyKSA9PlxuICAgIG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BcXGIke3BhY2thZ2VNYW5hZ2VyfVxccysoPzpydW5cXHMrKT8ke2VzY2FwZVJlZ0V4cChuYW1lKX0oPyFbYS16QS1aMC05X1xcLTouXSlgLCAndScpLnRlc3QodGFzaylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNXYmZ5TWFuYWdlZE1pc2VCcmlkZ2Uoc2NyaXB0OiB1bmtub3duLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNjcmlwdCA9PT0gYG1pc2UgcnVuICR7bmFtZX1gO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRm9ybWF0U2NyaXB0KGhhc0pzT3JUczogYm9vbGVhbiwgaGFzSmF2YTogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGNvbW1hbmRzID0gWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBpZiAoaGFzSnNPclRzKSB7XG4gICAgY29tbWFuZHMucHVzaCgneWFybiBmb3JtYXQtY29kZScpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgY29tbWFuZHMucHVzaCgneWFybiBwcmV0dGlmeScpO1xuICB9XG4gIHJldHVybiBjb21tYW5kcy5qb2luKCcgJiYgJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKS5jYXRjaCgoKSA9PiAnJyk7XG4gIGNvbnN0IGluZGV4ID0gZXhpc3RpbmdDb250ZW50LmluZGV4T2YoaWdub3JlRmlsZVV0aWwuc2VwYXJhdG9yUHJlZml4KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGV4aXN0aW5nQ29udGVudC5zbGljZSgwLCBpbmRleCk7XG4gIGNvbnN0IGxpbmVzID0gb3JpZ2luYWxDb250ZW50XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0xpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIHJldHVybiBuZXdMaW5lLmVuZHNXaXRoKCcvJykgPyBuZXdMaW5lLnNsaWNlKDAsIC0xKSA6IG5ld0xpbmU7XG4gICAgfSlcbiAgICAuZmlsdGVyKChsKSA9PiBsICYmICFsLnN0YXJ0c1dpdGgoJyMnKSAmJiAhbC5pbmNsdWRlcygnLycpKTtcblxuICByZXR1cm4gYCR7bGluZXMubWFwKChsaW5lKSA9PiBgIFwiISoqLyR7bGluZX0vKipcImApLmpvaW4oJycpfSB8fCB0cnVlYDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlUHJldHRpZXJBcnRpZmFjdHMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUganNvbk9iai5wcmV0dGllcjtcbiAgY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25zOiBBcnJheTxQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHwgdW5kZWZpbmVkPiA9IFtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llcyxcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyxcbiAgICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMsXG4gIF07XG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBkZXBlbmRlbmN5U2VjdGlvbnMpIHtcbiAgICBpZiAoIXNlY3Rpb24pIGNvbnRpbnVlO1xuICAgIGRlbGV0ZSBzZWN0aW9uLnByZXR0aWVyO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydwcmV0dGllci1wbHVnaW4tamF2YSddO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydwcmV0dGllci1wbHVnaW4tcHJpc21hJ107XG4gICAgZGVsZXRlIHNlY3Rpb25bJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnXTtcbiAgICBkZWxldGUgc2VjdGlvblsnQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLCAuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcyldKTtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzOiB7XG4gICAgcGFja2FnZU5hbWU6IHN0cmluZztcbiAgICByZXBvOiBzdHJpbmc7XG4gICAgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnO1xuICB9W10gPSBbXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9hdXRoJywgcmVwbzogJ2F1dGgnLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0BkaXNjb3JkLWJvdC9zaGFyZWQnLCByZXBvOiAnZGlzY29yZC1ib3QnLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJywgcmVwbzogJ2NvZGUtYW5hbHl6ZXInLCB0YXJnZXQ6ICdkZXZEZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9qdWRnZScsIHJlcG86ICdqdWRnZScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsIHJlcG86ICdsbG0tcHJveHknLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gIF07XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcHJpdmF0ZVBhY2thZ2VzLm1hcChhc3luYyAoeyBwYWNrYWdlTmFtZSwgcmVwbywgdGFyZ2V0IH0pID0+IHtcbiAgICAgIGlmICghcGFja2FnZU5hbWVzLmhhcyhwYWNrYWdlTmFtZSkgfHwgaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosIHBhY2thZ2VOYW1lKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvdGhlclRhcmdldCA9IHRhcmdldCA9PT0gJ2RlcGVuZGVuY2llcycgPyAnZGV2RGVwZW5kZW5jaWVzJyA6ICdkZXBlbmRlbmNpZXMnO1xuICAgICAgLy8gVGhlIGxpbnQgcnVsZSBkaXNhbGxvd3MgYGRlbGV0ZWAgd2l0aCBjb21wdXRlZCBwYWNrYWdlIG5hbWVzOyBSZWZsZWN0IGhhcyB0aGUgc2FtZSBkZWxldGlvbiBzZW1hbnRpY3MgaGVyZS5cbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9ialtvdGhlclRhcmdldF0sIHBhY2thZ2VOYW1lKTtcbiAgICAgIGpzb25PYmpbdGFyZ2V0XVtwYWNrYWdlTmFtZV0gPSBhd2FpdCBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihyZXBvKTtcbiAgICB9KVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihyZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCByZXBvKTtcbiAgcmV0dXJuIGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi8ke3JlcG99LmdpdCMke2NvbW1pdEhhc2h9YDtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmo6IFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwganNvbk9iai5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsImltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG9VcmwgPSBgZ2l0QGdpdGh1Yi5jb206JHtvcmdhbml6YXRpb259LyR7cmVwb30uZ2l0YDtcbiAgICBjb25zdCBvdXRwdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtcmVtb3RlJywgcmVwb1VybCwgJ0hFQUQnXSwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IG91dHB1dC5zcGxpdCgvXFxzKy8pWzBdO1xuICAgIGlmICghY29tbWl0SGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21taXRzIGZvdW5kIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfWApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbW1pdEhhc2gpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgfVxufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBkdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2V0R2VuSTE4blRzQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2dlbkkxOG5Ucy5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuaW50ZXJmYWNlIExlZnRob29rU2V0dGluZ3Mge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJztcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG59XG5cbmludGVyZmFjZSBMZWZ0aG9va0pvYiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZ2xvYj86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICBzY3JpcHQ/OiBzdHJpbmc7XG4gIHJ1bm5lcj86ICdiYXNoJztcbiAgc3RhZ2VfZml4ZWQ/OiB0cnVlO1xufVxuXG5jb25zdCBiYXNlU2V0dGluZ3M6IE9taXQ8TGVmdGhvb2tTZXR0aW5ncywgJ3ByZS1jb21taXQnPiA9IHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3RhcicsXG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3ByZXBhcmUnLFxuICAgICAgICBzY3JpcHQ6ICdwcmVwYXJlLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdjaGVjaycsXG4gICAgICAgIHNjcmlwdDogJ2NoZWNrLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG5jb25zdCBwcmVDb21taXRTZXR0aW5nczogTGVmdGhvb2tTZXR0aW5nc1sncHJlLWNvbW1pdCddID0ge1xuICBqb2JzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2NsZWFudXAnLFxuICAgICAgZ2xvYjogJycsXG4gICAgICBydW46ICcnLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnY2hlY2stbWlncmF0aW9ucycsXG4gICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICBydW46IGBcbmZhaWxlZD0wXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbmZvciBmaWxlIGluIHtzdGFnZWRfZmlsZXN9OyBkb1xuICBpZiBncmVwIC1xICdXYXJuaW5nczonIFwiJGZpbGVcIjsgdGhlblxuICAgIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGUgKCRmaWxlKSBjb250YWlucyB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gICAgZmFpbGVkPTFcbiAgZmlcbmRvbmVcbmV4aXQgXCIkZmFpbGVkXCJcbmAudHJpbSgpLFxuICAgIH0sXG4gIF0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwb3N0TWVyZ2U6IGBcbiMhL2Jpbi9iYXNoXG5cbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IGh1c2t5RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreScpO1xuICBjb25zdCBoYXNIdXNreURpciA9IGZzLmV4aXN0c1N5bmMoaHVza3lEaXJQYXRoKTtcbiAgY29uc3QgeyBsaW50IH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCB7fSk7XG4gIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPExlZnRob29rU2V0dGluZ3M+ID0ge1xuICAgIC4uLmJhc2VTZXR0aW5ncyxcbiAgICAncHJlLWNvbW1pdCc6IHtcbiAgICAgIGpvYnM6IGdldFByZUNvbW1pdEpvYnMoY29uZmlnKSxcbiAgICB9LFxuICB9O1xuICBpZiAoIWxpbnQpIHtcbiAgICBkZWxldGUgc2V0dGluZ3NbJ3ByZS1wdXNoJ107XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShcbiAgICAgIHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2xlZnRob29rLnltbCcpLFxuICAgICAgeWFtbC5kdW1wKHNldHRpbmdzLCB7XG4gICAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgICAgc3R5bGVzOiB7XG4gICAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcbiAgaWYgKGhhc0h1c2t5RGlyKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZnMucHJvbWlzZXMucm0oaHVza3lEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSksXG4gICAgXSk7XG4gICAgc3Bhd25TeW5jKCdnaXQnLCBbJ2NvbmZpZycsICctLXVuc2V0JywgJ2NvcmUuaG9va3NQYXRoJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChsaW50KSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBsZXQgbGludENvbW1hbmQ6IHN0cmluZztcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIC8vIEJ1biByZXBvcyByZWNlaXZlIHdiIGFzIHBhcnQgb2Ygd2JmeSdzIG1hbmFnZWQgdG9vbGNoYWluLCBzbyBnZW5lcmF0ZSB0aGVcbiAgICAvLyBmaW5hbCBob29rIGNvbW1hbmQgb24gdGhlIGZpcnN0IHJ1biBpbnN0ZWFkIG9mIGNoYW5naW5nIGl0IG9uIHRoZSBzZWNvbmQuXG4gICAgbGludENvbW1hbmQgPSAnYnVuIC0tYnVuIHdiIGxpbnQnO1xuICB9IGVsc2Uge1xuICAgIGxpbnRDb21tYW5kID0gY29uZmlnLmRlcGVuZGluZy53YiA/ICd5YXJuIHdiIGxpbnQnIDogJ3lhcm4gcnVuIGxpbnQnO1xuICB9XG4gIGNvbnN0IHF1aWV0TGludENvbW1hbmQgPSBgJHtsaW50Q29tbWFuZH0gLS1xdWlldGA7XG4gIC8vIE5vIHNlcGFyYXRlIHR5cGVjaGVjayBzdGVwIG5lZWRlZCDigJQgdGhlIGxpbnQgY29tbWFuZCBhbHJlYWR5IGluY2x1ZGVzIHR5cGVjaGVja2luZy5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICByZXR1cm4gYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbiR7cXVpZXRMaW50Q29tbWFuZH1cbmAudHJpbSgpO1xuICB9XG4gIHJldHVybiBxdWlldExpbnRDb21tYW5kO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IExlZnRob29rSm9iW10ge1xuICByZXR1cm4gcHJlQ29tbWl0U2V0dGluZ3Muam9icy5tYXAoKGpvYikgPT5cbiAgICBqb2IubmFtZSA9PT0gJ2NsZWFudXAnXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5qb2IsXG4gICAgICAgICAgZ2xvYjogZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZyksXG4gICAgICAgICAgcnVuOiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWcpLFxuICAgICAgICB9XG4gICAgICA6IGpvYlxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gTGV0IGB3YiBsaW50IC0tZm9ybWF0YCBkZWNpZGUgd2hldGhlciBQcmV0dGllciBpcyBhdmFpbGFibGU7IHRoZSBob29rXG4gIC8vIHN0aWxsIG5lZWRzIHRvIHRyaWdnZXIgd2hlbiBhZGRpbmcgdGhlIGZpcnN0IHByZXR0aWVyLW9ubHkgZmlsZS5cbiAgY29uc3Qgc3VwcG9ydGVkRXh0ZW5zaW9ucyA9XG4gICAgY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykgPyBbLi4uZXh0ZW5zaW9ucy5wcmV0dGllck9ubHldIDogW107XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKC4uLmV4dGVuc2lvbnMub3hmbXQsIC4uLmV4dGVuc2lvbnMub3hsaW50KTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ3B5Jyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdkYXJ0Jyk7XG4gIH1cbiAgY29uc3QgZmlsdGVyZWRFeHRlbnNpb25zID0gWy4uLm5ldyBTZXQoc3VwcG9ydGVkRXh0ZW5zaW9ucyldLnRvU29ydGVkKCk7XG4gIHJldHVybiBgKiovKi57JHtmaWx0ZXJlZEV4dGVuc2lvbnMuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWcpKSB7XG4gICAgcmV0dXJuIFN0cmluZy5yYXdgXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbnlhcm4gd29ya3NwYWNlIEB3aWxsYm9vc3Rlci93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbClcIiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuICAvLyBQeXRob24tb25seSBCdW4gcmVwb3MgaW5zdGFsbCB3YiBmb3Igc2hhcmVkIHNjcmlwdHMgYnV0IG5vdCBPeGxpbnQsIHNvXG4gIC8vIHN0YWdlZC1maWxlIGhvb2tzIG11c3QgdXNlIHRoZSBsYW5ndWFnZS1zcGVjaWZpYyBmb3JtYXR0ZXIgcGF0aCBiZWxvdy5cbiAgY29uc3QgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gIGlmICgoY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcud2IpICYmIGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMpIHtcbiAgICByZXR1cm4gYFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG4ke2NvbmZpZy5pc0J1biA/ICdidW4gLS1idW4gd2InIDogJ3lhcm4gd2InfSBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuXG4gIGNvbnN0IG94bGludFBhdHRlcm4gPSBleHRlbnNpb25zLm94bGludC5tYXAoKGV4dGVuc2lvbikgPT4gU3RyaW5nLnJhd2BcXC4ke2V4dGVuc2lvbn0kYCkuam9pbignfCcpO1xuICBjb25zdCBveGZtdFBhdHRlcm4gPSBleHRlbnNpb25zLm94Zm10Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IHByZXR0aWVyUGF0dGVybiA9IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG4gIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcblxuICByZXR1cm4gU3RyaW5nLnJhd2BcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxuJHtoYXNKc09yVHMgPyBTdHJpbmcucmF3YG94bGludF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoJHtveGxpbnRQYXR0ZXJufSknIHx8IHRydWUpXCJgIDogJyd9XG4ke2hhc0pzT3JUcyA/IFN0cmluZy5yYXdgb3hmbXRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKCR7b3hmbXRQYXR0ZXJufSknIHwgZ3JlcCAtdiAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2hhc0phdmEgPyBTdHJpbmcucmF3YHByZXR0aWVyX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke3ByZXR0aWVyUGF0dGVybn0pJyB8fCB0cnVlKVwiYCA6ICcnfVxucGFja2FnZV9qc29uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiXG4ke2hhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZykgPyBTdHJpbmcucmF3YHB5dGhvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5weSQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2NvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sID8gU3RyaW5nLnJhd2BkYXJ0X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLmRhcnQkJyB8IGdyZXAgLXYgJ2dlbmVyYXRlZCcgfCBncmVwIC12ICdcXC5mcmVlemVkXFwuZGFydCQnIHwgZ3JlcCAtdiAnXFwuZ1xcLmRhcnQkJyB8fCB0cnVlKVwiYCA6ICcnfVxuXG4ke1xuICBoYXNKc09yVHNcbiAgICA/IFN0cmluZy5yYXdgXG5pZiBbIC1uIFwiJG94Zm10X2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL294Zm10IC0td3JpdGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAnISoqL3BhY2thZ2UuanNvbicgJG94Zm10X2ZpbGVzXG5maVxuYFxuICAgIDogJydcbn1cbiR7XG4gIGhhc0phdmFcbiAgICA/IFN0cmluZy5yYXdgaWYgWyAtbiBcIiRwcmV0dGllcl9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUgLS1pZ25vcmUtdW5rbm93biAtLSAkcHJldHRpZXJfZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGhhc0pzT3JUc1xuICAgID8gU3RyaW5nLnJhd2BcbmlmIFsgLW4gXCIkb3hsaW50X2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL294bGludCAtLWZpeCAkb3hsaW50X2ZpbGVzXG5maVxuYFxuICAgIDogJydcbn1cbmlmIFsgLW4gXCIkcGFja2FnZV9qc29uX2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3NvcnQtcGFja2FnZS1qc29uIC0tICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcyAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGJsYWNrICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5oYXNWZXJzaW9uU2V0dGluZ3MpIHtcbiAgICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWx8XFwudG9vbC12ZXJzaW9uc3xcXC4uKy12ZXJzaW9uKWA7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJ1dlxcLmxvY2tcIiBcInV2IHN5bmMgLS1mcm96ZW5cImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICBjb25zdCBnZW5JMThuVHNDb21tYW5kID0gZ2V0R2VuSTE4blRzQ29tbWFuZChjb25maWcsIGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyk7XG4gIGlmIChnZW5JMThuVHNDb21tYW5kKSB7XG4gICAgLy8gZ2VuLWkxOG4tdHMgb3V0cHV0cyBhcmUgY29tbW9ubHkgaWdub3JlZCwgc28gcG9zdC1tZXJnZSByZWdlbmVyYXRlcyB0aGVtIGFmdGVyIHB1bGxlZCByZXNvdXJjZSBjaGFuZ2VzLlxuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihefC8paTE4bi8uKlxcLmpzb24kXCIgXCIke2dlbkkxOG5Uc0NvbW1hbmR9XCJgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG5cbmZ1bmN0aW9uIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2s7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblJ1bm5lcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5IHJ1bicgfCAndXYgcnVuJyB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgPyAndXYgcnVuJyA6ICdwb2V0cnkgcnVuJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxpbnRzdGFnZWRyYycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuY2pzYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuanNgLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShgJHtjb25maWcuZGlyUGF0aH0vLmxpbnRzdGFnZWRyYy5qc29uYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgXSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmludGVyZmFjZSBUb29sQ29uZmlnQ29udGVudE9wdGlvbnMge1xuICBjb21tb25Kc1ZhcmlhYmxlTmFtZTogc3RyaW5nO1xuICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICB0b29sTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUb29sQ29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcsIG9wdGlvbnM6IFRvb2xDb25maWdDb250ZW50T3B0aW9ucyk6IHN0cmluZyB7XG4gIGlmIChjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGBpbXBvcnQgY29uZmlnIGZyb20gJyR7b3B0aW9ucy5wYWNrYWdlTmFtZX0nO1xuXG5leHBvcnQgZGVmYXVsdCBjb25maWc7XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAvLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gJHtvcHRpb25zLnRvb2xOYW1lfSBvbmx5IGF1dG8tZGlzY292ZXJzIC50cyBjb25maWcgZmlsZXMsIGFuZCBDb21tb25KUyBhdm9pZHMgTm9kZSB0eXBlbGVzcyBFU00gd2FybmluZ3MuXG5jb25zdCAke29wdGlvbnMuY29tbW9uSnNWYXJpYWJsZU5hbWV9ID0gcmVxdWlyZSgnJHtvcHRpb25zLnBhY2thZ2VOYW1lfScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICR7b3B0aW9ucy5jb21tb25Kc1ZhcmlhYmxlTmFtZX0uZGVmYXVsdCA/PyAke29wdGlvbnMuY29tbW9uSnNWYXJpYWJsZU5hbWV9O1xuYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVRvb2xDb25maWdDb250ZW50KGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZW50Py50cmltKCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlVG9vbENvbmZpZ0NvbnRlbnQsIG5vcm1hbGl6ZVRvb2xDb25maWdDb250ZW50IH0gZnJvbSAnLi90b29sQ29uZmlnQ29udGVudC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hmbXRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGVnYWN5SnNvbkNvbmZpZ1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcub3hmbXRyYy5qc29uJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGZtdC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKTtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0obGVnYWN5SnNvbkNvbmZpZ1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpXTtcbiAgICBpZiAobm9ybWFsaXplVG9vbENvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplVG9vbENvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCkpKTtcbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gZ2VuZXJhdGVUb29sQ29uZmlnQ29udGVudChjb25maWcsIHtcbiAgICBjb21tb25Kc1ZhcmlhYmxlTmFtZTogJ294Zm10Q29uZmlnJyxcbiAgICBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLFxuICAgIHRvb2xOYW1lOiAnT3hmbXQnLFxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVUb29sQ29uZmlnQ29udGVudCB9IGZyb20gJy4vdG9vbENvbmZpZ0NvbnRlbnQuanMnO1xuXG50eXBlIE94bGludEJsb2NrTmFtZSA9ICdiYXNlJyB8ICdleHBvcnQnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBfcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hsaW50Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIHdpbGxib29zdGVyLWNvbmZpZ3MgcHVibGlzaGVzIGNvbmZpZyBmaWxlcyBhcyBwcm9kdWN0IGNvZGUsIHNvIG1pZ3JhdGlvblxuICAgIC8vIG11c3Qgbm90IHJlbW92ZSBwYWNrYWdlLXByb3ZpZGVkIGxpbnRlciBzZXR0aW5ncy5cbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyA9IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hsaW50LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID1cbiAgICAgIHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnICYmIGV4aXN0aW5nQ29udGVudFxuICAgICAgICA/IGV4aXN0aW5nQ29udGVudFxuICAgICAgICA6IGdldENvbmZpZ0NvbnRlbnRXaXRoTWFuYWdlZEJsb2Nrcyhjb25maWcsIGV4aXN0aW5nQ29udGVudCwgZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGlmICghc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcpIHtcbiAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcub3hsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5janMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy55YW1sJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy50cycpLCB7IGZvcmNlOiB0cnVlIH0pKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG5vcm1hbGl6ZVRvb2xDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZVRvb2xDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgcHJvbWlzZXMucHVzaChwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpKSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnRXaXRoTWFuYWdlZEJsb2NrcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBnZXRDb25maWdDb250ZW50KGNvbmZpZyk7XG4gIGlmICghZXhpc3RpbmdDb250ZW50KSByZXR1cm4gZGVzaXJlZENvbnRlbnQ7XG4gIGlmIChoYXNNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudCkpIHJldHVybiByZXBsYWNlTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQsIGRlc2lyZWRDb250ZW50LCBmaWxlUGF0aCk7XG4gIHJldHVybiBkZXNpcmVkQ29udGVudDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgIHJldHVybiBgJHtnZXRNYW5hZ2VkQmxvY2soJ2Jhc2UnLCBcImltcG9ydCBjb25maWcgZnJvbSAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnO1wiKX1cblxuJHtnZXRNYW5hZ2VkQmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBjb25maWc7Jyl9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke2dldE1hbmFnZWRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYC8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBPeGxpbnQgb25seSBhdXRvLWRpc2NvdmVycyAudHMgY29uZmlnIGZpbGVzLCBhbmQgQ29tbW9uSlMgYXZvaWRzIE5vZGUgdHlwZWxlc3MgRVNNIHdhcm5pbmdzLlxuY29uc3Qgb3hsaW50QmFzZUNvbmZpZyA9IHJlcXVpcmUoJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyk7XG5cbmNvbnN0IGNvbmZpZyA9IG94bGludEJhc2VDb25maWcuZGVmYXVsdCA/PyBveGxpbnRCYXNlQ29uZmlnO2BcbiAgKX1cblxuJHtnZXRNYW5hZ2VkQmxvY2soJ2V4cG9ydCcsICdtb2R1bGUuZXhwb3J0cyA9IGNvbmZpZzsnKX1cbmA7XG59XG5cbmZ1bmN0aW9uIGhhc01hbmFnZWRCbG9ja3MoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb250ZW50LmluY2x1ZGVzKGdldFN0YXJ0TWFya2VyKCdiYXNlJykpIHx8IGNvbnRlbnQuaW5jbHVkZXMoZ2V0U3RhcnRNYXJrZXIoJ2V4cG9ydCcpKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZU1hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcsIGRlc2lyZWRDb250ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY29udGVudCA9IGV4aXN0aW5nQ29udGVudDtcbiAgZm9yIChjb25zdCBibG9ja05hbWUgb2YgWydiYXNlJywgJ2V4cG9ydCddIHNhdGlzZmllcyBPeGxpbnRCbG9ja05hbWVbXSkge1xuICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gZXh0cmFjdE1hbmFnZWRCbG9jayhkZXNpcmVkQ29udGVudCwgYmxvY2tOYW1lKTtcbiAgICBpZiAoIXJlcGxhY2VtZW50KSBjb250aW51ZTtcblxuICAgIGNvbnN0IG5leHRDb250ZW50ID0gcmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50LCBibG9ja05hbWUsIHJlcGxhY2VtZW50KTtcbiAgICBpZiAoIW5leHRDb250ZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXBkYXRpbmcgaW5jb21wbGV0ZSAke2Jsb2NrTmFtZX0gYmxvY2sgaW4gb3hsaW50IGNvbmZpZzogJHtmaWxlUGF0aH1gKTtcbiAgICAgIHJldHVybiBleGlzdGluZ0NvbnRlbnQ7XG4gICAgfVxuICAgIGNvbnRlbnQgPSBuZXh0Q29udGVudDtcbiAgfVxuICByZXR1cm4gY29udGVudDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdE1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogT3hsaW50QmxvY2tOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpLmV4ZWMoY29udGVudCk/LlswXTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogT3hsaW50QmxvY2tOYW1lLCByZXBsYWNlbWVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGF0dGVybiA9IGdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpO1xuICBpZiAoIXBhdHRlcm4udGVzdChjb250ZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudCk7XG59XG5cbmZ1bmN0aW9uIGdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWU6IE94bGludEJsb2NrTmFtZSk6IFJlZ0V4cCB7XG4gIHJldHVybiBuZXcgUmVnRXhwKGAke2VzY2FwZVJlZ0V4cChnZXRTdGFydE1hcmtlcihibG9ja05hbWUpKX1bXFxcXHNcXFxcU10qPyR7ZXNjYXBlUmVnRXhwKGdldEVuZE1hcmtlcihibG9ja05hbWUpKX1gKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlZEJsb2NrKGJsb2NrTmFtZTogT3hsaW50QmxvY2tOYW1lLCBjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Z2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKX1cbiR7Y29udGVudH1cbiR7Z2V0RW5kTWFya2VyKGJsb2NrTmFtZSl9YDtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lOiBPeGxpbnRCbG9ja05hbWUpOiBzdHJpbmcge1xuICByZXR1cm4gYC8vIHdiZnk6c3RhcnQgb3hsaW50LSR7YmxvY2tOYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGdldEVuZE1hcmtlcihibG9ja05hbWU6IE94bGludEJsb2NrTmFtZSk6IHN0cmluZyB7XG4gIHJldHVybiBgLy8gd2JmeTplbmQgb3hsaW50LSR7YmxvY2tOYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbnRlc3QvZml4dHVyZXMvXG4qLmQudHNcbioubWluLmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHJldHRpZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgICBpZiAoIWRvZXNDb250YWluSmF2YShjb25maWcpKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgYWRkaXRpb25hbENvbnRlbnQgPSBgXG5hbmRyb2lkL2FwcC9cbmlvcy9SdW5uZXIvQXNzZXRzLnhjYXNzZXRzL1xucHVic3BlYy55YW1sXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgYWRkaXRpb25hbENvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgdmVudlBhdGg6ICcuJyxcbiAgdmVudjogJy52ZW52Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMuZXhpc3RzU3luYyh3b3JrZmxvd3NQYXRoKSA/IGZzLnJlYWRkaXJTeW5jKHdvcmtmbG93c1BhdGgpIDogW107XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IChiYWRnZU5hbWVbMF0gfHwgJycpLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBpZiAoIXJlcG9zaXRvcnkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYmFkZ2UgPSBgWyFbJHtiYWRnZU5hbWV9XShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfS9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfSlgO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLmdpdGh1Yi93b3JrZmxvd3MvJHtmaWxlTmFtZX1gKSkpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlbW92ZUdpdEh1YkFjdGlvbnNCYWRnZShuZXdDb250ZW50LCBiYWRnZU5hbWUsIGZpbGVOYW1lKTtcbiAgICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIGJhZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g5pei44GrYmFkZ2XjgYzjgYLjgovloLTlkIjjga/liYrpmaRcbiAgcmVhZG1lID0gcmVhZG1lLnJlcGxhY2UoYmFkZ2UsICcnKS5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWRtZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZWFkbWVbaSAtIDFdID09PSAnXFxuJyAmJiByZWFkbWVbaV0gPT09ICdcXG4nKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSByZWFkbWUuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgbGV0IGFmdGVyID0gcmVhZG1lLnNsaWNlKGkgKyAxKTtcbiAgICAgIGlmICghYWZ0ZXIuc3RhcnRzV2l0aCgnWycpICYmICFhZnRlci5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgYWZ0ZXIgPSBgXFxuJHthZnRlcn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2JlZm9yZX0ke2JhZGdlfVxcbiR7YWZ0ZXJ9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3JlYWRtZX1cXG4ke2JhZGdlfVxcbmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVHaXRIdWJBY3Rpb25zQmFkZ2UocmVhZG1lOiBzdHJpbmcsIGJhZGdlTmFtZTogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXNjYXBlZEJhZGdlTmFtZSA9IGVzY2FwZVJlZ0V4cChiYWRnZU5hbWUpO1xuICBjb25zdCBlc2NhcGVkRmlsZU5hbWUgPSBlc2NhcGVSZWdFeHAoZmlsZU5hbWUpO1xuICByZXR1cm4gcmVhZG1lXG4gICAgLnJlcGxhY2VBbGwoXG4gICAgICBuZXcgUmVnRXhwKFxuICAgICAgICBTdHJpbmcucmF3YFxcWyFcXFske2VzY2FwZWRCYWRnZU5hbWV9XFxdXFwoaHR0cHM6Ly9naXRodWJcXC5jb20vW14vXFxzKV0rL1teL1xccyldKy9hY3Rpb25zL3dvcmtmbG93cy8ke2VzY2FwZWRGaWxlTmFtZX0vYmFkZ2VcXC5zdmdcXClcXF1cXChodHRwczovL2dpdGh1YlxcLmNvbS9bXi9cXHMpXSsvW14vXFxzKV0rL2FjdGlvbnMvd29ya2Zsb3dzLyR7ZXNjYXBlZEZpbGVOYW1lfVxcKVxcbj9gLFxuICAgICAgICAnZ3UnXG4gICAgICApLFxuICAgICAgJydcbiAgICApXG4gICAgLnJlcGxhY2VBbGwoL1xcblxcblxcbisvZywgJ1xcblxcbicpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zID8/IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luRW50cnkgPSBwbHVnaW5zW2ldO1xuICAgICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocGx1Z2luRW50cnkpO1xuICAgICAgY29uc3QgcGx1Z2luID0gaXNBcnJheSA/IHBsdWdpbkVudHJ5WzBdIDogcGx1Z2luRW50cnk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoaXNBcnJheSAmJiBwbHVnaW5FbnRyeVsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczpyZW5vdmF0ZS5qc29uNSddLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IHR5cGVvZiBqc29uT2JqICYgeyBwYWNrYWdlUnVsZXM/OiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoanNvbk9iaikgYXMgU2V0dGluZ3M7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdyZW5vdmF0ZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7ZmlsZVBhdGh9NWApKSB7XG4gICAgICAvLyBTaW5jZSBpdCBpcyBkaWZmaWN1bHQgZm9yIHBhcnNpbmcgcmVub3ZhdGUuanNvbjUsIHdlIGRvIG5vdGhpbmdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBEb24ndCB1cGdyYWRlIE5leHQuanMgYXV0b21hdGljYWxseVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMgPz89IFtdO1xuICAgICAgaWYgKFxuICAgICAgICAhbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnNvbWUoKHJ1bGU6IHsgbWF0Y2hQYWNrYWdlTmFtZXM/OiBzdHJpbmdbXSB9KSA9PlxuICAgICAgICAgIHJ1bGUubWF0Y2hQYWNrYWdlTmFtZXM/LmluY2x1ZGVzKCduZXh0JylcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5wdXNoKHsgbWF0Y2hQYWNrYWdlTmFtZXM6IFsnbmV4dCddLCBlbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRlcGVuZGFib3QnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZW5vdmF0ZXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdpbnN0YWxsQWdlbnRTa2lsbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVE9ETzogV2UgYXJlIHRlbXBvcmFyaWx5IHJlbW92aW5nIGFnZW50IHNraWxscyBmcm9tIHRoZSByZXBvXG4gICAgLy8gYXdhaXQgcnVuSW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZzLnJtKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuYWdlbnRzJyksIHtcbiAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgZnMucm0ocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jbGF1ZGUnKSwge1xuICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSksXG4gICAgICBmcy5ybShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnc2tpbGxzLWxvY2suanNvbicpLCB7XG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgfSksXG4gICAgXSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IHRydWUsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsncGFja2FnZXMvKi90ZXN0L2ZpeHR1cmVzJywgJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogW1xuICAgICcqLmNvbmZpZy50cycsXG4gICAgJ3BhY2thZ2VzLyovKi5jb25maWcudHMnLFxuICAgICdwYWNrYWdlcy8qL3NjcmlwdHMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovc3JjLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3Rlc3QvKiovKicsXG4gICAgJ3NjcmlwdHMvKiovKicsXG4gICAgJ3NyYy8qKi8qJyxcbiAgICAndGVzdC8qKi8qJyxcbiAgXSxcbn07XG5cbmNvbnN0IHN1Ykpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IHRydWUsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsndGVzdC9maXh0dXJlcyddLFxuICAvLyB3YmZ5IGdlbmVyYXRlcyByb290LWxldmVsIHRvb2wgY29uZmlncyBzdWNoIGFzIHBsYXl3cmlnaHQuY29uZmlnLnRzLCBhbmRcbiAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIG5lZWRzIHRob3NlIGZpbGVzIGluIHRoZSBwcm9qZWN0IHRvIHNlZSBOb2RlL0J1biBnbG9iYWxzLlxuICBpbmNsdWRlOiBbJyouY29uZmlnLnRzJywgJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBhd2FpdCBjbGVhbnVwTGVnYWN5VHNjb25maWdNb2R1bGVTZXR0aW5ncyhjb25maWcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShjb25maWcuaXNSb290ID8gcm9vdEpzb25PYmogOiBzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgY29uc3QgZ2VuZXJhdGVkVHlwZXMgPSBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZ2V0Um9vdERpcihjb25maWcpO1xuICAgIGlmIChnZW5lcmF0ZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgdHlwZXM6IGdlbmVyYXRlZFR5cGVzIH07XG4gICAgfVxuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5pc0J1biAmJiAhY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGpzeDogJ3JlYWN0LWpzeCcgfTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4Y2x1ZGUgPSBuZXdTZXR0aW5ncy5leGNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgLy8gUHJpc21hIHNlZWRzIGFuZCBtaWdyYXRpb24gaGVscGVyIHNjcmlwdHMgb2Z0ZW4gbGl2ZSBvdXRzaWRlIHNyYywgYnV0XG4gICAgICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgc3RpbGwgbmVlZHMgdGhlbSBjb3ZlcmVkIGJ5IHRoZSBwcm9qZWN0IGNvbmZpZy5cbiAgICAgIGFkZEluY2x1ZGVQYXRoKG5ld1NldHRpbmdzLCAncHJpc21hLyoqLyonKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBUc0NvbmZpZ0pzb247XG4gICAgICBjb25zdCBleGlzdGluZ1R5cGVzID0gbm9ybWFsaXplU3RyaW5nQXJyYXkob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50eXBlcyk7XG4gICAgICBjb25zdCBleGlzdGluZ0VtaXRNZXRhZGF0YSA9IHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG1lcmdlVHNjb25maWdFeHRlbmRzKG5ld1NldHRpbmdzLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMpO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgICAgLy8gd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcuanNvbiBpcyBhIGxpbnQvdHlwZWNoZWNrIHByb2plY3QsIG5vdCB0aGUgZW1pdFxuICAgICAgLy8gY29udHJhY3QuIEl0IG11c3Qga2VlcCByb290RGlyIGJyb2FkIGVub3VnaCBmb3Igcm9vdCBjb25maWcgZmlsZXMsXG4gICAgICAvLyBzY3JpcHRzLCBzcmMsIGFuZCB0ZXN0cy4gYnVpbGQtdHMgb3ducyBlbWl0IGFuZCBjcmVhdGVzIGEgdGVtcG9yYXJ5XG4gICAgICAvLyBzcmMtb25seSB0c2NvbmZpZyB3aXRoIG5vRW1pdD1mYWxzZSwgZW1pdERlY2xhcmF0aW9uT25seT10cnVlLFxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiLCBhbmQgaW5jbHVkZT1bXCJzcmMvKiovKlwiXSwgc28gcHJlc2VydmluZyBub0VtaXQ9ZmFsc2Ugb3JcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiBoZXJlIHdvdWxkIG9ubHkgYnJlYWsgbm9uLXNyYyB0eXBlLWF3YXJlIGxpbnQgY292ZXJhZ2UuXG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgLi4uZXhpc3RpbmdFbWl0TWV0YWRhdGEgfTtcbiAgICAgIGVuc3VyZVRzRXh0ZW5zaW9uRW1pdENvbXBhdGliaWxpdHkobmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcblxuICAgICAgY29uc3QgbWVyZ2VkVHlwZXMgPSBbLi4ubmV3IFNldChbLi4uZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzLCBnZW5lcmF0ZWRUeXBlcyksIC4uLmdlbmVyYXRlZFR5cGVzXSldO1xuICAgICAgaWYgKG1lcmdlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVzID0gbWVyZ2VkVHlwZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVzO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZERlbGV0ZVR5cGVSb290cyhnZW5lcmF0ZWRUeXBlcykpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlUm9vdHM7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgLy8gRG9uJ3QgdXNlIG9sZCBkZWNvcmF0b3JcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5leHBlcmltZW50YWxEZWNvcmF0b3JzO1xuICAgIC8vIFBhY2thZ2UgaW1wb3J0cyBzaG91bGQgcmVzb2x2ZSB0aHJvdWdoIHBhY2thZ2UgZXhwb3J0cyBpbnN0ZWFkIG9mIGJhc2VVcmwuXG4gICAgLy8gcGF0aHMgaXMgaW50ZW50aW9uYWxseSBwcmVzZXJ2ZWQgc28gcmVwby1sb2NhbCB0b29saW5nIGNhbiBrZWVwIGV4cGxpY2l0XG4gICAgLy8gYWxpYXNlcyB3aXRob3V0IHJlbHlpbmcgb24gYmFzZVVybCdzIGJyb2FkIGZhbGxiYWNrIHJlc29sdXRpb24uXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybDtcbiAgICBkZWxldGVMZWdhY3lNb2R1bGVTZXR0aW5ncyhuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGNvbmZpZyk7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpKSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5leHQvQmxpdHogb3duIHRoZWlyIHRzY29uZmlnIHNoYXBlLCBidXQgVHlwZVNjcmlwdCA2IG5vIGxvbmdlciBhY2NlcHRzXG4gICAgLy8gbm9kZTEwIHJlc29sdmVyIHNwZWxsaW5ncyB0aGF0IG9sZGVyIHByb2plY3RzIGNvbW1vbmx5IGluaGVyaXRlZC5cbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgaWYgKFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZScgfHxcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ05vZGUnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICAvLyBOZXh0LmpzIHdyaXRlcyBcIm5vZGVcIiBkdXJpbmcgYnVpbGQgd2hlbiB0aGlzIG9wdGlvbiBpcyBtaXNzaW5nLCBidXRcbiAgICAvLyB0c2dvbGludCB0cmVhdHMgdGhhdCBzcGVsbGluZyBhcyB0aGUgcmVtb3ZlZCBub2RlMTAgcmVzb2x2ZXIuXG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPSAnYnVuZGxlcic7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gdHNnb2xpbnQgZm9sbG93cyBUeXBlU2NyaXB0IDYgdmFsaWRhdGlvbiwgd2hlcmUgYmFzZVVybCBpcyByZW1vdmVkIGFuZFxuICAvLyBwYXRoIHRhcmdldHMgbXVzdCBiZSBleHBsaWNpdGx5IHJlbGF0aXZlLiBOZXh0LmpzIHN0aWxsIGFjY2VwdHMgdGhlIGFsaWFzXG4gIC8vIHNoYXBlIGFmdGVyIGVhY2ggdGFyZ2V0IGlzIHdyaXR0ZW4gd2l0aCBhIGxlYWRpbmcgLi8uXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMuYmFzZVVybDtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMucGF0aHMpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZXJPcHRpb25zLnBhdGhzKSkge1xuICAgIGNvbXBpbGVyT3B0aW9ucy5wYXRoc1thbGlhc10gPSBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG4gICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpIHx8IHRhcmdldC5zdGFydHNXaXRoKCcuLi8nKSB8fCBwYXRoLmlzQWJzb2x1dGUodGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgICByZXR1cm4gYC4vJHt0YXJnZXR9YDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHJldHVybiAnLic7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKSA/ICcuLi8uLicgOiAnLic7XG59XG5cbmZ1bmN0aW9uIG1lcmdlVHNjb25maWdFeHRlbmRzKFxuICBnZW5lcmF0ZWRFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSxcbiAgZXhpc3RpbmdFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXVxuKTogVHNDb25maWdKc29uWydleHRlbmRzJ10ge1xuICBjb25zdCBtZXJnZWRFeHRlbmRzID0gWy4uLm5vcm1hbGl6ZUV4dGVuZHMoZ2VuZXJhdGVkRXh0ZW5kcyksIC4uLm5vcm1hbGl6ZUV4dGVuZHMoZXhpc3RpbmdFeHRlbmRzKV07XG4gIGNvbnN0IHVuaXF1ZUV4dGVuZHMgPSBbLi4ubmV3IFNldChtZXJnZWRFeHRlbmRzKV07XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAxKSByZXR1cm4gdW5pcXVlRXh0ZW5kc1swXTtcbiAgcmV0dXJuIHVuaXF1ZUV4dGVuZHM7XG59XG5cbmZ1bmN0aW9uIGFkZEluY2x1ZGVQYXRoKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBzZXR0aW5ncy5pbmNsdWRlID8/PSBbXTtcbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKGRpclBhdGgpKSB7XG4gICAgc2V0dGluZ3MuaW5jbHVkZS5wdXNoKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV4dGVuZHModmFsdWU6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddKTogc3RyaW5nW10ge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gW3ZhbHVlXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVHlwZVJvb3RzKHR5cGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgLy8gT25seSBnZW5lcmF0ZWQgcGFja2FnZS1vd25lZCB0ZXN0IHR5cGVzIHNob3VsZCB0cmlnZ2VyIHRoaXMuIFVzZXItZGVmaW5lZCBzbGFzaC1iYXNlZFxuICAvLyBlbnRyaWVzIG1heSBpbnRlbnRpb25hbGx5IHJlbHkgb24gY3VzdG9tIHR5cGVSb290cyBhbmQgc2hvdWxkIGJlIHByZXNlcnZlZCBhcy1pcy5cbiAgcmV0dXJuIHR5cGVOYW1lcy5zb21lKCh0eXBlTmFtZSkgPT4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZS5pbmNsdWRlcygnLycpKTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzOiBzdHJpbmdbXSwgZ2VuZXJhdGVkVHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBnZW5lcmF0ZWRUeXBlU2V0ID0gbmV3IFNldChnZW5lcmF0ZWRUeXBlcyk7XG4gIHJldHVybiBleGlzdGluZ1R5cGVzLmZpbHRlcigodHlwZU5hbWUpID0+IHtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgcGFja2FnZS1wcm92aWRlZCB0ZXN0IGdsb2JhbHMuIERyb3Agc3RhbGUgZW50cmllcyB3aGVuIHRoZVxuICAgIC8vIGNvcnJlc3BvbmRpbmcgZGVwZW5kZW5jeSBpcyBubyBsb25nZXIgcHJlc2VudCBzbyBUeXBlU2NyaXB0IHdvbid0IHJlcXVpcmVcbiAgICAvLyBtaXNzaW5nIHBhY2thZ2VzIHN1Y2ggYXMgdml0ZXN0LlxuICAgIGlmIChpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lKSAmJiAhZ2VuZXJhdGVkVHlwZVNldC5oYXModHlwZU5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUgPT09ICdqZXN0JyB8fCB0eXBlTmFtZSA9PT0gJ21vY2hhJyB8fCB0eXBlTmFtZSA9PT0gJ3ZpdGVzdC9nbG9iYWxzJztcbn1cblxuZnVuY3Rpb24gZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eShjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgaWYgKGNvbXBpbGVyT3B0aW9ucy5ub0VtaXQgIT09IGZhbHNlIHx8IGNvbXBpbGVyT3B0aW9ucy5lbWl0RGVjbGFyYXRpb25Pbmx5ID09PSB0cnVlKSByZXR1cm47XG5cbiAgLy8gQHRzY29uZmlnL2J1biBlbmFibGVzIGFsbG93SW1wb3J0aW5nVHNFeHRlbnNpb25zLCB3aGljaCBUeXBlU2NyaXB0IHBlcm1pdHNcbiAgLy8gZHVyaW5nIGVtaXQgb25seSB3aGVuIHJlbGF0aXZlIFRTIGV4dGVuc2lvbnMgYXJlIHJld3JpdHRlbi5cbiAgY29tcGlsZXJPcHRpb25zLnJld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbnMgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBkZWxldGVMZWdhY3lNb2R1bGVTZXR0aW5ncyhcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuXG4gIC8vIFR5cGVTY3JpcHQgNiByZW1vdmVkIHRoZSBvbGQgbm9kZTEwIHJlc29sdmVyIHNwZWxsaW5nLCBzbyBpbmhlcml0ZWQgYmFzZSBjb25maWdzXG4gIC8vIHNob3VsZCBjaG9vc2UgdGhlIHJlc29sdmVyIHVubGVzcyBhIHByb2plY3QgYWxyZWFkeSBvcHRlZCBpbnRvIGEgbW9kZXJuIG9uZS5cbiAgaWYgKFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZScgfHxcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ05vZGUnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnXG4gICkge1xuICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbjtcbiAgfVxuICBpZiAoY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29tcGlsZXJPcHRpb25zLm1vZHVsZSAhPT0gJ0VTTmV4dCcpIHJldHVybjtcblxuICAvLyBOb2RlIGJhc2UgY29uZmlncyBub3cgcGFpciB0aGVpciByZXNvbHZlciB3aXRoIGEgbWF0Y2hpbmcgbW9kdWxlIGtpbmQuIEtlZXBpbmdcbiAgLy8gb2xkZXIgRVNOZXh0IG92ZXJyaWRlcyBjcmVhdGVzIGludmFsaWQgZ2VuZXJhdGVkIGNvbmZpZ3MgZm9yIFRTIDYuXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlO1xufVxuXG5mdW5jdGlvbiBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXVxuKTogUGljazxOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPiwgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJz4ge1xuICBjb25zdCBlbWl0T3B0aW9ucyA9IHt9IGFzIFBpY2s8XG4gICAgTm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sXG4gICAgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJ1xuICA+O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2RlY2xhcmF0aW9uJywgJ2RlY2xhcmF0aW9uTWFwJywgJ3NvdXJjZU1hcCddIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb21waWxlck9wdGlvbnM/LltrZXldO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbWl0T3B0aW9uc1trZXldID0gdmFsdWUgYXMgbmV2ZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbWl0T3B0aW9ucztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCB0eXBlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdidW4nKTtcbiAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ25vZGUnKTtcbiAgfVxuICBpZiAoXG4gICAgZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICBkZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgIGRlcGVuZGVuY2llc1snamVzdC1lbnZpcm9ubWVudC1qc2RvbSddIHx8XG4gICAgZGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnamVzdCcpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMudml0ZXN0KSB7XG4gICAgdHlwZU5hbWVzLmFkZCgndml0ZXN0L2dsb2JhbHMnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLm1vY2hhKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbW9jaGEnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLmN5cHJlc3MpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdjeXByZXNzJyk7XG4gIH1cblxuICByZXR1cm4gWy4uLnR5cGVOYW1lc107XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgICB9XG4gICAgICAvLyBMTE3jgavjgojjgot2aWJlIGNvZGluZ+OBp+OBr+OAgeiHquWLleODleOCqeODvOODnuODg+ODiOOChOOCs+ODvOODieOCouOCr+OCt+ODp+ODs+OCkueEoeWKueWMluOBmeOCi+OBk+OBqOOBp1xuICAgICAgLy8g55Sf5oiQ44GV44KM44Gf44Kz44O844OJ44Gu5YWD44Gu5b2i5byP44KS57at5oyB44Gn44GN44KLXG4gICAgICBpZiAoJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIGlmICgnZWRpdG9yLmZvcm1hdE9uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuZm9ybWF0T25TYXZlJ107XG4gICAgICB9XG4gICAgICBzb3J0S2V5cyhzZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBsb2FkL2R1bXAgdXNhZ2UgY2xlYXJlci5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvblZhbHVlTWFwIH0gZnJvbSAnQHlhcm5wa2cvY29yZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbnR5cGUgU2V0dGluZ3MgPSB7XG4gIGFwcHJvdmVkR2l0UmVwb3NpdG9yaWVzPzogc3RyaW5nW107XG4gIGRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeDogc3RyaW5nO1xuICBubU1vZGU6IHN0cmluZztcbiAgbm9kZUxpbmtlcjogc3RyaW5nO1xuICBucG1NaW5pbWFsQWdlR2F0ZT86IHN0cmluZztcbiAgbnBtUHJlYXBwcm92ZWRQYWNrYWdlcz86IHN0cmluZ1tdO1xuICBwbHVnaW5zPzogUGx1Z2luW107XG59ICYgUGFydGlhbDxDb25maWd1cmF0aW9uVmFsdWVNYXA+O1xuXG5pbnRlcmZhY2UgUGx1Z2luIHtcbiAgY2hlY2tzdW06IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzcGVjOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVlhcm5yY1ltbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVlhcm5yY1ltbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB5YXJucmNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYy55bWwnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ3lhcm4nLCBbJy0tdmVyc2lvbiddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdFZlcnNpb24oJ0B5YXJucGtnL2NsaScsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoaXNOZXdlclZlcnNpb24obGF0ZXN0VmVyc2lvbiwgY3VycmVudFZlcnNpb24pKSB7XG4gICAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ3NldCcsICd2ZXJzaW9uJywgbGF0ZXN0VmVyc2lvbl0sIGNvbmZpZy5kaXJQYXRoLCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxlYXNlc1BhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcueWFybicsICdyZWxlYXNlcycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHJlbGVhc2VzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocmVsZWFzZXNQYXRoKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgneWFybi0nKSAmJiAhZmlsZS5zdGFydHNXaXRoKGB5YXJuLSR7bGF0ZXN0VmVyc2lvbn0uYCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmVkJywgcGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlhcm5yY1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gICAgbGV0IHNldHRpbmdzID0ge30gYXMgU2V0dGluZ3M7XG4gICAgdHJ5IHtcbiAgICAgIHNldHRpbmdzID0gKHlhbWwubG9hZChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh5YXJucmNZbWxQYXRoLCAndXRmOCcpKSBhcyBTZXR0aW5ncyB8IHVuZGVmaW5lZCkgPz8gc2V0dGluZ3M7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgc2V0dGluZ3MubnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuICAgIHNldHRpbmdzLmFwcHJvdmVkR2l0UmVwb3NpdG9yaWVzID0gW1xuICAgICAgLy8gWWFybiA0LjE0IGJsb2NrcyBnaXQgZGVwZW5kZW5jaWVzIHVubGVzcyB0aGUgcmVwb3NpdG9yeSBVUkwgaXMgZXhwbGljaXRseSBhbGxvd2VkLlxuICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3RlckxhYi8qLmdpdCcsXG4gICAgICAnc3NoOi8vZ2l0QGdpdGh1Yi5jb20vV2lsbEJvb3N0ZXJMYWIvKi5naXQnLFxuICAgIF07XG4gICAgc2V0dGluZ3MubnBtUHJlYXBwcm92ZWRQYWNrYWdlcyA9IFtcbiAgICAgIC8vIC0tLS0tLS0tLS0gU1RBUlQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cbiAgICAgICdAZXhlcmNvZGUvKicsXG4gICAgICAnQHdpbGxib29zdGVyLyonLFxuICAgICAgJ2FnZW50LXJ1bnRpbWUta2l0JyxcbiAgICAgICdhdC1kZWNvcmF0b3JzJyxcbiAgICAgICdidWlsZC10cycsXG4gICAgICAnZ2VuLWkxOG4tdHMnLFxuICAgICAgJ29uZS13YXktZ2l0LXN5bmMnLFxuICAgICAgLy8gLS0tLS0tLS0tLSBFTkQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cblxuICAgICAgLy8gVG8gZGVhbCB3aXRoIENWRSBsaWtlIGh0dHBzOi8vbmV4dGpzLm9yZy9ibG9nL0NWRS0yMDI1LTY2NDc4XG4gICAgICAnbmV4dCcsXG4gICAgICAnQG5leHQvKicsXG4gICAgICAnQHR5cGVzY3JpcHQvKicsXG4gICAgICAnQG94Zm10LyonLFxuICAgICAgJ0BveGxpbnQvKicsXG4gICAgICAnQG94bGludC10c2dvbGludC8qJyxcbiAgICAgICdveGZtdCcsXG4gICAgICAnb3hsaW50JyxcbiAgICAgICdveGxpbnQtdHNnb2xpbnQnLFxuICAgICAgJ3JlYWN0JyxcbiAgICAgICdyZWFjdC1kb20nLFxuICAgIF07XG4gICAgZGVsZXRlIHNldHRpbmdzLmNvbXByZXNzaW9uTGV2ZWw7XG4gICAgaWYgKHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM7XG4gICAgfVxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20veWFybnBrZy9iZXJyeS9wdWxsLzQ2OThcbiAgICBzZXR0aW5ncy5lbmFibGVHbG9iYWxDYWNoZSA9IHRydWU7XG4gICAgY29uc3Qgb3JpZ2luYWxMZW5ndGggPSBzZXR0aW5ncy5wbHVnaW5zPy5sZW5ndGggPz8gMDtcbiAgICBzZXR0aW5ncy5wbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucz8uZmlsdGVyKChwKSA9PiBwLnBhdGggIT09ICcueWFybi9wbHVnaW5zL3VuZGVmaW5lZC5janMnKSA/PyBbXTtcbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggIT09IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBjb25zdCBwbHVnaW5QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncGx1Z2lucycsICd1bmRlZmluZWQuY2pzJyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGx1Z2luUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLnBsdWdpbnM7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh5YXJucmNZbWxQYXRoLCB5YW1sLmR1bXAoc2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KSk7XG5cbiAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICd5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIC8vIFRoZSB0YXJnZXQgcmVwbyBtYXkgbm90IGhhdmUgcHJldHRpZXIgaW5zdGFsbGVkIHlldCwgYW5kIHlhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCBlZGl0cyB0aGlzIGZpbGUgYWZ0ZXIganMteWFtbC5cbiAgICBzcGF3blN5bmMoJ3lhcm4nLCBnZXRZYXJucmNQcmV0dGllckFyZ3MoY29uZmlnLmRpclBhdGgsIHlhcm5yY1ltbFBhdGgpLCBjb25maWcuZGlyUGF0aCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0WWFybnJjUHJldHRpZXJBcmdzKGRpclBhdGg6IHN0cmluZywgeWFybnJjWW1sUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWydkbHgnLCAncHJldHRpZXInLCAnLS1uby1jb25maWcnLCAnLS13cml0ZScsIHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgeWFybnJjWW1sUGF0aCldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCducG0nLCBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3ZlcnNpb24nXSwgZGlyUGF0aCkgfHwgJzAuMC4wJztcbn1cblxuZnVuY3Rpb24gaXNOZXdlclZlcnNpb24obmV3VmVyc2lvbjogc3RyaW5nLCBvbGRWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdmFsaWROZXdWZXJzaW9uID0gc2VtdmVyLnZhbGlkKG5ld1ZlcnNpb24pO1xuICBpZiAoIXZhbGlkTmV3VmVyc2lvbikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBzZW12ZXIuZ3QodmFsaWROZXdWZXJzaW9uLCBzZW12ZXIudmFsaWQob2xkVmVyc2lvbikgPz8gJzAuMC4wJyk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc3ZlbHRlJywgJ2ZmM2UwMCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWFsbCA6cm9ib3Q6JywgJzAwQjREOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jbGF1ZGUgOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY29kZXggOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItZ2VtaW5pIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHknKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2xsbS1wciA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2FpLXByIDpyb2JvdDonKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSBzb2RpdW1Nb2R1bGUgZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMgPSBbJ1JFQURZX0RJU0NPUkRfV0VCSE9PS19VUkwnLCAnR0hfQk9UX1BBVCcsICdQVUJMSUNfR0hfQk9UX1BBVCddO1xuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VjcmV0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFNlY3JldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbyB8fCBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVudicpLCBxdWlldDogdHJ1ZSB9KS5wYXJzZWQgPz8ge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIERFUFJFQ0FURURfU0VDUkVUX05BTUVTKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgc2VjcmV0X25hbWU6IHNlY3JldE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5Jywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBrZXksIGtleV9pZDoga2V5SWQgfSA9IHJlc3BvbnNlLmRhdGE7XG5cbiAgICAgIGNvbnN0IHNvZGl1bSA9IGdldFNvZGl1bSgpO1xuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUicgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUInXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCBTZWNyZXQgJiBCYXNlNjQga2V5IHRvIFVpbnQ4QXJyYXkuXG4gICAgICAgIGNvbnN0IHJhd0tleSA9IHNvZGl1bS5mcm9tX2Jhc2U2NChrZXksIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuICAgICAgICBjb25zdCByYXdTZWMgPSBzb2RpdW0uZnJvbV9zdHJpbmcoc2VjcmV0KTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBzZWNyZXQgdXNpbmcgTGliU29kaXVtXG4gICAgICAgIGNvbnN0IGVuY0J5dGVzID0gc29kaXVtLmNyeXB0b19ib3hfc2VhbChyYXdTZWMsIHJhd0tleSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBlbmNyeXB0ZWQgVWludDhBcnJheSB0byBCYXNlNjRcbiAgICAgICAgY29uc3QgZW5jQmFzZTY0ID0gc29kaXVtLnRvX2Jhc2U2NChlbmNCeXRlcywgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG5cbiAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U29kaXVtKCk6IHR5cGVvZiBzb2RpdW1Nb2R1bGUge1xuICAvLyBsaWJzb2RpdW0td3JhcHBlcnMnIEVTTSBlbnRyeSBjYW4gYmluZCB0byBsaWJzb2RpdW1AMC44LjMsIHdob3NlIGRlZmF1bHRcbiAgLy8gZXhwb3J0IG5vIGxvbmdlciBleHBvc2VzIHJlYWR5LiBUaGUgQ29tbW9uSlMgZW50cnkga2VlcHMgdGhlIEFQSSBzaGFwZS5cbiAgcmV0dXJuIHJlcXVpcmUoJ2xpYnNvZGl1bS13cmFwcGVycycpIGFzIHR5cGVvZiBzb2RpdW1Nb2R1bGU7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgLy8gQWRtaW5pc3RyYXRpb24gcGVybWlzc2lvblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgfSxcbiAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgcGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciA9ICdfX1BNX1JVTl9fJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuIyMgU2VsZiBDaGVja1xuXG4tIFsgXSBJJ3ZlIGNvbmZpcm1lZCBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIG9uIHRoaXMgcGFnZS5cbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gIC0gUFIgdGl0bGUgZG9lc24ndCBoYXZlIFxcYFdJUDpcXGAuXG4gIC0gVGhlIHRlc3QgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSB0ZXN0XFxgKSBwYXNzZWQuXG4gIC0gVGhlIGxpbnQgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSBsaW50XFxgKSBwYXNzZWQuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgZHVlIHRvIGxvbmcgd29ya2Zsb3dzLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIHRoZSBHaXRIdWIgZGlmZiB2aWV3LlxuLSBbIF0gSSd2ZSB3cml0dGVuIHRoZSBzdGVwcyB0byB0ZXN0IG15IGNoYW5nZXMuXG4tIFsgXSBJJ3ZlIGFkZGVkIHNjcmVlbnNob3RzIChpZiB0aGUgVUkgY2hhbmdlZCkuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgaWYgeW91IGRpZG4ndCBtb2RpZnkgdGhlIFVJLlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuXG48IS0tIFBsZWFzZSBhZGQgc3RlcHMgdG8gdGVzdCB5b3VyIGNoYW5nZXMuXG4jIyBTdGVwcyB0byBUZXN0XG5cbjEuIE9wZW4gaHR0cDovL2xvY2FsaG9zdC1leGVyY29kZS53aWxsYm9vc3Rlci5uZXQ6MzAwMC9qYS1KUC9jb3Vyc2VzL19leGFtcGxlL2xlc3NvbnMvX2V4YW1wbGVfYV9wbHVzX2IvcHJvYmxlbXMvX2V4YW1wbGVfYV9wbHVzX2IgYWZ0ZXIgbG9naW4uXG4yLiBTZWxlY3QgdGhlIGxhbmd1YWdlIFxcYENcXGAuXG4zLiBXcml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6XG4gICBcXGBcXGBcXGBjXG4gICAjaW5jbHVkZSA8c3RkaW8uaD5cblxuICAgaW50IG1haW4odm9pZCkge1xuICAgICBpbnQgYSwgYjtcblxuICAgICBzY2FuZihcIiVkICVkXCIsICZhLCAmYik7XG4gICAgIHByaW50ZihcIiVkXCIsIGEgKyBiKTtcbiAgICAgcmV0dXJuIDA7XG4gICB9XG4gICBcXGBcXGBcXGBcbjQuIFB1c2ggXFxgU3VibWl0XFxgIGJ1dHRvbi5cbjUuIC4uLlxuLS0+XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyUmVwbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBuZXdDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKG5ld0NvbnRlbnQsIGNvbmZpZyk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBpZiAoZGlzdGFuY2Uob2xkQ29udGVudCwgY29udGVudCkgPiBjb250ZW50Lmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUodGVtcGxhdGU6IHN0cmluZywgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZUFsbChwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyLCBwYWNrYWdlTWFuYWdlckNvbW1hbmQpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgc2ltcGxlR2l0IH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5pbXBvcnQgdG9tbCBmcm9tICdzbW9sLXRvbWwnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiBib29sZWFuO1xuICByZXBvc2l0b3J5Pzogc3RyaW5nO1xuICByZXBvQXV0aG9yPzogc3RyaW5nO1xuICByZXBvTmFtZT86IHN0cmluZztcbiAgaXNXaWxsQm9vc3RlclJlcG86IGJvb2xlYW47XG4gIGlzQnVuOiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICAvLyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uXG4gIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Hb01vZDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpblV2TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcbiAgLy8gc291cmNlIGNvZGUgZmlsZXNcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YUluUGFja2FnZXM6IGJvb2xlYW47XG5cbiAgaGFzU3RhcnRUZXN0U2VydmVyOiBib29sZWFuO1xuXG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGdlbkkxOG5UczogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3Q6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHN0b3J5Ym9vazogYm9vbGVhbjtcbiAgICB3YjogYm9vbGVhbjtcbiAgfTtcbiAgcmVsZWFzZToge1xuICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICBnaXRodWI6IGJvb2xlYW47XG4gICAgbnBtOiBib29sZWFuO1xuICB9O1xuICBoYXNWZXJzaW9uU2V0dGluZ3M6IGJvb2xlYW47XG4gIG1pc2VUYXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnPzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcGx1Z2lucz86IHN0cmluZ1tdW107XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IGpzb24/LmJyYW5jaGVzID8/IFtdO1xuICAgICAgcmVsZWFzZVBsdWdpbnMgPSBqc29uPy5wbHVnaW5zPy5mbGF0KCkgPz8gW107XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgaXNSb290ID1cbiAgICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicpKSAhPT0gJ3BhY2thZ2VzJyB8fFxuICAgICAgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IGhhc1ZlcnNpb25TZXR0aW5ncyA9IGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBwcmVmaXggb2YgWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ10pIHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCkpKSB7XG4gICAgICAgIGhhc1ZlcnNpb25TZXR0aW5ncyA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0Z1bGxOYW1lID8gYGdpdGh1Yjoke3JlcG9GdWxsTmFtZX1gIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0J1bjogcm9vdENvbmZpZz8uaXNCdW4gfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcygnL3dpbGxib29zdGVyLWNvbmZpZ3MnKSxcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblV2TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3V2LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YTogY29udGFpbnNBbnkoJyoqLyouamF2YScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiovKi5qYXZhJywgZGlyUGF0aCksXG4gICAgICBoYXNTdGFydFRlc3RTZXJ2ZXI6ICEhcGFja2FnZUpzb24uc2NyaXB0cz8uWydzdGFydC10ZXN0LXNlcnZlciddLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSxcbiAgICAgIH0sXG4gICAgICBoYXNWZXJzaW9uU2V0dGluZ3MsXG4gICAgICBtaXNlVGFza3M6IGF3YWl0IHJlYWRNaXNlVGFza3MoZGlyUGF0aCksXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNWZXJzaW9uU2V0dGluZ3NGaWxlKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICByZXR1cm4gKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICdtaXNlLnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLm1pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcudG9vbC12ZXJzaW9ucycpKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkTWlzZVRhc2tzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBjb25zdCB0YXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIFsnbWlzZS50b21sJywgJy5taXNlLnRvbWwnXSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0b21sLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgeyB0YXNrcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MudGFza3MgPz8ge30pKSB7XG4gICAgICAgIHRhc2tzW25hbWVdID0gcmVhZE1pc2VUYXNrQ29tbWFuZCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG9yIHRlbXBvcmFyaWx5IGludmFsaWQgbWlzZSBmaWxlcyBzaG91bGQgbm90IGJsb2NrIG90aGVyIHdiZnkgZ2VuZXJhdG9ycy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhc2tzO1xufVxuXG5mdW5jdGlvbiByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgLy8gUHJlc2VydmUgYXJyYXktZm9ybSBtaXNlIGNvbW1hbmRzIHNvIHJlY3Vyc2lvbiBjaGVja3MgY2FuIHN0aWxsIHNlZSBwYWNrYWdlIHNjcmlwdCBjYWxscy5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuZmlsdGVyKChjb21tYW5kKTogY29tbWFuZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGNvbW1hbmQgPT09ICdzdHJpbmcnKS5qb2luKCdcXG4nKTtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHJldHVybiByZWFkTWlzZVRhc2tDb21tYW5kKCh2YWx1ZSBhcyB7IHJ1bj86IHVua25vd24gfSkucnVuKTtcbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGdpdCA9IHNpbXBsZUdpdChkaXJQYXRoKTtcbiAgY29uc3QgcmVtb3RlcyA9IGF3YWl0IGdpdC5nZXRSZW1vdGVzKHRydWUpO1xuICBjb25zdCBvcmlnaW4gPSByZW1vdGVzLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gJ29yaWdpbicpO1xuICBjb25zdCByZW1vdGVVcmwgPSBvcmlnaW4/LnJlZnMuZmV0Y2ggPz8gb3JpZ2luPy5yZWZzLnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgLy8gTWV0YWRhdGEgcGVybWlzc2lvblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdCgpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWRpcmVjdGVkRnVsbE5hbWUgPSBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yKTtcbiAgICBpZiAocmVkaXJlY3RlZEZ1bGxOYW1lKSB7XG4gICAgICByZXR1cm4geyBmdWxsX25hbWU6IHJlZGlyZWN0ZWRGdWxsTmFtZSB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlbW92ZUdlbWluaVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGludHN0YWdlZHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hmbXRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hmbXRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGxpbnRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGluc3RhbGxBZ2VudFNraWxscyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9za2lsbHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZW52OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzZWNyZXRzIHRvIEdpdEh1YicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZScsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdTa2lwIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IHJvb3REaXJQYXRoIG9mIGFyZ3YucGF0aHMgYXMgc3RyaW5nW10pIHtcbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBkaXJlbnRzLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKS5tYXAoKGQpID0+IHBhdGguam9pbihwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuXG4gICAgYXdhaXQgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihbcm9vdERpclBhdGgsIC4uLnN1YkRpclBhdGhzXSk7XG5cbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgZ2V0UGFja2FnZUNvbmZpZyhyb290RGlyUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICB9XG4gICAgaWYgKCFyb290Q29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGB0aGVyZSBpcyBubyB2YWxpZCBwYWNrYWdlLmpzb24gaW4gJHtyb290RGlyUGF0aH1gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhYmJyZXZpYXRpb25Qcm9taXNlID0gZml4VHlwb3Mocm9vdENvbmZpZyk7XG5cbiAgICBjb25zdCBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCwgcm9vdENvbmZpZykpXG4gICAgKTtcbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeFByaXNtYUVudkZpbGVzKHJvb3RDb25maWcpLFxuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2VtaW5pQ29uZmlnKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICAuLi4oc2hvdWxkUnVuV29ya2Zsb3dzID8gW2dlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMaW50c3RhZ2VkcmMocm9vdENvbmZpZyksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBhcmd2LnNraXBEZXBzKTtcblxuICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWcpKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24gJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZykpO1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICAvLyBSZWZyZXNoIGxvY2sgZmlsZXNcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3JlZnJlc2hCdW5Mb2NrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuXG4gICAgYXdhaXQgaW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWcpO1xuICB9XG4gIGlmIChoYXNJbnZhbGlkUGFja2FnZUNvbmZpZykge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gd2JmeSBzaG91bGQgdXBkYXRlIG9ubHkgdGhlIHBhY2thZ2VzIGl0IGV4cGxpY2l0bHkgbWFuYWdlcyB0aHJvdWdoIGJ1biBhZGQuXG4gIC8vIFJ1bm5pbmcgYnVuIHVwZGF0ZSBoZXJlIHJlZnJlc2hlcyB1bnJlbGF0ZWQgYXBwbGljYXRpb24gZGVwZW5kZW5jaWVzIGFuZFxuICAvLyBjYW4gY2hhbmdlIHByb2R1Y3QgYmVoYXZpb3IsIHNvIGtlZXAgdGhlIGV4aXN0aW5nIGxvY2sgYW5kIHJlY29uY2lsZSBpdC5cbiAgY29uc3Qgc3RhdHVzID0gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgpO1xuICBpZiAoc3RhdHVzICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCBCdW4gbG9ja2ZpbGU6IGJ1biBpbnN0YWxsIGV4aXRlZCB3aXRoIHN0YXR1cyAke3N0YXR1c31gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwibmFtZXMiOlsiYXN5bmMiLCJzbGVlcCIsIm1pbGxpc2Vjb25kcyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsImlnbm9yZUVycm9yQXN5bmMiLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwiZXJyb3IiLCJjb2RlIiwib3B0aW9ucyIsImlzVmVyYm9zZSIsImRvZXNVcGxvYWRFbnZWYXJzIiwibG9nZ2VyIiwiZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbiIsIm5hbWUiLCJmdW5jIiwiY29uc29sZSIsImluZm8iLCJFcnJvciIsInN0YWNrIiwiU3RyaW5nIiwiZnNVdGlsIiwicmVhZEZpbGVJZ25vcmluZ0Vycm9yIiwiZmlsZVBhdGgiLCJmcyIsInByb21pc2VzIiwicmVhZEZpbGUiLCJnZW5lcmF0ZUZpbGUiLCJjb250ZW50IiwibWtkaXIiLCJwYXRoIiwiZGlybmFtZSIsInJlY3Vyc2l2ZSIsIm5vcm1hbGl6ZWRDb250ZW50IiwidHJpbSIsIndyaXRlRmlsZSIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJmaXhOZXh0Q29uZmlnSnNvbiIsImNvbmZpZyIsIm1hcCIsImV4dCIsImRpclBhdGgiLCJmaW5kIiwicCIsImV4aXN0c1N5bmMiLCJvbGRDb250ZW50Iiwib2JqZWN0TGl0ZXJhbCIsInNvdXJjZSIsInRzIiwiY3JlYXRlU291cmNlRmlsZSIsIlNjcmlwdFRhcmdldCIsIkxhdGVzdCIsIlNjcmlwdEtpbmQiLCJKUyIsInZpc2l0Iiwibm9kZSIsImlzRXhwb3J0QXNzaWdubWVudCIsImlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJleHByZXNzaW9uIiwiaXNCaW5hcnlFeHByZXNzaW9uIiwib3BlcmF0b3JUb2tlbiIsImtpbmQiLCJTeW50YXhLaW5kIiwiRXF1YWxzVG9rZW4iLCJsZWZ0IiwiZ2V0VGV4dCIsInJpZ2h0IiwiZm9yRWFjaENoaWxkIiwiZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwiLCJwcm9wZXJ0eVRleHRzIiwiU2V0IiwicHJvcGVydGllcyIsInByb3BlcnR5IiwiaGFzIiwicHVzaCIsImxlbmd0aCIsImluc2VydGlvblBvaW50IiwiZ2V0RW5kIiwibGFzdFByb3BlcnR5IiwiYXQiLCJoYXNUcmFpbGluZ0NvbW1hIiwic2xpY2UiLCJpbmNsdWRlcyIsInByZWZpeCIsIm5ld0NvbnRlbnQiLCJqb2luIiwicnVuIiwibGl0ZXJhbCIsInZhbHVlIiwiYXNPYmplY3QiLCJleHRyYU1lbWJlcnMiLCJ0b1BhcnNlZE9iamVjdCIsImRlZmF1bHRDb25maWciLCJmb3JiaWRPbmx5IiwicmV0cmllcyIsInVzZSIsImJhc2VVUkwiLCJ0cmFjZSIsInNjcmVlbnNob3QiLCJ2aWRlbyIsIndlYlNlcnZlciIsImNvbW1hbmQiLCJ1cmwiLCJyZXVzZUV4aXN0aW5nU2VydmVyIiwidGltZW91dCIsInN0ZG91dCIsInN0ZGVyciIsImVudiIsImdyYWNlZnVsU2h1dGRvd24iLCJtZW1iZXJPcmRlciIsIk9iamVjdCIsImtleXMiLCJrZXkiLCJfIiwiaW5kZXgiLCJmaXhQbGF5d3JpZ2h0Q29uZmlnIiwiZW52RmlsZVBhdGgiLCJlbnZGaWxlTmFtZXMiLCJlbnZGaWxlUGF0aHMiLCJjdXJyZW50RGlyUGF0aCIsImZpbGVOYW1lIiwiZ2V0RW52RmlsZVBhdGhzIiwidGVzdCIsImFzc2VydE5leHRQdWJsaWNCYXNlVXJsIiwiZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCIsIlRTIiwiZm91bmQiLCJpc0NhbGxFeHByZXNzaW9uIiwiZmlyc3RBcmd1bWVudCIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsImV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsIiwicGFyc2VkIiwicGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsIm1lcmdlZCIsIm1lcmdlUGFyc2VkT2JqZWN0cyIsImhhc1N0YXJ0VGVzdFNlcnZlciIsIkJvb2xlYW4iLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJoYXNFeGlzdGluZ1dlYlNlcnZlciIsIm9iamVjdCIsImlzQnVuIiwic2V0V2ViU2VydmVyQ29tbWFuZCIsIm5ld09iamVjdExpdGVyYWwiLCJzdHJpbmdpZnlWYWx1ZSIsInN0YXJ0IiwiZ2V0U3RhcnQiLCJlbmQiLCJiYXNlIiwib3ZlcnJpZGUiLCJvdmVycmlkZVByb3BlcnR5S2V5cyIsImZpbHRlciIsIm1lbWJlciIsImVudHJpZXMiLCJtZXJnZVBhcnNlZFZhbHVlIiwicGFyc2VFeHByZXNzaW9uIiwicGFyc2VkT2JqZWN0IiwiaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uIiwiZWxlbWVudHMiLCJlbGVtZW50Iiwic29tZSIsImlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50IiwiaXNQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc0lkZW50aWZpZXIiLCJpc1N0cmluZ0xpdGVyYWwiLCJpbml0aWFsaXplciIsImxldmVsIiwiY2xvc2luZ0luZGVudCIsInJlcGVhdCIsImluZGVudCIsIml0ZW0iLCJzdHJpbmdpZmllZCIsInNwbGl0IiwiZW1pdHRlZFByb3BlcnRpZXMiLCJsYXN0UHJvcGVydHlJbmRleEJ5S2V5IiwiTWFwIiwic2V0IiwiZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleSIsImxpbmVzIiwiZmxhdE1hcCIsInN0cmluZ2lmeU9iamVjdE1lbWJlciIsImdldCIsImFkZCIsInN0cmluZ2lmeU9iamVjdFByb3BlcnR5IiwibGluZSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsInNob3VsZEFkZENvbm5lY3Rpb25MaW1pdCIsImRlcGVuZGluZyIsInByaXNtYSIsImRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY2llcyIsInNob3VsZEFkZFNxbGl0ZUNvbm5lY3Rpb25MaW1pdCIsImVudkZpbGVzIiwiZmciLCJnbG9iIiwiZG90IiwiY3dkIiwiaWdub3JlIiwiZW52RmlsZSIsInJlcGxhY2VBbGwiLCJtYXRjaCIsIm5vcm1hbGl6ZVNxbGl0ZURhdGFiYXNlVXJsIiwicXVlcnlTdGFydCIsImluZGV4T2YiLCJwYXRoUGFydCIsInF1ZXJ5UGFydCIsInBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsImRlbGV0ZSIsIm5vcm1hbGl6ZWRRdWVyeSIsInRvU3RyaW5nIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwic29ydE9iamVjdEJ5S2V5TmFtZUxpc3QiLCJzb3J0V2l0aCIsInNvcnRGbiIsInRvdGFsIiwib2JqZWN0S2V5cyIsInNvcnQiLCJJTkRFTlRfUkVHRVgiLCJJTkRFTlRfVFlQRV9TUEFDRSIsInNob3VsZElnbm9yZVNpbmdsZVNwYWNlIiwiaWdub3JlU2luZ2xlU3BhY2VzIiwiaW5kZW50VHlwZSIsIm1ha2VJbmRlbnRzTWFwIiwic3RyaW5nIiwiaW5kZW50cyIsInByZXZpb3VzSW5kZW50VHlwZSIsInByZXZpb3VzU2l6ZSIsIm1hdGNoZXMiLCJ3ZWlnaHQiLCJpbmRlbnREaWZmZXJlbmNlIiwiYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlIiwiTWF0aCIsImFicyIsImVuY29kZUluZGVudHNLZXkiLCJlbnRyeSIsImluZGVudEFtb3VudCIsImRldGVjdEluZGVudCIsIlR5cGVFcnJvciIsInNpemUiLCJrZXlPZk1vc3RVc2VkSW5kZW50IiwicmVzdWx0IiwibWF4VXNlZCIsIm1heFdlaWdodCIsInVzZWRDb3VudCIsImdldE1vc3RVc2VkS2V5IiwidHlwZSIsImFtb3VudCIsImluZGVudHNLZXkiLCJOdW1iZXIiLCJtYWtlSW5kZW50U3RyaW5nIiwiZGV0ZWN0TmV3bGluZUdyYWNlZnVsIiwibmV3bGluZXMiLCJjcmxmIiwibmV3bGluZSIsImRldGVjdE5ld2xpbmUiLCJwaXBlIiwiZm5zIiwieCIsImFyZ3MiLCJyZWR1Y2UiLCJvbkFycmF5IiwiQXJyYXkiLCJpc0FycmF5Iiwib25TdHJpbmdBcnJheSIsImV2ZXJ5IiwidW5pcSIsInhzIiwic29ydEFycmF5IiwiYXJyYXkiLCJ0b1NvcnRlZCIsInVuaXFBbmRTb3J0QXJyYXkiLCJvbk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJpdGVyYXRvciIsImlzUGxhaW5PYmplY3QiLCJzb3J0T2JqZWN0QnkiLCJjb21wYXJhdG9yIiwiZGVlcCIsIm92ZXIiLCJmcm9tRW50cmllcyIsInNvcnRPYmplY3RLZXlzIiwib2JqZWN0R3JvdXBCeSIsImdyb3VwQnkiLCJjYWxsYmFjayIsImNyZWF0ZSIsInNvcnRPYmplY3QiLCJzb3J0VVJMT2JqZWN0Iiwic29ydFBlb3BsZU9iamVjdCIsInNvcnREaXJlY3RvcmllcyIsIm92ZXJQcm9wZXJ0eSIsImhhc093biIsInNvcnRHaXRIb29rcyIsInBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSIsInNwZWNpZmllciIsIm5hbWVBbmRWZXJzaW9uIiwiYXRNYXRjaGVzIiwibWF0Y2hBbGwiLCJzcGxpdEluZGV4IiwicG9wIiwic3Vic3RyaW5nIiwicmFuZ2UiLCJzb3J0T2JqZWN0QnlTZW12ZXIiLCJhIiwiYiIsImFOYW1lIiwiYVJhbmdlIiwiYk5hbWUiLCJiUmFuZ2UiLCJsb2NhbGVDb21wYXJlIiwic2VtdmVyQ29tcGFyZSIsInNlbXZlck1pblZlcnNpb24iLCJnZXRQYWNrYWdlTmFtZSIsImlkZW50Iiwic3RhcnRzV2l0aCIsImNhY2hlIiwic2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0iLCJwYWNrYWdlTWFuYWdlciIsImRldkVuZ2luZXMiLCJwbnBtIiwiZW5naW5lcyIsIm5wbSIsInByb2Nlc3MiLCJoYXNZYXJuT3JQbnBtRmlsZXMiLCJzb3J0RGVwZW5kZW5jaWVzIiwic29ydFdvcmtzcGFjZXMiLCJzb3J0RXNsaW50Q29uZmlnIiwib3ZlcnJpZGVzIiwicnVsZTEiLCJydWxlMiIsInNvcnRWU0NvZGVCYWRnZU9iamVjdCIsInNvcnRQcmV0dGllckNvbmZpZyIsInNvcnRWb2x0YSIsInNvcnREZXZFbmdpbmVzIiwic29ydFBucG1Db25maWciLCJkZWZhdWx0TnBtU2NyaXB0cyIsImhhc0RldkRlcGVuZGVuY3kiLCJkZXBlbmRlbmN5IiwicnVuU1JlZ0V4cCIsImhhc1NlcXVlbnRpYWxTY3JpcHQiLCJmaWVsZCIsInZhbHVlcyIsInNjcmlwdCIsImlzU2VxdWVudGlhbFNjcmlwdCIsInNvcnRTY3JpcHROYW1lcyIsImdyb3VwTWFwIiwiaWR4IiwiZnJvbSIsImdyb3VwS2V5IiwiY2hpbGRyZW4iLCJrIiwic29ydFNjcmlwdHMiLCJuYW1lcyIsInByZWZpeGFibGUiLCJvbWl0dGVkIiwicmVwbGFjZSIsInNvcnRDb25kaXRpb25zIiwiY29uZGl0aW9ucyIsImRlZmF1bHRDb25kaXRpb25zIiwicmVzdENvbmRpdGlvbnMiLCJjb25kaXRpb24iLCJzb3J0RXhwb3J0cyIsImV4cG9ydHMiLCJwYXRocyIsImZpZWxkcyIsIm1haW50YWluZXJzIiwiY29udHJpYnV0b3JzIiwicGFja2FnZU5hbWVBIiwicGFja2FnZU5hbWVCIiwiYmFkZ2UiLCJkZWZhdWx0U29ydE9yZGVyIiwib3ZlckZpZWxkcyIsInNvcnRQYWNrYWdlSnNvbiIsImpzb25Jc2giLCJqc29uIiwiZW5kQ2hhcmFjdGVycyIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsImVkaXRTdHJpbmdKU09OIiwic29ydE9yZGVyIiwicHJpdmF0ZUtleXMiLCJwdWJsaWNLZXlzIiwiZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiIsInBhY2thZ2VEaXJQYXRocyIsImFsbCIsInBhY2thZ2VKc29uUGF0aCIsInBhY2thZ2VEaXJQYXRoIiwibmV3VGVzdERpclBhdGgiLCJvbGRUZXN0RGlyTmFtZSIsIm9sZFRlc3REaXJQYXRoIiwibW92ZVRlc3REaXJlY3RvcnkiLCJkaWRVcGRhdGVTY3JpcHQiLCJzY3JpcHROYW1lIiwibmV3U2NyaXB0IiwicmVuYW1lIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib2xkUGF0aCIsImRpcmVudCIsIm5ld1BhdGgiLCJuZXdQYXRoU3RhdCIsInN0YXQiLCJpc0RpcmVjdG9yeSIsInJtIiwiZml4VHlwZURlZmluaXRpb25zIiwiY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuIiwibGliVHlwZURpclBhdGgiLCJzcmNUeXBlRGlyUGF0aCIsImlzUm9vdCIsImRvZXNDb250YWluU3ViUGFja2FnZUpzb25zIiwiZGlyTmFtZSIsImhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiIsImVuZHNXaXRoIiwicGFja2FnZU5hbWUiLCJoYXNMaWJyYXJ5IiwiaXNGaWxlIiwib3ZlcndyaXRlTWVyZ2UiLCJkZXN0aW5hdGlvbkFycmF5Iiwic291cmNlQXJyYXkiLCJjb21iaW5lTWVyZ2UiLCJ0YXJnZXQiLCJkZXN0aW5hdGlvbiIsImNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkIiwiaXNNZXJnZWFibGVPYmplY3QiLCJtZXJnZSIsInNvcnRLZXlzIiwib2JqIiwia2V5QW5kVmFsdWVzIiwia2V5MSIsImtleTIiLCJwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93Iiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsInBlcm1pc3Npb25zIiwiY29udGVudHMiLCJjb25jdXJyZW5jeSIsImdyb3VwIiwiam9icyIsImF1dG9maXgiLCJwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdyIsInVzZXMiLCJ3b3JrZmxvd3MiLCJyZWxlYXNlIiwicHVsbF9yZXF1ZXN0X3RhcmdldCIsInR5cGVzIiwic3luYyIsImlzc3VlcyIsImlmIiwid2l0aCIsInNlY3JldHMiLCJDTEFVREVfQ09ERV9PQVVUSF9UT0tFTiIsIk9QRU5BSV9BUElfS0VZIiwiR0VNSU5JX0FQSV9LRVkiLCJnZW5lcmF0ZVdvcmtmbG93cyIsInJvb3RDb25maWciLCJpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyIsInJlcG9zaXRvcnkiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwiZm9yY2UiLCJmaWxlTmFtZVNldCIsInNlbWFudGljUmVsZWFzZSIsImJhc2VuYW1lIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMiLCJ3cml0ZVlhbWwiLCJpc1B1YmxpY1JlcG8iLCJzdHJ1Y3R1cmVkQ2xvbmUiLCJzdGVwcyIsImJ1aWxkIiwiYXV0b2ZpeFdvcmtmbG93IiwiYXV0b2ZpeEpvYiIsImdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93IiwibmV3U2V0dGluZ3MiLCJvbGRTZXR0aW5ncyIsInlhbWwiLCJsb2FkIiwiYXJyYXlNZXJnZSIsIm1vdmVUb0JvdHRvbSIsImFjdGlvbnMiLCJ0cmlnZ2VyX2RlcGxveV93b3JrZmxvdyIsImlzUmV1c2FibGVXb3JrZmxvdyIsImpvYiIsIm5vcm1hbGl6ZUpvYiIsInNjaGVkdWxlIiwiYnJhbmNoIiwic3luY19wYXJhbXNfd2l0aG91dF9kZXN0Iiwid29ya2Zsb3dfZGlzcGF0Y2giLCJOUE1fVE9LRU4iLCJHSF9UT0tFTiIsIkZJUkVCQVNFX1RPS0VOIiwiR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJzZXJ2ZXJfdXJsIiwiZG90X2Vudl9wYXRoIiwiRkxZX0FQSV9UT0tFTiIsImRlcGxveV9jb21tYW5kIiwiZG9lc0NvbnRhaW5Eb2NrZXJmaWxlIiwiY2lfbGFiZWwiLCJnaXRodWJfaG9zdGVkX3J1bm5lciIsIm5ld1NlY3JldHMiLCJ5YW1sVGV4dCIsImR1bXAiLCJsaW5lV2lkdGgiLCJub0NvbXBhdE1vZGUiLCJzdHlsZXMiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwiY29tbWVudCIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwid2JmeUpzb24iLCJ0eXBvcyIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMiLCJhbGxDb25maWdzIiwiYWdlbnRzRXh0cmFQYXRoIiwiZXh0cmFDb250ZW50IiwidG9vbE5hbWUiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24iLCJjdXJzb3JSdWxlc1BhdGgiLCJjdXJzb3JSdWxlc0NvbnRlbnQiLCJmcm9udG1hdHRlciIsImJvZHkiLCJnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50IiwiYmFzZUNvbnRlbnQiLCJkZXNjcmlwdGlvbiIsImlzV2lsbEJvb3N0ZXJSZXBvIiwiY29uZmlncyIsInBsYXl3cmlnaHRUZXN0Iiwid2IiLCJnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUiLCJoYXNOZXdTZWN0aW9uIiwiYyIsImdlbkkxOG5UcyIsInJlYWN0IiwibmV4dCIsIm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMiLCJnZW5lcmF0ZUJ1bmZpZ1RvbWwiLCJleGlzdGluZ0NvbnRlbnQiLCJyZWFkRmlsZVN5bmMiLCJidW5maWdUb21sIiwicGFyc2VCdW5maWdUb21sIiwiYnVuIiwiZ2VuZXJhdGVSdW5TZWN0aW9uIiwiaW5zdGFsbCIsImV4YWN0IiwidXNlckNvbnRlbnRIZWFkZXIiLCJ1c2VyQ29udGVudEhlYWRlclJlZ2V4Iiwic2VwYXJhdG9yIiwiZGVmYXVsdEhlYWRVc2VyQ29udGVudCIsImRlZmF1bHRUYWlsVXNlckNvbnRlbnQiLCJpZ25vcmVGaWxlVXRpbCIsInNlcGFyYXRvclByZWZpeCIsInJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyIsImxhc3RIZWFkZXJJbmRleCIsImdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIiLCJnZXRIZWFkVXNlckNvbnRlbnQiLCJ0aGlzIiwiZ2V0VGFpbFVzZXJDb250ZW50IiwiaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZCIsImxhc3RJbmRleCIsImxhc3RJbmRleE9mIiwiZ2VuZXJhdGVEb2NrZXJpZ25vcmUiLCJleHRlbnNpb25zIiwiY29kZVdpdGgySW5kZW50U2l6ZSIsImNvZGVXaXRoNEluZGVudFNpemUiLCJtYXJrZG93bkxpa2UiLCJveGxpbnQiLCJveGZtdCIsInByZXR0aWVyT25seSIsImdlbmVyYXRlRXh0ZW5zaW9ucyIsImdlbmVyYXRlRWRpdG9yY29uZmlnIiwiaGF2ZV9mdW4iLCJjb2RlX3JldmlldyIsImRpc2FibGUiLCJjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZCIsIm1heF9yZXZpZXdfY29tbWVudHMiLCJwdWxsX3JlcXVlc3Rfb3BlbmVkIiwiaGVscCIsInN1bW1hcnkiLCJpZ25vcmVfcGF0dGVybnMiLCJnZW5lcmF0ZUdlbWluaUNvbmZpZyIsImNvbmZpZ0ZpbGVQYXRoIiwic3R5bGVndWlkZUZpbGVQYXRoIiwibmV3Q29uZmlnIiwib2xkQ29uZmlnIiwieWFtbENvbnRlbnQiLCJjb2RpbmdSdWxlRXh0cmFDb250ZW50IiwidHJpbVN0YXJ0Iiwic3R5bGVndWlkZUNvbnRlbnQiLCJ0cmltRW5kIiwicmVtb3ZlR2VtaW5pU2V0dGluZ3MiLCJnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMiLCJkZWZhdWx0TmFtZXMiLCJnZW5lcmF0ZUdpdGlnbm9yZSIsImhlYWRVc2VyQ29udGVudCIsInRhaWxVc2VyQ29udGVudCIsImRvZXNDb250YWluR2VtZmlsZSIsImRvZXNDb250YWluR29Nb2QiLCJkb2VzQ29udGFpblBhY2thZ2VKc29uIiwiZG9lc0NvbnRhaW5Qb21YbWwiLCJkb2VzQ29udGFpblB1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwiLCJkb2VzQ29udGFpblBvZXRyeUxvY2siLCJkb2VzQ29udGFpblV2TG9jayIsImJsaXR6IiwiZmlyZWJhc2UiLCJyZWFjdE5hdGl2ZSIsInN0b3J5Ym9vayIsImxpdGVzdHJlYW0iLCJnZW5lcmF0ZWQiLCJyZWFkQ2FjaGUiLCJyZXNwb25zZSIsImZldGNoIiwicmVzcG9uc2VUZXh0IiwidGV4dCIsIm9rIiwid3JpdGVDYWNoZSIsIm9zIiwiaG9tZWRpciIsIkRhdGUiLCJub3ciLCJtdGltZU1zIiwiZG9lc0NvbnRhaW5Kc09yVHMiLCJkb2VzQ29udGFpbkphdmFTY3JpcHQiLCJkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5UeXBlU2NyaXB0IiwiZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcyIsImRvZXNDb250YWluSmF2YSIsImRvZXNDb250YWluSmF2YUluUGFja2FnZXMiLCJnZW5lcmF0ZUlkZWFTZXR0aW5ncyIsImNyZWF0ZVRhc2tPcHRpb25zIiwiZ2V0V2F0Y2hlclRhc2tzQ29udGVudCIsInJ1bm5lciIsImV4dGVuc2lvbiIsImdldEdlbkkxOG5Uc0NvbW1hbmQiLCJzcGF3blN5bmMiLCJyZXRyeSIsInNwYXduU3luY0FuZFJldHVyblN0YXR1cyIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwic3RhdHVzIiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luY0FuZFJldHVyblN0ZG91dCIsInN0ZGlvIiwicHJvYyIsInMiLCJtZXNzYWdlIiwiUEFUSCIsIkJFUlJZX0JJTl9GT0xERVIiLCJlbmNvZGluZyIsInNoZWxsIiwiZ2l0SHViVXRpbCIsImdldE9yZ0FuZE5hbWUiLCJ1cmxPckZ1bGxOYW1lIiwidXJsV2l0aG91dFByb3RvY29sIiwib2N0b2tpdENhY2hlIiwiZ2V0T2N0b2tpdCIsIm93bmVyIiwiY2FjaGVkIiwib2N0b2tpdCIsIk9jdG9raXQiLCJhdXRoIiwiZ2V0R2l0SHViVG9rZW4iLCJoYXNHaXRIdWJUb2tlbiIsIkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIiwiZ2V0R2l0SHViQ2xpVG9rZW4iLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiIsIkdJVEhVQl9UT0tFTiIsImdpdEh1YkNsaVRva2VuIiwiY2hpbGRQcm9jZXNzIiwiZXhlY0ZpbGVTeW5jIiwibWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsImlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwicHJpdmF0ZSIsImZpbGVzIiwib3hsaW50RGVwcyIsInR5cGVzY3JpcHRHb0RlcGVuZGVuY3kiLCJ0eXBlc2NyaXB0RGVwZW5kZW5jeSIsIndiRGVwZW5kZW5jeSIsImJ1aWxkVHNEZXBlbmRlbmN5Iiwid2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyIsIm9ic29sZXRlTGludERlcGVuZGVuY2llcyIsIm1pY3JvbWF0Y2hQYWNrYWdlTmFtZXMiLCJtaWNyb21hdGNoSW1wb3J0UGF0dGVybiIsImxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUiLCJkZXBlbmRlbmN5U2VjdGlvbktleXMiLCJnZW5lcmF0ZVBhY2thZ2VKc29uIiwic2tpcEFkZGluZ0RlcHMiLCJqc29uT2JqIiwianNvblRleHQiLCJwZWVyRGVwZW5kZW5jaWVzIiwicmVhZFBhY2thZ2VKc29uIiwiYXV0aG9yIiwic2VjdGlvbiIsImdldERlcGVuZGVuY3lTZWN0aW9ucyIsIlJlZmxlY3QiLCJkZWxldGVQcm9wZXJ0eSIsInJlbW92ZVNlbGZEZXBlbmRlbmN5IiwidmVyc2lvbiIsImlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSIsImdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uIiwicmVwbGFjZVdpbGxCb29zdGVyQ29uZmlnc1dvcmtzcGFjZURlcGVuZGVuY3lSYW5nZXMiLCJ0c2xpYiIsImxlcm5hIiwicGluc3QiLCJwcmV0dGllciIsInNlY3Rpb25zIiwicmVtb3ZlV2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyIsInByZXNlcnZlTWljcm9tYXRjaCIsImZpbGVQYXRocyIsImdsb2JTeW5jIiwiZG9lc1Byb2R1Y3RDb2RlSW1wb3J0TWljcm9tYXRjaCIsInNob3VsZFByZXNlcnZlTWljcm9tYXRjaCIsInNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5IiwicmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzIiwicmVtb3ZlRGVwcmVjYXRlZFN0dWZmIiwicmVtb3ZlTGVnYWN5SW5zdGFsbENvbW1hbmRzIiwiZ2VuZXJhdGVTY3JpcHRzIiwidGFza05hbWUiLCJoYXNNaXNlVGFzayIsImRvZXNNaXNlVGFza0NhbGxQYWNrYWdlU2NyaXB0IiwiZ2V0U2FmZU1pc2VUYXNrTmFtZSIsImFkZFN0YXJ0VGVzdFNlcnZlclNjcmlwdElmTmVlZGVkIiwiYWRkSW5zdGFsbFN0ZXBUb0NoZWNrRm9yQWkiLCJwcmV0dGlmeSIsImNhdGNoIiwib3JpZ2luYWxDb250ZW50IiwibmV3TGluZSIsImwiLCJnZW5lcmF0ZVByZXR0aWVyU3VmZml4Iiwibm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzIiwidXBkYXRlU2NyaXB0cyIsIm1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jeVVwZGF0ZXMiLCJweXRob25EZXZEZXBlbmRlbmNpZXMiLCJoYXNKYXZhIiwiZGVwZW5kZW5jeVNlY3Rpb25zIiwicmVtb3ZlUHJldHRpZXJBcnRpZmFjdHMiLCJodXNreSIsInBvc3RpbnN0YWxsIiwicG9zdHB1Ymxpc2giLCJwcmVwdWJsaXNoT25seSIsInByZXBhY2siLCJwb3N0cGFjayIsInByZXBhcmUiLCJhcnRpbGxlcnkiLCJwbGF5d3JpZ2h0Iiwid29ya3NwYWNlcyIsIndvcmtzcGFjZSIsInRzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsImdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsInVzZWREZXBlbmRlbmNpZXMiLCJ1c2VkRGVwZW5kZW5jeVNldCIsImV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwiYWJzb2x1dGVGaWxlUGF0aCIsInBhcnNlQ29uZmlnRmlsZVRleHRUb0pzb24iLCJ3YXJuIiwiZm9ybWF0VHNEaWFnbm9zdGljIiwibm9ybWFsaXplVHNjb25maWdFeHRlbmRzIiwiZXh0ZW5kcyIsImdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwicmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwiamVzdCIsImRlcCIsImFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwiY29uZmlnTWpzUGF0aCIsImNvbmZpZ0R0c1BhdGgiLCJjb25maWdEbXRzQ29udGVudCIsIm5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YSIsIm1haW4iLCJyZXNvbHV0aW9ucyIsImxpbnQiLCJkaXJzIiwiZGlyIiwiZm9ybWF0IiwiYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQiLCJweXRob25QYWNrYWdlTWFuYWdlciIsImdldFB5dGhvblBhY2thZ2VNYW5hZ2VyIiwicHl0aG9uRmlsZXMiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwiZGlyTmFtZXNTdHIiLCJweXRob25SdW5uZXIiLCJleGlzdGluZ1JlcG9zaXRvcnkiLCJub3JtYWxpemVkUmVwb3NpdG9yeSIsIm5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbiIsImJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbiIsIm5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkiLCJmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24iLCJhZGRHZW5JMThuVHNQb3N0aW5zdGFsbFNjcmlwdCIsIm5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YSIsInBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIiwicGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMiLCJhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyIsImFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24iLCJwYWNrYWdlTmFtZXMiLCJwcml2YXRlUGFja2FnZXMiLCJyZXBvIiwiaXNXb3Jrc3BhY2VQYWNrYWdlIiwib3RoZXJUYXJnZXQiLCJjb21taXRIYXNoIiwib3JnYW5pemF0aW9uIiwicmVqZWN0IiwiZ2V0TGF0ZXN0Q29tbWl0SGFzaCIsImdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwicmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMiLCJzZXJpYWxpemVQYWNrYWdlSnNvbiIsImluc3RhbGxOcG1EZXBlbmRlbmNpZXMiLCJpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMiLCJyZWxhdGl2ZUZpbGVQYXRoIiwicmVsYXRpdmUiLCJmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyIiwiY29yZSIsImZvcm1hdFNjcmlwdCIsInNjcmlwdFJ1bm5lciIsImRldiIsImRlcGVuZGVuY3lTcGVjaWZpZXJzIiwiY3VycmVudFZlcnNpb24iLCJnZXREZXBlbmRlbmN5U3BlY2lmaWVyIiwiZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIiLCJkZXBlbmRlbmNpZXNUb0luc3RhbGwiLCJzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kiLCJzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5IiwiZGlhZ25vc3RpYyIsImZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQiLCJtZXNzYWdlVGV4dCIsImNhY2hlZFZlcnNpb24iLCJnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0iLCJlc2xpbnQiLCJyZXBvc2l0b3J5VXJsIiwibWF0Y2hlZCIsImV4ZWMiLCJub3JtYWxpemVkVXJsIiwib2xkU2NyaXB0cyIsImhhc1R5cGVjaGVjayIsImNsZWFudXAiLCJ0eXBlY2hlY2siLCJ2ZXJpZnkiLCJhcHBseU1pc2VUYXNrU2NyaXB0cyIsInB5cmlnaHQiLCJoYXNKc09yVHMiLCJvbGRUZXN0IiwiZ2VuZXJhdGVGb3JtYXRTY3JpcHQiLCJpc1diZnlNYW5hZ2VkTWlzZUJyaWRnZSIsIm1pc2VUYXNrcyIsInRhc2siLCJSZWdFeHAiLCJyYXciLCJjb21tYW5kcyIsImJhc2VTZXR0aW5ncyIsImdsb2JfbWF0Y2hlciIsInByZUNvbW1pdFNldHRpbmdzIiwic3RhZ2VfZml4ZWQiLCJnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiIsImh1c2t5RGlyUGF0aCIsImhhc0h1c2t5RGlyIiwic2V0dGluZ3MiLCJnZXRQcmVDb21taXRKb2JzIiwicHJlUHVzaCIsImxpbnRDb21tYW5kIiwicXVpZXRMaW50Q29tbWFuZCIsImdldFByZVB1c2hTY3JpcHQiLCJta2RpclN5bmMiLCJtb2RlIiwicG9zdE1lcmdlQ29tbWFuZCIsInBvc3RNZXJnZUNvbW1hbmRzIiwiaGFzVmVyc2lvblNldHRpbmdzIiwidG9vbHNDaGFuZ2VkUGF0dGVybiIsImluc3RhbGxDb21tYW5kIiwicm1OZXh0RGlyZWN0b3J5IiwiZ2VuSTE4blRzQ29tbWFuZCIsImdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMiLCJnZXRDbGVhbnVwR2xvYnMiLCJnZXRDbGVhbnVwQ29tbWFuZCIsInN1cHBvcnRlZEV4dGVuc2lvbnMiLCJsb2NhbFdiUGFja2FnZUpzb25QYXRoIiwiaGFzTG9jYWxXYldvcmtzcGFjZSIsImNhblVzZVdiRm9yU3RhZ2VkRmlsZXMiLCJveGxpbnRQYXR0ZXJuIiwib3hmbXRQYXR0ZXJuIiwicHJldHRpZXJQYXR0ZXJuIiwiaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIiLCJnZXRQeXRob25SdW5uZXIiLCJnZW5lcmF0ZUxpbnRzdGFnZWRyYyIsIm5vcm1hbGl6ZVRvb2xDb25maWdDb250ZW50IiwiZ2VuZXJhdGVPeGZtdENvbmZpZyIsImxlZ2FjeUpzb25Db25maWdQYXRoIiwiZGVzaXJlZENvbnRlbnQiLCJpc0VzbVBhY2thZ2UiLCJjb21tb25Kc1ZhcmlhYmxlTmFtZSIsImdlbmVyYXRlVG9vbENvbmZpZ0NvbnRlbnQiLCJnZXRDb25maWdDb250ZW50IiwiZ2VuZXJhdGVPeGxpbnRDb25maWciLCJfcm9vdENvbmZpZyIsInNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnIiwiZ2V0TWFuYWdlZEJsb2NrIiwiZ2V0U3RhcnRNYXJrZXIiLCJoYXNNYW5hZ2VkQmxvY2tzIiwiYmxvY2tOYW1lIiwicmVwbGFjZW1lbnQiLCJleHRyYWN0TWFuYWdlZEJsb2NrIiwibmV4dENvbnRlbnQiLCJyZXBsYWNlTWFuYWdlZEJsb2NrIiwicmVwbGFjZU1hbmFnZWRCbG9ja3MiLCJnZXRDb25maWdDb250ZW50V2l0aE1hbmFnZWRCbG9ja3MiLCJnZXRNYW5hZ2VkQmxvY2tSZWdFeHAiLCJwYXR0ZXJuIiwiZXNjYXBlUmVnRXhwIiwiZ2V0RW5kTWFya2VyIiwiZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSIsImdpdGlnbm9yZUZpbGVQYXRoIiwiZ2l0aWdub3JlQ29udGVudCIsImFkZGl0aW9uYWxDb250ZW50IiwidmVudlBhdGgiLCJ2ZW52IiwiZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiIsImdlbmVyYXRlUmVhZG1lIiwiaW5zZXJ0QmFkZ2UiLCJmaWxlTmFtZXMiLCJyZWFkZGlyU3luYyIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwicmVtb3ZlR2l0SHViQWN0aW9uc0JhZGdlIiwicmVhZG1lIiwiaSIsImVzY2FwZWRCYWRnZU5hbWUiLCJlc2NhcGVkRmlsZU5hbWUiLCJnZW5lcmF0ZVJlbGVhc2VyYyIsInBsdWdpbnMiLCJwbHVnaW5FbnRyeSIsInBsdWdpbiIsInByZXNldCIsInN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uIiwiZmFpbENvbW1lbnRDb25kaXRpb24iLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsIiRzY2hlbWEiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJtYXRjaFBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJpbnN0YWxsQWdlbnRTa2lsbHMiLCJyb290SnNvbk9iaiIsImNvbXBpbGVyT3B0aW9ucyIsImFsd2F5c1N0cmljdCIsIm5vVW5jaGVja2VkSW5kZXhlZEFjY2VzcyIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsImltcG9ydEhlbHBlcnMiLCJub0VtaXQiLCJleGNsdWRlIiwiaW5jbHVkZSIsInN1Ykpzb25PYmoiLCJnZW5lcmF0ZVRzY29uZmlnIiwibW9kdWxlUmVzb2x1dGlvbiIsIm5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzIiwiYmFzZVVybCIsImFsaWFzIiwidGFyZ2V0cyIsIm5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHMiLCJub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyIsImNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzIiwiZ2VuZXJhdGVkVHlwZXMiLCJ0eXBlTmFtZXMiLCJ2aXRlc3QiLCJtb2NoYSIsImN5cHJlc3MiLCJnZXRHZW5lcmF0ZWRUeXBlcyIsImdldFRzY29uZmlnRXh0ZW5kcyIsInJvb3REaXIiLCJnZXRSb290RGlyIiwiZG9lc0NvbnRhaW5Kc3hPclRzeCIsImRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzIiwianN4IiwiYWRkSW5jbHVkZVBhdGgiLCJleGlzdGluZ1R5cGVzIiwiZXhpc3RpbmdFbWl0TWV0YWRhdGEiLCJlbWl0T3B0aW9ucyIsInBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YSIsImdlbmVyYXRlZEV4dGVuZHMiLCJleGlzdGluZ0V4dGVuZHMiLCJtZXJnZWRFeHRlbmRzIiwibm9ybWFsaXplRXh0ZW5kcyIsInVuaXF1ZUV4dGVuZHMiLCJtZXJnZVRzY29uZmlnRXh0ZW5kcyIsImVtaXREZWNsYXJhdGlvbk9ubHkiLCJyZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb25zIiwiZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eSIsIm1lcmdlZFR5cGVzIiwiZmlsdGVyRXhpc3RpbmdUeXBlcyIsInR5cGVOYW1lIiwidHlwZVJvb3RzIiwiZXhwZXJpbWVudGFsRGVjb3JhdG9ycyIsIm1vZHVsZSIsImRlbGV0ZUxlZ2FjeU1vZHVsZVNldHRpbmdzIiwidmVyYmF0aW1Nb2R1bGVTeW50YXgiLCJpc0Fic29sdXRlIiwiZ2VuZXJhdGVkVHlwZVNldCIsImlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwiZ2VuZXJhdGVZYXJucmNZbWwiLCJ5YXJucmNZbWxQYXRoIiwibGF0ZXN0VmVyc2lvbiIsImdldExhdGVzdFZlcnNpb24iLCJuZXdWZXJzaW9uIiwib2xkVmVyc2lvbiIsInZhbGlkTmV3VmVyc2lvbiIsInNlbXZlciIsInZhbGlkIiwiZ3QiLCJpc05ld2VyVmVyc2lvbiIsInJlbGVhc2VzUGF0aCIsInlhcm5yY1BhdGgiLCJkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXgiLCJub2RlTGlua2VyIiwibm1Nb2RlIiwibnBtTWluaW1hbEFnZUdhdGUiLCJhcHByb3ZlZEdpdFJlcG9zaXRvcmllcyIsIm5wbVByZWFwcHJvdmVkUGFja2FnZXMiLCJjb21wcmVzc2lvbkxldmVsIiwiaW5qZWN0RW52aXJvbm1lbnRGaWxlcyIsImVuYWJsZUdsb2JhbENhY2hlIiwib3JpZ2luYWxMZW5ndGgiLCJwbHVnaW5QYXRoIiwiZ2V0WWFybnJjUHJldHRpZXJBcmdzIiwic2V0dXBMYWJlbHMiLCJzZXR1cExhYmVsIiwiZGVsZXRlTGFiZWwiLCJjb2xvciIsInJlcXVlc3QiLCJERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyIsInJlcXVpcmUiLCJjcmVhdGVSZXF1aXJlIiwic2V0dXBTZWNyZXRzIiwiZG90ZW52IiwicXVpZXQiLCJzZWNyZXROYW1lIiwic2VjcmV0X25hbWUiLCJrZXlfaWQiLCJrZXlJZCIsImRhdGEiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsImJlZm9yZVJldHJ5IiwiaGFuZGxlRXJyb3IiLCJyZXRyeUNvdW50IiwicmV0cnlMb2dnZXIiLCJzaG91bGRSZXRyeSIsInNsZWVwTWlsbGlzZWNvbmRzIiwidXBkYXRlU2xlZXBNaWxsaXNlY29uZHMiLCJmYWlsZWRDb3VudCIsIndpdGhSZXRyeSIsImFsbG93X2F1dG9fbWVyZ2UiLCJhbGxvd19tZXJnZV9jb21taXQiLCJhbGxvd19zcXVhc2hfbWVyZ2UiLCJhbGxvd19yZWJhc2VfbWVyZ2UiLCJhbGxvd191cGRhdGVfYnJhbmNoIiwiZGVsZXRlX2JyYW5jaF9vbl9tZXJnZSIsInNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGUiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2UiLCJoZWFkZXJzIiwicGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciIsInRlbXBsYXRlcyIsImdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIiwiYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlIiwiZGlzdGFuY2UiLCJ0ZW1wbGF0ZSIsInBhY2thZ2VNYW5hZ2VyQ29tbWFuZCIsIndiZnlKc29uU2NoZW1hIiwieiIsInJlY29yZCIsIm9wdGlvbmFsIiwiZG9jIiwiZ2V0UGFja2FnZUNvbmZpZyIsImVzbVBhY2thZ2UiLCJwYWNrYWdlSnNvblRleHQiLCJyZWxlYXNlQnJhbmNoZXMiLCJyZWxlYXNlUGx1Z2lucyIsInJlbGVhc2VyY0pzb25QYXRoIiwiZnNwIiwiZmxhdCIsInJlcG9JbmZvIiwiZ2l0Iiwic2ltcGxlR2l0Iiwib3JpZ2luIiwiZ2V0UmVtb3RlcyIsInIiLCJyZW1vdGVVcmwiLCJyZWZzIiwicmVxdWVzdFJlcG9JbmZvIiwiZmV0Y2hSZXBvSW5mbyIsImN1cnJlbnQiLCJoYXNWZXJzaW9uU2V0dGluZ3NGaWxlIiwiZG9ja2VyZmlsZSIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsInJlcG9GdWxsTmFtZSIsImZ1bGxfbmFtZSIsInJlcG9BdXRob3IiLCJyZXBvTmFtZSIsInJlcG9QYXJ0cyIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24iLCJnaXRodWIiLCJyZWFkTWlzZVRhc2tzIiwidGFza3MiLCJ0b21sIiwicmVhZE1pc2VUYXNrQ29tbWFuZCIsIm9yZyIsInJlZGlyZWN0ZWRGdWxsTmFtZSIsImxvY2F0aW9uIiwiZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZSIsInJlZnJlc2hCdW5Mb2NrIiwicm9vdERpclBhdGgiLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJkZWZhdWx0Iiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicGFja2FnZUpzb25EaXIiLCJVUkwiLCJwYXRobmFtZSIsImdldFZlcnNpb24iLCJzdHJpY3QiLCJoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiZCIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInNob3VsZFJ1bldvcmtmbG93cyIsInRoZW4iLCJleGl0Q29kZSJdLCJtYXBwaW5ncyI6IjhwQkFBT0EsZUFBZUMsRUFBTUMsR0FDMUIsT0FBTyxJQUFJQyxRQUFTQyxHQUFZQyxXQUFXRCxFQUFTRixHQUN0RCxDQ2lDT0YsZUFBZU0sRUFBb0JDLEdBQ3hDLElBQ0UsYUFBYUEsR0FDZixDQUFFLE1BQ0EsQ0FFSixDQUVPUCxlQUFlUSxFQUFxQkQsR0FDekMsSUFDRSxhQUFhQSxHQUNmLENBQUUsTUFBT0UsR0FDUCxHQUFxQixpQkFBVkEsR0FB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
|
|
31
|
+
`.trim()}function Nn(e){return e.doesContainPoetryLock||e.doesContainUvLock}function Jn(e){return e.doesContainUvLock?"uv run":"poetry run"}async function Un(t){return S.functionIgnoringException("generateLintstagedrc",async()=>{await Promise.all([O.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.cjs`,{force:!0})),O.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.js`,{force:!0})),O.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.json`,{force:!0}))])})}function Mn(e){return e?.trim()}async function Gn(n){return S.functionIgnoringException("generateOxfmtConfig",async()=>{const r=t.resolve(n.dirPath,".oxfmtrc.json"),i=t.resolve(n.dirPath,"oxfmt.config.ts"),s=await P.readFileIgnoringError(i),o=function(e){return`import config from '${e.packageName}';\n\nexport default config;\n`}({packageName:"@willbooster/oxfmt-config"}),a=[O.run(()=>e.promises.rm(r,{force:!0}))];Mn(s)!==Mn(o)&&a.push(O.run(()=>P.generateFile(i,o))),await Promise.all(a)})}async function zn(n,r){return S.functionIgnoringException("generateOxlintConfig",async()=>{const r=Xt(n),i=t.resolve(n.dirPath,"oxlint.config.ts"),s=await P.readFileIgnoringError(i),o=r&&s?s:function(e,t,n){const r=`${Vn("base","import config from '@willbooster/oxlint-config';")}\n\n${Vn("export","export default config;")}\n`;return t&&function(e){return e.includes(Kn("base"))||e.includes(Kn("export"))}(t)?function(e,t,n){let r=e;for(const i of["base","export"]){const s=qn(t,i);if(!s)continue;const o=Hn(r,i,s);if(!o)return console.warn(`Skipped updating incomplete ${i} block in oxlint config: ${n}`),e;r=o}return r}(t,r,n):r}(0,s,i),a=[];r||a.push(O.run(()=>e.promises.rm(t.resolve(n.dirPath,".oxlintrc.json"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.json"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.jsonc"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.cjs"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.js"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yaml"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yml"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.cjs"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.mjs"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.ts"),{force:!0}))),Mn(s)!==Mn(o)&&a.push(O.run(()=>P.generateFile(i,o))),await Promise.all(a)})}function qn(e,t){return Yn(t).exec(e)?.[0]}function Hn(e,t,n){const r=Yn(t);if(r.test(e))return e.replace(r,n)}function Yn(e){return new RegExp(`${Zn(Kn(e))}[\\s\\S]*?${Zn(Xn(e))}`)}function Vn(e,t){return`${Kn(e)}\n${t}\n${Xn(e)}`}function Kn(e){return`// wbfy:start oxlint-${e}`}function Xn(e){return`// wbfy:end oxlint-${e}`}function Zn(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}async function Qn(n){return S.functionIgnoringException("generatePrettierignore",async()=>{const r=t.resolve(n.dirPath,".prettierignore");if(!Rt(n))return void await O.run(()=>e.promises.rm(r,{force:!0}));const i=await P.readFileIgnoringError(r)??"",s=ht.getHeadUserContent(i),o=ht.getTailUserContent(i),a=t.resolve(n.dirPath,".gitignore"),c=await ht.readGitignoreWithoutSeparators(a)||"";let l="";n.doesContainPubspecYaml&&(l="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const p=s+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+l+c+o;await O.run(()=>P.generateFile(r,p))})}const er={venvPath:".",venv:".venv"};async function tr(n){return S.functionIgnoringException("generatePyrightConfigJson",async()=>{let r=structuredClone(er);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);r=l.all([r,n,r],{arrayMerge:Me})}catch{}const s=JSON.stringify(r,void 0,2);await O.run(()=>P.generateFile(i,s))})}async function nr(n){return S.functionIgnoringException("generateReadme",async()=>{const r=t.resolve(n.dirPath,"README.md");let i=await e.promises.readFile(r,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(i=rr(i,"[](https://github.com/semantic-release/semantic-release)"));const s=n.repository?.slice(n.repository.indexOf(":")+1),o=t.resolve(n.dirPath,".github","workflows"),a=e.existsSync(o)?e.readdirSync(o):[];for(const r of a){if(!r.startsWith("test")&&!r.startsWith("deploy"))continue;let o=r;if(o=(o[0]||"").toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," "),!s)continue;const a=`[](https://github.com/${s}/actions/workflows/${r})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${r}`))&&(i=ir(i,o,r),i=rr(i,a))}await O.run(()=>P.generateFile(r,i))})}function rr(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 r=e.slice(0,n+1);let i=e.slice(n+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${r}${t}\n${i}`}return`${e}\n${t}\n`}function ir(e,t,n){const r=sr(t),i=sr(n);return e.replaceAll(new RegExp(String.raw`\[!\[${r}\]\(https://github\.com/[^/\s)]+/[^/\s)]+/actions/workflows/${i}/badge\.svg\)\]\(https://github\.com/[^/\s)]+/[^/\s)]+/actions/workflows/${i}\)\n?`,"gu"),"").replaceAll(/\n\n\n+/g,"\n\n")}function sr(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}async function or(n){return S.functionIgnoringException("generateReleaserc",async()=>{const r=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(r))return;const i=JSON.parse(await e.promises.readFile(r,"utf8")),s=i.plugins??[];for(let e=0;e<s.length;e++){const t=s[e],n=Array.isArray(t),r=n?t[0]:t,i=n&&t[1]||{};"@semantic-release/commit-analyzer"===r?s[e]=["@semantic-release/commit-analyzer",l.all([i,{preset:"conventionalcommits"}],{arrayMerge:Me})]:"@semantic-release/github"===r&&(s[e]=["@semantic-release/github",l.all([i,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:Me})])}const o=JSON.stringify(i,void 0,2);await O.run(()=>P.generateFile(r,o))})}const ar={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function cr(n){return S.functionIgnoringException("generateRenovateJson",async()=>{let r=structuredClone(ar);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);r=l.all([r,n,r],{arrayMerge:Me}),r.extends=r.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(r.packageRules??=[],r.packageRules.some(e=>e.matchPackageNames?.includes("next"))||r.packageRules.push({matchPackageNames:["next"],enabled:!1})),await O.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await O.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const s=JSON.stringify(r,void 0,2);await O.run(()=>P.generateFile(i,s))})}async function lr(e){return S.functionIgnoringException("installAgentSkills",async()=>{await Promise.all([s.rm(t.resolve(e.dirPath,".agents"),{force:!0,recursive:!0}),s.rm(t.resolve(e.dirPath,".claude"),{force:!0,recursive:!0}),s.rm(t.resolve(e.dirPath,"skills-lock.json"),{force:!0})])})}const pr={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["packages/*/test/fixtures","test/fixtures"],include:["*.config.ts","packages/*/*.config.ts","packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},ur={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["test/fixtures"],include:["*.config.ts","scripts/**/*","src/**/*","test/**/*"]};async function dr(n){return S.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return void await async function(n){const r=t.resolve(n.dirPath,"tsconfig.json");try{const t=JSON.parse(await e.promises.readFile(r,"utf8"));!function(e){if(!e)return;"node"!==e.moduleResolution&&"Node"!==e.moduleResolution&&"node10"!==e.moduleResolution&&void 0!==e.moduleResolution||(e.moduleResolution="bundler")}(t.compilerOptions),function(e){if(!e)return;if(delete e.baseUrl,!e.paths)return;for(const[t,n]of Object.entries(e.paths))e.paths[t]=fr(n)}(t.compilerOptions),await O.run(()=>P.generateFile(r,JSON.stringify(t,void 0,2)))}catch{}}(n);let r=structuredClone(n.isRoot?pr:ur);const i=function(e){const t=new Set,n={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};e.isBun?t.add("bun"):e.depending.reactNative||t.add("node");(n.jest||n["@jest/globals"]||n["jest-environment-jsdom"]||n["ts-jest"])&&t.add("jest");n.vitest&&t.add("vitest/globals");n.mocha&&t.add("mocha");n.cypress&&t.add("cypress");return[...t]}(n);r.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),r.compilerOptions??={},r.compilerOptions.rootDir=function(n){return n.isRoot?".":e.existsSync(t.resolve(n.dirPath,"..","..","package.json"))?"../..":"."}(n),i.length>0&&(r.compilerOptions={...r.compilerOptions,types:i}),n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?n.isBun||n.depending.reactNative||(r.compilerOptions={...r.compilerOptions,jsx:"react-jsx"}):delete r.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(r.include=r.include?.filter(e=>!e.startsWith("packages/*/")),r.exclude=r.exclude?.filter(e=>!e.startsWith("packages/*/"))),n.depending.prisma&&function(e,t){e.include??=[],e.include.includes(t)||e.include.push(t)}(r,"prisma/**/*");const s=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(s,"utf8"),n=JSON.parse(t),a=(o=n.compilerOptions?.types,"string"==typeof o?[o]:Array.isArray(o)?o.filter(e=>"string"==typeof e):[]),c=function(e){const t={};for(const n of["declaration","declarationMap","sourceMap"]){const r=e?.[n];void 0!==r&&(t[n]=r)}return t}(n.compilerOptions);r.extends=function(e,t){const n=[...mr(e),...mr(t)],r=[...new Set(n)];return 0===r.length?void 0:1===r.length?r[0]:r}(r.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,r=l.all([r,n,r],{arrayMerge:Ge}),r.include=r.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/")),r.compilerOptions??={},r.compilerOptions={...r.compilerOptions,...c},function(e){if(!e)return;if(!1!==e.noEmit||!0===e.emitDeclarationOnly)return;e.rewriteRelativeImportExtensions=!0}(r.compilerOptions);const p=[...new Set([...gr(a,i),...i])];p.length>0?r.compilerOptions.types=p:delete r.compilerOptions.types,i.some(e=>"cypress"===e||e.includes("/"))&&delete r.compilerOptions.typeRoots}catch{}var o;He(r),r.include?.sort(),delete r.compilerOptions?.experimentalDecorators,delete r.compilerOptions?.baseUrl,function(e,t){if(!e)return;"node"!==e.moduleResolution&&"Node"!==e.moduleResolution&&"node10"!==e.moduleResolution||delete e.moduleResolution;if(t.isBun||t.depending.reactNative||"ESNext"!==e.module)return;delete e.module}(r.compilerOptions,n),n.depending.reactNative&&delete r.compilerOptions?.verbatimModuleSyntax;const a=JSON.stringify(r,void 0,2);await O.run(()=>P.generateFile(s,a))})}function fr(e){return e.map(e=>e.startsWith("./")||e.startsWith("../")||t.isAbsolute(e)?e:`./${e}`)}function mr(e){return e?Array.isArray(e)?e:[e]:[]}function gr(e,t){const n=new Set(t);return e.filter(e=>!(function(e){return"cypress"===e||"jest"===e||"mocha"===e||"vitest/globals"===e}(e)&&!n.has(e)))}const yr=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function hr(n){return S.functionIgnoringException("generateVscodeSettings",async()=>{try{const r=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(r,"utf8");let s=JSON.parse(i);for(const e of yr)s=l.all([s,wr(e)]);(n.doesContainPoetryLock||n.doesContainUvLock)&&(s=l.all([s,wr("**/.venv/**")])),n.depending.next&&(s=l.all([s,wr("**/.next/**")])),"editor.codeActionsOnSave"in s&&delete s["editor.codeActionsOnSave"],"editor.formatOnSave"in s&&delete s["editor.formatOnSave"],He(s);const o=JSON.stringify(s,void 0,2);await O.run(()=>P.generateFile(r,o))}catch{}})}function wr(e){return{"files.watcherExclude":{[e]:!0}}}async function br(n){return S.functionIgnoringException("generateYarnrcYml",async()=>{const r=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await O.run(()=>e.promises.rm(r,{force:!0})),await O.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await O.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const i=Jt("yarn",["--version"],n.dirPath),s=function(e,t){return Jt("npm",["show",e,"version"],t)||"0.0.0"}("@yarnpkg/cli",n.dirPath);(function(e,t){const n=y.valid(e);return!!n&&y.gt(n,y.valid(t)??"0.0.0")})(s,i)&&Lt("yarn",["set","version",s],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-${s}.`)&&await O.run(()=>e.promises.rm(t.join(o,n)));const a=t.resolve(n.dirPath,".yarnrc");await O.run(()=>e.promises.rm(a,{force:!0}));let c={};try{c=p.load(await e.promises.readFile(r,"utf8"))??c}catch{}c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.approvedGitRepositories=["https://github.com/WillBoosterLab/*.git","ssh://git@github.com/WillBoosterLab/*.git"],c.npmPreapprovedPackages=["@exercode/*","@willbooster/*","agent-runtime-kit","at-decorators","build-ts","gen-i18n-ts","one-way-git-sync","next","@next/*","@typescript/*","@oxfmt/*","@oxlint/*","@oxlint-tsgolint/*","oxfmt","oxlint","oxlint-tsgolint","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 r=t.resolve(n.dirPath,".yarn","plugins","undefined.cjs");await O.run(()=>e.promises.rm(r,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(r,p.dump(c,{lineWidth:-1})),Lt("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath),Lt("yarn",function(e,n){return["dlx","prettier","--no-config","--write",t.relative(e,n)]}(n.dirPath,r),n.dirPath)})}async function vr(e){return S.functionIgnoringException("setupLabels",async()=>{const[t,n]=Mt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!qt(t))return;const r=zt(t);try{await kr(r,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await kr(r,t,n,"d2: easy :rabbit2:","DDD6FE"),await kr(r,t,n,"d3: medium :ox:","C4B5FD"),await kr(r,t,n,"d4: hard :squid:","A78BFA"),await kr(r,t,n,"d5: x-hard :whale2:","8B5CF6"),await kr(r,t,n,"p1: critical :fire::fire::fire:","EF4444"),await kr(r,t,n,"p2: urgent :fire::fire:","F87171"),await kr(r,t,n,"p3: important :fire:","FCA5A5"),await kr(r,t,n,"p4: nice to have :droplet:","FECACA"),await kr(r,t,n,"r: blitz","5300bc"),await kr(r,t,n,"r: firebase","ffca28"),await kr(r,t,n,"r: prisma","0c344b"),await kr(r,t,n,"r: react","61dafb"),await kr(r,t,n,"r: svelte","ff3e00"),await kr(r,t,n,"r: semantic-release","494949"),await kr(r,t,n,"ready :rocket:","22C55E"),await kr(r,t,n,"review requested :mag:","FBCA04"),await kr(r,t,n,"released :bookmark:","6366F1"),await kr(r,t,n,"s: 0.5h :clock1230:","F3F4F6"),await kr(r,t,n,"s: 1h :clock1:","E5E7EB"),await kr(r,t,n,"s: 2h :clock2:","D1D5DB"),await kr(r,t,n,"s: 3h :clock3:","9CA3AF"),await kr(r,t,n,"s: 5h :clock5:","6B7280"),await kr(r,t,n,"s: 8h :clock8:","4B5563"),await kr(r,t,n,"s: 13h :clock1:","374151"),await kr(r,t,n,"t: build :hammer:","BFDBFE"),await kr(r,t,n,"t: chore :broom:","BFDBFE"),await kr(r,t,n,"t: ci :construction_worker:","BFDBFE"),await kr(r,t,n,"t: docs :memo:","BFDBFE"),await kr(r,t,n,"t: feat :sparkles:","BFDBFE"),await kr(r,t,n,"t: fix :bug:","BFDBFE"),await kr(r,t,n,"t: perf :zap:","BFDBFE"),await kr(r,t,n,"t: refactor :recycle:","BFDBFE"),await kr(r,t,n,"t: style :lipstick:","BFDBFE"),await kr(r,t,n,"t: test :test_tube:","BFDBFE"),await kr(r,t,n,"project","24292F"),await kr(r,t,n,"focused :dart:","22C55E"),await xr(r,t,n,"bug"),await xr(r,t,n,"documentation"),await xr(r,t,n,"duplicate"),await xr(r,t,n,"enhancement"),await xr(r,t,n,"good first issue"),await xr(r,t,n,"help wanted"),await xr(r,t,n,"invalid"),await xr(r,t,n,"question"),await xr(r,t,n,"wontfix"),await xr(r,t,n,"ready"),await xr(r,t,n,"review requested"),await xr(r,t,n,"released"),await xr(r,t,n,"semantic-release"),await xr(r,t,n,"llm-pr :robot:"),await xr(r,t,n,"ai-pr :robot:"),await xr(r,t,n,"gen-pr-all :robot:"),await xr(r,t,n,"gen-pr-claude :robot:"),await xr(r,t,n,"gen-pr-codex :robot:"),await xr(r,t,n,"gen-pr-gemini :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function kr(e,t,n,r,i){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:r,color:i})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:r,color:i})}}async function xr(e,t,n,r){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:r})}catch{}}const jr=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"],$r=h(import.meta.url);async function _r(e){return S.functionIgnoringException("setupSecrets",async()=>{const[n,r]=Mt.getOrgAndName(e.repository??"");if(!n||!r||"WillBoosterLab"!==n)return;if(!qt(n)||!_.doesUploadEnvVars)return;const i=w.config({path:t.resolve(e.dirPath,".env"),quiet:!0}).parsed??{};if(0===Object.keys(i).length)return;const s=zt(n);try{for(const e of jr)try{await s.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:r,secret_name:e})}catch{}const e=await s.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:n,repo:r}),{key:t,key_id:o}=e.data,a=$r("libsodium-wrappers");await a.ready;for(const[e,c]of Object.entries(i)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const i=a.from_base64(t,a.base64_variants.ORIGINAL),l=a.from_string(c),p=a.crypto_box_seal(l,i),u=a.to_base64(p,a.base64_variants.ORIGINAL);await s.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:r,secret_name:e,encrypted_value:u,key_id:o})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Sr(e){const[t,n]=Mt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!qt(t))return;const r=zt(t);await async function(e,{beforeRetry:t,handleError:n,retryCount:r=3,retryLogger:i,shouldRetry:s,sleepMilliseconds:o=0,updateSleepMilliseconds:a}={}){let c=0;for(;;)try{return await e(c)}catch(e){if(await(n?.(e)),c++,c>=r)throw e;if(s&&!s(e))throw e;o>0&&await x(o),a&&(o=a(o)),i?.(`Retry due to: ${e}\n${e instanceof Error?"---\n"+(e.stack??""):""}`),await(t?.(e))}}(()=>r.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 Pr="__PM_RUN__",Or={"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., \`${Pr} test\`) passed.\n - The lint command (e.g., \`${Pr} 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 Er(n){return S.functionIgnoringException("generateGitHubTemplates",async()=>{if(n.isWillBoosterRepo)for(const[r,i]of Object.entries(Or)){const s=Cr(i,n),o=t.resolve(n.dirPath,".github",r);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(b(t,s)>s.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await O.run(()=>P.generateFile(o,s))}})}function Cr(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Pr,n)}const Ar=k.object({typos:k.object({all:k.record(k.string(),k.string()).optional(),doc:k.record(k.string(),k.string()).optional(),ts:k.record(k.string(),k.string()).optional(),text:k.record(k.string(),k.string()).optional()}).optional()});async function Fr(n,r){const i=t.resolve(n,"package.json");try{const o=e.existsSync(i);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let u=[],d=[];try{const e=t.resolve(n,".releaserc.json"),r=JSON.parse(await s.readFile(e,"utf8"));u=r?.branches??[],d=r?.plugins?.flat()??[]}catch{}const f="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let m;f&&(m=await async function(e,t){const n=v(e),r=(await n.getRemotes(!0)).find(e=>"origin"===e.name),i=r?.refs.fetch??r?.refs.push;if("string"==typeof i){const e=await Dr(i);if(e)return e}const s="string"==typeof t.repository?t.repository:t.repository?.url;if(s){const e=await Dr(s);if(e&&"Not Found"!==e.message)return e}}(n,l));let g=function(n){const r=t.resolve(n);return e.existsSync(t.join(r,"mise.toml"))||e.existsSync(t.join(r,".mise.toml"))||e.existsSync(t.join(r,".tool-versions"))}(n);for(const r of["java","node","python"])if(e.existsSync(t.resolve(n,`.${r}-version`))){g=!0;break}let y="";try{y=await s.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const h=t.resolve(n,"wbfy.json");let w;try{const e=await s.readFile(h,"utf8");w=Ar.parse(JSON.parse(e))}catch{}const b="string"==typeof m?.full_name?m.full_name:void 0;let k,x;if(b){const e=b.split("/");e.length>=2&&(k=e[0],x=e[1])}const j=b?`github:${b}`:void 0,$={dirPath:n,dockerfile:y,isRoot:f,isPublicRepo:!1===m?.private,isReferredByOtherRepo:!!l.files,repository:j,repoAuthor:k,repoName:x,isWillBoosterRepo:Boolean(j?.startsWith("github:WillBooster/")||j?.startsWith("github:WillBoosterLab/")),isBun:r?.isBun||e.existsSync(t.join(n,"bun.lock")),isEsmPackage:p,isWillBoosterConfigs:i.includes("/willbooster-configs"),doesContainSubPackageJsons:Rr("packages/**/package.json",n),doesContainDockerfile:!!y||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")),doesContainUvLock:e.existsSync(t.resolve(n,"uv.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:Rr("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Rr("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Rr("{app,src,test}/**/*.{t,j}sx",n),doesContainJava:Rr("**/*.java",n),doesContainJavaScriptInPackages:Rr("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Rr("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Rr("packages/**/{app,src,test}/**/*.{t,j}sx",n),doesContainJavaInPackages:Rr("packages/**/*.java",n),depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!a["gen-i18n-ts"]||!!c["gen-i18n-ts"],litestream:y.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"]||u.length>0||d.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:u,github:d.includes("@semantic-release/github"),npm:d.includes("@semantic-release/npm")},hasVersionSettings:g,miseTasks:await Br(n),packageJson:l,wbfyJson:w};if($.doesContainGemfile||$.doesContainGoMod||$.doesContainPackageJson||$.doesContainPoetryLock||$.doesContainUvLock||$.doesContainPomXml||$.doesContainPubspecYaml||$.doesContainTemplateYaml)return $}catch{}}async function Br(e){const n={};for(const r of["mise.toml",".mise.toml"]){const i=t.resolve(e,r);try{const e=u.parse(await s.readFile(i,"utf8"));for(const[t,r]of Object.entries(e.tasks??{}))n[t]=Ir(r)}catch{}}return n}function Ir(e){return"string"==typeof e?e:Array.isArray(e)?e.filter(e=>"string"==typeof e).join("\n"):e&&"object"==typeof e?Ir(e.run):""}function Rr(e,t){return o.globSync(e,{dot:!0,cwd:t,ignore:U}).length>0}async function Dr(e){const[t,n]=Mt.getOrgAndName(e);if(t&&n)try{return(await zt().request("GET /repos/{owner}/{repo}",{owner:t,repo:n})).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 r=t?.headers?.location;if("string"!=typeof r)return;const[i,s]=Mt.getOrgAndName(r);if(!i||!s)return;return`${i}/${s}`}(e);if(t)return{full_name:t}}}function Tr(e){const t=Nt("bun",["install"],e);if(0!==t)throw new Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await async function(){const r=await n(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;_.isVerbose=r.verbose,_.doesUploadEnvVars=r.env;let i=!1;for(const n of r.paths){const s=t.join(n,"packages"),o=(await j(()=>e.promises.readdir(s,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(s,e.name));await Ne([n,...o]);const a=await Fr(n);if(_.isVerbose,!a){console.error(`there is no valid package.json in ${n}`),i=!0;continue}const c=rt(a),l=(await Promise.all(o.map(e=>Fr(e,a)))).filter(e=>!!e),p=[a,...l];if(_.isVerbose)for(const e of p)console.info(e);await br(a),a.isBun&&await pt(a);const u=!Ze(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([M(a),c.then(()=>nr(a)),ot(a,p),bt(a),xt(a),_t(a,p),St(a),Ot(a),Er(a),Dt(a),cr(a),or(a),...u?[Xe(a)]:[],vr(a),_r(a),Sr(a),Dn(a),Un(a)]),await O.promiseAll();const d=[];for(const e of p)(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Ue(e,e.isRoot?p:[e])),e.depending.playwrightTest&&d.push(I(e)),e.depending.next&&d.push(E(e)),await Ct(e,a),await O.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await Qn(e),await pn(e,a,r.skipDeps),d.push(Un(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&d.push(hr(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(dr(e)),It(e)&&(d.push(Gn(e)),d.push(zn(e))),e.depending.pyright&&d.push(tr(e)));await Promise.all(d),await O.promiseAll();const f=a.isBun?"bun":"yarn";a.isBun?await S.functionIgnoringException("refreshBunLock",async()=>{await Promise.resolve(),Tr(n)}):Lt(f,["install","--no-immutable"],n),Lt(f,["cleanup"],n),await lr(a)}i&&(process.exitCode=1)}();
|
|
32
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2dsb2JVdGlsLnRzIiwiLi4vc3JjL2ZpeGVycy9wcmlzbWEudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kZXRlY3QtaW5kZW50L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1uZXdsaW5lL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lzLXBsYWluLW9iai9pbmRleC5qcyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9nZW5JMThuVHMudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90b29sQ29uZmlnQ29udGVudC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294Zm10Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2tpbGxzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlID0gZmFsc2U7XG4gIGRvZXNVcGxvYWRFbnZWYXJzID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnRyaW0oKTtcbiAgICBpZiAobm9ybWFsaXplZENvbnRlbnQpIHtcbiAgICAgIG5vcm1hbGl6ZWRDb250ZW50ICs9ICdcXG4nO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGVkL1VwZGF0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeE5leHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeE5leHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gWydqcycsICdtanMnLCAnY2pzJ11cbiAgICAgIC5tYXAoKGV4dCkgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgbmV4dC5jb25maWcuJHtleHR9YCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChvbGRDb250ZW50KTtcbiAgICBpZiAoIW9iamVjdExpdGVyYWwpIHJldHVybjtcblxuICAgIGNvbnN0IGV4aXN0aW5nUHJvcGVydGllcyA9IG5ldyBTZXQob2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWU/LmdldFRleHQoKSkpO1xuICAgIGNvbnN0IHByb3BlcnR5VGV4dHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKCFleGlzdGluZ1Byb3BlcnRpZXMuaGFzKCd0eXBlc2NyaXB0JykpIHtcbiAgICAgIHByb3BlcnR5VGV4dHMucHVzaCgndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9Jyk7XG4gICAgfVxuICAgIGlmIChwcm9wZXJ0eVRleHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaW5zZXJ0aW9uUG9pbnQgPSBvYmplY3RMaXRlcmFsLmdldEVuZCgpIC0gMTtcbiAgICBjb25zdCBsYXN0UHJvcGVydHkgPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMuYXQoLTEpO1xuICAgIGNvbnN0IGhhc1RyYWlsaW5nQ29tbWEgPSBsYXN0UHJvcGVydHlcbiAgICAgID8gb2xkQ29udGVudC5zbGljZShsYXN0UHJvcGVydHkuZ2V0RW5kKCksIGluc2VydGlvblBvaW50KS5pbmNsdWRlcygnLCcpXG4gICAgICA6IGZhbHNlO1xuICAgIGNvbnN0IHByZWZpeCA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5sZW5ndGggPiAwICYmICFoYXNUcmFpbGluZ0NvbW1hID8gJywgJyA6ICcnO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIGluc2VydGlvblBvaW50KX0ke3ByZWZpeH0ke3Byb3BlcnR5VGV4dHMuam9pbignLCAnKX0ke29sZENvbnRlbnQuc2xpY2UoXG4gICAgICBpbnNlcnRpb25Qb2ludFxuICAgICl9YDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwoY29udGVudDogc3RyaW5nKTogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBzb3VyY2UgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKCduZXh0LmNvbmZpZy5qcycsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUsIHRzLlNjcmlwdEtpbmQuSlMpO1xuICBsZXQgb2JqZWN0TGl0ZXJhbDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IHRzLk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAob2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuICAgIGlmICh0cy5pc0V4cG9ydEFzc2lnbm1lbnQobm9kZSkgJiYgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pKSB7XG4gICAgICBvYmplY3RMaXRlcmFsID0gbm9kZS5leHByZXNzaW9uO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0cy5pc0JpbmFyeUV4cHJlc3Npb24obm9kZSkgJiZcbiAgICAgIG5vZGUub3BlcmF0b3JUb2tlbi5raW5kID09PSB0cy5TeW50YXhLaW5kLkVxdWFsc1Rva2VuICYmXG4gICAgICBub2RlLmxlZnQuZ2V0VGV4dChzb3VyY2UpID09PSAnbW9kdWxlLmV4cG9ydHMnICYmXG4gICAgICB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKG5vZGUucmlnaHQpXG4gICAgKSB7XG4gICAgICBvYmplY3RMaXRlcmFsID0gbm9kZS5yaWdodDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcbiAgfTtcbiAgdmlzaXQoc291cmNlKTtcbiAgcmV0dXJuIG9iamVjdExpdGVyYWw7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxudHlwZSBQYXJzZWRWYWx1ZSA9XG4gIHwgeyBraW5kOiAnYXJyYXknOyB2YWx1ZTogUGFyc2VkVmFsdWVbXSB9XG4gIHwgeyBraW5kOiAnbGl0ZXJhbCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ29iamVjdCc7IHZhbHVlOiBQYXJzZWRPYmplY3QgfTtcbnR5cGUgT2JqZWN0TWVtYmVyID0geyBraW5kOiAnZXh0cmEnOyBpbmRleDogbnVtYmVyIH0gfCB7IGtpbmQ6ICdwcm9wZXJ0eSc7IGtleTogc3RyaW5nIH07XG5pbnRlcmZhY2UgUGFyc2VkT2JqZWN0IHtcbiAgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXTtcbiAgbWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT47XG59XG5pbnRlcmZhY2UgRXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB7XG4gIHNvdXJjZTogdHMuU291cmNlRmlsZTtcbiAgbm9kZTogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb247XG59XG5cbmNvbnN0IGxpdGVyYWwgPSAodmFsdWU6IHN0cmluZyk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdsaXRlcmFsJywgdmFsdWUgfSk7XG5jb25zdCBhc0FycmF5ID0gKHZhbHVlOiBQYXJzZWRWYWx1ZVtdKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2FycmF5JywgdmFsdWUgfSk7XG5jb25zdCBhc09iamVjdCA9IChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZFZhbHVlID0+ICh7XG4gIGtpbmQ6ICdvYmplY3QnLFxuICB2YWx1ZTogdG9QYXJzZWRPYmplY3QocHJvcGVydGllcywgZXh0cmFNZW1iZXJzKSxcbn0pO1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnID0gdG9QYXJzZWRPYmplY3Qoe1xuICBmb3JiaWRPbmx5OiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICB1c2U6IGFzT2JqZWN0KHtcbiAgICBiYXNlVVJMOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgIHRyYWNlOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgICBzY3JlZW5zaG90OiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb25seS1vbi1mYWlsdXJlJyA6ICdvbidcIiksXG4gICAgdmlkZW86IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICB9KSxcbiAgd2ViU2VydmVyOiBhc09iamVjdCh7XG4gICAgY29tbWFuZDogbGl0ZXJhbChcIid3YiBzdGFydCAtLW1vZGUgdGVzdCdcIiksXG4gICAgdXJsOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICB0aW1lb3V0OiBsaXRlcmFsKCczMDBfMDAwJyksXG4gICAgc3Rkb3V0OiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgIHN0ZGVycjogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICBlbnY6IGxpdGVyYWwoYHtcbiAgLi4ucHJvY2Vzcy5lbnYsXG4gIFBSSVNNQV9VU0VSX0NPTlNFTlRfRk9SX0RBTkdFUk9VU19BSV9BQ1RJT046ICd0cnVlJyxcbn1gKSxcbiAgICBncmFjZWZ1bFNodXRkb3duOiBsaXRlcmFsKGB7XG4gIHNpZ25hbDogJ1NJR1RFUk0nLFxuICB0aW1lb3V0OiA1MDAsXG59YCksXG4gIH0pLFxufSk7XG5cbmZ1bmN0aW9uIHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICBleHRyYU1lbWJlcnMsXG4gICAgbWVtYmVyT3JkZXI6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHByb3BlcnRpZXMpLm1hcCgoa2V5KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KSksXG4gICAgICAuLi5leHRyYU1lbWJlcnMubWFwKChfLCBpbmRleCk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KSksXG4gICAgXSxcbiAgICBwcm9wZXJ0aWVzLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBwbGF5d3JpZ2h0LmNvbmZpZy50c2ApO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGFzc2VydE5leHRQdWJsaWNCYXNlVXJsKGNvbmZpZy5kaXJQYXRoKTtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsID0gZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwob2xkQ29udGVudCk7XG4gICAgaWYgKCFleHRyYWN0ZWRPYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZSwgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICAvLyBLZWVwIGZpbGxpbmcgbWlzc2luZyBkZWZhdWx0cywgYnV0IGRvbid0IG92ZXJ3cml0ZSBsb2NhbCBhZGp1c3RtZW50cyBvbiBldmVyeSByZWdlbmVyYXRpb24uXG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VQYXJzZWRPYmplY3RzKGRlZmF1bHRDb25maWcsIHBhcnNlZCk7XG4gICAgc2V0V2ViU2VydmVyQ29tbWFuZChtZXJnZWQpO1xuXG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeVZhbHVlKHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZWQgfSwgMCk7XG4gICAgY29uc3Qgc3RhcnQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0U3RhcnQoZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGNvbnN0IGVuZCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRFbmQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBzdGFydCl9JHtuZXdPYmplY3RMaXRlcmFsfSR7b2xkQ29udGVudC5zbGljZShlbmQpfWA7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2U6IFBhcnNlZE9iamVjdCwgb3ZlcnJpZGU6IFBhcnNlZE9iamVjdCk6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IG92ZXJyaWRlUHJvcGVydHlLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhvdmVycmlkZS5wcm9wZXJ0aWVzKSk7XG4gIGNvbnN0IGV4dHJhTWVtYmVycyA9IFsuLi5iYXNlLmV4dHJhTWVtYmVycywgLi4ub3ZlcnJpZGUuZXh0cmFNZW1iZXJzXTtcbiAgLy8gS2VlcCBkZWZhdWx0LW9ubHkgbWVtYmVycyBiZWZvcmUgcGFyc2VkIG1lbWJlcnMgc28gc3ByZWFkcyBhbmQgZXhwbGljaXQgbG9jYWwgcHJvcGVydGllcyByZXRhaW4gcHJlY2VkZW5jZS5cbiAgY29uc3QgbWVtYmVyT3JkZXIgPSBbXG4gICAgLi4uYmFzZS5tZW1iZXJPcmRlci5maWx0ZXIoKG1lbWJlcikgPT4gbWVtYmVyLmtpbmQgIT09ICdwcm9wZXJ0eScgfHwgIW92ZXJyaWRlUHJvcGVydHlLZXlzLmhhcyhtZW1iZXIua2V5KSksXG4gICAgLi4ub3ZlcnJpZGUubWVtYmVyT3JkZXIubWFwKChtZW1iZXIpOiBPYmplY3RNZW1iZXIgPT4ge1xuICAgICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSByZXR1cm4gbWVtYmVyO1xuICAgICAgcmV0dXJuIHsga2luZDogJ2V4dHJhJywgaW5kZXg6IGJhc2UuZXh0cmFNZW1iZXJzLmxlbmd0aCArIG1lbWJlci5pbmRleCB9O1xuICAgIH0pLFxuICBdO1xuICBjb25zdCBwcm9wZXJ0aWVzID0geyAuLi5iYXNlLnByb3BlcnRpZXMgfTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3ZlcnJpZGUucHJvcGVydGllcykpIHtcbiAgICBwcm9wZXJ0aWVzW2tleV0gPSBtZXJnZVBhcnNlZFZhbHVlKHByb3BlcnRpZXNba2V5XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiB7IGV4dHJhTWVtYmVycywgbWVtYmVyT3JkZXIsIHByb3BlcnRpZXMgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRWYWx1ZShiYXNlOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCwgb3ZlcnJpZGU6IFBhcnNlZFZhbHVlKTogUGFyc2VkVmFsdWUge1xuICBpZiAoYmFzZT8ua2luZCA9PT0gJ29iamVjdCcgJiYgb3ZlcnJpZGUua2luZCA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlLnZhbHVlLCBvdmVycmlkZS52YWx1ZSkgfTtcbiAgfVxuICByZXR1cm4gb3ZlcnJpZGU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFzc2VydE5leHRQdWJsaWNCYXNlVXJsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IGVudkZpbGVQYXRoIG9mIGdldEVudkZpbGVQYXRocyhkaXJQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoL05FWFRfUFVCTElDX0JBU0VfVVJMXFxzKj0vbS50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3NpbmcgZW52IGZpbGVzIGFyZSBleHBlY3RlZCBpbiBzb21lIHJlcG9zLlxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignTkVYVF9QVUJMSUNfQkFTRV9VUkwgaXMgcmVxdWlyZWQgZm9yIFBsYXl3cmlnaHQuIERlZmluZSBORVhUX1BVQkxJQ19CQVNFX1VSTCBpbiB0aGUgdGFyZ2V0IHJlcG8uJyk7XG59XG5cbmZ1bmN0aW9uIGdldEVudkZpbGVQYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVudkZpbGVOYW1lcyA9IFsnLmVudicsICcuZW52LnRlc3QnLCAnLmVudi5leGFtcGxlJywgJ21pc2UudG9tbCcsICdtaXNlLnRlc3QudG9tbCddO1xuICBjb25zdCBlbnZGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChsZXQgY3VycmVudERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7IDsgY3VycmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpKSB7XG4gICAgZW52RmlsZVBhdGhzLnB1c2goLi4uZW52RmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgZmlsZU5hbWUpKSk7XG5cbiAgICAvLyBQbGF5d3JpZ2h0IGNvbmZpZ3Mgb2Z0ZW4gbGl2ZSBpbiBwYWNrYWdlcy8qIHdoaWxlIHNoYXJlZCBlbnYgZmlsZXMgbGl2ZSBhdCB0aGVcbiAgICAvLyByZXBvc2l0b3J5IHJvb3QsIHNvIHdhbGsgdXB3YXJkIHVudGlsIHRoZSB0YXJnZXQgcmVwbyBib3VuZGFyeS5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsICcuZ2l0JykpKSBicmVhaztcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gZW52RmlsZVBhdGhzO1xufVxuXG5mdW5jdGlvbiBzZXRXZWJTZXJ2ZXJDb21tYW5kKG9iamVjdDogUGFyc2VkT2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IHdlYlNlcnZlciA9IG9iamVjdC5wcm9wZXJ0aWVzLndlYlNlcnZlcjtcbiAgaWYgKHdlYlNlcnZlcj8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICAvLyB3YiBvd25zIHRoZSBjYW5vbmljYWwgdGVzdC1zZXJ2ZXIgc3RhcnR1cCBwYXRoOyBrZWVwIGN1c3RvbSBQbGF5d3JpZ2h0XG4gIC8vIHNlcnZlciBzZXR0aW5ncyB3aGlsZSBub3JtYWxpemluZyB0aGUgY29tbWFuZCBpdHNlbGYuXG4gIHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQgPSBsaXRlcmFsKFwiJ3diIHN0YXJ0IC0tbW9kZSB0ZXN0J1wiKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwoY29udGVudDogc3RyaW5nKTogRXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJywgY29udGVudCwgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCwgdHJ1ZSwgdHMuU2NyaXB0S2luZC5UUyk7XG5cbiAgLy8gVHlwZVNjcmlwdCBhbHJlYWR5IHVuZGVyc3RhbmRzIG5lc3RlZCBvYmplY3QgbGl0ZXJhbHMgYW5kIHRlbXBsYXRlIHN0cmluZ3MsIHNvIHVzZVxuICAvLyBpdHMgQVNUIHJhbmdlcyBpbnN0ZWFkIG9mIGEgcmVnZXggdGhhdCBjYW4gc3RvcCBhdCB0aGUgZmlyc3QgaW5uZXIgY2xvc2luZyBicmFjZS5cbiAgbGV0IGZvdW5kOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmlzaXQgPSAobm9kZTogdHMuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuICAgIGlmICh0cy5pc0NhbGxFeHByZXNzaW9uKG5vZGUpICYmIG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkgPT09ICdkZWZpbmVDb25maWcnKSB7XG4gICAgICBjb25zdCBmaXJzdEFyZ3VtZW50ID0gbm9kZS5hcmd1bWVudHNbMF07XG4gICAgICBpZiAoZmlyc3RBcmd1bWVudCAmJiB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGZpcnN0QXJndW1lbnQpKSB7XG4gICAgICAgIGZvdW5kID0gZmlyc3RBcmd1bWVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpO1xuICB9O1xuICB2aXNpdChzb3VyY2UpO1xuXG4gIHJldHVybiBmb3VuZCA/IHsgc291cmNlLCBub2RlOiBmb3VuZCB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbiwgc291cmNlOiB0cy5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc291cmNlKTtcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0ID8geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHBhcnNlZE9iamVjdCB9IDogbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gIH1cbiAgaWYgKHRzLmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHBhcnNlRXhwcmVzc2lvbihlbGVtZW50LCBzb3VyY2UpKTtcbiAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCk6IGVsZW1lbnQgaXMgdW5kZWZpbmVkID0+IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzQXJyYXkoZWxlbWVudHMgYXMgUGFyc2VkVmFsdWVbXSk7XG4gIH1cbiAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKFxuICBvYmplY3RMaXRlcmFsOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgc291cmNlOiB0cy5Tb3VyY2VGaWxlXG4pOiBQYXJzZWRPYmplY3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQ6IFBhcnNlZE9iamVjdCA9IHsgZXh0cmFNZW1iZXJzOiBbXSwgbWVtYmVyT3JkZXI6IFtdLCBwcm9wZXJ0aWVzOiB7fSB9O1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIG9iamVjdExpdGVyYWwucHJvcGVydGllcykge1xuICAgIGlmICh0cy5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IGxpdGVyYWwoa2V5KTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpIHx8ICghdHMuaXNJZGVudGlmaWVyKHByb3BlcnR5Lm5hbWUpICYmICF0cy5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkpKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlZC5leHRyYU1lbWJlcnMucHVzaChwcm9wZXJ0eS5nZXRUZXh0KHNvdXJjZSkpIC0gMTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUV4cHJlc3Npb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHNvdXJjZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICBpZiAodmFsdWUudmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gJ1tdJztcbiAgICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICAgIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGBbXFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9XWA7XG4gIH1cbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlO1xuXG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGVtaXR0ZWRQcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyKTtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlci5mbGF0TWFwKChtZW1iZXIsIGluZGV4KSA9PiB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAnZXh0cmEnKSB7XG4gICAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdE1lbWJlcih2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnNbbWVtYmVyLmluZGV4XSA/PyAnJywgaW5kZW50KV07XG4gICAgfVxuXG4gICAgaWYgKGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuZ2V0KG1lbWJlci5rZXkpICE9PSBpbmRleCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzW21lbWJlci5rZXldO1xuICAgIGlmICghaXRlbSB8fCBlbWl0dGVkUHJvcGVydGllcy5oYXMobWVtYmVyLmtleSkpIHJldHVybiBbXTtcbiAgICBlbWl0dGVkUHJvcGVydGllcy5hZGQobWVtYmVyLmtleSk7XG4gICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShtZW1iZXIua2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KV07XG4gIH0pO1xuICBsaW5lcy5wdXNoKFxuICAgIC4uLk9iamVjdC5lbnRyaWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhrZXkpKVxuICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCkpXG4gICk7XG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBge1xcbiR7Y2xvc2luZ0luZGVudH19YDtcbiAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG59XG5cbmZ1bmN0aW9uIGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkobWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbWVtYmVyXSBvZiBtZW1iZXJPcmRlci5lbnRyaWVzKCkpIHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHtcbiAgICAgIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuc2V0KG1lbWJlci5rZXksIGluZGV4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleTogc3RyaW5nLCBpdGVtOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlciwgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgfVxuICB9XG4gIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7a2V5fTogJHtzdHJpbmdpZmllZFswXX1gO1xuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdE1lbWJlcihtZW1iZXI6IHN0cmluZywgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IG1lbWJlci5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbGluZV0gb2Ygc3RyaW5naWZpZWQuZW50cmllcygpKSB7XG4gICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7bGluZX1gO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cbiIsImV4cG9ydCBjb25zdCBnbG9iSWdub3JlID0gW1xuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqLy52ZW52LyoqJyxcbiAgJyoqL3Rlc3QtZml4dHVyZXMvKionLFxuICAnKiovdGVzdC9maXh0dXJlcy8qKicsXG4gICcqKi9kaXN0LyoqJyxcbiAgJyoqL2J1aWxkLyoqJyxcbiAgJyoqL3RhcmdldC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL3RtcC8qKicsXG5dO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQcmlzbWFFbnZGaWxlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQcmlzbWFFbnZGaWxlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzaG91bGRBZGRDb25uZWN0aW9uTGltaXQgPSBzaG91bGRBZGRTcWxpdGVDb25uZWN0aW9uTGltaXQoY29uZmlnKTtcbiAgICBjb25zdCBlbnZGaWxlcyA9IGF3YWl0IGZnLmdsb2IoWycqLmVudicsICcqLmVudi4qJ10sIHsgZG90OiB0cnVlLCBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgZm9yIChjb25zdCBlbnZGaWxlIG9mIGVudkZpbGVzKSB7XG4gICAgICBjb25zdCBlbnZGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZW52RmlsZSk7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKFxuICAgICAgICAvREFUQUJBU0VfVVJMXFxzKj1cXHMqXCI/KFteXCIjXFxuXSs/XFwuc3FsaXRlM1teXCIjXFxuXSopXCI/L2csXG4gICAgICAgIChtYXRjaCwgdXJsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXR1cm4gYERBVEFCQVNFX1VSTD1cIiR7bm9ybWFsaXplU3FsaXRlRGF0YWJhc2VVcmwodXJsLCBzaG91bGRBZGRDb25uZWN0aW9uTGltaXQpfVwiYDtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShlbnZGaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQWRkU3FsaXRlQ29ubmVjdGlvbkxpbWl0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIC8vIGBjb25uZWN0aW9uX2xpbWl0PTFgIG9ubHkgYXBwbGllcyB0byBQcmlzbWEncyBTUUxpdGUgZGF0YXNvdXJjZSBoYW5kbGluZy5cbiAgLy8gUmVwb3MgdGhhdCBvcHQgaW50byBub24tcHVyZSBTUUxpdGUgYWRhcHRlcnMgc2hvdWxkIGtlZXAgdGhlaXIgVVJMIGFzLWlzLlxuICByZXR1cm4gIWRlcGVuZGVuY2llc1snQHByaXNtYS9hZGFwdGVyLWJldHRlci1zcWxpdGUzJ10gJiYgIWRlcGVuZGVuY2llc1snQHByaXNtYS9hZGFwdGVyLWxpYnNxbCddO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTcWxpdGVEYXRhYmFzZVVybCh1cmw6IHN0cmluZywgc2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcXVlcnlTdGFydCA9IHVybC5pbmRleE9mKCc/Jyk7XG4gIGNvbnN0IHBhdGhQYXJ0ID0gcXVlcnlTdGFydCAhPT0gLTEgPyB1cmwuc2xpY2UoMCwgcXVlcnlTdGFydCkgOiB1cmw7XG4gIGNvbnN0IHF1ZXJ5UGFydCA9IHF1ZXJ5U3RhcnQgIT09IC0xID8gdXJsLnNsaWNlKHF1ZXJ5U3RhcnQgKyAxKSA6ICcnO1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5UGFydCk7XG5cbiAgcGFyYW1zLmRlbGV0ZSgnY29ubmVjdGlvbl9saW1pdCcpO1xuICBpZiAoc2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0KSB7XG4gICAgcGFyYW1zLnNldCgnY29ubmVjdGlvbl9saW1pdCcsICcxJyk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRRdWVyeSA/IGAke3BhdGhQYXJ0fT8ke25vcm1hbGl6ZWRRdWVyeX1gIDogcGF0aFBhcnQ7XG59XG4iLCJjb25zdCBoYXMgPSAob2JqZWN0LCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydE9iamVjdEJ5S2V5TmFtZUxpc3Qob2JqZWN0LCBzb3J0V2l0aCkge1xuICBsZXQga2V5cywgc29ydEZuLCBrZXlcblxuICBpZiAodHlwZW9mIHNvcnRXaXRoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc29ydEZuID0gc29ydFdpdGhcbiAgfSBlbHNlIHtcbiAgICBrZXlzID0gc29ydFdpdGhcbiAgfVxuXG4gIGNvbnN0IHRvdGFsID0ge31cbiAgY29uc3Qgb2JqZWN0S2V5cyA9IFsuLi4oa2V5cyA/PyBbXSksIC4uLk9iamVjdC5rZXlzKG9iamVjdCkuc29ydChzb3J0Rm4pXVxuXG4gIGZvciAoa2V5IG9mIG9iamVjdEtleXMpIHtcbiAgICBpZiAoaGFzKG9iamVjdCwga2V5KSkge1xuICAgICAgdG90YWxba2V5XSA9IG9iamVjdFtrZXldXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdGFsXG59XG4iLCIvLyBEZXRlY3QgZWl0aGVyIHNwYWNlcyBvciB0YWJzIGJ1dCBub3QgYm90aCB0byBwcm9wZXJseSBoYW5kbGUgdGFicyBmb3IgaW5kZW50YXRpb24gYW5kIHNwYWNlcyBmb3IgYWxpZ25tZW50XG5jb25zdCBJTkRFTlRfUkVHRVggPSAvXig/OiggKSt8XFx0KykvO1xuXG5jb25zdCBJTkRFTlRfVFlQRV9TUEFDRSA9ICdzcGFjZSc7XG5jb25zdCBJTkRFTlRfVFlQRV9UQUIgPSAndGFiJztcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHdlIHNob3VsZCBpZ25vcmUgc2luZ2xlIHNwYWNlIHBhdHRlcm5zXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIHZhbHVlKSB7XG5cdHJldHVybiBpZ25vcmVTaW5nbGVTcGFjZXMgJiYgaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgJiYgdmFsdWUgPT09IDE7XG59XG5cbi8qKlxuTWFrZSBhIE1hcCB0aGF0IGNvdW50cyBob3cgbWFueSBpbmRlbnRzL3VuaW5kZW50cyBoYXZlIG9jY3VycmVkIGZvciBhIGdpdmVuIHNpemUgYW5kIGhvdyBtYW55IGxpbmVzIGZvbGxvdyBhIGdpdmVuIGluZGVudGF0aW9uLlxuXG5UaGUga2V5IGlzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgaW5kZW50YXRpb24gdHlwZSAocyA9IHNwYWNlIGFuZCB0ID0gdGFiKSBhbmQgdGhlIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzLlxuXG5gYGBcbmluZGVudHMgPSB7XG5cdHQzOiBbMSwgMF0sXG5cdHQ0OiBbMSwgNV0sXG5cdHM1OiBbMSwgMF0sXG5cdHMxMjogWzEsIDBdLFxufVxuYGBgXG4qL1xuZnVuY3Rpb24gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBpZ25vcmVTaW5nbGVTcGFjZXMpIHtcblx0Y29uc3QgaW5kZW50cyA9IG5ldyBNYXAoKTtcblxuXHQvLyBSZW1lbWJlciB0aGUgc2l6ZSBvZiBwcmV2aW91cyBsaW5lJ3MgaW5kZW50YXRpb25cblx0bGV0IHByZXZpb3VzU2l6ZSA9IDA7XG5cdGxldCBwcmV2aW91c0luZGVudFR5cGU7XG5cblx0Ly8gSW5kZW50cyBrZXkgKGlkZW50IHR5cGUgKyBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cylcblx0bGV0IGtleTtcblxuXHRmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyaW5nLnNwbGl0KC9cXG4vZykpIHtcblx0XHRpZiAoIWxpbmUpIHtcblx0XHRcdC8vIElnbm9yZSBlbXB0eSBsaW5lc1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWF0Y2hlcyA9IGxpbmUubWF0Y2goSU5ERU5UX1JFR0VYKTtcblxuXHRcdGlmIChtYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGluZGVudCA9IG1hdGNoZXNbMF0ubGVuZ3RoO1xuXHRcdFx0Y29uc3QgaW5kZW50VHlwZSA9IG1hdGNoZXNbMV0gPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSB1bmxlc3MgaXQncyB0aGUgb25seSBpbmRlbnQgZGV0ZWN0ZWQgdG8gcHJldmVudCBjb21tb24gZmFsc2UgcG9zaXRpdmVzXG5cdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBpbmRlbnQpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaW5kZW50VHlwZSAhPT0gcHJldmlvdXNJbmRlbnRUeXBlKSB7XG5cdFx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9IGluZGVudFR5cGU7XG5cblx0XHRcdGxldCB1c2UgPSAxO1xuXHRcdFx0bGV0IHdlaWdodCA9IDA7XG5cblx0XHRcdGNvbnN0IGluZGVudERpZmZlcmVuY2UgPSBpbmRlbnQgLSBwcmV2aW91c1NpemU7XG5cdFx0XHRwcmV2aW91c1NpemUgPSBpbmRlbnQ7XG5cblx0XHRcdC8vIFByZXZpb3VzIGxpbmUgaGF2ZSBzYW1lIGluZGVudD9cblx0XHRcdGlmIChpbmRlbnREaWZmZXJlbmNlID09PSAwKSB7XG5cdFx0XHRcdC8vIE5vdCBhIG5ldyBcInVzZVwiIG9mIHRoZSBjdXJyZW50IGluZGVudDpcblx0XHRcdFx0dXNlID0gMDtcblx0XHRcdFx0Ly8gQnV0IGRvIGFkZCBhIGJpdCB0byBpdCBmb3IgYnJlYWtpbmcgdGllczpcblx0XHRcdFx0d2VpZ2h0ID0gMTtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBrZXkgZnJvbSBwcmV2aW91cyBsb29wXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UgPSBNYXRoLmFicyhpbmRlbnREaWZmZXJlbmNlKTtcblxuXHRcdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIGNoYW5nZXMgd2hlbiBpZ25vcmVTaW5nbGVTcGFjZXMgaXMgdHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIHByZXZlbnRzIGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXMgZnJvbSB0aGluZ3MgbGlrZSBhbGlnbmVkIGNvbW1lbnRzXG5cdFx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBzdGF0c1xuXHRcdFx0Y29uc3QgZW50cnkgPSBpbmRlbnRzLmdldChrZXkpO1xuXHRcdFx0aW5kZW50cy5zZXQoa2V5LCBlbnRyeSA9PT0gdW5kZWZpbmVkID8gWzEsIDBdIDogW2VudHJ5WzBdICsgdXNlLCBlbnRyeVsxXSArIHdlaWdodF0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBpbmRlbnRzO1xufVxuXG4vLyBFbmNvZGUgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgYXMgYSBzdHJpbmcgKGUuZy4gJ3M0JykgZm9yIHVzZSBhcyBhIGNvbXBvdW5kIGtleSBpbiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGluZGVudEFtb3VudCkge1xuXHRjb25zdCB0eXBlQ2hhcmFjdGVyID0gaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAncycgOiAndCc7XG5cdHJldHVybiB0eXBlQ2hhcmFjdGVyICsgU3RyaW5nKGluZGVudEFtb3VudCk7XG59XG5cbi8vIEV4dHJhY3QgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgZnJvbSBhIGtleSBvZiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBkZWNvZGVJbmRlbnRzS2V5KGluZGVudHNLZXkpIHtcblx0Y29uc3Qga2V5SGFzVHlwZVNwYWNlID0gaW5kZW50c0tleVswXSA9PT0gJ3MnO1xuXHRjb25zdCB0eXBlID0ga2V5SGFzVHlwZVNwYWNlID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0Y29uc3QgYW1vdW50ID0gTnVtYmVyKGluZGVudHNLZXkuc2xpY2UoMSkpO1xuXG5cdHJldHVybiB7dHlwZSwgYW1vdW50fTtcbn1cblxuLy8gUmV0dXJuIHRoZSBrZXkgKGUuZy4gJ3M0JykgZnJvbSB0aGUgaW5kZW50cyBNYXAgdGhhdCByZXByZXNlbnRzIHRoZSBtb3N0IGNvbW1vbiBpbmRlbnQsXG4vLyBvciByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBpbmRlbnRzLlxuZnVuY3Rpb24gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cykge1xuXHRsZXQgcmVzdWx0O1xuXHRsZXQgbWF4VXNlZCA9IDA7XG5cdGxldCBtYXhXZWlnaHQgPSAwO1xuXG5cdGZvciAoY29uc3QgW2tleSwgW3VzZWRDb3VudCwgd2VpZ2h0XV0gb2YgaW5kZW50cykge1xuXHRcdGlmICh1c2VkQ291bnQgPiBtYXhVc2VkIHx8ICh1c2VkQ291bnQgPT09IG1heFVzZWQgJiYgd2VpZ2h0ID4gbWF4V2VpZ2h0KSkge1xuXHRcdFx0bWF4VXNlZCA9IHVzZWRDb3VudDtcblx0XHRcdG1heFdlaWdodCA9IHdlaWdodDtcblx0XHRcdHJlc3VsdCA9IGtleTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCkge1xuXHRjb25zdCBpbmRlbnRDaGFyYWN0ZXIgPSB0eXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICcgJyA6ICdcXHQnO1xuXHRyZXR1cm4gaW5kZW50Q2hhcmFjdGVyLnJlcGVhdChhbW91bnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RJbmRlbnQoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHQvLyBJZGVudGlmeSBpbmRlbnRzIHdoaWxlIHNraXBwaW5nIHNpbmdsZSBzcGFjZSBpbmRlbnRzIHRvIGF2b2lkIGNvbW1vbiBlZGdlIGNhc2VzIChlLmcuIGNvZGUgY29tbWVudHMpXG5cdC8vIElmIG5vIGluZGVudHMgYXJlIGlkZW50aWZpZWQsIHJ1biBhZ2FpbiBhbmQgaW5jbHVkZSBhbGwgaW5kZW50cyBmb3IgY29tcHJlaGVuc2l2ZSBkZXRlY3Rpb25cblx0bGV0IGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIHRydWUpO1xuXHRpZiAoaW5kZW50cy5zaXplID09PSAwKSB7XG5cdFx0aW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgZmFsc2UpO1xuXHR9XG5cblx0Y29uc3Qga2V5T2ZNb3N0VXNlZEluZGVudCA9IGdldE1vc3RVc2VkS2V5KGluZGVudHMpO1xuXG5cdGxldCB0eXBlO1xuXHRsZXQgYW1vdW50ID0gMDtcblx0bGV0IGluZGVudCA9ICcnO1xuXG5cdGlmIChrZXlPZk1vc3RVc2VkSW5kZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHQoe3R5cGUsIGFtb3VudH0gPSBkZWNvZGVJbmRlbnRzS2V5KGtleU9mTW9zdFVzZWRJbmRlbnQpKTtcblx0XHRpbmRlbnQgPSBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGFtb3VudCxcblx0XHR0eXBlLFxuXHRcdGluZGVudCxcblx0fTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lKHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Y29uc3QgbmV3bGluZXMgPSBzdHJpbmcubWF0Y2goLyg/Olxccj9cXG4pL2cpIHx8IFtdO1xuXG5cdGlmIChuZXdsaW5lcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjcmxmID0gbmV3bGluZXMuZmlsdGVyKG5ld2xpbmUgPT4gbmV3bGluZSA9PT0gJ1xcclxcbicpLmxlbmd0aDtcblx0Y29uc3QgbGYgPSBuZXdsaW5lcy5sZW5ndGggLSBjcmxmO1xuXG5cdHJldHVybiBjcmxmID4gbGYgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZUdyYWNlZnVsKHN0cmluZykge1xuXHRyZXR1cm4gKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnICYmIGRldGVjdE5ld2xpbmUoc3RyaW5nKSkgfHwgJ1xcbic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBzb3J0T2JqZWN0S2V5cyBmcm9tICdzb3J0LW9iamVjdC1rZXlzJ1xuaW1wb3J0IGRldGVjdEluZGVudCBmcm9tICdkZXRlY3QtaW5kZW50J1xuaW1wb3J0IHsgZGV0ZWN0TmV3bGluZUdyYWNlZnVsIGFzIGRldGVjdE5ld2xpbmUgfSBmcm9tICdkZXRlY3QtbmV3bGluZSdcbmltcG9ydCBnaXRIb29rcyBmcm9tICdnaXQtaG9va3MtbGlzdCdcbmltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJ2lzLXBsYWluLW9iaidcbmltcG9ydCBzZW12ZXJDb21wYXJlIGZyb20gJ3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS5qcydcbmltcG9ydCBzZW12ZXJNaW5WZXJzaW9uIGZyb20gJ3NlbXZlci9yYW5nZXMvbWluLXZlcnNpb24uanMnXG5cbmNvbnN0IHBpcGUgPVxuICAoZm5zKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBmbnMucmVkdWNlKChyZXN1bHQsIGZuKSA9PiBmbihyZXN1bHQsIC4uLmFyZ3MpLCB4KVxuY29uc3Qgb25BcnJheSA9IChmbikgPT4gKHgpID0+IChBcnJheS5pc0FycmF5KHgpID8gZm4oeCkgOiB4KVxuY29uc3Qgb25TdHJpbmdBcnJheSA9IChmbikgPT4gKHgpID0+XG4gIEFycmF5LmlzQXJyYXkoeCkgJiYgeC5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSA/IGZuKHgpIDogeFxuY29uc3QgdW5pcSA9IG9uU3RyaW5nQXJyYXkoKHhzKSA9PiBbLi4ubmV3IFNldCh4cyldKVxuY29uc3Qgc29ydEFycmF5ID0gb25TdHJpbmdBcnJheSgoYXJyYXkpID0+IGFycmF5LnRvU29ydGVkKCkpXG5jb25zdCB1bmlxQW5kU29ydEFycmF5ID0gcGlwZShbdW5pcSwgc29ydEFycmF5XSlcbmNvbnN0IG9uT2JqZWN0ID1cbiAgKGZuKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBpc1BsYWluT2JqZWN0KHgpID8gZm4oeCwgLi4uYXJncykgOiB4XG5jb25zdCBzb3J0T2JqZWN0QnkgPSAoY29tcGFyYXRvciwgZGVlcCkgPT4ge1xuICBjb25zdCBvdmVyID0gb25PYmplY3QoKG9iamVjdCkgPT4ge1xuICAgIGlmIChkZWVwKSB7XG4gICAgICBvYmplY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIG92ZXIodmFsdWUpXSksXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKG9iamVjdCwgY29tcGFyYXRvcilcbiAgfSlcblxuICByZXR1cm4gb3ZlclxufVxuY29uc3Qgb2JqZWN0R3JvdXBCeSA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL2VzLWJ1aWx0aW5zLCBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL2VzLXN5bnRheCAtLSBTYWZlXG4gIE9iamVjdC5ncm91cEJ5IHx8XG4gIC8vIFJlbW92ZSB0aGlzIHdoZW4gd2UgZHJvcCBzdXBwb3J0IGZvciBOb2RlLmpzIDIwXG4gICgoYXJyYXksIGNhbGxiYWNrKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYXJyYXkpIHtcbiAgICAgIGNvbnN0IGtleSA9IGNhbGxiYWNrKHZhbHVlKVxuICAgICAgaWYgKHJlc3VsdFtrZXldKSB7XG4gICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IFt2YWx1ZV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KVxuY29uc3Qgc29ydE9iamVjdCA9IHNvcnRPYmplY3RCeSgpXG5jb25zdCBzb3J0VVJMT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsndHlwZScsICd1cmwnXSlcbmNvbnN0IHNvcnRQZW9wbGVPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ2VtYWlsJywgJ3VybCddKVxuY29uc3Qgc29ydERpcmVjdG9yaWVzID0gc29ydE9iamVjdEJ5KFtcbiAgJ2xpYicsXG4gICdiaW4nLFxuICAnbWFuJyxcbiAgJ2RvYycsXG4gICdleGFtcGxlJyxcbiAgJ3Rlc3QnLFxuXSlcbmNvbnN0IG92ZXJQcm9wZXJ0eSA9IChwcm9wZXJ0eSwgb3ZlcikgPT5cbiAgb25PYmplY3QoKG9iamVjdCwgLi4uYXJncykgPT5cbiAgICBPYmplY3QuaGFzT3duKG9iamVjdCwgcHJvcGVydHkpXG4gICAgICA/IHsgLi4ub2JqZWN0LCBbcHJvcGVydHldOiBvdmVyKG9iamVjdFtwcm9wZXJ0eV0sIC4uLmFyZ3MpIH1cbiAgICAgIDogb2JqZWN0LFxuICApXG5jb25zdCBzb3J0R2l0SG9va3MgPSBzb3J0T2JqZWN0QnkoZ2l0SG9va3MpXG5cbmNvbnN0IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSA9IChzcGVjaWZpZXIpID0+IHtcbiAgLy8gSWdub3JlIGFueXRoaW5nIGFmdGVyID4gJiByZWx5IG9uIGZhbGxiYWNrIGFscGhhbnVtZXJpYyBzb3J0aW5nIGZvciB0aGF0XG4gIGNvbnN0IFtuYW1lQW5kVmVyc2lvbl0gPSBzcGVjaWZpZXIuc3BsaXQoJz4nKVxuICBjb25zdCBhdE1hdGNoZXMgPSBbLi4ubmFtZUFuZFZlcnNpb24ubWF0Y2hBbGwoJ0AnKV1cbiAgaWYgKFxuICAgICFhdE1hdGNoZXMubGVuZ3RoIHx8XG4gICAgKGF0TWF0Y2hlcy5sZW5ndGggPT09IDEgJiYgYXRNYXRjaGVzWzBdLmluZGV4ID09PSAwKVxuICApIHtcbiAgICByZXR1cm4geyBuYW1lOiBzcGVjaWZpZXIgfVxuICB9XG4gIGNvbnN0IHNwbGl0SW5kZXggPSBhdE1hdGNoZXMucG9wKCkuaW5kZXhcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoMCwgc3BsaXRJbmRleCksXG4gICAgcmFuZ2U6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZyhzcGxpdEluZGV4ICsgMSksXG4gIH1cbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5U2VtdmVyID0gc29ydE9iamVjdEJ5KChhLCBiKSA9PiB7XG4gIGNvbnN0IHsgbmFtZTogYU5hbWUsIHJhbmdlOiBhUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShhKVxuICBjb25zdCB7IG5hbWU6IGJOYW1lLCByYW5nZTogYlJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYilcblxuICBpZiAoYU5hbWUgIT09IGJOYW1lKSB7XG4gICAgcmV0dXJuIGFOYW1lLmxvY2FsZUNvbXBhcmUoYk5hbWUsICdlbicpXG4gIH1cbiAgaWYgKCFhUmFuZ2UpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoIWJSYW5nZSkge1xuICAgIHJldHVybiAxXG4gIH1cbiAgcmV0dXJuIHNlbXZlckNvbXBhcmUoc2VtdmVyTWluVmVyc2lvbihhUmFuZ2UpLCBzZW12ZXJNaW5WZXJzaW9uKGJSYW5nZSkpXG59KVxuXG5jb25zdCBnZXRQYWNrYWdlTmFtZSA9IChpZGVudCkgPT4ge1xuICBjb25zdCBpbmRleCA9IGlkZW50LmluZGV4T2YoJ0AnLCBpZGVudC5zdGFydHNXaXRoKCdAJykgPyAxIDogMClcbiAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgdW5sZXNzIHVzZXIgbWFudWFsbHkgZWRpdCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgcmV0dXJuIGluZGV4ID09PSAtMSA/IGlkZW50IDogaWRlbnQuc2xpY2UoMCwgaW5kZXgpXG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeUlkZW50ID0gKGEsIGIpID0+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVBID0gZ2V0UGFja2FnZU5hbWUoYSlcbiAgY29uc3QgcGFja2FnZU5hbWVCID0gZ2V0UGFja2FnZU5hbWUoYilcblxuICBpZiAocGFja2FnZU5hbWVBIDwgcGFja2FnZU5hbWVCKSByZXR1cm4gLTFcbiAgaWYgKHBhY2thZ2VOYW1lQSA+IHBhY2thZ2VOYW1lQikgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gQ2FjaGUgYnkgYHByb2Nlc3MuY3dkKClgIGluc3RlYWQgb2YgYSB2YXJpYWJsZSB0byBhbGxvdyB1c2VyIGNhbGwgYHByb2Nlc3MuY2hkaXIoKWBcbmNvbnN0IGNhY2hlID0gbmV3IE1hcCgpXG5jb25zdCBoYXNZYXJuT3JQbnBtRmlsZXMgPSAoKSA9PiB7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKClcbiAgaWYgKCFjYWNoZS5oYXMoY3dkKSkge1xuICAgIGNhY2hlLnNldChcbiAgICAgIGN3ZCxcbiAgICAgIGZzLmV4aXN0c1N5bmMoJ3lhcm4ubG9jaycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJuLycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJucmMueW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS1sb2NrLnlhbWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLXdvcmtzcGFjZS55YW1sJyksXG4gICAgKVxuICB9XG4gIHJldHVybiBjYWNoZS5nZXQoY3dkKVxufVxuXG4vKipcbiAqIERldGVjdHMgdGhlIHBhY2thZ2UgbWFuYWdlciBmcm9tIHBhY2thZ2UuanNvbiBhbmQgbG9jayBmaWxlc1xuICogQHBhcmFtIHtvYmplY3R9IHBhY2thZ2VKc29uIC0gVGhlIHBhcnNlZCBwYWNrYWdlLmpzb24gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUaGUgZGV0ZWN0ZWQgcGFja2FnZSBtYW5hZ2VyLiBEZWZhdWx0IHRvIG5wbSBpZiBub3QgZGV0ZWN0ZWQuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvY29yZXBhY2tcbiAgaWYgKHR5cGVvZiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnbnBtQCcpXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24uZGV2RW5naW5lcz8ucGFja2FnZU1hbmFnZXI/Lm5hbWUpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24uZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlci5uYW1lID09PSAnbnBtJ1xuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLnBucG0pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIE9wdGltaXNhdGlvbjogQ2hlY2sgaWYgbnBtIGlzIGV4cGxpY2l0IGJlZm9yZSByZWFkaW5nIEZTLlxuICBpZiAocGFja2FnZUpzb24uZW5naW5lcz8ubnBtKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChoYXNZYXJuT3JQbnBtRmlsZXMoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBTb3J0IGRlcGVuZGVuY2llcyBhbHBoYWJldGljYWxseSwgZGV0ZWN0aW5nIHBhY2thZ2UgbWFuYWdlciB0byB1c2UgdGhlXG4gKiBhcHByb3ByaWF0ZSBjb21wYXJpc29uLiBucG0gdXNlcyBsb2NhbGUtYXdhcmUgY29tcGFyaXNvbiwgeWFybiBhbmQgcG5wbSB1c2VcbiAqIHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvblxuICovXG5jb25zdCBzb3J0RGVwZW5kZW5jaWVzID0gb25PYmplY3QoKGRlcGVuZGVuY2llcywgcGFja2FnZUpzb24pID0+IHtcbiAgLy8gQXZvaWQgZmlsZSBhY2Nlc3NcbiAgaWYgKE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcykubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBkZXBlbmRlbmNpZXNcbiAgfVxuXG4gIC8vIHNvcnQgZGVwcyBsaWtlIHRoZSBucG0gQ0xJIGRvZXMgKHZpYSB0aGUgcGFja2FnZSBAbnBtY2xpL3BhY2thZ2UtanNvbilcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25wbS9wYWNrYWdlLWpzb24vYmxvYi9iNjQ2NWY0NGM3MjdkNjUxM2RiNjg5OGM3Y2JlNDFkZDM1NWNlYmU4L2xpYi91cGRhdGUtZGVwZW5kZW5jaWVzLmpzI0w4LUwyMVxuICBpZiAoc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pKSB7XG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcywgKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiLCAnZW4nKSlcbiAgfVxuXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMpXG59KVxuXG4vKipcbiAqIFwid29ya3NwYWNlc1wiIGNhbiBiZSBhbiBhcnJheSAobnBtIG9yIHlhcm4gY2xhc3NpYykgb3IgYW4gb2JqZWN0IChwbnBtL2J1bikuXG4gKiBJbiB0aGUgY2FzZSBvZiBhbiBhcnJheSwgd2UgZG8gbm90IHdhbnQgdG8gYWxwaGFiZXRpY2FsbHkgc29ydCBpdCBpbiBjYXNlXG4gKiBzY3JpcHRzIG5lZWQgdG8gcnVuIGluIGEgc3BlY2lmaWMgb3JkZXIuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92Ny91c2luZy1ucG0vd29ya3NwYWNlcz92PXRydWUjcnVubmluZy1jb21tYW5kcy1pbi10aGUtY29udGV4dC1vZi13b3Jrc3BhY2VzXG4gKi9cbmNvbnN0IHNvcnRXb3Jrc3BhY2VzID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShbJ3BhY2thZ2VzJywgJ2NhdGFsb2cnXSksXG4gIG92ZXJQcm9wZXJ0eSgncGFja2FnZXMnLCB1bmlxQW5kU29ydEFycmF5KSxcbiAgb3ZlclByb3BlcnR5KCdjYXRhbG9nJywgc29ydERlcGVuZGVuY2llcyksXG5dKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9ibG9iL2FjYzBlNDc1NzJhOTM5MDI5MmI0ZTMxM2I0YTRiZjM2MGQyMzYzNTgvY29uZi9jb25maWctc2NoZW1hLmpzXG5jb25zdCBlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgLy8gYGZpbGVzYCBhbmQgYGV4Y2x1ZGVkRmlsZXNgIGFyZSBvbmx5IG9uIGBvdmVycmlkZXNbXWBcbiAgLy8gZm9yIGVhc2llciBzb3J0IGBvdmVycmlkZXNbXWAsXG4gIC8vIGFkZCB0aGVtIHRvIGhlcmUsIHNvIHdlIGRvbid0IG5lZWQgc29ydCBgb3ZlcnJpZGVzW11gIHR3aWNlXG4gICdmaWxlcycsXG4gICdleGNsdWRlZEZpbGVzJyxcbiAgLy8gYmFzZUNvbmZpZ1xuICAnZW52JyxcbiAgJ3BhcnNlcicsXG4gICdwYXJzZXJPcHRpb25zJyxcbiAgJ3NldHRpbmdzJyxcbiAgJ3BsdWdpbnMnLFxuICAnZXh0ZW5kcycsXG4gICdydWxlcycsXG4gICdvdmVycmlkZXMnLFxuICAnZ2xvYmFscycsXG4gICdwcm9jZXNzb3InLFxuICAnbm9JbmxpbmVDb25maWcnLFxuICAncmVwb3J0VW51c2VkRGlzYWJsZURpcmVjdGl2ZXMnLFxuXVxuY29uc3Qgc29ydEVzbGludENvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMpLFxuICBvdmVyUHJvcGVydHkoJ2VudicsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoJ2dsb2JhbHMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT4gb3ZlcnJpZGVzLm1hcChzb3J0RXNsaW50Q29uZmlnKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgncGFyc2VyT3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ3J1bGVzJyxcbiAgICBzb3J0T2JqZWN0QnkoXG4gICAgICAocnVsZTEsIHJ1bGUyKSA9PlxuICAgICAgICBydWxlMS5zcGxpdCgnLycpLmxlbmd0aCAtIHJ1bGUyLnNwbGl0KCcvJykubGVuZ3RoIHx8XG4gICAgICAgIHJ1bGUxLmxvY2FsZUNvbXBhcmUocnVsZTIpLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgnc2V0dGluZ3MnLCBzb3J0T2JqZWN0KSxcbl0pXG5jb25zdCBzb3J0VlNDb2RlQmFkZ2VPYmplY3QgPSBzb3J0T2JqZWN0QnkoWydkZXNjcmlwdGlvbicsICd1cmwnLCAnaHJlZiddKVxuXG5jb25zdCBzb3J0UHJldHRpZXJDb25maWcgPSBwaXBlKFtcbiAgLy8gc29ydCBrZXlzIGFscGhhYmV0aWNhbGx5LCBidXQgcHV0IGBvdmVycmlkZXNgIGF0IGJvdHRvbVxuICBvbk9iamVjdCgoY29uZmlnKSA9PlxuICAgIHNvcnRPYmplY3RLZXlzKGNvbmZpZywgW1xuICAgICAgLi4uT2JqZWN0LmtleXMoY29uZmlnKVxuICAgICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gJ292ZXJyaWRlcycpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICAnb3ZlcnJpZGVzJyxcbiAgICBdKSxcbiAgKSxcbiAgLy8gaWYgYGNvbmZpZy5vdmVycmlkZXNgIGV4aXN0c1xuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgLy8gYW5kIGBjb25maWcub3ZlcnJpZGVzYCBpcyBhbiBhcnJheVxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT5cbiAgICAgIG92ZXJyaWRlcy5tYXAoXG4gICAgICAgIHBpcGUoW1xuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXWAgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBzb3J0T2JqZWN0LFxuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXS5vcHRpb25zYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIG92ZXJQcm9wZXJ0eSgnb3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbl0pXG5cbmNvbnN0IHNvcnRWb2x0YSA9IHNvcnRPYmplY3RCeShbJ25vZGUnLCAnbnBtJywgJ3lhcm4nXSlcbmNvbnN0IHNvcnREZXZFbmdpbmVzID0gb3ZlclByb3BlcnR5KFxuICAncGFja2FnZU1hbmFnZXInLFxuICBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ3ZlcnNpb24nLCAnb25GYWlsJ10pLFxuKVxuXG5jb25zdCBwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gICdwZWVyRGVwZW5kZW5jeVJ1bGVzJyxcbiAgJ25ldmVyQnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzJyxcbiAgJ29ubHlCdWlsdERlcGVuZGVuY2llc0ZpbGUnLFxuICAnYWxsb3dlZERlcHJlY2F0ZWRWZXJzaW9ucycsXG4gICdhbGxvd05vbkFwcGxpZWRQYXRjaGVzJyxcbiAgJ3VwZGF0ZUNvbmZpZycsXG4gICdhdWRpdENvbmZpZycsXG4gICdyZXF1aXJlZFNjcmlwdHMnLFxuICAnc3VwcG9ydGVkQXJjaGl0ZWN0dXJlcycsXG4gICdvdmVycmlkZXMnLFxuICAncGF0Y2hlZERlcGVuZGVuY2llcycsXG4gICdwYWNrYWdlRXh0ZW5zaW9ucycsXG5dXG5cbmNvbnN0IHNvcnRQbnBtQ29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMsIHRydWUpLFxuICBvdmVyUHJvcGVydHkoJ292ZXJyaWRlcycsIHNvcnRPYmplY3RCeVNlbXZlciksXG5dKVxuXG4vLyBTZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9taXNjL3NjcmlwdHNcbmNvbnN0IGRlZmF1bHROcG1TY3JpcHRzID0gbmV3IFNldChbXG4gICdpbnN0YWxsJyxcbiAgJ3BhY2snLFxuICAncHJlcGFyZScsXG4gICdwdWJsaXNoJyxcbiAgJ3Jlc3RhcnQnLFxuICAnc2hyaW5rd3JhcCcsXG4gICdzdGFydCcsXG4gICdzdG9wJyxcbiAgJ3Rlc3QnLFxuICAndW5pbnN0YWxsJyxcbiAgJ3ZlcnNpb24nLFxuXSlcblxuY29uc3QgaGFzRGV2RGVwZW5kZW5jeSA9IChkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbikgPT4ge1xuICByZXR1cm4gKFxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24sICdkZXZEZXBlbmRlbmNpZXMnKSAmJlxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzLCBkZXBlbmRlbmN5KVxuICApXG59XG5cbmNvbnN0IHJ1blNSZWdFeHAgPVxuICAvKD88PV58W1xccyY7PD58KF0pKD86cnVuLXN8bnBtLXJ1bi1hbGwyPyAuKig/Oi0tc2VxdWVudGlhbHwtLXNlcmlhbHwtcykpKD89JHxbXFxzJjs8PnwpXSkvXG5cbmNvbnN0IGlzU2VxdWVudGlhbFNjcmlwdCA9IChjb21tYW5kKSA9PlxuICBjb21tYW5kLmluY2x1ZGVzKCcqJykgJiYgcnVuU1JlZ0V4cC50ZXN0KGNvbW1hbmQpXG5cbmNvbnN0IGhhc1NlcXVlbnRpYWxTY3JpcHQgPSAocGFja2FnZUpzb24pID0+IHtcbiAgaWYgKFxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbCcsIHBhY2thZ2VKc29uKSAmJlxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbDInLCBwYWNrYWdlSnNvbilcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3Qgc2NyaXB0cyA9IFsnc2NyaXB0cycsICdiZXR0ZXJTY3JpcHRzJ10uZmxhdE1hcCgoZmllbGQpID0+XG4gICAgcGFja2FnZUpzb25bZmllbGRdID8gT2JqZWN0LnZhbHVlcyhwYWNrYWdlSnNvbltmaWVsZF0pIDogW10sXG4gIClcbiAgcmV0dXJuIHNjcmlwdHMuc29tZSgoc2NyaXB0KSA9PiBpc1NlcXVlbnRpYWxTY3JpcHQoc2NyaXB0KSlcbn1cblxuZnVuY3Rpb24gc29ydFNjcmlwdE5hbWVzKGtleXMsIHByZWZpeCA9ICcnKSB7XG4gIGNvbnN0IGdyb3VwTWFwID0gbmV3IE1hcCgpXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCByZXN0ID0gcHJlZml4ID8ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGggKyAxKSA6IGtleVxuICAgIGNvbnN0IGlkeCA9IHJlc3QuaW5kZXhPZignOicpXG4gICAgaWYgKGlkeCA+IDApIHtcbiAgICAgIGNvbnN0IGJhc2UgPSBrZXkuc2xpY2UoMCwgKHByZWZpeCA/IHByZWZpeC5sZW5ndGggKyAxIDogMCkgKyBpZHgpXG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhiYXNlKSkgZ3JvdXBNYXAuc2V0KGJhc2UsIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGJhc2UpLnB1c2goa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhrZXkpKSBncm91cE1hcC5zZXQoa2V5LCBbXSlcbiAgICAgIGdyb3VwTWFwLmdldChrZXkpLnB1c2goa2V5KVxuICAgIH1cbiAgfVxuICByZXR1cm4gQXJyYXkuZnJvbShncm91cE1hcC5rZXlzKCkpXG4gICAgLnNvcnQoKVxuICAgIC5mbGF0TWFwKChncm91cEtleSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBncm91cE1hcC5nZXQoZ3JvdXBLZXkpXG4gICAgICBpZiAoXG4gICAgICAgIGNoaWxkcmVuLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgY2hpbGRyZW4uc29tZSgoaykgPT4gayAhPT0gZ3JvdXBLZXkgJiYgay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBkaXJlY3QgPSBjaGlsZHJlblxuICAgICAgICAgIC5maWx0ZXIoKGspID0+IGsgPT09IGdyb3VwS2V5IHx8ICFrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgY29uc3QgbmVzdGVkID0gY2hpbGRyZW4uZmlsdGVyKChrKSA9PiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICByZXR1cm4gWy4uLmRpcmVjdCwgLi4uc29ydFNjcmlwdE5hbWVzKG5lc3RlZCwgZ3JvdXBLZXkpXVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoaWxkcmVuLnNvcnQoKVxuICAgIH0pXG59XG5cbmNvbnN0IHNvcnRTY3JpcHRzID0gb25PYmplY3QoKHNjcmlwdHMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIGxldCBuYW1lcyA9IE9iamVjdC5rZXlzKHNjcmlwdHMpXG4gIGNvbnN0IHByZWZpeGFibGUgPSBuZXcgU2V0KClcblxuICBuYW1lcyA9IG5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgIGNvbnN0IG9taXR0ZWQgPSBuYW1lLnJlcGxhY2UoL14oPzpwcmV8cG9zdCkvLCAnJylcbiAgICBpZiAoZGVmYXVsdE5wbVNjcmlwdHMuaGFzKG9taXR0ZWQpIHx8IG5hbWVzLmluY2x1ZGVzKG9taXR0ZWQpKSB7XG4gICAgICBwcmVmaXhhYmxlLmFkZChvbWl0dGVkKVxuICAgICAgcmV0dXJuIG9taXR0ZWRcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVcbiAgfSlcblxuICBpZiAoIWhhc1NlcXVlbnRpYWxTY3JpcHQocGFja2FnZUpzb24pKSB7XG4gICAgbmFtZXMgPSBzb3J0U2NyaXB0TmFtZXMobmFtZXMpXG4gIH1cbiAgbmFtZXMgPSBuYW1lcy5mbGF0TWFwKChrZXkpID0+XG4gICAgcHJlZml4YWJsZS5oYXMoa2V5KSA/IFtgcHJlJHtrZXl9YCwga2V5LCBgcG9zdCR7a2V5fWBdIDogW2tleV0sXG4gIClcbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKHNjcmlwdHMsIG5hbWVzKVxufSlcblxuLypcbi0gTW92ZSBgZGVmYXVsdGAgY29uZGl0aW9uIHRvIGJvdHRvbVxuKi9cbmNvbnN0IHNvcnRDb25kaXRpb25zID0gKGNvbmRpdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWZhdWx0Q29uZGl0aW9ucyA9IFtdLCByZXN0Q29uZGl0aW9ucyA9IFtdIH0gPSBvYmplY3RHcm91cEJ5KFxuICAgIGNvbmRpdGlvbnMsXG4gICAgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgIHJldHVybiAnZGVmYXVsdENvbmRpdGlvbnMnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAncmVzdENvbmRpdGlvbnMnXG4gICAgfSxcbiAgKVxuXG4gIHJldHVybiBbLi4ucmVzdENvbmRpdGlvbnMsIC4uLmRlZmF1bHRDb25kaXRpb25zXVxufVxuXG5jb25zdCBzb3J0RXhwb3J0cyA9IG9uT2JqZWN0KChleHBvcnRzKSA9PiB7XG4gIGNvbnN0IHsgcGF0aHMgPSBbXSwgY29uZGl0aW9ucyA9IFtdIH0gPSBvYmplY3RHcm91cEJ5KFxuICAgIE9iamVjdC5rZXlzKGV4cG9ydHMpLFxuICAgIChrZXkpID0+IChrZXkuc3RhcnRzV2l0aCgnLicpID8gJ3BhdGhzJyA6ICdjb25kaXRpb25zJyksXG4gIClcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5wYXRocywgLi4uc29ydENvbmRpdGlvbnMoY29uZGl0aW9ucyldLm1hcCgoa2V5KSA9PiBbXG4gICAgICBrZXksXG4gICAgICBzb3J0RXhwb3J0cyhleHBvcnRzW2tleV0pLFxuICAgIF0pLFxuICApXG59KVxuXG4vLyBmaWVsZHMgbWFya2VkIGB2c2NvZGVgIGFyZSBmb3IgYFZpc3VhbCBTdHVkaW8gQ29kZSBleHRlbnNpb24gbWFuaWZlc3RgIG9ubHlcbi8vIGh0dHBzOi8vY29kZS52aXN1YWxzdHVkaW8uY29tL2FwaS9yZWZlcmVuY2VzL2V4dGVuc2lvbi1tYW5pZmVzdFxuLy8gU3VwcG9ydGVkIGZpZWxkczpcbi8vIHB1Ymxpc2hlciwgZGlzcGxheU5hbWUsIGNhdGVnb3JpZXMsIGdhbGxlcnlCYW5uZXIsIHByZXZpZXcsIGNvbnRyaWJ1dGVzLFxuLy8gYWN0aXZhdGlvbkV2ZW50cywgYmFkZ2VzLCBtYXJrZG93biwgcW5hLCBleHRlbnNpb25QYWNrLFxuLy8gZXh0ZW5zaW9uRGVwZW5kZW5jaWVzLCBpY29uXG5cbi8vIGZpZWxkLmtleXtzdHJpbmd9OiBmaWVsZCBuYW1lXG4vLyBmaWVsZC5vdmVye2Z1bmN0aW9ufTogc29ydCBmaWVsZCBzdWJLZXlcbmNvbnN0IGZpZWxkcyA9IFtcbiAgeyBrZXk6ICckc2NoZW1hJyB9LFxuICB7IGtleTogJ25hbWUnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2Rpc3BsYXlOYW1lJyB9LFxuICB7IGtleTogJ3ZlcnNpb24nIH0sXG4gIC8qIHlhcm4gKi8geyBrZXk6ICdzdGFibGVWZXJzaW9uJyB9LFxuICB7IGtleTogJ3ByaXZhdGUnIH0sXG4gIHsga2V5OiAnZGVzY3JpcHRpb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NhdGVnb3JpZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAna2V5d29yZHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaG9tZXBhZ2UnIH0sXG4gIHsga2V5OiAnYnVncycsIG92ZXI6IHNvcnRPYmplY3RCeShbJ3VybCcsICdlbWFpbCddKSB9LFxuICB7IGtleTogJ3JlcG9zaXRvcnknLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnZnVuZGluZycsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdsaWNlbnNlJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdxbmEnIH0sXG4gIHsga2V5OiAnYXV0aG9yJywgb3Zlcjogc29ydFBlb3BsZU9iamVjdCB9LFxuICB7XG4gICAga2V5OiAnbWFpbnRhaW5lcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKG1haW50YWluZXJzKSA9PiBtYWludGFpbmVycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICB7XG4gICAga2V5OiAnY29udHJpYnV0b3JzJyxcbiAgICBvdmVyOiBvbkFycmF5KChjb250cmlidXRvcnMpID0+IGNvbnRyaWJ1dG9ycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwdWJsaXNoZXInIH0sXG4gIHsga2V5OiAnc2lkZUVmZmVjdHMnIH0sXG4gIHsga2V5OiAndHlwZScgfSxcbiAgeyBrZXk6ICdpbXBvcnRzJyB9LFxuICB7IGtleTogJ2V4cG9ydHMnLCBvdmVyOiBzb3J0RXhwb3J0cyB9LFxuICB7IGtleTogJ21haW4nIH0sXG4gIHsga2V5OiAnc3ZlbHRlJyB9LFxuICB7IGtleTogJ3VtZDptYWluJyB9LFxuICB7IGtleTogJ2pzZGVsaXZyJyB9LFxuICB7IGtleTogJ3VucGtnJyB9LFxuICB7IGtleTogJ21vZHVsZScgfSxcbiAgeyBrZXk6ICdzb3VyY2UnIH0sXG4gIHsga2V5OiAnanNuZXh0Om1haW4nIH0sXG4gIHsga2V5OiAnYnJvd3NlcicgfSxcbiAgeyBrZXk6ICdyZWFjdC1uYXRpdmUnIH0sXG4gIHsga2V5OiAndHlwZXMnIH0sXG4gIHsga2V5OiAndHlwZXNWZXJzaW9ucycgfSxcbiAgeyBrZXk6ICd0eXBpbmdzJyB9LFxuICB7IGtleTogJ3N0eWxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZXN0eWxlJyB9LFxuICB7IGtleTogJ2Fzc2V0cycgfSxcbiAgeyBrZXk6ICdiaW4nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbWFuJyB9LFxuICB7IGtleTogJ2RpcmVjdG9yaWVzJywgb3Zlcjogc29ydERpcmVjdG9yaWVzIH0sXG4gIHsga2V5OiAnZmlsZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnd29ya3NwYWNlcycsIG92ZXI6IHNvcnRXb3Jrc3BhY2VzIH0sXG4gIC8vIG5vZGUtcHJlLWd5cCBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9ub2RlLXByZS1neXAjMS1hZGQtbmV3LWVudHJpZXMtdG8teW91ci1wYWNrYWdlanNvblxuICB7XG4gICAga2V5OiAnYmluYXJ5JyxcbiAgICBvdmVyOiBzb3J0T2JqZWN0QnkoW1xuICAgICAgJ21vZHVsZV9uYW1lJyxcbiAgICAgICdtb2R1bGVfcGF0aCcsXG4gICAgICAncmVtb3RlX3BhdGgnLFxuICAgICAgJ3BhY2thZ2VfbmFtZScsXG4gICAgICAnaG9zdCcsXG4gICAgXSksXG4gIH0sXG4gIHsga2V5OiAnc2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnYmV0dGVyU2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2wxMG4nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NvbnRyaWJ1dGVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdhY3RpdmF0aW9uRXZlbnRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2h1c2t5Jywgb3Zlcjogb3ZlclByb3BlcnR5KCdob29rcycsIHNvcnRHaXRIb29rcykgfSxcbiAgeyBrZXk6ICdzaW1wbGUtZ2l0LWhvb2tzJywgb3Zlcjogc29ydEdpdEhvb2tzIH0sXG4gIHsga2V5OiAncHJlLWNvbW1pdCcgfSxcbiAgeyBrZXk6ICdjb21taXRsaW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2xpbnQtc3RhZ2VkJyB9LFxuICB7IGtleTogJ25hbm8tc3RhZ2VkJyB9LFxuICB7IGtleTogJ2NvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdub2RlbW9uQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2Jyb3dzZXJpZnknLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYmFiZWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcnNsaXN0JyB9LFxuICB7IGtleTogJ3hvJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3ByZXR0aWVyJywgb3Zlcjogc29ydFByZXR0aWVyQ29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50Q29uZmlnJywgb3Zlcjogc29ydEVzbGludENvbmZpZyB9LFxuICB7IGtleTogJ2VzbGludElnbm9yZScgfSxcbiAgeyBrZXk6ICducG1wa2dqc29ubGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1QYWNrYWdlSnNvbkxpbnRDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnBtcGFja2FnZWpzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3JlbGVhc2UnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVtYXJrQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3N0eWxlbGludCcgfSxcbiAgeyBrZXk6ICdhdmEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0LWp1bml0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3Qtc3RhcmUnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbW9jaGEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnljJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2M4Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3RhcCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvY2xpZicsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAncmVzb2x1dGlvbnMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnb3ZlcnJpZGVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXZEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeShzb3J0T2JqZWN0QnlJZGVudCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICAvLyBUT0RPOiBvbmx5IHNvcnQgZGVwdGggPSAyXG4gIHsga2V5OiAncGVlckRlcGVuZGVuY2llc01ldGEnLCBvdmVyOiBzb3J0T2JqZWN0QnkodW5kZWZpbmVkLCB0cnVlKSB9LFxuICB7IGtleTogJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2J1bmRsZWREZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnYnVuZGxlRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25QYWNrJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25EZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnZmxhdCcgfSxcbiAgeyBrZXk6ICdwYWNrYWdlTWFuYWdlcicgfSxcbiAgeyBrZXk6ICdlbmdpbmVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2VuZ2luZVN0cmljdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdkZXZFbmdpbmVzJywgb3Zlcjogc29ydERldkVuZ2luZXMgfSxcbiAgeyBrZXk6ICd2b2x0YScsIG92ZXI6IHNvcnRWb2x0YSB9LFxuICB7IGtleTogJ2xhbmd1YWdlTmFtZScgfSxcbiAgeyBrZXk6ICdvcycgfSxcbiAgeyBrZXk6ICdjcHUnIH0sXG4gIHsga2V5OiAncHJlZmVyR2xvYmFsJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3B1Ymxpc2hDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2ljb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7XG4gICAga2V5OiAnYmFkZ2VzJyxcbiAgICBvdmVyOiBvbkFycmF5KChiYWRnZSkgPT4gYmFkZ2UubWFwKHNvcnRWU0NvZGVCYWRnZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdnYWxsZXJ5QmFubmVyJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwcmV2aWV3JyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdtYXJrZG93bicgfSxcbiAgeyBrZXk6ICdwbnBtJywgb3Zlcjogc29ydFBucG1Db25maWcgfSxcbl1cblxuY29uc3QgZGVmYXVsdFNvcnRPcmRlciA9IGZpZWxkcy5tYXAoKHsga2V5IH0pID0+IGtleSlcbmNvbnN0IG92ZXJGaWVsZHMgPSBwaXBlKFxuICBmaWVsZHNcbiAgICAubWFwKCh7IGtleSwgb3ZlciB9KSA9PiAob3ZlciA/IG92ZXJQcm9wZXJ0eShrZXksIG92ZXIpIDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pLFxuKVxuXG5mdW5jdGlvbiBlZGl0U3RyaW5nSlNPTihqc29uLCBvdmVyKSB7XG4gIGlmICh0eXBlb2YganNvbiA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB7IGluZGVudCwgdHlwZSB9ID0gZGV0ZWN0SW5kZW50KGpzb24pXG4gICAgY29uc3QgZW5kQ2hhcmFjdGVycyA9IGpzb24uc2xpY2UoLTEpID09PSAnXFxuJyA/ICdcXG4nIDogJydcbiAgICBjb25zdCBuZXdsaW5lID0gZGV0ZWN0TmV3bGluZShqc29uKVxuICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pXG5cbiAgICBsZXQgcmVzdWx0ID1cbiAgICAgIEpTT04uc3RyaW5naWZ5KG92ZXIoanNvbiksIG51bGwsIHR5cGUgPT09ICd0YWInID8gJ1xcdCcgOiBpbmRlbnQpICtcbiAgICAgIGVuZENoYXJhY3RlcnNcbiAgICBpZiAobmV3bGluZSA9PT0gJ1xcclxcbicpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXG4vZywgbmV3bGluZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgcmV0dXJuIG92ZXIoanNvbilcbn1cblxuZnVuY3Rpb24gc29ydFBhY2thZ2VKc29uKGpzb25Jc2gsIG9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gZWRpdFN0cmluZ0pTT04oXG4gICAganNvbklzaCxcbiAgICBvbk9iamVjdCgoanNvbikgPT4ge1xuICAgICAgbGV0IHNvcnRPcmRlciA9IG9wdGlvbnMuc29ydE9yZGVyIHx8IGRlZmF1bHRTb3J0T3JkZXJcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc29ydE9yZGVyKSkge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoanNvbilcbiAgICAgICAgY29uc3QgeyBwcml2YXRlS2V5cyA9IFtdLCBwdWJsaWNLZXlzID0gW10gfSA9IG9iamVjdEdyb3VwQnkoXG4gICAgICAgICAga2V5cyxcbiAgICAgICAgICAoa2V5KSA9PiAoa2V5WzBdID09PSAnXycgPyAncHJpdmF0ZUtleXMnIDogJ3B1YmxpY0tleXMnKSxcbiAgICAgICAgKVxuICAgICAgICBzb3J0T3JkZXIgPSBbXG4gICAgICAgICAgLi4uc29ydE9yZGVyLFxuICAgICAgICAgIC4uLmRlZmF1bHRTb3J0T3JkZXIsXG4gICAgICAgICAgLi4ucHVibGljS2V5cy5zb3J0KCksXG4gICAgICAgICAgLi4ucHJpdmF0ZUtleXMuc29ydCgpLFxuICAgICAgICBdXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdmVyRmllbGRzKHNvcnRPYmplY3RLZXlzKGpzb24sIHNvcnRPcmRlciksIGpzb24pXG4gICAgfSksXG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgc29ydFBhY2thZ2VKc29uXG5leHBvcnQgeyBzb3J0UGFja2FnZUpzb24sIGRlZmF1bHRTb3J0T3JkZXIgYXMgc29ydE9yZGVyIH1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWx1ZSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VEaXJQYXRocy5tYXAoYXN5bmMgKHBhY2thZ2VEaXJQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG5ld1Rlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAndGVzdCcpO1xuICAgICAgICBmb3IgKGNvbnN0IG9sZFRlc3REaXJOYW1lIG9mIFsnX190ZXN0c19fJywgJ3Rlc3RzJ10pIHtcbiAgICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgb2xkVGVzdERpck5hbWUpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBtb3ZlVGVzdERpcmVjdG9yeShvbGRUZXN0RGlyUGF0aCwgbmV3VGVzdERpclBhdGgpO1xuICAgICAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgICAgICAgICBzY3JpcHRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgZGlkVXBkYXRlU2NyaXB0ID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3NjcmlwdE5hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gc2NyaXB0LnJlcGxhY2VBbGwob2xkVGVzdERpck5hbWUsICd0ZXN0Jyk7XG4gICAgICAgICAgICAgIGlmIChzY3JpcHQgIT09IG5ld1NjcmlwdCkge1xuICAgICAgICAgICAgICAgIHNjcmlwdHNbc2NyaXB0TmFtZV0gPSBuZXdTY3JpcHQ7XG4gICAgICAgICAgICAgICAgZGlkVXBkYXRlU2NyaXB0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFja2FnZUpzb24uc2NyaXB0cyA9IHNjcmlwdHM7XG4gICAgICAgICAgICBpZiAoIWRpZFVwZGF0ZVNjcmlwdCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKHBhY2thZ2VKc29uKSwgdW5kZWZpbmVkLCAyKSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtb3ZlVGVzdERpcmVjdG9yeShvbGRUZXN0RGlyUGF0aDogc3RyaW5nLCBuZXdUZXN0RGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhuZXdUZXN0RGlyUGF0aCkpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihvbGRUZXN0RGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBkaXJlbnRzLm1hcChhc3luYyAoZGlyZW50KSA9PiB7XG4gICAgICBjb25zdCBvbGRQYXRoID0gcGF0aC5qb2luKG9sZFRlc3REaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBjb25zdCBuZXdQYXRoID0gcGF0aC5qb2luKG5ld1Rlc3REaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBjb25zdCBuZXdQYXRoU3RhdCA9IGZzLmV4aXN0c1N5bmMobmV3UGF0aCkgPyBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KG5ld1BhdGgpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIG5ld1BhdGhTdGF0Py5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGF3YWl0IG1vdmVUZXN0RGlyZWN0b3J5KG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgfSlcbiAgKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0ob2xkVGVzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cGVEZWZpbml0aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW46IFBhY2thZ2VDb25maWdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwZURlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxpYlR5cGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQHR5cGVzJyk7XG4gICAgY29uc3Qgc3JjVHlwZURpclBhdGggPVxuICAgICAgY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgPyB1bmRlZmluZWQgOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdzcmMnLCAndHlwZXMnKTtcblxuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5yZWFkZGlyKGxpYlR5cGVEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpO1xuICAgIGlmICghZGlyZW50cykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgZGlyTmFtZSA9IGRpcmVudC5uYW1lLnNsaWNlKDAsIC01KTtcbiAgICAgIGNvbnN0IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA9IGRpcmVudC5uYW1lLmVuZHNXaXRoKCcuZC50cycpO1xuICAgICAgbGV0IHBhY2thZ2VOYW1lID0gaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID8gZGlyTmFtZSA6IGRpcmVudC5uYW1lO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lLmluY2x1ZGVzKCdfXycpKSB7XG4gICAgICAgIHBhY2thZ2VOYW1lID0gYEAke3BhY2thZ2VOYW1lLnJlcGxhY2UoJ19fJywgJy8nKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzTGlicmFyeSA9IGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbi5zb21lKFxuICAgICAgICAoY29uZmlnKSA9PlxuICAgICAgICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgICApO1xuXG4gICAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbikge1xuICAgICAgICBpZiAoaGFzTGlicmFyeSkge1xuICAgICAgICAgIC8vIE1vdmUgQHR5cGVzLzxuYW1lPi9pbmRleC5kLnRzIGlmIGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUsICdpbmRleC5kLnRzJykpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzcmNUeXBlRGlyUGF0aCkge1xuICAgICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPiBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIHNyY1R5cGVEaXJQYXRoICYmICFoYXNMaWJyYXJ5KSB7XG4gICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPi5kLnRzIGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICBpZ25vcmVFbm9lbnRBc3luYygoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lLCAnaW5kZXguZC50cycpLFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGAke2RpcmVudC5uYW1lfS5kLnRzYClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogdW5rbm93bltdLCBzb3VyY2U6IHVua25vd25bXSwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duW10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldFtpbmRleF0sIG9wdGlvbnMpICYmIGlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0sIG9wdGlvbnMpKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdLCBpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cblxuZnVuY3Rpb24gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93biB7XG4gIHJldHVybiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZSwgb3B0aW9ucykgPyBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlLCBvcHRpb25zKSA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodmFsdWUpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICAvLyBwYWNrYWdlLmpzb24tc3R5bGUga2V5cyBhcmUgbm9uLWFycmF5LWluZGV4IGtleXMsIHNvIEpTT04uc3RyaW5naWZ5IHByZXNlcnZlcyB0aGlzIGluc2VydGlvbiBvcmRlci5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIC8vIGlmIHZhbHVlIGlzIGFuIG9iamVjdCwgc29ydCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IG1vdmVUb0JvdHRvbSwgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lPzogc3RyaW5nO1xuICBvbj86IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxzdHJpbmcsIEpvYj47XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICAvLyBHaXRIdWIgQWN0aW9ucyB0cmVhdHMgYGV2ZW50OiBudWxsYCBhcyBhIHZhbHVlbGVzcyBldmVudCBtYXBwaW5nLCBlLmcuXG4gIC8vIGBwdWxsX3JlcXVlc3Q6YC4gYHVuZGVmaW5lZGAgd291bGQgb21pdCB0aGUgZXZlbnQgZW50aXJlbHkgd2hlbiBkdW1waW5nIFlBTUwuXG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCBwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ2F1dG9maXguY2knLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICBwdXNoOiB7XG4gICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgfSxcbiAgfSxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBjb250ZW50czogJ3JlYWQnLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnYXV0b2ZpeC0ke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ0ZpeCBjb2RlIGF1dG9tYXRpY2FsbHknLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDoge1xuICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hdXRvZml4LnltbEBtYWluJyxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgbGludGVyIGZpeFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knIHwgJ2F1dG9maXgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZpZyBvZiBzZW1hbnRpYyBwdWxsIHJlcXVlc3RcbiAgICBjb25zdCBzZW1hbnRpY1ltbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICdzZW1hbnRpYy55bWwnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oc2VtYW50aWNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhaXNPYnNvbGV0ZUdlblByV29ya2Zsb3dGaWxlTmFtZShlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGVudHJ5Lm5hbWUpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWVTZXQgPSBuZXcgU2V0KFtcbiAgICAgICd0ZXN0LnltbCcsXG4gICAgICAnYXV0b2ZpeC55bWwnLFxuICAgICAgJ3NlbWFudGljLXByLnltbCcsXG4gICAgICAnY2xvc2UtY29tbWVudC55bWwnLFxuICAgICAgLi4uZW50cmllc1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpICYmICFpc09ic29sZXRlR2VuUHJXb3JrZmxvd0ZpbGVOYW1lKGRpcmVudC5uYW1lKVxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lU2V0KSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGNvbnN0IGtpbmQgPSBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lLCAnLnltbCcpIGFzIEtub3duS2luZDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9zaXRvcnk/LmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzT2Jzb2xldGVHZW5QcldvcmtmbG93RmlsZU5hbWUoZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15nZW4tcHIoPzotLispP1xcLnlhP21sJC91LnRlc3QoZmlsZU5hbWUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChjb25maWc6IFBhY2thZ2VDb25maWcsIHdvcmtmbG93c1BhdGg6IHN0cmluZywga2luZDogS25vd25LaW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGAke2tpbmR9LnltbGApO1xuICBjb25zdCBkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJykpO1xuXG4gIGlmIChraW5kID09PSAnYXV0b2ZpeCcpIHtcbiAgICBhd2FpdCB3cml0ZVlhbWwoZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnKSwgZmlsZVBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBuZXdTZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShraW5kIGluIHdvcmtmbG93cyA/IHdvcmtmbG93c1traW5kIGFzIGtleW9mIHR5cGVvZiB3b3JrZmxvd3NdIDoge30pIGFzIFdvcmtmbG93O1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIC8vIFNraXAgYSBicm9rZW4gd29ya2Zsb3dcbiAgaWYgKCEoJ2pvYnMnIGluIG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9ICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnO1xuICB9XG5cbiAgbGV0IGlzUmV1c2FibGVXb3JrZmxvdyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcygnL3JldXNhYmxlLXdvcmtmbG93cy8nKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCB1c2UgcmVsZWFzZS55bWwgaWYgcmVsZWFzZSBicmFuY2ggaXMgbm90IHNwZWNpZmllZFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3JlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBObyBkZWZhdWx0XG4gIH1cbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jPy53aXRoKSByZXR1cm47XG5cbiAgICAvLyBHZW5lcmF0ZSBzeW5jLWZvcmNlLnltbCBiYXNlZCBvbiBzeW5jLnltbCBpZiBpdCBleGlzdHMuXG4gICAgbmV3U2V0dGluZ3Muam9ic1snc3luYy1mb3JjZSddID0gbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IGAtLWZvcmNlICR7cGFyYW1zfWA7XG4gICAgbmV3U2V0dGluZ3MubmFtZSA9ICdGb3JjZSB0byBTeW5jJztcbiAgICBuZXdTZXR0aW5ncy5vbiA9IHsgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwgfTtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWZvcmNlLnltbCcpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgam9iLnNlY3JldHMgPz89IHt9O1xuICAvLyBVc2UgdHJ1c3RlZCBwdWJsaXNoaW5nIGluc3RlYWQgb2YgTlBNX1RPS0VOXG4gIGRlbGV0ZSBqb2Iuc2VjcmV0cy5OUE1fVE9LRU47XG5cbiAgaWYgKGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kID09PSAncmVsZWFzZScpIHtcbiAgICBqb2Iuc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgaWYgKGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOKSB7XG4gICAgam9iLnNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSA9ICcke3sgc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIH19JztcbiAgICBkZWxldGUgam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU47XG4gIH1cbiAgaWYgKFxuICAgIChqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkpIHx8XG4gICAgKGpvYi53aXRoLnNlcnZlcl91cmwgJiYga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSlcbiAgKSB7XG4gICAgam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCA9ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUxFQVNFIH19JztcbiAgfVxuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBwYXJhbXMucmVwbGFjZSgnc3luYyAnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3RlckxhYi8nLCAnV2lsbEJvb3N0ZXIvJyk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGguZG90X2Vudl9wYXRoID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGguZG90X2Vudl9wYXRoO1xuICB9XG5cbiAgLy8gRG9uJ3QgdXNlIGBmbHkgZGVwbG95IC0tanNvbmAgc2luY2UgaXQgY2F1c2VzIGFuIGVycm9yXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmIGpvYi5zZWNyZXRzLkZMWV9BUElfVE9LRU4gJiYgdHlwZW9mIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID09PSAnc3RyaW5nJykge1xuICAgIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID0gam9iLndpdGguZGVwbG95X2NvbW1hbmQucmVwbGFjZSgvXFxzKy0tanNvbi8sICcnKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSAmJiAham9iLndpdGguY2lfbGFiZWwgJiYga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9ICdsYXJnZSc7XG4gIH1cbiAgLy8gQmVjYXVzZSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5wcml2YXRlIGlzIGFsd2F5cyB0cnVlIGlmIGpvYiBpcyBzY2hlZHVsZWRcbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kID09PSAndGVzdCcgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lcjtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi5zZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gTW92ZSBzZWNyZXRzIHByb3AgYWZ0ZXIgd2l0aCBwcm9wXG4gICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKGpvYi5zZWNyZXRzKTtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBXb3JrZmxvdyB7XG4gIGlmICghY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUocHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3cpO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgY29uc3Qgc3RlcHM6IFN0ZXBbXSA9IFtcbiAgICB7IHVzZXM6ICdhY3Rpb25zL2NoZWNrb3V0QHY2JyB9LFxuICAgIHsgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NicsIHdpdGg6IHsgJ2NoZWNrLWxhdGVzdCc6IHRydWUsICdub2RlLXZlcnNpb24nOiAnbHRzLyonIH0gfSxcbiAgICAuLi4oY29uZmlnLmlzQnVuID8gW3sgdXNlczogJ292ZW4tc2gvc2V0dXAtYnVuQHYyJywgd2l0aDogeyAnYnVuLXZlcnNpb24nOiAnbGF0ZXN0JyB9IH1dIDogW10pLFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBjbGVhbnVwYCB9LFxuICBdO1xuICBpZiAoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5idWlsZCkge1xuICAgIHN0ZXBzLnB1c2goeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gYnVpbGRgIH0pO1xuICB9XG4gIHN0ZXBzLnB1c2goeyB1c2VzOiAnYXV0b2ZpeC1jaS9hY3Rpb25AdjEnIH0pO1xuXG4gIGNvbnN0IGF1dG9maXhXb3JrZmxvdyA9IHN0cnVjdHVyZWRDbG9uZShwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgY29uc3QgYXV0b2ZpeEpvYiA9IGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPz8geyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9O1xuICBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID0geyAuLi5hdXRvZml4Sm9iLCBzdGVwcyB9O1xuICByZXR1cm4gYXV0b2ZpeFdvcmtmbG93O1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0gcmVtb3ZlVHJhaWxpbmdTcGFjZXMoXG4gICAgeWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEsIG5vQ29tcGF0TW9kZTogdHJ1ZSwgc3R5bGVzOiB7ICchIW51bGwnOiAnZW1wdHknIH0gfSlcbiAgKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCB5YW1sVGV4dCk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVRyYWlsaW5nU3BhY2VzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGpzLXlhbWwgZW1pdHMgdmFsdWVsZXNzIEdpdEh1YiBBY3Rpb25zIGV2ZW50cyBhcyBgZXZlbnQ6IGAgd2hlbiB1c2luZyB0aGUgZW1wdHkgbnVsbCBzdHlsZS5cbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvWyBcXHRdKyQvZ20sICcnKTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBvcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocGFja2FnZUNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChvbGRDb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKD89XFxzfCQpL2csICdjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLig/PVxcc3wkKS9nLCAnZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKD89XFxzKS9nLCAnaS5lLicpO1xufVxuXG5mdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csIChjb21tZW50KSA9PiBmaXhUeXBvc0luVGV4dChjb21tZW50KSlcbiAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pY1xcLmZcXC4vZywgJyQxLy8kMmNmLicpXG4gICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KWVnXFwuL2csICckMS8vJDJlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8paWVcXC4vZywgJyQxLy8kMmkuZS4nKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFyb290Q29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgaWYgQUdFTlRTX0VYVFJBLm1kIGV4aXN0cyBhbmQgcmVhZCBpdHMgY29udGVudFxuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgdG9vbE5hbWVdIG9mIFtcbiAgICAgIFsnQUdFTlRTLm1kJywgJ0NvZGV4IENMSSddLFxuICAgICAgWydDTEFVREUubWQnLCAnQ2xhdWRlIENvZGUnXSxcbiAgICAgIFsnR0VNSU5JLm1kJywgJ0dlbWluaSBDTEknXSxcbiAgICBdIGFzIGNvbnN0KSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIHRvb2xOYW1lLCBleHRyYUNvbnRlbnQpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnNvclJ1bGVzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuY3Vyc29yL3J1bGVzL2dlbmVyYWwubWRjJyk7XG4gICAgY29uc3QgY3Vyc29yUnVsZXNDb250ZW50ID0gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChyb290Q29uZmlnLCBhbGxDb25maWdzLCBleHRyYUNvbnRlbnQpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGN1cnNvclJ1bGVzUGF0aCwgY3Vyc29yUnVsZXNDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBmcm9udG1hdHRlciA9IGAtLS1cXG5kZXNjcmlwdGlvbjogR2VuZXJhbCBDb2RpbmcgUnVsZXNcXG5nbG9iczpcXG5hbHdheXNBcHBseTogdHJ1ZVxcbi0tLWA7XG4gIGNvbnN0IGJvZHkgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oY29uZmlnLCBhbGxDb25maWdzLCAnQ3Vyc29yJywgZXh0cmFDb250ZW50KTtcbiAgcmV0dXJuIGAke2Zyb250bWF0dGVyfVxcblxcbiR7Ym9keX1gO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgY29uc3QgYmFzZUNvbnRlbnQgPSBgXG4jIyBQcm9qZWN0IEluZm9ybWF0aW9uXG5cbi0gTmFtZTogXFxgJHtyb290Q29uZmlnLnBhY2thZ2VKc29uPy5uYW1lIHx8ICd1bmtub3duJ31cXGBcbi0gRGVzY3JpcHRpb246ICR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb259XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn1cblxuIyMgR2VuZXJhbCBJbnN0cnVjdGlvbnNcblxuLSBDcmVhdGUgYSBuZXcgYnJhbmNoIGlmIHRoZSBjdXJyZW50IGJyYW5jaCBpcyBcXGBtYWluXFxgLlxuLSBSdW4gYW55IFxcYGdpdFxcYCBjb21tYW5kcyBzZXF1ZW50aWFsbHkuXG4tIFdyaXRlIHRlc3RzIE9OTFkgaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQuIElmIHJlcXVlc3RlZCwgZm9sbG93IHRoZXNlIHJ1bGVzOlxuICAtIENvbnRpbnVlIG1vZGlmeWluZyB0ZXN0cyBhbmQvb3IgY29kZSB1bnRpbCBhbGwgdGVzdHMgcGFzcy5cbiAgLSBFbnN1cmUgdGVzdHMgYXJlIGlkZW1wb3RlbnQgYW5kIGluZGVwZW5kZW50IChlLmcuLCByZXNldCBwZXJzaXN0ZW50IGRhdGEpIHNvIHRoZXkgY2FuIHJ1biByZXBlYXRlZGx5IG9yIGluIHBhcmFsbGVsLlxuICAtIFByZWZlciBhY3R1YWwgQVBJIGNhbGxzIG92ZXIgbW9ja3MsIHVubGVzcyBhY3R1YWwgY2FsbHMgYXJlIGltcHJhY3RpY2FsLCBoYXZlIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzLCBvciBtb2NrcyBhcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4gIC0gQWx3YXlzIGludmVzdGlnYXRlIHRoZSByb290IGNhdXNlIG9mIGEgdGVzdCBmYWlsdXJlIGJlZm9yZSBmaXhpbmcgaXQuXG4gIC0gQXZvaWQgYWRkaW5nIHdhaXQgZnVuY3Rpb25zIGluIEUyRSB0ZXN0cyB1bmxlc3Mgc3RyaWN0bHkgbmVjZXNzYXJ5LlxuLSBXaGVuIGZpeGluZyBpc3N1ZXMsIGZvbGxvdyB0aGVzZSBydWxlczpcbiAgLSBJbnZlc3RpZ2F0ZSB0aGUgcm9vdCBjYXVzZSBmaXJzdCAoZS5nLiwgYnkgZ2F0aGVyaW5nIGRlYnVnIGxvZ3MsIHRha2luZyBzY3JlZW5zaG90cywgZXRjLikuXG4gIC0gRml4IHRoZSBhY3R1YWwgcm9vdCBjYXVzZSBpbnN0ZWFkIG9mIGFwcGx5aW5nIHdvcmthcm91bmRzLlxuLSBBZnRlciBtYWtpbmcgY29kZSBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gdmVyaWZ5LWZ1bGxcXGAgdG8gZXhlY3V0ZSBhbGwgdGVzdHMgKHRha2VzIHVwIHRvIDEgaG91ciksIG9yIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHZlcmlmeVxcYCBmb3Igb25seSB0eXBlIGNoZWNraW5nIGFuZCBsaW50aW5nICh0YWtlcyB1cCB0byAxMCBtaW51dGVzKS5cbiAgLSBJZiB5b3UgYXJlIGNvbmZpZGVudCB0aGF0IHlvdXIgY2hhbmdlcyB3aWxsIG5vdCBicmVhayBhbnkgdGVzdHMsIHlvdSBtYXkgdXNlIFxcYHZlcmlmeVxcYC5cbiAgLSBVc2UgXFxgb3hsaW50XFxgIGlnbm9yZSBjb21tZW50cyB3aXRoIHJlYXNvbnMgKGUuZy4sIFxcYC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSA8cnVsZT4gLS0gPHJlYXNvbj5cXGApIGlmIGxpbnQgZXJyb3JzIG9yIHdhcm5pbmdzIGNhbm5vdCBiZSBmaXhlZC5cbi0gT25jZSB5b3UgaGF2ZSB2ZXJpZmllZCB5b3VyIGNoYW5nZXMsIGNvbW1pdCBhbmQgcHVzaCB0aGVtIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoLCB0aGVuIGNyZWF0ZSBhIFBSIHZpYSBcXGBnaFxcYC5cbiAgLSBGb2xsb3cgdGhlIGNvbnZlbnRpb25hbCBjb21taXRzOyB5b3VyIGNvbW1pdCBtZXNzYWdlIHNob3VsZCBzdGFydCB3aXRoIFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgLCBldGMuXG4gIC0gSWYgbm90IHNwZWNpZmllZCwgbWFrZSBzdXJlIHRvIGFkZCBhIG5ldyBsaW5lIGF0IHRoZSBlbmQgb2YgeW91ciBjb21taXQgbWVzc2FnZSR7cm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwbyA/IGAgd2l0aDogXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGBgIDogJyd9LlxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHMuIEF2b2lkIHVzaW5nIFxcYC0tYW1lbmRcXGAuXG4tIEFsd2F5cyB1c2UgaGVyZWRvYyBzeW50YXggd2hlbiBwYXNzaW5nIG11bHRpLWxpbmUgY29udGVudCB0byBhbnkgY29tbWFuZC5cbiR7aGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoYWxsQ29uZmlncykgPyBgLSBVc2UgXFxgd2Igc3RhcnQgLS1tb2RlIHRlc3RcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYCA6ICcnfVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IGhhc05ld1NlY3Rpb24gPSBleHRyYUNvbnRlbnQ/LnRyaW0oKS5zdGFydHNXaXRoKCcjJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnRcbiAgICA/IGhhc05ld1NlY3Rpb25cbiAgICAgID8gJ1xcblxcbicgKyBleHRyYUNvbnRlbnQudHJpbSgpXG4gICAgICA6ICdcXG4nICsgZXh0cmFDb250ZW50XG4gICAgOiAnJztcbiAgcmV0dXJuIGJhc2VDb250ZW50ICsgbm9ybWFsaXplZEV4dHJhQ29udGVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmcge1xuICAvLyBLZWVwIHRvcC1kb3duIG9yZGVyaW5nIGd1aWRhbmNlIGZ1bmN0aW9uLW9ubHkgYmVjYXVzZSBjbGFzc2VzIGFyZSBub3QgaG9pc3RlZCBhbmQgY2FuIGZhaWwgd2hlbiBpbmhlcml0YW5jZSBvciB0b3AtbGV2ZWwgaW5zdGFudGlhdGlvbiBkZXBlbmRzIG9uIGRlY2xhcmF0aW9uIG9yZGVyLlxuICByZXR1cm4gYFxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gVXNlIGNhbWVsQ2FzZSBmb3IgSmF2YVNjcmlwdCBhbmQgVHlwZVNjcmlwdCBmaWxlcyAob3IgUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cykuXG4tIFNpbXBsaWZ5IGNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS5cbi0gRGVzaWduIGVhY2ggbW9kdWxlIHdpdGggaGlnaCBjb2hlc2lvbiwgZ3JvdXBpbmcgcmVsYXRlZCBmdW5jdGlvbmFsaXR5IHRvZ2V0aGVyLlxuICAtIFJlZmFjdG9yIGV4aXN0aW5nIGxhcmdlIG1vZHVsZXMgaW50byBzbWFsbGVyLCBmb2N1c2VkIG1vZHVsZXMgd2hlbiBuZWNlc3NhcnkuXG4gIC0gQ3JlYXRlIHdlbGwtb3JnYW5pemVkIGRpcmVjdG9yeSBzdHJ1Y3R1cmVzIHdpdGggbG93IGNvdXBsaW5nIGFuZCBoaWdoIGNvaGVzaW9uLlxuLSBQbGFjZSBjYWxsaW5nIGZ1bmN0aW9ucyBhYm92ZSB0aGUgZnVuY3Rpb25zIHRoZXkgY2FsbCB0byBtYWludGFpbiBhIGNsZWFyIHRvcC1kb3duIG9yZGVyLlxuICAtIGUuZy4sIFxcYGZ1bmN0aW9uIGNhbGxlcigpIHsgY2FsbGVlKCk7IH0gZnVuY3Rpb24gY2FsbGVlKCkgeyAuLi4gfVxcYFxuICAtIFVubGlrZSBmdW5jdGlvbnMsIHBsYWNlIHZhcmlhYmxlIGFuZCB0eXBlIGRlY2xhcmF0aW9ucyBBQk9WRSB0aGVpciB1c2FnZS5cbi0gV3JpdGUgY29tbWVudHMgYW5kIEpTRG9jIGZvciBjb21wbGV4IG9yIGhhcmQtdG8tdW5kZXJzdGFuZCBjb2RlLlxuICAtIEV4cGxhaW4gXCJ3aHlcIiBpbiBjb21tZW50cyBhbmQgXCJ3aGF0XCIgaW4gSlNEb2MuXG4gIC0gQXZvaWQgc3RhdGluZyB3aGF0IGNhbiBiZSBlYXNpbHkgdW5kZXJzdG9vZCBmcm9tIHRoZSBjb2RlIGl0c2VsZi5cbi0gUHJlZmVyIFxcYHVuZGVmaW5lZFxcYCBvdmVyIFxcYG51bGxcXGAgdW5sZXNzIGV4cGxpY2l0bHkgcmVxdWlyZWQgYnkgQVBJcyBvciBsaWJyYXJpZXMuXG4tIFByZWZlciB1c2luZyBhIHNpbmdsZSB0ZW1wbGF0ZSBsaXRlcmFsIGZvciBwcm9tcHRzIGluc3RlYWQgb2YgXFxgam9pbigpXFxgIHdpdGggYSBwcmUtY29tcHV0YWJsZSBhcnJheSBsaXRlcmFsIG9mIHN0cmluZ3MuXG4tIEFzc3VtZSB0aGF0IGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHByb3Blcmx5IGRlZmluZWQuXG4gIC0gSWYgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCwgdXNlIFxcYGFzc2VydFxcYCB0byBmYWlsIGZhc3QgKGUuZy4sIGR1cmluZyBzdGFydHVwKS5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gV2hlbiBpbnRyb2R1Y2luZyBuZXcgc3RyaW5nIGxpdGVyYWxzIGluIFJlYWN0IGNvbXBvbmVudHMsIHVwZGF0ZSB0aGUgbGFuZ3VhZ2UgcmVzb3VyY2UgZmlsZXMgaW4gdGhlIFxcYGkxOG5cXGAgZGlyZWN0b3J5IChlLmcuLCBcXGBpMThuL2phLUpQLmpzb25cXGApLiBSZWZlcmVuY2UgdGhlc2Ugc3RyaW5ncyB1c2luZyB0aGUgXFxgaTE4blxcYCB1dGlsaXR5LiBGb3IgZXhhbXBsZSwgdXNlIFxcYGkxOG4ucGFnZXMuaG9tZS50aXRsZSgpXFxgIGZvciBcXGB7IFwicGFnZXNcIjogeyBcImhvbWVcIjogeyBcInRpdGxlXCI6IFwiTXkgQXBwXCIgfSB9IH1cXGAuYFxuICAgIDogJydcbn1cblxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gUHJlZmVyIGxhbWJkYSBvdmVyIFxcYGZ1bmN0aW9uXFxgIGZvciBSZWFjdCBjb21wb25lbnRzLCBlLmcuLCBcXGBjb25zdCBCdXR0b246IFJlYWN0LkZDID0gKCkgPT4ge1xcYC5cbi0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIGZvciBzdG9yaW5nIGFuIGFycmF5IG9yIGFuIG9iamVjdCB0byBcXGB1c2VTdGF0ZVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYFxuLSBTaW5jZSB0aGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgXFxgdXNlQ2FsbGJhY2tcXGAgb3IgXFxgdXNlTWVtb1xcYCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxuLSBBc3N1bWUgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UuXG5gXG4gICAgOiAnJ1xufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdzbW9sLXRvbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBCdW5maWdUb21sIHtcbiAgaW5zdGFsbD86IHtcbiAgICBleGFjdD86IGJvb2xlYW47XG4gIH07XG4gIHJ1bj86IHtcbiAgICBidW4/OiBib29sZWFuO1xuICB9O1xufVxuXG5jb25zdCBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuICAvLyAtLS0tLS0tLS0tIFNUQVJUOiBXZSBiZWxpZXZlIG91ciBwYWNrYWdlcyBhcmUgc2FmZSAtLS0tLS0tLS0tXG4gICdAZXhlcmNvZGUvcHJvYmxlbS11dGlscycsXG4gICdAd2lsbGJvb3N0ZXIvYWdlbnQtc2tpbGxzJyxcbiAgJ0B3aWxsYm9vc3Rlci9iYWJlbC1jb25maWdzJyxcbiAgJ0B3aWxsYm9vc3Rlci9tb25hY28tbG9hZGVyJyxcbiAgJ0B3aWxsYm9vc3Rlci9tb25hY28tcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItYmxpdHotbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL3diJyxcbiAgJ2FnZW50LXJ1bnRpbWUta2l0JyxcbiAgJ2F0LWRlY29yYXRvcnMnLFxuICAnYnVpbGQtdHMnLFxuICAnZ2VuLWkxOG4tdHMnLFxuICAnb25lLXdheS1naXQtc3luYycsXG4gIC8vIC0tLS0tLS0tLS0gRU5EOiBXZSBiZWxpZXZlIG91ciBwYWNrYWdlcyBhcmUgc2FmZSAtLS0tLS0tLS0tXG5cbiAgLy8gd2JmeSBwaW5zIHRoZXNlIHRvb2xpbmcgcGFja2FnZXMgYW5kIG1heSBhcHBseSB0aGVtIGltbWVkaWF0ZWx5IGFmdGVyIGFcbiAgLy8gcmVsZWFzZSwgYmVmb3JlIHRoZSBnbG9iYWwgbWluaW11bS1yZWxlYXNlLWFnZSB3aW5kb3cgaGFzIGVsYXBzZWQuXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldycsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy1kYXJ3aW4tYXJtNjQnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctZGFyd2luLXg2NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy1saW51eC1hcm0nLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctbGludXgtYXJtNjQnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctbGludXgteDY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LXdpbjMyLWFybTY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LXdpbjMyLXg2NCcsXG4gICdveGZtdCcsXG4gICdAb3hmbXQvYmluZGluZy1hbmRyb2lkLWFybS1lYWJpJyxcbiAgJ0BveGZtdC9iaW5kaW5nLWFuZHJvaWQtYXJtNjQnLFxuICAnQG94Zm10L2JpbmRpbmctZGFyd2luLWFybTY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWRhcndpbi14NjQnLFxuICAnQG94Zm10L2JpbmRpbmctZnJlZWJzZC14NjQnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtLWdudWVhYmloZicsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1hcm0tbXVzbGVhYmloZicsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1hcm02NC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtNjQtbXVzbCcsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1wcGM2NC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtcmlzY3Y2NC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtcmlzY3Y2NC1tdXNsJyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXMzOTB4LWdudScsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC14NjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXg2NC1tdXNsJyxcbiAgJ0BveGZtdC9iaW5kaW5nLW9wZW5oYXJtb255LWFybTY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLXdpbjMyLWFybTY0LW1zdmMnLFxuICAnQG94Zm10L2JpbmRpbmctd2luMzItaWEzMi1tc3ZjJyxcbiAgJ0BveGZtdC9iaW5kaW5nLXdpbjMyLXg2NC1tc3ZjJyxcbiAgJ294bGludCcsXG4gICdAb3hsaW50L2JpbmRpbmctYW5kcm9pZC1hcm0tZWFiaScsXG4gICdAb3hsaW50L2JpbmRpbmctYW5kcm9pZC1hcm02NCcsXG4gICdAb3hsaW50L2JpbmRpbmctZGFyd2luLWFybTY0JyxcbiAgJ0BveGxpbnQvYmluZGluZy1kYXJ3aW4teDY0JyxcbiAgJ0BveGxpbnQvYmluZGluZy1mcmVlYnNkLXg2NCcsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtYXJtLWdudWVhYmloZicsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtYXJtLW11c2xlYWJpaGYnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybTY0LWdudScsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtYXJtNjQtbXVzbCcsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtcHBjNjQtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1yaXNjdjY0LWdudScsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtcmlzY3Y2NC1tdXNsJyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1zMzkweC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXg2NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXg2NC1tdXNsJyxcbiAgJ0BveGxpbnQvYmluZGluZy1vcGVuaGFybW9ueS1hcm02NCcsXG4gICdAb3hsaW50L2JpbmRpbmctd2luMzItYXJtNjQtbXN2YycsXG4gICdAb3hsaW50L2JpbmRpbmctd2luMzItaWEzMi1tc3ZjJyxcbiAgJ0BveGxpbnQvYmluZGluZy13aW4zMi14NjQtbXN2YycsXG4gICdveGxpbnQtdHNnb2xpbnQnLFxuICAnQG94bGludC10c2dvbGludC9kYXJ3aW4tYXJtNjQnLFxuICAnQG94bGludC10c2dvbGludC9kYXJ3aW4teDY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvbGludXgtYXJtNjQnLFxuICAnQG94bGludC10c2dvbGludC9saW51eC14NjQnLFxuICAnQG94bGludC10c2dvbGludC93aW4zMi1hcm02NCcsXG4gICdAb3hsaW50LXRzZ29saW50L3dpbjMyLXg2NCcsXG4gICdAbmV4dC9lbnYnLFxuICAnQG5leHQvZm9udCcsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC1hcm02NC1nbnUnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgtYXJtNjQtbXVzbCcsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC14NjQtZ251JyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LXg2NC1tdXNsJyxcbiAgJ0BuZXh0L3N3Yy1hbmRyb2lkLWFybS1lYWJpJyxcbiAgJ0BuZXh0L3N3Yy1hbmRyb2lkLWFybTY0JyxcbiAgJ0BuZXh0L3N3Yy1kYXJ3aW4tYXJtNjQnLFxuICAnQG5leHQvc3djLWRhcndpbi14NjQnLFxuICAnQG5leHQvc3djLWZyZWVic2QteDY0JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ0BuZXh0L3N3Yy1saW51eC1hcm02NC1nbnUnLFxuICAnQG5leHQvc3djLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG5leHQvc3djLWxpbnV4LXg2NC1nbnUnLFxuICAnQG5leHQvc3djLWxpbnV4LXg2NC1tdXNsJyxcbiAgJ0BuZXh0L3N3Yy13YXNtLW5vZGVqcycsXG4gICdAbmV4dC9zd2Mtd2FzbS13ZWInLFxuICAnQG5leHQvdGhpcmQtcGFydGllcycsXG4gICduZXh0JyxcbiAgJ3JlYWN0JyxcbiAgJ3JlYWN0LWRvbScsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgPyBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29udGVudCA9IG5ld0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgbmV3Q29udGVudCA9IChleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGJ1bmZpZ1RvbWwgPSBwYXJzZUJ1bmZpZ1RvbWwoZXhpc3RpbmdDb250ZW50KTtcbiAgcmV0dXJuIGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuJHtnZW5lcmF0ZVJ1blNlY3Rpb24oYnVuZmlnVG9tbCl9XG5baW5zdGFsbF1cbmV4YWN0ID0gJHtidW5maWdUb21sPy5pbnN0YWxsPy5leGFjdCA9PT0gZmFsc2UgPyAnZmFsc2UnIDogJ3RydWUnfVxubGlua2VyID0gXCJob2lzdGVkXCJcbm1pbmltdW1SZWxlYXNlQWdlID0gNDMyMDAwICMgNSBkYXlzXG5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuJHttaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLm1hcCgocGFja2FnZU5hbWUpID0+IGAgICAgXCIke3BhY2thZ2VOYW1lfVwiLGApLmpvaW4oJ1xcbicpfVxuXVxuYDtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlQnVuZmlnVG9tbChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb250ZW50KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBwYXJzZShjb250ZW50KSBhcyBCdW5maWdUb21sO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUnVuU2VjdGlvbihidW5maWdUb21sOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBidW5maWdUb21sPy5ydW4/LmJ1biA9PT0gJ2Jvb2xlYW4nID8gYFtydW5dXFxuYnVuID0gJHtidW5maWdUb21sLnJ1bi5idW59XFxuYCA6ICcnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2Rl44Gn44Gvbm9kZV9tb2R1bGVz44KSQ09QWeOBmeOCi+W/heimgeOBjOOBguOCi+OBn+OCgeOAgW5vZGVfbW9kdWxlc+OCkumZpOWkluOBl+OBpuOBr+OBhOOBkeOBquOBhOOAglxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5pZGVhXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gIGNvZGVXaXRoMkluZGVudFNpemU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3BwJyxcbiAgICAnZGFydCcsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdwdScsXG4gICAgJ3B1bWwnLFxuICAgICdyYicsXG4gICAgJ3Z1ZScsXG4gICAgJ3htbCcsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdzaCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAnamF2YScsICdweSddLnRvU29ydGVkKCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnRvU29ydGVkKCksXG4gIG94bGludDogWydhc3RybycsICdjanMnLCAnY3RzJywgJ2pzJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3N2ZWx0ZScsICd0cycsICd0c3gnLCAndnVlJ10udG9Tb3J0ZWQoKSxcbiAgb3hmbXQ6IFtcbiAgICAnYXN0cm8nLFxuICAgICdjanMnLFxuICAgICdjc3MnLFxuICAgICdjdHMnLFxuICAgICdncWwnLFxuICAgICdncmFwaHFsJyxcbiAgICAnaGJzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ2pzJyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdqc3gnLFxuICAgICdsZXNzJyxcbiAgICAnbWQnLFxuICAgICdtZHgnLFxuICAgICdtanMnLFxuICAgICdtdHMnLFxuICAgICdzY3NzJyxcbiAgICAnc3ZlbHRlJyxcbiAgICAndG9tbCcsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgcHJldHRpZXJPbmx5OiBbJ2phdmEnXS50b1NvcnRlZCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCIvLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBOYW1lc3BhY2UgWUFNTCBjYWxscyBtYWtlIGxvYWQvZHVtcCB1c2FnZSBjbGVhcmVyLlxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUgfSBmcm9tICcuL2FnZW50cy5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gIGhhdmVfZnVuOiB0cnVlLFxuICBjb2RlX3Jldmlldzoge1xuICAgIGRpc2FibGU6IGZhbHNlLFxuICAgIGNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkOiAnTUVESVVNJyxcbiAgICBtYXhfcmV2aWV3X2NvbW1lbnRzOiAtMSxcbiAgICBwdWxsX3JlcXVlc3Rfb3BlbmVkOiB7XG4gICAgICBoZWxwOiBmYWxzZSxcbiAgICAgIHN1bW1hcnk6IHRydWUsXG4gICAgICBjb2RlX3JldmlldzogdHJ1ZSxcbiAgICB9LFxuICB9LFxuICBpZ25vcmVfcGF0dGVybnM6IFsnKiovX19nZW5lcmF0ZWRfXyddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2VtaW5pQ29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueW1sJyk7XG4gICAgY29uc3Qgc3R5bGVndWlkZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzdHlsZWd1aWRlLm1kJyk7XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoZGVmYXVsdENvbmZpZyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShjb25maWdGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSBwYXJzZWRcbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChuZXdDb25maWcsIHtcbiAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuICAgIGNvbnN0IGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnQ/LnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoJyMnKSA/IHVuZGVmaW5lZCA6IGV4dHJhQ29udGVudDtcbiAgICBjb25zdCByZXZpZXdMYW5ndWFnZUluc3RydWN0aW9uID0gY29uZmlnLmlzUHVibGljUmVwb1xuICAgICAgPyAnUmV2aWV3IGluIEVuZ2xpc2ggYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjb2Rpbmcgc3RhbmRhcmRzLidcbiAgICAgIDogJ+S7peS4i+OBruOCs+ODvOODh+OCo+ODs+OCsOimj+e0hOOCkui4j+OBvuOBiOOBpuOAgeaXpeacrOiqnuOBp+ODrOODk+ODpeODvOOBl+OBpuOBj+OBoOOBleOBhOOAgic7XG4gICAgY29uc3Qgc3R5bGVndWlkZUNvbnRlbnQgPSBgJHtyZXZpZXdMYW5ndWFnZUluc3RydWN0aW9ufVxcblxcbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3MpfSR7XG4gICAgICBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID8gYFxcbiR7Y29kaW5nUnVsZUV4dHJhQ29udGVudC50cmltRW5kKCl9YCA6ICcnXG4gICAgfWA7XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGNvbmZpZ0ZpbGVQYXRoLCB5YW1sQ29udGVudCkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoc3R5bGVndWlkZUZpbGVQYXRoLCBzdHlsZWd1aWRlQ29udGVudCkpLFxuICAgIF07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbWluaVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIERvIG5vdCByZW1vdmUgYHdpbmRvd3NgOiBnZW5lcmF0ZWQgLmdpdGlnbm9yZSBmaWxlcyBtdXN0IGtlZXAgaWdub3JpbmcgV2luZG93cy1jcmVhdGVkIGxvY2FsIGFydGlmYWN0cy5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuIS5rZWVwXG4uYWlkZXIqXG4uZW52LnByb2R1Y3Rpb25cbiovbW91bnQvKi5oYXNoXG4uZGV2Y29udGFpbmVyL1xuLmlkZWEvQXVnbWVudFdlYnZpZXdTdGF0ZVN0b3JlLnhtbFxuLmlkZWEvY29waWxvdC4qXG4uaWRlYS9jb3BpbG90L2NoYXRTZXNzaW9ucy9cbi5wbGF5d3JpZ2h0LWNsaS9cbi5zZXJlbmEvXG4udG1wL1xuLndiL1xuX19nZW5lcmF0ZWRfXy9cbkB3aWxsYm9vc3Rlci9cbmRpc3QvXG5kcml6emxlL21vdW50L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Hb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkphdmEoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5KYXZhIHx8IGNvbmZpZy5kb2VzQ29udGFpbkphdmFJblBhY2thZ2VzO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZykpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuXG5mdW5jdGlvbiBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2RvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBleHRlbnNpb25zLm94Zm10Lm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9veGZtdCAtLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gISoqL3BhY2thZ2UuanNvbicsICdPeGZtdCcsIGV4dCkpLmpvaW4oJycpIDogJyd9XG4ke2RvZXNDb250YWluSmF2YShjb25maWcpID8gZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdub2RlJywgJ25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZScsICdQcmV0dGllcicsIGV4dCkpLmpvaW4oJycpIDogJyd9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbkkxOG5Uc0NvbW1hbmQoXG4gIGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGVwZW5kaW5nJyB8ICdpc0J1bic+LFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8ICFzY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBgJHtjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJ30gcnVuIGdlbi1pMThuLXRzID4gL2Rldi9udWxsYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQsIGFyZ3MsIGN3ZCwgcmV0cnkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiBudW1iZXIge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgY29uc3Qgc3RhdHVzID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgIGlmIChzdGF0dXMgPT09IDApIGJyZWFrO1xuICAgIGlmIChyZXRyeSA8PSAwKSByZXR1cm4gc3RhdHVzO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0ZG91dChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRlcnIgb24gRU5PRU5ULlxuICBjb25zdCBzdGRlcnIgPSBwcm9jLnN0ZGVyciA/PyAnJztcbiAgY29uc3QgZXJyb3IgPSB0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJyA/IHN0ZGVyci50cmltKCkgOiBzdGRlcnIudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChwcm9jLmVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gZmFpbGVkIHdpdGg6ICR7cHJvYy5lcnJvci5tZXNzYWdlfWApO1xuICB9IGVsc2UgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBvdXRwdXRzIHRoZSBmb2xsb3dpbmcgY29udGVudCB0byBzdGRlcnI6XFxuJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZG91dCBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZG91dCA9IHByb2Muc3Rkb3V0ID8/ICcnO1xuICByZXR1cm4gdHlwZW9mIHN0ZG91dCA9PT0gJ3N0cmluZycgPyBzdGRvdXQudHJpbSgpIDogc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ1tdLCBTcGF3blN5bmNPcHRpb25zXSB7XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgLy8gUmVtb3ZlIGJlcnJ5IGZyb20gUEFUSFxuICBpZiAoZW52LlBBVEggJiYgZW52LkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRILnNwbGl0KCc6JylcbiAgICAgIC5maWx0ZXIoKHApID0+IHAgIT09IGVudi5CRVJSWV9CSU5fRk9MREVSKVxuICAgICAgLmpvaW4oJzonKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIGNvbnN0IGtleSA9IG93bmVyID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gICAgZ2V0R2l0SHViQ2xpVG9rZW4oKVxuICApO1xufVxuXG5sZXQgZ2l0SHViQ2xpVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0R2l0SHViQ2xpVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGdpdEh1YkNsaVRva2VuICE9PSB1bmRlZmluZWQpIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTb21lIGxvY2FsIHJ1bnMgcmVseSBvbiBHaXRIdWIgQ0xJIGF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZXhwb3J0ZWQgZW52IHRva2Vucy5cbiAgICBnaXRIdWJDbGlUb2tlbiA9XG4gICAgICBjaGlsZFByb2Nlc3NcbiAgICAgICAgLmV4ZWNGaWxlU3luYygnZ2gnLCBbJ2F1dGgnLCAndG9rZW4nXSwge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICAgIH0pXG4gICAgICAgIC50cmltKCkgfHwgJyc7XG4gIH0gY2F0Y2gge1xuICAgIGdpdEh1YkNsaVRva2VuID0gJyc7XG4gIH1cbiAgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IFtcbiAgJ0B0c2NvbmZpZy9idW4nLFxuICAnQHRzY29uZmlnL25vZGUtbHRzJyxcbiAgJ0B0c2NvbmZpZy9ub2RlLXRzJyxcbiAgJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnLFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9idW4vdHNjb25maWcuanNvbic7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUvdHNjb25maWcuanNvbic7XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzL3RzY29uZmlnLmpzb24nLCAnQHRzY29uZmlnL25vZGUtdHMvdHNjb25maWcuanNvbiddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzJywgJ0B0c2NvbmZpZy9ub2RlLXRzJ107XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiZcbiAgICAhY29uZmlnLmlzUm9vdCAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8ucHJpdmF0ZSAhPT0gdHJ1ZSAmJlxuICAgIEFycmF5LmlzQXJyYXkoY29uZmlnLnBhY2thZ2VKc29uPy5maWxlcykgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24uZmlsZXMubGVuZ3RoID4gMFxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdldEdlbkkxOG5Uc0NvbW1hbmQgfSBmcm9tICcuLi91dGlscy9nZW5JMThuVHMuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5jb25zdCBveGxpbnREZXBzID0gWydAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJywgJ294Zm10JywgJ294bGludCcsICdveGxpbnQtdHNnb2xpbnQnXTtcbmNvbnN0IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgPSAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnO1xuY29uc3QgdHlwZXNjcmlwdERlcGVuZGVuY3kgPSAndHlwZXNjcmlwdCc7XG5jb25zdCB3YkRlcGVuZGVuY3kgPSAnQHdpbGxib29zdGVyL3diJztcbmNvbnN0IGJ1aWxkVHNEZXBlbmRlbmN5ID0gJ2J1aWxkLXRzJztcbmNvbnN0IHdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMgPSBbXG4gICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyxcbiAgLi4ub3hsaW50RGVwcy5maWx0ZXIoKGRlcGVuZGVuY3kpID0+IGRlcGVuZGVuY3kuc3RhcnRzV2l0aCgnQHdpbGxib29zdGVyLycpKSxcbl07XG5jb25zdCBvYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMgPSBbXG4gICdAYmlvbWVqcy9iaW9tZScsXG4gICdAZXNsaW50LXJlYWN0L2VzbGludC1wbHVnaW4nLFxuICAnQGVzbGludC9qcycsXG4gICdAbmV4dC9lc2xpbnQtcGx1Z2luLW5leHQnLFxuICAnQHR5cGVzL2VzbGludCcsXG4gICdAdHlwZXMvbWljcm9tYXRjaCcsXG4gICdAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpbicsXG4gICdAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyJyxcbiAgJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctYmxpdHotbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyxcbiAgJ2Jpb21lJyxcbiAgJ2VzbGludCcsXG4gICdlc2xpbnQtY29uZmlnLWZsYXQtZ2l0aWdub3JlJyxcbiAgJ2VzbGludC1jb25maWctbmV4dCcsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItbm9kZScsXG4gICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLXR5cGVzY3JpcHQnLFxuICAnZXNsaW50LXBsdWdpbi1pbXBvcnQnLFxuICAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsXG4gICdlc2xpbnQtcGx1Z2luLXBlcmZlY3Rpb25pc3QnLFxuICAnZXNsaW50LXBsdWdpbi1wcmV0dGllcicsXG4gICdlc2xpbnQtcGx1Z2luLXJlYWN0JyxcbiAgJ2VzbGludC1wbHVnaW4tcmVhY3QtY29tcGlsZXInLFxuICAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcycsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtY2xhc3MtbWVtYmVycycsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtZGVzdHJ1Y3R1cmUta2V5cycsXG4gICdlc2xpbnQtcGx1Z2luLXN0b3J5Ym9vaycsXG4gICdlc2xpbnQtcGx1Z2luLXVuaWNvcm4nLFxuICAnZXNsaW50LXBsdWdpbi11bnVzZWQtaW1wb3J0cycsXG4gICdnbG9iYWxzJyxcbiAgJ21pY3JvbWF0Y2gnLFxuICAndHlwZXNjcmlwdC1lc2xpbnQnLFxuXTtcbmNvbnN0IG1pY3JvbWF0Y2hQYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsnbWljcm9tYXRjaCcsICdAdHlwZXMvbWljcm9tYXRjaCddKTtcbmNvbnN0IG1pY3JvbWF0Y2hJbXBvcnRQYXR0ZXJuID1cbiAgL1xcYmZyb21cXHMrWydcIl1taWNyb21hdGNoWydcIl18XFxicmVxdWlyZVxcKFxccypbJ1wiXW1pY3JvbWF0Y2hbJ1wiXVxccypcXCl8XFxiaW1wb3J0XFwoXFxzKlsnXCJdbWljcm9tYXRjaFsnXCJdXFxzKlxcKS91O1xuXG5jb25zdCBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5cbnR5cGUgV3JpdGFibGVQYWNrYWdlSnNvbiA9IFNldFJlcXVpcmVkPFxuICBQYWNrYWdlSnNvbixcbiAgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJ1xuPjtcblxuaW50ZXJmYWNlIERlcGVuZGVuY3lVcGRhdGVzIHtcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgZGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uT2JqID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoY29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgdXBkYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmosIHBhY2thZ2VNYW5hZ2VyKTtcbiAgbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iaik7XG4gIGNvbnN0IGRlcGVuZGVuY3lVcGRhdGVzID0gYXdhaXQgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gIGF3YWl0IHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqKTtcbiAgcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaik7XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIC8vIFlhcm4gcmVhZHMgcGFja2FnZS5qc29uIGZyb20gZGlzayBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciBgeWFybiBhZGQgLURgXG4gIC8vIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHJlZ3VsYXIgZGVwZW5kZW5jeSwgc28gdGhpcyB3cml0ZSBtdXN0IGZpbmlzaFxuICAvLyBiZWZvcmUgaW5zdGFsbGluZyB0aGUgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZXMgYmVsb3cuIEtlZXAgdGhpcyBiYXNlbGluZVxuICAvLyBmaWxlIHNvcnRlZCBldmVuIHdoZW4gd2UgbGF0ZXIgcnVuIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIGZvcm1hdHRlciBzbyBhXG4gIC8vIG1pZC1ydW4gaW50ZXJydXB0aW9uIG5ldmVyIGxlYXZlcyBwYWNrYWdlLmpzb24gaW4gYSBwYXJ0aWFsbHkgbWFuYWdlZCBvcmRlci5cbiAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iaikpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoY29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcywgcGFja2FnZU1hbmFnZXIpO1xuICAgIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwgZmlsZVBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBzdHJpbmcge1xuICAvLyBmc1V0aWwuZ2VuZXJhdGVGaWxlKCkgbm9ybWFsaXplcyB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28ga2VlcCB0aGUgc2VyaWFsaXplclxuICAvLyBmb2N1c2VkIG9uIHRoZSBKU09OIHBheWxvYWQgaXRzZWxmLlxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKGpzb25PYmopLCB1bmRlZmluZWQsIDIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8V3JpdGFibGVQYWNrYWdlSnNvbj4ge1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyA/PyB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID8/IHt9O1xuICByZXR1cm4ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVTY3JpcHRzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyhqc29uT2JqLnNjcmlwdHMpO1xuXG4gIGpzb25PYmouc2NyaXB0cyA9IHsgLi4uanNvbk9iai5zY3JpcHRzLCAuLi5nZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqLnNjcmlwdHMpIH07XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3N0YXJ0LXRlc3Qtc2VydmVyJ107XG4gIGFkZEluc3RhbGxTdGVwVG9DaGVja0ZvckFpKGpzb25PYmouc2NyaXB0cywgcGFja2FnZU1hbmFnZXIpO1xuXG4gIGNvbnN0IHNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHM7XG4gIGlmIChjb25maWcuaXNCdW4gfHwgIWRvZXNDb250YWluSmF2YShjb25maWcpKSB7XG4gICAgZGVsZXRlIHNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAgc2NyaXB0cy5wcmV0dGlmeSA9IChzY3JpcHRzLnByZXR0aWZ5ID8/ICcnKSArIChhd2FpdCBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGNvbmZpZy5kaXJQYXRoKSk7XG4gIH1cbiAgbm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzKHNjcmlwdHMpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVMZWdhY3lJbnN0YWxsQ29tbWFuZHMoc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAvLyBGcmVzaCByZXBvcyBzdGlsbCByZXF1aXJlIHN0YW5kYWxvbmUgYHlhcm4gaW5zdGFsbGA7IG9ubHkgcmVtb3ZlIGxlZ2FjeSBpbnN0YWxsIHByZWZpeGVzIGJlZm9yZSBhbm90aGVyIGNvbW1hbmQuXG4gICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnZ2l0IGNsb25lJykpIHtcbiAgICAgIHNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoL3lhcm5cXHMqKD86aW5zdGFsbFxccyopPyYmXFxzKi9ndSwgJycpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRJbnN0YWxsU3RlcFRvQ2hlY2tGb3JBaShzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLCBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybicpOiB2b2lkIHtcbiAgaWYgKCEoJ2NoZWNrLWZvci1haScgaW4gc2NyaXB0cykpIHJldHVybjtcblxuICBpZiAoJ2dlbi1jb2RlJyBpbiBzY3JpcHRzKSB7XG4gICAgc2NyaXB0c1snY2hlY2stZm9yLWFpJ10gPSBgJHtwYWNrYWdlTWFuYWdlcn0gZ2VuLWNvZGUgPiAvZGV2L251bGwgJiYgJHtzY3JpcHRzWydjaGVjay1mb3ItYWknXX1gO1xuICB9XG4gIHNjcmlwdHNbJ2NoZWNrLWZvci1haSddID0gYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGwgPiAvZGV2L251bGwgJiYgJHtzY3JpcHRzWydjaGVjay1mb3ItYWknXX1gO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVZYXJuV29ya3NwYWNlRm9yZWFjaFNjcmlwdHMoc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHZvaWQge1xuICAvLyBEZWFsIHdpdGggYnJlYWtpbmcgY2hhbmdlcyBpbiB5YXJuIGJlcnJ5IDQuMC4wLXJjLjQ5XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKCF2YWx1ZT8uaW5jbHVkZXMoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJykpIGNvbnRpbnVlO1xuICAgIHNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoXG4gICAgICAveWFybiB3b3Jrc3BhY2VzIGZvcmVhY2goPyFcXHMrKD86LUF8LVJ8LS0oPzphbGx8cmVjdXJzaXZlfHNpbmNlfHdvcmt0cmVlfGZyb218aW5jbHVkZXxleGNsdWRlfHB1YmxpY3xwcml2YXRlKSkpL2d1LFxuICAgICAgJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsJ1xuICAgICk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8RGVwZW5kZW5jeVVwZGF0ZXM+IHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGNvbnN0IHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIGlmIChcbiAgICBoYXNKYXZhICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RDb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpXG4gICkge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKTtcbiAgfVxuICBpZiAoaGFzSmF2YSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllcicpO1xuICB9IGVsc2Uge1xuICAgIHJlbW92ZVByZXR0aWVyQXJ0aWZhY3RzKGpzb25PYmopO1xuICB9XG5cbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICBkZWxldGUgKGpzb25PYmogYXMgUGFja2FnZUpzb24gJiB7ICdsaW50LXN0YWdlZCc/OiB1bmtub3duIH0pWydsaW50LXN0YWdlZCddO1xuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmh1c2t5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcGFjaztcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrO1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xlZnRob29rJyk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby5cbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKVxuICAgICAgICA/IG1lcmdlLmFsbChbanNvbk9iai53b3Jrc3BhY2VzLCBbJ3BhY2thZ2VzLyonXV0sIHtcbiAgICAgICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFsncGFja2FnZXMvKiddO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGZnLmdsb2JTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWlzV2JQYWNrYWdlKGpzb25PYmopKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy53YiB8fCBjb25maWcuaXNCdW4pIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMpKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoL3diXFxzK2RiL2d1LCAnd2IgcHJpc21hJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gYnVpbGQtdHMgb3ducyBUeXBlU2NyaXB0IGV4ZWN1dGlvbiBhbmQgZGVjbGFyYXRpb24gZW1pdC4gd2JmeSBtdXN0IGFsd2F5c1xuICAvLyBrZWVwIGV4aXN0aW5nIGJ1aWxkLXRzIHVzZXJzIGN1cnJlbnQgYmVjYXVzZSBvbGRlciByZWxlYXNlcyBjYW4gZW1pdCAuZC50c1xuICAvLyBmaWxlcyBhdCBwYXRocyB0aGF0IG5vIGxvbmdlciBtYXRjaCBwYWNrYWdlIGV4cG9ydHMuXG4gIGlmIChcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBPYmplY3QudmFsdWVzKGpzb25PYmouc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiBzY3JpcHQ/LmluY2x1ZGVzKGJ1aWxkVHNEZXBlbmRlbmN5KSlcbiAgKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goYnVpbGRUc0RlcGVuZGVuY3kpO1xuICB9XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4ub3hsaW50RGVwcyk7XG4gIH1cblxuICBjb25zdCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpID8gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZykgOiBbXTtcbiAgYXdhaXQgcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaiwgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4udHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kpO1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIC8vIE5leHQuanMgc3RpbGwgdXNlcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UgZHVyaW5nIGRldi9idWlsZCBzdGFydHVwIGZvclxuICAgICAgLy8gVHlwZVNjcmlwdCBhcHBzIGV2ZW4gd2hlbiByZXBvc2l0b3JpZXMgZGVsZWdhdGUgZXhwbGljaXQgdHlwZWNoZWNraW5nIHRvIHRzZ28uXG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh0eXBlc2NyaXB0RGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9ub2RlJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0cy1qZXN0J10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgICApIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvamVzdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVwZW5kZW5jaWVzOiBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBkZXZEZXBlbmRlbmNpZXM6IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIHB5dGhvbkRldkRlcGVuZGVuY2llcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMsIHB5dGhvbkRldkRlcGVuZGVuY2llcyB9O1xufVxuXG5mdW5jdGlvbiBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBbd2JEZXBlbmRlbmN5LCBidWlsZFRzRGVwZW5kZW5jeV0pIHtcbiAgICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSBjb250aW51ZTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA/Pz0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBhd2FpdCBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCBqc29uT2JqKTtcbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIFlhcm4gdHJlYXRzIHRoZSBsZWdhY3kgbnBtL2NoYWxrIHJlc29sdXRpb24gYWxpYXMgYXMgYW4gaW52YWxpZCBwYWNrYWdlIHRva2VuLlxuICBkZWxldGUganNvbk9iai5yZXNvbHV0aW9ucz8uWyducG0vY2hhbGsnXTtcblxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5saW50O1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddO1xuICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdE5hbWUgb2YgWydjbGVhbnVwJywgJ2NoZWNrLWZvci1haSddKSB7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0ganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgICAgICAgIGlmICghc2NyaXB0KSBjb250aW51ZTtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV0gPSBzY3JpcHQucmVwbGFjZSgvID8mJiA/eWFybiBsaW50LWZpeCg/OiAtLXF1aWV0KT8vLCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9IGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA/PyAneWFybiBsaW50IC0tZml4JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBkYXJ0IGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0LCBjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPT09ICdwb2V0cnkgaW5zdGFsbCcpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICAgIH1cbiAgICAgIGpzb25PYmouc2NyaXB0c1snY29tbW9uL2NpLXNldHVwJ10gPSBgeWFybiBzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWA7XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5JyA/ICd1dicgOiAncG9ldHJ5J31gXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NldHVwLXBvZXRyeS1hc2RmJ107XG4gICAgICBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YF0gPSBnZXRQeXRob25TZXR1cENvbW1hbmQocHl0aG9uUGFja2FnZU1hbmFnZXIpO1xuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBjb25zdCBweXRob25SdW5uZXIgPSBgJHtweXRob25QYWNrYWdlTWFuYWdlcn0gcnVuYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgJHtweXRob25SdW5uZXJ9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiAke3B5dGhvblJ1bm5lcn0gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCwgY29uZmlnKTtcbiAgICAgICAgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeSB8fCBqc29uT2JqLnJlcG9zaXRvcnkpIHtcbiAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oY29uZmlnLnJlcG9zaXRvcnkgPz8ganNvbk9iai5yZXBvc2l0b3J5LCBqc29uT2JqLnJlcG9zaXRvcnkpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgnYmxpdHogY29kZWdlbicpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAnYmxpdHogY29kZWdlbic7XG4gICAgfSBlbHNlIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLmluY2x1ZGVzKCdibGl0eiBwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLnJlcGxhY2UoXG4gICAgICAgICdibGl0eiBjb2RlZ2VuJyxcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4gJiYgYmxpdHogcHJpc21hIGdlbmVyYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgncHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAncHJpc21hIGdlbmVyYXRlJztcbiAgfVxuICBhZGRHZW5JMThuVHNQb3N0aW5zdGFsbFNjcmlwdChjb25maWcsIGpzb25PYmopO1xuXG4gIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXMucHJldHRpZXIpIHtcbiAgICAvLyBCZWNhdXNlIEB0eXBlcy9wcmV0dGllciBibG9ja3MgcHJldHRpZXIgZXhlY3V0aW9uLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoZm9ybWF0U2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIEJ1biBwcm9qZWN0cyBtYXkgbm90IGhhdmUgYSBZYXJuIGxvY2tmaWxlLCBzbyBnZW5lcmF0ZWQgcGFja2FnZSBzY3JpcHRzXG4gIC8vIG11c3QgaW52b2tlIGxvY2FsIHBhY2thZ2Ugc2NyaXB0cyB0aHJvdWdoIHRoZSByZXBvc2l0b3J5J3MgcGFja2FnZSBtYW5hZ2VyLlxuICBjb25zdCBzY3JpcHRSdW5uZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIHJldHVybiBmb3JtYXRTY3JpcHQgPyBgJHtmb3JtYXRTY3JpcHR9ICYmICR7c2NyaXB0UnVubmVyfSBmb3JtYXQtY29kZWAgOiBgJHtzY3JpcHRSdW5uZXJ9IGZvcm1hdC1jb2RlYDtcbn1cblxuZnVuY3Rpb24gYWRkR2VuSTE4blRzUG9zdGluc3RhbGxTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbW1hbmQgPSBnZXRHZW5JMThuVHNDb21tYW5kKGNvbmZpZywganNvbk9iai5zY3JpcHRzKTtcbiAgaWYgKCFjb21tYW5kKSByZXR1cm47XG5cbiAgY29uc3QgcG9zdGluc3RhbGwgPSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gIGlmICghcG9zdGluc3RhbGwpIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPSBjb21tYW5kO1xuICB9IGVsc2UgaWYgKCFwb3N0aW5zdGFsbC5pbmNsdWRlcyhjb21tYW5kKSkge1xuICAgIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9IGAke3Bvc3RpbnN0YWxsfSAmJiAke2NvbW1hbmR9YDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybjtcblxuICBjb25zdCBjb25maWdNanNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLm1qcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnTWpzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLnR5cGUgPSAnbW9kdWxlJztcblxuICBjb25zdCBjb25maWdEdHNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQudHMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0R0c1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai5maWxlcyA9IFsuLi5uZXcgU2V0KFsuLi4oanNvbk9iai5maWxlcyA/PyBbXSksICdjb25maWcuZC5tdHMnXSldO1xuICAvLyBOb2RlTmV4dCByZXNvbHZlcyBhIHJlbGF0aXZlIGAuL2NvbmZpZy5tanNgIGltcG9ydCB0byBgY29uZmlnLmQubXRzYCwgbm90XG4gIC8vIHRoZSBwYWNrYWdlLWxldmVsIGB0eXBlc2AgZmllbGQuIEtlZXAgdGhlIHB1Ymxpc2hlZCBjb25maWcgaW1wb3J0YWJsZSBmcm9tXG4gIC8vIHBhY2thZ2UtbG9jYWwgVHlwZVNjcmlwdCBsaW50ZXIgc2V0dGluZ3MuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLm10cycpLCBjb25maWdEbXRzQ29udGVudCkpO1xufVxuXG5jb25zdCBjb25maWdEbXRzQ29udGVudCA9IGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnLi9jb25maWcuanMnO1xuYDtcblxuZnVuY3Rpb24gYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLCBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMpOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgY29uc3QgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcF0pO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyxcbiAgICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXNcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IGpzb25PYmpba2V5XTtcbiAgICBpZiAoc2VjdGlvbiAmJiBPYmplY3Qua2V5cyhzZWN0aW9uKS5sZW5ndGggPT09IDApIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9iaiwga2V5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJ1xuKTogdm9pZCB7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge30sIGRlcGVuZGVuY2llcywgZmFsc2UpO1xuXG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge30sIGRldkRlcGVuZGVuY2llcywgdHJ1ZSk7XG5cbiAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgJiYgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbLi4ubmV3IFNldChkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMpXTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMoJ3V2JywgWydhZGQnLCAnLS1kZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnknIHwgJ3V2JyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHJldHVybiAndXYnO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykgcmV0dXJuICdwb2V0cnknO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25TZXR1cENvbW1hbmQocGFja2FnZU1hbmFnZXI6ICdwb2V0cnknIHwgJ3V2Jyk6IHN0cmluZyB7XG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3V2JykgcmV0dXJuICd1diBzeW5jIC0tZnJvemVuJztcbiAgcmV0dXJuICdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZSAmJiBwb2V0cnkgZW52IHVzZSAkKG1pc2UgY3VycmVudCBweXRob24pICYmIHBvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCAmJiBwb2V0cnkgaW5zdGFsbCc7XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nLFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgZGV2OiBib29sZWFuXG4pOiB2b2lkIHtcbiAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVycyA9IFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgZGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT5cbiAgICAgICAgZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeSwgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0sIHBhY2thZ2VNYW5hZ2VyKVxuICAgICAgKVxuICAgICksXG4gIF07XG4gIHNwYXduU3luYyhcbiAgICBwYWNrYWdlTWFuYWdlcixcbiAgICBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksIC4uLihjb25maWcuaXNCdW4gPyBbJy0tZXhhY3QnXSA6IFtdKSwgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLFxuICAgIGNvbmZpZy5kaXJQYXRoXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKFxuICBkZXBlbmRlbmN5OiBzdHJpbmcsXG4gIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJ1xuKTogc3RyaW5nIHtcbiAgLy8gWWFybiBwcmVmZXJzIGxvY2FsIHdvcmtzcGFjZXMgd2hlbiBhZGRpbmcgYSBiYXJlIHBhY2thZ2UgbmFtZS4gUGFzc2luZyB0aGVcbiAgLy8gcmVzb2x2ZWQgdmVyc2lvbiBrZWVwcyBtYW5hZ2VkIHRvb2xzIGFzIG5wbSBkZXBlbmRlbmNpZXMgaW4gY29uZmlnLXBhY2thZ2VcbiAgLy8gbW9ub3JlcG9zLCB3aGVyZSB0aG9zZSBwYWNrYWdlIG5hbWVzIGNhbiBhbHNvIGV4aXN0IGFzIHdvcmtzcGFjZXMuXG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3lhcm4nICYmIGN1cnJlbnRWZXJzaW9uICYmICFpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UoY3VycmVudFZlcnNpb24pKSB7XG4gICAgcmV0dXJuIGAke2RlcGVuZGVuY3l9QCR7Y3VycmVudFZlcnNpb259YDtcbiAgfVxuXG4gIHJldHVybiBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3kpO1xufVxuXG5mdW5jdGlvbiBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzVG9JbnN0YWxsOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbmV3IFNldChkZXBlbmRlbmNpZXMpKSB7XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ID0gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgICAgIGRlcGVuZGVuY3ksXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XVxuICAgICk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSkge1xuICAgICAgZGVwZW5kZW5jaWVzVG9JbnN0YWxsLnB1c2goZGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICYmXG4gICAgICAhc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ICYmXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAhPT0gJyonXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzVG9JbnN0YWxsO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyxcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gIGlmICghcmVsYXRpdmVGaWxlUGF0aCkgcmV0dXJuO1xuXG4gIC8vIFJldXNlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIG93biBmb3JtYXR0ZXIgYWZ0ZXIgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24gc29cbiAgLy8gcGFja2FnZS5qc29uIG1hdGNoZXMgd2hhdGV2ZXIgaXRzIGN1cnJlbnQgc29ydC1wYWNrYWdlLWpzb24gdmVyc2lvbiBleHBlY3RzLlxuICAvLyBUaGlzIGF2b2lkcyBmb2xsb3ctdXAgYXV0b2ZpeCBjb21taXRzIGNhdXNlZCBvbmx5IGJ5IGZvcm1hdHRlciB2ZXJzaW9uIGRyaWZ0XG4gIC8vIGJldHdlZW4gd2JmeSBhbmQgdGhlIHByb2plY3QgYmVpbmcgdXBkYXRlZC5cbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAnYnVuJykge1xuICAgIHNwYXduU3luYygnYnVueCcsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xuICB9IGVsc2Uge1xuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIHJlbW92ZVNlbGZEZXBlbmRlbmN5KGNvbmZpZywganNvbk9iaik7XG4gIHJlcGxhY2VXaWxsQm9vc3RlckNvbmZpZ3NXb3Jrc3BhY2VEZXBlbmRlbmN5UmFuZ2VzKGNvbmZpZywganNvbk9iaik7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnRzbGliO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvdHNjb25maWcnXTtcbiAgLy8gTmV4dC5qcyBzdGlsbCByZXF1aXJlcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UgYXQgYnVpbGQvZGV2IHRpbWUgZm9yXG4gIC8vIFR5cGVTY3JpcHQgcHJvamVjdHMgZXZlbiB3aGVuIHJlcG9zIHVzZSB0c2dvIGZvciBleHBsaWNpdCB0eXBlY2hlY2tpbmcuXG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgfVxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMubGVybmE7XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGluc3Q7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWVyO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndmVyaWZ5LWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndmVyaWZ5LWNvZGUtd2l0aC10ZXN0cyddO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnbGVybmEuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICByZW1vdmVXaWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaik7XG4gIHJlbW92ZU9ic29sZXRlTGludERlcGVuZGVuY2llcyhqc29uT2JqLCBjb25maWcpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVTZWxmRGVwZW5kZW5jeShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz5cbik6IHZvaWQge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IGpzb25PYmoubmFtZSB8fCBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcblxuICAvLyBBIHBhY2thZ2UgY2FuIGltcG9ydCBpdHNlbGYgdGhyb3VnaCBOb2RlJ3MgcGFja2FnZSBzZWxmLXJlZmVyZW5jZSB3aXRob3V0XG4gIC8vIGRlY2xhcmluZyBpdHNlbGY7IGtlZXBpbmcgdGhhdCBlZGdlIGJyZWFrcyBtb25vcmVwbyByZWxlYXNlIHRvcG9sb2dpY2FsIHNvcnRpbmcuXG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIHBhY2thZ2VOYW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlV2lsbEJvb3N0ZXJDb25maWdzV29ya3NwYWNlRGVwZW5kZW5jeVJhbmdlcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgIGZvciAoY29uc3QgW2RlcGVuZGVuY3ksIHZlcnNpb25dIG9mIE9iamVjdC5lbnRyaWVzKHNlY3Rpb24pKSB7XG4gICAgICBpZiAoIXZlcnNpb24pIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbikpIGNvbnRpbnVlO1xuICAgICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgdGhlc2UgcGFja2FnZXMgaW5kZXBlbmRlbnRseSwgc28gZ2VuZXJhdGVkXG4gICAgICAvLyBwYWNrYWdlIG1ldGFkYXRhIG11c3QgZGVzY3JpYmUgbnBtIHJlbGVhc2UgZWRnZXMgaW5zdGVhZCBvZiBsb2NhbFxuICAgICAgLy8gd29ya3NwYWNlIGVkZ2VzIHRoYXQgcmVsZWFzZSB0b29saW5nIHRyZWF0cyBhcyBtb25vcmVwbyBncmFwaCBsaW5rcy5cbiAgICAgIC8vIFRoZSBmaW5hbCBgeWFybiBpbnN0YWxsIC0tbm8taW1tdXRhYmxlYCBzeW5jcyB0aGUgbG9ja2ZpbGUgYWZ0ZXIgdGhpc1xuICAgICAgLy8gbWlncmF0aW9uLCBldmVuIHdoZW4gdGhlIGRlcGVuZGVuY3kgaXMgbm90IHBhcnQgb2Ygd2JmeSdzIG1hbmFnZWQgbGlzdC5cbiAgICAgIHNlY3Rpb25bZGVwZW5kZW5jeV0gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlV2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz5cbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykgcmV0dXJuO1xuXG4gIGNvbnN0IHNlY3Rpb25zID0gZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygd2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcykge1xuICAgIC8vIHdpbGxib29zdGVyLWNvbmZpZ3MgcHVibGlzaGVzIHRoZXNlIG1hbmFnZWQgY29uZmlnIHBhY2thZ2VzIGZyb20gdGhlIHNhbWVcbiAgICAvLyBtb25vcmVwby4gS2VlcGluZyB0aGVtIGluIHN1YnBhY2thZ2UgbWV0YWRhdGEgY3JlYXRlcyBsb2NhbCB3b3Jrc3BhY2VcbiAgICAvLyBncmFwaCBlZGdlcyB0aGF0IG11bHRpLXNlbWFudGljLXJlbGVhc2Ugc29ydHMgYXMgcmVsZWFzZSBkZXBlbmRlbmNpZXMuXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgdXNlZERlcGVuZGVuY2llczogc3RyaW5nW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1c2VkRGVwZW5kZW5jeVNldCA9IG5ldyBTZXQodXNlZERlcGVuZGVuY2llcyk7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gYXdhaXQgZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAodXNlZERlcGVuZGVuY3lTZXQuaGFzKGRlcGVuZGVuY3kpIHx8IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIGJhc2UtY29uZmlnIHBhY2thZ2VzLiBSZW1vdmUgc3RhbGUgdmFyaWFudHMgd2hlbiByZXBvXG4gICAgLy8gY2FwYWJpbGl0aWVzIGNoYW5nZSwgc3VjaCBhcyBOZXh0LmpzIHRha2luZyBvd25lcnNoaXAgb2YgdHNjb25maWcuanNvbi5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IGZnLmdsb2IoJyoqL3RzY29uZmlnKi5qc29uJywge1xuICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICBjb25zdCBhYnNvbHV0ZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRzLnBhcnNlQ29uZmlnRmlsZVRleHRUb0pzb24oXG4gICAgICAgIGFic29sdXRlRmlsZVBhdGgsXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGFic29sdXRlRmlsZVBhdGgsICd1dGY4JylcbiAgICAgICk7XG4gICAgICBpZiAocGFyc2VkLmVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgUHJlc2VydmUgbWFuYWdlZCBAdHNjb25maWcgZGVwZW5kZW5jaWVzIGJlY2F1c2UgJHthYnNvbHV0ZUZpbGVQYXRofSBjb3VsZCBub3QgYmUgcGFyc2VkOiAke2Zvcm1hdFRzRGlhZ25vc3RpYyhwYXJzZWQuZXJyb3IpfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQobWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG5vcm1hbGl6ZVRzY29uZmlnRXh0ZW5kcygocGFyc2VkLmNvbmZpZyBhcyB7IGV4dGVuZHM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5leHRlbmRzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gZGVwZW5kZW5jeSB8fCB2YWx1ZS5zdGFydHNXaXRoKGAke2RlcGVuZGVuY3l9L2ApKSB7XG4gICAgICAgICAgICBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFByZXNlcnZlIG1hbmFnZWQgQHRzY29uZmlnIGRlcGVuZGVuY2llcyBiZWNhdXNlICR7YWJzb2x1dGVGaWxlUGF0aH0gY291bGQgbm90IGJlIHJlYWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gbmV3IFNldChtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXM7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRzRGlhZ25vc3RpYyhkaWFnbm9zdGljOiB0cy5EaWFnbm9zdGljKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRzLmZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQoZGlhZ25vc3RpYy5tZXNzYWdlVGV4dCwgJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVUc2NvbmZpZ0V4dGVuZHModmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gW3ZhbHVlXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PltdIHtcbiAgcmV0dXJuIGRlcGVuZGVuY3lTZWN0aW9uS2V5c1xuICAgIC5tYXAoKGtleSkgPT4ganNvbk9ialtrZXldKVxuICAgIC5maWx0ZXIoKHNlY3Rpb24pOiBzZWN0aW9uIGlzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPT4gISFzZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2FjaGVkVmVyc2lvbiA9IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuZ2V0KGRlcGVuZGVuY3kpO1xuICBpZiAoY2FjaGVkVmVyc2lvbikgcmV0dXJuIGNhY2hlZFZlcnNpb247XG5cbiAgY29uc3QgdmVyc2lvbiA9IGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5zZXQoZGVwZW5kZW5jeSwgdmVyc2lvbik7XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gbnBtJ3MgbGF0ZXN0IGRpc3QtdGFnIHN0aWxsIHRyYWNrcyBUUzcgZGV2IHNuYXBzaG90czsgd2JmeSBzaG91bGQgZm9sbG93XG4gIC8vIHRoZSBwdWJsaWMgYmV0YSBjaGFubmVsIHVudGlsIHRoZSBzdGFibGUgVFM3IHBhY2thZ2UgbGF5b3V0IGlzIGZpbmFsaXplZC5cbiAgcmV0dXJuIChcbiAgICBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgICAnbnBtJyxcbiAgICAgIFsnc2hvdycsIGdldERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeSksICd2ZXJzaW9uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLFxuICAgICAgcHJvY2Vzcy5jd2QoKVxuICAgICkgfHwgJyonXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgPyBgJHtkZXBlbmRlbmN5fUBiZXRhYCA6IGRlcGVuZGVuY3k7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU9ic29sZXRlTGludERlcGVuZGVuY2llcyhcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+LFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IHZvaWQge1xuICBjb25zdCBwcmVzZXJ2ZU1pY3JvbWF0Y2ggPSBzaG91bGRQcmVzZXJ2ZU1pY3JvbWF0Y2goY29uZmlnKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG9ic29sZXRlTGludERlcGVuZGVuY2llcykge1xuICAgIGlmIChwcmVzZXJ2ZU1pY3JvbWF0Y2ggJiYgbWljcm9tYXRjaFBhY2thZ2VOYW1lcy5oYXMoZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIGlmIChzaG91bGRQcmVzZXJ2ZUNvbmZpZ1BhY2thZ2VMaW50RGVwZW5kZW5jeShqc29uT2JqLCBjb25maWcsIGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkUHJlc2VydmVDb25maWdQYWNrYWdlTGludERlcGVuZGVuY3koXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPixcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmN5OiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAoIWlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIHJldHVybiB0cnVlO1xuXG4gIC8vIFB1Ymxpc2hlZCBjb25maWcgcGFja2FnZXMgbmVlZCBsb2NhbCB0eXBlLW9ubHkgZGVwcyB0byB2YWxpZGF0ZSB0aGVcbiAgLy8gcGFja2FnZS1wcm92aWRlZCBjb25maWcgZGVjbGFyYXRpb25zIHVuZGVyIFlhcm4gUG5QLlxuICByZXR1cm4gZGVwZW5kZW5jeSA9PT0gJ0B0eXBlcy9lc2xpbnQnICYmICEhanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzLmVzbGludDtcbn1cblxuZnVuY3Rpb24gc2hvdWxkUHJlc2VydmVNaWNyb21hdGNoKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHN1YnBhY2thZ2VzIHB1Ymxpc2ggY29uZmlnIGZpbGVzIGFzIHRoZWlyIHByb2R1Y3QsIHNvXG4gIC8vIG1pY3JvbWF0Y2ggaXMgcGFja2FnZSBkYXRhIHRoZXJlLiBPdGhlciByZXBvcyBrZWVwIG1pY3JvbWF0Y2ggb25seSB3aGVuXG4gIC8vIHByb2R1Y3QgY29kZSBpbXBvcnRzIGl0OyBvdGhlcndpc2UgaXQgaXMgdHJlYXRlZCBhcyBvYnNvbGV0ZSBFU0xpbnQtZXJhXG4gIC8vIHRvb2xpbmcuXG4gIHJldHVybiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmICFjb25maWcuaXNSb290KSB8fCBkb2VzUHJvZHVjdENvZGVJbXBvcnRNaWNyb21hdGNoKGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gZG9lc1Byb2R1Y3RDb2RlSW1wb3J0TWljcm9tYXRjaChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZmlsZVBhdGhzID0gZmcuZ2xvYlN5bmMoJ3NyYy8qKi8qLntqcyxqc3gsbWpzLGNqcyx0cyx0c3gsbXRzLGN0c30nLCB7XG4gICAgY3dkOiBkaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuICByZXR1cm4gZmlsZVBhdGhzLnNvbWUoKGZpbGVQYXRoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtaWNyb21hdGNoSW1wb3J0UGF0dGVybi50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZVBhdGgpLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KGRlcGVuZGVuY3k6IHN0cmluZywgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIWN1cnJlbnRWZXJzaW9uKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGN1cnJlbnRWZXJzaW9uID09PSAnKicpIHJldHVybiB0cnVlO1xuICBpZiAoaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKGN1cnJlbnRWZXJzaW9uKSkgcmV0dXJuIHRydWU7XG4gIC8vIHdiZnktbWFuYWdlZCB0b29scyBtdXN0IGJlIGtlcHQgY3VycmVudCBldmVuIHdoZW4gdGhlIHBhY2thZ2UgYWxyZWFkeSBwaW5zXG4gIC8vIGEgY29uY3JldGUgdmVyc2lvbi4gSW4gcGFydGljdWxhciwgYnVpbGQtdHMgb3ducyBkZWNsYXJhdGlvbiBvdXRwdXQgcGF0aHMuXG4gIHJldHVybiAoXG4gICAgZGVwZW5kZW5jeSA9PT0gJ0B3aWxsYm9vc3Rlci93YicgfHxcbiAgICBkZXBlbmRlbmN5ID09PSBidWlsZFRzRGVwZW5kZW5jeSB8fFxuICAgIG94bGludERlcHMuaW5jbHVkZXMoZGVwZW5kZW5jeSkgfHxcbiAgICBkZXBlbmRlbmN5ID09PSB0eXBlc2NyaXB0R29EZXBlbmRlbmN5XG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSh2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcnNpb24uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/KSg/OlxcLmdpdCk/JC91LmV4ZWMocmVwb3NpdG9yeVVybCk7XG4gIGlmICghbWF0Y2hlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IFssIG93bmVyLCByZXBvXSA9IG1hdGNoZWQ7XG4gIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgbm9ybWFsaXplZFVybDogc3RyaW5nLFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3QgcmVwb3NpdG9yeU9iaiA9XG4gICAgdHlwZW9mIHJlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICA/IHJlcG9zaXRvcnlcbiAgICAgIDogdHlwZW9mIGV4aXN0aW5nUmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBleGlzdGluZ1JlcG9zaXRvcnlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXBvc2l0b3J5T2JqLFxuICAgIHR5cGU6ICdnaXQnLFxuICAgIHVybDogbm9ybWFsaXplZFVybCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ2J1biBydW4gY2hlY2stZm9yLWFpICYmIGJ1biBydW4gdGVzdCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogJ2J1biBydW4gY2xlYW51cCcsXG4gICAgICBjbGVhbnVwOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgICAgZm9ybWF0OiBgYnVuIC0tYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgICAgbGludDogYGJ1biAtLWJ1biB3YiBsaW50YCxcbiAgICAgICdsaW50LWZpeCc6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCcsXG4gICAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgICAgdHlwZWNoZWNrOiAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgICB2ZXJpZnk6ICdidW4gLS1idW4gd2IgdmVyaWZ5JyxcbiAgICAgICd2ZXJpZnktZnVsbCc6ICdidW4gLS1idW4gd2IgdmVyaWZ5IC0tZnVsbCcsXG4gICAgfTtcbiAgICBhcHBseU1pc2VUYXNrU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsnYnVpbGQnLCAnZGV2JywgJ3N0YXJ0JywgJ3Rlc3QnLCAndHlwZWNoZWNrJ10pO1xuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICcgJiYgcHlyaWdodCc7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3QgaGFzSnNPclRzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKTtcbiAgICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gICAgY29uc3Qgb2xkVGVzdCA9IG9sZFNjcmlwdHMudGVzdDtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ3lhcm4gY2hlY2stZm9yLWFpICYmIHlhcm4gdGVzdCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogYHlhcm4gZm9ybWF0ID4gL2Rldi9udWxsIDI+IC9kZXYvbnVsbCB8fCB0cnVlICYmIHlhcm4gbGludC1maXggLS1xdWlldGAsXG4gICAgICBjbGVhbnVwOiAneWFybiBmb3JtYXQgJiYgeWFybiBsaW50LWZpeCcsXG4gICAgICBmb3JtYXQ6IGdlbmVyYXRlRm9ybWF0U2NyaXB0KGhhc0pzT3JUcywgaGFzSmF2YSksXG4gICAgICBsaW50OiBgb3hsaW50IC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLmAsXG4gICAgICAnbGludC1maXgnOiAneWFybiBsaW50IC0tZml4JyxcbiAgICAgICdmb3JtYXQtY29kZSc6IGBveGZtdCAtLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLiAnISoqL3BhY2thZ2UuanNvbidgLFxuICAgICAgdHlwZWNoZWNrOiAndHNnbyAtLW5vRW1pdCcsXG4gICAgfTtcbiAgICBpZiAoaGFzSmF2YSkge1xuICAgICAgc2NyaXB0cy5wcmV0dGlmeSA9IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyT25seS5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBzY3JpcHRzID0gbWVyZ2UoXG4gICAgICAgIHsgLi4uc2NyaXB0cyB9LFxuICAgICAgICB7XG4gICAgICAgICAgZm9ybWF0OiBgJHtzY3JpcHRzLmZvcm1hdH0gJiYgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGZvcm1hdGAsXG4gICAgICAgICAgbGludDogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50YCxcbiAgICAgICAgICAnbGludC1maXgnOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnQtZml4JyxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLlxuICAgICAgICAgIC8vIEZPUkNFX0NPTE9SPTMgbWFrZSB3YiBlbmFibGUgY29sb3Igb3V0cHV0LlxuICAgICAgICAgIHRlc3Q6ICdDST0xIEZPUkNFX0NPTE9SPTMgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNKYXZhKSB7XG4gICAgICAgIHNjcmlwdHMucHJldHRpZnkgPSBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkuam9pbihcbiAgICAgICAgICAnLCdcbiAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgIH1cbiAgICBpZiAoIWhhc0pzT3JUcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ107XG4gICAgICBkZWxldGUgc2NyaXB0cy5saW50O1xuICAgICAgZGVsZXRlIHNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgfVxuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLndiKSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9ICd3YiB0eXBlY2hlY2snO1xuICAgIH1cbiAgICBpZiAoaXNXYlBhY2thZ2UoY29uZmlnLnBhY2thZ2VKc29uKSkge1xuICAgICAgc2NyaXB0cy52ZXJpZnkgPSBvbGRTY3JpcHRzLnZlcmlmeSA/PyAneWFybiB3b3Jrc3BhY2UgQHdpbGxib29zdGVyL3diIHN0YXJ0IC0td29ya2luZy1kaXIgXCIkSU5JVF9DV0RcIiB2ZXJpZnknO1xuICAgICAgc2NyaXB0c1sndmVyaWZ5LWZ1bGwnXSA9IG9sZFNjcmlwdHNbJ3ZlcmlmeS1mdWxsJ10gPz8gJ3lhcm4gdmVyaWZ5IC0tZnVsbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMudmVyaWZ5ID0gJ3diIHZlcmlmeSc7XG4gICAgICBzY3JpcHRzWyd2ZXJpZnktZnVsbCddID0gJ3diIHZlcmlmeSAtLWZ1bGwnO1xuICAgIH1cbiAgICBhcHBseU1pc2VUYXNrU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsnYnVpbGQnLCAnZGV2JywgJ3N0YXJ0JywgJ3Rlc3QnLCAndHlwZWNoZWNrJ10pO1xuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzV2JQYWNrYWdlKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGFja2FnZUpzb24/Lm5hbWUgPT09IHdiRGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNaXNlVGFza1NjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgaWYgKCFoYXNNaXNlVGFzayhjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAoZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgaWYgKG9sZFNjcmlwdHNbbmFtZV0gJiYgIWlzV2JmeU1hbmFnZWRNaXNlQnJpZGdlKG9sZFNjcmlwdHNbbmFtZV0sIG5hbWUpICYmICEobmFtZSBpbiBzY3JpcHRzKSkgY29udGludWU7XG4gICAgc2NyaXB0c1tuYW1lXSA9IGBtaXNlIHJ1biAke25hbWV9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNNaXNlVGFzayhjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0Lmhhc093bihjb25maWcubWlzZVRhc2tzLCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdGFzayA9IGNvbmZpZy5taXNlVGFza3NbbmFtZV07XG4gIGlmICghdGFzaykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlcnMgPSBbJ2J1bicsICd5YXJuJywgJ25wbScsICdwbnBtJ107XG4gIHJldHVybiBwYWNrYWdlTWFuYWdlcnMuc29tZSgocGFja2FnZU1hbmFnZXIpID0+XG4gICAgbmV3IFJlZ0V4cChTdHJpbmcucmF3YFxcYiR7cGFja2FnZU1hbmFnZXJ9XFxzKyg/OnJ1blxccyspPyR7ZXNjYXBlUmVnRXhwKG5hbWUpfSg/IVthLXpBLVowLTlfXFwtOi5dKWAsICd1JykudGVzdCh0YXNrKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc1diZnlNYW5hZ2VkTWlzZUJyaWRnZShzY3JpcHQ6IHVua25vd24sIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2NyaXB0ID09PSBgbWlzZSBydW4gJHtuYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVGb3JtYXRTY3JpcHQoaGFzSnNPclRzOiBib29sZWFuLCBoYXNKYXZhOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgY29tbWFuZHMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGlmIChoYXNKc09yVHMpIHtcbiAgICBjb21tYW5kcy5wdXNoKCd5YXJuIGZvcm1hdC1jb2RlJyk7XG4gIH1cbiAgaWYgKGhhc0phdmEpIHtcbiAgICBjb21tYW5kcy5wdXNoKCd5YXJuIHByZXR0aWZ5Jyk7XG4gIH1cbiAgcmV0dXJuIGNvbW1hbmRzLmpvaW4oJyAmJiAnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpLmNhdGNoKCgpID0+ICcnKTtcbiAgY29uc3QgaW5kZXggPSBleGlzdGluZ0NvbnRlbnQuaW5kZXhPZihpZ25vcmVGaWxlVXRpbC5zZXBhcmF0b3JQcmVmaXgpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZXhpc3RpbmdDb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgY29uc3QgbGluZXMgPSBvcmlnaW5hbENvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgcmV0dXJuIG5ld0xpbmUuZW5kc1dpdGgoJy8nKSA/IG5ld0xpbmUuc2xpY2UoMCwgLTEpIDogbmV3TGluZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGwpID0+IGwgJiYgIWwuc3RhcnRzV2l0aCgnIycpICYmICFsLmluY2x1ZGVzKCcvJykpO1xuXG4gIHJldHVybiBgJHtsaW5lcy5tYXAoKGxpbmUpID0+IGAgXCIhKiovJHtsaW5lfS8qKlwiYCkuam9pbignJyl9IHx8IHRydWVgO1xufVxuXG5mdW5jdGlvbiByZW1vdmVQcmV0dGllckFydGlmYWN0cyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBqc29uT2JqLnByZXR0aWVyO1xuICBjb25zdCBkZXBlbmRlbmN5U2VjdGlvbnM6IEFycmF5PFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gfCB1bmRlZmluZWQ+ID0gW1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLFxuICAgIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyxcbiAgXTtcbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGRlcGVuZGVuY3lTZWN0aW9ucykge1xuICAgIGlmICghc2VjdGlvbikgY29udGludWU7XG4gICAgZGVsZXRlIHNlY3Rpb24ucHJldHRpZXI7XG4gICAgZGVsZXRlIHNlY3Rpb25bJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJ107XG4gICAgZGVsZXRlIHNlY3Rpb25bJ3ByZXR0aWVyLXBsdWdpbi1wcmlzbWEnXTtcbiAgICBkZWxldGUgc2VjdGlvblsnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyddO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2F1dGgnLCByZXBvOiAnYXV0aCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQGRpc2NvcmQtYm90L3NoYXJlZCcsIHJlcG86ICdkaXNjb3JkLWJvdCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCByZXBvOiAnY29kZS1hbmFseXplcicsIHRhcmdldDogJ2RldkRlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2p1ZGdlJywgcmVwbzogJ2p1ZGdlJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IHBhY2thZ2VOYW1lLCByZXBvLCB0YXJnZXQgfSkgPT4ge1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSB8fCBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgcGFja2FnZU5hbWUpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gdGFyZ2V0ID09PSAnZGVwZW5kZW5jaWVzJyA/ICdkZXZEZXBlbmRlbmNpZXMnIDogJ2RlcGVuZGVuY2llcyc7XG4gICAgICAvLyBUaGUgbGludCBydWxlIGRpc2FsbG93cyBgZGVsZXRlYCB3aXRoIGNvbXB1dGVkIHBhY2thZ2UgbmFtZXM7IFJlZmxlY3QgaGFzIHRoZSBzYW1lIGRlbGV0aW9uIHNlbWFudGljcyBoZXJlLlxuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqW290aGVyVGFyZ2V0XSwgcGFja2FnZU5hbWUpO1xuICAgICAganNvbk9ialt0YXJnZXRdW3BhY2thZ2VOYW1lXSA9IGF3YWl0IGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG8pO1xuICAgIH0pXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsIHJlcG8pO1xuICByZXR1cm4gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiLyR7cmVwb30uZ2l0IyR7Y29tbWl0SGFzaH1gO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb1VybCA9IGBnaXRAZ2l0aHViLmNvbToke29yZ2FuaXphdGlvbn0vJHtyZXBvfS5naXRgO1xuICAgIGNvbnN0IG91dHB1dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydscy1yZW1vdGUnLCByZXBvVXJsLCAnSEVBRCddLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gb3V0cHV0LnNwbGl0KC9cXHMrLylbMF07XG4gICAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29tbWl0SGFzaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCkpO1xuICB9XG59XG4iLCIvLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBOYW1lc3BhY2UgWUFNTCBjYWxscyBtYWtlIGR1bXAgdXNhZ2UgY2xlYXJlci5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRHZW5JMThuVHNDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZ2VuSTE4blRzLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5pbnRlcmZhY2UgTGVmdGhvb2tTZXR0aW5ncyB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInO1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xuICAncHJlLWNvbW1pdCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIExlZnRob29rSm9iIHtcbiAgbmFtZTogc3RyaW5nO1xuICBnbG9iPzogc3RyaW5nO1xuICBydW4/OiBzdHJpbmc7XG4gIHNjcmlwdD86IHN0cmluZztcbiAgcnVubmVyPzogJ2Jhc2gnO1xuICBzdGFnZV9maXhlZD86IHRydWU7XG59XG5cbmNvbnN0IGJhc2VTZXR0aW5nczogT21pdDxMZWZ0aG9va1NldHRpbmdzLCAncHJlLWNvbW1pdCc+ID0ge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJyxcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAncHJlcGFyZScsXG4gICAgICAgIHNjcmlwdDogJ3ByZXBhcmUuc2gnLFxuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2NoZWNrJyxcbiAgICAgICAgc2NyaXB0OiAnY2hlY2suc2gnLFxuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn07XG5cbmNvbnN0IHByZUNvbW1pdFNldHRpbmdzOiBMZWZ0aG9va1NldHRpbmdzWydwcmUtY29tbWl0J10gPSB7XG4gIGpvYnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnY2xlYW51cCcsXG4gICAgICBnbG9iOiAnJyxcbiAgICAgIHJ1bjogJycsXG4gICAgICBzdGFnZV9maXhlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdjaGVjay1taWdyYXRpb25zJyxcbiAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgIHJ1bjogYFxuZmFpbGVkPTBcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxuZm9yIGZpbGUgaW4ge3N0YWdlZF9maWxlc307IGRvXG4gIGlmIGdyZXAgLXEgJ1dhcm5pbmdzOicgXCIkZmlsZVwiOyB0aGVuXG4gICAgZWNobyBcIk1pZ3JhdGlvbiBTUUwgZmlsZSAoJGZpbGUpIGNvbnRhaW5zIHdhcm5pbmdzISBQbGVhc2Ugc29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXCJcbiAgICBmYWlsZWQ9MVxuICBmaVxuZG9uZVxuZXhpdCBcIiRmYWlsZWRcIlxuYC50cmltKCksXG4gICAgfSxcbiAgXSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGVmdGhvb2snKTtcbiAgY29uc3QgaHVza3lEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5Jyk7XG4gIGNvbnN0IGhhc0h1c2t5RGlyID0gZnMuZXhpc3RzU3luYyhodXNreURpclBhdGgpO1xuICBjb25zdCB7IGxpbnQgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIHt9KTtcbiAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8TGVmdGhvb2tTZXR0aW5ncz4gPSB7XG4gICAgLi4uYmFzZVNldHRpbmdzLFxuICAgICdwcmUtY29tbWl0Jzoge1xuICAgICAgam9iczogZ2V0UHJlQ29tbWl0Sm9icyhjb25maWcpLFxuICAgIH0sXG4gIH07XG4gIGlmICghbGludCkge1xuICAgIGRlbGV0ZSBzZXR0aW5nc1sncHJlLXB1c2gnXTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAoc2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuICBpZiAoaGFzSHVza3lEaXIpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5wcm9taXNlcy5ybShodXNreURpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSxcbiAgICBdKTtcbiAgICBzcGF3blN5bmMoJ2dpdCcsIFsnY29uZmlnJywgJy0tdW5zZXQnLCAnY29yZS5ob29rc1BhdGgnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGxpbnQpIHtcbiAgICBjb25zdCBwcmVQdXNoID0gZ2V0UHJlUHVzaFNjcmlwdChjb25maWcpO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnLCAncHJlcGFyZS5zaCcpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGxldCBsaW50Q29tbWFuZDogc3RyaW5nO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgLy8gQnVuIHJlcG9zIHJlY2VpdmUgd2IgYXMgcGFydCBvZiB3YmZ5J3MgbWFuYWdlZCB0b29sY2hhaW4sIHNvIGdlbmVyYXRlIHRoZVxuICAgIC8vIGZpbmFsIGhvb2sgY29tbWFuZCBvbiB0aGUgZmlyc3QgcnVuIGluc3RlYWQgb2YgY2hhbmdpbmcgaXQgb24gdGhlIHNlY29uZC5cbiAgICBsaW50Q29tbWFuZCA9ICdidW4gLS1idW4gd2IgbGludCc7XG4gIH0gZWxzZSB7XG4gICAgbGludENvbW1hbmQgPSBjb25maWcuZGVwZW5kaW5nLndiID8gJ3lhcm4gd2IgbGludCcgOiAneWFybiBydW4gbGludCc7XG4gIH1cbiAgY29uc3QgcXVpZXRMaW50Q29tbWFuZCA9IGAke2xpbnRDb21tYW5kfSAtLXF1aWV0YDtcbiAgLy8gTm8gc2VwYXJhdGUgdHlwZWNoZWNrIHN0ZXAgbmVlZGVkIOKAlCB0aGUgbGludCBjb21tYW5kIGFscmVhZHkgaW5jbHVkZXMgdHlwZWNoZWNraW5nLlxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHtxdWlldExpbnRDb21tYW5kfVxuYC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHF1aWV0TGludENvbW1hbmQ7XG59XG5cbmZ1bmN0aW9uIGdldFByZUNvbW1pdEpvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogTGVmdGhvb2tKb2JbXSB7XG4gIHJldHVybiBwcmVDb21taXRTZXR0aW5ncy5qb2JzLm1hcCgoam9iKSA9PlxuICAgIGpvYi5uYW1lID09PSAnY2xlYW51cCdcbiAgICAgID8ge1xuICAgICAgICAgIC4uLmpvYixcbiAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICBydW46IGdldENsZWFudXBDb21tYW5kKGNvbmZpZyksXG4gICAgICAgIH1cbiAgICAgIDogam9iXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBHbG9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBMZXQgYHdiIGxpbnQgLS1mb3JtYXRgIGRlY2lkZSB3aGV0aGVyIFByZXR0aWVyIGlzIGF2YWlsYWJsZTsgdGhlIGhvb2tcbiAgLy8gc3RpbGwgbmVlZHMgdG8gdHJpZ2dlciB3aGVuIGFkZGluZyB0aGUgZmlyc3QgcHJldHRpZXItb25seSBmaWxlLlxuICBjb25zdCBzdXBwb3J0ZWRFeHRlbnNpb25zID1cbiAgICBjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy53YiB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKSA/IFsuLi5leHRlbnNpb25zLnByZXR0aWVyT25seV0gOiBbXTtcbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goLi4uZXh0ZW5zaW9ucy5veGZtdCwgLi4uZXh0ZW5zaW9ucy5veGxpbnQpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgncHknKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ2RhcnQnKTtcbiAgfVxuICBjb25zdCBmaWx0ZXJlZEV4dGVuc2lvbnMgPSBbLi4ubmV3IFNldChzdXBwb3J0ZWRFeHRlbnNpb25zKV0udG9Tb3J0ZWQoKTtcbiAgcmV0dXJuIGAqKi8qLnske2ZpbHRlcmVkRXh0ZW5zaW9ucy5qb2luKCcsJyl9fWA7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZykpIHtcbiAgICByZXR1cm4gU3RyaW5nLnJhd2BcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxueWFybiB3b3Jrc3BhY2UgQHdpbGxib29zdGVyL3diIHN0YXJ0IC0td29ya2luZy1kaXIgXCIkKGdpdCByZXYtcGFyc2UgLS1zaG93LXRvcGxldmVsKVwiIGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG4gIC8vIFB5dGhvbi1vbmx5IEJ1biByZXBvcyBpbnN0YWxsIHdiIGZvciBzaGFyZWQgc2NyaXB0cyBidXQgbm90IE94bGludCwgc29cbiAgLy8gc3RhZ2VkLWZpbGUgaG9va3MgbXVzdCB1c2UgdGhlIGxhbmd1YWdlLXNwZWNpZmljIGZvcm1hdHRlciBwYXRoIGJlbG93LlxuICBjb25zdCBjYW5Vc2VXYkZvclN0YWdlZEZpbGVzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcbiAgaWYgKChjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy53YikgJiYgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcykge1xuICAgIHJldHVybiBgXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbiR7Y29uZmlnLmlzQnVuID8gJ2J1biAtLWJ1biB3YicgOiAneWFybiB3Yid9IGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG5cbiAgY29uc3Qgb3hsaW50UGF0dGVybiA9IGV4dGVuc2lvbnMub3hsaW50Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IG94Zm10UGF0dGVybiA9IGV4dGVuc2lvbnMub3hmbXQubWFwKChleHRlbnNpb24pID0+IFN0cmluZy5yYXdgXFwuJHtleHRlbnNpb259JGApLmpvaW4oJ3wnKTtcbiAgY29uc3QgcHJldHRpZXJQYXR0ZXJuID0gZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkubWFwKChleHRlbnNpb24pID0+IFN0cmluZy5yYXdgXFwuJHtleHRlbnNpb259JGApLmpvaW4oJ3wnKTtcbiAgY29uc3QgaGFzSnNPclRzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIHJldHVybiBTdHJpbmcucmF3YFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG4ke2hhc0pzT3JUcyA/IFN0cmluZy5yYXdgb3hsaW50X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke294bGludFBhdHRlcm59KScgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7aGFzSnNPclRzID8gU3RyaW5nLnJhd2BveGZtdF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoJHtveGZtdFBhdHRlcm59KScgfCBncmVwIC12IC1FICcoXnwvKXBhY2thZ2VcXC5qc29uJCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7aGFzSmF2YSA/IFN0cmluZy5yYXdgcHJldHRpZXJfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKCR7cHJldHRpZXJQYXR0ZXJufSknIHx8IHRydWUpXCJgIDogJyd9XG5wYWNrYWdlX2pzb25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJcbiR7aGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKSA/IFN0cmluZy5yYXdgcHl0aG9uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLnB5JCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7Y29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgPyBTdHJpbmcucmF3YGRhcnRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwuZGFydCQnIHwgZ3JlcCAtdiAnZ2VuZXJhdGVkJyB8IGdyZXAgLXYgJ1xcLmZyZWV6ZWRcXC5kYXJ0JCcgfCBncmVwIC12ICdcXC5nXFwuZGFydCQnIHx8IHRydWUpXCJgIDogJyd9XG5cbiR7XG4gIGhhc0pzT3JUc1xuICAgID8gU3RyaW5nLnJhd2BcbmlmIFsgLW4gXCIkb3hmbXRfZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICchKiovcGFja2FnZS5qc29uJyAkb3hmbXRfZmlsZXNcbmZpXG5gXG4gICAgOiAnJ1xufVxuJHtcbiAgaGFzSmF2YVxuICAgID8gU3RyaW5nLnJhd2BpZiBbIC1uIFwiJHByZXR0aWVyX2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSAtLWlnbm9yZS11bmtub3duIC0tICRwcmV0dGllcl9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuJHtcbiAgaGFzSnNPclRzXG4gICAgPyBTdHJpbmcucmF3YFxuaWYgWyAtbiBcIiRveGxpbnRfZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vb3hsaW50IC0tZml4ICRveGxpbnRfZmlsZXNcbmZpXG5gXG4gICAgOiAnJ1xufVxuaWYgWyAtbiBcIiRwYWNrYWdlX2pzb25fZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vc29ydC1wYWNrYWdlLWpzb24gLS0gJHBhY2thZ2VfanNvbl9maWxlc1xuZmlcbiR7XG4gIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZylcbiAgICA/IGBpZiBbIC1uIFwiJHB5dGhvbl9maWxlc1wiIF07IHRoZW5cbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gYmxhY2sgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBmbGFrZTggJHB5dGhvbl9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuJHtcbiAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWxcbiAgICA/IGBpZiBbIC1uIFwiJGRhcnRfZmlsZXNcIiBdOyB0aGVuXG4gIGRhcnQgZm9ybWF0ICRkYXJ0X2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG5gLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgbG9jYWxXYlBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2VzJywgJ3diJywgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCkpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgeyBuYW1lPzogc3RyaW5nIH07XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm5hbWUgPT09ICdAd2lsbGJvb3N0ZXIvd2InO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLmhhc1ZlcnNpb25TZXR0aW5ncykge1xuICAgIGNvbnN0IHRvb2xzQ2hhbmdlZFBhdHRlcm4gPSBTdHJpbmcucmF3YChtaXNlXFwudG9tbHxcXC5taXNlXFwudG9tbHxcXC50b29sLXZlcnNpb25zfFxcLi4rLXZlcnNpb24pYDtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIke3Rvb2xzQ2hhbmdlZFBhdHRlcm59XCIgXCJtaXNlIGluc3RhbGxcImApO1xuICB9XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBpbnN0YWxsJyA6ICd5YXJuJztcbiAgY29uc3Qgcm1OZXh0RGlyZWN0b3J5ID0gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQgPyAnICYmIHJtIC1SZiAubmV4dCcgOiAnJztcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicGFja2FnZVxcLmpzb25cIiBcIiR7aW5zdGFsbENvbW1hbmR9JHtybU5leHREaXJlY3Rvcnl9XCJgKTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwb2V0cnlcXC5sb2NrXCIgXCJwb2V0cnkgaW5zdGFsbFwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInV2XFwubG9ja1wiIFwidXYgc3luYyAtLWZyb3plblwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgZ2VuZXJhdGVcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogY29kZWdlblwiYFxuICAgICk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgZ2VuZXJhdGVcImBcbiAgICApO1xuICB9XG4gIGNvbnN0IGdlbkkxOG5Uc0NvbW1hbmQgPSBnZXRHZW5JMThuVHNDb21tYW5kKGNvbmZpZywgY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzKTtcbiAgaWYgKGdlbkkxOG5Uc0NvbW1hbmQpIHtcbiAgICAvLyBnZW4taTE4bi10cyBvdXRwdXRzIGFyZSBjb21tb25seSBpZ25vcmVkLCBzbyBwb3N0LW1lcmdlIHJlZ2VuZXJhdGVzIHRoZW0gYWZ0ZXIgcHVsbGVkIHJlc291cmNlIGNoYW5nZXMuXG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKF58LylpMThuLy4qXFwuanNvbiRcIiBcIiR7Z2VuSTE4blRzQ29tbWFuZH1cImApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cblxuZnVuY3Rpb24gaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUnVubmVyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnkgcnVuJyB8ICd1diBydW4nIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblV2TG9jayA/ICd1diBydW4nIDogJ3BvZXRyeSBydW4nO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGludHN0YWdlZHJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShgJHtjb25maWcuZGlyUGF0aH0vLmxpbnRzdGFnZWRyYy5janNgLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShgJHtjb25maWcuZGlyUGF0aH0vLmxpbnRzdGFnZWRyYy5qc2AsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmpzb25gLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICBdKTtcbiAgfSk7XG59XG4iLCJpbnRlcmZhY2UgVG9vbENvbmZpZ0NvbnRlbnRPcHRpb25zIHtcbiAgcGFja2FnZU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVG9vbENvbmZpZ0NvbnRlbnQob3B0aW9uczogVG9vbENvbmZpZ0NvbnRlbnRPcHRpb25zKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBpbXBvcnQgY29uZmlnIGZyb20gJyR7b3B0aW9ucy5wYWNrYWdlTmFtZX0nO1xuXG5leHBvcnQgZGVmYXVsdCBjb25maWc7XG5gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVG9vbENvbmZpZ0NvbnRlbnQoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbnRlbnQ/LnRyaW0oKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVUb29sQ29uZmlnQ29udGVudCwgbm9ybWFsaXplVG9vbENvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL3Rvb2xDb25maWdDb250ZW50LmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGZtdENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsZWdhY3lKc29uQ29uZmlnUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5veGZtdHJjLmpzb24nKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294Zm10LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID0gZ2V0Q29uZmlnQ29udGVudCgpO1xuICAgIGNvbnN0IHByb21pc2VzID0gW3Byb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShsZWdhY3lKc29uQ29uZmlnUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSldO1xuICAgIGlmIChub3JtYWxpemVUb29sQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVUb29sQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KCk6IHN0cmluZyB7XG4gIHJldHVybiBnZW5lcmF0ZVRvb2xDb25maWdDb250ZW50KHtcbiAgICBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLFxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVUb29sQ29uZmlnQ29udGVudCB9IGZyb20gJy4vdG9vbENvbmZpZ0NvbnRlbnQuanMnO1xuXG50eXBlIE94bGludEJsb2NrTmFtZSA9ICdiYXNlJyB8ICdleHBvcnQnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBfcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hsaW50Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIHdpbGxib29zdGVyLWNvbmZpZ3MgcHVibGlzaGVzIGNvbmZpZyBmaWxlcyBhcyBwcm9kdWN0IGNvZGUsIHNvIG1pZ3JhdGlvblxuICAgIC8vIG11c3Qgbm90IHJlbW92ZSBwYWNrYWdlLXByb3ZpZGVkIGxpbnRlciBzZXR0aW5ncy5cbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyA9IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hsaW50LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID1cbiAgICAgIHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnICYmIGV4aXN0aW5nQ29udGVudFxuICAgICAgICA/IGV4aXN0aW5nQ29udGVudFxuICAgICAgICA6IGdldENvbmZpZ0NvbnRlbnRXaXRoTWFuYWdlZEJsb2Nrcyhjb25maWcsIGV4aXN0aW5nQ29udGVudCwgZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGlmICghc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcpIHtcbiAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcub3hsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5janMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy55YW1sJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy50cycpLCB7IGZvcmNlOiB0cnVlIH0pKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG5vcm1hbGl6ZVRvb2xDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZVRvb2xDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgcHJvbWlzZXMucHVzaChwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpKSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnRXaXRoTWFuYWdlZEJsb2NrcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBnZXRDb25maWdDb250ZW50KCk7XG4gIGlmICghZXhpc3RpbmdDb250ZW50KSByZXR1cm4gZGVzaXJlZENvbnRlbnQ7XG4gIGlmIChoYXNNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudCkpIHJldHVybiByZXBsYWNlTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQsIGRlc2lyZWRDb250ZW50LCBmaWxlUGF0aCk7XG4gIHJldHVybiBkZXNpcmVkQ29udGVudDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudCgpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Z2V0TWFuYWdlZEJsb2NrKCdiYXNlJywgXCJpbXBvcnQgY29uZmlnIGZyb20gJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJztcIil9XG5cbiR7Z2V0TWFuYWdlZEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgY29uZmlnOycpfVxuYDtcbn1cblxuZnVuY3Rpb24gaGFzTWFuYWdlZEJsb2Nrcyhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoZ2V0U3RhcnRNYXJrZXIoJ2Jhc2UnKSkgfHwgY29udGVudC5pbmNsdWRlcyhnZXRTdGFydE1hcmtlcignZXhwb3J0JykpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQ6IHN0cmluZywgZGVzaXJlZENvbnRlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBjb250ZW50ID0gZXhpc3RpbmdDb250ZW50O1xuICBmb3IgKGNvbnN0IGJsb2NrTmFtZSBvZiBbJ2Jhc2UnLCAnZXhwb3J0J10gc2F0aXNmaWVzIE94bGludEJsb2NrTmFtZVtdKSB7XG4gICAgY29uc3QgcmVwbGFjZW1lbnQgPSBleHRyYWN0TWFuYWdlZEJsb2NrKGRlc2lyZWRDb250ZW50LCBibG9ja05hbWUpO1xuICAgIGlmICghcmVwbGFjZW1lbnQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgbmV4dENvbnRlbnQgPSByZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQsIGJsb2NrTmFtZSwgcmVwbGFjZW1lbnQpO1xuICAgIGlmICghbmV4dENvbnRlbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyBpbmNvbXBsZXRlICR7YmxvY2tOYW1lfSBibG9jayBpbiBveGxpbnQgY29uZmlnOiAke2ZpbGVQYXRofWApO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nQ29udGVudDtcbiAgICB9XG4gICAgY29udGVudCA9IG5leHRDb250ZW50O1xuICB9XG4gIHJldHVybiBjb250ZW50O1xufVxuXG5mdW5jdGlvbiBleHRyYWN0TWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBPeGxpbnRCbG9ja05hbWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSkuZXhlYyhjb250ZW50KT8uWzBdO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBPeGxpbnRCbG9ja05hbWUsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXR0ZXJuID0gZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSk7XG4gIGlmICghcGF0dGVybi50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50KTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZTogT3hsaW50QmxvY2tOYW1lKTogUmVnRXhwIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYCR7ZXNjYXBlUmVnRXhwKGdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpfVtcXFxcc1xcXFxTXSo/JHtlc2NhcGVSZWdFeHAoZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSkpfWApO1xufVxuXG5mdW5jdGlvbiBnZXRNYW5hZ2VkQmxvY2soYmxvY2tOYW1lOiBPeGxpbnRCbG9ja05hbWUsIGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtnZXRTdGFydE1hcmtlcihibG9ja05hbWUpfVxuJHtjb250ZW50fVxuJHtnZXRFbmRNYXJrZXIoYmxvY2tOYW1lKX1gO1xufVxuXG5mdW5jdGlvbiBnZXRTdGFydE1hcmtlcihibG9ja05hbWU6IE94bGludEJsb2NrTmFtZSk6IHN0cmluZyB7XG4gIHJldHVybiBgLy8gd2JmeTpzdGFydCBveGxpbnQtJHtibG9ja05hbWV9YDtcbn1cblxuZnVuY3Rpb24gZ2V0RW5kTWFya2VyKGJsb2NrTmFtZTogT3hsaW50QmxvY2tOYW1lKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAvLyB3YmZ5OmVuZCBveGxpbnQtJHtibG9ja05hbWV9YDtcbn1cblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGlmICghZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlYWRtZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlYWRtZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ1JFQURNRS5tZCcpO1xuICAgIGxldCBuZXdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBzZW1hbnRpY1JlbGVhc2VCYWRnZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zbGljZShjb25maWcucmVwb3NpdG9yeS5pbmRleE9mKCc6JykgKyAxKTtcbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5leGlzdHNTeW5jKHdvcmtmbG93c1BhdGgpID8gZnMucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aCkgOiBbXTtcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lcykge1xuICAgICAgaWYgKCFmaWxlTmFtZS5zdGFydHNXaXRoKCd0ZXN0JykgJiYgIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSBjb250aW51ZTtcblxuICAgICAgbGV0IGJhZGdlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgYmFkZ2VOYW1lID0gKGJhZGdlTmFtZVswXSB8fCAnJykudG9VcHBlckNhc2UoKSArIGJhZGdlTmFtZS5zbGljZSgxLCBiYWRnZU5hbWUuaW5kZXhPZignLicpKTtcbiAgICAgIGJhZGdlTmFtZSA9IGJhZGdlTmFtZS5yZXBsYWNlKCctJywgJyAnKTtcbiAgICAgIGlmICghcmVwb3NpdG9yeSkgY29udGludWU7XG4gICAgICBjb25zdCBiYWRnZSA9IGBbIVske2JhZGdlTmFtZX1dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9L2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9KWA7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuZ2l0aHViL3dvcmtmbG93cy8ke2ZpbGVOYW1lfWApKSkge1xuICAgICAgICBuZXdDb250ZW50ID0gcmVtb3ZlR2l0SHViQWN0aW9uc0JhZGdlKG5ld0NvbnRlbnQsIGJhZGdlTmFtZSwgZmlsZU5hbWUpO1xuICAgICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgYmFkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0QmFkZ2UocmVhZG1lOiBzdHJpbmcsIGJhZGdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDml6LjgatiYWRnZeOBjOOBguOCi+WgtOWQiOOBr+WJiumZpFxuICByZWFkbWUgPSByZWFkbWUucmVwbGFjZShiYWRnZSwgJycpLnJlcGxhY2VBbGwoL1xcblxcblxcbisvZywgJ1xcblxcbicpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVhZG1lLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlYWRtZVtpIC0gMV0gPT09ICdcXG4nICYmIHJlYWRtZVtpXSA9PT0gJ1xcbicpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHJlYWRtZS5zbGljZSgwLCBpICsgMSk7XG4gICAgICBsZXQgYWZ0ZXIgPSByZWFkbWUuc2xpY2UoaSArIDEpO1xuICAgICAgaWYgKCFhZnRlci5zdGFydHNXaXRoKCdbJykgJiYgIWFmdGVyLnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgICBhZnRlciA9IGBcXG4ke2FmdGVyfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7YmVmb3JlfSR7YmFkZ2V9XFxuJHthZnRlcn1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7cmVhZG1lfVxcbiR7YmFkZ2V9XFxuYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUdpdEh1YkFjdGlvbnNCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2VOYW1lOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBlc2NhcGVkQmFkZ2VOYW1lID0gZXNjYXBlUmVnRXhwKGJhZGdlTmFtZSk7XG4gIGNvbnN0IGVzY2FwZWRGaWxlTmFtZSA9IGVzY2FwZVJlZ0V4cChmaWxlTmFtZSk7XG4gIHJldHVybiByZWFkbWVcbiAgICAucmVwbGFjZUFsbChcbiAgICAgIG5ldyBSZWdFeHAoXG4gICAgICAgIFN0cmluZy5yYXdgXFxbIVxcWyR7ZXNjYXBlZEJhZGdlTmFtZX1cXF1cXChodHRwczovL2dpdGh1YlxcLmNvbS9bXi9cXHMpXSsvW14vXFxzKV0rL2FjdGlvbnMvd29ya2Zsb3dzLyR7ZXNjYXBlZEZpbGVOYW1lfS9iYWRnZVxcLnN2Z1xcKVxcXVxcKGh0dHBzOi8vZ2l0aHViXFwuY29tL1teL1xccyldKy9bXi9cXHMpXSsvYWN0aW9ucy93b3JrZmxvd3MvJHtlc2NhcGVkRmlsZU5hbWV9XFwpXFxuP2AsXG4gICAgICAgICdndSdcbiAgICAgICksXG4gICAgICAnJ1xuICAgIClcbiAgICAucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWxlYXNlcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIHVua25vd25dKVtdO1xuICAgIH07XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMgPz8gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW5FbnRyeSA9IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSk7XG4gICAgICBjb25zdCBwbHVnaW4gPSBpc0FycmF5ID8gcGx1Z2luRW50cnlbMF0gOiBwbHVnaW5FbnRyeTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChpc0FycmF5ICYmIHBsdWdpbkVudHJ5WzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb241J10sXG59O1xuXG50eXBlIFNldHRpbmdzID0gdHlwZW9mIGpzb25PYmogJiB7IHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W10gfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKSBhcyBTZXR0aW5ncztcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3Jlbm92YXRlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhgJHtmaWxlUGF0aH01YCkpIHtcbiAgICAgIC8vIFNpbmNlIGl0IGlzIGRpZmZpY3VsdCBmb3IgcGFyc2luZyByZW5vdmF0ZS5qc29uNSwgd2UgZG8gbm90aGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbmV3U2V0dGluZ3MuZXh0ZW5kcy5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gJ0B3aWxsYm9vc3RlcicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMuc29tZSgocnVsZTogeyBtYXRjaFBhY2thZ2VOYW1lcz86IHN0cmluZ1tdIH0pID0+XG4gICAgICAgICAgcnVsZS5tYXRjaFBhY2thZ2VOYW1lcz8uaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQWdlbnRTa2lsbHMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2luc3RhbGxBZ2VudFNraWxscycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUT0RPOiBXZSBhcmUgdGVtcG9yYXJpbHkgcmVtb3ZpbmcgYWdlbnQgc2tpbGxzIGZyb20gdGhlIHJlcG9cbiAgICAvLyBhd2FpdCBydW5JbnN0YWxsQWdlbnRTa2lsbHMocm9vdENvbmZpZyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZnMucm0ocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5hZ2VudHMnKSwge1xuICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSksXG4gICAgICBmcy5ybShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmNsYXVkZScpLCB7XG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICB9KSxcbiAgICAgIGZzLnJtKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdza2lsbHMtbG9jay5qc29uJyksIHtcbiAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICB9KSxcbiAgICBdKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB0eXBlIHsgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0V4dGVuZHMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuXG5jb25zdCByb290SnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgfSxcbiAgZXhjbHVkZTogWydwYWNrYWdlcy8qL3Rlc3QvZml4dHVyZXMnLCAndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbXG4gICAgJyouY29uZmlnLnRzJyxcbiAgICAncGFja2FnZXMvKi8qLmNvbmZpZy50cycsXG4gICAgJ3BhY2thZ2VzLyovc2NyaXB0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zcmMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovdGVzdC8qKi8qJyxcbiAgICAnc2NyaXB0cy8qKi8qJyxcbiAgICAnc3JjLyoqLyonLFxuICAgICd0ZXN0LyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgfSxcbiAgZXhjbHVkZTogWyd0ZXN0L2ZpeHR1cmVzJ10sXG4gIC8vIHdiZnkgZ2VuZXJhdGVzIHJvb3QtbGV2ZWwgdG9vbCBjb25maWdzIHN1Y2ggYXMgcGxheXdyaWdodC5jb25maWcudHMsIGFuZFxuICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgbmVlZHMgdGhvc2UgZmlsZXMgaW4gdGhlIHByb2plY3QgdG8gc2VlIE5vZGUvQnVuIGdsb2JhbHMuXG4gIGluY2x1ZGU6IFsnKi5jb25maWcudHMnLCAnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIGF3YWl0IGNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzKGNvbmZpZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGNvbmZpZy5pc1Jvb3QgPyByb290SnNvbk9iaiA6IHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBjb25zdCBnZW5lcmF0ZWRUeXBlcyA9IGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnJvb3REaXIgPSBnZXRSb290RGlyKGNvbmZpZyk7XG4gICAgaWYgKGdlbmVyYXRlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCB0eXBlczogZ2VuZXJhdGVkVHlwZXMgfTtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCAmJiAhY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmlzQnVuICYmICFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywganN4OiAncmVhY3QtanN4JyB9O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgICAgbmV3U2V0dGluZ3MuZXhjbHVkZSA9IG5ld1NldHRpbmdzLmV4Y2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICAvLyBQcmlzbWEgc2VlZHMgYW5kIG1pZ3JhdGlvbiBoZWxwZXIgc2NyaXB0cyBvZnRlbiBsaXZlIG91dHNpZGUgc3JjLCBidXRcbiAgICAgIC8vIHR5cGUtYXdhcmUgbGludGluZyBzdGlsbCBuZWVkcyB0aGVtIGNvdmVyZWQgYnkgdGhlIHByb2plY3QgY29uZmlnLlxuICAgICAgYWRkSW5jbHVkZVBhdGgobmV3U2V0dGluZ3MsICdwcmlzbWEvKiovKicpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVHlwZXMgPSBub3JtYWxpemVTdHJpbmdBcnJheShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnR5cGVzKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW1pdE1ldGFkYXRhID0gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMobmV3U2V0dGluZ3MuZXh0ZW5kcywgb2xkU2V0dGluZ3MuZXh0ZW5kcyk7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSk7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKFxuICAgICAgICAoZGlyUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fLycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCd0ZXN0cy8nKVxuICAgICAgKTtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgICAvLyB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZy5qc29uIGlzIGEgbGludC90eXBlY2hlY2sgcHJvamVjdCwgbm90IHRoZSBlbWl0XG4gICAgICAvLyBjb250cmFjdC4gSXQgbXVzdCBrZWVwIHJvb3REaXIgYnJvYWQgZW5vdWdoIGZvciByb290IGNvbmZpZyBmaWxlcyxcbiAgICAgIC8vIHNjcmlwdHMsIHNyYywgYW5kIHRlc3RzLiBidWlsZC10cyBvd25zIGVtaXQgYW5kIGNyZWF0ZXMgYSB0ZW1wb3JhcnlcbiAgICAgIC8vIHNyYy1vbmx5IHRzY29uZmlnIHdpdGggbm9FbWl0PWZhbHNlLCBlbWl0RGVjbGFyYXRpb25Pbmx5PXRydWUsXG4gICAgICAvLyByb290RGlyPVwic3JjXCIsIGFuZCBpbmNsdWRlPVtcInNyYy8qKi8qXCJdLCBzbyBwcmVzZXJ2aW5nIG5vRW1pdD1mYWxzZSBvclxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiIGhlcmUgd291bGQgb25seSBicmVhayBub24tc3JjIHR5cGUtYXdhcmUgbGludCBjb3ZlcmFnZS5cbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCAuLi5leGlzdGluZ0VtaXRNZXRhZGF0YSB9O1xuICAgICAgZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eShuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuXG4gICAgICBjb25zdCBtZXJnZWRUeXBlcyA9IFsuLi5uZXcgU2V0KFsuLi5maWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXMsIGdlbmVyYXRlZFR5cGVzKSwgLi4uZ2VuZXJhdGVkVHlwZXNdKV07XG4gICAgICBpZiAobWVyZ2VkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXMgPSBtZXJnZWRUeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXM7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkRGVsZXRlVHlwZVJvb3RzKGdlbmVyYXRlZFR5cGVzKSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVSb290cztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgLy8gUGFja2FnZSBpbXBvcnRzIHNob3VsZCByZXNvbHZlIHRocm91Z2ggcGFja2FnZSBleHBvcnRzIGluc3RlYWQgb2YgYmFzZVVybC5cbiAgICAvLyBwYXRocyBpcyBpbnRlbnRpb25hbGx5IHByZXNlcnZlZCBzbyByZXBvLWxvY2FsIHRvb2xpbmcgY2FuIGtlZXAgZXhwbGljaXRcbiAgICAvLyBhbGlhc2VzIHdpdGhvdXQgcmVseWluZyBvbiBiYXNlVXJsJ3MgYnJvYWQgZmFsbGJhY2sgcmVzb2x1dGlvbi5cbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsO1xuICAgIGRlbGV0ZUxlZ2FjeU1vZHVsZVNldHRpbmdzKG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgY29uZmlnKTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udmVyYmF0aW1Nb2R1bGVTeW50YXg7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cExlZ2FjeVRzY29uZmlnTW9kdWxlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgVHNDb25maWdKc29uO1xuICAgIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzKHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMikpKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTmV4dC9CbGl0eiBvd24gdGhlaXIgdHNjb25maWcgc2hhcGUsIGJ1dCBUeXBlU2NyaXB0IDYgbm8gbG9uZ2VyIGFjY2VwdHNcbiAgICAvLyBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmdzIHRoYXQgb2xkZXIgcHJvamVjdHMgY29tbW9ubHkgaW5oZXJpdGVkLlxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzKGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuICBpZiAoXG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlJyB8fFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnTm9kZScgfHxcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUxMCcgfHxcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gdW5kZWZpbmVkXG4gICkge1xuICAgIC8vIE5leHQuanMgd3JpdGVzIFwibm9kZVwiIGR1cmluZyBidWlsZCB3aGVuIHRoaXMgb3B0aW9uIGlzIG1pc3NpbmcsIGJ1dFxuICAgIC8vIHRzZ29saW50IHRyZWF0cyB0aGF0IHNwZWxsaW5nIGFzIHRoZSByZW1vdmVkIG5vZGUxMCByZXNvbHZlci5cbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9ICdidW5kbGVyJztcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyhjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcblxuICAvLyB0c2dvbGludCBmb2xsb3dzIFR5cGVTY3JpcHQgNiB2YWxpZGF0aW9uLCB3aGVyZSBiYXNlVXJsIGlzIHJlbW92ZWQgYW5kXG4gIC8vIHBhdGggdGFyZ2V0cyBtdXN0IGJlIGV4cGxpY2l0bHkgcmVsYXRpdmUuIE5leHQuanMgc3RpbGwgYWNjZXB0cyB0aGUgYWxpYXNcbiAgLy8gc2hhcGUgYWZ0ZXIgZWFjaCB0YXJnZXQgaXMgd3JpdHRlbiB3aXRoIGEgbGVhZGluZyAuLy5cbiAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5iYXNlVXJsO1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucy5wYXRocykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3QgW2FsaWFzLCB0YXJnZXRzXSBvZiBPYmplY3QuZW50cmllcyhjb21waWxlck9wdGlvbnMucGF0aHMpKSB7XG4gICAgY29tcGlsZXJPcHRpb25zLnBhdGhzW2FsaWFzXSA9IG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aEFsaWFzVGFyZ2V0cyh0YXJnZXRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHRhcmdldHMubWFwKCh0YXJnZXQpID0+IHtcbiAgICBpZiAodGFyZ2V0LnN0YXJ0c1dpdGgoJy4vJykgfHwgdGFyZ2V0LnN0YXJ0c1dpdGgoJy4uLycpIHx8IHBhdGguaXNBYnNvbHV0ZSh0YXJnZXQpKSByZXR1cm4gdGFyZ2V0O1xuICAgIHJldHVybiBgLi8ke3RhcmdldH1gO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdERpcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnLmlzUm9vdCkgcmV0dXJuICcuJztcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpID8gJy4uLy4uJyA6ICcuJztcbn1cblxuZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMoXG4gIGdlbmVyYXRlZEV4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddLFxuICBleGlzdGluZ0V4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddXG4pOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSB7XG4gIGNvbnN0IG1lcmdlZEV4dGVuZHMgPSBbLi4ubm9ybWFsaXplRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzKSwgLi4ubm9ybWFsaXplRXh0ZW5kcyhleGlzdGluZ0V4dGVuZHMpXTtcbiAgY29uc3QgdW5pcXVlRXh0ZW5kcyA9IFsuLi5uZXcgU2V0KG1lcmdlZEV4dGVuZHMpXTtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDEpIHJldHVybiB1bmlxdWVFeHRlbmRzWzBdO1xuICByZXR1cm4gdW5pcXVlRXh0ZW5kcztcbn1cblxuZnVuY3Rpb24gYWRkSW5jbHVkZVBhdGgoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHNldHRpbmdzLmluY2x1ZGUgPz89IFtdO1xuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoZGlyUGF0aCkpIHtcbiAgICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5kcyh2YWx1ZTogVHNDb25maWdKc29uWydleHRlbmRzJ10pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWxldGVUeXBlUm9vdHModHlwZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGdlbmVyYXRlZCBwYWNrYWdlLW93bmVkIHRlc3QgdHlwZXMgc2hvdWxkIHRyaWdnZXIgdGhpcy4gVXNlci1kZWZpbmVkIHNsYXNoLWJhc2VkXG4gIC8vIGVudHJpZXMgbWF5IGludGVudGlvbmFsbHkgcmVseSBvbiBjdXN0b20gdHlwZVJvb3RzIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIGFzLWlzLlxuICByZXR1cm4gdHlwZU5hbWVzLnNvbWUoKHR5cGVOYW1lKSA9PiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lLmluY2x1ZGVzKCcvJykpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXM6IHN0cmluZ1tdLCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdlbmVyYXRlZFR5cGVTZXQgPSBuZXcgU2V0KGdlbmVyYXRlZFR5cGVzKTtcbiAgcmV0dXJuIGV4aXN0aW5nVHlwZXMuZmlsdGVyKCh0eXBlTmFtZSkgPT4ge1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBwYWNrYWdlLXByb3ZpZGVkIHRlc3QgZ2xvYmFscy4gRHJvcCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlXG4gICAgLy8gY29ycmVzcG9uZGluZyBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBwcmVzZW50IHNvIFR5cGVTY3JpcHQgd29uJ3QgcmVxdWlyZVxuICAgIC8vIG1pc3NpbmcgcGFja2FnZXMgc3VjaCBhcyB2aXRlc3QuXG4gICAgaWYgKGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWUpICYmICFnZW5lcmF0ZWRUeXBlU2V0Lmhhcyh0eXBlTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZSA9PT0gJ2plc3QnIHx8IHR5cGVOYW1lID09PSAnbW9jaGEnIHx8IHR5cGVOYW1lID09PSAndml0ZXN0L2dsb2JhbHMnO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5KGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuICBpZiAoY29tcGlsZXJPcHRpb25zLm5vRW1pdCAhPT0gZmFsc2UgfHwgY29tcGlsZXJPcHRpb25zLmVtaXREZWNsYXJhdGlvbk9ubHkgPT09IHRydWUpIHJldHVybjtcblxuICAvLyBAdHNjb25maWcvYnVuIGVuYWJsZXMgYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnMsIHdoaWNoIFR5cGVTY3JpcHQgcGVybWl0c1xuICAvLyBkdXJpbmcgZW1pdCBvbmx5IHdoZW4gcmVsYXRpdmUgVFMgZXh0ZW5zaW9ucyBhcmUgcmV3cml0dGVuLlxuICBjb21waWxlck9wdGlvbnMucmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9ucyA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIGRlbGV0ZUxlZ2FjeU1vZHVsZVNldHRpbmdzKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gVHlwZVNjcmlwdCA2IHJlbW92ZWQgdGhlIG9sZCBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmcsIHNvIGluaGVyaXRlZCBiYXNlIGNvbmZpZ3NcbiAgLy8gc2hvdWxkIGNob29zZSB0aGUgcmVzb2x2ZXIgdW5sZXNzIGEgcHJvamVjdCBhbHJlYWR5IG9wdGVkIGludG8gYSBtb2Rlcm4gb25lLlxuICBpZiAoXG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlJyB8fFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnTm9kZScgfHxcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUxMCdcbiAgKSB7XG4gICAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb21waWxlck9wdGlvbnMubW9kdWxlICE9PSAnRVNOZXh0JykgcmV0dXJuO1xuXG4gIC8vIE5vZGUgYmFzZSBjb25maWdzIG5vdyBwYWlyIHRoZWlyIHJlc29sdmVyIHdpdGggYSBtYXRjaGluZyBtb2R1bGUga2luZC4gS2VlcGluZ1xuICAvLyBvbGRlciBFU05leHQgb3ZlcnJpZGVzIGNyZWF0ZXMgaW52YWxpZCBnZW5lcmF0ZWQgY29uZmlncyBmb3IgVFMgNi5cbiAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGU7XG59XG5cbmZ1bmN0aW9uIHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddXG4pOiBQaWNrPE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LCAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnPiB7XG4gIGNvbnN0IGVtaXRPcHRpb25zID0ge30gYXMgUGljazxcbiAgICBOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPixcbiAgICAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnXG4gID47XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnZGVjbGFyYXRpb24nLCAnZGVjbGFyYXRpb25NYXAnLCAnc291cmNlTWFwJ10gYXMgY29uc3QpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbXBpbGVyT3B0aW9ucz8uW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVtaXRPcHRpb25zW2tleV0gPSB2YWx1ZSBhcyBuZXZlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVtaXRPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2J1bicpO1xuICB9IGVsc2UgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbm9kZScpO1xuICB9XG4gIGlmIChcbiAgICBkZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgIGRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgZGVwZW5kZW5jaWVzWydqZXN0LWVudmlyb25tZW50LWpzZG9tJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICApIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdqZXN0Jyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy52aXRlc3QpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCd2aXRlc3QvZ2xvYmFscycpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMubW9jaGEpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdtb2NoYScpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMuY3lwcmVzcykge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2N5cHJlc3MnKTtcbiAgfVxuXG4gIHJldHVybiBbLi4udHlwZU5hbWVzXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBleGNsdWRlRmlsZVBhdHRlcm5zID0gW1xuICAnKiovLmdpdC9vYmplY3RzLyoqJyxcbiAgJyoqLy5naXQvc3VidHJlZS1jYWNoZS8qKicsXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovdG1wLyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovZGlzdC8qKicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVZzY29kZVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpO1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIC8vIExMTeOBq+OCiOOCi3ZpYmUgY29kaW5n44Gn44Gv44CB6Ieq5YuV44OV44Kp44O844Oe44OD44OI44KE44Kz44O844OJ44Ki44Kv44K344On44Oz44KS54Sh5Yq55YyW44GZ44KL44GT44Go44GnXG4gICAgICAvLyDnlJ/miJDjgZXjgozjgZ/jgrPjg7zjg4njga7lhYPjga7lvaLlvI/jgpLntq3mjIHjgafjgY3jgotcbiAgICAgIGlmICgnZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZSddO1xuICAgICAgfVxuICAgICAgaWYgKCdlZGl0b3IuZm9ybWF0T25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5mb3JtYXRPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCIvLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBOYW1lc3BhY2UgWUFNTCBjYWxscyBtYWtlIGxvYWQvZHVtcCB1c2FnZSBjbGVhcmVyLlxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uVmFsdWVNYXAgfSBmcm9tICdAeWFybnBrZy9jb3JlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxudHlwZSBTZXR0aW5ncyA9IHtcbiAgYXBwcm92ZWRHaXRSZXBvc2l0b3JpZXM/OiBzdHJpbmdbXTtcbiAgZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4OiBzdHJpbmc7XG4gIG5tTW9kZTogc3RyaW5nO1xuICBub2RlTGlua2VyOiBzdHJpbmc7XG4gIG5wbU1pbmltYWxBZ2VHYXRlPzogc3RyaW5nO1xuICBucG1QcmVhcHByb3ZlZFBhY2thZ2VzPzogc3RyaW5nW107XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbn0gJiBQYXJ0aWFsPENvbmZpZ3VyYXRpb25WYWx1ZU1hcD47XG5cbmludGVyZmFjZSBQbHVnaW4ge1xuICBjaGVja3N1bTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNwZWM6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWWFybnJjWW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlWWFybnJjWW1sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHlhcm5yY1ltbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjLnltbCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgneWFybicsIFsnLS12ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0VmVyc2lvbignQHlhcm5wa2cvY2xpJywgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmIChpc05ld2VyVmVyc2lvbihsYXRlc3RWZXJzaW9uLCBjdXJyZW50VmVyc2lvbikpIHtcbiAgICAgIHNwYXduU3luYygneWFybicsIFsnc2V0JywgJ3ZlcnNpb24nLCBsYXRlc3RWZXJzaW9uXSwgY29uZmlnLmRpclBhdGgsIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3JlbGVhc2VzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocmVsZWFzZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihyZWxlYXNlc1BhdGgpKSB7XG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCd5YXJuLScpICYmICFmaWxlLnN0YXJ0c1dpdGgoYHlhcm4tJHtsYXRlc3RWZXJzaW9ufS5gKSkge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZWQnLCBwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFybnJjUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBsZXQgc2V0dGluZ3MgPSB7fSBhcyBTZXR0aW5ncztcbiAgICB0cnkge1xuICAgICAgc2V0dGluZ3MgPSAoeWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzIHwgdW5kZWZpbmVkKSA/PyBzZXR0aW5ncztcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc2V0dGluZ3MuZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4ID0gJyc7XG4gICAgc2V0dGluZ3Mubm9kZUxpbmtlciA9ICdub2RlLW1vZHVsZXMnO1xuICAgIHNldHRpbmdzLm5tTW9kZSA9ICdoYXJkbGlua3MtZ2xvYmFsJztcbiAgICBzZXR0aW5ncy5ucG1NaW5pbWFsQWdlR2F0ZSA9ICc1ZCc7XG4gICAgc2V0dGluZ3MuYXBwcm92ZWRHaXRSZXBvc2l0b3JpZXMgPSBbXG4gICAgICAvLyBZYXJuIDQuMTQgYmxvY2tzIGdpdCBkZXBlbmRlbmNpZXMgdW5sZXNzIHRoZSByZXBvc2l0b3J5IFVSTCBpcyBleHBsaWNpdGx5IGFsbG93ZWQuXG4gICAgICAnaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyTGFiLyouZ2l0JyxcbiAgICAgICdzc2g6Ly9naXRAZ2l0aHViLmNvbS9XaWxsQm9vc3RlckxhYi8qLmdpdCcsXG4gICAgXTtcbiAgICBzZXR0aW5ncy5ucG1QcmVhcHByb3ZlZFBhY2thZ2VzID0gW1xuICAgICAgLy8gLS0tLS0tLS0tLSBTVEFSVDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuICAgICAgJ0BleGVyY29kZS8qJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvKicsXG4gICAgICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAgICAgJ2F0LWRlY29yYXRvcnMnLFxuICAgICAgJ2J1aWxkLXRzJyxcbiAgICAgICdnZW4taTE4bi10cycsXG4gICAgICAnb25lLXdheS1naXQtc3luYycsXG4gICAgICAvLyAtLS0tLS0tLS0tIEVORDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuXG4gICAgICAvLyBUbyBkZWFsIHdpdGggQ1ZFIGxpa2UgaHR0cHM6Ly9uZXh0anMub3JnL2Jsb2cvQ1ZFLTIwMjUtNjY0NzhcbiAgICAgICduZXh0JyxcbiAgICAgICdAbmV4dC8qJyxcbiAgICAgICdAdHlwZXNjcmlwdC8qJyxcbiAgICAgICdAb3hmbXQvKicsXG4gICAgICAnQG94bGludC8qJyxcbiAgICAgICdAb3hsaW50LXRzZ29saW50LyonLFxuICAgICAgJ294Zm10JyxcbiAgICAgICdveGxpbnQnLFxuICAgICAgJ294bGludC10c2dvbGludCcsXG4gICAgICAncmVhY3QnLFxuICAgICAgJ3JlYWN0LWRvbScsXG4gICAgXTtcbiAgICBkZWxldGUgc2V0dGluZ3MuY29tcHJlc3Npb25MZXZlbDtcbiAgICBpZiAoc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcztcbiAgICB9XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L3B1bGwvNDY5OFxuICAgIHNldHRpbmdzLmVuYWJsZUdsb2JhbENhY2hlID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IHNldHRpbmdzLnBsdWdpbnM/Lmxlbmd0aCA/PyAwO1xuICAgIHNldHRpbmdzLnBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zPy5maWx0ZXIoKHApID0+IHAucGF0aCAhPT0gJy55YXJuL3BsdWdpbnMvdW5kZWZpbmVkLmNqcycpID8/IFtdO1xuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCAhPT0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicsICdwbHVnaW5zJywgJ3VuZGVmaW5lZC5janMnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwbHVnaW5QYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MucGx1Z2lucztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHlhcm5yY1ltbFBhdGgsIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKTtcblxuICAgIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ3lhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgLy8gVGhlIHRhcmdldCByZXBvIG1heSBub3QgaGF2ZSBwcmV0dGllciBpbnN0YWxsZWQgeWV0LCBhbmQgeWFybi1wbHVnaW4tYXV0by1pbnN0YWxsIGVkaXRzIHRoaXMgZmlsZSBhZnRlciBqcy15YW1sLlxuICAgIHNwYXduU3luYygneWFybicsIGdldFlhcm5yY1ByZXR0aWVyQXJncyhjb25maWcuZGlyUGF0aCwgeWFybnJjWW1sUGF0aCksIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRZYXJucmNQcmV0dGllckFyZ3MoZGlyUGF0aDogc3RyaW5nLCB5YXJucmNZbWxQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbJ2RseCcsICdwcmV0dGllcicsICctLW5vLWNvbmZpZycsICctLXdyaXRlJywgcGF0aC5yZWxhdGl2ZShkaXJQYXRoLCB5YXJucmNZbWxQYXRoKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndmVyc2lvbiddLCBkaXJQYXRoKSB8fCAnMC4wLjAnO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyVmVyc2lvbihuZXdWZXJzaW9uOiBzdHJpbmcsIG9sZFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB2YWxpZE5ld1ZlcnNpb24gPSBzZW12ZXIudmFsaWQobmV3VmVyc2lvbik7XG4gIGlmICghdmFsaWROZXdWZXJzaW9uKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHNlbXZlci5ndCh2YWxpZE5ld1ZlcnNpb24sIHNlbXZlci52YWxpZChvbGRWZXJzaW9uKSA/PyAnMC4wLjAnKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QxOiB4LWVhc3kgOmhlZGdlaG9nOicsICdFREU5RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMjogZWFzeSA6cmFiYml0MjonLCAnRERENkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDM6IG1lZGl1bSA6b3g6JywgJ0M0QjVGRCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q0OiBoYXJkIDpzcXVpZDonLCAnQTc4QkZBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDU6IHgtaGFyZCA6d2hhbGUyOicsICc4QjVDRjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMTogY3JpdGljYWwgOmZpcmU6OmZpcmU6OmZpcmU6JywgJ0VGNDQ0NCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AyOiB1cmdlbnQgOmZpcmU6OmZpcmU6JywgJ0Y4NzE3MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AzOiBpbXBvcnRhbnQgOmZpcmU6JywgJ0ZDQTVBNScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3A0OiBuaWNlIHRvIGhhdmUgOmRyb3BsZXQ6JywgJ0ZFQ0FDQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGJsaXR6JywgJzUzMDBiYycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGZpcmViYXNlJywgJ2ZmY2EyOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHByaXNtYScsICcwYzM0NGInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiByZWFjdCcsICc2MWRhZmInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzdmVsdGUnLCAnZmYzZTAwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc2VtYW50aWMtcmVsZWFzZScsICc0OTQ5NDknKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeSA6cm9ja2V0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkIDptYWc6JywgJ0ZCQ0EwNCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkIDpib29rbWFyazonLCAnNjM2NkYxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMC41aCA6Y2xvY2sxMjMwOicsICdGM0Y0RjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxaCA6Y2xvY2sxOicsICdFNUU3RUInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAyaCA6Y2xvY2syOicsICdEMUQ1REInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAzaCA6Y2xvY2szOicsICc5Q0EzQUYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA1aCA6Y2xvY2s1OicsICc2QjcyODAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA4aCA6Y2xvY2s4OicsICc0QjU1NjMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxM2ggOmNsb2NrMTonLCAnMzc0MTUxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogYnVpbGQgOmhhbW1lcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2hvcmUgOmJyb29tOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaSA6Y29uc3RydWN0aW9uX3dvcmtlcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZG9jcyA6bWVtbzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZmVhdCA6c3BhcmtsZXM6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZpeCA6YnVnOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBwZXJmIDp6YXA6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHJlZmFjdG9yIDpyZWN5Y2xlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBzdHlsZSA6bGlwc3RpY2s6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHRlc3QgOnRlc3RfdHViZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncHJvamVjdCcsICcyNDI5MkYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdmb2N1c2VkIDpkYXJ0OicsICcyMkM1NUUnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnbGxtLXByIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYWktcHIgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItYWxsIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNsYXVkZSA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jb2RleCA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1nZW1pbmkgOnJvYm90OicpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBMYWJlbHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cExhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCB0eXBlIHNvZGl1bU1vZHVsZSBmcm9tICdsaWJzb2RpdW0td3JhcHBlcnMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5jb25zdCBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyA9IFsnUkVBRFlfRElTQ09SRF9XRUJIT09LX1VSTCcsICdHSF9CT1RfUEFUJywgJ1BVQkxJQ19HSF9CT1RfUEFUJ107XG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBTZWNyZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwU2VjcmV0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvIHx8IG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikgfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZW52JyksIHF1aWV0OiB0cnVlIH0pLnBhcnNlZCA/PyB7fTtcbiAgICBpZiAoT2JqZWN0LmtleXMocGFyc2VkKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHNlY3JldE5hbWUgb2YgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBzZWNyZXRfbmFtZTogc2VjcmV0TmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXknLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IGtleSwga2V5X2lkOiBrZXlJZCB9ID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgY29uc3Qgc29kaXVtID0gZ2V0U29kaXVtKCk7XG4gICAgICBhd2FpdCBzb2RpdW0ucmVhZHk7XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNlY3JldF0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQidcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IFNlY3JldCAmIEJhc2U2NCBrZXkgdG8gVWludDhBcnJheS5cbiAgICAgICAgY29uc3QgcmF3S2V5ID0gc29kaXVtLmZyb21fYmFzZTY0KGtleSwgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG4gICAgICAgIGNvbnN0IHJhd1NlYyA9IHNvZGl1bS5mcm9tX3N0cmluZyhzZWNyZXQpO1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIHNlY3JldCB1c2luZyBMaWJTb2RpdW1cbiAgICAgICAgY29uc3QgZW5jQnl0ZXMgPSBzb2RpdW0uY3J5cHRvX2JveF9zZWFsKHJhd1NlYywgcmF3S2V5KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGVuY3J5cHRlZCBVaW50OEFycmF5IHRvIEJhc2U2NFxuICAgICAgICBjb25zdCBlbmNCYXNlNjQgPSBzb2RpdW0udG9fYmFzZTY0KGVuY0J5dGVzLCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcblxuICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgc2VjcmV0X25hbWU6IG5hbWUsXG4gICAgICAgICAgZW5jcnlwdGVkX3ZhbHVlOiBlbmNCYXNlNjQsXG4gICAgICAgICAga2V5X2lkOiBrZXlJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFNlY3JldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRTb2RpdW0oKTogdHlwZW9mIHNvZGl1bU1vZHVsZSB7XG4gIC8vIGxpYnNvZGl1bS13cmFwcGVycycgRVNNIGVudHJ5IGNhbiBiaW5kIHRvIGxpYnNvZGl1bUAwLjguMywgd2hvc2UgZGVmYXVsdFxuICAvLyBleHBvcnQgbm8gbG9uZ2VyIGV4cG9zZXMgcmVhZHkuIFRoZSBDb21tb25KUyBlbnRyeSBrZWVwcyB0aGUgQVBJIHNoYXBlLlxuICByZXR1cm4gcmVxdWlyZSgnbGlic29kaXVtLXdyYXBwZXJzJykgYXMgdHlwZW9mIHNvZGl1bU1vZHVsZTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAvLyBBZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uXG4gIGF3YWl0IHdpdGhSZXRyeSgoKSA9PlxuICAgIG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSxcbiAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgYWxsb3dfdXBkYXRlX2JyYW5jaDogdHJ1ZSxcbiAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICB9LFxuICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyID0gJ19fUE1fUlVOX18nO1xuXG5jb25zdCB0ZW1wbGF0ZXMgPSB7XG4gICdwdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQnOiBgXG5DbG9zZSAjPElzc3VlTnVtYmVyPlxuXG4jIyBTZWxmIENoZWNrXG5cbi0gWyBdIEkndmUgY29uZmlybWVkIFxcYEFsbCBjaGVja3MgaGF2ZSBwYXNzZWRcXGAgb24gdGhpcyBwYWdlLlxuICAtIFBSIHRpdGxlIGZvbGxvd3MgW0FuZ3VsYXIncyBjb21taXQgbWVzc2FnZSBmb3JtYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYWluL0NPTlRSSUJVVElORy5tZCMtY29tbWl0LW1lc3NhZ2UtZm9ybWF0KS5cbiAgLSBQUiB0aXRsZSBkb2Vzbid0IGhhdmUgXFxgV0lQOlxcYC5cbiAgLSBUaGUgdGVzdCBjb21tYW5kIChlLmcuLCBcXGAke3BhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXJ9IHRlc3RcXGApIHBhc3NlZC5cbiAgLSBUaGUgbGludCBjb21tYW5kIChlLmcuLCBcXGAke3BhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXJ9IGxpbnRcXGApIHBhc3NlZC5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBkdWUgdG8gbG9uZyB3b3JrZmxvd3MuXG4tIFsgXSBJJ3ZlIHJldmlld2VkIG15IGNoYW5nZXMgb24gdGhlIEdpdEh1YiBkaWZmIHZpZXcuXG4tIFsgXSBJJ3ZlIHdyaXR0ZW4gdGhlIHN0ZXBzIHRvIHRlc3QgbXkgY2hhbmdlcy5cbi0gWyBdIEkndmUgYWRkZWQgc2NyZWVuc2hvdHMgKGlmIHRoZSBVSSBjaGFuZ2VkKS5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBpZiB5b3UgZGlkbid0IG1vZGlmeSB0aGUgVUkuXG5cbjwhLS0gUGxlYXNlIGFkZCBzY3JlZW5zaG90cyBpZiB5b3UgbW9kaWZ5IHRoZSBVSS5cbnwgQ3VycmVudCAgICAgICAgICAgICAgICAgIHwgSW4gY29taW5nICAgICAgICAgICAgICAgIHxcbnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbnwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfFxuLS0+XG5cbjwhLS0gUGxlYXNlIGFkZCBzdGVwcyB0byB0ZXN0IHlvdXIgY2hhbmdlcy5cbiMjIFN0ZXBzIHRvIFRlc3RcblxuMS4gT3BlbiBodHRwOi8vbG9jYWxob3N0LWV4ZXJjb2RlLndpbGxib29zdGVyLm5ldDozMDAwL2phLUpQL2NvdXJzZXMvX2V4YW1wbGUvbGVzc29ucy9fZXhhbXBsZV9hX3BsdXNfYi9wcm9ibGVtcy9fZXhhbXBsZV9hX3BsdXNfYiBhZnRlciBsb2dpbi5cbjIuIFNlbGVjdCB0aGUgbGFuZ3VhZ2UgXFxgQ1xcYC5cbjMuIFdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZTpcbiAgIFxcYFxcYFxcYGNcbiAgICNpbmNsdWRlIDxzdGRpby5oPlxuXG4gICBpbnQgbWFpbih2b2lkKSB7XG4gICAgIGludCBhLCBiO1xuXG4gICAgIHNjYW5mKFwiJWQgJWRcIiwgJmEsICZiKTtcbiAgICAgcHJpbnRmKFwiJWRcIiwgYSArIGIpO1xuICAgICByZXR1cm4gMDtcbiAgIH1cbiAgIFxcYFxcYFxcYFxuNC4gUHVzaCBcXGBTdWJtaXRcXGAgYnV0dG9uLlxuNS4gLi4uXG4tLT5cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG5ld0NvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUobmV3Q29udGVudCwgY29uZmlnKTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBjb250ZW50KSA+IGNvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZSh0ZW1wbGF0ZTogc3RyaW5nLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlckNvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlQWxsKHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIsIHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0b21sIGZyb20gJ3Ntb2wtdG9tbCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsIH0gZnJvbSAnLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIHJlcG9BdXRob3I/OiBzdHJpbmc7XG4gIHJlcG9OYW1lPzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNCdW46IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIC8vIGRlcGVuZGVuY3kgaW5mb3JtYXRpb25cbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVXZMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBib29sZWFuO1xuICAvLyBzb3VyY2UgY29kZSBmaWxlc1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgfTtcbiAgaGFzVmVyc2lvblNldHRpbmdzOiBib29sZWFuO1xuICBtaXNlVGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VDb25maWcoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcm9vdENvbmZpZz86IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZUJyYW5jaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luczogc3RyaW5nW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVsZWFzZXJjSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKHJlbGVhc2VyY0pzb25QYXRoLCAndXRmOCcpKSBhc1xuICAgICAgICB8IHtcbiAgICAgICAgICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICAgICAgICAgIHBsdWdpbnM/OiBzdHJpbmdbXVtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICByZWxlYXNlQnJhbmNoZXMgPSBqc29uPy5icmFuY2hlcyA/PyBbXTtcbiAgICAgIHJlbGVhc2VQbHVnaW5zID0ganNvbj8ucGx1Z2lucz8uZmxhdCgpID8/IFtdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IGlzUm9vdCA9XG4gICAgICBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nKSkgIT09ICdwYWNrYWdlcycgfHxcbiAgICAgICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpO1xuXG4gICAgbGV0IHJlcG9JbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNSb290KSB7XG4gICAgICByZXBvSW5mbyA9IGF3YWl0IGZldGNoUmVwb0luZm8oZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cblxuICAgIGxldCBoYXNWZXJzaW9uU2V0dGluZ3MgPSBoYXNWZXJzaW9uU2V0dGluZ3NGaWxlKGRpclBhdGgpO1xuICAgIGZvciAoY29uc3QgcHJlZml4IG9mIFsnamF2YScsICdub2RlJywgJ3B5dGhvbiddKSB7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgYC4ke3ByZWZpeH0tdmVyc2lvbmApKSkge1xuICAgICAgICBoYXNWZXJzaW9uU2V0dGluZ3MgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZG9ja2VyZmlsZSA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBkb2NrZXJmaWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIFJlYWQgd2JmeS5qc29uXG4gICAgY29uc3Qgd2JmeUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YmZ5Lmpzb24nKTtcbiAgICBsZXQgd2JmeUpzb246IFdiZnlKc29uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3YmZ5SnNvblRleHQgPSBhd2FpdCBmc3AucmVhZEZpbGUod2JmeUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgd2JmeUpzb24gPSB3YmZ5SnNvblNjaGVtYS5wYXJzZShKU09OLnBhcnNlKHdiZnlKc29uVGV4dCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9GdWxsTmFtZSA9IHR5cGVvZiByZXBvSW5mbz8uZnVsbF9uYW1lID09PSAnc3RyaW5nJyA/IHJlcG9JbmZvLmZ1bGxfbmFtZSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb0F1dGhvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXBvTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZXBvRnVsbE5hbWUpIHtcbiAgICAgIGNvbnN0IHJlcG9QYXJ0cyA9IHJlcG9GdWxsTmFtZS5zcGxpdCgnLycpO1xuICAgICAgaWYgKHJlcG9QYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICByZXBvQXV0aG9yID0gcmVwb1BhcnRzWzBdO1xuICAgICAgICByZXBvTmFtZSA9IHJlcG9QYXJ0c1sxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IHJlcG9GdWxsTmFtZSA/IGBnaXRodWI6JHtyZXBvRnVsbE5hbWV9YCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiAhIXBhY2thZ2VKc29uLmZpbGVzLFxuICAgICAgcmVwb3NpdG9yeSxcbiAgICAgIHJlcG9BdXRob3IsXG4gICAgICByZXBvTmFtZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJSZXBvOiBCb29sZWFuKFxuICAgICAgICByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHwgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpXG4gICAgICApLFxuICAgICAgaXNCdW46IHJvb3RDb25maWc/LmlzQnVuIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdidW4ubG9jaycpKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBwYWNrYWdlSnNvblBhdGguaW5jbHVkZXMoJy93aWxsYm9vc3Rlci1jb25maWdzJyksXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbkdvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5VdkxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd1di5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmE6IGNvbnRhaW5zQW55KCcqKi8qLmphdmEnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqLyouamF2YScsIGRpclBhdGgpLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSxcbiAgICAgIH0sXG4gICAgICBoYXNWZXJzaW9uU2V0dGluZ3MsXG4gICAgICBtaXNlVGFza3M6IGF3YWl0IHJlYWRNaXNlVGFza3MoZGlyUGF0aCksXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNWZXJzaW9uU2V0dGluZ3NGaWxlKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICByZXR1cm4gKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICdtaXNlLnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLm1pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcudG9vbC12ZXJzaW9ucycpKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkTWlzZVRhc2tzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBjb25zdCB0YXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIFsnbWlzZS50b21sJywgJy5taXNlLnRvbWwnXSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0b21sLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgeyB0YXNrcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MudGFza3MgPz8ge30pKSB7XG4gICAgICAgIHRhc2tzW25hbWVdID0gcmVhZE1pc2VUYXNrQ29tbWFuZCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG9yIHRlbXBvcmFyaWx5IGludmFsaWQgbWlzZSBmaWxlcyBzaG91bGQgbm90IGJsb2NrIG90aGVyIHdiZnkgZ2VuZXJhdG9ycy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhc2tzO1xufVxuXG5mdW5jdGlvbiByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgLy8gUHJlc2VydmUgYXJyYXktZm9ybSBtaXNlIGNvbW1hbmRzIHNvIHJlY3Vyc2lvbiBjaGVja3MgY2FuIHN0aWxsIHNlZSBwYWNrYWdlIHNjcmlwdCBjYWxscy5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuZmlsdGVyKChjb21tYW5kKTogY29tbWFuZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGNvbW1hbmQgPT09ICdzdHJpbmcnKS5qb2luKCdcXG4nKTtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHJldHVybiByZWFkTWlzZVRhc2tDb21tYW5kKCh2YWx1ZSBhcyB7IHJ1bj86IHVua25vd24gfSkucnVuKTtcbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGdpdCA9IHNpbXBsZUdpdChkaXJQYXRoKTtcbiAgY29uc3QgcmVtb3RlcyA9IGF3YWl0IGdpdC5nZXRSZW1vdGVzKHRydWUpO1xuICBjb25zdCBvcmlnaW4gPSByZW1vdGVzLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gJ29yaWdpbicpO1xuICBjb25zdCByZW1vdGVVcmwgPSBvcmlnaW4/LnJlZnMuZmV0Y2ggPz8gb3JpZ2luPy5yZWZzLnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgLy8gTWV0YWRhdGEgcGVybWlzc2lvblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdCgpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWRpcmVjdGVkRnVsbE5hbWUgPSBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yKTtcbiAgICBpZiAocmVkaXJlY3RlZEZ1bGxOYW1lKSB7XG4gICAgICByZXR1cm4geyBmdWxsX25hbWU6IHJlZGlyZWN0ZWRGdWxsTmFtZSB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlbW92ZUdlbWluaVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGludHN0YWdlZHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hmbXRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hmbXRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGxpbnRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGluc3RhbGxBZ2VudFNraWxscyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9za2lsbHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZW52OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzZWNyZXRzIHRvIEdpdEh1YicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZScsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdTa2lwIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IHJvb3REaXJQYXRoIG9mIGFyZ3YucGF0aHMgYXMgc3RyaW5nW10pIHtcbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBkaXJlbnRzLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKS5tYXAoKGQpID0+IHBhdGguam9pbihwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuXG4gICAgYXdhaXQgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihbcm9vdERpclBhdGgsIC4uLnN1YkRpclBhdGhzXSk7XG5cbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgZ2V0UGFja2FnZUNvbmZpZyhyb290RGlyUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICB9XG4gICAgaWYgKCFyb290Q29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGB0aGVyZSBpcyBubyB2YWxpZCBwYWNrYWdlLmpzb24gaW4gJHtyb290RGlyUGF0aH1gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhYmJyZXZpYXRpb25Qcm9taXNlID0gZml4VHlwb3Mocm9vdENvbmZpZyk7XG5cbiAgICBjb25zdCBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCwgcm9vdENvbmZpZykpXG4gICAgKTtcbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeFByaXNtYUVudkZpbGVzKHJvb3RDb25maWcpLFxuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2VtaW5pQ29uZmlnKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICAuLi4oc2hvdWxkUnVuV29ya2Zsb3dzID8gW2dlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMaW50c3RhZ2VkcmMocm9vdENvbmZpZyksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBhcmd2LnNraXBEZXBzKTtcblxuICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWcpKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24gJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZykpO1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICAvLyBSZWZyZXNoIGxvY2sgZmlsZXNcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3JlZnJlc2hCdW5Mb2NrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuXG4gICAgYXdhaXQgaW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWcpO1xuICB9XG4gIGlmIChoYXNJbnZhbGlkUGFja2FnZUNvbmZpZykge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gd2JmeSBzaG91bGQgdXBkYXRlIG9ubHkgdGhlIHBhY2thZ2VzIGl0IGV4cGxpY2l0bHkgbWFuYWdlcyB0aHJvdWdoIGJ1biBhZGQuXG4gIC8vIFJ1bm5pbmcgYnVuIHVwZGF0ZSBoZXJlIHJlZnJlc2hlcyB1bnJlbGF0ZWQgYXBwbGljYXRpb24gZGVwZW5kZW5jaWVzIGFuZFxuICAvLyBjYW4gY2hhbmdlIHByb2R1Y3QgYmVoYXZpb3IsIHNvIGtlZXAgdGhlIGV4aXN0aW5nIGxvY2sgYW5kIHJlY29uY2lsZSBpdC5cbiAgY29uc3Qgc3RhdHVzID0gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgpO1xuICBpZiAoc3RhdHVzICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCBCdW4gbG9ja2ZpbGU6IGJ1biBpbnN0YWxsIGV4aXRlZCB3aXRoIHN0YXR1cyAke3N0YXR1c31gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwibmFtZXMiOlsiYXN5bmMiLCJzbGVlcCIsIm1pbGxpc2Vjb25kcyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsImlnbm9yZUVycm9yQXN5bmMiLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwiZXJyb3IiLCJjb2RlIiwib3B0aW9ucyIsImlzVmVyYm9zZSIsImRvZXNVcGxvYWRFbnZWYXJzIiwibG9nZ2VyIiwiZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbiIsIm5hbWUiLCJmdW5jIiwiY29uc29sZSIsImluZm8iLCJFcnJvciIsInN0YWNrIiwiU3RyaW5nIiwiZnNVdGlsIiwicmVhZEZpbGVJZ25vcmluZ0Vycm9yIiwiZmlsZVBhdGgiLCJmcyIsInByb21pc2VzIiwicmVhZEZpbGUiLCJnZW5lcmF0ZUZpbGUiLCJjb250ZW50IiwibWtkaXIiLCJwYXRoIiwiZGlybmFtZSIsInJlY3Vyc2l2ZSIsIm5vcm1hbGl6ZWRDb250ZW50IiwidHJpbSIsIndyaXRlRmlsZSIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJmaXhOZXh0Q29uZmlnSnNvbiIsImNvbmZpZyIsIm1hcCIsImV4dCIsImRpclBhdGgiLCJmaW5kIiwicCIsImV4aXN0c1N5bmMiLCJvbGRDb250ZW50Iiwib2JqZWN0TGl0ZXJhbCIsInNvdXJjZSIsInRzIiwiY3JlYXRlU291cmNlRmlsZSIsIlNjcmlwdFRhcmdldCIsIkxhdGVzdCIsIlNjcmlwdEtpbmQiLCJKUyIsInZpc2l0Iiwibm9kZSIsImlzRXhwb3J0QXNzaWdubWVudCIsImlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJleHByZXNzaW9uIiwiaXNCaW5hcnlFeHByZXNzaW9uIiwib3BlcmF0b3JUb2tlbiIsImtpbmQiLCJTeW50YXhLaW5kIiwiRXF1YWxzVG9rZW4iLCJsZWZ0IiwiZ2V0VGV4dCIsInJpZ2h0IiwiZm9yRWFjaENoaWxkIiwiZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwiLCJwcm9wZXJ0eVRleHRzIiwiU2V0IiwicHJvcGVydGllcyIsInByb3BlcnR5IiwiaGFzIiwicHVzaCIsImxlbmd0aCIsImluc2VydGlvblBvaW50IiwiZ2V0RW5kIiwibGFzdFByb3BlcnR5IiwiYXQiLCJoYXNUcmFpbGluZ0NvbW1hIiwic2xpY2UiLCJpbmNsdWRlcyIsInByZWZpeCIsIm5ld0NvbnRlbnQiLCJqb2luIiwicnVuIiwibGl0ZXJhbCIsInZhbHVlIiwiYXNPYmplY3QiLCJleHRyYU1lbWJlcnMiLCJ0b1BhcnNlZE9iamVjdCIsImRlZmF1bHRDb25maWciLCJmb3JiaWRPbmx5IiwicmV0cmllcyIsInVzZSIsImJhc2VVUkwiLCJ0cmFjZSIsInNjcmVlbnNob3QiLCJ2aWRlbyIsIndlYlNlcnZlciIsImNvbW1hbmQiLCJ1cmwiLCJyZXVzZUV4aXN0aW5nU2VydmVyIiwidGltZW91dCIsInN0ZG91dCIsInN0ZGVyciIsImVudiIsImdyYWNlZnVsU2h1dGRvd24iLCJtZW1iZXJPcmRlciIsIk9iamVjdCIsImtleXMiLCJrZXkiLCJfIiwiaW5kZXgiLCJmaXhQbGF5d3JpZ2h0Q29uZmlnIiwiZW52RmlsZVBhdGgiLCJlbnZGaWxlTmFtZXMiLCJlbnZGaWxlUGF0aHMiLCJjdXJyZW50RGlyUGF0aCIsImZpbGVOYW1lIiwiZ2V0RW52RmlsZVBhdGhzIiwidGVzdCIsImFzc2VydE5leHRQdWJsaWNCYXNlVXJsIiwiZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCIsIlRTIiwiZm91bmQiLCJpc0NhbGxFeHByZXNzaW9uIiwiZmlyc3RBcmd1bWVudCIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsImV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsIiwicGFyc2VkIiwicGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsIm1lcmdlZCIsIm1lcmdlUGFyc2VkT2JqZWN0cyIsIm9iamVjdCIsInNldFdlYlNlcnZlckNvbW1hbmQiLCJuZXdPYmplY3RMaXRlcmFsIiwic3RyaW5naWZ5VmFsdWUiLCJzdGFydCIsImdldFN0YXJ0IiwiZW5kIiwiYmFzZSIsIm92ZXJyaWRlIiwib3ZlcnJpZGVQcm9wZXJ0eUtleXMiLCJmaWx0ZXIiLCJtZW1iZXIiLCJlbnRyaWVzIiwibWVyZ2VQYXJzZWRWYWx1ZSIsInBhcnNlRXhwcmVzc2lvbiIsInBhcnNlZE9iamVjdCIsImlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbiIsImVsZW1lbnRzIiwiZWxlbWVudCIsInNvbWUiLCJpc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudCIsImlzUHJvcGVydHlBc3NpZ25tZW50IiwiaXNJZGVudGlmaWVyIiwiaXNTdHJpbmdMaXRlcmFsIiwiaW5pdGlhbGl6ZXIiLCJsZXZlbCIsImNsb3NpbmdJbmRlbnQiLCJyZXBlYXQiLCJpbmRlbnQiLCJpdGVtIiwic3RyaW5naWZpZWQiLCJzcGxpdCIsImVtaXR0ZWRQcm9wZXJ0aWVzIiwibGFzdFByb3BlcnR5SW5kZXhCeUtleSIsIk1hcCIsInNldCIsImdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkiLCJsaW5lcyIsImZsYXRNYXAiLCJzdHJpbmdpZnlPYmplY3RNZW1iZXIiLCJnZXQiLCJhZGQiLCJzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eSIsImxpbmUiLCJnbG9iSWdub3JlIiwiZml4UHJpc21hRW52RmlsZXMiLCJzaG91bGRBZGRDb25uZWN0aW9uTGltaXQiLCJkZXBlbmRpbmciLCJwcmlzbWEiLCJkZXBlbmRlbmNpZXMiLCJwYWNrYWdlSnNvbiIsImRldkRlcGVuZGVuY2llcyIsInNob3VsZEFkZFNxbGl0ZUNvbm5lY3Rpb25MaW1pdCIsImVudkZpbGVzIiwiZmciLCJnbG9iIiwiZG90IiwiY3dkIiwiaWdub3JlIiwiZW52RmlsZSIsInJlcGxhY2VBbGwiLCJtYXRjaCIsIm5vcm1hbGl6ZVNxbGl0ZURhdGFiYXNlVXJsIiwicXVlcnlTdGFydCIsImluZGV4T2YiLCJwYXRoUGFydCIsInF1ZXJ5UGFydCIsInBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsImRlbGV0ZSIsIm5vcm1hbGl6ZWRRdWVyeSIsInRvU3RyaW5nIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwic29ydE9iamVjdEJ5S2V5TmFtZUxpc3QiLCJzb3J0V2l0aCIsInNvcnRGbiIsInRvdGFsIiwib2JqZWN0S2V5cyIsInNvcnQiLCJJTkRFTlRfUkVHRVgiLCJJTkRFTlRfVFlQRV9TUEFDRSIsInNob3VsZElnbm9yZVNpbmdsZVNwYWNlIiwiaWdub3JlU2luZ2xlU3BhY2VzIiwiaW5kZW50VHlwZSIsIm1ha2VJbmRlbnRzTWFwIiwic3RyaW5nIiwiaW5kZW50cyIsInByZXZpb3VzSW5kZW50VHlwZSIsInByZXZpb3VzU2l6ZSIsIm1hdGNoZXMiLCJ3ZWlnaHQiLCJpbmRlbnREaWZmZXJlbmNlIiwiYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlIiwiTWF0aCIsImFicyIsImVuY29kZUluZGVudHNLZXkiLCJlbnRyeSIsImluZGVudEFtb3VudCIsImRldGVjdEluZGVudCIsIlR5cGVFcnJvciIsInNpemUiLCJrZXlPZk1vc3RVc2VkSW5kZW50IiwicmVzdWx0IiwibWF4VXNlZCIsIm1heFdlaWdodCIsInVzZWRDb3VudCIsImdldE1vc3RVc2VkS2V5IiwidHlwZSIsImFtb3VudCIsImluZGVudHNLZXkiLCJOdW1iZXIiLCJtYWtlSW5kZW50U3RyaW5nIiwiZGV0ZWN0TmV3bGluZUdyYWNlZnVsIiwibmV3bGluZXMiLCJjcmxmIiwibmV3bGluZSIsImRldGVjdE5ld2xpbmUiLCJwaXBlIiwiZm5zIiwieCIsImFyZ3MiLCJyZWR1Y2UiLCJvbkFycmF5IiwiQXJyYXkiLCJpc0FycmF5Iiwib25TdHJpbmdBcnJheSIsImV2ZXJ5IiwidW5pcSIsInhzIiwic29ydEFycmF5IiwiYXJyYXkiLCJ0b1NvcnRlZCIsInVuaXFBbmRTb3J0QXJyYXkiLCJvbk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJpdGVyYXRvciIsImlzUGxhaW5PYmplY3QiLCJzb3J0T2JqZWN0QnkiLCJjb21wYXJhdG9yIiwiZGVlcCIsIm92ZXIiLCJmcm9tRW50cmllcyIsInNvcnRPYmplY3RLZXlzIiwib2JqZWN0R3JvdXBCeSIsImdyb3VwQnkiLCJjYWxsYmFjayIsImNyZWF0ZSIsInNvcnRPYmplY3QiLCJzb3J0VVJMT2JqZWN0Iiwic29ydFBlb3BsZU9iamVjdCIsInNvcnREaXJlY3RvcmllcyIsIm92ZXJQcm9wZXJ0eSIsImhhc093biIsInNvcnRHaXRIb29rcyIsInBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSIsInNwZWNpZmllciIsIm5hbWVBbmRWZXJzaW9uIiwiYXRNYXRjaGVzIiwibWF0Y2hBbGwiLCJzcGxpdEluZGV4IiwicG9wIiwic3Vic3RyaW5nIiwicmFuZ2UiLCJzb3J0T2JqZWN0QnlTZW12ZXIiLCJhIiwiYiIsImFOYW1lIiwiYVJhbmdlIiwiYk5hbWUiLCJiUmFuZ2UiLCJsb2NhbGVDb21wYXJlIiwic2VtdmVyQ29tcGFyZSIsInNlbXZlck1pblZlcnNpb24iLCJnZXRQYWNrYWdlTmFtZSIsImlkZW50Iiwic3RhcnRzV2l0aCIsImNhY2hlIiwic2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0iLCJwYWNrYWdlTWFuYWdlciIsImRldkVuZ2luZXMiLCJwbnBtIiwiZW5naW5lcyIsIm5wbSIsInByb2Nlc3MiLCJoYXNZYXJuT3JQbnBtRmlsZXMiLCJzb3J0RGVwZW5kZW5jaWVzIiwic29ydFdvcmtzcGFjZXMiLCJzb3J0RXNsaW50Q29uZmlnIiwib3ZlcnJpZGVzIiwicnVsZTEiLCJydWxlMiIsInNvcnRWU0NvZGVCYWRnZU9iamVjdCIsInNvcnRQcmV0dGllckNvbmZpZyIsInNvcnRWb2x0YSIsInNvcnREZXZFbmdpbmVzIiwic29ydFBucG1Db25maWciLCJkZWZhdWx0TnBtU2NyaXB0cyIsImhhc0RldkRlcGVuZGVuY3kiLCJkZXBlbmRlbmN5IiwicnVuU1JlZ0V4cCIsImhhc1NlcXVlbnRpYWxTY3JpcHQiLCJmaWVsZCIsInZhbHVlcyIsInNjcmlwdCIsImlzU2VxdWVudGlhbFNjcmlwdCIsInNvcnRTY3JpcHROYW1lcyIsImdyb3VwTWFwIiwiaWR4IiwiZnJvbSIsImdyb3VwS2V5IiwiY2hpbGRyZW4iLCJrIiwic29ydFNjcmlwdHMiLCJzY3JpcHRzIiwibmFtZXMiLCJwcmVmaXhhYmxlIiwib21pdHRlZCIsInJlcGxhY2UiLCJzb3J0Q29uZGl0aW9ucyIsImNvbmRpdGlvbnMiLCJkZWZhdWx0Q29uZGl0aW9ucyIsInJlc3RDb25kaXRpb25zIiwiY29uZGl0aW9uIiwic29ydEV4cG9ydHMiLCJleHBvcnRzIiwicGF0aHMiLCJmaWVsZHMiLCJtYWludGFpbmVycyIsImNvbnRyaWJ1dG9ycyIsInBhY2thZ2VOYW1lQSIsInBhY2thZ2VOYW1lQiIsImJhZGdlIiwiZGVmYXVsdFNvcnRPcmRlciIsIm92ZXJGaWVsZHMiLCJCb29sZWFuIiwic29ydFBhY2thZ2VKc29uIiwianNvbklzaCIsImpzb24iLCJlbmRDaGFyYWN0ZXJzIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwiZWRpdFN0cmluZ0pTT04iLCJzb3J0T3JkZXIiLCJwcml2YXRlS2V5cyIsInB1YmxpY0tleXMiLCJmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIiwicGFja2FnZURpclBhdGhzIiwiYWxsIiwicGFja2FnZUpzb25QYXRoIiwicGFja2FnZURpclBhdGgiLCJuZXdUZXN0RGlyUGF0aCIsIm9sZFRlc3REaXJOYW1lIiwib2xkVGVzdERpclBhdGgiLCJtb3ZlVGVzdERpcmVjdG9yeSIsImRpZFVwZGF0ZVNjcmlwdCIsInNjcmlwdE5hbWUiLCJuZXdTY3JpcHQiLCJyZW5hbWUiLCJkaXJlbnRzIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJvbGRQYXRoIiwiZGlyZW50IiwibmV3UGF0aCIsIm5ld1BhdGhTdGF0Iiwic3RhdCIsImlzRGlyZWN0b3J5Iiwicm0iLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMiLCJkaXJOYW1lIiwiaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uIiwiZW5kc1dpdGgiLCJwYWNrYWdlTmFtZSIsImhhc0xpYnJhcnkiLCJpc0ZpbGUiLCJvdmVyd3JpdGVNZXJnZSIsImRlc3RpbmF0aW9uQXJyYXkiLCJzb3VyY2VBcnJheSIsImNvbWJpbmVNZXJnZSIsInRhcmdldCIsImRlc3RpbmF0aW9uIiwiY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQiLCJpc01lcmdlYWJsZU9iamVjdCIsIm1lcmdlIiwic29ydEtleXMiLCJvYmoiLCJrZXlBbmRWYWx1ZXMiLCJrZXkxIiwia2V5MiIsInB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3ciLCJvbiIsInB1bGxfcmVxdWVzdCIsImJyYW5jaGVzIiwicGVybWlzc2lvbnMiLCJjb250ZW50cyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwiYXV0b2ZpeCIsInByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93IiwidXNlcyIsIndvcmtmbG93cyIsInJlbGVhc2UiLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJyb290Q29uZmlnIiwiaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8iLCJyZXBvc2l0b3J5Iiwid29ya2Zsb3dzUGF0aCIsInNlbWFudGljWW1sUGF0aCIsImZvcmNlIiwiaXNPYnNvbGV0ZUdlblByV29ya2Zsb3dGaWxlTmFtZSIsImZpbGVOYW1lU2V0Iiwic2VtYW50aWNSZWxlYXNlIiwiYmFzZW5hbWUiLCJ3cml0ZVdvcmtmbG93WWFtbCIsImRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyIsIndyaXRlWWFtbCIsImlzUHVibGljUmVwbyIsInN0cnVjdHVyZWRDbG9uZSIsImlzQnVuIiwic3RlcHMiLCJ3aXRoIiwiYnVpbGQiLCJhdXRvZml4V29ya2Zsb3ciLCJhdXRvZml4Sm9iIiwiZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3ciLCJuZXdTZXR0aW5ncyIsIm9sZFNldHRpbmdzIiwieWFtbCIsImxvYWQiLCJhcnJheU1lcmdlIiwibW92ZVRvQm90dG9tIiwiYWN0aW9ucyIsInRyaWdnZXJfZGVwbG95X3dvcmtmbG93IiwiaXNSZXVzYWJsZVdvcmtmbG93Iiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJ3b3JrZmxvd19kaXNwYXRjaCIsInNlY3JldHMiLCJOUE1fVE9LRU4iLCJHSF9UT0tFTiIsIkZJUkVCQVNFX1RPS0VOIiwiR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJzZXJ2ZXJfdXJsIiwiZG90X2Vudl9wYXRoIiwiRkxZX0FQSV9UT0tFTiIsImRlcGxveV9jb21tYW5kIiwiZG9lc0NvbnRhaW5Eb2NrZXJmaWxlIiwiY2lfbGFiZWwiLCJnaXRodWJfaG9zdGVkX3J1bm5lciIsIm5ld1NlY3JldHMiLCJ5YW1sVGV4dCIsImR1bXAiLCJsaW5lV2lkdGgiLCJub0NvbXBhdE1vZGUiLCJzdHlsZXMiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwiY29tbWVudCIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwid2JmeUpzb24iLCJ0eXBvcyIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMiLCJhbGxDb25maWdzIiwiYWdlbnRzRXh0cmFQYXRoIiwiZXh0cmFDb250ZW50IiwidG9vbE5hbWUiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24iLCJjdXJzb3JSdWxlc1BhdGgiLCJjdXJzb3JSdWxlc0NvbnRlbnQiLCJmcm9udG1hdHRlciIsImJvZHkiLCJnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50IiwiYmFzZUNvbnRlbnQiLCJkZXNjcmlwdGlvbiIsImlzV2lsbEJvb3N0ZXJSZXBvIiwiY29uZmlncyIsInBsYXl3cmlnaHRUZXN0IiwiZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlIiwiaGFzTmV3U2VjdGlvbiIsImMiLCJnZW5JMThuVHMiLCJyZWFjdCIsIm5leHQiLCJtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzIiwiZ2VuZXJhdGVCdW5maWdUb21sIiwiZXhpc3RpbmdDb250ZW50IiwicmVhZEZpbGVTeW5jIiwiYnVuZmlnVG9tbCIsInBhcnNlQnVuZmlnVG9tbCIsImJ1biIsImdlbmVyYXRlUnVuU2VjdGlvbiIsImluc3RhbGwiLCJleGFjdCIsInVzZXJDb250ZW50SGVhZGVyIiwidXNlckNvbnRlbnRIZWFkZXJSZWdleCIsInNlcGFyYXRvciIsImRlZmF1bHRIZWFkVXNlckNvbnRlbnQiLCJkZWZhdWx0VGFpbFVzZXJDb250ZW50IiwiaWdub3JlRmlsZVV0aWwiLCJzZXBhcmF0b3JQcmVmaXgiLCJyZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMiLCJsYXN0SGVhZGVySW5kZXgiLCJnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyIiwiZ2V0SGVhZFVzZXJDb250ZW50IiwidGhpcyIsImdldFRhaWxVc2VyQ29udGVudCIsImlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQiLCJsYXN0SW5kZXgiLCJsYXN0SW5kZXhPZiIsImdlbmVyYXRlRG9ja2VyaWdub3JlIiwiZXh0ZW5zaW9ucyIsImNvZGVXaXRoMkluZGVudFNpemUiLCJjb2RlV2l0aDRJbmRlbnRTaXplIiwibWFya2Rvd25MaWtlIiwib3hsaW50Iiwib3hmbXQiLCJwcmV0dGllck9ubHkiLCJnZW5lcmF0ZUV4dGVuc2lvbnMiLCJnZW5lcmF0ZUVkaXRvcmNvbmZpZyIsImhhdmVfZnVuIiwiY29kZV9yZXZpZXciLCJkaXNhYmxlIiwiY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQiLCJtYXhfcmV2aWV3X2NvbW1lbnRzIiwicHVsbF9yZXF1ZXN0X29wZW5lZCIsImhlbHAiLCJzdW1tYXJ5IiwiaWdub3JlX3BhdHRlcm5zIiwiZ2VuZXJhdGVHZW1pbmlDb25maWciLCJjb25maWdGaWxlUGF0aCIsInN0eWxlZ3VpZGVGaWxlUGF0aCIsIm5ld0NvbmZpZyIsIm9sZENvbmZpZyIsInlhbWxDb250ZW50IiwiY29kaW5nUnVsZUV4dHJhQ29udGVudCIsInRyaW1TdGFydCIsInN0eWxlZ3VpZGVDb250ZW50IiwidHJpbUVuZCIsInJlbW92ZUdlbWluaVNldHRpbmdzIiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJoZWFkVXNlckNvbnRlbnQiLCJ0YWlsVXNlckNvbnRlbnQiLCJkb2VzQ29udGFpbkdlbWZpbGUiLCJkb2VzQ29udGFpbkdvTW9kIiwiZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiIsImRvZXNDb250YWluUG9tWG1sIiwiZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCIsImRvZXNDb250YWluVGVtcGxhdGVZYW1sIiwiZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIiwiZG9lc0NvbnRhaW5VdkxvY2siLCJibGl0eiIsImZpcmViYXNlIiwicmVhY3ROYXRpdmUiLCJzdG9yeWJvb2siLCJsaXRlc3RyZWFtIiwiZ2VuZXJhdGVkIiwicmVhZENhY2hlIiwicmVzcG9uc2UiLCJmZXRjaCIsInJlc3BvbnNlVGV4dCIsInRleHQiLCJvayIsIndyaXRlQ2FjaGUiLCJvcyIsImhvbWVkaXIiLCJEYXRlIiwibm93IiwibXRpbWVNcyIsImRvZXNDb250YWluSnNPclRzIiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0IiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyIsImRvZXNDb250YWluVHlwZVNjcmlwdCIsImRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpbkphdmEiLCJkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzIiwiZ2VuZXJhdGVJZGVhU2V0dGluZ3MiLCJjcmVhdGVUYXNrT3B0aW9ucyIsImdldFdhdGNoZXJUYXNrc0NvbnRlbnQiLCJydW5uZXIiLCJleHRlbnNpb24iLCJnZXRHZW5JMThuVHNDb21tYW5kIiwic3Bhd25TeW5jIiwicmV0cnkiLCJzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMiLCJuZXdDbWQiLCJuZXdBcmdzIiwiZ2V0U3Bhd25TeW5jQXJncyIsInN0YXR1cyIsImNoaWxkX3Byb2Nlc3MiLCJzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQiLCJzdGRpbyIsInByb2MiLCJzIiwibWVzc2FnZSIsIlBBVEgiLCJCRVJSWV9CSU5fRk9MREVSIiwiZW5jb2RpbmciLCJzaGVsbCIsImdpdEh1YlV0aWwiLCJnZXRPcmdBbmROYW1lIiwidXJsT3JGdWxsTmFtZSIsInVybFdpdGhvdXRQcm90b2NvbCIsIm9jdG9raXRDYWNoZSIsImdldE9jdG9raXQiLCJvd25lciIsImNhY2hlZCIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdldEdpdEh1YlRva2VuIiwiaGFzR2l0SHViVG9rZW4iLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiIsImdldEdpdEh1YkNsaVRva2VuIiwiR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUIiLCJHSVRIVUJfVE9LRU4iLCJnaXRIdWJDbGlUb2tlbiIsImNoaWxkUHJvY2VzcyIsImV4ZWNGaWxlU3luYyIsIm1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UiLCJpc1dpbGxCb29zdGVyQ29uZmlncyIsInByaXZhdGUiLCJmaWxlcyIsIm94bGludERlcHMiLCJ0eXBlc2NyaXB0R29EZXBlbmRlbmN5IiwidHlwZXNjcmlwdERlcGVuZGVuY3kiLCJ3YkRlcGVuZGVuY3kiLCJidWlsZFRzRGVwZW5kZW5jeSIsIndpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMiLCJvYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMiLCJtaWNyb21hdGNoUGFja2FnZU5hbWVzIiwibWljcm9tYXRjaEltcG9ydFBhdHRlcm4iLCJsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlIiwiZGVwZW5kZW5jeVNlY3Rpb25LZXlzIiwiZ2VuZXJhdGVQYWNrYWdlSnNvbiIsInNraXBBZGRpbmdEZXBzIiwianNvbk9iaiIsImpzb25UZXh0IiwicGVlckRlcGVuZGVuY2llcyIsInJlYWRQYWNrYWdlSnNvbiIsImF1dGhvciIsInNlY3Rpb24iLCJnZXREZXBlbmRlbmN5U2VjdGlvbnMiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJyZW1vdmVTZWxmRGVwZW5kZW5jeSIsInZlcnNpb24iLCJpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UiLCJnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbiIsInJlcGxhY2VXaWxsQm9vc3RlckNvbmZpZ3NXb3Jrc3BhY2VEZXBlbmRlbmN5UmFuZ2VzIiwidHNsaWIiLCJsZXJuYSIsInBpbnN0IiwicHJldHRpZXIiLCJzZWN0aW9ucyIsInJlbW92ZVdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMiLCJwcmVzZXJ2ZU1pY3JvbWF0Y2giLCJmaWxlUGF0aHMiLCJnbG9iU3luYyIsImRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2giLCJzaG91bGRQcmVzZXJ2ZU1pY3JvbWF0Y2giLCJzaG91bGRQcmVzZXJ2ZUNvbmZpZ1BhY2thZ2VMaW50RGVwZW5kZW5jeSIsInJlbW92ZU9ic29sZXRlTGludERlcGVuZGVuY2llcyIsInJlbW92ZURlcHJlY2F0ZWRTdHVmZiIsInJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyIsImdlbmVyYXRlU2NyaXB0cyIsImFkZEluc3RhbGxTdGVwVG9DaGVja0ZvckFpIiwicHJldHRpZnkiLCJjYXRjaCIsIm9yaWdpbmFsQ29udGVudCIsIm5ld0xpbmUiLCJsIiwiZ2VuZXJhdGVQcmV0dGllclN1ZmZpeCIsIm5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyIsInVwZGF0ZVNjcmlwdHMiLCJtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyIsImRlcGVuZGVuY3lVcGRhdGVzIiwicHl0aG9uRGV2RGVwZW5kZW5jaWVzIiwiaGFzSmF2YSIsImRlcGVuZGVuY3lTZWN0aW9ucyIsInJlbW92ZVByZXR0aWVyQXJ0aWZhY3RzIiwiaHVza3kiLCJwb3N0aW5zdGFsbCIsInBvc3RwdWJsaXNoIiwicHJlcHVibGlzaE9ubHkiLCJwcmVwYWNrIiwicG9zdHBhY2siLCJwcmVwYXJlIiwiYXJ0aWxsZXJ5IiwicGxheXdyaWdodCIsIndvcmtzcGFjZXMiLCJ3b3Jrc3BhY2UiLCJpc1diUGFja2FnZSIsIndiIiwidHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwiZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwidXNlZERlcGVuZGVuY2llcyIsInVzZWREZXBlbmRlbmN5U2V0IiwiZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJhYnNvbHV0ZUZpbGVQYXRoIiwicGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbiIsIndhcm4iLCJmb3JtYXRUc0RpYWdub3N0aWMiLCJub3JtYWxpemVUc2NvbmZpZ0V4dGVuZHMiLCJleHRlbmRzIiwiZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJyZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJqZXN0IiwiZGVwIiwiYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIiwibGljZW5zZSIsInB1Ymxpc2hDb25maWciLCJhY2Nlc3MiLCJjb25maWdNanNQYXRoIiwiY29uZmlnRHRzUGF0aCIsImNvbmZpZ0RtdHNDb250ZW50Iiwibm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsImRpcnMiLCJkaXIiLCJmb3JtYXQiLCJhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZCIsInB5dGhvblBhY2thZ2VNYW5hZ2VyIiwiZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIiLCJweXRob25GaWxlcyIsImRpck5hbWVTZXQiLCJweXRob25GaWxlIiwiZmlyc3QiLCJzZWNvbmQiLCJkaXJOYW1lc1N0ciIsInB5dGhvblJ1bm5lciIsImV4aXN0aW5nUmVwb3NpdG9yeSIsIm5vcm1hbGl6ZWRSZXBvc2l0b3J5Iiwibm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uIiwiYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uIiwibm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSIsImZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbiIsImFkZEdlbkkxOG5Uc1Bvc3RpbnN0YWxsU2NyaXB0Iiwibm9ybWFsaXplUGFja2FnZU1ldGFkYXRhIiwicGFja2FnZUpzb25EZXBlbmRlbmNpZXMiLCJwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyIsImFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIiwiYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbiIsInBhY2thZ2VOYW1lcyIsInByaXZhdGVQYWNrYWdlcyIsInJlcG8iLCJpc1dvcmtzcGFjZVBhY2thZ2UiLCJvdGhlclRhcmdldCIsImNvbW1pdEhhc2giLCJvcmdhbml6YXRpb24iLCJyZWplY3QiLCJnZXRMYXRlc3RDb21taXRIYXNoIiwiZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIiLCJ1cGRhdGVQcml2YXRlUGFja2FnZXMiLCJyZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyIsInNlcmlhbGl6ZVBhY2thZ2VKc29uIiwiaW5zdGFsbE5wbURlcGVuZGVuY2llcyIsImluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyIsInJlbGF0aXZlRmlsZVBhdGgiLCJyZWxhdGl2ZSIsImZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIiLCJjb3JlIiwiZm9ybWF0U2NyaXB0Iiwic2NyaXB0UnVubmVyIiwiZGV2IiwiZGVwZW5kZW5jeVNwZWNpZmllcnMiLCJjdXJyZW50VmVyc2lvbiIsImdldERlcGVuZGVuY3lTcGVjaWZpZXIiLCJnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllciIsImRlcGVuZGVuY2llc1RvSW5zdGFsbCIsInNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSIsInNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3kiLCJkaWFnbm9zdGljIiwiZmxhdHRlbkRpYWdub3N0aWNNZXNzYWdlVGV4dCIsIm1lc3NhZ2VUZXh0IiwiY2FjaGVkVmVyc2lvbiIsImdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbSIsImVzbGludCIsInJlcG9zaXRvcnlVcmwiLCJtYXRjaGVkIiwiZXhlYyIsIm5vcm1hbGl6ZWRVcmwiLCJvbGRTY3JpcHRzIiwiaGFzVHlwZWNoZWNrIiwiY2xlYW51cCIsInR5cGVjaGVjayIsInZlcmlmeSIsImFwcGx5TWlzZVRhc2tTY3JpcHRzIiwicHlyaWdodCIsImhhc0pzT3JUcyIsIm9sZFRlc3QiLCJnZW5lcmF0ZUZvcm1hdFNjcmlwdCIsImhhc01pc2VUYXNrIiwiZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQiLCJpc1diZnlNYW5hZ2VkTWlzZUJyaWRnZSIsIm1pc2VUYXNrcyIsInRhc2siLCJSZWdFeHAiLCJyYXciLCJjb21tYW5kcyIsImJhc2VTZXR0aW5ncyIsImdsb2JfbWF0Y2hlciIsInByZUNvbW1pdFNldHRpbmdzIiwic3RhZ2VfZml4ZWQiLCJnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiIsImh1c2t5RGlyUGF0aCIsImhhc0h1c2t5RGlyIiwic2V0dGluZ3MiLCJnZXRQcmVDb21taXRKb2JzIiwicHJlUHVzaCIsImxpbnRDb21tYW5kIiwicXVpZXRMaW50Q29tbWFuZCIsImdldFByZVB1c2hTY3JpcHQiLCJta2RpclN5bmMiLCJtb2RlIiwicG9zdE1lcmdlQ29tbWFuZCIsInBvc3RNZXJnZUNvbW1hbmRzIiwiaGFzVmVyc2lvblNldHRpbmdzIiwidG9vbHNDaGFuZ2VkUGF0dGVybiIsImluc3RhbGxDb21tYW5kIiwicm1OZXh0RGlyZWN0b3J5IiwiZ2VuSTE4blRzQ29tbWFuZCIsImdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMiLCJnZXRDbGVhbnVwR2xvYnMiLCJnZXRDbGVhbnVwQ29tbWFuZCIsInN1cHBvcnRlZEV4dGVuc2lvbnMiLCJsb2NhbFdiUGFja2FnZUpzb25QYXRoIiwiaGFzTG9jYWxXYldvcmtzcGFjZSIsImNhblVzZVdiRm9yU3RhZ2VkRmlsZXMiLCJveGxpbnRQYXR0ZXJuIiwib3hmbXRQYXR0ZXJuIiwicHJldHRpZXJQYXR0ZXJuIiwiaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIiLCJnZXRQeXRob25SdW5uZXIiLCJnZW5lcmF0ZUxpbnRzdGFnZWRyYyIsIm5vcm1hbGl6ZVRvb2xDb25maWdDb250ZW50IiwiZ2VuZXJhdGVPeGZtdENvbmZpZyIsImxlZ2FjeUpzb25Db25maWdQYXRoIiwiZGVzaXJlZENvbnRlbnQiLCJnZW5lcmF0ZVRvb2xDb25maWdDb250ZW50IiwiZ2VuZXJhdGVPeGxpbnRDb25maWciLCJfcm9vdENvbmZpZyIsInNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnIiwiZ2V0TWFuYWdlZEJsb2NrIiwiZ2V0U3RhcnRNYXJrZXIiLCJoYXNNYW5hZ2VkQmxvY2tzIiwiYmxvY2tOYW1lIiwicmVwbGFjZW1lbnQiLCJleHRyYWN0TWFuYWdlZEJsb2NrIiwibmV4dENvbnRlbnQiLCJyZXBsYWNlTWFuYWdlZEJsb2NrIiwicmVwbGFjZU1hbmFnZWRCbG9ja3MiLCJnZXRDb25maWdDb250ZW50V2l0aE1hbmFnZWRCbG9ja3MiLCJnZXRNYW5hZ2VkQmxvY2tSZWdFeHAiLCJwYXR0ZXJuIiwiZXNjYXBlUmVnRXhwIiwiZ2V0RW5kTWFya2VyIiwiZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSIsImdpdGlnbm9yZUZpbGVQYXRoIiwiZ2l0aWdub3JlQ29udGVudCIsImFkZGl0aW9uYWxDb250ZW50IiwidmVudlBhdGgiLCJ2ZW52IiwiZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiIsImdlbmVyYXRlUmVhZG1lIiwiaW5zZXJ0QmFkZ2UiLCJmaWxlTmFtZXMiLCJyZWFkZGlyU3luYyIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwicmVtb3ZlR2l0SHViQWN0aW9uc0JhZGdlIiwicmVhZG1lIiwiaSIsImVzY2FwZWRCYWRnZU5hbWUiLCJlc2NhcGVkRmlsZU5hbWUiLCJnZW5lcmF0ZVJlbGVhc2VyYyIsInBsdWdpbnMiLCJwbHVnaW5FbnRyeSIsInBsdWdpbiIsInByZXNldCIsInN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uIiwiZmFpbENvbW1lbnRDb25kaXRpb24iLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsIiRzY2hlbWEiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJtYXRjaFBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJpbnN0YWxsQWdlbnRTa2lsbHMiLCJyb290SnNvbk9iaiIsImNvbXBpbGVyT3B0aW9ucyIsImFsd2F5c1N0cmljdCIsIm5vVW5jaGVja2VkSW5kZXhlZEFjY2VzcyIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsImltcG9ydEhlbHBlcnMiLCJub0VtaXQiLCJleGNsdWRlIiwiaW5jbHVkZSIsInN1Ykpzb25PYmoiLCJnZW5lcmF0ZVRzY29uZmlnIiwibW9kdWxlUmVzb2x1dGlvbiIsIm5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzIiwiYmFzZVVybCIsImFsaWFzIiwidGFyZ2V0cyIsIm5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHMiLCJub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyIsImNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzIiwiZ2VuZXJhdGVkVHlwZXMiLCJ0eXBlTmFtZXMiLCJ2aXRlc3QiLCJtb2NoYSIsImN5cHJlc3MiLCJnZXRHZW5lcmF0ZWRUeXBlcyIsImdldFRzY29uZmlnRXh0ZW5kcyIsInJvb3REaXIiLCJnZXRSb290RGlyIiwiZG9lc0NvbnRhaW5Kc3hPclRzeCIsImRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzIiwianN4IiwiYWRkSW5jbHVkZVBhdGgiLCJleGlzdGluZ1R5cGVzIiwiZXhpc3RpbmdFbWl0TWV0YWRhdGEiLCJlbWl0T3B0aW9ucyIsInBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YSIsImdlbmVyYXRlZEV4dGVuZHMiLCJleGlzdGluZ0V4dGVuZHMiLCJtZXJnZWRFeHRlbmRzIiwibm9ybWFsaXplRXh0ZW5kcyIsInVuaXF1ZUV4dGVuZHMiLCJtZXJnZVRzY29uZmlnRXh0ZW5kcyIsImVtaXREZWNsYXJhdGlvbk9ubHkiLCJyZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb25zIiwiZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eSIsIm1lcmdlZFR5cGVzIiwiZmlsdGVyRXhpc3RpbmdUeXBlcyIsInR5cGVOYW1lIiwidHlwZVJvb3RzIiwiZXhwZXJpbWVudGFsRGVjb3JhdG9ycyIsIm1vZHVsZSIsImRlbGV0ZUxlZ2FjeU1vZHVsZVNldHRpbmdzIiwidmVyYmF0aW1Nb2R1bGVTeW50YXgiLCJpc0Fic29sdXRlIiwiZ2VuZXJhdGVkVHlwZVNldCIsImlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwiZ2VuZXJhdGVZYXJucmNZbWwiLCJ5YXJucmNZbWxQYXRoIiwibGF0ZXN0VmVyc2lvbiIsImdldExhdGVzdFZlcnNpb24iLCJuZXdWZXJzaW9uIiwib2xkVmVyc2lvbiIsInZhbGlkTmV3VmVyc2lvbiIsInNlbXZlciIsInZhbGlkIiwiZ3QiLCJpc05ld2VyVmVyc2lvbiIsInJlbGVhc2VzUGF0aCIsInlhcm5yY1BhdGgiLCJkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXgiLCJub2RlTGlua2VyIiwibm1Nb2RlIiwibnBtTWluaW1hbEFnZUdhdGUiLCJhcHByb3ZlZEdpdFJlcG9zaXRvcmllcyIsIm5wbVByZWFwcHJvdmVkUGFja2FnZXMiLCJjb21wcmVzc2lvbkxldmVsIiwiaW5qZWN0RW52aXJvbm1lbnRGaWxlcyIsImVuYWJsZUdsb2JhbENhY2hlIiwib3JpZ2luYWxMZW5ndGgiLCJwbHVnaW5QYXRoIiwiZ2V0WWFybnJjUHJldHRpZXJBcmdzIiwic2V0dXBMYWJlbHMiLCJzZXR1cExhYmVsIiwiZGVsZXRlTGFiZWwiLCJjb2xvciIsInJlcXVlc3QiLCJERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyIsInJlcXVpcmUiLCJjcmVhdGVSZXF1aXJlIiwic2V0dXBTZWNyZXRzIiwiZG90ZW52IiwicXVpZXQiLCJzZWNyZXROYW1lIiwic2VjcmV0X25hbWUiLCJrZXlfaWQiLCJrZXlJZCIsImRhdGEiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsImJlZm9yZVJldHJ5IiwiaGFuZGxlRXJyb3IiLCJyZXRyeUNvdW50IiwicmV0cnlMb2dnZXIiLCJzaG91bGRSZXRyeSIsInNsZWVwTWlsbGlzZWNvbmRzIiwidXBkYXRlU2xlZXBNaWxsaXNlY29uZHMiLCJmYWlsZWRDb3VudCIsIndpdGhSZXRyeSIsImFsbG93X2F1dG9fbWVyZ2UiLCJhbGxvd19tZXJnZV9jb21taXQiLCJhbGxvd19zcXVhc2hfbWVyZ2UiLCJhbGxvd19yZWJhc2VfbWVyZ2UiLCJhbGxvd191cGRhdGVfYnJhbmNoIiwiZGVsZXRlX2JyYW5jaF9vbl9tZXJnZSIsInNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGUiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2UiLCJoZWFkZXJzIiwicGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciIsInRlbXBsYXRlcyIsImdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIiwiYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlIiwiZGlzdGFuY2UiLCJ0ZW1wbGF0ZSIsInBhY2thZ2VNYW5hZ2VyQ29tbWFuZCIsIndiZnlKc29uU2NoZW1hIiwieiIsInJlY29yZCIsIm9wdGlvbmFsIiwiZG9jIiwiZ2V0UGFja2FnZUNvbmZpZyIsImVzbVBhY2thZ2UiLCJwYWNrYWdlSnNvblRleHQiLCJyZWxlYXNlQnJhbmNoZXMiLCJyZWxlYXNlUGx1Z2lucyIsInJlbGVhc2VyY0pzb25QYXRoIiwiZnNwIiwiZmxhdCIsInJlcG9JbmZvIiwiZ2l0Iiwic2ltcGxlR2l0Iiwib3JpZ2luIiwiZ2V0UmVtb3RlcyIsInIiLCJyZW1vdGVVcmwiLCJyZWZzIiwicmVxdWVzdFJlcG9JbmZvIiwiZmV0Y2hSZXBvSW5mbyIsImN1cnJlbnQiLCJoYXNWZXJzaW9uU2V0dGluZ3NGaWxlIiwiZG9ja2VyZmlsZSIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsInJlcG9GdWxsTmFtZSIsImZ1bGxfbmFtZSIsInJlcG9BdXRob3IiLCJyZXBvTmFtZSIsInJlcG9QYXJ0cyIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsImlzRXNtUGFja2FnZSIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24iLCJnaXRodWIiLCJyZWFkTWlzZVRhc2tzIiwidGFza3MiLCJ0b21sIiwicmVhZE1pc2VUYXNrQ29tbWFuZCIsIm9yZyIsInJlZGlyZWN0ZWRGdWxsTmFtZSIsImxvY2F0aW9uIiwiZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZSIsInJlZnJlc2hCdW5Mb2NrIiwicm9vdERpclBhdGgiLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJkZWZhdWx0Iiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicGFja2FnZUpzb25EaXIiLCJVUkwiLCJwYXRobmFtZSIsImdldFZlcnNpb24iLCJzdHJpY3QiLCJoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiZCIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInNob3VsZFJ1bldvcmtmbG93cyIsInRoZW4iLCJleGl0Q29kZSJdLCJtYXBwaW5ncyI6IjhwQkFBT0EsZUFBZUMsRUFBTUMsR0FDMUIsT0FBTyxJQUFJQyxRQUFTQyxHQUFZQyxXQUFXRCxFQUFTRixHQUN0RCxDQ2lDT0YsZUFBZU0sRUFBb0JDLEdBQ3hDLElBQ0UsYUFBYUEsR0FDZixDQUFFLE1BQ0EsQ0FFSixDQUVPUCxlQUFlUSxFQUFxQkQsR0FDekMsSUFDRSxhQUFhQSxHQUNmLENBQUUsTUFBT0UsR0FDUCxHQUFxQixpQkFBVkEsR0FBc0JBLEdBQVMsU0FBVUEsR0FBd0IsV0FBZkEsRUFBTUMsS0FDakUsT0FFRixNQUFNRCxDQUNSLENBQ0YsQ0MvQ08sTUFBTUUsRUFBVSxJQUx2QixNQUNFQyxXQUFZLEVBQ1pDLG1CQUFvQixHQ2dCZixNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENOLEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssYUFBYUgscUJBRTVCLFVBQ1FDLEdBQ1IsQ0FBRSxNQUFPUixHQUNQUyxRQUFRQyxLQUFLLHFCQUFxQkgsTUFBU1AsYUFBaUJXLE1BQVFYLEVBQU1ZLE1BQVFDLE9BQU9iLE1BQzNGLENBQ0lFLEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssY0FBY0gsbUJBRS9CLEdDWldPLEVBQVMsQ0FDcEIsMkJBQU1DLENBQXNCQyxHQUMxQixJQUNFLGFBQWFDLEVBQUdDLFNBQVNDLFNBQVNILEVBQVUsT0FDOUMsQ0FBRSxNQUNBLENBRUosRUFDQSxrQkFBTUksQ0FBYUosRUFBa0JLLFNBQzdCSixFQUFHQyxTQUFTSSxNQUFNQyxFQUFLQyxRQUFRUixHQUFXLENBQUVTLFdBQVcsSUFDN0QsSUFBSUMsRUFBb0JMLEVBQVFNLE9BQzVCRCxJQUNGQSxHQUFxQixZQUVqQlQsRUFBR0MsU0FBU1UsVUFBVVosRUFBVVUsRUFFeEMsR0NqQldHLEVBQWMsSUFBSUMsRUNReEJ2QyxlQUFld0MsRUFBa0JDLEdBQ3RDLE9BQU8zQixFQUFPQywwQkFBMEIsb0JBQXFCZixVQUMzRCxNQUFNeUIsRUFBVyxDQUFDLEtBQU0sTUFBTyxPQUM1QmlCLElBQUtDLEdBQVFYLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxlQUFlRCxNQUN6REUsS0FBTUMsR0FBTXBCLEVBQUdxQixXQUFXRCxJQUM3QixJQUFLckIsRUFBVSxPQUVmLE1BQU11QixRQUFtQnRCLEVBQUdDLFNBQVNDLFNBQVNILEVBQVUsUUFDbER3QixFQXVCVixTQUFvQ25CLEdBQ2xDLE1BQU1vQixFQUFTQyxFQUFHQyxpQkFBaUIsaUJBQWtCdEIsRUFBU3FCLEVBQUdFLGFBQWFDLFFBQVEsRUFBTUgsRUFBR0ksV0FBV0MsSUFDMUcsSUFBSVAsRUFDSixNQUFNUSxFQUFTQyxJQUNUVCxJQUNBRSxFQUFHUSxtQkFBbUJELElBQVNQLEVBQUdTLDBCQUEwQkYsRUFBS0csWUFDbkVaLEVBQWdCUyxFQUFLRyxXQUlyQlYsRUFBR1csbUJBQW1CSixJQUN0QkEsRUFBS0ssY0FBY0MsT0FBU2IsRUFBR2MsV0FBV0MsYUFDWixtQkFBOUJSLEVBQUtTLEtBQUtDLFFBQVFsQixJQUNsQkMsRUFBR1MsMEJBQTBCRixFQUFLVyxPQUVsQ3BCLEVBQWdCUyxFQUFLVyxNQUd2QmxCLEVBQUdtQixhQUFhWixFQUFNRCxLQUd4QixPQURBQSxFQUFNUCxHQUNDRCxDQUNULENBN0MwQnNCLENBQTJCdkIsR0FDakQsSUFBS0MsRUFBZSxPQUVwQixNQUNNdUIsRUFBMEIsR0FJaEMsR0FMMkIsSUFBSUMsSUFBSXhCLEVBQWN5QixXQUFXaEMsSUFBS2lDLEdBQWFBLEVBQVMzRCxNQUFNb0QsWUFFckVRLElBQUksZUFDMUJKLEVBQWNLLEtBQUssMkNBRVEsSUFBekJMLEVBQWNNLE9BQWMsT0FFaEMsTUFBTUMsRUFBaUI5QixFQUFjK0IsU0FBVyxFQUMxQ0MsRUFBZWhDLEVBQWN5QixXQUFXUSxJQUFHLEdBQzNDQyxJQUFtQkYsR0FDckJqQyxFQUFXb0MsTUFBTUgsRUFBYUQsU0FBVUQsR0FBZ0JNLFNBQVMsS0FFL0RDLEVBQVNyQyxFQUFjeUIsV0FBV0ksT0FBUyxJQUFNSyxFQUFtQixLQUFPLEdBQzNFSSxFQUFhLEdBQUd2QyxFQUFXb0MsTUFBTSxFQUFHTCxLQUFrQk8sSUFBU2QsRUFBY2dCLEtBQUssUUFBUXhDLEVBQVdvQyxNQUN6R0wsV0FFSXpDLEVBQVltRCxJQUFJLElBQU1sRSxFQUFPTSxhQUFhSixFQUFVOEQsS0FFOUQsQ0NkQSxNQUFNRyxFQUFXQyxJQUFhLENBQXFCM0IsS0FBTSxVQUFXMkIsVUFFOURDLEVBQVdBLENBQUNsQixFQUF5Q21CLEVBQXlCLE1BQUUsQ0FDcEY3QixLQUFNLFNBQ04yQixNQUFPRyxFQUFlcEIsRUFBWW1CLEtBRzlCRSxFQUFnQkQsRUFBZSxDQUNuQ0UsV0FBWU4sRUFBUSxvQkFDcEJPLFFBQVNQLEVBQVEsb0RBQ2pCUSxJQUFLTixFQUFTLENBQ1pPLFFBQVNULEVBQVEsb0NBQ2pCVSxNQUFPVixFQUFRLDJEQUNmVyxXQUFZWCxFQUFRLDZDQUNwQlksTUFBT1osRUFBUSw2REFFakJhLFVBQVdYLEVBQVMsQ0FDbEJZLFFBQVNkLEVBQVEsMEJBQ2pCZSxJQUFLZixFQUFRLG9DQUNiZ0Isb0JBQXFCaEIsRUFBUSxvQkFDN0JpQixRQUFTakIsRUFBUSxXQUNqQmtCLE9BQVFsQixFQUFRLFVBQ2hCbUIsT0FBUW5CLEVBQVEsVUFDaEJvQixJQUFLcEIsRUFBUSxtRkFJYnFCLGlCQUFrQnJCLEVBQVEsbURBTzlCLFNBQVNJLEVBQWVwQixFQUF5Q21CLEVBQXlCLElBQ3hGLE1BQU8sQ0FDTEEsZUFDQW1CLFlBQWEsSUFDUkMsT0FBT0MsS0FBS3hDLEdBQVloQyxJQUFLeUUsSUFBRyxDQUFzQm5ELEtBQU0sV0FBWW1ELFlBQ3hFdEIsRUFBYW5ELElBQUksQ0FBQzBFLEVBQUdDLEtBQUssQ0FBc0JyRCxLQUFNLFFBQVNxRCxZQUVwRTNDLGFBRUosQ0FFTzFFLGVBQWVzSCxFQUFvQjdFLEdBQ3hDLE1BQU1oQixFQUFXTyxFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsd0JBQzlDLEdBQUtsQixFQUFHcUIsV0FBV3RCLEdBRW5CLE9BQU9YLEVBQU9DLDBCQUEwQixzQkFBdUJmLGdCQWdEakVBLGVBQXVDNEMsR0FDckMsSUFBSyxNQUFNMkUsS0FjYixTQUF5QjNFLEdBQ3ZCLE1BQU00RSxFQUFlLENBQUMsT0FBUSxZQUFhLGVBQWdCLFlBQWEsa0JBQ2xFQyxFQUF5QixHQUUvQixJQUFLLElBQUlDLEVBQWlCMUYsRUFBSzVCLFFBQVF3QyxHQUNyQzZFLEVBQWE1QyxRQUFRMkMsRUFBYTlFLElBQUtpRixHQUFhM0YsRUFBSzVCLFFBQVFzSCxFQUFnQkMsTUFJN0VqRyxFQUFHcUIsV0FBV2YsRUFBSzVCLFFBQVFzSCxFQUFnQixTQUxFQSxFQUFpQjFGLEVBQUtDLFFBQVF5RixHQUFpQixDQVFoRyxHQURzQjFGLEVBQUtDLFFBQVF5RixLQUNiQSxFQUFnQixLQUN4QyxDQUVBLE9BQU9ELENBQ1QsQ0E5QjRCRyxDQUFnQmhGLEdBQ3hDLElBQ0UsTUFBTWQsUUFBZ0JKLEVBQUdDLFNBQVNDLFNBQVMyRixFQUFhLFFBQ3hELEdBQUksNEJBQTRCTSxLQUFLL0YsR0FDbkMsTUFFSixDQUFFLE1BQ0EsQ0FJSixNQUFNLElBQUlWLE1BQU0sbUdBQ2xCLENBNURVMEcsQ0FBd0JyRixFQUFPRyxTQUVyQyxNQUFNSSxRQUFtQnRCLEVBQUdDLFNBQVNDLFNBQVNILEVBQVUsUUFDbERzRyxFQXNGVixTQUEwQ2pHLEdBQ3hDLE1BQU1vQixFQUFTQyxFQUFHQyxpQkFBaUIsdUJBQXdCdEIsRUFBU3FCLEVBQUdFLGFBQWFDLFFBQVEsRUFBTUgsRUFBR0ksV0FBV3lFLElBSWhILElBQUlDLEVBQ0osTUFBTXhFLEVBQVNDLElBQ2IsSUFBSXVFLEVBQUosQ0FDQSxHQUFJOUUsRUFBRytFLGlCQUFpQnhFLElBQTZDLGlCQUFwQ0EsRUFBS0csV0FBV08sUUFBUWxCLEdBQTRCLENBQ25GLE1BQU1pRixFQUFnQnpFLEVBQUswRSxVQUFVLEdBQ3JDLEdBQUlELEdBQWlCaEYsRUFBR1MsMEJBQTBCdUUsR0FFaEQsWUFEQUYsRUFBUUUsRUFHWixDQUNBaEYsRUFBR21CLGFBQWFaLEVBQU1ELEVBUlgsR0FZYixPQUZBQSxFQUFNUCxHQUVDK0UsRUFBUSxDQUFFL0UsU0FBUVEsS0FBTXVFLFFBQVVJLENBQzNDLENBMUdtQ0MsQ0FBaUN0RixHQUNoRSxJQUFLK0UsRUFBd0IsT0FFN0IsTUFBTVEsRUFBU0MsRUFBNkJULEVBQXVCckUsS0FBTXFFLEVBQXVCN0UsUUFDaEcsSUFBS3FGLEVBQVEsT0FHYixNQUFNRSxFQUFTQyxFQUFtQjNDLEVBQWV3QyxJQXNFckQsU0FBNkJJLEdBQzNCLE1BQU1wQyxFQUFZb0MsRUFBT2pFLFdBQVc2QixVQUNwQyxHQUF3QixXQUFwQkEsR0FBV3ZDLEtBQW1CLE9BSWxDdUMsRUFBVVosTUFBTWpCLFdBQVc4QixRQUFVZCxFQUFRLHlCQUMvQyxDQTVFSWtELENBQW9CSCxHQUVwQixNQUFNSSxFQUFtQkMsRUFBZSxDQUFFOUUsS0FBTSxTQUFVMkIsTUFBTzhDLEdBQVUsR0FDckVNLEVBQVFoQixFQUF1QnJFLEtBQUtzRixTQUFTakIsRUFBdUI3RSxRQUNwRStGLEVBQU1sQixFQUF1QnJFLEtBQUtzQixTQUNsQ08sRUFBYSxHQUFHdkMsRUFBV29DLE1BQU0sRUFBRzJELEtBQVNGLElBQW1CN0YsRUFBV29DLE1BQU02RCxXQUVqRjNHLEVBQVltRCxJQUFJLElBQU1sRSxFQUFPTSxhQUFhSixFQUFVOEQsS0FFOUQsQ0FFQSxTQUFTbUQsRUFBbUJRLEVBQW9CQyxHQUM5QyxNQUFNQyxFQUF1QixJQUFJM0UsSUFBSXdDLE9BQU9DLEtBQUtpQyxFQUFTekUsYUFDcERtQixFQUFlLElBQUlxRCxFQUFLckQsZ0JBQWlCc0QsRUFBU3RELGNBRWxEbUIsRUFBYyxJQUNma0MsRUFBS2xDLFlBQVlxQyxPQUFRQyxHQUEyQixhQUFoQkEsRUFBT3RGLE9BQXdCb0YsRUFBcUJ4RSxJQUFJMEUsRUFBT25DLFNBQ25HZ0MsRUFBU25DLFlBQVl0RSxJQUFLNEcsR0FDUCxhQUFoQkEsRUFBT3RGLEtBQTRCc0YsRUFDaEMsQ0FBRXRGLEtBQU0sUUFBU3FELE1BQU82QixFQUFLckQsYUFBYWYsT0FBU3dFLEVBQU9qQyxTQUcvRDNDLEVBQWEsSUFBS3dFLEVBQUt4RSxZQUM3QixJQUFLLE1BQU95QyxFQUFLeEIsS0FBVXNCLE9BQU9zQyxRQUFRSixFQUFTekUsWUFDakRBLEVBQVd5QyxHQUFPcUMsRUFBaUI5RSxFQUFXeUMsR0FBTXhCLEdBRXRELE1BQU8sQ0FBRUUsZUFBY21CLGNBQWF0QyxhQUN0QyxDQUVBLFNBQVM4RSxFQUFpQk4sRUFBK0JDLEdBQ3ZELE1BQW1CLFdBQWZELEdBQU1sRixNQUF1QyxXQUFsQm1GLEVBQVNuRixLQUMvQixDQUFFQSxLQUFNLFNBQVUyQixNQUFPK0MsRUFBbUJRLEVBQUt2RCxNQUFPd0QsRUFBU3hELFFBRW5Fd0QsQ0FDVCxDQWtFQSxTQUFTTSxFQUFnQjVGLEVBQTJCWCxHQUNsRCxHQUFJQyxFQUFHUywwQkFBMEJDLEdBQWEsQ0FDNUMsTUFBTTZGLEVBQWVsQixFQUE2QjNFLEVBQVlYLEdBQzlELE9BQU93RyxFQUFlLENBQUUxRixLQUFNLFNBQVUyQixNQUFPK0QsR0FBaUJoRSxFQUFRN0IsRUFBV08sUUFBUWxCLEdBQzdGLENBQ0EsR0FBSUMsRUFBR3dHLHlCQUF5QjlGLEdBQWEsQ0FDM0MsTUFBTStGLEVBQVcvRixFQUFXK0YsU0FBU2xILElBQUttSCxHQUFZSixFQUFnQkksRUFBUzNHLElBQy9FLE9BQUkwRyxFQUFTRSxLQUFNRCxRQUE4Q3hCLElBQVp3QixHQUM1Q25FLEVBQVE3QixFQUFXTyxRQUFRbEIsSUF4S0gsQ0FBcUJjLEtBQU0sUUFBUzJCLE1BMEt0RGlFLEVBQ2pCLENBQ0EsT0FBT2xFLEVBQVE3QixFQUFXTyxRQUFRbEIsR0FDcEMsQ0FFQSxTQUFTc0YsRUFDUHZGLEVBQ0FDLEdBRUEsTUFBTXFGLEVBQXVCLENBQUUxQyxhQUFjLEdBQUltQixZQUFhLEdBQUl0QyxXQUFZLENBQUEsR0FDOUUsSUFBSyxNQUFNQyxLQUFZMUIsRUFBY3lCLFdBQVksQ0FDL0MsR0FBSXZCLEVBQUc0Ryw4QkFBOEJwRixHQUFXLENBQzlDLE1BQU13QyxFQUFNeEMsRUFBUzNELEtBQUtvRCxRQUFRbEIsR0FDbENxRixFQUFPN0QsV0FBV3lDLEdBQU96QixFQUFReUIsR0FDakNvQixFQUFPdkIsWUFBWW5DLEtBQUssQ0FBRWIsS0FBTSxXQUFZbUQsUUFDNUMsUUFDRixDQUNBLElBQUtoRSxFQUFHNkcscUJBQXFCckYsS0FBZXhCLEVBQUc4RyxhQUFhdEYsRUFBUzNELFFBQVVtQyxFQUFHK0csZ0JBQWdCdkYsRUFBUzNELE1BQVEsQ0FDakgsTUFBTXFHLEVBQVFrQixFQUFPMUMsYUFBYWhCLEtBQUtGLEVBQVNQLFFBQVFsQixJQUFXLEVBQ25FcUYsRUFBT3ZCLFlBQVluQyxLQUFLLENBQUViLEtBQU0sUUFBU3FELFVBQ3pDLFFBQ0YsQ0FDQSxNQUFNMUIsRUFBUThELEVBQWdCOUUsRUFBU3dGLFlBQWFqSCxHQUNwRCxRQUFjbUYsSUFBVjFDLEVBQXFCLE9BQ3pCLE1BQU13QixFQUFNeEMsRUFBUzNELEtBQUtvRCxRQUFRbEIsR0FDbENxRixFQUFPN0QsV0FBV3lDLEdBQU94QixFQUN6QjRDLEVBQU92QixZQUFZbkMsS0FBSyxDQUFFYixLQUFNLFdBQVltRCxPQUM5QyxDQUNBLE9BQU9vQixDQUNULENBRUEsU0FBU08sRUFBZW5ELEVBQW9CeUUsR0FDMUMsTUFBTUMsRUFBZ0IsS0FBS0MsT0FBT0YsR0FDbEMsR0FBbUIsVUFBZnpFLEVBQU0zQixLQUFrQixDQUMxQixHQUEyQixJQUF2QjJCLEVBQU1BLE1BQU1iLE9BQWMsTUFBTyxLQUNyQyxNQUFNeUYsRUFBUyxLQUFLRCxPQUFPRixFQUFRLEdBWW5DLE1BQU8sTUFYT3pFLEVBQU1BLE1BQU1qRCxJQUFLOEgsSUFDN0IsTUFBTUMsRUFBYzNCLEVBQWUwQixFQUFNSixFQUFRLEdBQUdNLE1BQU0sTUFFMUQsR0FEQUQsRUFBWUEsRUFBWTNGLE9BQVMsR0FBSyxHQUFHMkYsRUFBWXZGLFVBQ25DLFlBQWRzRixFQUFLeEcsS0FDUCxJQUFLLElBQUlxRCxFQUFRLEVBQUdBLEVBQVFvRCxFQUFZM0YsT0FBUXVDLEdBQVMsRUFDdkRvRCxFQUFZcEQsR0FBUyxHQUFHa0QsSUFBU0UsRUFBWXBELEtBSWpELE9BREFvRCxFQUFZLEdBQUssR0FBR0YsSUFBU0UsRUFBWSxLQUNsQ0EsRUFBWWpGLEtBQUssUUFFUEEsS0FBSyxVQUFVNkUsSUFDcEMsQ0FDQSxHQUFtQixZQUFmMUUsRUFBTTNCLEtBQW9CLE9BQU8yQixFQUFNQSxNQUUzQyxNQUFNNEUsRUFBUyxLQUFLRCxPQUFPRixFQUFRLEdBQzdCTyxFQUFvQixJQUFJbEcsSUFDeEJtRyxFQXFCUixTQUFtQzVELEdBQ2pDLE1BQU00RCxFQUF5QixJQUFJQyxJQUNuQyxJQUFLLE1BQU94RCxFQUFPaUMsS0FBV3RDLEVBQVl1QyxVQUNwQixhQUFoQkQsRUFBT3RGLE1BQ1Q0RyxFQUF1QkUsSUFBSXhCLEVBQU9uQyxJQUFLRSxHQUczQyxPQUFPdUQsQ0FDVCxDQTdCaUNHLENBQTBCcEYsRUFBTUEsTUFBTXFCLGFBQy9EZ0UsRUFBUXJGLEVBQU1BLE1BQU1xQixZQUFZaUUsUUFBUSxDQUFDM0IsRUFBUWpDLEtBQ3JELEdBQW9CLFVBQWhCaUMsRUFBT3RGLEtBQ1QsTUFBTyxDQUFDa0gsRUFBc0J2RixFQUFNQSxNQUFNRSxhQUFheUQsRUFBT2pDLFFBQVUsR0FBSWtELElBRzlFLEdBQUlLLEVBQXVCTyxJQUFJN0IsRUFBT25DLE9BQVNFLEVBQU8sTUFBTyxHQUM3RCxNQUFNbUQsRUFBTzdFLEVBQU1BLE1BQU1qQixXQUFXNEUsRUFBT25DLEtBQzNDLE9BQUtxRCxHQUFRRyxFQUFrQi9GLElBQUkwRSxFQUFPbkMsS0FBYSxJQUN2RHdELEVBQWtCUyxJQUFJOUIsRUFBT25DLEtBQ3RCLENBQUNrRSxFQUF3Qi9CLEVBQU9uQyxJQUFLcUQsRUFBTUosRUFBT0csT0FPM0QsT0FMQVMsRUFBTW5HLFFBQ0RvQyxPQUFPc0MsUUFBUTVELEVBQU1BLE1BQU1qQixZQUMzQjJFLE9BQU8sRUFBRWxDLE1BQVV3RCxFQUFrQi9GLElBQUl1QyxJQUN6Q3pFLElBQUksRUFBRXlFLEVBQUtxRCxLQUFVYSxFQUF3QmxFLEVBQUtxRCxFQUFNSixFQUFPRyxLQUUvQyxJQUFqQlMsRUFBTWxHLE9BQXFCLE1BQU11RixLQUM5QixNQUFNVyxFQUFNeEYsS0FBSyxVQUFVNkUsSUFDcEMsQ0FZQSxTQUFTZ0IsRUFBd0JsRSxFQUFhcUQsRUFBbUJKLEVBQWVHLEdBQzlFLE1BQU1FLEVBQWMzQixFQUFlMEIsRUFBTUosRUFBUSxHQUFHTSxNQUFNLE1BRTFELEdBREFELEVBQVlBLEVBQVkzRixPQUFTLEdBQUssR0FBRzJGLEVBQVl2RixVQUNuQyxZQUFkc0YsRUFBS3hHLEtBQ1AsSUFBSyxJQUFJcUQsRUFBUSxFQUFHQSxFQUFRb0QsRUFBWTNGLE9BQVF1QyxHQUFTLEVBQ3ZEb0QsRUFBWXBELEdBQVMsR0FBR2tELElBQVNFLEVBQVlwRCxLQUlqRCxPQURBb0QsRUFBWSxHQUFLLEdBQUdGLElBQVNwRCxNQUFRc0QsRUFBWSxLQUMxQ0EsRUFBWWpGLEtBQUssS0FDMUIsQ0FFQSxTQUFTMEYsRUFBc0I1QixFQUFnQmlCLEdBQzdDLE1BQU1FLEVBQWNuQixFQUFPb0IsTUFBTSxNQUNqQ0QsRUFBWUEsRUFBWTNGLE9BQVMsR0FBSyxHQUFHMkYsRUFBWXZGLFVBQ3JELElBQUssTUFBT21DLEVBQU9pRSxLQUFTYixFQUFZbEIsVUFDdENrQixFQUFZcEQsR0FBUyxHQUFHa0QsSUFBU2UsSUFFbkMsT0FBT2IsRUFBWWpGLEtBQUssS0FDMUIsQ0MzU08sTUFBTStGLEVBQWEsQ0FDeEIscUJBQ0EsY0FDQSxzQkFDQSxzQkFDQSxhQUNBLGNBQ0EsZUFDQSxhQUNBLGFDQUt2TCxlQUFld0wsRUFBa0IvSSxHQUN0QyxPQUFPM0IsRUFBT0MsMEJBQTBCLG9CQUFxQmYsVUFDM0QsTUFBTXlMLEVBa0JWLFNBQXdDaEosR0FDdEMsSUFBS0EsRUFBT2lKLFVBQVVDLE9BQVEsT0FBTyxFQUVyQyxNQUFNQyxFQUFlLElBQ2hCbkosRUFBT29KLGFBQWFELGdCQUNwQm5KLEVBQU9vSixhQUFhQyxpQkFLekIsT0FBUUYsRUFBYSxvQ0FBc0NBLEVBQWEseUJBQzFFLENBN0JxQ0csQ0FBK0J0SixHQUMxRHVKLFFBQWlCQyxFQUFHQyxLQUFLLENBQUMsUUFBUyxXQUFZLENBQUVDLEtBQUssRUFBTUMsSUFBSzNKLEVBQU9HLFFBQVN5SixPQUFRZCxJQUMvRixJQUFLLE1BQU1lLEtBQVdOLEVBQVUsQ0FDOUIsTUFBTXpFLEVBQWN2RixFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMwSixHQUMzQ3hLLFFBQWdCSixFQUFHRSxTQUFTMkYsRUFBYSxRQUN6Q2hDLEVBQWF6RCxFQUFReUssV0FDekIsdURBQ0EsQ0FBQ0MsRUFBTy9GLElBQ0MsaUJBQWlCZ0csRUFBMkJoRyxFQUFLZ0YsT0FHeERsRyxJQUFlekQsU0FDWEosRUFBR1csVUFBVWtGLEVBQWFoQyxFQUVwQyxHQUVKLENBZUEsU0FBU2tILEVBQTJCaEcsRUFBYWdGLEdBQy9DLE1BQU1pQixFQUFhakcsRUFBSWtHLFFBQVEsS0FDekJDLE9BQVdGLEVBQW9CakcsRUFBSXJCLE1BQU0sRUFBR3NILEdBQWNqRyxFQUMxRG9HLE9BQVlILEVBQW9CakcsRUFBSXJCLE1BQU1zSCxFQUFhLEdBQUssR0FDNURJLEVBQVMsSUFBSUMsZ0JBQWdCRixHQUVuQ0MsRUFBT0UsT0FBTyxvQkFDVnZCLEdBQ0ZxQixFQUFPaEMsSUFBSSxtQkFBb0IsS0FHakMsTUFBTW1DLEVBQWtCSCxFQUFPSSxXQUMvQixPQUFPRCxFQUFrQixHQUFHTCxLQUFZSyxJQUFvQkwsQ0FDOUQsQ0N2REEsTUFBTWhJLEVBQU0sQ0FBQytELEVBQVF4QixJQUFRRixPQUFPa0csVUFBVUMsZUFBZUMsS0FBSzFFLEVBQVF4QixHQUUzRCxTQUFTbUcsRUFBd0IzRSxFQUFRNEUsR0FDdEQsSUFBSXJHLEVBQU1zRyxFQUFRckcsRUFFTSxtQkFBYm9HLEVBQ1RDLEVBQVNELEVBRVRyRyxFQUFPcUcsRUFHVCxNQUFNRSxFQUFRLENBQUEsRUFDUkMsRUFBYSxJQUFLeEcsR0FBUSxNQUFRRCxPQUFPQyxLQUFLeUIsR0FBUWdGLEtBQUtILElBRWpFLElBQUtyRyxLQUFPdUcsRUFDTjlJLEVBQUkrRCxFQUFReEIsS0FDZHNHLEVBQU10RyxHQUFPd0IsRUFBT3hCLElBSXhCLE9BQU9zRyxDQUNULENDcEJBLE1BQU1HLEVBQWUsZ0JBRWZDLEVBQW9CLFFBSTFCLFNBQVNDLEVBQXdCQyxFQUFvQkMsRUFBWXJJLEdBQ2hFLE9BQU9vSSxHQUFzQkMsSUFBZUgsR0FBK0IsSUFBVmxJLENBQ2xFLENBZ0JBLFNBQVNzSSxFQUFlQyxFQUFRSCxHQUMvQixNQUFNSSxFQUFVLElBQUl0RCxJQUdwQixJQUNJdUQsRUFHQWpILEVBSkFrSCxFQUFlLEVBTW5CLElBQUssTUFBTS9DLEtBQVE0QyxFQUFPeEQsTUFBTSxPQUFRLENBQ3ZDLElBQUtZLEVBRUosU0FHRCxNQUFNZ0QsRUFBVWhELEVBQUtrQixNQUFNb0IsR0FFM0IsR0FBZ0IsT0FBWlUsRUFDSEQsRUFBZSxFQUNmRCxFQUFxQixPQUNmLENBQ04sTUFBTTdELEVBQVMrRCxFQUFRLEdBQUd4SixPQUNwQmtKLEVBQWFNLEVBQVEsR0FBS1QsRUE1Q1gsTUErQ3JCLEdBQUlDLEVBQXdCQyxFQUFvQkMsRUFBWXpELEdBQzNELFNBR0d5RCxJQUFlSSxJQUNsQkMsRUFBZSxHQUdoQkQsRUFBcUJKLEVBRXJCLElBQUk5SCxFQUFNLEVBQ05xSSxFQUFTLEVBRWIsTUFBTUMsRUFBbUJqRSxFQUFTOEQsRUFJbEMsR0FIQUEsRUFBZTlELEVBR1UsSUFBckJpRSxFQUVIdEksRUFBTSxFQUVOcUksRUFBUyxNQUVILENBQ04sTUFBTUUsRUFBMkJDLEtBQUtDLElBQUlILEdBSTFDLEdBQUlWLEVBQXdCQyxFQUFvQkMsRUFBWVMsR0FDM0QsU0FHRHRILEVBQU15SCxFQUFpQlosRUFBWVMsRUFDcEMsQ0FHQSxNQUFNSSxFQUFRVixFQUFRaEQsSUFBSWhFLEdBQzFCZ0gsRUFBUXJELElBQUkzRCxPQUFla0IsSUFBVndHLEVBQXNCLENBQUMsRUFBRyxHQUFLLENBQUNBLEVBQU0sR0FBSzNJLEVBQUsySSxFQUFNLEdBQUtOLEdBQzdFLENBQ0QsQ0FFQSxPQUFPSixDQUNSLENBR0EsU0FBU1MsRUFBaUJaLEVBQVljLEdBRXJDLE9BRHNCZCxJQUFlSCxFQUFvQixJQUFNLEtBQ3hDdk0sT0FBT3dOLEVBQy9CLENBbUNlLFNBQVNDLEVBQWFiLEdBQ3BDLEdBQXNCLGlCQUFYQSxFQUNWLE1BQU0sSUFBSWMsVUFBVSxxQkFLckIsSUFBSWIsRUFBVUYsRUFBZUMsR0FBUSxHQUNoQixJQUFqQkMsRUFBUWMsT0FDWGQsRUFBVUYsRUFBZUMsR0FBUSxJQUdsQyxNQUFNZ0IsRUFqQ1AsU0FBd0JmLEdBQ3ZCLElBQUlnQixFQUNBQyxFQUFVLEVBQ1ZDLEVBQVksRUFFaEIsSUFBSyxNQUFPbEksR0FBTW1JLEVBQVdmLE1BQVlKLEdBQ3BDbUIsRUFBWUYsR0FBWUUsSUFBY0YsR0FBV2IsRUFBU2MsS0FDN0RELEVBQVVFLEVBQ1ZELEVBQVlkLEVBQ1pZLEVBQVNoSSxHQUlYLE9BQU9nSSxDQUNSLENBbUI2QkksQ0FBZXBCLEdBRTNDLElBQUlxQixFQUNBQyxFQUFTLEVBQ1RsRixFQUFTLEdBaERkLElBQTBCbUYsRUF1RHpCLFlBTDRCckgsSUFBeEI2RyxNQUNETSxPQUFNQyxVQTdDRixDQUFDRCxLQUxrQyxPQURqQkUsRUFtRFdSLEdBbERELEdBQ0pyQixFQXBHUixNQXdHVDRCLE9BRkNFLE9BQU9ELEVBQVd0SyxNQUFNLE1BZ0R0Q21GLEVBekJGLFNBQTBCaUYsRUFBTUMsR0FFL0IsT0FEd0JELElBQVMzQixFQUFvQixJQUFNLE1BQ3BDdkQsT0FBT21GLEVBQy9CLENBc0JXRyxDQUFpQkosRUFBTUMsSUFHMUIsQ0FDTkEsU0FDQUQsT0FDQWpGLFNBRUYsQ0NqSk8sU0FBU3NGLEVBQXNCM0IsR0FDckMsTUFBMEIsaUJBQVhBLEdBbEJULFNBQXVCQSxHQUM3QixHQUFzQixpQkFBWEEsRUFDVixNQUFNLElBQUljLFVBQVUscUJBR3JCLE1BQU1jLEVBQVc1QixFQUFPMUIsTUFBTSxlQUFpQixHQUUvQyxHQUF3QixJQUFwQnNELEVBQVNoTCxPQUNaLE9BR0QsTUFBTWlMLEVBQU9ELEVBQVN6RyxPQUFPMkcsR0FBdUIsU0FBWkEsR0FBb0JsTCxPQUc1RCxPQUFPaUwsRUFGSUQsRUFBU2hMLE9BQVNpTCxFQUVWLE9BQVMsSUFDN0IsQ0FHdUNFLENBQWMvQixJQUFZLElBQ2pFLENDVkEsTUFBTWdDLEdBQ0hDLEdBQ0QsQ0FBQ0MsS0FBTUMsSUFDTEYsRUFBSUcsT0FBTyxDQUFDbkIsRUFBUTVPLElBQU9BLEVBQUc0TyxLQUFXa0IsR0FBT0QsR0FDOUNHLEdBQVdoUSxHQUFRNlAsR0FBT0ksTUFBTUMsUUFBUUwsR0FBSzdQLEVBQUc2UCxHQUFLQSxFQUNyRE0sR0FBaUJuUSxHQUFRNlAsR0FDN0JJLE1BQU1DLFFBQVFMLElBQU1BLEVBQUVPLE1BQU9uRyxHQUF5QixpQkFBVEEsR0FBcUJqSyxFQUFHNlAsR0FBS0EsRUFDdEVRLEdBQU9GLEdBQWVHLEdBQU8sSUFBSSxJQUFJcE0sSUFBSW9NLEtBQ3pDQyxHQUFZSixHQUFlSyxHQUFVQSxFQUFNQyxZQUMzQ0MsR0FBbUJmLEdBQUssQ0FBQ1UsR0FBTUUsS0FDL0JJLEdBQ0gzUSxHQUNELENBQUM2UCxLQUFNQyxJQ3JCTSxTQUF1QjFLLEdBQ3JDLEdBQXFCLGlCQUFWQSxHQUFnQyxPQUFWQSxFQUNoQyxPQUFPLEVBR1IsTUFBTXdILEVBQVlsRyxPQUFPa0ssZUFBZXhMLEdBQ3hDLFFBQXNCLE9BQWR3SCxHQUFzQkEsSUFBY2xHLE9BQU9rRyxXQUFrRCxPQUFyQ2xHLE9BQU9rSyxlQUFlaEUsSUFBMEJpRSxPQUFPQyxlQUFlMUwsR0FBWXlMLE9BQU9FLFlBQVkzTCxFQUN0SyxDRGVJNEwsQ0FBY25CLEdBQUs3UCxFQUFHNlAsS0FBTUMsR0FBUUQsRUFDbENvQixHQUFlLENBQUNDLEVBQVlDLEtBQ2hDLE1BQU1DLEVBQU9ULEdBQVV2SSxJQUNqQitJLElBQ0YvSSxFQUFTMUIsT0FBTzJLLFlBQ2QzSyxPQUFPc0MsUUFBUVosR0FBUWpHLElBQUksRUFBRXlFLEVBQUt4QixLQUFXLENBQUN3QixFQUFLd0ssRUFBS2hNLE9BSXJEa00sRUFBZWxKLEVBQVE4SSxLQUdoQyxPQUFPRSxHQUVIRyxHQUVKN0ssT0FBTzhLLFNBRVQsRUFBSWhCLEVBQU9pQixLQUNQLE1BQU03QyxFQUFTbEksT0FBT2dMLE9BQU8sTUFDN0IsSUFBSyxNQUFNdE0sS0FBU29MLEVBQU8sQ0FDekIsTUFBTTVKLEVBQU02SyxFQUFTck0sR0FDakJ3SixFQUFPaEksR0FDVGdJLEVBQU9oSSxHQUFLdEMsS0FBS2MsR0FFakJ3SixFQUFPaEksR0FBTyxDQUFDeEIsRUFFbkIsQ0FDQSxPQUFPd0osQ0FDUixHQUNHK0MsR0FBYVYsS0FDYlcsR0FBZ0JYLEdBQWEsQ0FBQyxPQUFRLFFBQ3RDWSxHQUFtQlosR0FBYSxDQUFDLE9BQVEsUUFBUyxRQUNsRGEsR0FBa0JiLEdBQWEsQ0FDbkMsTUFDQSxNQUNBLE1BQ0EsTUFDQSxVQUNBLFNBRUljLEdBQWUsQ0FBQzNOLEVBQVVnTixJQUM5QlQsR0FBUyxDQUFDdkksS0FBVzBILElBQ25CcEosT0FBT3NMLE9BQU81SixFQUFRaEUsR0FDbEIsSUFBS2dFLEVBQVFoRSxDQUFDQSxHQUFXZ04sRUFBS2hKLEVBQU9oRSxNQUFjMEwsSUFDbkQxSCxHQUVGNkosR0FBZWhCLHFkQUVmaUIsR0FBNEJDLElBRWhDLE1BQU9DLEdBQWtCRCxFQUFVaEksTUFBTSxLQUNuQ2tJLEVBQVksSUFBSUQsRUFBZUUsU0FBUyxNQUM5QyxJQUNHRCxFQUFVOU4sUUFDVyxJQUFyQjhOLEVBQVU5TixRQUF1QyxJQUF2QjhOLEVBQVUsR0FBR3ZMLE1BRXhDLE1BQU8sQ0FBRXJHLEtBQU0wUixHQUVqQixNQUFNSSxFQUFhRixFQUFVRyxNQUFNMUwsTUFDbkMsTUFBTyxDQUNMckcsS0FBTTJSLEVBQWVLLFVBQVUsRUFBR0YsR0FDbENHLE1BQU9OLEVBQWVLLFVBQVVGLEVBQWEsS0FJM0NJLEdBQXFCMUIsR0FBYSxDQUFDMkIsRUFBR0MsS0FDMUMsTUFBUXBTLEtBQU1xUyxFQUFPSixNQUFPSyxHQUFXYixHQUF5QlUsSUFDeERuUyxLQUFNdVMsRUFBT04sTUFBT08sR0FBV2YsR0FBeUJXLEdBRWhFLE9BQUlDLElBQVVFLEVBQ0xGLEVBQU1JLGNBQWNGLEVBQU8sTUFFL0JELEVBR0FFLEVBR0VFLEVBQWNDLEVBQWlCTCxHQUFTSyxFQUFpQkgsSUFGdkQsR0FIQSxJQVFMSSxHQUFrQkMsSUFDdEIsTUFBTXhNLEVBQVF3TSxFQUFNbEgsUUFBUSxJQUFLa0gsRUFBTUMsV0FBVyxLQUFPLEVBQUksR0FFN0QsT0FBaUIsSUFBVnpNLEVBQWV3TSxFQUFRQSxFQUFNek8sTUFBTSxFQUFHaUMsSUFhekMwTSxHQUFRLElBQUlsSixJQXFCbEIsU0FBU21KLEdBQThCbkksR0FFckMsTUFBMEMsaUJBQS9CQSxFQUFZb0ksZUFDZHBJLEVBQVlvSSxlQUFlSCxXQUFXLFFBRzNDakksRUFBWXFJLFlBQVlELGdCQUFnQmpULEtBQ1ksUUFBL0M2SyxFQUFZcUksV0FBV0QsZUFBZWpULE1BRzNDNkssRUFBWXNJLFNBS1p0SSxFQUFZdUksU0FBU0MsTUFuQ0EsTUFDekIsTUFBTWpJLEVBQU1rSSxRQUFRbEksTUFXcEIsT0FWSzJILEdBQU1uUCxJQUFJd0gsSUFDYjJILEdBQU1qSixJQUNKc0IsRUFDQTFLLEVBQUdxQixXQUFXLGNBQ1pyQixFQUFHcUIsV0FBVyxXQUNkckIsRUFBR3FCLFdBQVcsZ0JBQ2RyQixFQUFHcUIsV0FBVyxtQkFDZHJCLEVBQUdxQixXQUFXLHdCQUdiZ1IsR0FBTTVJLElBQUlpQixJQTJCYm1JLEdBS04sQ0FPQSxNQUFNQyxHQUFtQnRELEdBQVMsQ0FBQ3RGLEVBQWNDLElBRTNDNUUsT0FBT0MsS0FBSzBFLEdBQWM5RyxPQUFTLEVBQzlCOEcsRUFLTG9JLEdBQThCbkksR0FDekJnRyxFQUFlakcsRUFBYyxDQUFDdUgsRUFBR0MsSUFBTUQsRUFBRU0sY0FBY0wsRUFBRyxPQUc1RHZCLEVBQWVqRyxJQVVsQjZJLEdBQWlCdkUsR0FBSyxDQUMxQnNCLEdBQWEsQ0FBQyxXQUFZLFlBQzFCYyxHQUFhLFdBQVlyQixJQUN6QnFCLEdBQWEsVUFBV2tDLE1Bd0JwQkUsR0FBbUJ4RSxHQUFLLENBQzVCc0IsR0FyQmlDLENBSWpDLFFBQ0EsZ0JBRUEsTUFDQSxTQUNBLGdCQUNBLFdBQ0EsVUFDQSxVQUNBLFFBQ0EsWUFDQSxVQUNBLFlBQ0EsaUJBQ0Esa0NBSUFjLEdBQWEsTUFBT0osSUFDcEJJLEdBQWEsVUFBV0osSUFDeEJJLEdBQ0UsWUFDQS9CLEdBQVNvRSxHQUFjQSxFQUFValMsSUFBSWdTLE1BRXZDcEMsR0FBYSxnQkFBaUJKLElBQzlCSSxHQUNFLFFBQ0FkLEdBQ0UsQ0FBQ29ELEVBQU9DLElBQ05ELEVBQU1sSyxNQUFNLEtBQUs1RixPQUFTK1AsRUFBTW5LLE1BQU0sS0FBSzVGLFFBQzNDOFAsRUFBTW5CLGNBQWNvQixLQUcxQnZDLEdBQWEsV0FBWUosTUFFckI0QyxHQUF3QnRELEdBQWEsQ0FBQyxjQUFlLE1BQU8sU0FFNUR1RCxHQUFxQjdFLEdBQUssQ0FFOUJnQixHQUFVek8sR0FDUm9QLEVBQWVwUCxFQUFRLElBQ2xCd0UsT0FBT0MsS0FBS3pFLEdBQ1o0RyxPQUFRbEMsR0FBZ0IsY0FBUkEsR0FDaEJ3RyxPQUNILGVBSUoyRSxHQUNFLFlBRUEvQixHQUFTb0UsR0FDUEEsRUFBVWpTLElBQ1J3TixHQUFLLENBRUhnQyxHQUVBSSxHQUFhLFVBQVdKLFdBTzVCOEMsR0FBWXhELEdBQWEsQ0FBQyxPQUFRLE1BQU8sU0FDekN5RCxHQUFpQjNDLEdBQ3JCLGlCQUNBZCxHQUFhLENBQUMsT0FBUSxVQUFXLFlBbUI3QjBELEdBQWlCaEYsR0FBSyxDQUMxQnNCLEdBakIrQixDQUMvQixzQkFDQSx5QkFDQSx3QkFDQSw0QkFDQSw0QkFDQSx5QkFDQSxlQUNBLGNBQ0Esa0JBQ0EseUJBQ0EsWUFDQSxzQkFDQSxzQkFJdUMsR0FDdkNjLEdBQWEsWUFBYVksTUFJdEJpQyxHQUFvQixJQUFJMVEsSUFBSSxDQUNoQyxVQUNBLE9BQ0EsVUFDQSxVQUNBLFVBQ0EsYUFDQSxRQUNBLE9BQ0EsT0FDQSxZQUNBLFlBR0kyUSxHQUFtQixDQUFDQyxFQUFZeEosSUFFbEM1RSxPQUFPc0wsT0FBTzFHLEVBQWEsb0JBQzNCNUUsT0FBT3NMLE9BQU8xRyxFQUFZQyxnQkFBaUJ1SixHQUl6Q0MsR0FDSiwwRkFLSUMsR0FBdUIxSixJQUMzQixJQUNHdUosR0FBaUIsY0FBZXZKLEtBQ2hDdUosR0FBaUIsZUFBZ0J2SixHQUVsQyxPQUFPLEVBS1QsTUFIZ0IsQ0FBQyxVQUFXLGlCQUFpQlosUUFBU3VLLEdBQ3BEM0osRUFBWTJKLEdBQVN2TyxPQUFPd08sT0FBTzVKLEVBQVkySixJQUFVLElBRTVDMUwsS0FBTTRMLElBQVdDLE9BYk5uUCxFQWF5QmtQLEdBWjNDclEsU0FBUyxNQUFRaVEsR0FBV3pOLEtBQUtyQixHQURoQixJQUFDQSxLQWdCNUIsU0FBU29QLEdBQWdCMU8sRUFBTTVCLEVBQVMsSUFDdEMsTUFBTXVRLEVBQVcsSUFBSWhMLElBQ3JCLElBQUssTUFBTTFELEtBQU9ELEVBQU0sQ0FDdEIsTUFDTTRPLEdBRE94USxFQUFTNkIsRUFBSS9CLE1BQU1FLEVBQU9SLE9BQVMsR0FBS3FDLEdBQ3BDd0YsUUFBUSxLQUN6QixHQUFJbUosRUFBTSxFQUFHLENBQ1gsTUFBTTVNLEVBQU8vQixFQUFJL0IsTUFBTSxHQUFJRSxFQUFTQSxFQUFPUixPQUFTLEVBQUksR0FBS2dSLEdBQ3hERCxFQUFTalIsSUFBSXNFLElBQU8yTSxFQUFTL0ssSUFBSTVCLEVBQU0sSUFDNUMyTSxFQUFTMUssSUFBSWpDLEdBQU1yRSxLQUFLc0MsRUFDMUIsTUFDTzBPLEVBQVNqUixJQUFJdUMsSUFBTTBPLEVBQVMvSyxJQUFJM0QsRUFBSyxJQUMxQzBPLEVBQVMxSyxJQUFJaEUsR0FBS3RDLEtBQUtzQyxFQUUzQixDQUNBLE9BQU9xSixNQUFNdUYsS0FBS0YsRUFBUzNPLFFBQ3hCeUcsT0FDQTFDLFFBQVMrSyxJQUNSLE1BQU1DLEVBQVdKLEVBQVMxSyxJQUFJNkssR0FDOUIsR0FDRUMsRUFBU25SLE9BQVMsR0FDbEJtUixFQUFTbk0sS0FBTW9NLEdBQU1BLElBQU1GLEdBQVlFLEVBQUVwQyxXQUFXa0MsRUFBVyxNQUMvRCxDQUtBLE1BQU8sSUFKUUMsRUFDWjVNLE9BQVE2TSxHQUFNQSxJQUFNRixJQUFhRSxFQUFFcEMsV0FBV2tDLEVBQVcsTUFDekRySSxVQUVtQmlJLEdBRFBLLEVBQVM1TSxPQUFRNk0sR0FBTUEsRUFBRXBDLFdBQVdrQyxFQUFXLE1BQ2hCQSxHQUNoRCxDQUNBLE9BQU9DLEVBQVN0SSxRQUV0QixDQUVBLE1BQU13SSxHQUFjakYsR0FBUyxDQUFDa0YsRUFBU3ZLLEtBQ3JDLElBQUl3SyxFQUFRcFAsT0FBT0MsS0FBS2tQLEdBQ3hCLE1BQU1FLEVBQWEsSUFBSTdSLElBaUJ2QixPQWZBNFIsRUFBUUEsRUFBTTNULElBQUsxQixJQUNqQixNQUFNdVYsRUFBVXZWLEVBQUt3VixRQUFRLGdCQUFpQixJQUM5QyxPQUFJckIsR0FBa0J2USxJQUFJMlIsSUFBWUYsRUFBTWhSLFNBQVNrUixJQUNuREQsRUFBV2xMLElBQUltTCxHQUNSQSxHQUVGdlYsSUFHSnVVLEdBQW9CMUosS0FDdkJ3SyxFQUFRVCxHQUFnQlMsSUFFMUJBLEVBQVFBLEVBQU1wTCxRQUFTOUQsR0FDckJtUCxFQUFXMVIsSUFBSXVDLEdBQU8sQ0FBQyxNQUFNQSxJQUFPQSxFQUFLLE9BQU9BLEtBQVMsQ0FBQ0EsSUFFckQwSyxFQUFldUUsRUFBU0MsS0FNM0JJLEdBQWtCQyxJQUN0QixNQUFNQyxrQkFBRUEsRUFBb0IsR0FBRUMsZUFBRUEsRUFBaUIsSUFBTzlFLEdBQ3RENEUsRUFDQ0csR0FDbUIsWUFBZEEsRUFDSyxvQkFHRixrQkFJWCxNQUFPLElBQUlELEtBQW1CRCxJQUcxQkcsR0FBYzVGLEdBQVU2RixJQUM1QixNQUFNQyxNQUFFQSxFQUFRLEdBQUVOLFdBQUVBLEVBQWEsSUFBTzVFLEdBQ3RDN0ssT0FBT0MsS0FBSzZQLEdBQ1g1UCxHQUFTQSxFQUFJMk0sV0FBVyxLQUFPLFFBQVUsY0FHNUMsT0FBTzdNLE9BQU8ySyxZQUNaLElBQUlvRixLQUFVUCxHQUFlQyxJQUFhaFUsSUFBS3lFLEdBQVEsQ0FDckRBLEVBQ0EyUCxHQUFZQyxFQUFRNVAsU0FjcEI4UCxHQUFTLENBQ2IsQ0FBRTlQLElBQUssV0FDUCxDQUFFQSxJQUFLLFFBQ00sQ0FBRUEsSUFBSyxlQUNwQixDQUFFQSxJQUFLLFdBQ0ksQ0FBRUEsSUFBSyxpQkFDbEIsQ0FBRUEsSUFBSyxXQUNQLENBQUVBLElBQUssZUFDTSxDQUFFQSxJQUFLLGFBQWN3SyxLQUFNZixJQUN4QyxDQUFFekosSUFBSyxXQUFZd0ssS0FBTWYsSUFDekIsQ0FBRXpKLElBQUssWUFDUCxDQUFFQSxJQUFLLE9BQVF3SyxLQUFNSCxHQUFhLENBQUMsTUFBTyxXQUMxQyxDQUFFckssSUFBSyxhQUFjd0ssS0FBTVEsSUFDM0IsQ0FBRWhMLElBQUssVUFBV3dLLEtBQU1RLElBQ3hCLENBQUVoTCxJQUFLLFVBQVd3SyxLQUFNUSxJQUNYLENBQUVoTCxJQUFLLE9BQ3BCLENBQUVBLElBQUssU0FBVXdLLEtBQU1TLElBQ3ZCLENBQ0VqTCxJQUFLLGNBQ0x3SyxLQUFNcEIsR0FBUzJHLEdBQWdCQSxFQUFZeFUsSUFBSTBQLE1BRWpELENBQ0VqTCxJQUFLLGVBQ0x3SyxLQUFNcEIsR0FBUzRHLEdBQWlCQSxFQUFhelUsSUFBSTBQLE1BRXRDLENBQUVqTCxJQUFLLGFBQ3BCLENBQUVBLElBQUssZUFDUCxDQUFFQSxJQUFLLFFBQ1AsQ0FBRUEsSUFBSyxXQUNQLENBQUVBLElBQUssVUFBV3dLLEtBQU1tRixJQUN4QixDQUFFM1AsSUFBSyxRQUNQLENBQUVBLElBQUssVUFDUCxDQUFFQSxJQUFLLFlBQ1AsQ0FBRUEsSUFBSyxZQUNQLENBQUVBLElBQUssU0FDUCxDQUFFQSxJQUFLLFVBQ1AsQ0FBRUEsSUFBSyxVQUNQLENBQUVBLElBQUssZUFDUCxDQUFFQSxJQUFLLFdBQ1AsQ0FBRUEsSUFBSyxnQkFDUCxDQUFFQSxJQUFLLFNBQ1AsQ0FBRUEsSUFBSyxpQkFDUCxDQUFFQSxJQUFLLFdBQ1AsQ0FBRUEsSUFBSyxTQUNQLENBQUVBLElBQUssV0FDUCxDQUFFQSxJQUFLLGdCQUNQLENBQUVBLElBQUssVUFDUCxDQUFFQSxJQUFLLE1BQU93SyxLQUFNTyxJQUNwQixDQUFFL0ssSUFBSyxPQUNQLENBQUVBLElBQUssY0FBZXdLLEtBQU1VLElBQzVCLENBQUVsTCxJQUFLLFFBQVN3SyxLQUFNZixJQUN0QixDQUFFekosSUFBSyxhQUFjd0ssS0FBTThDLElBRTNCLENBQ0V0TixJQUFLLFNBQ0x3SyxLQUFNSCxHQUFhLENBQ2pCLGNBQ0EsY0FDQSxjQUNBLGVBQ0EsVUFHSixDQUFFckssSUFBSyxVQUFXd0ssS0FBTXdFLElBQ3hCLENBQUVoUCxJQUFLLGdCQUFpQndLLEtBQU13RSxJQUNqQixDQUFFaFAsSUFBSyxRQUNQLENBQUVBLElBQUssY0FBZXdLLEtBQU1PLElBQzVCLENBQUUvSyxJQUFLLG1CQUFvQndLLEtBQU1mLElBQzlDLENBQUV6SixJQUFLLFFBQVN3SyxLQUFNVyxHQUFhLFFBQVNFLEtBQzVDLENBQUVyTCxJQUFLLG1CQUFvQndLLEtBQU1hLElBQ2pDLENBQUVyTCxJQUFLLGNBQ1AsQ0FBRUEsSUFBSyxhQUFjd0ssS0FBTU8sSUFDM0IsQ0FBRS9LLElBQUssZUFDUCxDQUFFQSxJQUFLLGVBQ1AsQ0FBRUEsSUFBSyxTQUFVd0ssS0FBTU8sSUFDdkIsQ0FBRS9LLElBQUssZ0JBQWlCd0ssS0FBTU8sSUFDOUIsQ0FBRS9LLElBQUssYUFBY3dLLEtBQU1PLElBQzNCLENBQUUvSyxJQUFLLFFBQVN3SyxLQUFNTyxJQUN0QixDQUFFL0ssSUFBSyxnQkFDUCxDQUFFQSxJQUFLLEtBQU13SyxLQUFNTyxJQUNuQixDQUFFL0ssSUFBSyxXQUFZd0ssS0FBTW9ELElBQ3pCLENBQUU1TixJQUFLLGVBQWdCd0ssS0FBTStDLElBQzdCLENBQUV2TixJQUFLLGdCQUNQLENBQUVBLElBQUssaUJBQWtCd0ssS0FBTU8sSUFDL0IsQ0FBRS9LLElBQUssMkJBQTRCd0ssS0FBTU8sSUFDekMsQ0FBRS9LLElBQUsscUJBQXNCd0ssS0FBTU8sSUFDbkMsQ0FBRS9LLElBQUssVUFBV3dLLEtBQU1PLElBQ3hCLENBQUUvSyxJQUFLLGVBQWdCd0ssS0FBTU8sSUFDN0IsQ0FBRS9LLElBQUssYUFDUCxDQUFFQSxJQUFLLE1BQU93SyxLQUFNTyxJQUNwQixDQUFFL0ssSUFBSyxPQUFRd0ssS0FBTU8sSUFDckIsQ0FBRS9LLElBQUssYUFBY3dLLEtBQU1PLElBQzNCLENBQUUvSyxJQUFLLGFBQWN3SyxLQUFNTyxJQUMzQixDQUFFL0ssSUFBSyxRQUFTd0ssS0FBTU8sSUFDdEIsQ0FBRS9LLElBQUssTUFBT3dLLEtBQU1PLElBQ3BCLENBQUUvSyxJQUFLLEtBQU13SyxLQUFNTyxJQUNuQixDQUFFL0ssSUFBSyxNQUFPd0ssS0FBTU8sSUFDcEIsQ0FBRS9LLElBQUssUUFBU3dLLEtBQU1ILFFBQWFuSixHQUFXLElBQzlDLENBQUVsQixJQUFLLGNBQWV3SyxLQUFNTyxJQUM1QixDQUFFL0ssSUFBSyxZQUFhd0ssS0FBTTZDLElBQzFCLENBQUVyTixJQUFLLGVBQWdCd0ssS0FBTTZDLElBQzdCLENBQUVyTixJQUFLLGtCQUFtQndLLEtBQU02QyxJQUNoQyxDQUFFck4sSUFBSyxtQkFBb0J3SyxLQUFNSCxHQXhhVCxDQUFDMkIsRUFBR0MsS0FDNUIsTUFBTWdFLEVBQWV4RCxHQUFlVCxHQUM5QmtFLEVBQWV6RCxHQUFlUixHQUVwQyxPQUFJZ0UsRUFBZUMsR0FBcUIsRUFDcENELEVBQWVDLEVBQXFCLEVBQ2pDLElBa2EwRCxJQUNqRSxDQUFFbFEsSUFBSyxtQkFBb0J3SyxLQUFNNkMsSUFFakMsQ0FBRXJOLElBQUssdUJBQXdCd0ssS0FBTUgsUUFBYW5KLEdBQVcsSUFDN0QsQ0FBRWxCLElBQUssdUJBQXdCd0ssS0FBTTZDLElBQ3JDLENBQUVyTixJQUFLLHNCQUF1QndLLEtBQU1WLElBQ3BDLENBQUU5SixJQUFLLHFCQUFzQndLLEtBQU1WLElBQ3RCLENBQUU5SixJQUFLLGdCQUFpQndLLEtBQU1WLElBQzlCLENBQUU5SixJQUFLLHdCQUF5QndLLEtBQU1WLElBQ25ELENBQUU5SixJQUFLLFFBQ1AsQ0FBRUEsSUFBSyxrQkFDUCxDQUFFQSxJQUFLLFVBQVd3SyxLQUFNTyxJQUN4QixDQUFFL0ssSUFBSyxlQUFnQndLLEtBQU1PLElBQzdCLENBQUUvSyxJQUFLLGFBQWN3SyxLQUFNc0QsSUFDM0IsQ0FBRTlOLElBQUssUUFBU3dLLEtBQU1xRCxJQUN0QixDQUFFN04sSUFBSyxnQkFDUCxDQUFFQSxJQUFLLE1BQ1AsQ0FBRUEsSUFBSyxPQUNQLENBQUVBLElBQUssZUFBZ0J3SyxLQUFNTyxJQUM3QixDQUFFL0ssSUFBSyxnQkFBaUJ3SyxLQUFNTyxJQUNqQixDQUFFL0ssSUFBSyxRQUNQLENBQ1hBLElBQUssU0FDTHdLLEtBQU1wQixHQUFTK0csR0FBVUEsRUFBTTVVLElBQUlvUyxNQUV4QixDQUFFM04sSUFBSyxnQkFBaUJ3SyxLQUFNTyxJQUM5QixDQUFFL0ssSUFBSyxXQUNQLENBQUVBLElBQUssWUFDcEIsQ0FBRUEsSUFBSyxPQUFRd0ssS0FBTXVELEtBR2pCcUMsR0FBbUJOLEdBQU92VSxJQUFJLEVBQUd5RSxTQUFVQSxHQUMzQ3FRLEdBQWF0SCxHQUNqQitHLEdBQ0d2VSxJQUFJLEVBQUd5RSxNQUFLd0ssVUFBWUEsRUFBT1csR0FBYW5MLEVBQUt3SyxRQUFRdEosR0FDekRnQixPQUFPb08sVUFzQlosU0FBU0MsR0FBZ0JDLEVBQVNoWCxFQUFVLElBQzFDLE9BcEJGLFNBQXdCaVgsRUFBTWpHLEdBQzVCLEdBQW9CLGlCQUFUaUcsRUFBbUIsQ0FDNUIsTUFBTXJOLE9BQUVBLEVBQU1pRixLQUFFQSxHQUFTVCxFQUFhNkksR0FDaENDLEVBQW1DLE9BQW5CRCxFQUFLeFMsT0FBTSxHQUFlLEtBQU8sR0FDakQ0SyxFQUFVQyxFQUFjMkgsR0FDOUJBLEVBQU9FLEtBQUtDLE1BQU1ILEdBRWxCLElBQUl6SSxFQUNGMkksS0FBS0UsVUFBVXJHLEVBQUtpRyxHQUFPLEtBQWUsUUFBVHBJLEVBQWlCLEtBQU9qRixHQUN6RHNOLEVBSUYsTUFIZ0IsU0FBWjdILElBQ0ZiLEVBQVNBLEVBQU9xSCxRQUFRLE1BQU94RyxJQUUxQmIsQ0FDVCxDQUVBLE9BQU93QyxFQUFLaUcsRUFDZCxDQUdTSyxDQUNMTixFQUNBekcsR0FBVTBHLElBQ1IsSUFBSU0sRUFBWXZYLEVBQVF1WCxXQUFhWCxHQUVyQyxHQUFJL0csTUFBTUMsUUFBUXlILEdBQVksQ0FDNUIsTUFBTWhSLEVBQU9ELE9BQU9DLEtBQUswUSxJQUNuQk8sWUFBRUEsRUFBYyxHQUFFQyxXQUFFQSxFQUFhLElBQU90RyxHQUM1QzVLLEVBQ0NDLEdBQW9CLE1BQVhBLEVBQUksR0FBYSxjQUFnQixjQUU3QytRLEVBQVksSUFDUEEsS0FDQVgsTUFDQWEsRUFBV3pLLFVBQ1h3SyxFQUFZeEssT0FFbkIsQ0FFQSxPQUFPNkosR0FBVzNGLEVBQWUrRixFQUFNTSxHQUFZTixLQUd6RCxDRTlsQk81WCxlQUFlcVksR0FBc0NDLEdBQzFELE9BQU94WCxFQUFPQywwQkFBMEIsd0NBQXlDZixnQkFDekVHLFFBQVFvWSxJQUNaRCxFQUFnQjVWLElBQUkxQyxVQUNsQixNQUFNd1ksRUFBa0J4VyxFQUFLd0QsS0FBS2lULEVBQWdCLGdCQUNsRCxJQUFLL1csRUFBR3FCLFdBQVd5VixHQUFrQixPQUVyQyxNQUFNRSxFQUFpQjFXLEVBQUt3RCxLQUFLaVQsRUFBZ0IsUUFDakQsSUFBSyxNQUFNRSxJQUFrQixDQUFDLFlBQWEsU0FBVSxDQUNuRCxNQUFNQyxFQUFpQjVXLEVBQUt3RCxLQUFLaVQsRUFBZ0JFLEdBQ2pELFVBQ1FFLEdBQWtCRCxFQUFnQkYsR0FDeEMsTUFBTTdNLEVBQWNpTSxLQUFLQyxZQUFZclcsRUFBR0MsU0FBU0MsU0FBUzRXLEVBQWlCLFNBRzNFLElBQUlNLEdBQWtCLEVBQ3RCLE1BQU0xQyxFQUFVdkssRUFBWXVLLFNBQVcsQ0FBQSxFQUN2QyxJQUFLLE1BQU8yQyxFQUFZckQsS0FBV3pPLE9BQU9zQyxRQUFRNk0sR0FBVSxDQUMxRCxNQUFNNEMsRUFBWXRELEVBQU9uSixXQUFXb00sRUFBZ0IsUUFDaERqRCxJQUFXc0QsSUFDYjVDLEVBQVEyQyxHQUFjQyxFQUN0QkYsR0FBa0IsRUFFdEIsQ0FFQSxHQURBak4sRUFBWXVLLFFBQVVBLEdBQ2pCMEMsRUFBaUIsYUFFaEJ2WCxFQUFPTSxhQUFhMlcsRUFBaUJWLEtBQUtFLFVBQVVOLEdBQWdCN0wsUUFBY3hELEVBQVcsR0FDckcsQ0FBRSxNQUNBLENBRUosTUFJUixDQUVBckksZUFBZTZZLEdBQWtCRCxFQUF3QkYsR0FDdkQsSUFBS2hYLEVBQUdxQixXQUFXMlYsR0FFakIsa0JBRE1oWCxFQUFHQyxTQUFTc1gsT0FBT0wsRUFBZ0JGLEdBSTNDLE1BQU1RLFFBQWdCeFgsRUFBR0MsU0FBU3dYLFFBQVFQLEVBQWdCLENBQUVRLGVBQWUsVUFDckVqWixRQUFRb1ksSUFDWlcsRUFBUXhXLElBQUkxQyxVQUNWLE1BQU1xWixFQUFVclgsRUFBS3dELEtBQUtvVCxFQUFnQlUsRUFBT3RZLE1BQzNDdVksRUFBVXZYLEVBQUt3RCxLQUFLa1QsRUFBZ0JZLEVBQU90WSxNQUMzQ3dZLEVBQWM5WCxFQUFHcUIsV0FBV3dXLFNBQWlCN1gsRUFBR0MsU0FBUzhYLEtBQUtGLFFBQVdsUixFQUMzRWlSLEVBQU9JLGVBQWlCRixHQUFhRSxvQkFDakNiLEdBQWtCUSxFQUFTRSxTQUc3QjdYLEVBQUdDLFNBQVNzWCxPQUFPSSxFQUFTRSxZQUdoQzdYLEVBQUdDLFNBQVNnWSxHQUFHZixFQUFnQixDQUFFMVcsV0FBVyxHQUNwRCxDQ3hET2xDLGVBQWU0WixHQUNwQm5YLEVBQ0FvWCxHQUVBLE9BQU8vWSxFQUFPQywwQkFBMEIscUJBQXNCZixVQUM1RCxNQUFNOFosRUFBaUI5WCxFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsVUFDOUNtWCxFQUNKdFgsRUFBT3VYLFFBQVV2WCxFQUFPd1gsZ0NBQTZCNVIsRUFBWXJHLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxNQUFPLFNBRWpHc1csUUFBZ0IxWSxFQUFrQixJQUFNa0IsRUFBR3lYLFFBQVFXLEVBQWdCLENBQUVWLGVBQWUsS0FDMUYsR0FBS0YsRUFFTCxJQUFLLE1BQU1JLEtBQVVKLEVBQVMsQ0FDNUIsTUFBTWdCLEVBQVVaLEVBQU90WSxLQUFLb0UsTUFBTSxHQUFHLEdBQy9CK1UsRUFBOEJiLEVBQU90WSxLQUFLb1osU0FBUyxTQUN6RCxJQUFJQyxFQUFjRixFQUE4QkQsRUFBVVosRUFBT3RZLEtBQzdEcVosRUFBWWhWLFNBQVMsUUFDdkJnVixFQUFjLElBQUlBLEVBQVk3RCxRQUFRLEtBQU0sUUFFOUMsTUFBTThELEVBQWFULEVBQXlCL1AsS0FDekNySCxHQUNDQSxFQUFPb0osYUFBYUQsZUFBZXlPLElBQWdCNVgsRUFBT29KLGFBQWFDLGtCQUFrQnVPLElBR3pGZixFQUFPaUIsVUFBWUosRUFDakJHLFNBRUk1WSxFQUFHSyxNQUFNQyxFQUFLd0QsS0FBS3NVLEVBQWdCSSxHQUFVLENBQUVoWSxXQUFXLFVBQzFESSxFQUFZbUQsSUFBSSxJQUNwQi9ELEVBQUd1WCxPQUFPalgsRUFBS3dELEtBQUtzVSxFQUFnQlIsRUFBT3RZLE1BQU9nQixFQUFLd0QsS0FBS3NVLEVBQWdCSSxFQUFTLGlCQUU5RUgsVUFFSHJZLEVBQUdLLE1BQU1nWSxFQUFnQixDQUFFN1gsV0FBVyxVQUN0Q0ksRUFBWW1ELElBQUksSUFDcEIvRCxFQUFHdVgsT0FBT2pYLEVBQUt3RCxLQUFLc1UsRUFBZ0JSLEVBQU90WSxNQUFPZ0IsRUFBS3dELEtBQUt1VSxFQUFnQlQsRUFBT3RZLFNBRzlFc1ksRUFBT0ksZUFBaUJLLElBQW1CTyxVQUU5QzVZLEVBQUdLLE1BQU1nWSxFQUFnQixDQUFFN1gsV0FBVyxVQUN0Q0ksRUFBWW1ELElBQUksSUFDcEJqRixFQUFrQixJQUNoQmtCLEVBQUd1WCxPQUNEalgsRUFBS3dELEtBQUtzVSxFQUFnQlIsRUFBT3RZLEtBQU0sY0FDdkNnQixFQUFLd0QsS0FBS3VVLEVBQWdCLEdBQUdULEVBQU90WSxnQkFLOUMsR0FFSixDQzNETyxTQUFTd1osR0FBa0JDLEVBQXVCQyxHQUN2RCxPQUFPQSxDQUNULENBRU8sU0FBU0MsR0FBYUMsRUFBbUIxWCxFQUFtQnZDLEdBQ2pFLE1BQU1rYSxFQUFjLElBQUlELEdBRXhCLElBQUssTUFBT3ZULEVBQU9tRCxLQUFTdEgsRUFBT3FHLGVBQ05sQixJQUF2QndTLEVBQVl4VCxHQUNkd1QsRUFBWXhULEdBQVN5VCxHQUE4QnRRLEVBQU03SixHQUNoRG9hLEdBQWtCSCxFQUFPdlQsR0FBUTFHLElBQVlvYSxHQUFrQnZRLEVBQU03SixHQUM5RWthLEVBQVl4VCxHQUFTMlQsRUFBTUosRUFBT3ZULEdBQVFtRCxFQUFNN0osR0FDdENpYSxFQUFPdlYsU0FBU21GLElBQzFCcVEsRUFBWWhXLEtBQUsyRixHQUdyQixPQUFPcVEsQ0FDVCxDQUVBLFNBQVNDLEdBQThCblYsRUFBZ0JoRixHQUNyRCxPQUFPb2EsR0FBa0JwVixFQUFPaEYsR0FBV0EsRUFBUW1hLDhCQUE4Qm5WLEVBQU9oRixHQUFXZ0YsQ0FDckcsQ0FFQSxTQUFTb1YsR0FBa0JwVixFQUFnQmhGLEdBQ3pDLFFBQVNnRixHQUEwQixpQkFBVkEsR0FBc0JoRixFQUFRb2Esa0JBQWtCcFYsRUFDM0UsQ0NoQk8sU0FBU3NWLEdBQTRDQyxHQUMxRCxNQUFNQyxFQUFlbFUsT0FBT3NDLFFBQVEyUixHQUFLbEssU0FBUyxFQUFFb0ssSUFBUUMsS0FBVUQsRUFBSzNILGNBQWM0SCxJQUN6RixJQUFLLE1BQU9sVSxFQUFLeEIsS0FBVXdWLFNBR2xCRCxFQUFJL1QsR0FDVitULEVBQWdDL1QsR0FBT3hCLEVBR3BDQSxHQUEwQixpQkFBVkEsSUFBdUI2SyxNQUFNQyxRQUFROUssSUFDdkRzVixHQUFTdFYsR0FHYixPQUFPdVYsQ0FDVCxDQ2lEQSxNQUFNSSxHQUFzQyxDQUMxQ3RhLEtBQU0sYUFDTnVhLEdBQUksQ0FDRkMsYUFBYyxLQUNkM1csS0FBTSxDQUNKNFcsU0FBVSxDQUFDLFVBR2ZDLFlBQWEsQ0FDWEMsU0FBVSxRQUVaQyxZQUFhLENBQ1hDLE1BQU8saUNBQ1Asc0JBQXNCLEdBRXhCQyxLQUFNLENBQ0pDLFFBQVMsQ0FBRSxVQUFXLG1CQUlwQkMsR0FBdUMsQ0FDM0NoYixLQUFNLHlCQUNOdWEsR0FBSSxDQUNGQyxhQUFjLE1BRWhCSSxZQUFhLENBQ1hDLE1BQU8sMkNBQ1Asc0JBQXNCLEdBRXhCQyxLQUFNLENBQ0pDLFFBQVMsQ0FDUEUsS0FBTSx1RUFLTkMsR0FBWSxDQUNoQnJVLEtBQU0sQ0FDSjdHLEtBQU0sT0FDTnVhLEdBQUksQ0FDRkMsYUFBYyxLQUNkM1csS0FBTSxDQUNKNFcsU0FBVSxDQUFDLE9BQVEsVUFJdkJHLFlBQWEsQ0FDWEMsTUFBTywyQ0FDUCxzQkFBc0IsR0FFeEJILFlBQWEsQ0FFWEMsU0FBVSxTQUVaRyxLQUFNLENBQ0pqVSxLQUFNLENBQ0pvVSxLQUFNLG9FQUlaRSxRQUFTLENBQ1BuYixLQUFNLFVBQ051YSxHQUFJLENBQ0YxVyxLQUFNLENBQ0o0VyxTQUFVLEtBR2RHLFlBQWEsQ0FDWEMsTUFBTyx5QkFDUCxzQkFBc0IsR0FFeEJILFlBQWEsQ0FFWCxXQUFZLFFBRVpDLFNBQVUsU0FFWkcsS0FBTSxDQUNKSyxRQUFTLENBQ1BGLEtBQU0sdUVBSVosY0FBZSxDQUNiamIsS0FBTSxnQkFDTnVhLEdBQUksQ0FDRmEsb0JBQXFCLENBQ25CQyxNQUFPLENBQUMsU0FBVSxTQUFVLGlCQUdoQ1AsS0FBTSxDQUNKLGNBQWUsQ0FDYkcsS0FBTSwyRUFJWkssS0FBTSxDQUNKdGIsS0FBTSxPQUNOdWEsR0FBSSxDQUFBLEVBQ0pHLFlBQWEsQ0FFWEMsU0FBVSxTQUVaRyxLQUFNLENBQ0pRLEtBQU0sQ0FBRUwsS0FBTSxvRUFHbEIsZ0JBQWlCLENBQ2ZqYixLQUFNLG9CQUNOdWEsR0FBSSxDQUNGQyxhQUFjLENBQ1phLE1BQU8sQ0FBQyxZQUdaUCxLQUFNLENBQ0osZ0JBQWlCLENBQ2ZHLEtBQU0sOEVBUVBqYyxlQUFldWMsR0FBa0JDLEdBQ3RDLE9BQU8xYixFQUFPQywwQkFBMEIsbUJBQW9CZixVQUMxRCxHQUFJeWMsR0FBd0JELEVBQVdFLFlBRXJDLE9BR0YsTUFBTUMsRUFBZ0IzYSxFQUFLNUIsUUFBUW9jLEVBQVc1WixRQUFTLFVBQVcsbUJBQzVEbEIsRUFBR0MsU0FBU0ksTUFBTTRhLEVBQWUsQ0FBRXphLFdBQVcsSUFHcEQsTUFBTTBhLEVBQWtCNWEsRUFBSzVCLFFBQVFvYyxFQUFXNVosUUFBUyxVQUFXLHNCQUM5RE4sRUFBWW1ELElBQUksSUFBTS9ELEVBQUdDLFNBQVNnWSxHQUFHaUQsRUFBaUIsQ0FBRUMsT0FBTyxFQUFNM2EsV0FBVyxLQUV0RixNQUFNcUgsUUFBZ0I3SCxFQUFHQyxTQUFTd1gsUUFBUXdELEVBQWUsQ0FBRXZELGVBQWUsSUFDMUUsSUFBSyxNQUFNdkssS0FBU3RGLEVBQ2JzRixFQUFNMEwsVUFBYXVDLEdBQWdDak8sRUFBTTdOLGFBQ3hEc0IsRUFBWW1ELElBQUksSUFBTS9ELEVBQUdDLFNBQVNnWSxHQUFHM1gsRUFBS3dELEtBQUttWCxFQUFlOU4sRUFBTTdOLE1BQU8sQ0FBRTZiLE9BQU8sS0FFNUYsTUFBTUUsRUFBYyxJQUFJdFksSUFBSSxDQUMxQixXQUNBLGNBQ0Esa0JBQ0EsdUJBQ0c4RSxFQUNBRixPQUNFaVEsR0FBV0EsRUFBT2lCLFVBQVlqQixFQUFPdFksS0FBS29aLFNBQVMsVUFBWTBDLEdBQWdDeEQsRUFBT3RZLE9BRXhHMEIsSUFBSzRXLEdBQVdBLEVBQU90WSxRQUV4QndiLEVBQVc5USxVQUFVc1IsaUJBQ3ZCRCxFQUFZM1IsSUFBSSxlQUdsQixJQUFLLE1BQU16RCxLQUFZb1YsRUFBYSxDQUVsQyxNQUFNL1ksRUFBT2hDLEVBQUtpYixTQUFTdFYsRUFBVSxjQUMvQnJGLEVBQVltRCxJQUFJLElBQU15WCxHQUFrQlYsRUFBWUcsRUFBZTNZLEdBQzNFLEdBRUosQ0FFTyxTQUFTeVksR0FBd0JDLEdBQ3RDLE9BQU9BLEdBQVl0QyxTQUFTLHlCQUEwQixDQUN4RCxDQUVBLFNBQVMwQyxHQUFnQ25WLEdBQ3ZDLE1BQU8sMkJBQTJCRSxLQUFLRixFQUN6QyxDQUVBM0gsZUFBZWtkLEdBQWtCemEsRUFBdUJrYSxFQUF1QjNZLEdBQzdFLE1BQU12QyxFQUFXTyxFQUFLd0QsS0FBS21YLEVBQWUsR0FBRzNZLFNBQ3ZDbVosRUFBaUN6YixFQUFHcUIsV0FBV2YsRUFBS3dELEtBQUttWCxFQUFlLDBCQUU5RSxHQUFhLFlBQVQzWSxFQUVGLGtCQURNb1osR0E0S1YsU0FBaUMzYSxHQUMvQixJQUFLQSxFQUFPNGEsYUFDVixPQUFPQyxnQkFBZ0J0QixJQUd6QixNQUFNL0gsRUFBaUJ4UixFQUFPOGEsTUFBUSxNQUFRLE9BQ3hDQyxFQUFnQixDQUNwQixDQUFFdkIsS0FBTSx1QkFDUixDQUFFQSxLQUFNLHdCQUF5QndCLEtBQU0sQ0FBRSxnQkFBZ0IsRUFBTSxlQUFnQixhQUMzRWhiLEVBQU84YSxNQUFRLENBQUMsQ0FBRXRCLEtBQU0sdUJBQXdCd0IsS0FBTSxDQUFFLGNBQWUsWUFBZ0IsR0FDM0YsQ0FBRWhZLElBQUssR0FBR3dPLGFBQ1YsQ0FBRXhPLElBQUssR0FBR3dPLGtCQUVSeFIsRUFBT29KLGFBQWF1SyxTQUFTc0gsT0FDL0JGLEVBQU0zWSxLQUFLLENBQUVZLElBQUssR0FBR3dPLGdCQUV2QnVKLEVBQU0zWSxLQUFLLENBQUVvWCxLQUFNLHlCQUVuQixNQUFNMEIsRUFBa0JMLGdCQUFnQmhDLElBQ2xDc0MsRUFBYUQsRUFBZ0I3QixLQUFLQyxTQUFXLENBQUUsVUFBVyxpQkFFaEUsT0FEQTRCLEVBQWdCN0IsS0FBS0MsUUFBVSxJQUFLNkIsRUFBWUosU0FDekNHLENBQ1QsQ0FsTW9CRSxDQUF3QnBiLEdBQVNoQixHQUluRCxJQUFJcWMsRUFBY1IsZ0JBQWdCdFosS0FBUWtZLEdBQVlBLEdBQVVsWSxHQUFrQyxJQUVsRyxJQUNFLE1BQU1oQixRQUFtQnRCLEVBQUdDLFNBQVNDLFNBQVNILEVBQVUsUUFDbERzYyxFQUFjQyxFQUFLQyxLQUFLamIsR0FDOUI4YSxFQUFjOUMsRUFBTXpDLElBQUksQ0FBQ3VGLEVBQWFDLEVBQWFELEdBQWMsQ0FBRUksV0FBWXZELElBQ2pGLENBQUUsTUFDQSxDQUlGLEtBQU0sU0FBVW1ELEdBQWMsT0FFMUI5WixFQUFLOFAsV0FBVyxZQUNsQmdLLEVBQWMsSUFDVEEsRUFDSGxDLFlBQWEsQ0FDWEMsTUFBTyx5QkFDUCxzQkFBc0IsSURuUnZCLFNBQ0xYLEVBQ0EvVCxHQUVBLE1BQU14QixFQUFRdVYsRUFBSS9ULFVBRVgrVCxFQUFJL1QsR0FDVitULEVBQThCL1QsR0FBT3hCLENBRXhDLENDOFFJd1ksQ0FBYUwsRUFBYSxRQUN0QkEsRUFBWXZDLElBQUkxVyxPQUNsQmlaLEVBQVl2QyxHQUFHMVcsS0FBSyxnQkFBa0IsSUFDakMsSUFBSUosSUFBSSxDQUFDLFFBQVMsZ0JBQWtCcVosRUFBWXZDLEdBQUcxVyxLQUFLLGlCQUFtQixRQUt2RSxZQUFUYixHQUFzQjhaLEVBQVloQyxLQUFLSyxTQUFXZ0IsSUFDcERXLEVBQVlwQyxjQUFnQixDQUFBLEVBQzVCb0MsRUFBWXBDLFlBQVkwQyxRQUFVLFFBQ2xDTixFQUFZaEMsS0FBS0ssUUFBUXNCLE9BQVMsQ0FBQSxFQUNsQ0ssRUFBWWhDLEtBQUtLLFFBQVFzQixLQUFLWSx3QkFBMEIseUJBRzFELElBQUlDLEdBQXFCLEVBQ3pCLElBQUssTUFBTUMsS0FBT3RYLE9BQU93TyxPQUFPcUksRUFBWWhDLE1BRXJDeUMsRUFBSXRDLE1BQU01VyxTQUFTLDBCQUV4Qm1aLEdBQWEvYixFQUFROGIsRUFBS3ZhLEdBQzFCc2EsR0FBcUIsR0FFdkIsR0FBS0EsRUFBTCxDQUVBLE9BQVF0YSxHQUNOLElBQUssVUFDSCxHQUFJOFosRUFBWXZDLElBQUlrRCxnQkFDWFgsRUFBWXZDLEdBQUcxVyxTQUNqQixNQUFJaVosRUFBWXZDLElBQUkxVyxNQUFRcEMsRUFBTzBaLFFBQVFWLFNBQVMzVyxPQUFTLEdBS2xFLGtCQURNcEQsRUFBR0MsU0FBU2dZLEdBQUczWCxFQUFLd0QsS0FBS21YLEVBQWUsZUFBZ0IsQ0FBRUUsT0FBTyxJQUh2RWlCLEVBQVl2QyxHQUFHMVcsS0FBSzRXLFNBQVdoWixFQUFPMFosUUFBUVYsUUFLaEQsQ0FDSWhaLEVBQU80YSxjQUNUUyxFQUFZcEMsY0FBZ0IsQ0FBQSxFQUM1Qm9DLEVBQVlwQyxZQUFZLFlBQWMsZ0JBRS9Cb0MsRUFBWXBDLGNBQWMsWUFFbkMsTUFFRixJQUFLLE9BRUNvQyxFQUFZdkMsSUFBSUMscUJBQ1hzQyxFQUFZdkMsR0FBR0MsYUFBYSxnQkFFakNzQyxFQUFZdkMsSUFBSTFXLGNBQ1hpWixFQUFZdkMsR0FBRzFXLEtBQUssZ0JBQzNCaVosRUFBWXZDLEdBQUcxVyxLQUFLNFcsU0FBV3FDLEVBQVl2QyxHQUFHMVcsS0FBSzRXLFNBQVNwUyxPQUFRcVYsR0FBc0IsZ0JBQVhBLElBUXJGLFNBRk10QixHQUFVVSxFQUFhcmMsR0FFaEIsU0FBVHVDLEVBQWlCLENBRW5CLFNBRE10QyxFQUFHQyxTQUFTZ1ksR0FBRzNYLEVBQUt3RCxLQUFLbVgsRUFBZSxpQkFBa0IsQ0FBRUUsT0FBTyxLQUNwRWlCLEVBQVloQyxLQUFLUSxNQUFNbUIsS0FBTSxPQUdsQ0ssRUFBWWhDLEtBQUssY0FBZ0JnQyxFQUFZaEMsS0FBS1EsS0FDbEQsTUFBTXhQLEVBQVNnUixFQUFZaEMsS0FBS1EsS0FBS21CLEtBQUtrQix5QkFDMUMsR0FBc0IsaUJBQVg3UixFQUFxQixPQUVoQ2dSLEVBQVloQyxLQUFLUSxLQUFLbUIsS0FBS2tCLHlCQUEyQixXQUFXN1IsSUFDakVnUixFQUFZOWMsS0FBTyxnQkFDbkI4YyxFQUFZdkMsR0FBSyxDQUFFcUQsa0JBQW1CLGFBQy9CZCxFQUFZaEMsS0FBS1EsV0FDbEJjLEdBQVVVLEVBQWE5YixFQUFLd0QsS0FBS21YLEVBQWUsa0JBQ3hELENBbER5QixDQW1EM0IsQ0FFQSxTQUFTNkIsR0FBYS9iLEVBQXVCOGIsRUFBVXZhLEdBcUJyRCxHQXBCQXVhLEVBQUlkLE9BQVMsQ0FBQSxFQUNiYyxFQUFJTSxVQUFZLENBQUEsU0FFVE4sRUFBSU0sUUFBUUMsVUFFTixTQUFUOWEsR0FBNEIsWUFBVEEsSUFDckJ1YSxFQUFJTSxRQUFRRSxTQUFXLCtCQUdyQlIsRUFBSU0sUUFBUUcsaUJBQ2RULEVBQUlNLFFBQVFJLDZCQUErQixxREFDcENWLEVBQUlNLFFBQVFHLGlCQUdsQlQsRUFBSU0sUUFBUUssc0JBQWlDLFlBQVRsYixHQUFzQkEsRUFBSzhQLFdBQVcsWUFDMUV5SyxFQUFJZCxLQUFLMEIsWUFBY25iLEVBQUs4UCxXQUFXLGFBRXhDeUssRUFBSU0sUUFBUUssb0JBQXNCLGtEQUd2QixTQUFUbGIsRUFBaUIsQ0FDbkIsTUFBTThJLEVBQVN5UixFQUFJZCxLQUFLa0IseUJBQ0YsaUJBQVg3UixJQUNUeVIsRUFBSWQsS0FBS2tCLHlCQUEyQjdSLEVBQU8wSixRQUFRLFFBQVMsSUFFaEUsQ0FrQ0EsR0FoQ0kvVCxFQUFPaWEsWUFBWTVJLFdBQVcsdUJBQ2hDeUssRUFBSXRDLEtBQU9zQyxFQUFJdEMsTUFBTXpGLFFBQVEsa0JBQW1CLGdCQUN2Qy9ULEVBQU9pYSxZQUFZNUksV0FBVyw0QkFDdkN5SyxFQUFJdEMsS0FBT3NDLEVBQUl0QyxNQUFNekYsUUFBUSxlQUFnQixvQkFJakIsU0FBMUIrSCxFQUFJZCxLQUFLMkIscUJBQ0piLEVBQUlkLEtBQUsyQixhQUlkcGIsRUFBSzhQLFdBQVcsV0FBYXlLLEVBQUlNLFFBQVFRLGVBQW9ELGlCQUE1QmQsRUFBSWQsS0FBSzZCLGlCQUM1RWYsRUFBSWQsS0FBSzZCLGVBQWlCZixFQUFJZCxLQUFLNkIsZUFBZTlJLFFBQVEsWUFBYSxLQUVyRS9ULEVBQU84Yyx3QkFBMEJoQixFQUFJZCxLQUFLK0IsVUFBWXhiLEVBQUs4UCxXQUFXLFVBQ3hFeUssRUFBSWQsS0FBSytCLFNBQVcsU0FHVCxZQUFUeGIsR0FBK0IsU0FBVEEsR0FBbUJBLEVBQUs4UCxXQUFXLFVBQ3ZEclIsRUFBTzRhLGVBQ1RrQixFQUFJZCxLQUFLZ0Msc0JBQXVCLFVBRzNCbEIsRUFBSWQsS0FBS2dDLHFCQUdkeFksT0FBT0MsS0FBS3FYLEVBQUlkLE1BQU0zWSxPQUFTLEVBQ2pDbVcsR0FBU3NELEVBQUlkLGFBRU5jLEVBQUlkLEtBRVR4VyxPQUFPQyxLQUFLcVgsRUFBSU0sU0FBUy9aLE9BQVMsRUFBRyxDQUV2QyxNQUFNNGEsRUFBYXpFLEdBQVNzRCxFQUFJTSxnQkFDekJOLEVBQUlNLFFBQ1hOLEVBQUlNLFFBQVVhLENBQ2hCLGFBQ1NuQixFQUFJTSxPQUVmLENBMEJBN2UsZUFBZW9kLEdBQVVVLEVBQXVCcmMsR0FDOUMsTUFBTWtlLEVBQ0ozQixFQUFLNEIsS0FBSzlCLEVBQWEsQ0FBRStCLFdBQVcsRUFBSUMsY0FBYyxFQUFNQyxPQUFRLENBQUUsU0FBVSxXQU90RXhULFdBQVcsWUFBYSxVQUw5QjdLLEVBQUdDLFNBQVNVLFVBQVVaLEVBQVVrZSxFQUN4QyxDQzFiTzNmLGVBQWVnZ0IsR0FBU0MsR0FDN0IsT0FBT25mLEVBQU9DLDBCQUEwQixXQUFZZixVQUNsRCxHQUFJeWMsR0FBd0J3RCxFQUFjdkQsWUFBYSxPQUV2RCxNQUFNOVosRUFBVXFkLEVBQWNyZCxRQUN4QnNkLFFBQWlCalUsRUFBR0MsS0FBSyxVQUFXLENBQUVDLEtBQUssRUFBTUMsSUFBS3hKLEVBQVN5SixPQUFRZCxJQUN6RTVLLEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssU0FBUytlLEVBQVNwYiw0QkFBNEJsQyxLQUU3RCxJQUFLLE1BQU11ZCxLQUFVRCxFQUFVLENBQzdCLE1BQU16ZSxFQUFXTyxFQUFLd0QsS0FBSzVDLEVBQVN1ZCxHQUMvQjdkLEVBQVltRCxJQUFJekYsVUFDbkIsTUFBTThCLFFBQWdCUCxFQUFPQyxzQkFBc0JDLEdBQ25ELFFBQWdCNEcsSUFBWnZHLEVBQXVCLE9BQzNCLElBQUl5RCxFQUFhNmEsR0FBZXRlLEdBQ2hDeUQsRUFBYThhLEdBQWtCOWEsRUFBWTBhLEVBQWUsT0FDdERuZSxJQUFZeUQsU0FDUmhFLEVBQU9NLGFBQWFKLEVBQVU4RCxJQUcxQyxDQUVBLE1BQU0rYSxRQUFnQnJVLEVBQUdDLEtBQ3ZCLENBQ0UsOERBQ0EsMkVBRUYsQ0FBRUMsS0FBSyxFQUFNQyxJQUFLeEosRUFBU3lKLE9BQVFkLElBRWpDNUssRUFBUUMsV0FDVk0sUUFBUUMsS0FBSyxTQUFTbWYsRUFBUXhiLDhCQUE4QmxDLEtBRTlELElBQUssTUFBTTJkLEtBQVVELEVBQVMsQ0FDNUIsTUFBTTdlLEVBQVdPLEVBQUt3RCxLQUFLNUMsRUFBUzJkLEdBQy9CamUsRUFBWW1ELElBQUl6RixVQUNuQixNQUFNZ0QsUUFBbUJ6QixFQUFPQyxzQkFBc0JDLEdBQ3RELFFBQW1CNEcsSUFBZnJGLEVBQTBCLE9BQzlCLElBQUl1QyxFQUE0QnZDLEVBNENuQ3VKLFdBQVcsb0JBQXNCaVUsR0FBWUosR0FBZUksSUFDNURqVSxXQUFXLHlCQUEwQixhQUNyQ0EsV0FBVyx1QkFBd0IsY0FDbkNBLFdBQVcsdUJBQXdCLGNBOUNoQ2hILEVBQWE4YSxHQUFrQjlhLEVBQVkwYSxFQUFlLE1BRXREamQsSUFBZXVDLFNBQ1hoRSxFQUFPTSxhQUFhSixFQUFVOEQsSUFHMUMsQ0FFQSxNQUFNa2IsUUFBdUJ4VSxFQUFHQyxLQUFLLHVDQUF3QyxDQUMzRUMsS0FBSyxFQUNMQyxJQUFLeEosRUFDTHlKLE9BQVFkLElBRU41SyxFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLFNBQVNzZixFQUFlM2IsOEJBQThCbEMsS0FFckUsSUFBSyxNQUFNOGQsS0FBUUQsRUFBZ0IsQ0FDakMsTUFBTWhmLEVBQVdPLEVBQUt3RCxLQUFLNUMsRUFBUzhkLEdBQy9CcGUsRUFBWW1ELElBQUl6RixVQUNuQixNQUFNZ0QsUUFBbUJ6QixFQUFPQyxzQkFBc0JDLEdBQ3RELFFBQW1CNEcsSUFBZnJGLEVBQTBCLE9BQzlCLElBQUl1QyxFQUFhNmEsR0FBZXBkLEdBQ2hDdUMsRUFBYThhLEdBQWtCOWEsRUFBWTBhLEVBQWUsUUFFdERqZCxJQUFldUMsU0FDWGhFLEVBQU9NLGFBQWFKLEVBQVU4RCxJQUcxQyxPQUVNakQsRUFBWXFlLGNBRXRCLENBRU8sU0FBU1AsR0FBZXRlLEdBQzdCLE9BQU9BLEVBQ0p5SyxXQUFXLG9CQUFxQixPQUNoQ0EsV0FBVyxrQkFBbUIsUUFDOUJBLFdBQVcsZ0JBQWlCLE9BQ2pDLENBVUEsU0FBUzhULEdBQWtCOWEsRUFBb0IwYSxFQUE4QlcsR0FDM0UsSUFBSyxNQUFPQyxFQUFRQyxLQUFVN1osT0FBT3NDLFFBQVEwVyxFQUFjYyxVQUFVQyxPQUFPekksS0FBTyxDQUFBLEdBQ2pGaFQsRUFBYUEsRUFBV2dILFdBQVdzVSxFQUFRQyxHQUU3QyxJQUFLLE1BQU9ELEVBQVFDLEtBQVU3WixPQUFPc0MsUUFBUTBXLEVBQWNjLFVBQVVDLFFBQVFKLElBQWEsQ0FBQSxHQUN4RnJiLEVBQWFBLEVBQVdnSCxXQUFXc1UsRUFBUUMsR0FFN0MsT0FBT3ZiLENBQ1QsQ0NwR092RixlQUFlaWhCLEdBQTBCekUsRUFBMkIwRSxHQUN6RSxPQUFPcGdCLEVBQU9DLDBCQUEwQiw0QkFBNkJmLFVBQ25FLElBQUt3YyxFQUFXeEMsT0FBUSxPQUd4QixNQUFNbUgsRUFBa0JuZixFQUFLNUIsUUFBUW9jLEVBQVc1WixRQUFTLG1CQUNuRHdlLFFBQXFCN2YsRUFBT0Msc0JBQXNCMmYsR0FFeEQsSUFBSyxNQUFPeFosRUFBVTBaLElBQWEsQ0FDakMsQ0FBQyxZQUFhLGFBQ2QsQ0FBQyxZQUFhLGVBQ2QsQ0FBQyxZQUFhLGVBQ0osQ0FDVixNQUFNdmYsRUFBVXdmLEdBQXlCOUUsRUFBWTBFLEVBQVlHLEVBQVVELEdBQ3JFM2YsRUFBV08sRUFBSzVCLFFBQVFvYyxFQUFXNVosUUFBUytFLFNBQzVDckYsRUFBWW1ELElBQUksSUFBTWxFLEVBQU9NLGFBQWFKLEVBQVVLLEdBQzVELENBRUEsTUFBTXlmLEVBQWtCdmYsRUFBSzVCLFFBQVFvYyxFQUFXNVosUUFBUyw2QkFDbkQ0ZSxFQUtWLFNBQ0UvZSxFQUNBeWUsRUFDQUUsR0FFQSxNQUFNSyxFQUFjLHlFQUNkQyxFQUFPSixHQUF5QjdlLEVBQVF5ZSxFQUFZLFNBQVVFLEdBQ3BFLE1BQU8sR0FBR0ssUUFBa0JDLEdBQzlCLENBYitCQyxDQUFnQ25GLEVBQVkwRSxFQUFZRSxTQUM3RTllLEVBQVltRCxJQUFJLElBQU1sRSxFQUFPTSxhQUFhMGYsRUFBaUJDLEtBRXJFLENBWUEsU0FBU0YsR0FDUDlFLEVBQ0EwRSxFQUNBRyxFQUNBRCxHQUVBLE1BQU1uTixFQUFpQnVJLEVBQVdlLE1BQVEsTUFBUSxPQUM1Q3FFLEVBQWMseUNBR1ZwRixFQUFXM1EsYUFBYTdLLE1BQVEsK0JBQzNCd2IsRUFBVzNRLGFBQWFnVyxtQ0FDcEI1TixrNkJBZWdCQSxtRUFBZ0ZBLHVuQkFLaEN1SSxFQUFXc0Ysa0JBQW9CLHlDQUF5Q1QsK0JBQXdDLDhJQWtFcEtVLEVBL0RQYixFQWdFakJhLEVBQVFqWSxLQUFNckgsR0FBV0EsRUFBT2lKLFVBQVVzVyxnQkFoRVgsZ0ZBQW9GLFNBRTFIQyxHQUF5QmYsT0FFdEIzVSxXQUFXLFlBQWEsUUFDeEJBLFdBQVcsVUFBVyxRQUN0Qm5LLE9BeURMLElBQWlDMmYsRUF2RC9CLE1BQU1HLEVBQWdCZCxHQUFjaGYsT0FBTzBSLFdBQVcsS0FNdEQsT0FBTzhOLEdBTHdCUixFQUMzQmMsRUFDRSxPQUFTZCxFQUFhaGYsT0FDdEIsS0FBT2dmLEVBQ1QsR0FFTixDQUVPLFNBQVNhLEdBQXlCZixHQUV2QyxNQUFPLHNzQ0FtQlBBLEVBQVdwWCxLQUFNcVksR0FBTUEsRUFBRXpXLFVBQVUwVyxXQUMvQix1U0FDQSxTQUlKbEIsRUFBV3BYLEtBQU1xWSxHQUFNQSxFQUFFelcsVUFBVTJXLE9BQVNGLEVBQUV6VyxVQUFVNFcsTUFDcEQsd0tBRUEsT0FHSnBCLEVBQVdwWCxLQUFNcVksR0FBTUEsRUFBRXpXLFVBQVU0VyxNQUMvQixzTEFJQSxPQUdEL1YsV0FBVyxZQUFhLFFBQ3hCQSxXQUFXLFVBQVcsUUFDdEJuSyxNQUNMLENDdEhBLE1BQU1tZ0IsR0FBNEIsQ0FFaEMsMEJBQ0EsNEJBQ0EsNkJBQ0EsNkJBQ0EsNEJBQ0EsNEJBQ0EsNkJBQ0EsK0JBQ0EsK0JBQ0EsMEJBQ0EscUNBQ0EsK0JBQ0EsK0JBQ0EsZ0NBQ0Esa0JBQ0Esb0JBQ0EsZ0JBQ0EsV0FDQSxjQUNBLG1CQUtBLDZCQUNBLDBDQUNBLHdDQUNBLHVDQUNBLHlDQUNBLHVDQUNBLHlDQUNBLHVDQUNBLFFBQ0Esa0NBQ0EsK0JBQ0EsOEJBQ0EsNEJBQ0EsNkJBQ0EscUNBQ0Esc0NBQ0EsaUNBQ0Esa0NBQ0EsaUNBQ0EsbUNBQ0Esb0NBQ0EsaUNBQ0EsK0JBQ0EsZ0NBQ0EsbUNBQ0Esa0NBQ0EsaUNBQ0EsZ0NBQ0EsU0FDQSxtQ0FDQSxnQ0FDQSwrQkFDQSw2QkFDQSw4QkFDQSxzQ0FDQSx1Q0FDQSxrQ0FDQSxtQ0FDQSxrQ0FDQSxvQ0FDQSxxQ0FDQSxrQ0FDQSxnQ0FDQSxpQ0FDQSxvQ0FDQSxtQ0FDQSxrQ0FDQSxpQ0FDQSxrQkFDQSxnQ0FDQSw4QkFDQSwrQkFDQSw2QkFDQSwrQkFDQSw2QkFDQSxZQUNBLGFBQ0EsdUNBQ0Esd0NBQ0EscUNBQ0Esc0NBQ0EsNkJBQ0EsMEJBQ0EseUJBQ0EsdUJBQ0Esd0JBQ0EsZ0NBQ0EsNEJBQ0EsNkJBQ0EsMEJBQ0EsMkJBQ0Esd0JBQ0EscUJBQ0Esc0JBQ0EsT0FDQSxRQUNBLGFBR0t2aUIsZUFBZXdpQixHQUFtQi9mLEdBQ3ZDLE9BQU8zQixFQUFPQywwQkFBMEIscUJBQXNCZixVQUM1RCxNQUFNeUIsRUFBV08sRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLGVBQ3hDNmYsRUFBa0IvZ0IsRUFBR3FCLFdBQVd0QixHQUFZQyxFQUFHZ2hCLGFBQWFqaEIsRUFBVSxhQUFVNEcsRUFDaEZ2RyxFQUFVeUQsR0FBV2tkLFNBQ3JCbmdCLEVBQVltRCxJQUFJLElBQU1sRSxFQUFPTSxhQUFhSixFQUFVSyxLQUU5RCxDQUVBLE1BQU15RCxHQUFja2QsSUFDbEIsTUFBTUUsRUFlUixTQUF5QjdnQixHQUN2QixJQUFLQSxFQUNILE9BRUYsSUFDRSxPQUFPaVcsRUFBTWpXLEVBQ2YsQ0FBRSxNQUNBLE1BQ0YsQ0FDRixDQXhCcUI4Z0IsQ0FBZ0JILEdBQ25DLE1BQU8scUNBeUJULFNBQTRCRSxHQUMxQixNQUF1QyxrQkFBekJBLEdBQVlsZCxLQUFLb2QsSUFBb0IsZ0JBQWdCRixFQUFXbGQsSUFBSW9kLFFBQVUsRUFDOUYsQ0F4QkVDLENBQW1CSCwyQkFFb0IsSUFBL0JBLEdBQVlJLFNBQVNDLE1BQWtCLFFBQVUsbUdBSXpEVCxHQUEwQjdmLElBQUsyWCxHQUFnQixRQUFRQSxPQUFpQjdVLEtBQUssY0M5SS9FLE1BQU15ZCxHQUFvQiw4QkFDcEJDLEdBQXlCLHdDQUN6QkMsR0FBWSxzQkFFWkMsR0FBeUIsR0FBR0gsa0JBR2hDRSxPQUVJRSxHQUF5QixLQUM3QkosY0FHV0ssR0FBaUIsQ0FDNUJILGFBQ0FJLGdCQVpzQixrQkFhdEJILDBCQUNBQywwQkFDQSxvQ0FBTUcsQ0FBK0IvaEIsR0FDbkMsSUFDRSxJQUFJSyxRQUFnQkosRUFBR0MsU0FBU0MsU0FBU0gsRUFBVSxRQUNuRCxNQUFNZ2lCLEVBQWtCQyxHQUFnQzVoQixHQUl4RCxPQUhJMmhCLEVBQWtCLElBQ3BCM2hCLEVBQVVBLEVBQVFzRCxNQUFNLEVBQUdxZSxFQUFrQixJQUc3QzNoQixFQUNHeUssV0FBVzJXLEdBQXdCLElBQ25DM1csV0FBVyw0QkFBNkIsSUFDeENBLFdBQVcsdUJBQXdCLFFBQ25DbkssT0FBUyxJQUVoQixDQUFFLE1BQ0EsQ0FFSixFQUNBdWhCLGtCQUFBQSxDQUFtQjdoQixHQUNqQixNQUFNdUYsRUFBUXZGLEVBQVE2SyxRQUFRaVgsS0FBS0wsaUJBQ25DLE9BQWMsSUFBVmxjLEVBQ0t2RixFQUNKc0QsTUFBTSxFQUFHdEQsRUFBUTZLLFFBQVEsS0FBTXRGLEdBQVMsR0FDeENrRixXQUFXMlcsR0FBd0IsR0FBR0QsZUFFcENHLEVBQ1QsRUFDQVMsa0JBQUFBLENBQW1CL2hCLEdBQ2pCLE1BQU0yaEIsRUFBa0JDLEdBQWdDNWhCLEdBQ3hELE9BQUkyaEIsRUFBa0IsRUFDYjNoQixFQUFRc0QsTUFBTXFlLEVBQWtCLEdBRWxDSixFQUNULEVBQ0EsK0JBQU1TLENBQTBCcmlCLEdBQzlCLElBRUUsYUFEc0JDLEVBQUdDLFNBQVNDLFNBQVNILEVBQVUsU0FDdEM0RCxTQUFTLGlCQUMxQixDQUFFLE1BQ0EsT0FBTyxDQUNULENBQ0YsR0FHRixTQUFTcWUsR0FBZ0M1aEIsR0FDdkMsTUFBTXVGLEVBQVF2RixFQUFRNkssUUFBUXNXLElBQ3hCYyxFQUFZamlCLEVBQVFraUIsWUFBWWYsSUFDdEMsT0FBT2MsRUFBWTFjLEVBQVEwYyxHQUFZLENBQ3pDLENDbkRPL2pCLGVBQWVpa0IsR0FBcUJ4aEIsR0FDekMsT0FBTzNCLEVBQU9DLDBCQUEwQix1QkFBd0JmLFVBQzlELE1BQU15QixFQUFXTyxFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsaUJBQzlDLEdBQUlILEVBQU84YyxzQkFBdUIsQ0FDaEMsTUFBTXpkLFFBQWlCUCxFQUFPQyxzQkFBc0JDLElBQWMsR0FJNUQ4RCxFQUhrQitkLEdBQWVLLG1CQUFtQjdoQixHQVoxQyxtRUFhUXdoQixHQUFlTyxtQkFBbUIvaEIsU0FHcERRLEVBQVltRCxJQUFJLElBQU1sRSxFQUFPTSxhQUFhSixFQUFVOEQsR0FDNUQsWUFDUTdELEVBQUdDLFNBQVNnWSxHQUFHbFksRUFBVSxDQUFFb2IsT0FBTyxLQUc5QyxDQy9CTyxNQUFNcUgsR0FBYSxDQUN4QkMsb0JBQXFCLENBQ25CLE1BQ0EsTUFDQSxLQUNBLE1BQ0EsTUFDQSxNQUNBLEtBQ0EsTUFDQSxPQUNBLFFBQ0EsUUFDQSxNQUNBLE9BQ0EsTUFDQSxPQUNBLEtBQ0EsT0FDQSxLQUNBLE1BQ0EsTUFDQSxPQUNBLE1BQ0EsTUFDQW5ULFdBQ0ZvVCxvQkFBcUIsQ0FBQyxLQUFNLFNBQVUsT0FBUSxNQUFNcFQsV0FDcERxVCxhQUFjLENBQUMsTUFBTXJULFdBQ3JCc1QsT0FBUSxDQUFDLFFBQVMsTUFBTyxNQUFPLEtBQU0sTUFBTyxNQUFPLE1BQU8sU0FBVSxLQUFNLE1BQU8sT0FBT3RULFdBQ3pGdVQsTUFBTyxDQUNMLFFBQ0EsTUFDQSxNQUNBLE1BQ0EsTUFDQSxVQUNBLE1BQ0EsTUFDQSxPQUNBLEtBQ0EsT0FDQSxRQUNBLFFBQ0EsTUFDQSxPQUNBLEtBQ0EsTUFDQSxNQUNBLE1BQ0EsT0FDQSxTQUNBLE9BQ0EsS0FDQSxNQUNBLE1BQ0EsT0FDQSxPQUNBdlQsV0FDRndULGFBQWMsQ0FBQyxRQUFReFQsWUNsRG5CekwsR0FBYSwwSEFRakJrZixHQUFtQlAsR0FBV0Msa0VBSTlCTSxHQUFtQlAsR0FBV0Usa0VBSTlCSyxHQUFtQlAsR0FBV0csb0hBUXpCcmtCLGVBQWUwa0IsR0FBcUJqaUIsR0FDekMsT0FBTzNCLEVBQU9DLDBCQUEwQix1QkFBd0JmLFVBQzlELE1BQU15QixFQUFXTyxFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsdUJBQ3hDTixFQUFZbUQsSUFBSSxJQUFNbEUsRUFBT00sYUFBYUosRUFBVThELE1BRTlELENBRUEsU0FBU2tmLEdBQW1CUCxHQUMxQixPQUFPQSxFQUFXcGYsT0FBUyxFQUFJLE9BQU9vZixFQUFXMWUsS0FBSyxTQUFXLE1BQU0wZSxFQUFXLEtBQ3BGLENDMUJBLE1BQU1uZSxHQUFnQixDQUNwQjRlLFVBQVUsRUFDVkMsWUFBYSxDQUNYQyxTQUFTLEVBQ1RDLDJCQUE0QixTQUM1QkMscUJBQXFCLEVBQ3JCQyxvQkFBcUIsQ0FDbkJDLE1BQU0sRUFDTkMsU0FBUyxFQUNUTixhQUFhLElBR2pCTyxnQkFBaUIsQ0FBQyxxQkFHYm5sQixlQUFlb2xCLEdBQXFCM2lCLEVBQXVCeWUsR0FDaEUsT0FBT3BnQixFQUFPQywwQkFBMEIsdUJBQXdCZixVQUM5RCxJQUFLeUMsRUFBT3VYLE9BQVEsT0FFcEIsTUFBTXBYLEVBQVVaLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxXQUN2Q3lpQixFQUFpQnJqQixFQUFLNUIsUUFBUXdDLEVBQVMsY0FDdkMwaUIsRUFBcUJ0akIsRUFBSzVCLFFBQVF3QyxFQUFTLGlCQUMzQ3VlLEVBQWtCbmYsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLG1CQUVyRCxJQUFJMmlCLEVBQW9CakksZ0JBQWdCdlgsSUFDeEMsSUFDRSxNQUFNL0MsUUFBbUJ0QixFQUFHQyxTQUFTQyxTQUFTeWpCLEVBQWdCLFFBQ3hERyxFQUFZeEgsRUFBS0MsS0FBS2piLEdBQzVCdWlCLEVBQVl2SyxFQUFNekMsSUFBSSxDQUFDZ04sRUFBV0MsRUFBV0QsR0FBWSxDQUFFckgsV0FBWTFELElBQ3pFLENBQUUsTUFDQSxDQUdGLE1BQU1pTCxFQUFjekgsRUFBSzRCLEtBQUsyRixFQUFXLENBQ3ZDMUYsV0FBVyxFQUNYQyxjQUFjLEVBQ2RDLE9BQVEsQ0FDTixTQUFVLFdBSVJxQixRQUFxQjdmLEVBQU9DLHNCQUFzQjJmLEdBQ2xEdUUsRUFBeUJ0RSxHQUFjdUUsWUFBWTdSLFdBQVcsVUFBT3pMLEVBQVkrWSxFQUlqRndFLEVBQW9CLEdBSFFuakIsRUFBTzRhLGFBQ3JDLDZEQUNBLHlDQUN5RDRFLEdBQXlCZixLQUNwRndFLEVBQXlCLEtBQUtBLEVBQXVCRyxZQUFjLEtBRy9EbGtCLEVBQVcsQ0FDZlcsRUFBWW1ELElBQUksSUFBTWxFLEVBQU9NLGFBQWF3akIsRUFBZ0JJLElBQzFEbmpCLEVBQVltRCxJQUFJLElBQU1sRSxFQUFPTSxhQUFheWpCLEVBQW9CTSxXQUUxRHpsQixRQUFRb1ksSUFBSTVXLElBRXRCLENDakVPM0IsZUFBZThsQixHQUFxQnJqQixHQUN6QyxPQUFPM0IsRUFBT0MsMEJBQTBCLHlCQUEwQmYsVUFDaEUsSUFBS3lDLEVBQU91WCxPQUFRLE9BRXBCLE1BQU1wWCxFQUFVWixFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsV0FDdkNuQixFQUFXTyxFQUFLNUIsUUFBUXdDLEVBQVMsdUJBQ2pDbEIsRUFBR0MsU0FBU2dZLEdBQUdsWSxFQUFVLENBQUVvYixPQUFPLEtBRTVDLENDTEEsTUFBTXRYLEdBQWEsdUVBS2pCLElBQUkyZSxHQUFXQyx1QkFBd0JELEdBQVdFLHVCQUF3QkYsR0FBV0csY0FDcEYzaEIsSUFBS0MsR0FBUSxLQUFLQSxpQkFDbEI2QyxLQUFLLDZDQUtEeEYsZUFBZStsQixHQUFzQnRqQixHQUMxQyxPQUFPM0IsRUFBT0MsMEJBQTBCLHdCQUF5QmYsVUFDL0QsTUFBTXlCLEVBQVdPLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyx3QkFDeENOLEVBQVltRCxJQUFJLElBQU1sRSxFQUFPTSxhQUFhSixFQUFVOEQsTUFFOUQsQ0NkQSxNQUFNeWdCLEdBQWUsQ0FBQyxVQUFXLFFBQVMsUUFBUyxZQUFhLG1CQUFvQixRQUFTLE1BQU8sUUF1QjdGaG1CLGVBQWVpbUIsR0FBa0J4akIsRUFBdUIrWixHQUM3RCxPQUFPMWIsRUFBT0MsMEJBQTBCLG9CQUFxQmYsVUFDM0QsTUFBTXlCLEVBQVdPLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxjQUN4Q2QsUUFBaUJQLEVBQU9DLHNCQUFzQkMsSUFBYyxHQUNsRSxJQUFJeWtCLEVBQWtCNUMsR0FBZUssbUJBQW1CN2hCLEdBekJ0QyxxUUEwQmxCLE1BQU1xa0IsRUFBa0I3QyxHQUFlTyxtQkFBbUIvaEIsR0FFcER1VSxFQUFRLElBQUkyUCxJQUNkdmpCLEVBQU8yakIsb0JBQ1QvUCxFQUFNeFIsS0FBSyxRQUVUcEMsRUFBTzRqQixtQkFDVGhRLEVBQU14UixLQUFLLE1BQ1hxaEIsR0FBbUIsR0FBR2xrQixFQUFLaWIsU0FBU3hhLEVBQU9HLGNBR3pDSCxFQUFPNmpCLHdCQUNUalEsRUFBTXhSLEtBQUssUUFFVHBDLEVBQU84akIsb0JBQ1RsUSxFQUFNeFIsS0FBSyxTQUNYcWhCLEdBQW1CLGtDQUdqQnpqQixFQUFPK2pCLHlCQUNUblEsRUFBTXhSLEtBQUssVUFBVyxnQkFBaUIsUUFDdkNxaEIsR0FBbUIscUdBTWpCempCLEVBQU9na0IsMEJBQ1RQLEdBQW1CLCtCQUtqQnpqQixFQUFPaWtCLHVCQUF5QmprQixFQUFPa2tCLHFCQUN6Q3RRLEVBQU14UixLQUFLLFVBQ1hxaEIsR0FBbUIsWUFJakJ6akIsRUFBT2lKLFVBQVVrYixRQUNuQlYsR0FBbUIsdUJBSWpCempCLEVBQU9pSixVQUFVNFcsTUFDbkJqTSxFQUFNeFIsS0FBSyxXQUVUMlgsRUFBVzlRLFVBQVVtYixVQUFZcGtCLEVBQU9pSixVQUFVbWIsV0FDcER4USxFQUFNeFIsS0FBSyxZQUVUcEMsRUFBT2lKLFVBQVVDLFNBQ25CdWEsR0FBbUIsZ0JBR2pCempCLEVBQU9pSixVQUFVc1csaUJBQ25Ca0UsR0FBbUIsd0NBSWpCMUosRUFBVzlRLFVBQVVvYixhQUFlcmtCLEVBQU9pSixVQUFVb2IsZUFDdkR6USxFQUFNeFIsS0FBSyxlQUNYcWhCLEdBQW1CLHdEQUlqQnpqQixFQUFPaUosVUFBVXFiLFdBQ25CMVEsRUFBTXhSLEtBQUssZUFFVHBDLEVBQU9pSixVQUFVc2IsYUFDbkJkLEdBQW1CLHFCQUlyQixJQUFJZSxFQUFZLEdBQ2hCLElBQUssTUFBTWptQixLQUFRcVYsRUFBTyxDQUN4QixJQUFJdlUsUUFBaUJvbEIsR0FBVWxtQixJQUFVLEdBQ3pDLElBQUtjLEVBQVMsQ0FDWixNQUFNMkUsRUFBTSxtREFBbUR6RixJQUN6RG1tQixRQUFpQkMsTUFBTTNnQixHQUN2QjRnQixRQUFxQkYsRUFBU0csT0FDcEMsSUFBS0gsRUFBU0ksSUFBTUYsRUFBYWhpQixTQUFTLHdCQUEwQmdpQixFQUFhaGlCLFNBQVMsV0FFeEYsWUFEQW5FLFFBQVFULE1BQU0sbUJBQW1CZ0csS0FHbkMzRSxFQUFVdWxCLEVBQWFqbEIsYUFDakJFLEVBQVltRCxJQUFJLElBQU0raEIsR0FBV3htQixFQUFNYyxJQUN6Q25CLEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssV0FBV3NGLElBRTVCLENBQ0l3Z0IsSUFBV0EsR0FBYSxNQUM1QkEsR0FBYW5sQixFQUFVLElBQ3pCLE9BQ1l3aEIsR0FBZVEsMEJBQTBCcmlCLEtBQ25Ed2xCLEVBQVlBLEVBQVV6USxRQUFRLGVBQWdCLGtCQUFrQkEsUUFBUSxXQUFZLFlBRWxGL1QsRUFBTzhqQixtQkFBcUI5akIsRUFBTytqQiwwQkFDckNTLEVBQVlBLEVBQ1QxYSxXQUFXLHlCQUEwQixtQkFDckNBLFdBQVcsNEJBQTZCLHNCQUN4Q0EsV0FBVyxtQ0FBb0MsNkJBQy9DQSxXQUFXLDJCQUE0QixxQkFDdkNBLFdBQVcscUJBQXNCLGVBQ2pDQSxXQUFXLHVCQUF3QixpQkFDbkNBLFdBQVcsY0FBZSxTQUMxQkEsV0FBVyxjQUFlLFNBQ3pCOUosRUFBTytqQix5QkFDVFMsRUFBWUEsRUFBVTFhLFdBQVcseUJBQTBCLHlCQUcvRDBhLEVBQVlBLEVBQVUxYSxXQUFXLGVBQWdCLFlBQzdDaVEsRUFBVzlRLFVBQVVvYixhQUFlcmtCLEVBQU9pSixVQUFVb2IsYUFBZXJrQixFQUFPK2pCLDBCQUM3RVMsRUFBWUEsRUFBVTFhLFdBQVcsa0JBQW1CLG1CQUV0RCxNQUFNaEgsRUFBYTJnQixFQUFrQixLQUFPZSxFQUFZZCxRQUNsRDdqQixFQUFZbUQsSUFBSSxJQUFNbEUsRUFBT00sYUFBYUosRUFBVThELEtBRTlELENBRUEsTUFBTTNDLEdBQVVaLEVBQUt3RCxLQUFLaWlCLEVBQUdDLFVBQVcsU0FBVSxPQUFRLGFBRTFEMW5CLGVBQWV3bkIsR0FBV3htQixFQUFjYyxTQUNoQ0osRUFBR0MsU0FBU0ksTUFBTWEsR0FBUyxDQUFFVixXQUFXLFVBQ3hDUixFQUFHQyxTQUFTVSxVQUFVTCxFQUFLd0QsS0FBSzVDLEdBQVM1QixHQUFPYyxFQUN4RCxDQUVBOUIsZUFBZWtuQixHQUFVbG1CLEdBQ3ZCLElBQ0UsTUFBTXlZLFFBQWEvWCxFQUFHQyxTQUFTOFgsS0FBS3pYLEVBQUt3RCxLQUFLNUMsR0FBUzVCLElBQ3ZELEdBQUkybUIsS0FBS0MsTUFBUW5PLEVBQUtvTyxRQUFVLE1BQzlCLE9BRUYsYUFBYW5tQixFQUFHQyxTQUFTQyxTQUFTSSxFQUFLd0QsS0FBSzVDLEdBQVM1QixHQUFPLE9BQzlELENBQUUsTUFDQSxDQUVKLENDOUtPLFNBQVM4bUIsR0FBa0JybEIsR0FDaEMsT0FDRUEsRUFBT3NsQix1QkFDUHRsQixFQUFPdWxCLGlDQUNQdmxCLEVBQU93bEIsdUJBQ1B4bEIsRUFBT3lsQiwrQkFFWCxDQUVPLFNBQVNDLEdBQWdCMWxCLEdBQzlCLE9BQU9BLEVBQU8wbEIsaUJBQW1CMWxCLEVBQU8ybEIseUJBQzFDLENDSE9wb0IsZUFBZXFvQixHQUFxQjVsQixHQUN6QyxPQUFPM0IsRUFBT0MsMEJBQTBCLHVCQUF3QmYsVUFDOUQsTUFBTTRDLEVBQVVaLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxTQUM3QyxHQUFJbEIsRUFBR3FCLFdBQVdILEdBQVUsQ0FDMUIsTUFBTW5CLEVBQVdPLEVBQUs1QixRQUFRd0MsRUFBUywwQkFDaENrbEIsR0FBa0JybEIsSUFBVzBsQixHQUFnQjFsQixHQUNoREgsRUFBWW1ELElBQUksSUFBTWxFLEVBQU9NLGFBQWFKLEVBOEJwRCxTQUFnQ2dCLEdBQzlCLE1BQU8sNEdBR1BxbEIsR0FBa0JybEIsR0FBVXloQixHQUFXSyxNQUFNN2hCLElBQUtDLEdBQVEybEIsR0FBa0IsT0FBUSxtRkFBb0YsUUFBUzNsQixJQUFNNkMsS0FBSyxJQUFNLE9BQ2xNMmlCLEdBQWdCMWxCLEdBQVV5aEIsR0FBV00sYUFBYTloQixJQUFLQyxHQUFRMmxCLEdBQWtCLE9BQVEsNkNBQThDLFdBQVkzbEIsSUFBTTZDLEtBQUssSUFBTSxrQ0FJdEssQ0F2QzhEK2lCLENBQXVCOWxCLEtBQzNFSCxFQUFZbUQsSUFBSSxJQUFNL0QsRUFBR0MsU0FBU2dZLEdBQUdsWSxFQUFVLENBQUVvYixPQUFPLEtBQzlELEdBRUosQ0FFQSxTQUFTeUwsR0FBa0JFLEVBQWdCblksRUFBY3JQLEVBQWN5bkIsR0FDckUsTUFBTyw2RUFDK0JwWSwwT0FJSW9ZLGdHQUVUem5CLE9BQVV5bkIsd1BBTVBELG9SQVF0QyxDQ3hDTyxTQUFTRSxHQUNkam1CLEVBQ0EyVCxHQUVBLEdBQUszVCxFQUFPaUosVUFBVTBXLFdBQWNoTSxJQUFVLGVBQzlDLE9BQVUzVCxFQUFPOGEsTUFBUSxNQUFRLFFBQTFCLDhCQUNULENDUE8sU0FBU29MLEdBQVVuaUIsRUFBaUI2SixFQUFnQmpFLEVBQWF3YyxFQUFRLEdBQzlFQyxHQUF5QnJpQixFQUFTNkosRUFBTWpFLEVBQUt3YyxFQUMvQyxDQUVPLFNBQVNDLEdBQXlCcmlCLEVBQWlCNkosRUFBZ0JqRSxFQUFhd2MsRUFBUSxHQUM3RixFQUFHLENBQ0QsTUFBT0UsRUFBUUMsRUFBU3BvQixHQUFXcW9CLEdBQWlCeGlCLEVBQVM2SixFQUFNakUsR0FHN0Q2YyxFQURNQyxFQUFjUCxVQUFVRyxFQUFRQyxFQUFTcG9CLEdBQ2xDc29CLFFBQVUsRUFDN0IsR0FBZSxJQUFYQSxFQUFjLE1BQ2xCLEdBQUlMLEdBQVMsRUFBRyxPQUFPSyxDQUN6QixTQUFXTCxHQUFTLEdBQ3BCLE9BQU8sQ0FDVCxDQUVPLFNBQVNPLEdBQXlCM2lCLEVBQWlCNkosRUFBZ0JqRSxHQUN4RSxNQUFPMGMsRUFBUUMsRUFBU3BvQixHQUFXcW9CLEdBQWlCeGlCLEVBQVM2SixFQUFNakUsR0FDbkV6TCxFQUFReW9CLE1BQVEsT0FDaEIsTUFBTUMsRUFBT0gsRUFBY1AsVUFBVUcsRUFBUUMsRUFBU3BvQixHQUVoRGtHLEVBQVN3aUIsRUFBS3hpQixRQUFVLEdBQ3hCcEcsRUFBMEIsaUJBQVhvRyxFQUFzQkEsRUFBT3pFLE9BQVN5RSxFQUFPcUcsV0FBVzlLLE9BQ3pFaW5CLEVBQUs1b0IsTUFDUFMsUUFBUVQsTUFBTSxHQUFHcW9CLE1BQVdDLEVBQVFybUIsSUFBSzRtQixHQUFNLElBQUlBLE1BQU05akIsS0FBSyx1QkFBdUI2akIsRUFBSzVvQixNQUFNOG9CLFdBQ3ZGOW9CLEdBQ1RTLFFBQVFULE1BQ04sR0FBR3FvQixNQUFXQyxFQUFRcm1CLElBQUs0bUIsR0FBTSxJQUFJQSxNQUFNOWpCLEtBQUssb0RBQW9EL0UsS0FJeEcsTUFBTW1HLEVBQVN5aUIsRUFBS3ppQixRQUFVLEdBQzlCLE1BQXlCLGlCQUFYQSxFQUFzQkEsRUFBT3hFLE9BQVN3RSxFQUFPc0csV0FBVzlLLE1BQ3hFLENBRU8sU0FBUzRtQixHQUFpQnhpQixFQUFpQjZKLEVBQWdCakUsR0FDaEUsTUFBTXRGLEVBQU0sSUFBS3dOLFFBQVF4TixLQVF6QixPQU5JQSxFQUFJMGlCLE1BQVExaUIsRUFBSTJpQixtQkFDbEIzaUIsRUFBSTBpQixLQUFPMWlCLEVBQUkwaUIsS0FBSzllLE1BQU0sS0FDdkJyQixPQUFRdkcsR0FBTUEsSUFBTWdFLEVBQUkyaUIsa0JBQ3hCamtCLEtBQUssTUFHSCxDQUNMZ0IsRUFDQTZKLEVBQ0EsQ0FDRWpFLE1BQ0F0RixNQUNBNGlCLFNBQVUsT0FDVkMsT0FBTyxFQUNQUCxNQUFPLFdBR2IsQ0M3Q08sTUFBTVEsR0FBYSxJQVQxQixNQUNFQyxhQUFBQSxDQUFjQyxHQUNaLE1BQU1DLEVBQXFCRCxFQUFjcGYsTUFBTSxLQUFLeEYsT0FDOUNtUixFQUFRMFQsR0FBb0JyZixNQUFNLEtBR3hDLE1BQU8sQ0FGSzJMLEdBQU9uUixJQUFHLElBQU8sR0FDaEJtUixHQUFPblIsSUFBRyxJQUFLc1IsUUFBUSxRQUFTLEtBQU8sR0FFdEQsR0FJSXdULEdBQWUsSUFBSW5mLElBRWxCLFNBQVNvZixHQUFXQyxHQUN6QixNQUFNL2lCLEVBQU0raUIsR0FBUyxHQUNmQyxFQUFTSCxHQUFhN2UsSUFBSWhFLEdBQ2hDLEdBQUlnakIsRUFBUSxPQUFPQSxFQUVuQixNQUFNQyxFQUFVLElBQUlDLEVBQVEsQ0FDMUJDLEtBQU1DLEdBQWVMLFNBQVU3aEIsSUFHakMsT0FEQTJoQixHQUFhbGYsSUFBSTNELEVBQUtpakIsR0FDZkEsQ0FDVCxDQUVPLFNBQVNJLEdBQWVOLEdBQzdCLFFBQVNLLEdBQWVMLEVBQzFCLENBRUEsU0FBU0ssR0FBZUwsR0FDdEIsTUFBYyxnQkFBVkEsRUFDSzVWLFFBQVF4TixJQUFJMmpCLDRCQUE4QkMsS0FFckMsbUJBQVZSLEVBQ0s1VixRQUFReE4sSUFBSTZqQiwrQkFBaUNELEtBR3BEcFcsUUFBUXhOLElBQUkyakIsNEJBQ1puVyxRQUFReE4sSUFBSTZqQiwrQkFDWnJXLFFBQVF4TixJQUFJaVksVUFDWnpLLFFBQVF4TixJQUFJOGpCLGNBQ1pGLElBRUosQ0FFQSxJQUFJRyxHQUVKLFNBQVNILEtBQ1AsUUFBdUJyaUIsSUFBbkJ3aUIsR0FBOEIsT0FBT0EsU0FBa0J4aUIsRUFFM0QsSUFFRXdpQixHQUNFQyxFQUNHQyxhQUFhLEtBQU0sQ0FBQyxPQUFRLFNBQVUsQ0FDckNyQixTQUFVLE9BQ1ZOLE1BQU8sQ0FBQyxTQUFVLE9BQVEsWUFFM0JobkIsUUFBVSxFQUNqQixDQUFFLE1BQ0F5b0IsR0FBaUIsRUFDbkIsQ0FDQSxPQUFPQSxTQUFrQnhpQixDQUMzQixDQ2pFTyxNQUFNMmlCLEdBQWtDLENBQzdDLGdCQUNBLHFCQUNBLG9CQUNBLDBCQ0pLLFNBQVNDLEdBQXFDeG9CLEdBQ25ELE9BQ0VBLEVBQU95b0IsdUJBQ056b0IsRUFBT3VYLFNBQ3dCLElBQWhDdlgsRUFBT29KLGFBQWFzZixTQUNwQjNhLE1BQU1DLFFBQVFoTyxFQUFPb0osYUFBYXVmLFFBQ2xDM29CLEVBQU9vSixZQUFZdWYsTUFBTXRtQixPQUFTLENBRXRDLENDZUEsTUFBTXVtQixHQUFhLENBQUMsNEJBQTZCLDZCQUE4QixRQUFTLFNBQVUsbUJBQzVGQyxHQUF5Qiw2QkFDekJDLEdBQXVCLGFBQ3ZCQyxHQUFlLGtCQUNmQyxHQUFvQixXQUNwQkMsR0FBd0MsQ0FDNUMsa0NBQ0dMLEdBQVdoaUIsT0FBUWdNLEdBQWVBLEVBQVd2QixXQUFXLG1CQUV2RDZYLEdBQTJCLENBQy9CLGlCQUNBLDhCQUNBLGFBQ0EsMkJBQ0EsZ0JBQ0Esb0JBQ0EsbUNBQ0EsNEJBQ0EsNEJBQ0EsNkJBQ0Esd0NBQ0EsZ0NBQ0Esc0NBQ0Esa0NBQ0EsbUNBQ0EsZ0NBQ0Esc0NBQ0EsUUFDQSxTQUNBLCtCQUNBLHFCQUNBLHlCQUNBLDhCQUNBLG9DQUNBLHVCQUNBLHlCQUNBLDhCQUNBLHlCQUNBLHNCQUNBLCtCQUNBLDRCQUNBLG1DQUNBLHNDQUNBLDBCQUNBLHdCQUNBLCtCQUNBLFVBQ0EsYUFDQSxxQkFFSUMsR0FBeUIsSUFBSW5uQixJQUFJLENBQUMsYUFBYyxzQkFDaERvbkIsR0FDSiwwR0FFSUMsR0FBK0IsSUFBSWpoQixJQUNuQ2toQixHQUF3QixDQUFDLGVBQWdCLGtCQUFtQix1QkFBd0Isb0JBYW5GL3JCLGVBQWVnc0IsR0FDcEJ2cEIsRUFDQStaLEVBQ0F5UCxHQUVBLE9BQU9uckIsRUFBT0MsMEJBQTBCLHNCQUF1QmYsZ0JBS2pFQSxlQUFvQnlDLEVBQXVCK1osRUFBMkJ5UCxHQUNwRSxNQUFNeHFCLEVBQVdPLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxnQkFDeENzcEIsUUFnQ1Jsc0IsZUFBK0J5QixHQUM3QixNQUFNMHFCLFFBQWlCenFCLEVBQUdDLFNBQVNDLFNBQVNILEVBQVUsUUFDaER5cUIsRUFBVXBVLEtBQUtDLE1BQU1vVSxHQUszQixPQUpBRCxFQUFROVYsUUFBVThWLEVBQVE5VixTQUFXLENBQUEsRUFDckM4VixFQUFRdGdCLGFBQWVzZ0IsRUFBUXRnQixjQUFnQixDQUFBLEVBQy9Dc2dCLEVBQVFwZ0IsZ0JBQWtCb2dCLEVBQVFwZ0IsaUJBQW1CLENBQUEsRUFDckRvZ0IsRUFBUUUsaUJBQW1CRixFQUFRRSxrQkFBb0IsQ0FBQSxFQUNoREYsQ0FDVCxDQXhDd0JHLENBQWdCNXFCLEdBQ2hDd1MsRUFBaUJ4UixFQUFPOGEsTUFBUSxNQUFRLGFBK2hCaER2ZCxlQUNFeUMsRUFDQXlwQixHQUV1QixvQkFBbkJBLEVBQVFJLFNBQ1ZKLEVBQVFJLE9BQVMscUJBa0NyQixTQUNFN3BCLEVBQ0F5cEIsR0FFQSxNQUFNN1IsRUFBYzZSLEVBQVFsckIsTUFBUWdCLEVBQUtpYixTQUFTeGEsRUFBT0csU0FJekQsSUFBSyxNQUFNMnBCLEtBQVdDLEdBQXNCTixHQUMxQ08sUUFBUUMsZUFBZUgsRUFBU2xTLEVBRXBDLEVBM0NFc1MsQ0FBcUJscUIsRUFBUXlwQixHQTZDL0IsU0FBNER6cEIsRUFBdUJ5cEIsR0FDakYsSUFBS3pwQixFQUFPeW9CLHFCQUFzQixPQUVsQyxJQUFLLE1BQU1xQixLQUFXQyxHQUFzQk4sR0FDMUMsSUFBSyxNQUFPN1csRUFBWXVYLEtBQVkzbEIsT0FBT3NDLFFBQVFnakIsR0FDNUNLLEdBQ0FDLEdBQXlCRCxLQU05QkwsRUFBUWxYLEdBQWN5WCxHQUEyQnpYLEdBR3ZELENBM0RFMFgsQ0FBbUR0cUIsRUFBUXlwQixVQUNwREEsRUFBUTlWLFFBQVEsNEJBQ2hCOFYsRUFBUTlWLFFBQVEsZ0NBQ2hCOFYsRUFBUTlWLFFBQVEseUJBQ2hCOFYsRUFBUTlWLFFBQVEsNkJBQ2hCOFYsRUFBUTlWLFFBQVEsNEJBQ2hCOFYsRUFBUXRnQixhQUFhb2hCLGFBQ3JCZCxFQUFRcGdCLGdCQUFnQix1Q0FDeEJvZ0IsRUFBUXBnQixnQkFBZ0IseUJBRzFCckosRUFBT2lKLFVBQVU0VyxhQUNiNEosRUFBUXBnQixnQkFBZ0J5ZixXQUUxQlcsRUFBUXBnQixnQkFBZ0JtaEIsYUFFeEJmLEVBQVFwZ0IsZ0JBQWdCb2hCLGFBQ3hCaEIsRUFBUTlWLFFBQVEseUJBQ2hCOFYsRUFBUTlWLFFBQVEseUJBQ2hCOFYsRUFBUTlWLFFBQVEsd0JBQ2hCOFYsRUFBUTlWLFFBQVEsd0JBQ2hCOFYsRUFBUTlWLFFBQVErVyxnQkFDaEJqQixFQUFROVYsUUFBUSxvQkFDaEI4VixFQUFROVYsUUFBUSxzQkFDaEI4VixFQUFROVYsUUFBUSxnQ0FDakI5VCxFQUFZbUQsSUFBSSxJQUFNL0QsRUFBR0MsU0FBU2dZLEdBQUczWCxFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsY0FBZSxDQUFFaWEsT0FBTyxLQW9DbEcsU0FDRXBhLEVBQ0F5cEIsR0FFQSxJQUFLenBCLEVBQU95b0IscUJBQXNCLE9BRWxDLE1BQU1rQyxFQUFXWixHQUFzQk4sR0FDdkMsSUFBSyxNQUFNN1csS0FBY3FXLEdBSXZCLElBQUssTUFBTWEsS0FBV2EsRUFDcEJYLFFBQVFDLGVBQWVILEVBQVNsWCxFQUd0QyxDQWpERWdZLENBQTRDNXFCLEVBQVF5cEIsR0FvSnRELFNBQ0VBLEVBQ0F6cEIsR0FFQSxNQUFNNnFCLEVBdUJSLFNBQWtDN3FCLEdBS2hDLE9BQVFBLEVBQU95b0IsdUJBQXlCem9CLEVBQU91WCxRQUdqRCxTQUF5Q3BYLEdBQ3ZDLE1BQU0ycUIsRUFBWXRoQixFQUFHdWhCLFNBQVMsMkNBQTRDLENBQ3hFcGhCLElBQUt4SixFQUNMdUosS0FBSyxFQUNMRSxPQUFRZCxJQUVWLE9BQU9naUIsRUFBVXpqQixLQUFNckksSUFDckIsSUFDRSxPQUFPb3FCLEdBQXdCaGtCLEtBQUtuRyxFQUFHZ2hCLGFBQWExZ0IsRUFBSzVCLFFBQVF3QyxFQUFTbkIsR0FBVyxRQUN2RixDQUFFLE1BQ0EsT0FBTyxDQUNULEdBRUosQ0FoQjREZ3NCLENBQWdDaHJCLEVBQU9HLFFBQ25HLENBN0I2QjhxQixDQUF5QmpyQixHQUNwRCxJQUFLLE1BQU00UyxLQUFjc1csR0FDbkIyQixHQUFzQjFCLEdBQXVCaG5CLElBQUl5USxJQUNqRHNZLEdBQTBDekIsRUFBU3pwQixFQUFRNFMsWUFDeEQ2VyxFQUFRdGdCLGFBQWF5SixVQUNyQjZXLEVBQVFwZ0IsZ0JBQWdCdUosVUFDeEI2VyxFQUFRRSxpQkFBaUIvVyxHQUVwQyxDQS9KRXVZLENBQStCMUIsRUFBU3pwQixFQUMxQyxDQWxrQlFvckIsQ0FBc0JwckIsRUFBUXlwQixTQXVDdENsc0IsZUFDRXlDLEVBQ0F5cEIsRUFDQWpZLElBaUJGLFNBQXFDbUMsR0FDbkMsSUFBSyxNQUFPalAsRUFBS3hCLEtBQVVzQixPQUFPc0MsUUFBUTZNLEdBQ25CLGlCQUFWelEsSUFFTkEsRUFBTU4sU0FBUyxlQUNsQitRLEVBQVFqUCxHQUFPeEIsRUFBTTRHLFdBQVcsZ0NBQWlDLEtBR3ZFLEVBdkJFdWhCLENBQTRCNUIsRUFBUTlWLFNBRXBDOFYsRUFBUTlWLFFBQVUsSUFBSzhWLEVBQVE5VixXQUFZMlgsR0FBZ0J0ckIsRUFBUXlwQixFQUFROVYsaUJBQ3BFOFYsRUFBUTlWLFFBQVEscUJBc0J6QixTQUFvQ0EsRUFBOEJuQyxHQUNoRSxLQUFNLGlCQUFrQm1DLEdBQVUsT0FFOUIsYUFBY0EsSUFDaEJBLEVBQVEsZ0JBQWtCLEdBQUduQyw2QkFBMENtQyxFQUFRLG1CQUVqRkEsRUFBUSxnQkFBa0IsR0FBR25DLDRCQUF5Q21DLEVBQVEsaUJBQ2hGLENBNUJFNFgsQ0FBMkI5QixFQUFROVYsUUFBU25DLEdBRTVDLE1BQU1tQyxFQUFVOFYsRUFBUTlWLFFBQ3BCM1QsRUFBTzhhLFFBQVU0SyxHQUFnQjFsQixVQUM1QjJULEVBQVE2WCxTQUVmN1gsRUFBUTZYLFVBQVk3WCxFQUFRNlgsVUFBWSxVQWs2QjVDanVCLGVBQXNDNEMsR0FDcEMsTUFBTW5CLEVBQVdPLEVBQUs1QixRQUFRd0MsRUFBUyxtQkFDakM2ZixRQUF3Qi9nQixFQUFHQyxTQUFTQyxTQUFTSCxFQUFVLFFBQVF5c0IsTUFBTSxJQUFNLElBQzNFN21CLEVBQVFvYixFQUFnQjlWLFFBQVEyVyxHQUFlQyxpQkFDckQsSUFBYyxJQUFWbGMsRUFBYyxNQUFPLEdBRXpCLE1BQU04bUIsRUFBa0IxTCxFQUFnQnJkLE1BQU0sRUFBR2lDLEdBU2pELE1BQU8sR0FSTzhtQixFQUNYempCLE1BQU0sTUFDTmhJLElBQUs0SSxJQUNKLE1BQU04aUIsRUFBVTlpQixFQUFLbEosT0FDckIsT0FBT2dzQixFQUFRaFUsU0FBUyxLQUFPZ1UsRUFBUWhwQixNQUFNLEdBQUcsR0FBTWdwQixJQUV2RC9rQixPQUFRZ2xCLEdBQU1BLElBQU1BLEVBQUV2YSxXQUFXLE9BQVN1YSxFQUFFaHBCLFNBQVMsTUFFeEMzQyxJQUFLNEksR0FBUyxTQUFTQSxTQUFZOUYsS0FBSyxhQUMxRCxDQWw3QnlEOG9CLENBQXVCN3JCLEVBQU9HLFVBd0J2RixTQUE4Q3dULEdBRTVDLElBQUssTUFBT2pQLEVBQUt4QixLQUFVc0IsT0FBT3NDLFFBQVE2TSxHQUNuQ3pRLEdBQU9OLFNBQVMsNkJBQ3JCK1EsRUFBUWpQLEdBQU94QixFQUFNNEcsV0FDbkIsbUhBQ0EsaUNBR04sQ0EvQkVnaUIsQ0FBcUNuWSxFQUN2QyxDQXhEUW9ZLENBQWMvckIsRUFBUXlwQixFQUFTalksR0F3T3ZDLFNBQXNEaVksR0FDcEQsSUFBSyxNQUFNN1csSUFBYyxDQUFDbVcsR0FBY0MsSUFDakNTLEVBQVF0Z0IsYUFBYXlKLEtBQzFCNlcsRUFBUXBnQixnQkFBZ0J1SixLQUFnQjZXLEVBQVF0Z0IsYUFBYXlKLFVBQ3RENlcsRUFBUXRnQixhQUFheUosR0FFaEMsQ0E3T0VvWixDQUE2Q3ZDLEdBQzdDLE1BQU13QyxRQXNGUjF1QixlQUNFeUMsRUFDQStaLEVBQ0EwUCxHQUVBLE1BQU10Z0IsRUFBeUIsR0FDekJFLEVBQWtCLENBQUMscUJBQ25CNmlCLEVBQWtDLEdBQ2xDQyxFQUFVekcsR0FBZ0IxbEIsSUFHOUJtc0IsR0FDQ2x0QixFQUFHcUIsV0FBV2YsRUFBS3dELEtBQUtnWCxFQUFXNVosUUFBUyxzQkFDNUNsQixFQUFHcUIsV0FBV2YsRUFBS3dELEtBQUsvQyxFQUFPRyxRQUFTLHVCQUV6Q3NwQixFQUFRaUIsU0FBVywrQkFDbkJyaEIsRUFBZ0JqSCxLQUFLLHVCQUF3QixpQ0FFM0MrcEIsRUFDRjlpQixFQUFnQmpILEtBQUssWUE4M0J6QixTQUFpQ3FuQixVQUN4QkEsRUFBUWlCLFNBQ2YsTUFBTTBCLEVBQXlFLENBQzdFM0MsRUFBUXRnQixhQUNSc2dCLEVBQVFwZ0IsZ0JBQ1JvZ0IsRUFBUUUsa0JBRVYsSUFBSyxNQUFNRyxLQUFXc0MsRUFDZnRDLFdBQ0VBLEVBQVFZLGdCQUNSWixFQUFRLCtCQUNSQSxFQUFRLGlDQUNSQSxFQUFRLHVDQUNSQSxFQUFRLG1CQUVuQixDQTM0Qkl1QyxDQUF3QjVDLEdBTTFCLFVBSE9BLEVBQVFwZ0IsZ0JBQWdCLHNCQUN2Qm9nQixFQUFzRCxlQUUxRHpwQixFQUFPdVgsT0FBUSxDQXFCakIsVUFwQk9rUyxFQUFRcGdCLGdCQUFnQmlqQixhQUN4QjdDLEVBQVE5VixRQUFRNFksbUJBQ2hCOUMsRUFBUTlWLFFBQVE2WSxtQkFDaEIvQyxFQUFROVYsUUFBUThZLHNCQUNoQmhELEVBQVE5VixRQUFRK1ksZUFDaEJqRCxFQUFROVYsUUFBUWdaLFNBQ3ZCbEQsRUFBUTlWLFFBQVFpWixRQUFVLDJCQUMxQnZqQixFQUFnQmpILEtBQUssWUFFakJwQyxFQUFPaUosVUFBVXNSLGtCQUVoQmtQLEVBQVFwZ0IsZ0JBQWdCLHFCQUN4Qm9nQixFQUFRcGdCLGdCQUFnQiwyQkFDeEJvZ0IsRUFBUXBnQixnQkFBZ0IsaUNBRXpCQSxFQUFnQmpILEtBQUssb0JBRXZCcW5CLEVBQVFVLFFBQVUsK0JBR2hCbnFCLEVBQU9pSixVQUFVc1csZUFBZ0IsQ0FFZGtLLEVBQVF0Z0IsYUFBYTBqQixXQUFhcEQsRUFBUXBnQixnQkFBZ0J3akIsV0FFekRwRCxFQUFRdGdCLGFBQWEscUJBQ3pDRSxFQUFnQmpILEtBQUssMkJBRWhCcW5CLEVBQVF0Z0IsYUFBYTJqQixrQkFDckJyRCxFQUFRcGdCLGdCQUFnQnlqQixVQUNqQyxDQUVJOXNCLEVBQU93WCwyQkFFVGlTLEVBQVFzRCxXQUFhaGYsTUFBTUMsUUFBUXliLEVBQVFzRCxZQUN2Q3hVLEVBQU16QyxJQUFJLENBQUMyVCxFQUFRc0QsV0FBWSxDQUFDLGVBQWdCLENBQzlDdFIsV0FBWXZELEtBRWQsQ0FBQyxjQUNJbkssTUFBTUMsUUFBUXliLEVBQVFzRCxjQUMvQnRELEVBQVFzRCxXQUFhdEQsRUFBUXNELFdBQVdubUIsT0FDckNvbUIsR0FDQ3hqQixFQUFHdWhCLFNBQVNpQyxFQUFXLENBQ3JCdGpCLEtBQUssRUFDTEMsSUFBSzNKLEVBQU9HLFFBQ1p5SixPQUFRZCxJQUNQekcsT0FBUyxHQUVrQixJQUE5Qm9uQixFQUFRc0QsV0FBVzFxQixlQUNkb25CLEVBQVFzRCxXQUdyQixDQUVLRSxHQUFZeEQsSUFDZnBnQixFQUFnQmpILEtBQUsybUIsSUFFdkIsR0FBSS9vQixFQUFPaUosVUFBVWlrQixJQUFNbHRCLEVBQU84YSxNQUNoQyxJQUFLLE1BQU9wVyxFQUFLeEIsS0FBVXNCLE9BQU9zQyxRQUFRMmlCLEVBQVE5VixTQUMzQixpQkFBVnpRLElBQ1h1bUIsRUFBUTlWLFFBQVFqUCxHQUFPeEIsRUFBTTRHLFdBQVcsWUFBYSxlQVF2RDJmLEVBQVF0Z0IsYUFBYTZmLEtBQ3JCUyxFQUFRcGdCLGdCQUFnQjJmLEtBQ3hCeGtCLE9BQU93TyxPQUFPeVcsRUFBUTlWLFNBQVN0TSxLQUFNNEwsR0FBV0EsR0FBUXJRLFNBQVNvbUIsT0FFakUzZixFQUFnQmpILEtBQUs0bUIsSUFFbkIzRCxHQUFrQnJsQixJQUNwQnFKLEVBQWdCakgsUUFBUXdtQixJQUcxQixNQUFNdUUsRUFBMkI5SCxHQUFrQnJsQixHRjNSOUMsU0FBcUNBLEdBQzFDLE9BQUlBLEVBQU9pSixVQUFVa2IsT0FBU25rQixFQUFPaUosVUFBVTRXLEtBQ3RDLEdBRUw3ZixFQUFPOGEsTUFDRixDQUFDLGlCQUVOOWEsRUFBT2lKLFVBQVVvYixZQUNaLENBQUMsMEJBRUgsQ0FBQyxxQkFBc0Isb0JBQ2hDLENFZ1IrRCtJLENBQTRCcHRCLEdBQVUsU0FpYnJHekMsZUFDRXlDLEVBQ0F5cEIsRUFDQTRELEdBRUEsTUFBTUMsRUFBb0IsSUFBSXRyQixJQUFJcXJCLEdBQzVCRSxRQVdSaHdCLGVBQW1EeUMsR0FDakQsTUFBTXV0QixFQUFtQyxJQUFJdnJCLElBQ3ZDOG9CLFFBQWtCdGhCLEVBQUdDLEtBQUssb0JBQXFCLENBQ25ERSxJQUFLM0osRUFBT0csUUFDWnVKLEtBQUssRUFDTEUsT0FBUWQsSUFHVixJQUFLLE1BQU05SixLQUFZOHJCLEVBQVcsQ0FDaEMsTUFBTTBDLEVBQW1CanVCLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBU25CLEdBQ3RELElBQ0UsTUFBTThHLEVBQVNwRixFQUFHK3NCLDBCQUNoQkQsUUFDTXZ1QixFQUFHQyxTQUFTQyxTQUFTcXVCLEVBQWtCLFNBRS9DLEdBQUkxbkIsRUFBTzlILE1BSVQsT0FIQVMsUUFBUWl2QixLQUNOLG1EQUFtREYsMEJBQXlDRyxHQUFtQjduQixFQUFPOUgsVUFFakgsSUFBSWdFLElBQUl1bUIsSUFFakIsSUFBSyxNQUFNcmxCLEtBQVMwcUIsR0FBMEI5bkIsRUFBTzlGLFFBQThDNnRCLFNBQ2pHLElBQUssTUFBTWpiLEtBQWMyVixJQUNuQnJsQixJQUFVMFAsR0FBYzFQLEVBQU1tTyxXQUFXLEdBQUd1QixRQUM5QzJhLEVBQWlDNWtCLElBQUlpSyxFQUk3QyxDQUFFLE1BQU81VSxHQUlQLE9BSEFTLFFBQVFpdkIsS0FDTixtREFBbURGLHdCQUF1Q3h2QixhQUFpQlcsTUFBUVgsRUFBTThvQixRQUFVam9CLE9BQU9iLE1BRXJJLElBQUlnRSxJQUFJdW1CLEdBQ2pCLENBQ0YsQ0FFQSxPQUFPZ0YsQ0FDVCxDQWhEaURPLENBQW9DOXRCLEdBQ25GLElBQUssTUFBTTRTLEtBQWMyVixHQUN2QixJQUFJK0UsRUFBa0JuckIsSUFBSXlRLEtBQWUyYSxFQUFpQ3ByQixJQUFJeVEsR0FHOUUsSUFBSyxNQUFNa1gsS0FBV0MsR0FBc0JOLEdBQzFDTyxRQUFRQyxlQUFlSCxFQUFTbFgsRUFHdEMsQ0EvYlFtYixDQUFxQy90QixFQUFReXBCLEVBQVMwRCxHQUM1RDlqQixFQUFnQmpILFFBQVErcUIsSUFFcEJudEIsRUFBT3dsQix1QkFBeUJ4bEIsRUFBT3lsQixtQ0FDekNwYyxFQUFnQmpILEtBQUt5bUIsSUFDakI3b0IsRUFBT2lKLFVBQVU0VyxNQUduQnhXLEVBQWdCakgsS0FBSzBtQixJQUVuQjlvQixFQUFPOGEsTUFDVHpSLEVBQWdCakgsS0FBSyxjQUNYcEMsRUFBT2lKLFVBQVVvYixhQUMzQmhiLEVBQWdCakgsS0FBSyxnQkFHckJxbkIsRUFBUXRnQixhQUFhNmtCLE1BQ3JCdkUsRUFBUXBnQixnQkFBZ0Iya0IsTUFDeEJ2RSxFQUFRdGdCLGFBQWEsa0JBQ3JCc2dCLEVBQVFwZ0IsZ0JBQWdCLGtCQUN4Qm9nQixFQUFRdGdCLGFBQWEsWUFDckJzZ0IsRUFBUXBnQixnQkFBZ0IsYUFFeEJBLEVBQWdCakgsS0FBSyxnQkFJekIsR0FBSXBDLEVBQU95b0IscUJBQ1QsTUFBTyxDQUNMdGYsYUFBY0EsRUFBYXZDLE9BQVFxbkIsSUFBU0EsRUFBSXJyQixTQUFTLGtCQUN6RHlHLGdCQUFpQkEsRUFBZ0J6QyxPQUFRcW5CLElBQVNBLEVBQUlyckIsU0FBUyxrQkFDL0RzcEIseUJBSUosTUFBTyxDQUFFL2lCLGVBQWNFLGtCQUFpQjZpQix3QkFDMUMsQ0FwT2tDZ0MsQ0FBNEJsdUIsRUFBUStaLEVBQVkwUCxTQThPbEZsc0IsZUFDRXlDLEVBQ0ErWixFQUNBMFAsRUFDQXdDLEdBRUt4QyxFQUFRbHJCLE9BQ1hrckIsRUFBUWxyQixLQUFPZ0IsRUFBS2liLFNBQVN4YSxFQUFPRyxVQUdsQ0gsRUFBT3dYLDZCQUNUaVMsRUFBUWYsU0FBVSxHQUVmZSxFQUFRMEUsVUFDWDFFLEVBQVEwRSxRQUFVLGVBRWYxRSxFQUFRZixTQUErQixlQUFwQmUsRUFBUTBFLFNBQTRCcFUsRUFBV2EsZUFDckU2TyxFQUFRMkUsZ0JBQWtCLENBQUEsRUFDMUIzRSxFQUFRMkUsY0FBY0MsU0FBVyxVQUVuQyxNQUFPNUcsR0FBU04sR0FBV0MsY0FBY3BuQixFQUFPaWEsWUFBYyxJQUNoRCxnQkFBVndOLEdBQXFDLG1CQUFWQSxJQUM3QmdDLEVBQVFJLE9BQVMsMEJBdUhyQnRzQixlQUNFeUMsRUFDQXlwQixHQUVBLElBQUtqQixHQUFxQ3hvQixHQUFTLE9BRW5ELE1BQU1zdUIsRUFBZ0IvdUIsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLGNBQ25ELElBQUtsQixFQUFHcUIsV0FBV2d1QixHQUFnQixPQUVuQzdFLEVBQVExYyxLQUFPLFNBRWYsTUFBTXdoQixFQUFnQmh2QixFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsZUFDbkQsSUFBS2xCLEVBQUdxQixXQUFXaXVCLEdBQWdCLE9BRW5DOUUsRUFBUWQsTUFBUSxJQUFJLElBQUkzbUIsSUFBSSxJQUFLeW5CLEVBQVFkLE9BQVMsR0FBSyx3QkFJakQ5b0IsRUFBWW1ELElBQUksSUFBTWxFLEVBQU9NLGFBQWFHLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxnQkFBaUJxdUIsSUFDaEcsQ0F4SVFDLENBQXdDenVCLEVBQVF5cEIsR0FDakR6cEIsRUFBT3VYLFNBQVVrUyxFQUFRZixTQUFZZSxFQUFRaUYsT0FFaERqRixFQUFRaUYsS0FBTyxTQU1qQixVQUZPakYsRUFBUWtGLGNBQWMsY0FFeEIzdUIsRUFBT3dYLDJCQUE0QixDQUN0QyxJQUFLeFgsRUFBTzhhLE1BQ1YsR0FBSzlhLEVBQU9zbEIsdUJBQTBCdGxCLEVBQU93bEIsc0JBUzNDaUUsRUFBUTlWLFFBQVEsWUFBYzhWLEVBQVE5VixRQUFRLGFBQWUsc0JBVEssUUFDM0Q4VixFQUFROVYsUUFBUWliLFlBQ2hCbkYsRUFBUTlWLFFBQVEsWUFDdkIsSUFBSyxNQUFNMkMsSUFBYyxDQUFDLFVBQVcsZ0JBQWlCLENBQ3BELE1BQU1yRCxFQUFTd1csRUFBUTlWLFFBQVEyQyxHQUMxQnJELElBQ0x3VyxFQUFROVYsUUFBUTJDLEdBQWNyRCxFQUFPYyxRQUFRLG1DQUFvQyxJQUNuRixDQUNGLENBS0YsR0FBSS9ULEVBQU8rakIsdUJBQXdCLENBQ2pDMEYsRUFBUTlWLFFBQVFpYixLQUFPLGtCQUN2Qm5GLEVBQVE5VixRQUFRLFlBQWMsWUFDOUIsTUFBTWtiLEVBQU8sQ0FBQyxNQUFPLE9BQVEsZUFBZWpvQixPQUFRa29CLEdBQVE3dkIsRUFBR3FCLFdBQVdmLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUzJ1QixLQUNuR0QsRUFBS3hzQixPQUFTLElBQ2hCb25CLEVBQVE5VixRQUFRLGVBQWlCLHNCQUFzQmtiLEVBQUs5ckIsS0FDMUQsb0hBRUYwbUIsRUFBUTlWLFFBQVFvYixPQUFTQyxHQUF3QnZGLEVBQVE5VixRQUFRb2IsT0FBUS91QixHQUU3RSxDQUVBLE1BQU1pdkIsRUFBdUJDLEdBQXdCbHZCLEdBQ3JELEdBQUlpdkIsRUFBc0IsQ0FDWSxtQkFBaEN4RixFQUFROVYsUUFBUTRZLG9CQUNYOUMsRUFBUTlWLFFBQVE0WSxZQUV6QjlDLEVBQVE5VixRQUFRLG1CQUFxQixjQUFjc2IsV0FDNUN4RixFQUFROVYsUUFBUSxVQUFrQyxXQUF6QnNiLEVBQW9DLEtBQU8sa0JBQ3BFeEYsRUFBUTlWLFFBQVEscUJBQ3ZCOFYsRUFBUTlWLFFBQVEsU0FBU3NiLEtBa0pOLE9BbEpzREEsRUFrSnpDLG1CQUM3QiwrSUFsSkgsTUFBTUUsUUFBb0IzbEIsRUFBR0MsS0FBSyxVQUFXLENBQzNDRSxJQUFLM0osRUFBT0csUUFDWnVKLEtBQUssRUFDTEUsT0FBUWQsSUFFSnNtQixFQUFhLElBQUlwdEIsSUFDdkIsSUFBSyxNQUFNcXRCLEtBQWNGLEVBQWEsQ0FDcEMsTUFBT0csRUFBT0MsR0FBVUYsRUFBV3BuQixNQUFNLEtBQ3JDcW5CLEdBQVNDLEdBQ1hILEVBQVd6bUIsSUFBSTJtQixFQUVuQixDQUNBLEdBQUlGLEVBQVc1aUIsS0FBTyxFQUFHLENBQ3ZCLE1BQU1nakIsRUFBYyxJQUFJSixHQUFZcnNCLEtBQUssS0FDbkMwc0IsRUFBZSxHQUFHUixRQUN4QnhGLEVBQVE5VixRQUFRLGVBQ2QsR0FBRzhiLDJCQUFzQ0QsUUFBa0JDLFdBQXNCRCxJQUMvRS9GLEVBQVE5VixRQUFRaWIsS0FDbEJuRixFQUFROVYsUUFBUWliLEtBQU8sR0FBR2EsWUFBdUJELFFBQWtCL0YsRUFBUTlWLFFBQVFpYixRQUVuRm5GLEVBQVE5VixRQUFRaWIsS0FBTyxHQUFHYSxZQUF1QkQsSUFDakQvRixFQUFROVYsUUFBUSxZQUFjLGFBRWhDOFYsRUFBUTlWLFFBQVFvYixPQUFTQyxHQUF3QnZGLEVBQVE5VixRQUFRb2IsT0FBUS91QixHQUN6RWlzQixFQUFrQkMsc0JBQXNCOXBCLEtBQUssUUFBUyxRQUFTLFNBQ2pFLENBQ0YsQ0FDRixFQUVJcEMsRUFBT2lhLFlBQWN3UCxFQUFReFAsY0FDL0J3UCxFQUFReFAsV0FvY1osU0FDRUEsRUFDQXlWLEdBRUEsTUFBTUMsRUFBdUJDLEdBQXFDM1YsR0FDbEUsR0FBSTBWLEVBQ0YsT0FBT0UsR0FBd0NGLEVBQXNCMVYsRUFBWXlWLEdBR25GLE1BQU1JLEVBQStCRixHQUFxQ0YsR0FDMUUsR0FBSUksRUFDRixPQUFPRCxHQUF3Q0MsRUFBOEJKLEdBRy9FLE9BQU96VixDQUNULENBbmR5QjhWLENBQStCL3ZCLEVBQU9pYSxZQUFjd1AsRUFBUXhQLFdBQVl3UCxFQUFReFAsYUFHbkdqYSxFQUFPaUosVUFBVWtiLE1BQ2RzRixFQUFROVYsUUFBUSxhQUFhdEMsV0FBVyxpQkFFakNvWSxFQUFROVYsUUFBUSxZQUFZL1EsU0FBUywyQkFDL0M2bUIsRUFBUTlWLFFBQVEsWUFBYzhWLEVBQVE5VixRQUFRLFlBQVlJLFFBQ3hELGdCQUNBLDJDQUpGMFYsRUFBUTlWLFFBQVEsWUFBYyxnQkFPdkIzVCxFQUFPaUosVUFBVUMsU0FBV3VnQixFQUFROVYsUUFBUSxhQUFhdEMsV0FBVyxxQkFDN0VvWSxFQUFROVYsUUFBUSxZQUFjLG9CQWlCbEMsU0FBdUMzVCxFQUF1QnlwQixHQUM1RCxNQUFNMWxCLEVBQVVraUIsR0FBb0JqbUIsRUFBUXlwQixFQUFROVYsU0FDcEQsSUFBSzVQLEVBQVMsT0FFZCxNQUFNd29CLEVBQWM5QyxFQUFROVYsUUFBUTRZLFlBQy9CQSxFQUVPQSxFQUFZM3BCLFNBQVNtQixLQUMvQjBsQixFQUFROVYsUUFBUTRZLFlBQWMsR0FBR0EsUUFBa0J4b0IsS0FGbkQwbEIsRUFBUTlWLFFBQVE0WSxZQUFjeG9CLENBSWxDLEVBekJFaXNCLENBQThCaHdCLEVBQVF5cEIsR0FFakNBLEVBQVF0Z0IsYUFBYXVoQixpQkFFakJqQixFQUFRcGdCLGdCQUFnQixrQkFFbkMsQ0FyV1E0bUIsQ0FBeUJqd0IsRUFBUStaLEVBQVkwUCxFQUFTd0MsR0FrWjlELFNBQTRDeEMsRUFBOEJ3QyxHQUN4RSxNQUFNaUUsRUFBMEJ6RyxFQUFRdGdCLGFBQ2xDZ25CLEVBQTZCMUcsRUFBUXBnQixnQkFDM0M0aUIsRUFBa0I5aUIsYUFBZWluQixHQUEyQkYsRUFBeUJqRSxFQUFrQjlpQixjQUN2RzhpQixFQUFrQjVpQixnQkFBa0I0aUIsRUFBa0I1aUIsZ0JBQWdCekMsT0FBUXFuQixJQUFTaUMsRUFBd0JqQyxJQUMvR2hDLEVBQWtCNWlCLGdCQUFrQittQixHQUNsQ0QsRUFDQWxFLEVBQWtCNWlCLGdCQUV0QixDQTFaRWduQixDQUFtQzVHLEVBQVN3QyxTQXMvQjlDMXVCLGVBQXFDa3NCLEdBQ25DLE1BQU02RyxFQUFlLElBQUl0dUIsSUFBSSxJQUFJd0MsT0FBT0MsS0FBS2dsQixFQUFRdGdCLGlCQUFrQjNFLE9BQU9DLEtBQUtnbEIsRUFBUXBnQixtQkFDckZrbkIsRUFJQSxDQUNKLENBQUUzWSxZQUFhLG9CQUFxQjRZLEtBQU0sT0FBUXJZLE9BQVEsZ0JBQzFELENBQUVQLFlBQWEsc0JBQXVCNFksS0FBTSxjQUFlclksT0FBUSxnQkFDbkUsQ0FBRVAsWUFBYSw2QkFBOEI0WSxLQUFNLGdCQUFpQnJZLE9BQVEsbUJBQzVFLENBQUVQLFlBQWEscUJBQXNCNFksS0FBTSxRQUFTclksT0FBUSxnQkFDNUQsQ0FBRVAsWUFBYSx5QkFBMEI0WSxLQUFNLFlBQWFyWSxPQUFRLHVCQUdoRXphLFFBQVFvWSxJQUNaeWEsRUFBZ0J0d0IsSUFBSTFDLE9BQVNxYSxjQUFhNFksT0FBTXJZLGFBQzlDLElBQUttWSxFQUFhbnVCLElBQUl5VixJQWU1QixTQUE0QjZSLEVBQXNCN1IsR0FDaEQsT0FBUTZSLEVBQVFwZ0Isa0JBQWtCdU8sSUFBZ0I2UixFQUFRdGdCLGVBQWV5TyxJQUFnQixJQUFJaFYsU0FBUyxZQUN4RyxDQWpCNEM2dEIsQ0FBbUJoSCxFQUFTN1IsR0FBYyxPQUVoRixNQUFNOFksRUFBeUIsaUJBQVh2WSxFQUE0QixrQkFBb0IsZUFFcEU2UixRQUFRQyxlQUFlUixFQUFRaUgsR0FBYzlZLEdBQzdDNlIsRUFBUXRSLEdBQVFQLFNBS3RCcmEsZUFBZ0RpekIsR0FDOUMsTUFBTUcsUUNob0NELFNBQTZCQyxFQUFzQkosR0FDeEQsSUFDRSxNQUVNRyxFQURTakssR0FBeUIsTUFBTyxDQUFDLFlBRGhDLGtCQUFrQmtLLEtBQWdCSixRQUNvQixRQUFTM2UsUUFBUWxJLE9BQzdEMUIsTUFBTSxPQUFPLEdBQ3ZDLElBQUswb0IsRUFDSCxNQUFNLElBQUloeUIsTUFBTSx3QkFBd0JpeUIsS0FBZ0JKLEtBRTFELE9BQU85eUIsUUFBUUMsUUFBUWd6QixFQUN6QixDQUFFLE1BQU8zeUIsR0FDUCxPQUFPTixRQUFRbXpCLE9BQU8sSUFBSWx5QixNQUFNLCtCQUErQml5QixLQUFnQkosTUFBUzN4QixPQUFPYixNQUNqRyxDQUNGLENEb25DMkI4eUIsQ0FBb0IsaUJBQWtCTixHQUMvRCxNQUFPLGlDQUFpQ0EsU0FBWUcsR0FDdEQsQ0FSMkNJLENBQWlDUCxLQUc1RSxDQTdnQ1FRLENBQXNCdkgsR0EyWjlCLFNBQXVDQSxHQUNyQyxJQUFLLE1BQU0va0IsS0FBTzRrQixHQUF1QixDQUN2QyxNQUFNUSxFQUFVTCxFQUFRL2tCLEdBQ3BCb2xCLEdBQTJDLElBQWhDdGxCLE9BQU9DLEtBQUtxbEIsR0FBU3puQixRQUNsQzJuQixRQUFRQyxlQUFlUixFQUFTL2tCLEVBRXBDLENBQ0YsQ0FqYUV1c0IsQ0FBOEJ4SCxHQUUxQnpwQixFQUFPOGEsY0FBYzJPLEVBQVFqWSxxQkFNM0IxUyxFQUFPTSxhQUFhSixFQVE1QixTQUE4QnlxQixHQUc1QixPQUFPcFUsS0FBS0UsVUFBVU4sR0FBZ0J3VSxRQUFVN2pCLEVBQVcsRUFDN0QsQ0Fac0NzckIsQ0FBcUJ6SCxJQUVwREQsSUF5WlAsU0FDRXhwQixFQUNBeXBCLEVBQ0F3QyxFQUNBemEsR0FFQSxNQUFNckksRUFBZThpQixFQUFrQjlpQixhQUFhdkMsT0FBUXFuQixJQUFTeEUsRUFBUXBnQixrQkFBa0I0a0IsSUFDL0ZrRCxHQUF1Qm54QixFQUFRd1IsRUFBZ0JpWSxFQUFRdGdCLGNBQWdCLENBQUEsRUFBSUEsR0FBYyxHQUV6RixNQUFNRSxFQUFrQjRpQixFQUFrQjVpQixnQkFBZ0J6QyxPQUFRcW5CLElBQVN4RSxFQUFRdGdCLGVBQWU4a0IsSUFDbEdrRCxHQUF1Qm54QixFQUFRd1IsRUFBZ0JpWSxFQUFRcGdCLGlCQUFtQixDQUFBLEVBQUlBLEdBQWlCLEdBRS9GLE1BQU00bEIsRUFBdUJDLEdBQXdCbHZCLEdBQ3JELEdBQUlpdkIsR0FBd0JoRCxFQUFrQkMsc0JBQXNCN3BCLE9BQVMsRUFBRyxDQUM5RSxNQUFNOEcsRUFBZSxJQUFJLElBQUluSCxJQUFJaXFCLEVBQWtCQyx3QkFDdEIsV0FBekIrQyxFQUNGL0ksR0FBVSxTQUFVLENBQUMsTUFBTyxVQUFXLFNBQVUvYyxHQUFlbkosRUFBT0csU0FFdkUrbEIsR0FBVSxLQUFNLENBQUMsTUFBTyxXQUFZL2MsR0FBZW5KLEVBQU9HLFFBRTlELENBQ0YsQ0E3YUlpeEIsQ0FBeUJweEIsRUFBUXlwQixFQUFTd0MsRUFBbUJ6YSxHQXVmakUsU0FDRXhSLEVBQ0F3UixFQUNBeFMsR0FFQSxNQUFNcXlCLEVBQW1COXhCLEVBQUsreEIsU0FBU3R4QixFQUFPRyxRQUFTbkIsR0FDdkQsSUFBS3F5QixFQUFrQixPQU9yQm5MLEdBRHFCLFFBQW5CMVUsRUFDUSxPQUVBQSxFQUZRLENBQUMsb0JBQXFCNmYsR0FBbUJyeEIsRUFBT0csUUFJdEUsQ0F2Z0JJb3hCLENBQXNDdnhCLEVBQVF3UixFQUFnQnhTLEdBRWxFLENBOUJVd3lCLENBQUt4eEIsRUFBUStaLEVBQVl5UCxJQUVuQyxDQWtYQSxTQUFTd0YsR0FBd0J5QyxFQUFrQ3p4QixHQUdqRSxNQUFNMHhCLEVBQWUxeEIsRUFBTzhhLE1BQVEsVUFBWSxPQUNoRCxPQUFPMlcsRUFBZSxHQUFHQSxRQUFtQkMsZ0JBQTZCLEdBQUdBLGVBQzlFLENBbUNBLE1BQU1sRCxHQUFvQiwyQ0E4QzFCLFNBQVNVLEdBQXdCbHZCLEdBQy9CLE9BQUlBLEVBQU9ra0Isa0JBQTBCLEtBQ2pDbGtCLEVBQU9pa0Isc0JBQThCLGNBQXpDLENBQ0YsQ0FPQSxTQUFTa04sR0FDUG54QixFQUNBd1IsRUFDQTBlLEVBQ0EvbUIsRUFDQXdvQixHQUVBLEdBQTRCLElBQXhCeG9CLEVBQWE5RyxPQUFjLE9BRS9CLE1BQU11dkIsRUFBdUIsSUFDeEIsSUFBSTV2QixJQUNMbUgsRUFBYWxKLElBQUsyUyxHQVl4QixTQUNFQSxFQUNBaWYsRUFDQXJnQixHQUtBLEdBQXVCLFNBQW5CQSxHQUE2QnFnQixJQUFtQnpILEdBQXlCeUgsR0FDM0UsTUFBTyxHQUFHamYsS0FBY2lmLElBRzFCLE9BQU9DLEdBQXVCbGYsRUFDaEMsQ0F4QlFtZixDQUE4Qm5mLEVBQVlzZCxFQUF3QnRkLEdBQWFwQixNQUlyRjBVLEdBQ0UxVSxFQUNBLENBQUMsU0FBV21nQixFQUFNLENBQUMsTUFBUSxNQUFTM3hCLEVBQU84YSxNQUFRLENBQUMsV0FBYSxNQUFROFcsR0FDekU1eEIsRUFBT0csUUFFWCxDQWlCQSxTQUFTaXdCLEdBQ1BGLEVBQ0EvbUIsR0FFQSxNQUFNNm9CLEVBQWtDLEdBQ3hDLElBQUssTUFBTXBmLEtBQWMsSUFBSTVRLElBQUltSCxHQUFlLENBQzlDLE1BQU04b0IsRUFBaUNDLEdBQ3JDdGYsRUFDQXNkLEVBQXdCdGQsSUFFdEJxZixHQUNGRCxFQUFzQjV2QixLQUFLd1EsR0FHM0JzZCxFQUF3QnRkLEtBQ3ZCcWYsR0FDdUMsTUFBeEMvQixFQUF3QnRkLEtBRzFCc2QsRUFBd0J0ZCxHQUFjeVgsR0FBMkJ6WCxHQUNuRSxDQUNBLE9BQU9vZixDQUNULENBb0tBLFNBQVNyRSxHQUFtQndFLEdBQzFCLE9BQU96eEIsRUFBRzB4Qiw2QkFBNkJELEVBQVdFLFlBQWEsS0FDakUsQ0FFQSxTQUFTekUsR0FBeUIxcUIsR0FDaEMsTUFBcUIsaUJBQVZBLEVBQTJCLENBQUNBLEdBQ2xDNkssTUFBTUMsUUFBUTlLLEdBQ1pBLEVBQU0wRCxPQUFRbUIsR0FBeUMsaUJBQVRBLEdBRG5CLEVBRXBDLENBRUEsU0FBU2dpQixHQUFzQk4sR0FDN0IsT0FBT0gsR0FDSnJwQixJQUFLeUUsR0FBUStrQixFQUFRL2tCLElBQ3JCa0MsT0FBUWtqQixLQUEwREEsRUFDdkUsQ0FFQSxTQUFTTyxHQUEyQnpYLEdBQ2xDLE1BQU0wZixFQUFnQmpKLEdBQTZCM2dCLElBQUlrSyxHQUN2RCxHQUFJMGYsRUFBZSxPQUFPQSxFQUUxQixNQUFNbkksRUFLUixTQUFxQ3ZYLEdBR25DLE9BQ0U4VCxHQUNFLE1BQ0EsQ0FBQyxPQUFRb0wsR0FBdUJsZixHQUFhLFVBQVcsc0JBQ3hEZixRQUFRbEksUUFDTCxHQUVULENBZmtCNG9CLENBQTRCM2YsR0FFNUMsT0FEQXlXLEdBQTZCaGhCLElBQUl1SyxFQUFZdVgsR0FDdENBLENBQ1QsQ0FjQSxTQUFTMkgsR0FBdUJsZixHQUM5QixPQUFPQSxJQUFlaVcsR0FBeUIsR0FBR2pXLFNBQW9CQSxDQUN4RSxDQWdCQSxTQUFTc1ksR0FDUHpCLEVBQ0F6cEIsRUFDQTRTLEdBRUEsUUFBSzRWLEdBQXFDeG9CLE9BQ3RDeXBCLEVBQVFFLGlCQUFpQi9XLElBSVAsa0JBQWZBLEtBQW9DNlcsRUFBUUUsaUJBQWlCNkksT0FDdEUsQ0F5QkEsU0FBU04sR0FBc0N0ZixFQUFvQmlmLEdBQ2pFLE9BQUtBLElBQ2tCLE1BQW5CQSxNQUNBekgsR0FBeUJ5SCxLQUlaLG9CQUFmamYsR0FDQUEsSUFBZW9XLElBQ2ZKLEdBQVdobUIsU0FBU2dRLElBQ3BCQSxJQUFlaVcsS0FFbkIsQ0FFQSxTQUFTdUIsR0FBeUJELEdBQ2hDLE9BQU9BLEVBQVE5WSxXQUFXLGFBQzVCLENBbUJBLFNBQVN1ZSxHQUFxQzNWLEdBQzVDLEdBQTBCLGlCQUFmQSxFQUF5QixDQUNsQyxJQUFLQSxFQUFXNUksV0FBVyxXQUFZLE9BRXZDLE1BQU9vVyxFQUFPK0ksR0FBUXJKLEdBQVdDLGNBQWNuTixHQUMvQyxJQUFLd04sSUFBVStJLEVBQU0sT0FDckIsTUFBTywwQkFBMEIvSSxLQUFTK0ksT0FDNUMsQ0FFQSxNQUFNaUMsRUFBZ0J4WSxHQUFZalcsSUFDbEMsR0FBNkIsaUJBQWxCeXVCLEVBQTRCLE9BRXZDLE1BQU1DLEVBQVUsa0VBQWtFQyxLQUFLRixHQUN2RixJQUFLQyxFQUFTLE9BRWQsTUFBTSxDQUFHakwsRUFBTytJLEdBQVFrQyxFQUN4QixNQUFPLDBCQUEwQmpMLEtBQVMrSSxPQUM1QyxDQUVBLFNBQVNYLEdBQ1ArQyxFQUNBM1ksRUFDQXlWLEdBU0EsTUFBTyxJQU5pQixpQkFBZnpWLEVBQ0hBLEVBQzhCLGlCQUF2QnlWLEVBQ0xBLE9BQ0E5cEIsRUFJTm1ILEtBQU0sTUFDTi9JLElBQUs0dUIsRUFFVCxDQUVPLFNBQVN0SCxHQUFnQnRyQixFQUF1QjZ5QixHQUNyRCxHQUFJN3lCLEVBQU84YSxNQUFPLENBQ2hCLE1BQU1nWSxFQUFlOXlCLEVBQU93bEIsdUJBQXlCeGxCLEVBQU95bEIsZ0NBQ3REOVIsRUFBa0MsQ0FDdEMsbUJBQW9CLHVDQUNwQixlQUFnQixrQkFDaEJvZixRQUFTLG1DQUNUaEUsT0FBUSw2QkFDUkgsS0FBTSxvQkFDTixXQUFZLDBCQUNaeHBCLEtBQU0sY0FDTjR0QixVQUFXLHlCQUNYQyxPQUFRLHNCQUNSLGNBQWUsOEJBUWpCLE9BTkFDLEdBQXFCbHpCLEVBQVEyVCxFQUFTa2YsRUFBWSxDQUFDLFFBQVMsTUFBTyxRQUFTLE9BQVEsY0FDL0VDLEVBRU05eUIsRUFBT2lKLFVBQVVrcUIsVUFDMUJ4ZixFQUFRcWYsV0FBYSxzQkFGZHJmLEVBQVFxZixVQUlWcmYsQ0FDVCxDQUFPLENBQ0wsTUFBTW1mLEVBQWU5eUIsRUFBT3dsQix1QkFBeUJ4bEIsRUFBT3lsQixnQ0FDdEQyTixFQUFZL04sR0FBa0JybEIsR0FDOUJtc0IsRUFBVXpHLEdBQWdCMWxCLEdBQzFCcXpCLEVBQVVSLEVBQVd6dEIsS0FDM0IsSUFBSXVPLEVBQWtDLENBQ3BDLG1CQUFvQixpQ0FDcEIsZUFBZ0Isd0VBQ2hCb2YsUUFBUywrQkFDVGhFLE9BQVF1RSxHQUFxQkYsRUFBV2pILEdBQ3hDeUMsS0FBTSwyQ0FDTixXQUFZLGtCQUNaLGNBQWUscUVBQ2ZvRSxVQUFXLGlCQWdEYixPQTlDSTdHLElBQ0Z4WSxFQUFRNlgsU0FBVyxpRkFBaUYvSixHQUFXTSxhQUFhaGYsS0FBSyxxQ0FFL0gvQyxFQUFPd1gsNEJBQ1Q3RCxFQUFVNEUsRUFDUixJQUFLNUUsR0FDTCxDQUNFb2IsT0FBUSxHQUFHcGIsRUFBUW9iLDBFQUNuQkgsS0FBTSw4REFDTixXQUFZLGtFQUdaeHBCLEtBQU0sc0VBQ040dEIsVUFBVyxxRUFHWDdHLElBQ0Z4WSxFQUFRNlgsU0FBVyxpRkFBaUYvSixHQUFXTSxhQUFhaGYsS0FDMUgsd0RBR0svQyxFQUFPaUosVUFBVWtxQixVQUMxQnhmLEVBQVFxZixVQUFZcmYsRUFBUXFmLFVBQVksR0FBR3JmLEVBQVFxZixnQkFBa0IsR0FDckVyZixFQUFRcWYsV0FBYSxXQUVuQkssR0FBU3p3QixTQUFTLGFBQ3BCK1EsRUFBUXZPLEtBQU9pdUIsR0FFWkQsV0FDSXpmLEVBQVEsc0JBQ1JBLEVBQVFpYixZQUNSamIsRUFBUSxhQUVabWYsRUFFTTl5QixFQUFPaUosVUFBVWlrQixLQUMxQnZaLEVBQVFxZixVQUFZLHVCQUZicmYsRUFBUXFmLFVBSWIvRixHQUFZanRCLEVBQU9vSixjQUNyQnVLLEVBQVFzZixPQUFTSixFQUFXSSxRQUFVLHdFQUN0Q3RmLEVBQVEsZUFBaUJrZixFQUFXLGdCQUFrQix1QkFFdERsZixFQUFRc2YsT0FBUyxZQUNqQnRmLEVBQVEsZUFBaUIsb0JBRTNCdWYsR0FBcUJsekIsRUFBUTJULEVBQVNrZixFQUFZLENBQUMsUUFBUyxNQUFPLFFBQVMsT0FBUSxjQUM3RWxmLENBQ1QsQ0FDRixDQUVBLFNBQVNzWixHQUFZN2pCLEdBQ25CLE9BQU9BLEdBQWE3SyxPQUFTd3FCLEVBQy9CLENBRUEsU0FBU21LLEdBQ1BsekIsRUFDQTJULEVBQ0FrZixFQUNBamYsR0FFQSxJQUFLLE1BQU1yVixLQUFRcVYsRUFDWjJmLEdBQVl2ekIsRUFBUXpCLEtBQ3JCaTFCLEdBQThCeHpCLEVBQVF6QixNQUN0Q3MwQixFQUFXdDBCLElBQVVrMUIsR0FBd0JaLEVBQVd0MEIsR0FBT0EsSUFBV0EsS0FBUW9WLEtBQ3RGQSxFQUFRcFYsR0FBUSxZQUFZQSxLQUVoQyxDQUVBLFNBQVNnMUIsR0FBWXZ6QixFQUF1QnpCLEdBQzFDLE9BQU9pRyxPQUFPc0wsT0FBTzlQLEVBQU8wekIsVUFBV24xQixFQUN6QyxDQUVBLFNBQVNpMUIsR0FBOEJ4ekIsRUFBdUJ6QixHQUM1RCxNQUFNbzFCLEVBQU8zekIsRUFBTzB6QixVQUFVbjFCLEdBQzlCLElBQUtvMUIsRUFBTSxPQUFPLEVBRWxCLE1BRHdCLENBQUMsTUFBTyxPQUFRLE1BQU8sUUFDeEJ0c0IsS0FBTW1LLElBQzNCLFdBQUlvaUIsT0FBTy8wQixPQUFPZzFCLEdBQUcsS0FBS3JpQixrQkFRUnRPLEVBUm9EM0UsRUFTakUyRSxFQUFNNEcsV0FBVyxzQkFBdUJqTCxPQUFPZzFCLEdBQUcsNkJBVDRDLEtBQUt6dUIsS0FBS3V1QixHQVFqSCxJQUFzQnp3QixHQU50QixDQUVBLFNBQVN1d0IsR0FBd0J4Z0IsRUFBaUIxVSxHQUNoRCxPQUFPMFUsSUFBVyxZQUFZMVUsR0FDaEMsQ0FNQSxTQUFTKzBCLEdBQXFCRixFQUFvQmpILEdBQ2hELE1BQU0ySCxFQUFXLENBQUMscUJBT2xCLE9BTklWLEdBQ0ZVLEVBQVMxeEIsS0FBSyxvQkFFWitwQixHQUNGMkgsRUFBUzF4QixLQUFLLGlCQUVUMHhCLEVBQVMvd0IsS0FBSyxPQUN2QixDRTdoQ0EsTUFBTWd4QixHQUFxRCxDQUN6REMsYUFBYyxhQUNkLGFBQWMsQ0FDWjNhLEtBQU0sQ0FDSixDQUNFOWEsS0FBTSxVQUNOMFUsT0FBUSxhQUNSOFMsT0FBUSxVQUlkLFdBQVksQ0FDVjFNLEtBQU0sQ0FDSixDQUNFOWEsS0FBTSxRQUNOMFUsT0FBUSxXQUNSOFMsT0FBUSxXQU1Wa08sR0FBb0QsQ0FDeEQ1YSxLQUFNLENBQ0osQ0FDRTlhLEtBQU0sVUFDTmtMLEtBQU0sR0FDTnpHLElBQUssR0FDTGt4QixhQUFhLEdBRWYsQ0FDRTMxQixLQUFNLG1CQUNOa0wsS0FBTSxtQkFDTnpHLElBQUsscVVBVVRyRCxVQUtJZ1UsR0FDTywwTUFVWGhVLE9BR0twQyxlQUFlNDJCLEdBQW9DbjBCLEdBQ3hELE9BQU8zQixFQUFPQywwQkFBMEIsc0NBQXVDZixnQkFLakZBLGVBQW9CeUMsR0FDbEIsTUFBTUcsRUFBVVosRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLGFBQ3ZDaTBCLEVBQWU3MEIsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLFVBQzVDazBCLEVBQWNwMUIsRUFBR3FCLFdBQVc4ekIsSUFDNUJ4RixLQUFFQSxHQUFTdEQsR0FBZ0J0ckIsRUFBUSxJQUNuQ3MwQixFQUFzQyxJQUN2Q1AsR0FDSCxhQUFjLENBQ1oxYSxLQUFNa2IsR0FBaUJ2MEIsS0FHdEI0dUIsVUFDSTBGLEVBQVMsa0JBRVo1MkIsUUFBUW9ZLElBQUksQ0FDaEI3VyxFQUFHQyxTQUFTVSxVQUNWTCxFQUFLd0QsS0FBSy9DLEVBQU9HLFFBQVMsZ0JBQzFCb2IsRUFBSzRCLEtBQUttWCxFQUFVLENBQ2xCbFgsV0FBVyxFQUNYQyxjQUFjLEVBQ2RDLE9BQVEsQ0FDTixTQUFVLFlBSWhCcmUsRUFBR0MsU0FBU2dZLEdBQUcvVyxFQUFTLENBQUVpYSxPQUFPLEVBQU0zYSxXQUFXLE1BRWhENDBCLFVBQ0kzMkIsUUFBUW9ZLElBQUksQ0FDaEI3VyxFQUFHQyxTQUFTZ1ksR0FBR2tkLEVBQWMsQ0FBRWhhLE9BQU8sRUFBTTNhLFdBQVcsSUFDdkRSLEVBQUdDLFNBQVNnWSxHQUFHM1gsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLGlCQUFrQixDQUFFaWEsT0FBTyxNQUV6RThMLEdBQVUsTUFBTyxDQUFDLFNBQVUsVUFBVyxrQkFBbUJsbUIsRUFBT0csVUFHbkUsR0FBSXl1QixFQUFNLENBQ1IsTUFBTTRGLEVBYVYsU0FBMEJ4MEIsR0FDeEIsSUFBSXkwQixFQUlGQSxFQUhFejBCLEVBQU84YSxNQUdLLG9CQUVBOWEsRUFBT2lKLFVBQVVpa0IsR0FBSyxlQUFpQixnQkFFdkQsTUFBTXdILEVBQW1CLEdBQUdELFlBRTVCLEdBQUl6MEIsRUFBT2lhLFlBQVk1SSxXQUFXLDBCQUNoQyxNQUFPLGdVQVVUcWpCLE1BQ0EvMEIsT0FFQSxPQUFPKzBCLENBQ1QsQ0F2Q29CQyxDQUFpQjMwQixHQUNqQ2YsRUFBRzIxQixVQUFVcjFCLEVBQUt3RCxLQUFLNUMsRUFBUyxZQUFhLENBQUVWLFdBQVcsVUFDcERSLEVBQUdDLFNBQVNVLFVBQVVMLEVBQUt3RCxLQUFLNUMsRUFBUyxXQUFZLFlBQWFxMEIsRUFBVSxLQUFNLENBQ3RGSyxLQUFNLEtBRVYsQ0FDQSxNQUFNQyxFQUFtQixHQUFHbmhCLFNBOEo5QixTQUFtQzNULEdBQ2pDLE1BQU0rMEIsRUFBOEIsR0FDcEMsR0FBSS8wQixFQUFPZzFCLG1CQUFvQixDQUM3QixNQUFNQyxFQUFzQnAyQixPQUFPZzFCLEdBQUcseURBQ3RDa0IsRUFBa0IzeUIsS0FBS3ZELE9BQU9nMUIsR0FBRyxtQkFBbUJvQixvQkFDdEQsQ0FDQSxNQUFNQyxFQUFpQmwxQixFQUFPOGEsTUFBUSxjQUFnQixPQUNoRHFhLEVBQWtCbjFCLEVBQU9pSixVQUFVa2IsT0FBU25rQixFQUFPaUosVUFBVTRXLEtBQU8sbUJBQXFCLEdBQy9Ga1YsRUFBa0IzeUIsS0FBS3ZELE9BQU9nMUIsR0FBRyxtQ0FBbUNxQixJQUFpQkMsTUFDakZuMUIsRUFBT2lrQix1QkFDVDhRLEVBQWtCM3lCLEtBQUt2RCxPQUFPZzFCLEdBQUcsa0RBRS9CN3pCLEVBQU9ra0IsbUJBQ1Q2USxFQUFrQjN5QixLQUFLdkQsT0FBT2cxQixHQUFHLGdEQUUvQjd6QixFQUFPaUosVUFBVWtiLE1BQ25CNFEsRUFBa0IzeUIsS0FDaEJ2RCxPQUFPZzFCLEdBQUcsbUZBQ1ZoMUIsT0FBT2cxQixHQUFHLDZFQUNWaDFCLE9BQU9nMUIsR0FBRyxzRUFFSDd6QixFQUFPaUosVUFBVUMsUUFDMUI2ckIsRUFBa0IzeUIsS0FDaEJ2RCxPQUFPZzFCLEdBQUcsNkhBQ1ZoMUIsT0FBT2cxQixHQUFHLHdIQUdkLE1BQU11QixFQUFtQm5QLEdBQW9Cam1CLEVBQVFBLEVBQU9vSixhQUFhdUssU0FDckV5aEIsR0FFRkwsRUFBa0IzeUIsS0FBS3ZELE9BQU9nMUIsR0FBRyx5Q0FBeUN1QixNQUU1RSxPQUFPTCxDQUNULENBL0xzRE0sQ0FBMEJyMUIsR0FBUStDLEtBQUssVUFDM0Y5RCxFQUFHMjFCLFVBQVVyMUIsRUFBS3dELEtBQUs1QyxFQUFTLGNBQWUsQ0FBRVYsV0FBVyxVQUN0RFIsRUFBR0MsU0FBU1UsVUFBVUwsRUFBSzVCLFFBQVF3QyxFQUFTLGFBQWMsY0FBZTIwQixFQUFrQixDQUMvRkQsS0FBTSxLQUVWLENBbkRVckQsQ0FBS3h4QixJQUVmLENBK0VBLFNBQVN1MEIsR0FBaUJ2MEIsR0FDeEIsT0FBT2kwQixHQUFrQjVhLEtBQUtwWixJQUFLNmIsR0FDcEIsWUFBYkEsRUFBSXZkLEtBQ0EsSUFDS3VkLEVBQ0hyUyxLQUFNNnJCLEdBQWdCdDFCLEdBQ3RCZ0QsSUFBS3V5QixHQUFrQnYxQixJQUV6QjhiLEVBRVIsQ0FFQSxTQUFTd1osR0FBZ0J0MUIsR0FHdkIsTUFBTXcxQixFQUNKeDFCLEVBQU84YSxPQUFTOWEsRUFBT2lKLFVBQVVpa0IsSUFBTXhILEdBQWdCMWxCLEdBQVUsSUFBSXloQixHQUFXTSxjQUFnQixHQUM5RnNELEdBQWtCcmxCLElBQ3BCdzFCLEVBQW9CcHpCLFFBQVFxZixHQUFXSyxTQUFVTCxHQUFXSSxTQUUxRDdoQixFQUFPaWtCLHVCQUF5QmprQixFQUFPa2tCLG9CQUN6Q3NSLEVBQW9CcHpCLEtBQUssTUFFdkJwQyxFQUFPK2pCLHdCQUNUeVIsRUFBb0JwekIsS0FBSyxRQUczQixNQUFPLFNBRG9CLElBQUksSUFBSUosSUFBSXd6QixJQUFzQmpuQixXQUMxQnhMLEtBQUssT0FDMUMsQ0FFQSxTQUFTd3lCLEdBQWtCdjFCLEdBQ3pCLEdBOEVGLFNBQTZCQSxHQUMzQixJQUFLQSxFQUFPdVgsT0FBUSxPQUFPLEVBRTNCLE1BQU1rZSxFQUF5QmwyQixFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsV0FBWSxLQUFNLGdCQUM5RSxJQUFLbEIsRUFBR3FCLFdBQVdtMUIsR0FBeUIsT0FBTyxFQUVuRCxJQUVFLE1BQTRCLG9CQURScGdCLEtBQUtDLE1BQU1yVyxFQUFHZ2hCLGFBQWF3VixFQUF3QixTQUNwRGwzQixJQUNyQixDQUFFLE1BQ0EsT0FBTyxDQUNULENBQ0YsQ0ExRk1tM0IsQ0FBb0IxMUIsR0FDdEIsT0FBT25CLE9BQU9nMUIsR0FBRzs7O0VBR25CbDBCLE9BSUEsTUFBTWcyQixFQUF5QnRRLEdBQWtCcmxCLElBQVcwbEIsR0FBZ0IxbEIsR0FDNUUsSUFBS0EsRUFBTzhhLE9BQVM5YSxFQUFPaUosVUFBVWlrQixLQUFPeUksRUFDM0MsTUFBTyxpR0FFVDMxQixFQUFPOGEsTUFBUSxlQUFpQixvREFDaENuYixPQUdBLE1BQU1pMkIsRUFBZ0JuVSxHQUFXSSxPQUFPNWhCLElBQUsrbEIsR0FBY25uQixPQUFPZzFCLEdBQUcsS0FBSzdOLE1BQWNqakIsS0FBSyxLQUN2Rjh5QixFQUFlcFUsR0FBV0ssTUFBTTdoQixJQUFLK2xCLEdBQWNubkIsT0FBT2cxQixHQUFHLEtBQUs3TixNQUFjampCLEtBQUssS0FDckYreUIsRUFBa0JyVSxHQUFXTSxhQUFhOWhCLElBQUsrbEIsR0FBY25uQixPQUFPZzFCLEdBQUcsS0FBSzdOLE1BQWNqakIsS0FBSyxLQUMvRnF3QixFQUFZL04sR0FBa0JybEIsR0FDOUJtc0IsRUFBVXpHLEdBQWdCMWxCLEdBRWhDLE9BQU9uQixPQUFPZzFCLEdBQUc7O0VBRWpCVCxFQUFZdjBCLE9BQU9nMUIsR0FBRyw0REFBNEQrQixnQkFBOEI7RUFDaEh4QyxFQUFZdjBCLE9BQU9nMUIsR0FBRywyREFBMkRnQyxtREFBZ0U7RUFDakoxSixFQUFVdHRCLE9BQU9nMUIsR0FBRyw4REFBOERpQyxnQkFBZ0M7O0VBRWxIQyxHQUF3Qi8xQixHQUFVbkIsT0FBT2cxQixHQUFHLDJFQUE2RTtFQUN6SDd6QixFQUFPK2pCLHVCQUF5QmxsQixPQUFPZzFCLEdBQUcscUpBQXVKOztFQUdqTVQsRUFDSXYwQixPQUFPZzFCLEdBQUc7Ozs7RUFLVjtFQUdKMUgsRUFDSXR0QixPQUFPZzFCLEdBQUc7O0lBR1Y7RUFHSlQsRUFDSXYwQixPQUFPZzFCLEdBQUc7Ozs7RUFLVjs7OztFQU1Ka0MsR0FBd0IvMUIsR0FDcEIsc0NBQ0ZnMkIsR0FBZ0JoMkIsNERBQ2hCZzJCLEdBQWdCaDJCLDZCQUNoQmcyQixHQUFnQmgyQiw4QkFFZDtFQUdKQSxFQUFPK2pCLHVCQUNILCtEQUdBO0VBRUpwa0IsTUFDRixDQW1EQSxTQUFTbzJCLEdBQXdCLzFCLEdBQy9CLE9BQU9BLEVBQU9pa0IsdUJBQXlCamtCLEVBQU9ra0IsaUJBQ2hELENBRUEsU0FBUzhSLEdBQWdCaDJCLEdBQ3ZCLE9BQU9BLEVBQU9ra0Isa0JBQW9CLFNBQVcsWUFDL0MsQ0NwVk8zbUIsZUFBZTA0QixHQUFxQmoyQixHQUN6QyxPQUFPM0IsRUFBT0MsMEJBQTBCLHVCQUF3QmYsZ0JBQ3hERyxRQUFRb1ksSUFBSSxDQUNoQmpXLEVBQVltRCxJQUFJLElBQU0vRCxFQUFHQyxTQUFTZ1ksR0FBRyxHQUFHbFgsRUFBT0csNEJBQTZCLENBQUVpYSxPQUFPLEtBQ3JGdmEsRUFBWW1ELElBQUksSUFBTS9ELEVBQUdDLFNBQVNnWSxHQUFHLEdBQUdsWCxFQUFPRywyQkFBNEIsQ0FBRWlhLE9BQU8sS0FDcEZ2YSxFQUFZbUQsSUFBSSxJQUFNL0QsRUFBR0MsU0FBU2dZLEdBQUcsR0FBR2xYLEVBQU9HLDZCQUE4QixDQUFFaWEsT0FBTyxRQUc1RixDQ0hPLFNBQVM4YixHQUEyQjcyQixHQUN6QyxPQUFPQSxHQUFTTSxNQUNsQixDQ0hPcEMsZUFBZTQ0QixHQUFvQm4yQixHQUN4QyxPQUFPM0IsRUFBT0MsMEJBQTBCLHNCQUF1QmYsVUFDN0QsTUFBTTY0QixFQUF1QjcyQixFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsaUJBQ3BEbkIsRUFBV08sRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLG1CQUN4QzZmLFFBQXdCbGhCLEVBQU9DLHNCQUFzQkMsR0FDckRxM0IsRURYSCxTQUFtQ240QixHQUN4QyxNQUFPLHVCQUF1QkEsRUFBUTBaLDJDQUl4QyxDQ2dCUzBlLENBQTBCLENBQy9CMWUsWUFBYSw4QkFWUDFZLEVBQVcsQ0FBQ1csRUFBWW1ELElBQUksSUFBTS9ELEVBQUdDLFNBQVNnWSxHQUFHa2YsRUFBc0IsQ0FBRWhjLE9BQU8sTUFDbEY4YixHQUEyQmxXLEtBQXFCa1csR0FBMkJHLElBQzdFbjNCLEVBQVNrRCxLQUFLdkMsRUFBWW1ELElBQUksSUFBTWxFLEVBQU9NLGFBQWFKLEVBQVVxM0IsV0FFOUQzNEIsUUFBUW9ZLElBQUk1VyxJQUV0QixDQ1RPM0IsZUFBZWc1QixHQUFxQnYyQixFQUF1QncyQixHQUNoRSxPQUFPbjRCLEVBQU9DLDBCQUEwQix1QkFBd0JmLFVBRzlELE1BQU1rNUIsRUFBc0NqTyxHQUFxQ3hvQixHQUMzRWhCLEVBQVdPLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxvQkFDeEM2ZixRQUF3QmxoQixFQUFPQyxzQkFBc0JDLEdBQ3JEcTNCLEVBQ0pJLEdBQXVDelcsRUFDbkNBLEVBNEJWLFNBQ0VoZ0IsRUFDQWdnQixFQUNBaGhCLEdBRUEsTUFBTXEzQixFQU9DLEdBQUdLLEdBQWdCLE9BQVEsMERBRWxDQSxHQUFnQixTQUFVLDhCQVIxQixPQUFLMVcsR0FZUCxTQUEwQjNnQixHQUN4QixPQUFPQSxFQUFRdUQsU0FBUyt6QixHQUFlLFVBQVl0M0IsRUFBUXVELFNBQVMrekIsR0FBZSxVQUNyRixDQWJNQyxDQUFpQjVXLEdBZXZCLFNBQThCQSxFQUF5QnFXLEVBQXdCcjNCLEdBQzdFLElBQUlLLEVBQVUyZ0IsRUFDZCxJQUFLLE1BQU02VyxJQUFhLENBQUMsT0FBUSxVQUF1QyxDQUN0RSxNQUFNQyxFQUFjQyxHQUFvQlYsRUFBZ0JRLEdBQ3hELElBQUtDLEVBQWEsU0FFbEIsTUFBTUUsRUFBY0MsR0FBb0I1M0IsRUFBU3czQixFQUFXQyxHQUM1RCxJQUFLRSxFQUVILE9BREF2NEIsUUFBUWl2QixLQUFLLCtCQUErQm1KLDZCQUFxQzczQixLQUMxRWdoQixFQUVUM2dCLEVBQVUyM0IsQ0FDWixDQUNBLE9BQU8zM0IsQ0FDVCxDQTdCZ0Q2M0IsQ0FBcUJsWCxFQUFpQnFXLEVBQWdCcjNCLEdBRHZFcTNCLENBRy9CLENBcENVYyxDQUFrQ24zQixFQUFRZ2dCLEVBQWlCaGhCLEdBRTNERSxFQUE0QixHQUM3QnUzQixHQUNIdjNCLEVBQVNrRCxLQUNQdkMsRUFBWW1ELElBQUksSUFBTS9ELEVBQUdDLFNBQVNnWSxHQUFHM1gsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLGtCQUFtQixDQUFFaWEsT0FBTyxLQUM5RnZhLEVBQVltRCxJQUFJLElBQU0vRCxFQUFHQyxTQUFTZ1ksR0FBRzNYLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxjQUFlLENBQUVpYSxPQUFPLEtBQzFGdmEsRUFBWW1ELElBQUksSUFBTS9ELEVBQUdDLFNBQVNnWSxHQUFHM1gsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLGVBQWdCLENBQUVpYSxPQUFPLEtBQzNGdmEsRUFBWW1ELElBQUksSUFBTS9ELEVBQUdDLFNBQVNnWSxHQUFHM1gsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLGFBQWMsQ0FBRWlhLE9BQU8sS0FDekZ2YSxFQUFZbUQsSUFBSSxJQUFNL0QsRUFBR0MsU0FBU2dZLEdBQUczWCxFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsaUJBQWtCLENBQUVpYSxPQUFPLEtBQzdGdmEsRUFBWW1ELElBQUksSUFBTS9ELEVBQUdDLFNBQVNnWSxHQUFHM1gsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLGdCQUFpQixDQUFFaWEsT0FBTyxLQUM1RnZhLEVBQVltRCxJQUFJLElBQU0vRCxFQUFHQyxTQUFTZ1ksR0FBRzNYLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxrQkFBbUIsQ0FBRWlhLE9BQU8sS0FDOUZ2YSxFQUFZbUQsSUFBSSxJQUFNL0QsRUFBR0MsU0FBU2dZLEdBQUczWCxFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsa0JBQW1CLENBQUVpYSxPQUFPLEtBQzlGdmEsRUFBWW1ELElBQUksSUFBTS9ELEVBQUdDLFNBQVNnWSxHQUFHM1gsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLGlCQUFrQixDQUFFaWEsT0FBTyxLQUM3RnZhLEVBQVltRCxJQUFJLElBQU0vRCxFQUFHQyxTQUFTZ1ksR0FBRzNYLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxxQkFBc0IsQ0FBRWlhLE9BQU8sS0FDakd2YSxFQUFZbUQsSUFBSSxJQUFNL0QsRUFBR0MsU0FBU2dZLEdBQUczWCxFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsb0JBQXFCLENBQUVpYSxPQUFPLEtBQ2hHdmEsRUFBWW1ELElBQUksSUFBTS9ELEVBQUdDLFNBQVNnWSxHQUFHM1gsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLHFCQUFzQixDQUFFaWEsT0FBTyxLQUNqR3ZhLEVBQVltRCxJQUFJLElBQU0vRCxFQUFHQyxTQUFTZ1ksR0FBRzNYLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxvQkFBcUIsQ0FBRWlhLE9BQU8sTUFHaEc4YixHQUEyQmxXLEtBQXFCa1csR0FBMkJHLElBQzdFbjNCLEVBQVNrRCxLQUFLdkMsRUFBWW1ELElBQUksSUFBTWxFLEVBQU9NLGFBQWFKLEVBQVVxM0IsV0FFOUQzNEIsUUFBUW9ZLElBQUk1VyxJQUV0QixDQXdDQSxTQUFTNjNCLEdBQW9CMTNCLEVBQWlCdzNCLEdBQzVDLE9BQU9PLEdBQXNCUCxHQUFXbEUsS0FBS3R6QixLQUFXLEVBQzFELENBRUEsU0FBUzQzQixHQUFvQjUzQixFQUFpQnczQixFQUE0QkMsR0FDeEUsTUFBTU8sRUFBVUQsR0FBc0JQLEdBQ3RDLEdBQUtRLEVBQVFqeUIsS0FBSy9GLEdBQ2xCLE9BQU9BLEVBQVEwVSxRQUFRc2pCLEVBQVNQLEVBQ2xDLENBRUEsU0FBU00sR0FBc0JQLEdBQzdCLE9BQU8sSUFBSWpELE9BQU8sR0FBRzBELEdBQWFYLEdBQWVFLGdCQUF3QlMsR0FBYUMsR0FBYVYsTUFDckcsQ0FFQSxTQUFTSCxHQUFnQkcsRUFBNEJ4M0IsR0FDbkQsTUFBTyxHQUFHczNCLEdBQWVFLE9BQ3pCeDNCLE1BQ0FrNEIsR0FBYVYsSUFDZixDQUVBLFNBQVNGLEdBQWVFLEdBQ3RCLE1BQU8sd0JBQXdCQSxHQUNqQyxDQUVBLFNBQVNVLEdBQWFWLEdBQ3BCLE1BQU8sc0JBQXNCQSxHQUMvQixDQUVBLFNBQVNTLEdBQWFwMEIsR0FDcEIsT0FBT0EsRUFBTTRHLFdBQVcsc0JBQXVCakwsT0FBT2cxQixHQUFHLE1BQzNELENDL0ZPdDJCLGVBQWVpNkIsR0FBdUJ4M0IsR0FDM0MsT0FBTzNCLEVBQU9DLDBCQUEwQix5QkFBMEJmLFVBQ2hFLE1BQU15QixFQUFXTyxFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsbUJBQzlDLElBQUt1bEIsR0FBZ0IxbEIsR0FFbkIsa0JBRE1ILEVBQVltRCxJQUFJLElBQU0vRCxFQUFHQyxTQUFTZ1ksR0FBR2xZLEVBQVUsQ0FBRW9iLE9BQU8sS0FHaEUsTUFBTS9hLFFBQWlCUCxFQUFPQyxzQkFBc0JDLElBQWMsR0FDNUR5a0IsRUFBa0I1QyxHQUFlSyxtQkFBbUI3aEIsR0FDcERxa0IsRUFBa0I3QyxHQUFlTyxtQkFBbUIvaEIsR0FFcERvNEIsRUFBb0JsNEIsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLGNBQ2pEdTNCLFFBQTBCN1csR0FBZUUsK0JBQStCMFcsSUFBdUIsR0FFckcsSUFBSUUsRUFBb0IsR0FDcEIzM0IsRUFBTytqQix5QkFDVDRULEVBQW9CLCtEQU90QixNQUFNNzBCLEVBQWEyZ0IsRUFwQ0QsZ0hBb0NtQ2tVLEVBQW9CRCxFQUFtQmhVLFFBQ3RGN2pCLEVBQVltRCxJQUFJLElBQU1sRSxFQUFPTSxhQUFhSixFQUFVOEQsS0FFOUQsQ0N0Q0EsTUFBTTJtQixHQUFVLENBQ2RtTyxTQUFVLElBQ1ZDLEtBQU0sU0FHRHQ2QixlQUFldTZCLEdBQTBCOTNCLEdBQzlDLE9BQU8zQixFQUFPQywwQkFBMEIsNEJBQTZCZixVQUNuRSxJQUFJOGQsRUFBc0JSLGdCQUFnQjRPLElBQzFDLE1BQU16cUIsRUFBV08sRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLHNCQUM5QyxJQUNFLE1BQU1JLFFBQW1CdEIsRUFBR0MsU0FBU0MsU0FBU0gsRUFBVSxRQUNsRHNjLEVBQWNqRyxLQUFLQyxNQUFNL1UsR0FDL0I4YSxFQUFjOUMsRUFBTXpDLElBQUksQ0FBQ3VGLEVBQWFDLEVBQWFELEdBQWMsQ0FBRUksV0FBWTFELElBQ2pGLENBQUUsTUFDQSxDQUVGLE1BQU1qVixFQUFhdVMsS0FBS0UsVUFBVThGLE9BQWF6VixFQUFXLFNBQ3BEL0YsRUFBWW1ELElBQUksSUFBTWxFLEVBQU9NLGFBQWFKLEVBQVU4RCxLQUU5RCxDQ25CT3ZGLGVBQWV3NkIsR0FBZS8zQixHQUNuQyxPQUFPM0IsRUFBT0MsMEJBQTBCLGlCQUFrQmYsVUFDeEQsTUFBTXlCLEVBQVdPLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxhQUM5QyxJQUFJMkMsUUFBbUI3RCxFQUFHQyxTQUFTQyxTQUFTSCxFQUFVLFFBRWxEQyxFQUFHcUIsV0FBV2YsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLHNCQUM3QzJDLEVBQWFrMUIsR0FBWWwxQixFQVI3QiwwS0FXRSxNQUFNbVgsRUFBYWphLEVBQU9pYSxZQUFZdFgsTUFBTTNDLEVBQU9pYSxXQUFXL1AsUUFBUSxLQUFPLEdBQ3ZFZ1EsRUFBZ0IzYSxFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsVUFBVyxhQUN4RDgzQixFQUFZaDVCLEVBQUdxQixXQUFXNFosR0FBaUJqYixFQUFHaTVCLFlBQVloZSxHQUFpQixHQUNqRixJQUFLLE1BQU1oVixLQUFZK3lCLEVBQVcsQ0FDaEMsSUFBSy95QixFQUFTbU0sV0FBVyxVQUFZbk0sRUFBU21NLFdBQVcsVUFBVyxTQUVwRSxJQUFJOG1CLEVBQVlqekIsRUFHaEIsR0FGQWl6QixHQUFhQSxFQUFVLElBQU0sSUFBSUMsY0FBZ0JELEVBQVV4MUIsTUFBTSxFQUFHdzFCLEVBQVVqdUIsUUFBUSxNQUN0Rml1QixFQUFZQSxFQUFVcGtCLFFBQVEsSUFBSyxNQUM5QmtHLEVBQVksU0FDakIsTUFBTXBGLEVBQVEsTUFBTXNqQix5QkFBaUNsZSx1QkFBZ0MvVSxvQ0FBMkMrVSx1QkFBZ0MvVSxLQUM1SmpHLEVBQUdxQixXQUFXZixFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMscUJBQXFCK0UsUUFDbEVwQyxFQUFhdTFCLEdBQXlCdjFCLEVBQVlxMUIsRUFBV2p6QixHQUM3RHBDLEVBQWFrMUIsR0FBWWwxQixFQUFZK1IsR0FFekMsT0FFTWhWLEVBQVltRCxJQUFJLElBQU1sRSxFQUFPTSxhQUFhSixFQUFVOEQsS0FFOUQsQ0FFTyxTQUFTazFCLEdBQVlNLEVBQWdCempCLEdBRTFDeWpCLEVBQVNBLEVBQU92a0IsUUFBUWMsRUFBTyxJQUFJL0ssV0FBVyxXQUFZLFFBRTFELElBQUssSUFBSXl1QixFQUFJLEVBQUdBLEVBQUlELEVBQU9qMkIsT0FBUWsyQixJQUNqQyxHQUFzQixPQUFsQkQsRUFBT0MsRUFBSSxJQUE2QixPQUFkRCxFQUFPQyxHQUFhLENBQ2hELE1BQU1uYSxFQUFTa2EsRUFBTzMxQixNQUFNLEVBQUc0MUIsRUFBSSxHQUNuQyxJQUFJbGEsRUFBUWlhLEVBQU8zMUIsTUFBTTQxQixFQUFJLEdBSTdCLE9BSEtsYSxFQUFNaE4sV0FBVyxNQUFTZ04sRUFBTWhOLFdBQVcsT0FDOUNnTixFQUFRLEtBQUtBLEtBRVIsR0FBR0QsSUFBU3ZKLE1BQVV3SixHQUMvQixDQUVGLE1BQU8sR0FBR2lhLE1BQVd6akIsS0FDdkIsQ0FFTyxTQUFTd2pCLEdBQXlCQyxFQUFnQkgsRUFBbUJqekIsR0FDMUUsTUFBTXN6QixFQUFtQmxCLEdBQWFhLEdBQ2hDTSxFQUFrQm5CLEdBQWFweUIsR0FDckMsT0FBT296QixFQUNKeHVCLFdBQ0MsSUFBSThwQixPQUNGLzBCLE9BQU9nMUIsR0FBRyxRQUFRMkUsZ0VBQStFQyw2RUFBMkZBLFNBQzVMLE1BRUYsSUFFRDN1QixXQUFXLFdBQVksT0FDNUIsQ0FFQSxTQUFTd3RCLEdBQWFwMEIsR0FDcEIsT0FBT0EsRUFBTTRHLFdBQVcsc0JBQXVCakwsT0FBT2cxQixHQUFHLE1BQzNELENDL0RPdDJCLGVBQWVtN0IsR0FBa0IzZSxHQUN0QyxPQUFPMWIsRUFBT0MsMEJBQTBCLG9CQUFxQmYsVUFDM0QsTUFBTXlCLEVBQVdPLEVBQUs1QixRQUFRb2MsRUFBVzVaLFFBQVMsbUJBQ2xELElBQUtsQixFQUFHcUIsV0FBV3RCLEdBQVcsT0FFOUIsTUFBTXMxQixFQUFXamYsS0FBS0MsWUFBWXJXLEVBQUdDLFNBQVNDLFNBQVNILEVBQVUsU0FHM0QyNUIsRUFBVXJFLEVBQVNxRSxTQUFXLEdBQ3BDLElBQUssSUFBSUosRUFBSSxFQUFHQSxFQUFJSSxFQUFRdDJCLE9BQVFrMkIsSUFBSyxDQUN2QyxNQUFNSyxFQUFjRCxFQUFRSixHQUN0QnZxQixFQUFVRCxNQUFNQyxRQUFRNHFCLEdBQ3hCQyxFQUFTN3FCLEVBQVU0cUIsRUFBWSxHQUFLQSxFQUNwQzdWLEVBQWEvVSxHQUFXNHFCLEVBQVksSUFBTyxDQUFBLEVBQ2xDLHNDQUFYQyxFQUNGRixFQUFRSixHQUFLLENBQ1gsb0NBQ0FoZ0IsRUFBTXpDLElBQ0osQ0FDRWlOLEVBQ0EsQ0FDRStWLE9BQVEsd0JBR1osQ0FBRXJkLFdBQVkxRCxNQUdFLDZCQUFYOGdCLElBQ1RGLEVBQVFKLEdBQUssQ0FDWCwyQkFDQWhnQixFQUFNekMsSUFDSixDQUNFaU4sRUFDQSxDQUVFZ1cseUJBQXlCLEVBQ3pCQyxzQkFBc0IsRUFDdEJDLE9BQVEsQ0FBQyx1QkFDVEMsZUFBZ0IsQ0FBQyx5QkFHckIsQ0FBRXpkLFdBQVkxRCxNQUl0QixDQUNBLE1BQU1qVixFQUFhdVMsS0FBS0UsVUFBVStlLE9BQVUxdUIsRUFBVyxTQUNqRC9GLEVBQVltRCxJQUFJLElBQU1sRSxFQUFPTSxhQUFhSixFQUFVOEQsS0FFOUQsQ0NqREEsTUFBTTJtQixHQUFVLENBQ2QwUCxRQUFTLG9EQUNUdEwsUUFBUyxDQUFDLDBEQUtMdHdCLGVBQWU2N0IsR0FBcUJwNUIsR0FDekMsT0FBTzNCLEVBQU9DLDBCQUEwQix1QkFBd0JmLFVBQzlELElBQUk4ZCxFQUFjUixnQkFBZ0I0TyxJQUNsQyxNQUFNenFCLEVBQVdPLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxpQkFDOUMsR0FBSWxCLEVBQUdxQixXQUFXLEdBQUd0QixNQUVuQixPQUVGLElBQ0UsTUFBTXVCLFFBQW1CdEIsRUFBR0MsU0FBU0MsU0FBU0gsRUFBVSxRQUNsRHNjLEVBQWNqRyxLQUFLQyxNQUFNL1UsR0FDL0I4YSxFQUFjOUMsRUFBTXpDLElBQUksQ0FBQ3VGLEVBQWFDLEVBQWFELEdBQWMsQ0FDL0RJLFdBQVkxRCxLQUVkc0QsRUFBWXdTLFFBQVV4UyxFQUFZd1MsUUFBUWpuQixPQUFRbUIsR0FBMEIsaUJBQVRBLEVBQ3JFLENBQUUsTUFDQSxDQUlFL0gsRUFBT2lKLFVBQVVrYixRQUNuQjlJLEVBQVlnZSxlQUFpQixHQUUxQmhlLEVBQVlnZSxhQUFhaHlCLEtBQU1peUIsR0FDOUJBLEVBQUtDLG1CQUFtQjMyQixTQUFTLFVBR25DeVksRUFBWWdlLGFBQWFqM0IsS0FBSyxDQUFFbTNCLGtCQUFtQixDQUFDLFFBQVNDLFNBQVMsV0FJcEUzNUIsRUFBWW1ELElBQUksSUFBTS9ELEVBQUdDLFNBQVNnWSxHQUFHM1gsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLGVBQWdCLENBQUVpYSxPQUFPLFdBQzNGdmEsRUFBWW1ELElBQUksSUFBTS9ELEVBQUdDLFNBQVNnWSxHQUFHM1gsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLG9CQUFxQixDQUFFaWEsT0FBTyxLQUN0RyxNQUFNdFgsRUFBYXVTLEtBQUtFLFVBQVU4RixPQUFhelYsRUFBVyxTQUNwRC9GLEVBQVltRCxJQUFJLElBQU1sRSxFQUFPTSxhQUFhSixFQUFVOEQsS0FFOUQsQ0NoRE92RixlQUFlazhCLEdBQW1CMWYsR0FDdkMsT0FBTzFiLEVBQU9DLDBCQUEwQixxQkFBc0JmLGdCQUd0REcsUUFBUW9ZLElBQUksQ0FDaEI3VyxFQUFHaVksR0FBRzNYLEVBQUs1QixRQUFRb2MsRUFBVzVaLFFBQVMsV0FBWSxDQUNqRGlhLE9BQU8sRUFDUDNhLFdBQVcsSUFFYlIsRUFBR2lZLEdBQUczWCxFQUFLNUIsUUFBUW9jLEVBQVc1WixRQUFTLFdBQVksQ0FDakRpYSxPQUFPLEVBQ1AzYSxXQUFXLElBRWJSLEVBQUdpWSxHQUFHM1gsRUFBSzVCLFFBQVFvYyxFQUFXNVosUUFBUyxvQkFBcUIsQ0FDMURpYSxPQUFPLE9BSWYsQ0NWQSxNQUFNc2YsR0FBYyxDQUNsQkMsZ0JBQWlCLENBQ2ZDLGNBQWMsRUFDZEMsMEJBQTBCLEVBQzFCQyw4QkFBOEIsRUFDOUJDLGlCQUFpQixFQUNqQkMsbUJBQW1CLEVBQ25CQyxlQUFlLEVBQ2ZDLFFBQVEsR0FFVkMsUUFBUyxDQUFDLDJCQUE0QixpQkFDdENDLFFBQVMsQ0FDUCxjQUNBLHlCQUNBLDBCQUNBLHNCQUNBLHVCQUNBLGVBQ0EsV0FDQSxjQUlFQyxHQUFhLENBQ2pCVixnQkFBaUIsQ0FDZkMsY0FBYyxFQUNkQywwQkFBMEIsRUFDMUJDLDhCQUE4QixFQUM5QkMsaUJBQWlCLEVBQ2pCQyxtQkFBbUIsRUFDbkJDLGVBQWUsRUFDZkMsUUFBUSxHQUVWQyxRQUFTLENBQUMsaUJBR1ZDLFFBQVMsQ0FBQyxjQUFlLGVBQWdCLFdBQVksY0FHaEQ3OEIsZUFBZSs4QixHQUFpQnQ2QixHQUNyQyxPQUFPM0IsRUFBT0MsMEJBQTBCLG1CQUFvQmYsVUFDMUQsR0FBSXlDLEVBQU9pSixVQUFVa2IsT0FBU25rQixFQUFPaUosVUFBVTRXLEtBRTdDLGtCQStFTnRpQixlQUFtRHlDLEdBQ2pELE1BQU1oQixFQUFXTyxFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsaUJBQzlDLElBQ0UsTUFBTW0wQixFQUFXamYsS0FBS0MsWUFBWXJXLEVBQUdDLFNBQVNDLFNBQVNILEVBQVUsVUFVckUsU0FBNkMyNkIsR0FDM0MsSUFBS0EsRUFBaUIsT0FFaUIsU0FBckNBLEVBQWdCWSxrQkFDcUIsU0FBckNaLEVBQWdCWSxrQkFDcUIsV0FBckNaLEVBQWdCWSx1QkFDcUIzMEIsSUFBckMrekIsRUFBZ0JZLG1CQUloQlosRUFBZ0JZLGlCQUFtQixVQUV2QyxDQXJCSUMsQ0FBb0NsRyxFQUFTcUYsaUJBdUJqRCxTQUEwQ0EsR0FDeEMsSUFBS0EsRUFBaUIsT0FNdEIsVUFET0EsRUFBZ0JjLFNBQ2xCZCxFQUFnQnBsQixNQUFPLE9BRTVCLElBQUssTUFBT21tQixFQUFPQyxLQUFZbjJCLE9BQU9zQyxRQUFRNnlCLEVBQWdCcGxCLE9BQzVEb2xCLEVBQWdCcGxCLE1BQU1tbUIsR0FBU0UsR0FBMEJELEVBRTdELENBbENJRSxDQUFpQ3ZHLEVBQVNxRix1QkFDcEM5NUIsRUFBWW1ELElBQUksSUFBTWxFLEVBQU9NLGFBQWFKLEVBQVVxVyxLQUFLRSxVQUFVK2UsT0FBVTF1QixFQUFXLElBQ2hHLENBQUUsTUFFQSxDQUVKLENBM0ZZazFCLENBQW9DOTZCLEdBSTVDLElBQUlxYixFQUFjUixnQkFBZ0I3YSxFQUFPdVgsT0FBU21pQixHQUFjVyxJQUNoRSxNQUFNVSxFQWlPVixTQUEyQi82QixHQUN6QixNQUFNZzdCLEVBQVksSUFBSWg1QixJQUNoQm1ILEVBQWUsSUFDaEJuSixFQUFPb0osYUFBYUQsZ0JBQ3BCbkosRUFBT29KLGFBQWFDLGlCQUdyQnJKLEVBQU84YSxNQUNUa2dCLEVBQVVyeUIsSUFBSSxPQUNKM0ksRUFBT2lKLFVBQVVvYixhQUMzQjJXLEVBQVVyeUIsSUFBSSxTQUdkUSxFQUFhNmtCLE1BQ2I3a0IsRUFBYSxrQkFDYkEsRUFBYSwyQkFDYkEsRUFBYSxhQUViNnhCLEVBQVVyeUIsSUFBSSxRQUVaUSxFQUFhOHhCLFFBQ2ZELEVBQVVyeUIsSUFBSSxrQkFFWlEsRUFBYSt4QixPQUNmRixFQUFVcnlCLElBQUksU0FFWlEsRUFBYWd5QixTQUNmSCxFQUFVcnlCLElBQUksV0FHaEIsTUFBTyxJQUFJcXlCLEVBQ2IsQ0FoUTJCSSxDQUFrQnA3QixHQUN6Q3FiLEVBQVl3UyxRZnJEVCxTQUE0Qjd0QixHQUNqQyxPQUFJQSxFQUFPOGEsTUFDRiw4QkFFTDlhLEVBQU9pSixVQUFVb2IsWUFDWix1Q0FFRixDQUFDLG1DQUFvQyxrQ0FDOUMsQ2U2QzBCZ1gsQ0FBbUJyN0IsR0FDekNxYixFQUFZc2Usa0JBQW9CLENBQUEsRUFDaEN0ZSxFQUFZc2UsZ0JBQWdCMkIsUUF3SGhDLFNBQW9CdDdCLEdBQ2xCLE9BQUlBLEVBQU91WCxPQUFlLElBQ25CdFksRUFBR3FCLFdBQVdmLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxLQUFNLEtBQU0saUJBQW1CLFFBQVUsR0FDN0YsQ0EzSDBDbzdCLENBQVd2N0IsR0FDN0MrNkIsRUFBZTE0QixPQUFTLElBQzFCZ1osRUFBWXNlLGdCQUFrQixJQUFLdGUsRUFBWXNlLGdCQUFpQi9mLE1BQU9taEIsSUFFcEUvNkIsRUFBT3c3QixxQkFBd0J4N0IsRUFBT3k3Qiw4QkFFL0J6N0IsRUFBTzhhLE9BQVU5YSxFQUFPaUosVUFBVW9iLGNBQzVDaEosRUFBWXNlLGdCQUFrQixJQUFLdGUsRUFBWXNlLGdCQUFpQitCLElBQUsscUJBRjlEcmdCLEVBQVlzZSxpQkFBaUIrQixJQUlsQzE3QixFQUFPdVgsU0FBV3ZYLEVBQU93WCw2QkFDM0I2RCxFQUFZK2UsUUFBVS9lLEVBQVkrZSxTQUFTeHpCLE9BQVF6RyxJQUFxQkEsRUFBUWtSLFdBQVcsZ0JBQzNGZ0ssRUFBWThlLFFBQVU5ZSxFQUFZOGUsU0FBU3Z6QixPQUFRekcsSUFBcUJBLEVBQVFrUixXQUFXLGlCQUV6RnJSLEVBQU9pSixVQUFVQyxRQTJIekIsU0FBd0JvckIsRUFBd0JuMEIsR0FDOUNtMEIsRUFBUzhGLFVBQVksR0FDaEI5RixFQUFTOEYsUUFBUXgzQixTQUFTekMsSUFDN0JtMEIsRUFBUzhGLFFBQVFoNEIsS0FBS2pDLEVBRTFCLENBN0hNdzdCLENBQWV0Z0IsRUFBYSxlQUc5QixNQUFNcmMsRUFBV08sRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLGlCQUM5QyxJQUNFLE1BQU02ZixRQUF3Qi9nQixFQUFHQyxTQUFTQyxTQUFTSCxFQUFVLFFBQ3ZEc2MsRUFBY2pHLEtBQUtDLE1BQU0wSyxHQUN6QjRiLEdBNkhrQjE0QixFQTdIbUJvWSxFQUFZcWUsaUJBQWlCL2YsTUE4SHZELGlCQUFWMVcsRUFBMkIsQ0FBQ0EsR0FDbEM2SyxNQUFNQyxRQUFROUssR0FDWkEsRUFBTTBELE9BQVFtQixHQUF5QyxpQkFBVEEsR0FEbkIsSUE5SHhCOHpCLEVBc0xaLFNBQ0VsQyxHQUVBLE1BQU1tQyxFQUFjLENBQUEsRUFJcEIsSUFBSyxNQUFNcDNCLElBQU8sQ0FBQyxjQUFlLGlCQUFrQixhQUF1QixDQUN6RSxNQUFNeEIsRUFBUXkyQixJQUFrQmoxQixRQUNsQmtCLElBQVYxQyxJQUNGNDRCLEVBQVlwM0IsR0FBT3hCLEVBRXZCLENBQ0EsT0FBTzQ0QixDQUNULENBcE1tQ0MsQ0FBeUJ6Z0IsRUFBWXFlLGlCQUNsRXRlLEVBQVl3UyxRQW9HbEIsU0FDRW1PLEVBQ0FDLEdBRUEsTUFBTUMsRUFBZ0IsSUFBSUMsR0FBaUJILE1BQXNCRyxHQUFpQkYsSUFDNUVHLEVBQWdCLElBQUksSUFBSXA2QixJQUFJazZCLElBQ2xDLE9BQTZCLElBQXpCRSxFQUFjLzVCLFlBQWMsRUFDSCxJQUF6Qis1QixFQUFjLzVCLE9BQXFCKzVCLEVBQWMsR0FDOUNBLENBQ1QsQ0E3RzRCQyxDQUFxQmhoQixFQUFZd1MsUUFBU3ZTLEVBQVl1UyxnQkFDckV2UyxFQUFZdVMsZUFDWnZTLEVBQVlxZSxpQkFBaUIrQixJQUNwQ3JnQixFQUFjOUMsRUFBTXpDLElBQUksQ0FBQ3VGLEVBQWFDLEVBQWFELEdBQWMsQ0FBRUksV0FBWXZELEtBQy9FbUQsRUFBWStlLFFBQVUvZSxFQUFZK2UsU0FBU3h6QixPQUN4Q3pHLElBQ0VBLEVBQVF5QyxTQUFTLFlBQWN6QyxFQUFReUMsU0FBUyxnQkFBa0J6QyxFQUFReUMsU0FBUyxXQUV4RnlZLEVBQVlzZSxrQkFBb0IsQ0FBQSxFQU9oQ3RlLEVBQVlzZSxnQkFBa0IsSUFBS3RlLEVBQVlzZSxtQkFBb0JrQyxHQXVJekUsU0FBNENsQyxHQUMxQyxJQUFLQSxFQUFpQixPQUN0QixJQUErQixJQUEzQkEsRUFBZ0JPLFNBQTRELElBQXhDUCxFQUFnQjJDLG9CQUE4QixPQUl0RjNDLEVBQWdCNEMsaUNBQWtDLENBQ3BELENBN0lNQyxDQUFtQ25oQixFQUFZc2UsaUJBRS9DLE1BQU04QyxFQUFjLElBQUksSUFBSXo2QixJQUFJLElBQUkwNkIsR0FBb0JkLEVBQWViLE1BQW9CQSxLQUN2RjBCLEVBQVlwNkIsT0FBUyxFQUN2QmdaLEVBQVlzZSxnQkFBZ0IvZixNQUFRNmlCLFNBRTdCcGhCLEVBQVlzZSxnQkFBZ0IvZixNQUVYbWhCLEVBNEdiMXpCLEtBQU1zMUIsR0FBMEIsWUFBYkEsR0FBMEJBLEVBQVMvNUIsU0FBUyxjQTNHbkV5WSxFQUFZc2UsZ0JBQWdCaUQsU0FFdkMsQ0FBRSxNQUNBLENBcUdOLElBTjhCMTVCLEVBN0YxQnNWLEdBQVM2QyxHQUNUQSxFQUFZK2UsU0FBU2x2QixjQUVkbVEsRUFBWXNlLGlCQUFpQmtELDhCQUk3QnhoQixFQUFZc2UsaUJBQWlCYyxRQTBIeEMsU0FDRWQsRUFDQTM1QixHQUVBLElBQUsyNUIsRUFBaUIsT0FLaUIsU0FBckNBLEVBQWdCWSxrQkFDcUIsU0FBckNaLEVBQWdCWSxrQkFDcUIsV0FBckNaLEVBQWdCWSx5QkFFVFosRUFBZ0JZLGlCQUV6QixHQUFJdjZCLEVBQU84YSxPQUFTOWEsRUFBT2lKLFVBQVVvYixhQUEwQyxXQUEzQnNWLEVBQWdCbUQsT0FBcUIsY0FJbEZuRCxFQUFnQm1ELE1BQ3pCLENBN0lJQyxDQUEyQjFoQixFQUFZc2UsZ0JBQWlCMzVCLEdBQ3BEQSxFQUFPaUosVUFBVW9iLG9CQUNaaEosRUFBWXNlLGlCQUFpQnFELHFCQUV0QyxNQUFNbDZCLEVBQWF1UyxLQUFLRSxVQUFVOEYsT0FBYXpWLEVBQVcsU0FDcEQvRixFQUFZbUQsSUFBSSxJQUFNbEUsRUFBT00sYUFBYUosRUFBVThELEtBRTlELENBMkNBLFNBQVM4M0IsR0FBMEJELEdBQ2pDLE9BQU9BLEVBQVExNkIsSUFBS2tZLEdBQ2RBLEVBQU85RyxXQUFXLE9BQVM4RyxFQUFPOUcsV0FBVyxRQUFVOVIsRUFBSzA5QixXQUFXOWtCLEdBQWdCQSxFQUNwRixLQUFLQSxJQUVoQixDQXlCQSxTQUFTZ2tCLEdBQWlCajVCLEdBQ3hCLE9BQUtBLEVBQ0U2SyxNQUFNQyxRQUFROUssR0FBU0EsRUFBUSxDQUFDQSxHQURwQixFQUVyQixDQWNBLFNBQVN3NUIsR0FBb0JkLEVBQXlCYixHQUNwRCxNQUFNbUMsRUFBbUIsSUFBSWw3QixJQUFJKzRCLEdBQ2pDLE9BQU9hLEVBQWNoMUIsT0FBUSsxQixLQVMvQixTQUFtQ0EsR0FDakMsTUFBb0IsWUFBYkEsR0FBdUMsU0FBYkEsR0FBb0MsVUFBYkEsR0FBcUMsbUJBQWJBLENBQ2xGLENBUFFRLENBQTBCUixLQUFjTyxFQUFpQi82QixJQUFJdzZCLElBR3JFLENDOU5BLE1BQU1TLEdBQXNCLENBQzFCLHFCQUNBLDJCQUNBLHFCQUNBLFlBQ0EsYUFDQSxjQUdLNy9CLGVBQWU4L0IsR0FBdUJyOUIsR0FDM0MsT0FBTzNCLEVBQU9DLDBCQUEwQix5QkFBMEJmLFVBQ2hFLElBQ0UsTUFBTXlCLEVBQVdPLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxVQUFXLGlCQUNuRDZmLFFBQXdCL2dCLEVBQUdDLFNBQVNDLFNBQVNILEVBQVUsUUFDN0QsSUFBSXMxQixFQUFXamYsS0FBS0MsTUFBTTBLLEdBQzFCLElBQUssTUFBTXNkLEtBQXNCRixHQUMvQjlJLEVBQVcvYixFQUFNekMsSUFBSSxDQUFDd2UsRUFBVWlKLEdBQWVELE1BRTdDdDlCLEVBQU9pa0IsdUJBQXlCamtCLEVBQU9ra0IscUJBQ3pDb1EsRUFBVy9iLEVBQU16QyxJQUFJLENBQUN3ZSxFQUFVaUosR0FBZSxrQkFFN0N2OUIsRUFBT2lKLFVBQVU0VyxPQUNuQnlVLEVBQVcvYixFQUFNekMsSUFBSSxDQUFDd2UsRUFBVWlKLEdBQWUsa0JBSTdDLDZCQUE4QmpKLFVBQ3pCQSxFQUFTLDRCQUVkLHdCQUF5QkEsVUFDcEJBLEVBQVMsdUJBRWxCOWIsR0FBUzhiLEdBQ1QsTUFBTXh4QixFQUFhdVMsS0FBS0UsVUFBVStlLE9BQVUxdUIsRUFBVyxTQUNqRC9GLEVBQVltRCxJQUFJLElBQU1sRSxFQUFPTSxhQUFhSixFQUFVOEQsR0FDNUQsQ0FBRSxNQUNBLEdBR04sQ0FFQSxTQUFTeTZCLEdBQWVELEdBQ3RCLE1BQU8sQ0FDTCx1QkFBd0IsQ0FDdEJBLENBQUNBLElBQXFCLEdBRzVCLENDN0JPLy9CLGVBQWVpZ0MsR0FBa0J4OUIsR0FDdEMsT0FBTzNCLEVBQU9DLDBCQUEwQixvQkFBcUJmLFVBQzNELE1BQU1rZ0MsRUFBZ0JsK0IsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLGVBQ25ELEdBQUlILEVBQU84YSxNQVFULGFBUE1qYixFQUFZbUQsSUFBSSxJQUFNL0QsRUFBR0MsU0FBU2dZLEdBQUd1bUIsRUFBZSxDQUFFcmpCLE9BQU8sV0FDN0R2YSxFQUFZbUQsSUFBSSxJQUNwQi9ELEVBQUdDLFNBQVNnWSxHQUFHM1gsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLFNBQVUsQ0FBRWlhLE9BQU8sRUFBTTNhLFdBQVcsZ0JBRTVFSSxFQUFZbUQsSUFBSSxJQUNwQi9ELEVBQUdDLFNBQVNnWSxHQUFHM1gsRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLGFBQWMsQ0FBRWlhLE9BQU8sRUFBTTNhLFdBQVcsS0FLeEYsTUFBTW95QixFQUFpQm5MLEdBQXlCLE9BQVEsQ0FBQyxhQUFjMW1CLEVBQU9HLFNBQ3hFdTlCLEVBbUZILFNBQTBCOWxCLEVBQXFCelgsR0FDcEQsT0FBT3VtQixHQUF5QixNQUFPLENBQUMsT0FBUTlPLEVBQWEsV0FBWXpYLElBQVksT0FDdkYsQ0FyRjBCdzlCLENBQWlCLGVBQWdCMzlCLEVBQU9HLFVBdUZsRSxTQUF3Qnk5QixFQUFvQkMsR0FDMUMsTUFBTUMsRUFBa0JDLEVBQU9DLE1BQU1KLEdBQ3JDLFFBQUtFLEdBRUVDLEVBQU9FLEdBQUdILEVBQWlCQyxFQUFPQyxNQUFNSCxJQUFlLFFBQ2hFLEVBM0ZRSyxDQUFlUixFQUFlN0wsSUFDaEMzTCxHQUFVLE9BQVEsQ0FBQyxNQUFPLFVBQVd3WCxHQUFnQjE5QixFQUFPRyxRQUFTLEdBR3ZFLE1BQU1nK0IsRUFBZTUrQixFQUFLd0QsS0FBSy9DLEVBQU9HLFFBQVMsUUFBUyxrQkFDbERsQixFQUFHQyxTQUFTSSxNQUFNNitCLEVBQWMsQ0FBRTErQixXQUFXLElBQ25ELElBQUssTUFBTXdlLFdBQWNoZixFQUFHQyxTQUFTd1gsUUFBUXluQixHQUN2Q2xnQixFQUFLNU0sV0FBVyxXQUFhNE0sRUFBSzVNLFdBQVcsUUFBUXFzQixhQUNqRDc5QixFQUFZbUQsSUFBSSxJQUFNL0QsRUFBR0MsU0FBU2dZLEdBQUczWCxFQUFLd0QsS0FBS283QixFQUFjbGdCLEtBS3ZFLE1BQU1tZ0IsRUFBYTcrQixFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsaUJBQzFDTixFQUFZbUQsSUFBSSxJQUFNL0QsRUFBR0MsU0FBU2dZLEdBQUdrbkIsRUFBWSxDQUFFaGtCLE9BQU8sS0FFaEUsSUFBSWthLEVBQVcsQ0FBQSxFQUNmLElBQ0VBLEVBQVkvWSxFQUFLQyxXQUFXdmMsRUFBR0MsU0FBU0MsU0FBU3MrQixFQUFlLFVBQXFDbkosQ0FDdkcsQ0FBRSxNQUNBLENBRUZBLEVBQVMrSix5QkFBMkIsR0FDcEMvSixFQUFTZ0ssV0FBYSxlQUN0QmhLLEVBQVNpSyxPQUFTLG1CQUNsQmpLLEVBQVNrSyxrQkFBb0IsS0FDN0JsSyxFQUFTbUssd0JBQTBCLENBRWpDLDBDQUNBLDZDQUVGbkssRUFBU29LLHVCQUF5QixDQUVoQyxjQUNBLGlCQUNBLG9CQUNBLGdCQUNBLFdBQ0EsY0FDQSxtQkFJQSxPQUNBLFVBQ0EsZ0JBQ0EsV0FDQSxZQUNBLHFCQUNBLFFBQ0EsU0FDQSxrQkFDQSxRQUNBLG9CQUVLcEssRUFBU3FLLGlCQUNnQyxJQUE1Q3JLLEVBQVNzSyx3QkFBd0J2OEIsZUFDNUJpeUIsRUFBU3NLLHVCQUdsQnRLLEVBQVN1SyxtQkFBb0IsRUFDN0IsTUFBTUMsRUFBaUJ4SyxFQUFTcUUsU0FBU3QyQixRQUFVLEVBRW5ELEdBREFpeUIsRUFBU3FFLFFBQVVyRSxFQUFTcUUsU0FBUy94QixPQUFRdkcsR0FBaUIsZ0NBQVhBLEVBQUVkLE9BQTJDLEdBQzVGKzBCLEVBQVNxRSxRQUFRdDJCLFNBQVd5OEIsRUFBZ0IsQ0FDOUMsTUFBTUMsRUFBYXgvQixFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsUUFBUyxVQUFXLHVCQUM5RE4sRUFBWW1ELElBQUksSUFBTS9ELEVBQUdDLFNBQVNnWSxHQUFHNm5CLEVBQVksQ0FBRTNrQixPQUFPLElBQ2xFLENBQ2dDLElBQTVCa2EsRUFBU3FFLFFBQVF0MkIsZUFDWml5QixFQUFTcUUsY0FFWjE1QixFQUFHQyxTQUFTVSxVQUFVNjlCLEVBQWVsaUIsRUFBSzRCLEtBQUttWCxFQUFVLENBQUVsWCxXQUFXLEtBRTVFOEksR0FBVSxPQUFRLENBQUMsTUFBTyw0QkFBNkJsbUIsRUFBT0csU0FFOUQrbEIsR0FBVSxPQUlQLFNBQStCL2xCLEVBQWlCczlCLEdBQ3JELE1BQU8sQ0FBQyxNQUFPLFdBQVksY0FBZSxVQUFXbCtCLEVBQUsreEIsU0FBU254QixFQUFTczlCLEdBQzlFLENBTnNCdUIsQ0FBc0JoL0IsRUFBT0csUUFBU3M5QixHQUFnQno5QixFQUFPRyxVQUVuRixDQ25ITzVDLGVBQWUwaEMsR0FBWWovQixHQUNoQyxPQUFPM0IsRUFBT0MsMEJBQTBCLGNBQWVmLFVBQ3JELE1BQU9rcUIsRUFBTytJLEdBQVFySixHQUFXQyxjQUFjcG5CLEVBQU9pYSxZQUFjLElBQ3BFLElBQUt3TixJQUFVK0ksRUFBTSxPQUNyQixHQUFjLGdCQUFWL0ksR0FBcUMsbUJBQVZBLEVBQTRCLE9BQzNELElBQUtNLEdBQWVOLEdBQVEsT0FFNUIsTUFBTUUsRUFBVUgsR0FBV0MsR0FFM0IsVUFDUXlYLEdBQVd2WCxFQUFTRixFQUFPK0ksRUFBTSx3QkFBeUIsZ0JBQzFEME8sR0FBV3ZYLEVBQVNGLEVBQU8rSSxFQUFNLHFCQUFzQixnQkFDdkQwTyxHQUFXdlgsRUFBU0YsRUFBTytJLEVBQU0sa0JBQW1CLGdCQUNwRDBPLEdBQVd2WCxFQUFTRixFQUFPK0ksRUFBTSxtQkFBb0IsZ0JBQ3JEME8sR0FBV3ZYLEVBQVNGLEVBQU8rSSxFQUFNLHNCQUF1QixnQkFDeEQwTyxHQUFXdlgsRUFBU0YsRUFBTytJLEVBQU0sa0NBQW1DLGdCQUNwRTBPLEdBQVd2WCxFQUFTRixFQUFPK0ksRUFBTSwwQkFBMkIsZ0JBQzVEME8sR0FBV3ZYLEVBQVNGLEVBQU8rSSxFQUFNLHVCQUF3QixnQkFDekQwTyxHQUFXdlgsRUFBU0YsRUFBTytJLEVBQU0sNkJBQThCLGdCQUMvRDBPLEdBQVd2WCxFQUFTRixFQUFPK0ksRUFBTSxXQUFZLGdCQUM3QzBPLEdBQVd2WCxFQUFTRixFQUFPK0ksRUFBTSxjQUFlLGdCQUNoRDBPLEdBQVd2WCxFQUFTRixFQUFPK0ksRUFBTSxZQUFhLGdCQUM5QzBPLEdBQVd2WCxFQUFTRixFQUFPK0ksRUFBTSxXQUFZLGdCQUM3QzBPLEdBQVd2WCxFQUFTRixFQUFPK0ksRUFBTSxZQUFhLGdCQUM5QzBPLEdBQVd2WCxFQUFTRixFQUFPK0ksRUFBTSxzQkFBdUIsZ0JBQ3hEME8sR0FBV3ZYLEVBQVNGLEVBQU8rSSxFQUFNLGlCQUFrQixnQkFDbkQwTyxHQUFXdlgsRUFBU0YsRUFBTytJLEVBQU0seUJBQTBCLGdCQUMzRDBPLEdBQVd2WCxFQUFTRixFQUFPK0ksRUFBTSxzQkFBdUIsZ0JBQ3hEME8sR0FBV3ZYLEVBQVNGLEVBQU8rSSxFQUFNLHNCQUF1QixnQkFDeEQwTyxHQUFXdlgsRUFBU0YsRUFBTytJLEVBQU0saUJBQWtCLGdCQUNuRDBPLEdBQVd2WCxFQUFTRixFQUFPK0ksRUFBTSxpQkFBa0IsZ0JBQ25EME8sR0FBV3ZYLEVBQVNGLEVBQU8rSSxFQUFNLGlCQUFrQixnQkFDbkQwTyxHQUFXdlgsRUFBU0YsRUFBTytJLEVBQU0saUJBQWtCLGdCQUNuRDBPLEdBQVd2WCxFQUFTRixFQUFPK0ksRUFBTSxpQkFBa0IsZ0JBQ25EME8sR0FBV3ZYLEVBQVNGLEVBQU8rSSxFQUFNLGtCQUFtQixnQkFDcEQwTyxHQUFXdlgsRUFBU0YsRUFBTytJLEVBQU0sb0JBQXFCLGdCQUN0RDBPLEdBQVd2WCxFQUFTRixFQUFPK0ksRUFBTSxtQkFBb0IsZ0JBQ3JEME8sR0FBV3ZYLEVBQVNGLEVBQU8rSSxFQUFNLDhCQUErQixnQkFDaEUwTyxHQUFXdlgsRUFBU0YsRUFBTytJLEVBQU0saUJBQWtCLGdCQUNuRDBPLEdBQVd2WCxFQUFTRixFQUFPK0ksRUFBTSxxQkFBc0IsZ0JBQ3ZEME8sR0FBV3ZYLEVBQVNGLEVBQU8rSSxFQUFNLGVBQWdCLGdCQUNqRDBPLEdBQVd2WCxFQUFTRixFQUFPK0ksRUFBTSxnQkFBaUIsZ0JBQ2xEME8sR0FBV3ZYLEVBQVNGLEVBQU8rSSxFQUFNLHdCQUF5QixnQkFDMUQwTyxHQUFXdlgsRUFBU0YsRUFBTytJLEVBQU0sc0JBQXVCLGdCQUN4RDBPLEdBQVd2WCxFQUFTRixFQUFPK0ksRUFBTSxzQkFBdUIsZ0JBQ3hEME8sR0FBV3ZYLEVBQVNGLEVBQU8rSSxFQUFNLFVBQVcsZ0JBQzVDME8sR0FBV3ZYLEVBQVNGLEVBQU8rSSxFQUFNLGlCQUFrQixnQkFFbkQyTyxHQUFZeFgsRUFBU0YsRUFBTytJLEVBQU0sYUFDbEMyTyxHQUFZeFgsRUFBU0YsRUFBTytJLEVBQU0sdUJBQ2xDMk8sR0FBWXhYLEVBQVNGLEVBQU8rSSxFQUFNLG1CQUNsQzJPLEdBQVl4WCxFQUFTRixFQUFPK0ksRUFBTSxxQkFDbEMyTyxHQUFZeFgsRUFBU0YsRUFBTytJLEVBQU0sMEJBQ2xDMk8sR0FBWXhYLEVBQVNGLEVBQU8rSSxFQUFNLHFCQUNsQzJPLEdBQVl4WCxFQUFTRixFQUFPK0ksRUFBTSxpQkFDbEMyTyxHQUFZeFgsRUFBU0YsRUFBTytJLEVBQU0sa0JBQ2xDMk8sR0FBWXhYLEVBQVNGLEVBQU8rSSxFQUFNLGlCQUVsQzJPLEdBQVl4WCxFQUFTRixFQUFPK0ksRUFBTSxlQUNsQzJPLEdBQVl4WCxFQUFTRixFQUFPK0ksRUFBTSwwQkFDbEMyTyxHQUFZeFgsRUFBU0YsRUFBTytJLEVBQU0sa0JBQ2xDMk8sR0FBWXhYLEVBQVNGLEVBQU8rSSxFQUFNLDBCQUNsQzJPLEdBQVl4WCxFQUFTRixFQUFPK0ksRUFBTSx3QkFDbEMyTyxHQUFZeFgsRUFBU0YsRUFBTytJLEVBQU0sdUJBQ2xDMk8sR0FBWXhYLEVBQVNGLEVBQU8rSSxFQUFNLDRCQUNsQzJPLEdBQVl4WCxFQUFTRixFQUFPK0ksRUFBTSwrQkFDbEMyTyxHQUFZeFgsRUFBU0YsRUFBTytJLEVBQU0sOEJBQ2xDMk8sR0FBWXhYLEVBQVNGLEVBQU8rSSxFQUFNLHdCQUMxQyxDQUFFLE1BQU94eUIsR0FDUFMsUUFBUWl2QixLQUFLLDJCQUE2QjF2QixHQUE2QlksT0FBU1osRUFDbEYsR0FFSixDQUVBVCxlQUFlMmhDLEdBQVd2WCxFQUFrQkYsRUFBZStJLEVBQWNqeUIsRUFBYzZnQyxHQUNyRixVQUVRelgsRUFBUTBYLFFBQVEsb0NBQXFDLENBQ3pENVgsUUFDQStJLE9BQ0FqeUIsT0FDQTZnQyxTQUVKLENBQUUsWUFFTXpYLEVBQVEwWCxRQUFRLDRDQUE2QyxDQUNqRTVYLFFBQ0ErSSxPQUNBanlCLE9BQ0E2Z0MsU0FFSixDQUNGLENBRUE3aEMsZUFBZTRoQyxHQUFZeFgsRUFBa0JGLEVBQWUrSSxFQUFjanlCLEdBQ3hFLFVBRVFvcEIsRUFBUTBYLFFBQVEsNkNBQThDLENBQ2xFNVgsUUFDQStJLE9BQ0FqeUIsUUFFSixDQUFFLE1BQ0EsQ0FFSixDQ3BHQSxNQUFNK2dDLEdBQTBCLENBQUMsNEJBQTZCLGFBQWMscUJBQ3RFQyxHQUFVQyxjQUEwQng3QixLQUVuQ3pHLGVBQWVraUMsR0FBYXovQixHQUNqQyxPQUFPM0IsRUFBT0MsMEJBQTBCLGVBQWdCZixVQUN0RCxNQUFPa3FCLEVBQU8rSSxHQUFRckosR0FBV0MsY0FBY3BuQixFQUFPaWEsWUFBYyxJQUNwRSxJQUFLd04sSUFBVStJLEdBQWtCLG1CQUFWL0ksRUFBNEIsT0FDbkQsSUFBS00sR0FBZU4sS0FBV3ZwQixFQUFRRSxrQkFBbUIsT0FFMUQsTUFBTTBILEVBQVM0NUIsRUFBTzEvQixPQUFPLENBQUVULEtBQU1BLEVBQUs1QixRQUFRcUMsRUFBT0csUUFBUyxRQUFTdy9CLE9BQU8sSUFBUTc1QixRQUFVLENBQUEsRUFDcEcsR0FBbUMsSUFBL0J0QixPQUFPQyxLQUFLcUIsR0FBUXpELE9BQWMsT0FFdEMsTUFBTXNsQixFQUFVSCxHQUFXQyxHQUUzQixJQUNFLElBQUssTUFBTW1ZLEtBQWNOLEdBQ3ZCLFVBRVEzWCxFQUFRMFgsUUFBUSw2REFBOEQsQ0FDbEY1WCxRQUNBK0ksT0FDQXFQLFlBQWFELEdBRWpCLENBQUUsTUFDQSxDQUtKLE1BQU1sYixRQUFpQmlELEVBQVEwWCxRQUFRLHVEQUF3RCxDQUM3RjVYLFFBQ0ErSSxVQUVJOXJCLElBQUVBLEVBQUtvN0IsT0FBUUMsR0FBVXJiLEVBQVNzYixLQUVsQ0MsRUF3Q0hWLEdBQVEsNEJBdkNMVSxFQUFPQyxNQUViLElBQUssTUFBTzNoQyxFQUFNNGhDLEtBQVczN0IsT0FBT3NDLFFBQVFoQixHQUFTLENBQ25ELEdBQ1csZUFBVHZILEdBQ1MsK0JBQVRBLEdBQ1Msa0NBQVRBLEVBRUEsU0FJRixNQUFNNmhDLEVBQVNILEVBQU9JLFlBQVkzN0IsRUFBS3U3QixFQUFPSyxnQkFBZ0JDLFVBQ3hEQyxFQUFTUCxFQUFPUSxZQUFZTixHQUc1Qk8sRUFBV1QsRUFBT1UsZ0JBQWdCSCxFQUFRSixHQUcxQ1EsRUFBWVgsRUFBT1ksVUFBVUgsRUFBVVQsRUFBT0ssZ0JBQWdCQyxnQkFHOUQ1WSxFQUFRMFgsUUFBUSwwREFBMkQsQ0FDL0U1WCxRQUNBK0ksT0FDQXFQLFlBQWF0aEMsRUFDYnVpQyxnQkFBaUJGLEVBQ2pCZCxPQUFRQyxHQUVaLENBQ0YsQ0FBRSxNQUFPL2hDLEdBQ1BTLFFBQVFpdkIsS0FBSyw0QkFBOEIxdkIsR0FBNkJZLE9BQVNaLEVBQ25GLEdBRUosQ0M1RU9ULGVBQWV3akMsR0FBb0IvZ0MsR0FDeEMsTUFBT3luQixFQUFPK0ksR0FBUXJKLEdBQVdDLGNBQWNwbkIsRUFBT2lhLFlBQWMsSUFDcEUsSUFBS3dOLElBQVUrSSxFQUFNLE9BQ3JCLEdBQWMsZ0JBQVYvSSxHQUFxQyxtQkFBVkEsRUFBNEIsT0FDM0QsSUFBS00sR0FBZU4sR0FBUSxPQUU1QixNQUFNRSxFQUFVSCxHQUFXQyxTdkRtRXRCbHFCLGVBQ0xpQixHQUNBd2lDLFlBQ0VBLEVBQVdDLFlBQ1hBLEVBQVdDLFdBQ1hBLEVBQWEsRUFBQ0MsWUFDZEEsRUFBV0MsWUFDWEEsRUFBV0Msa0JBQ1hBLEVBQW9CLEVBQUNDLHdCQUNyQkEsR0FDZ0IsSUFFbEIsSUFBSUMsRUFBYyxFQUNsQixPQUNFLElBQ0UsYUFBYS9pQyxFQUFLK2lDLEVBQ3BCLENBQUUsTUFBT3ZqQyxHQUdQLFNBRk1pakMsSUFBY2pqQyxJQUNwQnVqQyxJQUNJQSxHQUFlTCxFQUNqQixNQUFNbGpDLEVBRVIsR0FBSW9qQyxJQUFnQkEsRUFBWXBqQyxHQUM5QixNQUFNQSxFQUVKcWpDLEVBQW9CLFNBQ2hCN2pDLEVBQU02akMsR0FFVkMsSUFDRkQsRUFBb0JDLEVBQXdCRCxJQUU5Q0YsSUFBYyxpQkFBaUJuakMsTUFDbkNBLGFBQWlCVyxNQUFRLFNBQVdYLEVBQU1ZLE9BQVMsSUFBTSxZQUMvQ29pQyxJQUFjaGpDLEdBQ3RCLENBRUosQ3VEcEdRd2pDLENBQVUsSUFDZDdaLEVBQVEwWCxRQUFRLDhCQUErQixDQUM3QzVYLFFBQ0ErSSxPQUNBaVIsa0JBQWtCLEVBQ2xCQyxvQkFBb0IsRUFDcEJDLG9CQUFvQixFQUNwQkMsb0JBQW9CLEVBQ3BCQyxxQkFBcUIsRUFDckJDLHdCQUF3QixFQUN4QkMsMEJBQTJCLFdBQzNCQyw0QkFBNkIsUUFDN0JDLFFBQVMsQ0FDUCx1QkFBd0IsaUJBRXRCamlDLEVBQU9pYSxZQUFZNUksV0FBVyx1QkFBeUIsQ0FBRW93QixrQkFBa0IsR0FBUyxDQUFBLElBRzlGLENDdEJBLE1BQU1TLEdBQStCLGFBRS9CQyxHQUFZLENBQ2hCLDJCQUE0Qiw4VEFRRUQscURBQ0FBLHNnQ0FpQzlCdmlDLFFBR0twQyxlQUFlNmtDLEdBQXdCcGlDLEdBQzVDLE9BQU8zQixFQUFPQywwQkFBMEIsMEJBQTJCZixVQUNqRSxHQUFLeUMsRUFBT3FmLGtCQUlaLElBQUssTUFBT25hLEVBQVVwQyxLQUFlMEIsT0FBT3NDLFFBQVFxN0IsSUFBWSxDQUM5RCxNQUFNOWlDLEVBQVVnakMsR0FBNEJ2L0IsRUFBWTlDLEdBQ2xEaEIsRUFBV08sRUFBSzVCLFFBQVFxQyxFQUFPRyxRQUFTLFVBQVcrRSxHQUN6RCxHQUFJakcsRUFBR3FCLFdBQVd0QixHQUFXLENBQzNCLE1BQU11QixRQUFtQnRCLEVBQUdDLFNBQVNDLFNBQVNILEVBQVUsUUFDeEQsR0FBSXNqQyxFQUFTL2hDLEVBQVlsQixHQUFXQSxFQUFRZ0QsT0FBUyxFQUNuRCxRQUVKLE9BRU1wRCxFQUFHQyxTQUFTSSxNQUFNQyxFQUFLNUIsUUFBUXFDLEVBQU9HLFFBQVMsV0FBWSxDQUFFVixXQUFXLFVBQ3hFSSxFQUFZbUQsSUFBSSxJQUFNbEUsRUFBT00sYUFBYUosRUFBVUssR0FDNUQsR0FFSixDQUVBLFNBQVNnakMsR0FBNEJFLEVBQWtCdmlDLEdBQ3JELE1BQU13aUMsRUFBd0J4aUMsRUFBTzhhLE1BQVEsVUFBWSxPQUN6RCxPQUFPeW5CLEVBQVN6NEIsV0FBV280QixHQUE4Qk0sRUFDM0QsQ0NQQSxNQUFNQyxHQUFpQkMsRUFBRXg4QixPQUFPLENBQzlCcVksTUFBT21rQixFQUNKeDhCLE9BQU8sQ0FDTjRQLElBQUs0c0IsRUFBRUMsT0FBT0QsRUFBRWozQixTQUFVaTNCLEVBQUVqM0IsVUFBVW0zQixXQUN0Q0MsSUFBS0gsRUFBRUMsT0FBT0QsRUFBRWozQixTQUFVaTNCLEVBQUVqM0IsVUFBVW0zQixXQUN0Q2xpQyxHQUFJZ2lDLEVBQUVDLE9BQU9ELEVBQUVqM0IsU0FBVWkzQixFQUFFajNCLFVBQVVtM0IsV0FDckMvZCxLQUFNNmQsRUFBRUMsT0FBT0QsRUFBRWozQixTQUFVaTNCLEVBQUVqM0IsVUFBVW0zQixhQUV4Q0EsYUFHRXJsQyxlQUFldWxDLEdBQ3BCM2lDLEVBQ0E0WixHQUVBLE1BQU1oRSxFQUFrQnhXLEVBQUs1QixRQUFRd0MsRUFBUyxnQkFDOUMsSUFDRSxNQUFNMGpCLEVBQXlCNWtCLEVBQUdxQixXQUFXeVYsR0FDN0MsSUFBSTVNLEVBQTRDLENBQUEsRUFDNUNFLEVBQWtELENBQUEsRUFDbERELEVBQTJCLENBQUEsRUFDM0IyNUIsR0FBYSxFQUNqQixHQUFJbGYsRUFBd0IsQ0FDMUIsTUFBTW1mLEVBQWtCL2pDLEVBQUdnaEIsYUFBYWxLLEVBQWlCLFFBQ3pEM00sRUFBY2lNLEtBQUtDLE1BQU0wdEIsR0FDekI3NUIsRUFBZUMsRUFBWUQsY0FBZ0IsQ0FBQSxFQUMzQ0UsRUFBa0JELEVBQVlDLGlCQUFtQixDQUFBLEVBQ2pEMDVCLEVBQWtDLFdBQXJCMzVCLEVBQVkyRCxJQUMzQixDQUVBLElBQUlrMkIsRUFBNEIsR0FDNUJDLEVBQTJCLEdBQy9CLElBQ0UsTUFBTUMsRUFBb0I1akMsRUFBSzVCLFFBQVF3QyxFQUFTLG1CQUMxQ2dWLEVBQU9FLEtBQUtDLFlBQVk4dEIsRUFBSWprQyxTQUFTZ2tDLEVBQW1CLFNBTTlERixFQUFrQjl0QixHQUFNNkQsVUFBWSxHQUNwQ2txQixFQUFpQi90QixHQUFNd2pCLFNBQVMwSyxRQUFVLEVBQzVDLENBQUUsTUFDQSxDQUdGLE1BQU05ckIsRUFDMkMsYUFBL0NoWSxFQUFLaWIsU0FBU2piLEVBQUs1QixRQUFRd0MsRUFBUyxTQUNuQ2xCLEVBQUdxQixXQUFXZixFQUFLNUIsUUFBUXdDLEVBQVMsS0FBTSxLQUFNLGlCQUVuRCxJQUFJbWpDLEVBQ0EvckIsSUFDRityQixRQTZKTi9sQyxlQUE2QjRDLEVBQWlCaUosR0FDNUMsTUFBTW02QixFQUFNQyxFQUFVcmpDLEdBRWhCc2pDLFNBRGdCRixFQUFJRyxZQUFXLElBQ2R0akMsS0FBTXVqQyxHQUFpQixXQUFYQSxFQUFFcGxDLE1BQy9CcWxDLEVBQVlILEdBQVFJLEtBQUtsZixPQUFTOGUsR0FBUUksS0FBS3poQyxLQUNyRCxHQUF5QixpQkFBZHdoQyxFQUF3QixDQUNqQyxNQUFNenVCLFFBQWEydUIsR0FBZ0JGLEdBQ25DLEdBQUl6dUIsRUFBTSxPQUFPQSxDQUNuQixDQUVBLE1BQU1uUixFQUF3QyxpQkFBM0JvRixFQUFZNlEsV0FBMEI3USxFQUFZNlEsV0FBYTdRLEVBQVk2USxZQUFZalcsSUFDMUcsR0FBSUEsRUFBSyxDQUNQLE1BQU1tUixRQUFhMnVCLEdBQWdCOS9CLEdBQ25DLEdBQUltUixHQUF5QixjQUFqQkEsRUFBSzJSLFFBQXlCLE9BQU8zUixDQUNuRCxDQUNGLENBNUt1QjR1QixDQUFjNWpDLEVBQVNpSixJQUcxQyxJQUFJNHJCLEVBcUhSLFNBQWdDNzBCLEdBQzlCLE1BQU02akMsRUFBVXprQyxFQUFLNUIsUUFBUXdDLEdBQzdCLE9BQ0VsQixFQUFHcUIsV0FBV2YsRUFBS3dELEtBQUtpaEMsRUFBUyxlQUNqQy9rQyxFQUFHcUIsV0FBV2YsRUFBS3dELEtBQUtpaEMsRUFBUyxnQkFDakMva0MsRUFBR3FCLFdBQVdmLEVBQUt3RCxLQUFLaWhDLEVBQVMsa0JBRXJDLENBNUg2QkMsQ0FBdUI5akMsR0FDaEQsSUFBSyxNQUFNMEMsSUFBVSxDQUFDLE9BQVEsT0FBUSxVQUNwQyxHQUFJNUQsRUFBR3FCLFdBQVdmLEVBQUs1QixRQUFRd0MsRUFBUyxJQUFJMEMsY0FBb0IsQ0FDOURteUIsR0FBcUIsRUFDckIsS0FDRixDQUdGLElBQUlrUCxFQUFhLEdBQ2pCLElBQ0VBLFFBQW1CZCxFQUFJamtDLFNBQVNJLEVBQUs1QixRQUFRd0MsRUFBUyxjQUFlLE9BQ3ZFLENBQUUsTUFDQSxDQUlGLE1BQU1na0MsRUFBZTVrQyxFQUFLNUIsUUFBUXdDLEVBQVMsYUFDM0MsSUFBSW1lLEVBQ0osSUFDRSxNQUFNOGxCLFFBQXFCaEIsRUFBSWprQyxTQUFTZ2xDLEVBQWMsUUFDdEQ3bEIsRUFBV21rQixHQUFlbnRCLE1BQU1ELEtBQUtDLE1BQU04dUIsR0FDN0MsQ0FBRSxNQUNBLENBR0YsTUFBTUMsRUFBOEMsaUJBQXhCZixHQUFVZ0IsVUFBeUJoQixFQUFTZ0IsZUFBWTErQixFQUNwRixJQUFJMitCLEVBQ0FDLEVBQ0osR0FBSUgsRUFBYyxDQUNoQixNQUFNSSxFQUFZSixFQUFhcDhCLE1BQU0sS0FDakN3OEIsRUFBVXBpQyxRQUFVLElBQ3RCa2lDLEVBQWFFLEVBQVUsR0FDdkJELEVBQVdDLEVBQVUsR0FFekIsQ0FDQSxNQUFNeHFCLEVBQWFvcUIsRUFBZSxVQUFVQSxTQUFpQnorQixFQUN2RDVGLEVBQXdCLENBQzVCRyxVQUNBK2pDLGFBQ0Ezc0IsU0FDQXFELGNBQW9DLElBQXRCMG9CLEdBQVU1YSxRQUN4QmdjLHdCQUF5QnQ3QixFQUFZdWYsTUFDckMxTyxhQUNBc3FCLGFBQ0FDLFdBQ0FubEIsa0JBQW1CckssUUFDakJpRixHQUFZNUksV0FBVyx3QkFBMEI0SSxHQUFZNUksV0FBVywyQkFFMUV5SixNQUFPZixHQUFZZSxPQUFTN2IsRUFBR3FCLFdBQVdmLEVBQUt3RCxLQUFLNUMsRUFBUyxhQUM3RHdrQyxhQUFjNUIsRUFDZHRhLHFCQUFzQjFTLEVBQWdCblQsU0FBUyx3QkFDL0M0VSwyQkFBNEJvdEIsR0FBWSwyQkFBNEJ6a0MsR0FDcEUyYyx3QkFBeUJvbkIsR0FBY2psQyxFQUFHcUIsV0FBV2YsRUFBSzVCLFFBQVF3QyxFQUFTLHVCQUMzRXdqQixtQkFBb0Ixa0IsRUFBR3FCLFdBQVdmLEVBQUs1QixRQUFRd0MsRUFBUyxZQUN4RHlqQixpQkFBa0Iza0IsRUFBR3FCLFdBQVdmLEVBQUs1QixRQUFRd0MsRUFBUyxXQUN0RDBqQix1QkFBd0I1a0IsRUFBR3FCLFdBQVdmLEVBQUs1QixRQUFRd0MsRUFBUyxpQkFDNUQ4akIsc0JBQXVCaGxCLEVBQUdxQixXQUFXZixFQUFLNUIsUUFBUXdDLEVBQVMsZ0JBQzNEK2pCLGtCQUFtQmpsQixFQUFHcUIsV0FBV2YsRUFBSzVCLFFBQVF3QyxFQUFTLFlBQ3ZEMmpCLGtCQUFtQjdrQixFQUFHcUIsV0FBV2YsRUFBSzVCLFFBQVF3QyxFQUFTLFlBQ3ZENGpCLHVCQUF3QjlrQixFQUFHcUIsV0FBV2YsRUFBSzVCLFFBQVF3QyxFQUFTLGlCQUM1RDZqQix3QkFBeUIva0IsRUFBR3FCLFdBQVdmLEVBQUs1QixRQUFRd0MsRUFBUyxrQkFDN0Qwa0MsOEJBQStCNWxDLEVBQUdxQixXQUFXZixFQUFLNUIsUUFBUXdDLEVBQVMsVUFBVyxrQkFDOUVtbEIsc0JBQXVCc2YsR0FBWSwrQ0FBZ0R6a0MsR0FDbkZxbEIsc0JBQXVCb2YsR0FBWSwrQ0FBZ0R6a0MsR0FDbkZxN0Isb0JBQXFCb0osR0FBWSw4QkFBK0J6a0MsR0FDaEV1bEIsZ0JBQWlCa2YsR0FBWSxZQUFhemtDLEdBQzFDb2xCLGdDQUFpQ3FmLEdBQVksMkRBQTREemtDLEdBQ3pHc2xCLGdDQUFpQ21mLEdBQVksMkRBQTREemtDLEdBQ3pHczdCLDhCQUErQm1KLEdBQVksMENBQTJDemtDLEdBQ3RGd2xCLDBCQUEyQmlmLEdBQVkscUJBQXNCemtDLEdBQzdEOEksVUFBVyxDQUNUa2IsUUFBU2hiLEVBQWFnYixNQUN0QkMsV0FBWS9hLEVBQWdCLGtCQUM1QnNXLFlBQWF4VyxFQUFhLGtCQUFvQkUsRUFBZ0IsZUFDOURrYixXQUFZMmYsRUFBV3RoQyxTQUFTLHlCQUNoQ2dkLFFBQVN6VyxFQUFheVcsTUFDdEJDLE9BQVExVyxFQUFhMFcsS0FDckJOLGlCQUNJcFcsRUFBYSx1QkFBeUJFLEVBQWdCLHVCQUF5QkEsRUFBZ0J5akIsV0FDbkc1akIsU0FBVUMsRUFBYSxxQkFBdUJFLEVBQWdCSCxPQUM5RGlxQixVQUFXOXBCLEVBQWdCOHBCLFFBQzNCOU8sY0FBZWxiLEVBQWEsZ0JBQzVCb1IsbUJBQ0VsUixFQUFnQixxQkFDaEI0NUIsRUFBZ0I1Z0MsT0FBUyxHQUN6QjZnQyxFQUFlN2dDLE9BQVMsR0FFMUJpaUIsWUFBYWpiLEVBQWdCLG9CQUM3QjZqQixLQUFNL2pCLEVBQWEsc0JBQXdCRSxFQUFnQixvQkFFN0RxUSxRQUFTLENBQ1BWLFNBQVVpcUIsRUFDVjZCLE9BQVE1QixFQUFldGdDLFNBQVMsNEJBQ2hDZ1AsSUFBS3N4QixFQUFldGdDLFNBQVMsMEJBRS9Cb3lCLHFCQUNBdEIsZ0JBQWlCcVIsR0FBYzVrQyxHQUMvQmlKLGNBQ0FrVixZQUVGLEdBQ0V0ZSxFQUFPMmpCLG9CQUNQM2pCLEVBQU80akIsa0JBQ1A1akIsRUFBTzZqQix3QkFDUDdqQixFQUFPaWtCLHVCQUNQamtCLEVBQU9ra0IsbUJBQ1Bsa0IsRUFBTzhqQixtQkFDUDlqQixFQUFPK2pCLHdCQUNQL2pCLEVBQU9na0Isd0JBRVAsT0FBT2hrQixDQUVYLENBQUUsTUFDQSxDQUVKLENBV0F6QyxlQUFld25DLEdBQWM1a0MsR0FDM0IsTUFBTTZrQyxFQUFnQyxDQUFBLEVBQ3RDLElBQUssTUFBTTkvQixJQUFZLENBQUMsWUFBYSxjQUFlLENBQ2xELE1BQU1sRyxFQUFXTyxFQUFLNUIsUUFBUXdDLEVBQVMrRSxHQUN2QyxJQUNFLE1BQU1vdkIsRUFBVzJRLEVBQUszdkIsWUFBWTh0QixFQUFJamtDLFNBQVNILEVBQVUsU0FDekQsSUFBSyxNQUFPVCxFQUFNMkUsS0FBVXNCLE9BQU9zQyxRQUFRd3RCLEVBQVMwUSxPQUFTLENBQUEsR0FDM0RBLEVBQU16bUMsR0FBUTJtQyxHQUFvQmhpQyxFQUV0QyxDQUFFLE1BQ0EsQ0FFSixDQUNBLE9BQU84aEMsQ0FDVCxDQUVBLFNBQVNFLEdBQW9CaGlDLEdBQzNCLE1BQXFCLGlCQUFWQSxFQUEyQkEsRUFFbEM2SyxNQUFNQyxRQUFROUssR0FBZUEsRUFBTTBELE9BQVE3QyxHQUFrRCxpQkFBWkEsR0FBc0JoQixLQUFLLE1BQzVHRyxHQUEwQixpQkFBVkEsRUFBMkJnaUMsR0FBcUJoaUMsRUFBNEJGLEtBQ3pGLEVBQ1QsQ0FFQSxTQUFTNGhDLEdBQVl2TixFQUFpQmwzQixHQUNwQyxPQUFPcUosRUFBR3VoQixTQUFTc00sRUFBUyxDQUFFM3RCLEtBQUssRUFBTUMsSUFBS3hKLEVBQVN5SixPQUFRZCxJQUFjekcsT0FBUyxDQUN4RixDQW1CQTlFLGVBQWV1bUMsR0FBZ0J6YyxHQUM3QixNQUFPOGQsRUFBSzVtQyxHQUFRNG9CLEdBQVdDLGNBQWNDLEdBQzdDLEdBQUs4ZCxHQUFRNW1DLEVBRWIsSUFNRSxhQUp1QmlwQixLQUFhNlgsUUFBUSw0QkFBNkIsQ0FDdkU1WCxNQUFPMGQsRUFDUDNVLEtBQU1qeUIsS0FFUXloQyxJQUNsQixDQUFFLE1BQU9oaUMsR0FDUCxNQUFNb25DLEVBT1YsU0FBbUNwbkMsR0FDakMsSUFBS0EsR0FBMEIsaUJBQVZBLEVBQW9CLE9BRXpDLE1BQU0wbUIsRUFDSixhQUFjMW1CLEVBQ1RBLEVBQTJGMG1CLGNBQzVGOWUsRUFDQTRnQixFQUFTOUIsR0FBVThCLFFBQVd4b0IsRUFBOEJ3b0IsT0FDbEUsR0FBZSxNQUFYQSxHQUE2QixNQUFYQSxFQUFnQixPQUV0QyxNQUFNNmUsRUFBVzNnQixHQUFVdWQsU0FBU29ELFNBQ3BDLEdBQXdCLGlCQUFiQSxFQUF1QixPQUVsQyxNQUFPRixFQUFLNW1DLEdBQVE0b0IsR0FBV0MsY0FBY2llLEdBQzdDLElBQUtGLElBQVE1bUMsRUFBTSxPQUVuQixNQUFPLEdBQUc0bUMsS0FBTzVtQyxHQUNuQixDQXhCK0IrbUMsQ0FBMEJ0bkMsR0FDckQsR0FBSW9uQyxFQUNGLE1BQU8sQ0FBRWQsVUFBV2MsRUFFeEIsQ0FDRixDQ3RIQSxTQUFTRyxHQUFlQyxHQUl0QixNQUFNaGYsRUFBU0osR0FBeUIsTUFBTyxDQUFDLFdBQVlvZixHQUM1RCxHQUFlLElBQVhoZixFQUNGLE1BQU0sSUFBSTduQixNQUFNLGtFQUFrRTZuQixJQUV0RixPQWxLQWpwQixpQkFDRSxNQUFNa29DLFFBQWFDLEVBQU03ekIsUUFBUTR6QixLQUFLOWlDLE1BQU0sSUFDekNvQixRQUFRLGVBQWdCLHVEQUF5RDJoQyxJQUNoRkEsRUFBTUMsV0FBVyxRQUFTLENBQ3hCQyxTQUFVLDZCQUNWdDNCLE9BQU8sRUFDUHZCLEtBQU0sU0FDTjg0QixRQUFTLENBQUMsU0FHYjNuQyxRQUFRLENBQ1BtRyxJQUFLLENBQ0grYSxZQUFhLG9EQUNiclMsS0FBTSxVQUNOODRCLFNBQVMsRUFDVG5MLE1BQU8sS0FFVG9MLFNBQVUsQ0FDUjFtQixZQUFhLCtCQUNiclMsS0FBTSxVQUNOODRCLFNBQVMsRUFDVG5MLE1BQU8sS0FFVHFMLFFBQVMsQ0FDUDNtQixZQUFhLHdDQUNiclMsS0FBTSxVQUNOODRCLFNBQVMsRUFDVG5MLE1BQU8sT0FHVnZRLFFBc0lMLFdBQ0UsSUFBSTZiLEVBQWlCem1DLEVBQUtDLFFBQVEsSUFBSXltQyxnQkFBZ0JqaUMsS0FBS2tpQyxVQUMzRCxNQUFRam5DLEVBQUdxQixXQUFXZixFQUFLd0QsS0FBS2lqQyxFQUFnQixrQkFDOUNBLEVBQWlCem1DLEVBQUtDLFFBQVF3bUMsR0FLaEMsT0FIb0Izd0IsS0FBS0MsTUFBTXJXLEVBQUdnaEIsYUFBYTFnQixFQUFLd0QsS0FBS2lqQyxFQUFnQixnQkFBaUIsU0FHdkU3YixPQUNyQixDQS9JYWdjLElBQ1JDLFNBQVNYLEtBQ1p2bkMsRUFBUUMsVUFBWXNuQyxFQUFLTSxRQUN6QjduQyxFQUFRRSxrQkFBb0JxbkMsRUFBS3BoQyxJQUVqQyxJQUFJZ2lDLEdBQTBCLEVBQzlCLElBQUssTUFBTWIsS0FBZUMsRUFBS2x4QixNQUFtQixDQUNoRCxNQUFNK3hCLEVBQWtCL21DLEVBQUt3RCxLQUFLeWlDLEVBQWEsWUFFekNlLFNBRGlCMW9DLEVBQWlCLElBQU1vQixFQUFHQyxTQUFTd1gsUUFBUTR2QixFQUFpQixDQUFFM3ZCLGVBQWUsTUFBYSxJQUNyRi9QLE9BQVE0L0IsR0FBTUEsRUFBRXZ2QixlQUFlaFgsSUFBS3VtQyxHQUFNam5DLEVBQUt3RCxLQUFLdWpDLEVBQWlCRSxFQUFFam9DLGFBRTdGcVgsR0FBc0MsQ0FBQzR2QixLQUFnQmUsSUFFN0QsTUFBTXhzQixRQUFtQitvQixHQUFpQjBDLEdBSTFDLEdBSEl0bkMsRUFBUUMsV0FHUDRiLEVBQVksQ0FDZnRiLFFBQVFULE1BQU0scUNBQXFDd25DLEtBQ25EYSxHQUEwQixFQUMxQixRQUNGLENBQ0EsTUFBTUksRUFBc0JscEIsR0FBU3hELEdBSy9CMnNCLFNBSGtDaHBDLFFBQVFvWSxJQUM5Q3l3QixFQUFZdG1DLElBQUswbUMsR0FBZTdELEdBQWlCNkQsRUFBWTVzQixNQUVYblQsT0FBUTVHLEtBQWFBLEdBQ25FNG1DLEVBQW9CLENBQUM3c0IsS0FBZTJzQixHQUUxQyxHQUFJeG9DLEVBQVFDLFVBQ1YsSUFBSyxNQUFNNkIsS0FBVTRtQyxFQUNuQm5vQyxRQUFRQyxLQUFLc0IsU0FLWHc5QixHQUFrQnpqQixHQUNwQkEsRUFBV2UsYUFDUGlGLEdBQW1CaEcsR0FHM0IsTUFBTThzQixHQUNIN3NCLEdBQXdCRCxFQUFXRSxjQUNuQ0YsRUFBV0UsWUFBWTVJLFdBQVcsd0JBQ2pDMEksRUFBV0UsWUFBWTVJLFdBQVcsaUNBQ2hDM1QsUUFBUW9ZLElBQUksQ0FDaEIvTSxFQUFrQmdSLEdBQ2xCMHNCLEVBQW9CSyxLQUFLLElBQU0vTyxHQUFlaGUsSUFDOUN5RSxHQUEwQnpFLEVBQVk2c0IsR0FDdENwbEIsR0FBcUJ6SCxHQUNyQmtJLEdBQXFCbEksR0FDckI0SSxHQUFxQjVJLEVBQVk2c0IsR0FDakN2akIsR0FBcUJ0SixHQUNyQnVKLEdBQXNCdkosR0FDdEJxb0IsR0FBd0Jyb0IsR0FDeEI2TCxHQUFxQjdMLEdBQ3JCcWYsR0FBcUJyZixHQUNyQjJlLEdBQWtCM2UsTUFDZDhzQixFQUFxQixDQUFDL3NCLEdBQWtCQyxJQUFlLEdBQzNEa2xCLEdBQVlsbEIsR0FDWjBsQixHQUFhMWxCLEdBQ2JnbkIsR0FBb0JobkIsR0FDcEJvYSxHQUFvQ3BhLEdBQ3BDa2MsR0FBcUJsYyxXQUVqQmxhLEVBQVlxZSxhQUVsQixNQUFNaGYsRUFBNEIsR0FDbEMsSUFBSyxNQUFNYyxLQUFVNG1DLEdBQ2Y1bUMsRUFBT3dsQix1QkFBeUJ4bEIsRUFBT3lsQixrQ0FDekN2bUIsRUFBU2tELEtBQUsrVSxHQUFtQm5YLEVBQVFBLEVBQU91WCxPQUFTcXZCLEVBQW9CLENBQUM1bUMsS0FFNUVBLEVBQU9pSixVQUFVc1csZ0JBQ25CcmdCLEVBQVNrRCxLQUFLeUMsRUFBb0I3RSxJQUVoQ0EsRUFBT2lKLFVBQVU0VyxNQUNuQjNnQixFQUFTa0QsS0FBS3JDLEVBQWtCQyxVQUU1QndqQixHQUFrQnhqQixFQUFRK1osU0FDMUJsYSxFQUFZcWUsY0FDYmxlLEVBQU91WCxRQUFXdlgsRUFBTzZqQixnQ0FHeEIyVCxHQUF1QngzQixTQUN2QnVwQixHQUFvQnZwQixFQUFRK1osRUFBWTByQixFQUFLSyxVQUVuRDVtQyxFQUFTa0QsS0FBSzZ6QixHQUFxQmoyQixJQUMvQkEsRUFBTzZrQywrQkFBaUM3a0MsRUFBTzZqQix3QkFDakQza0IsRUFBU2tELEtBQUtpN0IsR0FBdUJyOUIsS0FFbkNBLEVBQU93bEIsdUJBQXlCeGxCLEVBQU95bEIsa0NBQ3pDdm1CLEVBQVNrRCxLQUFLazRCLEdBQWlCdDZCLElBRTdCcWxCLEdBQWtCcmxCLEtBQ3BCZCxFQUFTa0QsS0FBSyt6QixHQUFvQm4yQixJQUNsQ2QsRUFBU2tELEtBQUttMEIsR0FBcUJ2MkIsS0FFakNBLEVBQU9pSixVQUFVa3FCLFNBQ25CajBCLEVBQVNrRCxLQUFLMDFCLEdBQTBCOTNCLFdBR3RDdEMsUUFBUW9ZLElBQUk1VyxTQUNaVyxFQUFZcWUsYUFFbEIsTUFBTTFNLEVBQWlCdUksRUFBV2UsTUFBUSxNQUFRLE9BRTlDZixFQUFXZSxZQUNQemMsRUFBT0MsMEJBQTBCLGlCQUFrQmYsZ0JBQ2pERyxRQUFRQyxVQUNkNG5DLEdBQWVDLEtBR2pCdGYsR0FBVTFVLEVBQWdCLENBQUMsVUFBVyxrQkFBbUJnMEIsR0FFM0R0ZixHQUFVMVUsRUFBZ0IsQ0FBQyxXQUFZZzBCLFNBRWpDL0wsR0FBbUIxZixFQUMzQixDQUNJc3NCLElBQ0Z4MEIsUUFBUWsxQixTQUFXLEVBRXZCLENBdUJNclkiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMTAsMTEsMTIsMTMsMTRdfQ==
|