@willbooster/wbfy 1.15.5 → 1.15.6

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.
Files changed (2) hide show
  1. package/dist/index.js +2 -1
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -225,6 +225,7 @@ android/app/src/main/assets/
225
225
  src-tauri/gen/schemas/
226
226
  `),e.depending.litestream&&(a+=`gcp-sa-key.json
227
227
  `),(e.isCloudflare||n.isCloudflare)&&(a+=`.dev.vars*
228
+ .env.cloudflare
228
229
  .wrangler/
229
230
  `),Mr(e)&&(a+=`/worker-configuration.d.ts
230
231
  `),(n.depending.vinext||e.depending.vinext)&&(a+=`.vinext/
@@ -438,4 +439,4 @@ Close #<IssueNumber>
438
439
  -->
439
440
  `.trim()};async function Ds(n){return y.functionIgnoringException(`generateGitHubTemplates`,async()=>{if(n.isWillBoosterRepo)for(let[r,i]of Object.entries(Es)){let a=Os(i,n),o=t.resolve(n.dirPath,`.github`,r);e.existsSync(o)&&ae(await e.promises.readFile(o,`utf8`),a)>a.length/2||(await e.promises.mkdir(t.resolve(n.dirPath,`.github`),{recursive:!0}),await x.run(()=>b.generateFile(o,a)))}})}function Os(e,t){let n=t.isBun?`bun run`:`yarn`;return e.replaceAll(Ts,n)}const ks=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],As=String.raw`(?:WillBooster|WillBoosterLab)`,js=[RegExp(`^${As}/[^#\\s]+(?:#\\S+)?$`,`u`),RegExp(`^github:${As}/[^#\\s]+(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?https://github\\.com/${As}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?ssh://git@github\\.com[:/]${As}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?git@github\\.com:${As}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`)];function Ms(e){let n=e.flatMap(Ns);if(n.length===0)return;let r=n.map(({dependencyName:e,dirPath:n,sectionName:r,specifier:i})=>`- ${t.join(n,`package.json`)}: ${r}.${e} uses ${i}`).join(`
440
441
  `);throw Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${r}`)}function Ns(e){let t=e.packageJson;if(!t)return[];let n=[];for(let r of ks){let i=t[r];if(i)for(let[t,a]of Object.entries(i))a&&Ps(a)&&(Is(a)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:r,specifier:a}))}return n}function Ps(e){return Fs(e)||/^(?:bitbucket|gist|github|gitlab):/u.test(e)||/^https?:\/\/(?:bitbucket\.org|github\.com|gitlab\.com)\//u.test(e)||/^(?:https?|ssh):\/\/\S+\.git(?:#\S+)?$/u.test(e)||/^[^@\s]+@[^:\s]+:\S+(?:#\S+)?$/u.test(e)||e.startsWith(`git:`)||e.startsWith(`git+`)||e.startsWith(`ssh://git@`)}function Fs(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}function Is(e){return js.some(t=>t.test(e))}async function Ls(){let e=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(Bs()).strict().argv;v.isVerbose=e.verbose,v.doesUploadEnvVars=e.env;let t=!1;try{t=await Rs(e.paths,e.skipDeps)}finally{fe()}t&&(process.exitCode=1)}async function Rs(n,r){let i=!1;for(let a of n){let n=t.join(a,`packages`),o=(await _(()=>e.promises.readdir(n,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(n,e.name));await Kt([a,...o]);let s=await Ar(a);if(v.isVerbose,!s){console.error(`there is no valid package.json in ${a}`),i=!0;continue}let c=un(s),l=[s,...(await Promise.all(o.map(e=>Ar(e,s)))).filter(e=>!!e)];if(v.isVerbose)for(let e of l)console.info(e);Ms(l),await di(s),s.isBun&&await rr(s);let u=!nn(s.repository)&&(s.repository?.startsWith(`github:WillBooster/`)||s.repository?.startsWith(`github:WillBoosterLab/`));await Promise.all([Ke(s),c.then(()=>Ao(s)),Gn(s,l),mr(s),gr(s),yr(s,l),br(s),Sr(s),Ds(s),ti(s),ko(s),Io(s),Po(s),...u?[tn(s)]:[],us(s),ms(s),xs(s),Cs(s),ro(s),mo(s)]),await x.promiseAll();let d=[];for(let e of l)(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Jt(e,e.isRoot?l:[e])),e.depending.playwrightTest&&d.push(Oe(e)),e.depending.next&&d.push(me(e)),await Zr(e,s),await x.promiseAll(),!(!e.isRoot&&!e.doesContainPackageJson)&&(await Eo(e),await Di(e,s,r),Mr(e)&&await Wn(e),d.push(mo(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&d.push(cs(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Vo(e)),S(e)?(d.push(yo(e)),d.push(xo(e,s))):!e.isRoot&&e.doesContainPackageJson&&S(s)&&d.push(xo(e,s)),e.depending.pyright&&d.push(Oo(e)));await Promise.all(d),await x.promiseAll(),await gn(s,l);let f=s.isBun?`bun`:`yarn`;s.isBun?await y.functionIgnoringException(`refreshBunLock`,async()=>{await Promise.resolve(),zs(a)}):I(f,[`install`,`--no-immutable`],a),I(f,[`cleanup`],a),await Ro(s)}return i}function zs(e){let t=bn(`bun`,[`install`],e);if(t!==0)throw Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}function Bs(){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}await Ls();
441
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsInNvcnRPYmplY3RLZXlzIiwiZ2l0SG9va3MiLCJkZXRlY3ROZXdsaW5lIiwiZnMiLCJmcyIsIm5ld0NvbnRlbnQiLCJjb21tb25Db250ZW50IiwibmV3Q29udGVudCIsImNoaWxkUHJvY2VzcyIsImZzcCIsInBhcnNlSnNvbmMiLCJwYXJzZVRvbWwiLCJjb21tb25Db250ZW50IiwiZGVwZW5kZW5jeVNlY3Rpb25LZXlzIiwiY29yZSIsImVzY2FwZVJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsIm1hbmFnZWRDb25maWdCbG9ja3MiLCJnZXRDb25maWdDb250ZW50IiwianNvbk9iaiIsImlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yIl0sInNvdXJjZXMiOlsiLi4vLi4vc2hhcmVkLWxpYi9zcmMvc2xlZXAudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvdXRpbHMvdHlwZXNjcmlwdEFwaS50cyIsIi4uL3NyYy9maXhlcnMvbmV4dENvbmZpZy50cyIsIi4uL3NyYy91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2dsb2JVdGlsLnRzIiwiLi4vc3JjL2ZpeGVycy9wcmlzbWEudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kZXRlY3QtaW5kZW50L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1uZXdsaW5lL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2dpdC1ob29rcy1saXN0L2luZGV4Lmpzb24iLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9tZXJnZVV0aWwudHMiLCIuLi9zcmMvdXRpbHMvb2JqZWN0VXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBvcy50cyIsIi4uL3NyYy9maXhlcnMvd2JEYkNvbW1hbmQudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3dyYW5nbGVyVHlwZXNDb21tYW5kLnRzIiwiLi4vc3JjL2ZpeGVycy93b3JrZXJUeXBlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2lkZWEudHMiLCIuLi9zcmMvdXRpbHMvZ2VuSTE4blRzLnRzIiwiLi4vc3JjL2dpdGh1Yi9jb21taXQudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy95YXJucmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvY29uZmlnQ29udGVudC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21hbmFnZWRDb25maWdCbG9jay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294Zm10Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3NraWxscy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3RzY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9ydWxlc2V0LnRzIiwiLi4vc3JjL2dpdGh1Yi9zZWNyZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy91dGlscy9kZXBlbmRlbmN5U291cmNlUG9saWN5LnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICAgKiBGb3IgZXhhbXBsZSwgYHJldHJ5Q291bnQ6IDNgIHJ1bnMgdGhlIGZ1bmN0aW9uIGF0IG1vc3QgMyB0aW1lczogMSBpbml0aWFsIGF0dGVtcHQgYW5kIHVwIHRvIDIgcmV0cmllcy5cbiAgICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xuICBkb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuZXhwb3J0IGNvbnN0IGZzVXRpbCA9IHtcbiAgYXN5bmMgcmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBhc3luYyBnZW5lcmF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgbGV0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCArPSAnXFxuJztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgQVBJIH0gZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9zeW5jJztcbmltcG9ydCB0eXBlIHsgU291cmNlRmlsZSB9IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgKEdvKSBjb21waWxlciBhcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UgYW5kIG5vXG4vLyBsb25nZXIgZXhwb3NlcyBhbiBpbi1wcm9jZXNzIHBhcnNlciBzdWNoIGFzIGB0cy5jcmVhdGVTb3VyY2VGaWxlYC4gUGFyc2luZyBub3dcbi8vIGhhcHBlbnMgaW4gYSBzcGF3bmVkIGNvbXBpbGVyIHNlcnZlciByZWFjaGVkIHRocm91Z2ggdGhlIHN5bmNocm9ub3VzIEFQSSwgc28gd2Vcbi8vIGtlZXAgYSBzaW5nbGUgbGF6aWx5LWNyZWF0ZWQgaW5zdGFuY2UgYW5kIHJldXNlIGl0IGFjcm9zcyBldmVyeSBmaXhlciB0byBhdm9pZFxuLy8gcGF5aW5nIHRoZSBwcm9jZXNzLXNwYXduIGNvc3QgcGVyIGZpbGUuXG5sZXQgYXBpOiBBUEkgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGdldEFwaSgpOiBBUEkge1xuICByZXR1cm4gKGFwaSA/Pz0gbmV3IEFQSSh7IGN3ZDogcHJvY2Vzcy5jd2QoKSB9KSk7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgc291cmNlIGZpbGUgaW50byBhIFR5cGVTY3JpcHQgQVNUIHVzaW5nIHRoZSBidW5kbGVkIG5hdGl2ZSBjb21waWxlci5cbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgY29tcGlsZXIgY2Fubm90IGxvYWQgdGhlIGZpbGUgKGUuZy4gaXQgaXMgbWlzc2luZ1xuICogb3IgdW5wYXJzYWJsZSkgc28gY2FsbGVycyBjYW4gZmFsbCBiYWNrIHRvIGNvbnNlcnZhdGl2ZSBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nKTogU291cmNlRmlsZSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBnZXRBcGkoKS51cGRhdGVTbmFwc2hvdCh7IG9wZW5GaWxlczogW2ZpbGVQYXRoXSB9KTtcbiAgICByZXR1cm4gc25hcHNob3QuZ2V0RGVmYXVsdFByb2plY3RGb3JGaWxlKGZpbGVQYXRoKT8ucHJvZ3JhbS5nZXRTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNodXRzIGRvd24gdGhlIHNwYXduZWQgY29tcGlsZXIgc2VydmVyLiBUaGUgc2VydmVyIGtlZXBzIGFuIG9wZW4gSVBDIGNoYW5uZWxcbiAqIHRoYXQgd291bGQgb3RoZXJ3aXNlIGtlZXAgdGhlIE5vZGUuanMgZXZlbnQgbG9vcCBhbGl2ZSwgc28gd2JmeSBtdXN0IGNhbGwgdGhpc1xuICogb25jZSBpdHMgcnVuIGZpbmlzaGVzIGZvciB0aGUgcHJvY2VzcyB0byBleGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZVR5cGVTY3JpcHRBcGkoKTogdm9pZCB7XG4gIGFwaT8uY2xvc2UoKTtcbiAgYXBpID0gdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5cbi8vIFNldHRpbmdzIGV2ZXJ5IFdpbGxCb29zdGVyIE5leHQuanMgcHJvamVjdCBzaG91bGQgY2FycnkuIGBuYW1lYCBpcyB0aGUgdG9wLWxldmVsXG4vLyBwcm9wZXJ0eSBrZXkgdXNlZCB0byBkZXRlY3Qgd2hldGhlciB0aGUgc2V0dGluZyBhbHJlYWR5IGV4aXN0czsgYHRleHRgIGlzIGluc2VydGVkXG4vLyB2ZXJiYXRpbSAoYSB3aG9sZSBga2V5OiB2YWx1ZWAgcGFpcikgd2hlbiB0aGUga2V5IGlzIG1pc3NpbmcuXG5jb25zdCBtYW5hZ2VkUHJvcGVydGllczogcmVhZG9ubHkgeyBuYW1lOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9W10gPSBbXG4gIHsgbmFtZTogJ3JlYWN0Q29tcGlsZXInLCB0ZXh0OiAncmVhY3RDb21waWxlcjogdHJ1ZScgfSxcbiAgeyBuYW1lOiAncmVhY3RTdHJpY3RNb2RlJywgdGV4dDogJ3JlYWN0U3RyaWN0TW9kZTogdHJ1ZScgfSxcbiAgeyBuYW1lOiAndHlwZXNjcmlwdCcsIHRleHQ6ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0nIH0sXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ3RzJywgJ210cycsICdjdHMnLCAnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IGV4dHJhY3RlZCA9IGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoKTtcbiAgICBpZiAoIWV4dHJhY3RlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgc291cmNlLCBvYmplY3RMaXRlcmFsIH0gPSBleHRyYWN0ZWQ7XG5cbiAgICAvLyBgcHJvcGVydGllc2AgaW5jbHVkZXMgc3ByZWFkIGFzc2lnbm1lbnRzIChgLi4ucmVzdGApIHRoYXQgY2Fycnkgbm8gbmFtZSwgc28gZ3VhcmQgYmVmb3JlIHJlYWRpbmcgaXQuXG4gICAgY29uc3QgZXhpc3RpbmdQcm9wZXJ0aWVzID0gbmV3IFNldChcbiAgICAgIG9iamVjdExpdGVyYWwucHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PlxuICAgICAgICAnbmFtZScgaW4gcHJvcGVydHkgJiYgcHJvcGVydHkubmFtZSA/IGdldFByb3BlcnR5S2V5KHByb3BlcnR5Lm5hbWUsIHNvdXJjZSkgOiB1bmRlZmluZWRcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHByb3BlcnR5VGV4dHMgPSBtYW5hZ2VkUHJvcGVydGllc1xuICAgICAgLmZpbHRlcigocHJvcGVydHkpID0+ICFleGlzdGluZ1Byb3BlcnRpZXMuaGFzKHByb3BlcnR5Lm5hbWUpKVxuICAgICAgLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LnRleHQpO1xuICAgIGlmIChwcm9wZXJ0eVRleHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IHNvdXJjZS50ZXh0O1xuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gb2JqZWN0TGl0ZXJhbC5nZXRFbmQoKSAtIDE7XG4gICAgLy8gVGhlIG5hdGl2ZSBUUyBBU1QgZG9lcyBub3QgcmVsaWFibHkgZXhwb3NlIGBwcm9wZXJ0aWVzLmhhc1RyYWlsaW5nQ29tbWFgLCBzbyBzY2FuIHRoZSBzb3VyY2VcbiAgICAvLyBiZXR3ZWVuIHRoZSBsYXN0IHByb3BlcnR5IGFuZCB0aGUgY2xvc2luZyBicmFjZS4gU3RyaXAgY29tbWVudHMgZmlyc3Qgc28gYSBjb21tYSBpbnNpZGUgYVxuICAgIC8vIHRyYWlsaW5nIGNvbW1lbnQgKGUuZy4gYGZvbzogMSAvLyBhLCBiYCkgaXMgbm90IG1pc3Rha2VuIGZvciBhIHJlYWwgdHJhaWxpbmcgY29tbWEuXG4gICAgY29uc3QgbGFzdFByb3BlcnR5ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmF0KC0xKTtcbiAgICBjb25zdCBoYXNUcmFpbGluZ0NvbW1hID0gbGFzdFByb3BlcnR5XG4gICAgICA/IHN0cmlwQ29tbWVudHMob2xkQ29udGVudC5zbGljZShsYXN0UHJvcGVydHkuZ2V0RW5kKCksIGluc2VydGlvblBvaW50KSkuaW5jbHVkZXMoJywnKVxuICAgICAgOiBmYWxzZTtcbiAgICBjb25zdCBwcmVmaXggPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubGVuZ3RoID4gMCAmJiAhaGFzVHJhaWxpbmdDb21tYSA/ICcsICcgOiAnJztcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBpbnNlcnRpb25Qb2ludCl9JHtwcmVmaXh9JHtwcm9wZXJ0eVRleHRzLmpvaW4oJywgJyl9JHtvbGRDb250ZW50LnNsaWNlKFxuICAgICAgaW5zZXJ0aW9uUG9pbnRcbiAgICApfWA7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiB7IHNvdXJjZTogYXN0LlNvdXJjZUZpbGU7IG9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkIGRlY2xhcmVzIHRoZSBjb25maWcgYXMgYGNvbnN0IG5leHRDb25maWc6IE5leHRDb25maWcgPSB7IC4uLiB9YCBhbmRcbiAgLy8gZXhwb3J0cyBpdCAocG9zc2libHkgd3JhcHBlZCwgZS5nLiBgd2l0aFNlbnRyeUNvbmZpZyguLi4pYCksIHNvIHRoZSBvYmplY3QgbGl0ZXJhbCBpcyByYXJlbHlcbiAgLy8gdGhlIGRpcmVjdCBvcGVyYW5kIG9mIGBleHBvcnQgZGVmYXVsdGAvYG1vZHVsZS5leHBvcnRzYC4gQ29sbGVjdCBldmVyeSBjYW5kaWRhdGUgYW5kIHBpY2sgdGhlXG4gIC8vIG1vc3QgYXV0aG9yaXRhdGl2ZSBvbmUgYmVsb3cuXG4gIGxldCBkaXJlY3RPYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGxldCBleHBvcnRlZElkZW50aWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmFyaWFibGVPYmplY3RMaXRlcmFscyA9IG5ldyBNYXA8c3RyaW5nLCBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24+KCk7XG4gIGNvbnN0IHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHM6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbltdID0gW107XG5cbiAgY29uc3QgdmlzaXQgPSAobm9kZTogYXN0Lk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoYXN0LmlzRXhwb3J0QXNzaWdubWVudChub2RlKSkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5leHByZXNzaW9uKTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz89IG9iamVjdExpdGVyYWw7XG4gICAgICB9IGVsc2UgaWYgKGFzdC5pc0lkZW50aWZpZXIobm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgICBleHBvcnRlZElkZW50aWZpZXIgPz89IG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGFzdC5pc0JpbmFyeUV4cHJlc3Npb24obm9kZSkgJiZcbiAgICAgIG5vZGUub3BlcmF0b3JUb2tlbi5raW5kID09PSBhc3QuU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgbm9kZS5sZWZ0LmdldFRleHQoc291cmNlKSA9PT0gJ21vZHVsZS5leHBvcnRzJ1xuICAgICkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5yaWdodCk7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/PSBvYmplY3RMaXRlcmFsO1xuICAgICAgfSBlbHNlIGlmIChhc3QuaXNJZGVudGlmaWVyKG5vZGUucmlnaHQpKSB7XG4gICAgICAgIGV4cG9ydGVkSWRlbnRpZmllciA/Pz0gbm9kZS5yaWdodC5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhc3QuaXNWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpICYmIG5vZGUuaW5pdGlhbGl6ZXIpIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUuaW5pdGlhbGl6ZXIpO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwgJiYgYXN0LmlzSWRlbnRpZmllcihub2RlLm5hbWUpKSB7XG4gICAgICAgIHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuc2V0KG5vZGUubmFtZS5nZXRUZXh0KHNvdXJjZSksIG9iamVjdExpdGVyYWwpO1xuICAgICAgICAvLyBBIGA6IE5leHRDb25maWdgIGFubm90YXRpb24gb3IgYSBgc2F0aXNmaWVzYC9gYXMgTmV4dENvbmZpZ2AgYXNzZXJ0aW9uIG1hcmtzIHRoZSBjYW5vbmljYWxcbiAgICAgICAgLy8gY29uZmlnIG9iamVjdCAoYWNjZXB0aW5nIHF1YWxpZmllZCBuYW1lcyBzdWNoIGFzIGBpbXBvcnQoJ25leHQnKS5OZXh0Q29uZmlnYCkuXG4gICAgICAgIGNvbnN0IGFubm90YXRpb25UeXBlID0gbm9kZS50eXBlPy5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IGFzc2VydGVkVHlwZSA9IGdldEFzc2VydGVkVHlwZShub2RlLmluaXRpYWxpemVyKT8uZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgICBjb25zdCBpc1R5cGVkQXNOZXh0Q29uZmlnID1cbiAgICAgICAgICAoYW5ub3RhdGlvblR5cGUgIT09IHVuZGVmaW5lZCAmJiBpc05leHRDb25maWdUeXBlKGFubm90YXRpb25UeXBlKSkgfHxcbiAgICAgICAgICAoYXNzZXJ0ZWRUeXBlICE9PSB1bmRlZmluZWQgJiYgaXNOZXh0Q29uZmlnVHlwZShhc3NlcnRlZFR5cGUpKTtcbiAgICAgICAgaWYgKGlzVHlwZWRBc05leHRDb25maWcpIHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHMucHVzaChvYmplY3RMaXRlcmFsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9O1xuICBzb3VyY2UuZm9yRWFjaENoaWxkKHZpc2l0KTtcblxuICBjb25zdCBvYmplY3RMaXRlcmFsID1cbiAgICB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzWzBdID8/XG4gICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/P1xuICAgIChleHBvcnRlZElkZW50aWZpZXIgPyB2YXJpYWJsZU9iamVjdExpdGVyYWxzLmdldChleHBvcnRlZElkZW50aWZpZXIpIDogdW5kZWZpbmVkKSA/P1xuICAgIHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuZ2V0KCduZXh0Q29uZmlnJyk7XG4gIHJldHVybiBvYmplY3RMaXRlcmFsID8geyBzb3VyY2UsIG9iamVjdExpdGVyYWwgfSA6IHVuZGVmaW5lZDtcbn1cblxuLy8gVW53cmFwIGAoeyAuLi4gfSlgIC8gYHsgLi4uIH0gYXMgTmV4dENvbmZpZ2AgLyBgeyAuLi4gfSBzYXRpc2ZpZXMgTmV4dENvbmZpZ2AgdG8gdGhlIG9iamVjdCBsaXRlcmFsLlxuZnVuY3Rpb24gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGN1cnJlbnQgPSB1bndyYXBFeHByZXNzaW9uKG5vZGUpO1xuICByZXR1cm4gYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oY3VycmVudCkgPyBjdXJyZW50IDogdW5kZWZpbmVkO1xufVxuXG4vLyBSZXR1cm4gdGhlIGFzc2VydGVkIHR5cGUgb2YgYSBgc2F0aXNmaWVzYC9gYXNgIGV4cHJlc3Npb24sIGlmIGFueSAoaWdub3Jpbmcgd3JhcHBpbmcgcGFyZW50aGVzZXMpLlxuZnVuY3Rpb24gZ2V0QXNzZXJ0ZWRUeXBlKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0LlR5cGVOb2RlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY3VycmVudCA9IHVud3JhcFBhcmVudGhlc2VzKG5vZGUpO1xuICByZXR1cm4gYXN0LmlzQXNFeHByZXNzaW9uKGN1cnJlbnQpIHx8IGFzdC5pc1NhdGlzZmllc0V4cHJlc3Npb24oY3VycmVudCkgPyBjdXJyZW50LnR5cGUgOiB1bmRlZmluZWQ7XG59XG5cbi8vIFBlZWwgcGFyZW50aGVzZXMgYW5kIGBhc2AvYHNhdGlzZmllc2AgYXNzZXJ0aW9ucyBvZmYgYW4gZXhwcmVzc2lvbi5cbmZ1bmN0aW9uIHVud3JhcEV4cHJlc3Npb24obm9kZTogYXN0LkV4cHJlc3Npb24pOiBhc3QuTm9kZSB7XG4gIGxldCBjdXJyZW50OiBhc3QuTm9kZSA9IHVud3JhcFBhcmVudGhlc2VzKG5vZGUpO1xuICB3aGlsZSAoYXN0LmlzQXNFeHByZXNzaW9uKGN1cnJlbnQpIHx8IGFzdC5pc1NhdGlzZmllc0V4cHJlc3Npb24oY3VycmVudCkpIHtcbiAgICBjdXJyZW50ID0gdW53cmFwUGFyZW50aGVzZXMoY3VycmVudC5leHByZXNzaW9uKTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLy8gUGVlbCB3cmFwcGluZyBwYXJlbnRoZXNlcyBvZmYgYW4gZXhwcmVzc2lvbi5cbmZ1bmN0aW9uIHVud3JhcFBhcmVudGhlc2VzKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0LkV4cHJlc3Npb24ge1xuICBsZXQgY3VycmVudCA9IG5vZGU7XG4gIHdoaWxlIChhc3QuaXNQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihjdXJyZW50KSkge1xuICAgIGN1cnJlbnQgPSBjdXJyZW50LmV4cHJlc3Npb247XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8vIE1hdGNoIGJvdGggdGhlIGJhcmUgYE5leHRDb25maWdgIGFuZCBxdWFsaWZpZWQgZm9ybXMgbGlrZSBgaW1wb3J0KCduZXh0JykuTmV4dENvbmZpZ2AuXG5mdW5jdGlvbiBpc05leHRDb25maWdUeXBlKHR5cGVUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVUZXh0ID09PSAnTmV4dENvbmZpZycgfHwgdHlwZVRleHQuZW5kc1dpdGgoJy5OZXh0Q29uZmlnJyk7XG59XG5cbi8vIFJldHVybiBhIHByb3BlcnR5IGtleSB3aXRob3V0IHN1cnJvdW5kaW5nIHF1b3Rlcywgc28gYCdyZWFjdENvbXBpbGVyJ2AgbWF0Y2hlcyBgcmVhY3RDb21waWxlcmAuXG4vLyBJZGVudGlmaWVyLCBzdHJpbmctbGl0ZXJhbCBhbmQgbnVtZXJpYy1saXRlcmFsIG5hbWVzIGFsbCBleHBvc2UgdGhlIHVucXVvdGVkIHZhbHVlIHZpYSBgLnRleHRgLlxuZnVuY3Rpb24gZ2V0UHJvcGVydHlLZXkobmFtZTogYXN0LlByb3BlcnR5TmFtZSwgc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHN0cmluZyB7XG4gIHJldHVybiAndGV4dCcgaW4gbmFtZSAmJiB0eXBlb2YgbmFtZS50ZXh0ID09PSAnc3RyaW5nJyA/IG5hbWUudGV4dCA6IG5hbWUuZ2V0VGV4dChzb3VyY2UpO1xufVxuXG4vLyBSZW1vdmUgbGluZSBhbmQgYmxvY2sgY29tbWVudHMgZnJvbSBhIHNvdXJjZSBzbmlwcGV0LlxuZnVuY3Rpb24gc3RyaXBDb21tZW50cyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9cXC9cXC9bXlxcbl0qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgJycpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkpzT3JUcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvZXNDb250YWluSmF2YShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkphdmEgfHwgY29uZmlnLmRvZXNDb250YWluSmF2YUluUGFja2FnZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQoY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdpc0J1bic+KTogJ2J1bicgfCAneWFybicge1xuICByZXR1cm4gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZU1hbmFnZXJDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG50eXBlIFBhcnNlZFZhbHVlID1cbiAgfCB7IGtpbmQ6ICdhcnJheSc7IHZhbHVlOiBQYXJzZWRWYWx1ZVtdIH1cbiAgfCB7IGtpbmQ6ICdsaXRlcmFsJzsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnb2JqZWN0JzsgdmFsdWU6IFBhcnNlZE9iamVjdCB9O1xudHlwZSBPYmplY3RNZW1iZXIgPSB7IGtpbmQ6ICdleHRyYSc7IGluZGV4OiBudW1iZXIgfSB8IHsga2luZDogJ3Byb3BlcnR5Jzsga2V5OiBzdHJpbmcgfTtcbmludGVyZmFjZSBQYXJzZWRPYmplY3Qge1xuICBleHRyYU1lbWJlcnM6IHN0cmluZ1tdO1xuICBtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW107XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcbn1cbmludGVyZmFjZSBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHtcbiAgc291cmNlOiBhc3QuU291cmNlRmlsZTtcbiAgbm9kZTogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uO1xufVxuXG5jb25zdCBsaXRlcmFsID0gKHZhbHVlOiBzdHJpbmcpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnbGl0ZXJhbCcsIHZhbHVlIH0pO1xuY29uc3QgYXNBcnJheSA9ICh2YWx1ZTogUGFyc2VkVmFsdWVbXSk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdhcnJheScsIHZhbHVlIH0pO1xuY29uc3QgYXNPYmplY3QgPSAocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRWYWx1ZSA9PiAoe1xuICBraW5kOiAnb2JqZWN0JyxcbiAgdmFsdWU6IHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXMsIGV4dHJhTWVtYmVycyksXG59KTtcblxuZnVuY3Rpb24gY3JlYXRlRGVmYXVsdENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzOiBib29sZWFuKTogUGFyc2VkT2JqZWN0IHtcbiAgY29uc3QgdXNlID0gdG9QYXJzZWRPYmplY3Qoe1xuICAgIHRyYWNlOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgICBzY3JlZW5zaG90OiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb25seS1vbi1mYWlsdXJlJyA6ICdvbidcIiksXG4gICAgdmlkZW86IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICB9KTtcblxuICBpZiAoc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMpIHtcbiAgICB1c2UucHJvcGVydGllcy5iYXNlVVJMID0gbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKTtcbiAgICB1c2UubWVtYmVyT3JkZXIudW5zaGlmdCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleTogJ2Jhc2VVUkwnIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRvUGFyc2VkT2JqZWN0KHtcbiAgICBmb3JiaWRPbmx5OiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgcmV0cmllczogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuUFdERUJVRyA/IDAgOiBwcm9jZXNzLmVudi5DSSA/IDUgOiAxJyksXG4gICAgdXNlOiB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogdXNlIH0sXG4gICAgLi4uKHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzXG4gICAgICA/IHtcbiAgICAgICAgICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IGxpdGVyYWwoZ2V0V2JTdGFydFRlc3RDb21tYW5kKGNvbmZpZykpLFxuICAgICAgICAgICAgdXJsOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgICAgICAgICAgcmV1c2VFeGlzdGluZ1NlcnZlcjogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgICAgICAgICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgICAgICAgICAgc3Rkb3V0OiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgICAgICAgICAgc3RkZXJyOiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgICAgICAgICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgICAgICAgICBncmFjZWZ1bFNodXRkb3duOiBsaXRlcmFsKGB7XG4gIHNpZ25hbDogJ1NJR1RFUk0nLFxuICB0aW1lb3V0OiA1MDAsXG59YCksXG4gICAgICAgICAgfSksXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gdG9QYXJzZWRPYmplY3QocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRPYmplY3Qge1xuICByZXR1cm4ge1xuICAgIGV4dHJhTWVtYmVycyxcbiAgICBtZW1iZXJPcmRlcjogW1xuICAgICAgLi4uT2JqZWN0LmtleXMocHJvcGVydGllcykubWFwKChrZXkpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pKSxcbiAgICAgIC4uLmV4dHJhTWVtYmVycy5tYXAoKF8sIGluZGV4KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pKSxcbiAgICBdLFxuICAgIHByb3BlcnRpZXMsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYHBsYXl3cmlnaHQuY29uZmlnLnRzYCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCA9IGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoKTtcbiAgICBpZiAoIWV4dHJhY3RlZE9iamVjdExpdGVyYWwpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgaWYgKCFwYXJzZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzID1cbiAgICAgIChhd2FpdCBkb2VzRGVmaW5lTmV4dFB1YmxpY0Jhc2VVcmwoY29uZmlnLmRpclBhdGgpKSAmJiBzaG91bGRNYW5hZ2VBcHBTZXJ2ZXJEZWZhdWx0cyhjb25maWcsIHBhcnNlZCk7XG4gICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IGNyZWF0ZURlZmF1bHRDb25maWcoY29uZmlnLCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cyk7XG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VQYXJzZWRPYmplY3RzKGRlZmF1bHRDb25maWcsIHBhcnNlZCk7XG4gICAgYXBwbHlNYW5hZ2VkVXNlRGVmYXVsdHMobWVyZ2VkLCBkZWZhdWx0Q29uZmlnKTtcbiAgICBzZXRXZWJTZXJ2ZXJDb21tYW5kKG1lcmdlZCwgY29uZmlnKTtcblxuICAgIGNvbnN0IG5ld09iamVjdExpdGVyYWwgPSBzdHJpbmdpZnlWYWx1ZSh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VkIH0sIDApO1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZS50ZXh0O1xuICAgIGNvbnN0IHN0YXJ0ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldFN0YXJ0KGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBjb25zdCBlbmQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0RW5kKCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgc3RhcnQpfSR7bmV3T2JqZWN0TGl0ZXJhbH0ke29sZENvbnRlbnQuc2xpY2UoZW5kKX1gO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlOiBQYXJzZWRPYmplY3QsIG92ZXJyaWRlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRPYmplY3Qge1xuICBjb25zdCBvdmVycmlkZVByb3BlcnR5S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMob3ZlcnJpZGUucHJvcGVydGllcykpO1xuICBjb25zdCBleHRyYU1lbWJlcnMgPSBbLi4uYmFzZS5leHRyYU1lbWJlcnMsIC4uLm92ZXJyaWRlLmV4dHJhTWVtYmVyc107XG4gIC8vIEtlZXAgZGVmYXVsdC1vbmx5IG1lbWJlcnMgYmVmb3JlIHBhcnNlZCBtZW1iZXJzIHNvIHNwcmVhZHMgYW5kIGV4cGxpY2l0IGxvY2FsIHByb3BlcnRpZXMgcmV0YWluIHByZWNlZGVuY2UuXG4gIGNvbnN0IG1lbWJlck9yZGVyID0gW1xuICAgIC4uLmJhc2UubWVtYmVyT3JkZXIuZmlsdGVyKChtZW1iZXIpID0+IG1lbWJlci5raW5kICE9PSAncHJvcGVydHknIHx8ICFvdmVycmlkZVByb3BlcnR5S2V5cy5oYXMobWVtYmVyLmtleSkpLFxuICAgIC4uLm92ZXJyaWRlLm1lbWJlck9yZGVyLm1hcCgobWVtYmVyKTogT2JqZWN0TWVtYmVyID0+IHtcbiAgICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5JykgcmV0dXJuIG1lbWJlcjtcbiAgICAgIHJldHVybiB7IGtpbmQ6ICdleHRyYScsIGluZGV4OiBiYXNlLmV4dHJhTWVtYmVycy5sZW5ndGggKyBtZW1iZXIuaW5kZXggfTtcbiAgICB9KSxcbiAgXTtcbiAgY29uc3QgcHJvcGVydGllcyA9IHsgLi4uYmFzZS5wcm9wZXJ0aWVzIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG92ZXJyaWRlLnByb3BlcnRpZXMpKSB7XG4gICAgcHJvcGVydGllc1trZXldID0gbWVyZ2VQYXJzZWRWYWx1ZShwcm9wZXJ0aWVzW2tleV0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4geyBleHRyYU1lbWJlcnMsIG1lbWJlck9yZGVyLCBwcm9wZXJ0aWVzIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkVmFsdWUoYmFzZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQsIG92ZXJyaWRlOiBQYXJzZWRWYWx1ZSk6IFBhcnNlZFZhbHVlIHtcbiAgaWYgKGJhc2U/LmtpbmQgPT09ICdvYmplY3QnICYmIG92ZXJyaWRlLmtpbmQgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZS52YWx1ZSwgb3ZlcnJpZGUudmFsdWUpIH07XG4gIH1cbiAgcmV0dXJuIG92ZXJyaWRlO1xufVxuXG5mdW5jdGlvbiBhcHBseU1hbmFnZWRVc2VEZWZhdWx0cyhjb25maWc6IFBhcnNlZE9iamVjdCwgZGVmYXVsdENvbmZpZzogUGFyc2VkT2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IHVzZSA9IGNvbmZpZy5wcm9wZXJ0aWVzLnVzZTtcbiAgY29uc3QgZGVmYXVsdFVzZSA9IGRlZmF1bHRDb25maWcucHJvcGVydGllcy51c2U7XG4gIGlmICh1c2U/LmtpbmQgIT09ICdvYmplY3QnIHx8IGRlZmF1bHRVc2U/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgWyd0cmFjZScsICdzY3JlZW5zaG90JywgJ3ZpZGVvJ10pIHtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VXNlLnZhbHVlLnByb3BlcnRpZXNba2V5XTtcbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICB1c2UudmFsdWUucHJvcGVydGllc1trZXldID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRNYW5hZ2VBcHBTZXJ2ZXJEZWZhdWx0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIHBhcnNlZDogUGFyc2VkT2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8XG4gICAgcGFyc2VkLnByb3BlcnRpZXMud2ViU2VydmVyICE9PSB1bmRlZmluZWQgfHxcbiAgICBkb2VzT2JqZWN0SGF2ZUJhc2VVcmwocGFyc2VkLnByb3BlcnRpZXMudXNlKSB8fFxuICAgIGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBwYXJzZWQgfSwgJ05FWFRfUFVCTElDX0JBU0VfVVJMJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gZG9lc09iamVjdEhhdmVCYXNlVXJsKHZhbHVlOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWU/LmtpbmQgPT09ICdvYmplY3QnICYmIHZhbHVlLnZhbHVlLnByb3BlcnRpZXMuYmFzZVVSTCAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbCh2YWx1ZTogUGFyc2VkVmFsdWUsIGxpdGVyYWxUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlLmluY2x1ZGVzKGxpdGVyYWxUZXh0KTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHJldHVybiB2YWx1ZS52YWx1ZS5zb21lKChjaGlsZCkgPT4gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoY2hpbGQsIGxpdGVyYWxUZXh0KSk7XG4gIHJldHVybiAoXG4gICAgdmFsdWUudmFsdWUuZXh0cmFNZW1iZXJzLnNvbWUoKG1lbWJlcikgPT4gbWVtYmVyLmluY2x1ZGVzKGxpdGVyYWxUZXh0KSkgfHxcbiAgICBPYmplY3QudmFsdWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpLnNvbWUoKGNoaWxkKSA9PiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbChjaGlsZCwgbGl0ZXJhbFRleHQpKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb2VzRGVmaW5lTmV4dFB1YmxpY0Jhc2VVcmwoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGZvciAoY29uc3QgZW52RmlsZVBhdGggb2YgZ2V0RW52RmlsZVBhdGhzKGRpclBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICgvTkVYVF9QVUJMSUNfQkFTRV9VUkxcXHMqPS9tLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIGVudiBmaWxlcyBhcmUgZXhwZWN0ZWQgaW4gc29tZSByZXBvcy5cbiAgICB9XG4gIH1cblxuICAvLyBTb21lIFBsYXl3cmlnaHQgY29uZmlncyBvbmx5IGRlZmluZSBicm93c2VyIHByb2plY3RzIG9yIGZpeHR1cmVzIGFuZCBkbyBub3RcbiAgLy8gc3RhcnQgYSB3ZWIgYXBwLiBBdm9pZCBmb3JjaW5nIGFuIGFwcC1zZXJ2ZXIgVVJMIGludG8gdGhvc2UgcGFja2FnZXMuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RW52RmlsZVBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZW52RmlsZU5hbWVzID0gWycuZW52JywgJy5lbnYudGVzdCcsICcuZW52LmV4YW1wbGUnLCAnbWlzZS50b21sJywgJ21pc2UudGVzdC50b21sJ107XG4gIGNvbnN0IGVudkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTsgOyBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCkpIHtcbiAgICBlbnZGaWxlUGF0aHMucHVzaCguLi5lbnZGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gcGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCBmaWxlTmFtZSkpKTtcblxuICAgIC8vIFBsYXl3cmlnaHQgY29uZmlncyBvZnRlbiBsaXZlIGluIHBhY2thZ2VzLyogd2hpbGUgc2hhcmVkIGVudiBmaWxlcyBsaXZlIGF0IHRoZVxuICAgIC8vIHJlcG9zaXRvcnkgcm9vdCwgc28gd2FsayB1cHdhcmQgdW50aWwgdGhlIHRhcmdldCByZXBvIGJvdW5kYXJ5LlxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgJy5naXQnKSkpIGJyZWFrO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBlbnZGaWxlUGF0aHM7XG59XG5cbmZ1bmN0aW9uIHNldFdlYlNlcnZlckNvbW1hbmQob2JqZWN0OiBQYXJzZWRPYmplY3QsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHZvaWQge1xuICBjb25zdCB3ZWJTZXJ2ZXIgPSBvYmplY3QucHJvcGVydGllcy53ZWJTZXJ2ZXI7XG4gIGlmICh3ZWJTZXJ2ZXI/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgLy8gd2Igb3ducyB0aGUgY2Fub25pY2FsIHRlc3Qtc2VydmVyIHN0YXJ0dXAgcGF0aDsga2VlcCBjdXN0b20gUGxheXdyaWdodFxuICAvLyBzZXJ2ZXIgc2V0dGluZ3Mgd2hpbGUgbm9ybWFsaXppbmcgdGhlIGNvbW1hbmQgaXRzZWxmLiBJbnZva2Ugd2IgdGhyb3VnaCB0aGVcbiAgLy8gcGFja2FnZSBtYW5hZ2VyIGJlY2F1c2UgdGFyZ2V0IHJlcG9zIGluc3RhbGwgd2IgYXMgYSBwYWNrYWdlIGRlcGVuZGVuY3kuXG4gIHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQgPSBsaXRlcmFsKGdldFdiU3RhcnRUZXN0Q29tbWFuZChjb25maWcpKTtcbn1cblxuZnVuY3Rpb24gZ2V0V2JTdGFydFRlc3RDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJyR7Z2V0UGFja2FnZU1hbmFnZXJDb21tYW5kKGNvbmZpZyl9IHdiIHN0YXJ0IC0tbW9kZSB0ZXN0J2A7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoOiBzdHJpbmcpOiBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVHlwZVNjcmlwdCBhbHJlYWR5IHVuZGVyc3RhbmRzIG5lc3RlZCBvYmplY3QgbGl0ZXJhbHMgYW5kIHRlbXBsYXRlIHN0cmluZ3MsIHNvIHVzZVxuICAvLyBpdHMgQVNUIHJhbmdlcyBpbnN0ZWFkIG9mIGEgcmVnZXggdGhhdCBjYW4gc3RvcCBhdCB0aGUgZmlyc3QgaW5uZXIgY2xvc2luZyBicmFjZS5cbiAgbGV0IGZvdW5kOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IGFzdC5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgaWYgKGFzdC5pc0NhbGxFeHByZXNzaW9uKG5vZGUpICYmIG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkgPT09ICdkZWZpbmVDb25maWcnKSB7XG4gICAgICBjb25zdCBmaXJzdEFyZ3VtZW50ID0gbm9kZS5hcmd1bWVudHNbMF07XG4gICAgICBpZiAoZmlyc3RBcmd1bWVudCAmJiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZ3VtZW50KSkge1xuICAgICAgICBmb3VuZCA9IGZpcnN0QXJndW1lbnQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9O1xuICBzb3VyY2UuZm9yRWFjaENoaWxkKHZpc2l0KTtcblxuICByZXR1cm4gZm91bmQgPyB7IHNvdXJjZSwgbm9kZTogZm91bmQgfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb246IGFzdC5FeHByZXNzaW9uLCBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAoYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBwYXJzZWRPYmplY3QgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24sIHNvdXJjZSk7XG4gICAgcmV0dXJuIHBhcnNlZE9iamVjdCA/IHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBwYXJzZWRPYmplY3QgfSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmIChhc3QuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBleHByZXNzaW9uLmVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gcGFyc2VFeHByZXNzaW9uKGVsZW1lbnQsIHNvdXJjZSkpO1xuICAgIGlmIChlbGVtZW50cy5zb21lKChlbGVtZW50KTogZWxlbWVudCBpcyB1bmRlZmluZWQgPT4gZWxlbWVudCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYXNBcnJheShlbGVtZW50cyBhcyBQYXJzZWRWYWx1ZVtdKTtcbiAgfVxuICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oXG4gIG9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgc291cmNlOiBhc3QuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7IGV4dHJhTWVtYmVyczogW10sIG1lbWJlck9yZGVyOiBbXSwgcHJvcGVydGllczoge30gfTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoYXN0LmlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSkge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gbGl0ZXJhbChrZXkpO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIWFzdC5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgfHxcbiAgICAgICghYXN0LmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhYXN0LmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSlcbiAgICApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VkLmV4dHJhTWVtYmVycy5wdXNoKHByb3BlcnR5LmdldFRleHQoc291cmNlKSkgLSAxO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlWYWx1ZSh2YWx1ZTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgIGlmICh2YWx1ZS52YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICAgIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gICAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICAgIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbMF19YDtcbiAgICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYFtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH1dYDtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG5cbiAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgY29uc3QgZW1pdHRlZFByb3BlcnRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkodmFsdWUudmFsdWUubWVtYmVyT3JkZXIpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyLmZsYXRNYXAoKG1lbWJlciwgaW5kZXgpID0+IHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdleHRyYScpIHtcbiAgICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0TWVtYmVyKHZhbHVlLnZhbHVlLmV4dHJhTWVtYmVyc1ttZW1iZXIuaW5kZXhdID8/ICcnLCBpbmRlbnQpXTtcbiAgICB9XG5cbiAgICBpZiAobGFzdFByb3BlcnR5SW5kZXhCeUtleS5nZXQobWVtYmVyLmtleSkgIT09IGluZGV4KSByZXR1cm4gW107XG4gICAgY29uc3QgaXRlbSA9IHZhbHVlLnZhbHVlLnByb3BlcnRpZXNbbWVtYmVyLmtleV07XG4gICAgaWYgKCFpdGVtIHx8IGVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhtZW1iZXIua2V5KSkgcmV0dXJuIFtdO1xuICAgIGVtaXR0ZWRQcm9wZXJ0aWVzLmFkZChtZW1iZXIua2V5KTtcbiAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdFByb3BlcnR5KG1lbWJlci5rZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpXTtcbiAgfSk7XG4gIGxpbmVzLnB1c2goXG4gICAgLi4uT2JqZWN0LmVudHJpZXModmFsdWUudmFsdWUucHJvcGVydGllcylcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhZW1pdHRlZFByb3BlcnRpZXMuaGFzKGtleSkpXG4gICAgICAubWFwKChba2V5LCBpdGVtXSkgPT4gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KSlcbiAgKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGB7XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xuICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH19YDtcbn1cblxuZnVuY3Rpb24gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleShtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW10pOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBtZW1iZXJdIG9mIG1lbWJlck9yZGVyLmVudHJpZXMoKSkge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgbGFzdFByb3BlcnR5SW5kZXhCeUtleS5zZXQobWVtYmVyLmtleSwgaW5kZXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGFzdFByb3BlcnR5SW5kZXhCeUtleTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5OiBzdHJpbmcsIGl0ZW06IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICB9XG4gIH1cbiAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtrZXl9OiAke3N0cmluZ2lmaWVkWzBdfWA7XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0TWVtYmVyKG1lbWJlcjogc3RyaW5nLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gbWVtYmVyLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBzdHJpbmdpZmllZC5lbnRyaWVzKCkpIHtcbiAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtsaW5lfWA7XG4gIH1cbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLmFudGlncmF2aXR5Y2xpLyoqJyxcbiAgJyoqLy52ZW52LyoqJyxcbiAgJyoqL3Rlc3QtZml4dHVyZXMvKionLFxuICAnKiovdGVzdC9maXh0dXJlcy8qKicsXG4gICcqKi9kaXN0LyoqJyxcbiAgJyoqL2J1aWxkLyoqJyxcbiAgJyoqL3RhcmdldC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL3RtcC8qKicsXG5dO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQcmlzbWFFbnZGaWxlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQcmlzbWFFbnZGaWxlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzaG91bGRBZGRDb25uZWN0aW9uTGltaXQgPSBzaG91bGRBZGRTcWxpdGVDb25uZWN0aW9uTGltaXQoY29uZmlnKTtcbiAgICBjb25zdCBlbnZGaWxlcyA9IGF3YWl0IGZnLmdsb2IoWycqLmVudicsICcqLmVudi4qJ10sIHsgZG90OiB0cnVlLCBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgZm9yIChjb25zdCBlbnZGaWxlIG9mIGVudkZpbGVzKSB7XG4gICAgICBjb25zdCBlbnZGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZW52RmlsZSk7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKFxuICAgICAgICAvREFUQUJBU0VfVVJMXFxzKj1cXHMqXCI/KFteXCIjXFxuXSs/XFwuc3FsaXRlM1teXCIjXFxuXSopXCI/L2csXG4gICAgICAgIChtYXRjaCwgdXJsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXR1cm4gYERBVEFCQVNFX1VSTD1cIiR7bm9ybWFsaXplU3FsaXRlRGF0YWJhc2VVcmwodXJsLCBzaG91bGRBZGRDb25uZWN0aW9uTGltaXQpfVwiYDtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShlbnZGaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQWRkU3FsaXRlQ29ubmVjdGlvbkxpbWl0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIC8vIGBjb25uZWN0aW9uX2xpbWl0PTFgIG9ubHkgYXBwbGllcyB0byBQcmlzbWEncyBTUUxpdGUgZGF0YXNvdXJjZSBoYW5kbGluZy5cbiAgLy8gUmVwb3MgdGhhdCBvcHQgaW50byBub24tcHVyZSBTUUxpdGUgYWRhcHRlcnMgc2hvdWxkIGtlZXAgdGhlaXIgVVJMIGFzLWlzLlxuICByZXR1cm4gIWRlcGVuZGVuY2llc1snQHByaXNtYS9hZGFwdGVyLWJldHRlci1zcWxpdGUzJ10gJiYgIWRlcGVuZGVuY2llc1snQHByaXNtYS9hZGFwdGVyLWxpYnNxbCddO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTcWxpdGVEYXRhYmFzZVVybCh1cmw6IHN0cmluZywgc2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcXVlcnlTdGFydCA9IHVybC5pbmRleE9mKCc/Jyk7XG4gIGNvbnN0IHBhdGhQYXJ0ID0gcXVlcnlTdGFydCAhPT0gLTEgPyB1cmwuc2xpY2UoMCwgcXVlcnlTdGFydCkgOiB1cmw7XG4gIGNvbnN0IHF1ZXJ5UGFydCA9IHF1ZXJ5U3RhcnQgIT09IC0xID8gdXJsLnNsaWNlKHF1ZXJ5U3RhcnQgKyAxKSA6ICcnO1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5UGFydCk7XG5cbiAgcGFyYW1zLmRlbGV0ZSgnY29ubmVjdGlvbl9saW1pdCcpO1xuICBpZiAoc2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0KSB7XG4gICAgcGFyYW1zLnNldCgnY29ubmVjdGlvbl9saW1pdCcsICcxJyk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRRdWVyeSA/IGAke3BhdGhQYXJ0fT8ke25vcm1hbGl6ZWRRdWVyeX1gIDogcGF0aFBhcnQ7XG59XG4iLCJjb25zdCBoYXMgPSAob2JqZWN0LCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydE9iamVjdEJ5S2V5TmFtZUxpc3Qob2JqZWN0LCBzb3J0V2l0aCkge1xuICBsZXQga2V5cywgc29ydEZuLCBrZXlcblxuICBpZiAodHlwZW9mIHNvcnRXaXRoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc29ydEZuID0gc29ydFdpdGhcbiAgfSBlbHNlIHtcbiAgICBrZXlzID0gc29ydFdpdGhcbiAgfVxuXG4gIGNvbnN0IHRvdGFsID0ge31cbiAgY29uc3Qgb2JqZWN0S2V5cyA9IFsuLi4oa2V5cyA/PyBbXSksIC4uLk9iamVjdC5rZXlzKG9iamVjdCkuc29ydChzb3J0Rm4pXVxuXG4gIGZvciAoa2V5IG9mIG9iamVjdEtleXMpIHtcbiAgICBpZiAoaGFzKG9iamVjdCwga2V5KSkge1xuICAgICAgdG90YWxba2V5XSA9IG9iamVjdFtrZXldXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdGFsXG59XG4iLCIvLyBEZXRlY3QgZWl0aGVyIHNwYWNlcyBvciB0YWJzIGJ1dCBub3QgYm90aCB0byBwcm9wZXJseSBoYW5kbGUgdGFicyBmb3IgaW5kZW50YXRpb24gYW5kIHNwYWNlcyBmb3IgYWxpZ25tZW50XG5jb25zdCBJTkRFTlRfUkVHRVggPSAvXig/OiggKSt8XFx0KykvO1xuXG5jb25zdCBJTkRFTlRfVFlQRV9TUEFDRSA9ICdzcGFjZSc7XG5jb25zdCBJTkRFTlRfVFlQRV9UQUIgPSAndGFiJztcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHdlIHNob3VsZCBpZ25vcmUgc2luZ2xlIHNwYWNlIHBhdHRlcm5zXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIHZhbHVlKSB7XG5cdHJldHVybiBpZ25vcmVTaW5nbGVTcGFjZXMgJiYgaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgJiYgdmFsdWUgPT09IDE7XG59XG5cbi8qKlxuTWFrZSBhIE1hcCB0aGF0IGNvdW50cyBob3cgbWFueSBpbmRlbnRzL3VuaW5kZW50cyBoYXZlIG9jY3VycmVkIGZvciBhIGdpdmVuIHNpemUgYW5kIGhvdyBtYW55IGxpbmVzIGZvbGxvdyBhIGdpdmVuIGluZGVudGF0aW9uLlxuXG5UaGUga2V5IGlzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgaW5kZW50YXRpb24gdHlwZSAocyA9IHNwYWNlIGFuZCB0ID0gdGFiKSBhbmQgdGhlIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzLlxuXG5gYGBcbmluZGVudHMgPSB7XG5cdHQzOiBbMSwgMF0sXG5cdHQ0OiBbMSwgNV0sXG5cdHM1OiBbMSwgMF0sXG5cdHMxMjogWzEsIDBdLFxufVxuYGBgXG4qL1xuZnVuY3Rpb24gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBpZ25vcmVTaW5nbGVTcGFjZXMpIHtcblx0Y29uc3QgaW5kZW50cyA9IG5ldyBNYXAoKTtcblxuXHQvLyBSZW1lbWJlciB0aGUgc2l6ZSBvZiBwcmV2aW91cyBsaW5lJ3MgaW5kZW50YXRpb25cblx0bGV0IHByZXZpb3VzU2l6ZSA9IDA7XG5cdGxldCBwcmV2aW91c0luZGVudFR5cGU7XG5cblx0Ly8gSW5kZW50cyBrZXkgKGlkZW50IHR5cGUgKyBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cylcblx0bGV0IGtleTtcblxuXHRmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyaW5nLnNwbGl0KC9cXG4vZykpIHtcblx0XHRpZiAoIWxpbmUpIHtcblx0XHRcdC8vIElnbm9yZSBlbXB0eSBsaW5lc1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWF0Y2hlcyA9IGxpbmUubWF0Y2goSU5ERU5UX1JFR0VYKTtcblxuXHRcdGlmIChtYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGluZGVudCA9IG1hdGNoZXNbMF0ubGVuZ3RoO1xuXHRcdFx0Y29uc3QgaW5kZW50VHlwZSA9IG1hdGNoZXNbMV0gPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSB1bmxlc3MgaXQncyB0aGUgb25seSBpbmRlbnQgZGV0ZWN0ZWQgdG8gcHJldmVudCBjb21tb24gZmFsc2UgcG9zaXRpdmVzXG5cdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBpbmRlbnQpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaW5kZW50VHlwZSAhPT0gcHJldmlvdXNJbmRlbnRUeXBlKSB7XG5cdFx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9IGluZGVudFR5cGU7XG5cblx0XHRcdGxldCB1c2UgPSAxO1xuXHRcdFx0bGV0IHdlaWdodCA9IDA7XG5cblx0XHRcdGNvbnN0IGluZGVudERpZmZlcmVuY2UgPSBpbmRlbnQgLSBwcmV2aW91c1NpemU7XG5cdFx0XHRwcmV2aW91c1NpemUgPSBpbmRlbnQ7XG5cblx0XHRcdC8vIFByZXZpb3VzIGxpbmUgaGF2ZSBzYW1lIGluZGVudD9cblx0XHRcdGlmIChpbmRlbnREaWZmZXJlbmNlID09PSAwKSB7XG5cdFx0XHRcdC8vIE5vdCBhIG5ldyBcInVzZVwiIG9mIHRoZSBjdXJyZW50IGluZGVudDpcblx0XHRcdFx0dXNlID0gMDtcblx0XHRcdFx0Ly8gQnV0IGRvIGFkZCBhIGJpdCB0byBpdCBmb3IgYnJlYWtpbmcgdGllczpcblx0XHRcdFx0d2VpZ2h0ID0gMTtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBrZXkgZnJvbSBwcmV2aW91cyBsb29wXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UgPSBNYXRoLmFicyhpbmRlbnREaWZmZXJlbmNlKTtcblxuXHRcdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIGNoYW5nZXMgd2hlbiBpZ25vcmVTaW5nbGVTcGFjZXMgaXMgdHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIHByZXZlbnRzIGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXMgZnJvbSB0aGluZ3MgbGlrZSBhbGlnbmVkIGNvbW1lbnRzXG5cdFx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBzdGF0c1xuXHRcdFx0Y29uc3QgZW50cnkgPSBpbmRlbnRzLmdldChrZXkpO1xuXHRcdFx0aW5kZW50cy5zZXQoa2V5LCBlbnRyeSA9PT0gdW5kZWZpbmVkID8gWzEsIDBdIDogW2VudHJ5WzBdICsgdXNlLCBlbnRyeVsxXSArIHdlaWdodF0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBpbmRlbnRzO1xufVxuXG4vLyBFbmNvZGUgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgYXMgYSBzdHJpbmcgKGUuZy4gJ3M0JykgZm9yIHVzZSBhcyBhIGNvbXBvdW5kIGtleSBpbiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGluZGVudEFtb3VudCkge1xuXHRjb25zdCB0eXBlQ2hhcmFjdGVyID0gaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAncycgOiAndCc7XG5cdHJldHVybiB0eXBlQ2hhcmFjdGVyICsgU3RyaW5nKGluZGVudEFtb3VudCk7XG59XG5cbi8vIEV4dHJhY3QgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgZnJvbSBhIGtleSBvZiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBkZWNvZGVJbmRlbnRzS2V5KGluZGVudHNLZXkpIHtcblx0Y29uc3Qga2V5SGFzVHlwZVNwYWNlID0gaW5kZW50c0tleVswXSA9PT0gJ3MnO1xuXHRjb25zdCB0eXBlID0ga2V5SGFzVHlwZVNwYWNlID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0Y29uc3QgYW1vdW50ID0gTnVtYmVyKGluZGVudHNLZXkuc2xpY2UoMSkpO1xuXG5cdHJldHVybiB7dHlwZSwgYW1vdW50fTtcbn1cblxuLy8gUmV0dXJuIHRoZSBrZXkgKGUuZy4gJ3M0JykgZnJvbSB0aGUgaW5kZW50cyBNYXAgdGhhdCByZXByZXNlbnRzIHRoZSBtb3N0IGNvbW1vbiBpbmRlbnQsXG4vLyBvciByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBpbmRlbnRzLlxuZnVuY3Rpb24gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cykge1xuXHRsZXQgcmVzdWx0O1xuXHRsZXQgbWF4VXNlZCA9IDA7XG5cdGxldCBtYXhXZWlnaHQgPSAwO1xuXG5cdGZvciAoY29uc3QgW2tleSwgW3VzZWRDb3VudCwgd2VpZ2h0XV0gb2YgaW5kZW50cykge1xuXHRcdGlmICh1c2VkQ291bnQgPiBtYXhVc2VkIHx8ICh1c2VkQ291bnQgPT09IG1heFVzZWQgJiYgd2VpZ2h0ID4gbWF4V2VpZ2h0KSkge1xuXHRcdFx0bWF4VXNlZCA9IHVzZWRDb3VudDtcblx0XHRcdG1heFdlaWdodCA9IHdlaWdodDtcblx0XHRcdHJlc3VsdCA9IGtleTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCkge1xuXHRjb25zdCBpbmRlbnRDaGFyYWN0ZXIgPSB0eXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICcgJyA6ICdcXHQnO1xuXHRyZXR1cm4gaW5kZW50Q2hhcmFjdGVyLnJlcGVhdChhbW91bnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RJbmRlbnQoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHQvLyBJZGVudGlmeSBpbmRlbnRzIHdoaWxlIHNraXBwaW5nIHNpbmdsZSBzcGFjZSBpbmRlbnRzIHRvIGF2b2lkIGNvbW1vbiBlZGdlIGNhc2VzIChlLmcuIGNvZGUgY29tbWVudHMpXG5cdC8vIElmIG5vIGluZGVudHMgYXJlIGlkZW50aWZpZWQsIHJ1biBhZ2FpbiBhbmQgaW5jbHVkZSBhbGwgaW5kZW50cyBmb3IgY29tcHJlaGVuc2l2ZSBkZXRlY3Rpb25cblx0bGV0IGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIHRydWUpO1xuXHRpZiAoaW5kZW50cy5zaXplID09PSAwKSB7XG5cdFx0aW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgZmFsc2UpO1xuXHR9XG5cblx0Y29uc3Qga2V5T2ZNb3N0VXNlZEluZGVudCA9IGdldE1vc3RVc2VkS2V5KGluZGVudHMpO1xuXG5cdGxldCB0eXBlO1xuXHRsZXQgYW1vdW50ID0gMDtcblx0bGV0IGluZGVudCA9ICcnO1xuXG5cdGlmIChrZXlPZk1vc3RVc2VkSW5kZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHQoe3R5cGUsIGFtb3VudH0gPSBkZWNvZGVJbmRlbnRzS2V5KGtleU9mTW9zdFVzZWRJbmRlbnQpKTtcblx0XHRpbmRlbnQgPSBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGFtb3VudCxcblx0XHR0eXBlLFxuXHRcdGluZGVudCxcblx0fTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lKHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Y29uc3QgbmV3bGluZXMgPSBzdHJpbmcubWF0Y2goLyg/Olxccj9cXG4pL2cpIHx8IFtdO1xuXG5cdGlmIChuZXdsaW5lcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjcmxmID0gbmV3bGluZXMuZmlsdGVyKG5ld2xpbmUgPT4gbmV3bGluZSA9PT0gJ1xcclxcbicpLmxlbmd0aDtcblx0Y29uc3QgbGYgPSBuZXdsaW5lcy5sZW5ndGggLSBjcmxmO1xuXG5cdHJldHVybiBjcmxmID4gbGYgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZUdyYWNlZnVsKHN0cmluZykge1xuXHRyZXR1cm4gKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnICYmIGRldGVjdE5ld2xpbmUoc3RyaW5nKSkgfHwgJ1xcbic7XG59XG4iLCIiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Y29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcblx0cmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkgJiYgIShTeW1ib2wuaXRlcmF0b3IgaW4gdmFsdWUpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgc29ydE9iamVjdEtleXMgZnJvbSAnc29ydC1vYmplY3Qta2V5cydcbmltcG9ydCBkZXRlY3RJbmRlbnQgZnJvbSAnZGV0ZWN0LWluZGVudCdcbmltcG9ydCB7IGRldGVjdE5ld2xpbmVHcmFjZWZ1bCBhcyBkZXRlY3ROZXdsaW5lIH0gZnJvbSAnZGV0ZWN0LW5ld2xpbmUnXG5pbXBvcnQgZ2l0SG9va3MgZnJvbSAnZ2l0LWhvb2tzLWxpc3QnXG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICdpcy1wbGFpbi1vYmonXG5pbXBvcnQgc2VtdmVyQ29tcGFyZSBmcm9tICdzZW12ZXIvZnVuY3Rpb25zL2NvbXBhcmUuanMnXG5pbXBvcnQgc2VtdmVyTWluVmVyc2lvbiBmcm9tICdzZW12ZXIvcmFuZ2VzL21pbi12ZXJzaW9uLmpzJ1xuXG5jb25zdCBwaXBlID1cbiAgKGZucykgPT5cbiAgKHgsIC4uLmFyZ3MpID0+XG4gICAgZm5zLnJlZHVjZSgocmVzdWx0LCBmbikgPT4gZm4ocmVzdWx0LCAuLi5hcmdzKSwgeClcbmNvbnN0IG9uQXJyYXkgPSAoZm4pID0+ICh4KSA9PiAoQXJyYXkuaXNBcnJheSh4KSA/IGZuKHgpIDogeClcbmNvbnN0IG9uU3RyaW5nQXJyYXkgPSAoZm4pID0+ICh4KSA9PlxuICBBcnJheS5pc0FycmF5KHgpICYmIHguZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykgPyBmbih4KSA6IHhcbmNvbnN0IHVuaXEgPSBvblN0cmluZ0FycmF5KCh4cykgPT4gWy4uLm5ldyBTZXQoeHMpXSlcbmNvbnN0IHNvcnRBcnJheSA9IG9uU3RyaW5nQXJyYXkoKGFycmF5KSA9PiBhcnJheS50b1NvcnRlZCgpKVxuY29uc3QgdW5pcUFuZFNvcnRBcnJheSA9IHBpcGUoW3VuaXEsIHNvcnRBcnJheV0pXG5jb25zdCBvbk9iamVjdCA9XG4gIChmbikgPT5cbiAgKHgsIC4uLmFyZ3MpID0+XG4gICAgaXNQbGFpbk9iamVjdCh4KSA/IGZuKHgsIC4uLmFyZ3MpIDogeFxuY29uc3Qgc29ydE9iamVjdEJ5ID0gKGNvbXBhcmF0b3IsIGRlZXApID0+IHtcbiAgY29uc3Qgb3ZlciA9IG9uT2JqZWN0KChvYmplY3QpID0+IHtcbiAgICBpZiAoZGVlcCkge1xuICAgICAgb2JqZWN0ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhvYmplY3QpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBvdmVyKHZhbHVlKV0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBzb3J0T2JqZWN0S2V5cyhvYmplY3QsIGNvbXBhcmF0b3IpXG4gIH0pXG5cbiAgcmV0dXJuIG92ZXJcbn1cbmNvbnN0IHNvcnRPYmplY3QgPSBzb3J0T2JqZWN0QnkoKVxuY29uc3Qgc29ydFVSTE9iamVjdCA9IHNvcnRPYmplY3RCeShbJ3R5cGUnLCAndXJsJ10pXG5jb25zdCBzb3J0UGVvcGxlT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsnbmFtZScsICdlbWFpbCcsICd1cmwnXSlcbmNvbnN0IHNvcnREaXJlY3RvcmllcyA9IHNvcnRPYmplY3RCeShbXG4gICdsaWInLFxuICAnYmluJyxcbiAgJ21hbicsXG4gICdkb2MnLFxuICAnZXhhbXBsZScsXG4gICd0ZXN0Jyxcbl0pXG5jb25zdCBvdmVyUHJvcGVydHkgPSAocHJvcGVydHksIG92ZXIpID0+XG4gIG9uT2JqZWN0KChvYmplY3QsIC4uLmFyZ3MpID0+XG4gICAgT2JqZWN0Lmhhc093bihvYmplY3QsIHByb3BlcnR5KVxuICAgICAgPyB7IC4uLm9iamVjdCwgW3Byb3BlcnR5XTogb3ZlcihvYmplY3RbcHJvcGVydHldLCAuLi5hcmdzKSB9XG4gICAgICA6IG9iamVjdCxcbiAgKVxuY29uc3Qgc29ydEdpdEhvb2tzID0gc29ydE9iamVjdEJ5KGdpdEhvb2tzKVxuXG5jb25zdCBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UgPSAoc3BlY2lmaWVyKSA9PiB7XG4gIC8vIElnbm9yZSBhbnl0aGluZyBhZnRlciA+ICYgcmVseSBvbiBmYWxsYmFjayBhbHBoYW51bWVyaWMgc29ydGluZyBmb3IgdGhhdFxuICBjb25zdCBbbmFtZUFuZFZlcnNpb25dID0gc3BlY2lmaWVyLnNwbGl0KCc+JylcbiAgY29uc3QgYXRNYXRjaGVzID0gWy4uLm5hbWVBbmRWZXJzaW9uLm1hdGNoQWxsKCdAJyldXG4gIGlmIChcbiAgICAhYXRNYXRjaGVzLmxlbmd0aCB8fFxuICAgIChhdE1hdGNoZXMubGVuZ3RoID09PSAxICYmIGF0TWF0Y2hlc1swXS5pbmRleCA9PT0gMClcbiAgKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogc3BlY2lmaWVyIH1cbiAgfVxuICBjb25zdCBzcGxpdEluZGV4ID0gYXRNYXRjaGVzLnBvcCgpLmluZGV4XG4gIHJldHVybiB7XG4gICAgbmFtZTogbmFtZUFuZFZlcnNpb24uc3Vic3RyaW5nKDAsIHNwbGl0SW5kZXgpLFxuICAgIHJhbmdlOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoc3BsaXRJbmRleCArIDEpLFxuICB9XG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeVNlbXZlciA9IHNvcnRPYmplY3RCeSgoYSwgYikgPT4ge1xuICBjb25zdCB7IG5hbWU6IGFOYW1lLCByYW5nZTogYVJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYSlcbiAgY29uc3QgeyBuYW1lOiBiTmFtZSwgcmFuZ2U6IGJSYW5nZSB9ID0gcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlKGIpXG5cbiAgaWYgKGFOYW1lICE9PSBiTmFtZSkge1xuICAgIHJldHVybiBhTmFtZS5sb2NhbGVDb21wYXJlKGJOYW1lLCAnZW4nKVxuICB9XG4gIGlmICghYVJhbmdlKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKCFiUmFuZ2UpIHtcbiAgICByZXR1cm4gMVxuICB9XG4gIHJldHVybiBzZW12ZXJDb21wYXJlKHNlbXZlck1pblZlcnNpb24oYVJhbmdlKSwgc2VtdmVyTWluVmVyc2lvbihiUmFuZ2UpKVxufSlcblxuY29uc3QgZ2V0UGFja2FnZU5hbWUgPSAoaWRlbnQpID0+IHtcbiAgY29uc3QgaW5kZXggPSBpZGVudC5pbmRleE9mKCdAJywgaWRlbnQuc3RhcnRzV2l0aCgnQCcpID8gMSA6IDApXG4gIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHVubGVzcyB1c2VyIG1hbnVhbGx5IGVkaXQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gIHJldHVybiBpbmRleCA9PT0gLTEgPyBpZGVudCA6IGlkZW50LnNsaWNlKDAsIGluZGV4KVxufVxuXG5jb25zdCBzb3J0T2JqZWN0QnlJZGVudCA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lQSA9IGdldFBhY2thZ2VOYW1lKGEpXG4gIGNvbnN0IHBhY2thZ2VOYW1lQiA9IGdldFBhY2thZ2VOYW1lKGIpXG5cbiAgaWYgKHBhY2thZ2VOYW1lQSA8IHBhY2thZ2VOYW1lQikgcmV0dXJuIC0xXG4gIGlmIChwYWNrYWdlTmFtZUEgPiBwYWNrYWdlTmFtZUIpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIENhY2hlIGJ5IGBwcm9jZXNzLmN3ZCgpYCBpbnN0ZWFkIG9mIGEgdmFyaWFibGUgdG8gYWxsb3cgdXNlciBjYWxsIGBwcm9jZXNzLmNoZGlyKClgXG5jb25zdCBjYWNoZSA9IG5ldyBNYXAoKVxuY29uc3QgaGFzWWFybk9yUG5wbUZpbGVzID0gKCkgPT4ge1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpXG4gIGlmICghY2FjaGUuaGFzKGN3ZCkpIHtcbiAgICBjYWNoZS5zZXQoXG4gICAgICBjd2QsXG4gICAgICBmcy5leGlzdHNTeW5jKCd5YXJuLmxvY2snKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCcueWFybi8nKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCcueWFybnJjLnltbCcpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJ3BucG0tbG9jay55YW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS13b3Jrc3BhY2UueWFtbCcpLFxuICAgIClcbiAgfVxuICByZXR1cm4gY2FjaGUuZ2V0KGN3ZClcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBwYWNrYWdlIG1hbmFnZXIgZnJvbSBwYWNrYWdlLmpzb24gYW5kIGxvY2sgZmlsZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYWNrYWdlSnNvbiAtIFRoZSBwYXJzZWQgcGFja2FnZS5qc29uIG9iamVjdFxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVGhlIGRldGVjdGVkIHBhY2thZ2UgbWFuYWdlci4gRGVmYXVsdCB0byBucG0gaWYgbm90IGRldGVjdGVkLlxuICovXG5mdW5jdGlvbiBzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbShwYWNrYWdlSnNvbikge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL2NvcmVwYWNrXG4gIGlmICh0eXBlb2YgcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyLnN0YXJ0c1dpdGgoJ25wbUAnKVxuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLmRldkVuZ2luZXM/LnBhY2thZ2VNYW5hZ2VyPy5uYW1lKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLmRldkVuZ2luZXMucGFja2FnZU1hbmFnZXIubmFtZSA9PT0gJ25wbSdcbiAgfVxuXG4gIGlmIChwYWNrYWdlSnNvbi5wbnBtKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBPcHRpbWlzYXRpb246IENoZWNrIGlmIG5wbSBpcyBleHBsaWNpdCBiZWZvcmUgcmVhZGluZyBGUy5cbiAgaWYgKHBhY2thZ2VKc29uLmVuZ2luZXM/Lm5wbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoaGFzWWFybk9yUG5wbUZpbGVzKCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogU29ydCBkZXBlbmRlbmNpZXMgYWxwaGFiZXRpY2FsbHksIGRldGVjdGluZyBwYWNrYWdlIG1hbmFnZXIgdG8gdXNlIHRoZVxuICogYXBwcm9wcmlhdGUgY29tcGFyaXNvbi4gbnBtIHVzZXMgbG9jYWxlLWF3YXJlIGNvbXBhcmlzb24sIHlhcm4gYW5kIHBucG0gdXNlXG4gKiBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb25cbiAqL1xuY29uc3Qgc29ydERlcGVuZGVuY2llcyA9IG9uT2JqZWN0KChkZXBlbmRlbmNpZXMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIC8vIEF2b2lkIGZpbGUgYWNjZXNzXG4gIGlmIChPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMpLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gZGVwZW5kZW5jaWVzXG4gIH1cblxuICAvLyBzb3J0IGRlcHMgbGlrZSB0aGUgbnBtIENMSSBkb2VzICh2aWEgdGhlIHBhY2thZ2UgQG5wbWNsaS9wYWNrYWdlLWpzb24pXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vcGFja2FnZS1qc29uL2Jsb2IvYjY0NjVmNDRjNzI3ZDY1MTNkYjY4OThjN2NiZTQxZGQzNTVjZWJlOC9saWIvdXBkYXRlLWRlcGVuZGVuY2llcy5qcyNMOC1MMjFcbiAgaWYgKHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSkge1xuICAgIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMsIChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYiwgJ2VuJykpXG4gIH1cblxuICByZXR1cm4gc29ydE9iamVjdEtleXMoZGVwZW5kZW5jaWVzKVxufSlcblxuLyoqXG4gKiBcIndvcmtzcGFjZXNcIiBjYW4gYmUgYW4gYXJyYXkgKG5wbSBvciB5YXJuIGNsYXNzaWMpIG9yIGFuIG9iamVjdCAocG5wbS9idW4pLlxuICogSW4gdGhlIGNhc2Ugb2YgYW4gYXJyYXksIHdlIGRvIG5vdCB3YW50IHRvIGFscGhhYmV0aWNhbGx5IHNvcnQgaXQgaW4gY2FzZVxuICogc2NyaXB0cyBuZWVkIHRvIHJ1biBpbiBhIHNwZWNpZmljIG9yZGVyLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9jbGkvdjcvdXNpbmctbnBtL3dvcmtzcGFjZXM/dj10cnVlI3J1bm5pbmctY29tbWFuZHMtaW4tdGhlLWNvbnRleHQtb2Ytd29ya3NwYWNlc1xuICovXG5jb25zdCBzb3J0V29ya3NwYWNlcyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoWydwYWNrYWdlcycsICdjYXRhbG9nJ10pLFxuICBvdmVyUHJvcGVydHkoJ3BhY2thZ2VzJywgdW5pcUFuZFNvcnRBcnJheSksXG4gIG92ZXJQcm9wZXJ0eSgnY2F0YWxvZycsIHNvcnREZXBlbmRlbmNpZXMpLFxuXSlcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvYmxvYi9hY2MwZTQ3NTcyYTkzOTAyOTJiNGUzMTNiNGE0YmYzNjBkMjM2MzU4L2NvbmYvY29uZmlnLXNjaGVtYS5qc1xuY29uc3QgZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gIC8vIGBmaWxlc2AgYW5kIGBleGNsdWRlZEZpbGVzYCBhcmUgb25seSBvbiBgb3ZlcnJpZGVzW11gXG4gIC8vIGZvciBlYXNpZXIgc29ydCBgb3ZlcnJpZGVzW11gLFxuICAvLyBhZGQgdGhlbSB0byBoZXJlLCBzbyB3ZSBkb24ndCBuZWVkIHNvcnQgYG92ZXJyaWRlc1tdYCB0d2ljZVxuICAnZmlsZXMnLFxuICAnZXhjbHVkZWRGaWxlcycsXG4gIC8vIGJhc2VDb25maWdcbiAgJ2VudicsXG4gICdwYXJzZXInLFxuICAncGFyc2VyT3B0aW9ucycsXG4gICdzZXR0aW5ncycsXG4gICdwbHVnaW5zJyxcbiAgJ2V4dGVuZHMnLFxuICAncnVsZXMnLFxuICAnb3ZlcnJpZGVzJyxcbiAgJ2dsb2JhbHMnLFxuICAncHJvY2Vzc29yJyxcbiAgJ25vSW5saW5lQ29uZmlnJyxcbiAgJ3JlcG9ydFVudXNlZERpc2FibGVEaXJlY3RpdmVzJyxcbl1cbmNvbnN0IHNvcnRFc2xpbnRDb25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KGVzbGludEJhc2VDb25maWdQcm9wZXJ0aWVzKSxcbiAgb3ZlclByb3BlcnR5KCdlbnYnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KCdnbG9iYWxzJywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnb3ZlcnJpZGVzJyxcbiAgICBvbkFycmF5KChvdmVycmlkZXMpID0+IG92ZXJyaWRlcy5tYXAoc29ydEVzbGludENvbmZpZykpLFxuICApLFxuICBvdmVyUHJvcGVydHkoJ3BhcnNlck9wdGlvbnMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdydWxlcycsXG4gICAgc29ydE9iamVjdEJ5KFxuICAgICAgKHJ1bGUxLCBydWxlMikgPT5cbiAgICAgICAgcnVsZTEuc3BsaXQoJy8nKS5sZW5ndGggLSBydWxlMi5zcGxpdCgnLycpLmxlbmd0aCB8fFxuICAgICAgICBydWxlMS5sb2NhbGVDb21wYXJlKHJ1bGUyKSxcbiAgICApLFxuICApLFxuICBvdmVyUHJvcGVydHkoJ3NldHRpbmdzJywgc29ydE9iamVjdCksXG5dKVxuY29uc3Qgc29ydFZTQ29kZUJhZGdlT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsnZGVzY3JpcHRpb24nLCAndXJsJywgJ2hyZWYnXSlcblxuY29uc3Qgc29ydFByZXR0aWVyQ29uZmlnID0gcGlwZShbXG4gIC8vIHNvcnQga2V5cyBhbHBoYWJldGljYWxseSwgYnV0IHB1dCBgb3ZlcnJpZGVzYCBhdCBib3R0b21cbiAgb25PYmplY3QoKGNvbmZpZykgPT5cbiAgICBzb3J0T2JqZWN0S2V5cyhjb25maWcsIFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKGNvbmZpZylcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdvdmVycmlkZXMnKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgJ292ZXJyaWRlcycsXG4gICAgXSksXG4gICksXG4gIC8vIGlmIGBjb25maWcub3ZlcnJpZGVzYCBleGlzdHNcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIC8vIGFuZCBgY29uZmlnLm92ZXJyaWRlc2AgaXMgYW4gYXJyYXlcbiAgICBvbkFycmF5KChvdmVycmlkZXMpID0+XG4gICAgICBvdmVycmlkZXMubWFwKFxuICAgICAgICBwaXBlKFtcbiAgICAgICAgICAvLyBzb3J0IGBjb25maWcub3ZlcnJpZGVzW11gIGFscGhhYmV0aWNhbGx5XG4gICAgICAgICAgc29ydE9iamVjdCxcbiAgICAgICAgICAvLyBzb3J0IGBjb25maWcub3ZlcnJpZGVzW10ub3B0aW9uc2AgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBvdmVyUHJvcGVydHkoJ29wdGlvbnMnLCBzb3J0T2JqZWN0KSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICksXG4gICksXG5dKVxuXG5jb25zdCBzb3J0Vm9sdGEgPSBzb3J0T2JqZWN0QnkoWydub2RlJywgJ25wbScsICd5YXJuJ10pXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvd2lyZWl0XG5jb25zdCB3aXJlaXRTY3JpcHRQcm9wZXJ0aWVzID0gWydjb21tYW5kJywgJ2RlcGVuZGVuY2llcycsICdmaWxlcycsICdvdXRwdXQnXVxuY29uc3Qgc29ydFdpcmVpdFNjcmlwdCA9IHBpcGUoW1xuICBzb3J0T2JqZWN0Qnkod2lyZWl0U2NyaXB0UHJvcGVydGllcyksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnZGVwZW5kZW5jaWVzJyxcbiAgICBvbkFycmF5KChkZXBzKSA9PiBkZXBzLm1hcChzb3J0T2JqZWN0QnkoWydzY3JpcHQnLCAnY2FzY2FkZSddKSkpLFxuICApLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ2VudicsXG4gICAgb25PYmplY3QoKGVudikgPT5cbiAgICAgIHNvcnRPYmplY3RLZXlzKFxuICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoZW52KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgc29ydE9iamVjdEJ5KFsnZXh0ZXJuYWwnLCAnZGVmYXVsdCddKSh2YWx1ZSksXG4gICAgICAgICAgXSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnc2VydmljZScsXG4gICAgcGlwZShbc29ydE9iamVjdEJ5KFsncmVhZHlXaGVuJ10pLCBvdmVyUHJvcGVydHkoJ3JlYWR5V2hlbicsIHNvcnRPYmplY3QpXSksXG4gICksXG5dKVxuY29uc3Qgc29ydFdpcmVpdCA9IG9uT2JqZWN0KCh3aXJlaXQpID0+XG4gIHNvcnRPYmplY3RLZXlzKFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHdpcmVpdCkubWFwKChbbmFtZSwgY29uZmlnXSkgPT4gW1xuICAgICAgICBuYW1lLFxuICAgICAgICBzb3J0V2lyZWl0U2NyaXB0KGNvbmZpZyksXG4gICAgICBdKSxcbiAgICApLFxuICApLFxuKVxuY29uc3Qgc29ydERldkVuZ2luZXMgPSBvdmVyUHJvcGVydHkoXG4gICdwYWNrYWdlTWFuYWdlcicsXG4gIHNvcnRPYmplY3RCeShbJ25hbWUnLCAndmVyc2lvbicsICdvbkZhaWwnXSksXG4pXG5cbmNvbnN0IHBucG1CYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgJ3BlZXJEZXBlbmRlbmN5UnVsZXMnLFxuICAnbmV2ZXJCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzRmlsZScsXG4gICdhbGxvd2VkRGVwcmVjYXRlZFZlcnNpb25zJyxcbiAgJ2FsbG93Tm9uQXBwbGllZFBhdGNoZXMnLFxuICAndXBkYXRlQ29uZmlnJyxcbiAgJ2F1ZGl0Q29uZmlnJyxcbiAgJ3JlcXVpcmVkU2NyaXB0cycsXG4gICdzdXBwb3J0ZWRBcmNoaXRlY3R1cmVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdwYXRjaGVkRGVwZW5kZW5jaWVzJyxcbiAgJ3BhY2thZ2VFeHRlbnNpb25zJyxcbl1cblxuY29uc3Qgc29ydFBucG1Db25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KHBucG1CYXNlQ29uZmlnUHJvcGVydGllcywgdHJ1ZSksXG4gIG92ZXJQcm9wZXJ0eSgnb3ZlcnJpZGVzJywgc29ydE9iamVjdEJ5U2VtdmVyKSxcbl0pXG5cbi8vIFNlZSBodHRwczovL2RvY3MubnBtanMuY29tL21pc2Mvc2NyaXB0c1xuY29uc3QgZGVmYXVsdE5wbVNjcmlwdHMgPSBuZXcgU2V0KFtcbiAgJ2luc3RhbGwnLFxuICAncGFjaycsXG4gICdwcmVwYXJlJyxcbiAgJ3B1Ymxpc2gnLFxuICAncmVzdGFydCcsXG4gICdzaHJpbmt3cmFwJyxcbiAgJ3N0YXJ0JyxcbiAgJ3N0b3AnLFxuICAndGVzdCcsXG4gICd1bmluc3RhbGwnLFxuICAndmVyc2lvbicsXG5dKVxuXG5jb25zdCBoYXNEZXZEZXBlbmRlbmN5ID0gKGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uKSA9PiB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbiwgJ2RldkRlcGVuZGVuY2llcycpICYmXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3kpXG4gIClcbn1cblxuY29uc3QgcnVuU1JlZ0V4cCA9XG4gIC8oPzw9XnxbXFxzJjs8PnwoXSkoPzpydW4tc3xucG0tcnVuLWFsbDI/IC4qKD86LS1zZXF1ZW50aWFsfC0tc2VyaWFsfC1zKSkoPz0kfFtcXHMmOzw+fCldKS9cblxuY29uc3QgaXNTZXF1ZW50aWFsU2NyaXB0ID0gKGNvbW1hbmQpID0+XG4gIGNvbW1hbmQuaW5jbHVkZXMoJyonKSAmJiBydW5TUmVnRXhwLnRlc3QoY29tbWFuZClcblxuY29uc3QgaGFzU2VxdWVudGlhbFNjcmlwdCA9IChwYWNrYWdlSnNvbikgPT4ge1xuICBpZiAoXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsJywgcGFja2FnZUpzb24pICYmXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsMicsIHBhY2thZ2VKc29uKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBzY3JpcHRzID0gWydzY3JpcHRzJywgJ2JldHRlclNjcmlwdHMnXS5mbGF0TWFwKChmaWVsZCkgPT5cbiAgICBwYWNrYWdlSnNvbltmaWVsZF0gPyBPYmplY3QudmFsdWVzKHBhY2thZ2VKc29uW2ZpZWxkXSkgOiBbXSxcbiAgKVxuICByZXR1cm4gc2NyaXB0cy5zb21lKChzY3JpcHQpID0+IGlzU2VxdWVudGlhbFNjcmlwdChzY3JpcHQpKVxufVxuXG5mdW5jdGlvbiBzb3J0U2NyaXB0TmFtZXMoa2V5cywgcHJlZml4ID0gJycpIHtcbiAgY29uc3QgZ3JvdXBNYXAgPSBuZXcgTWFwKClcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHJlc3QgPSBwcmVmaXggPyBrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCArIDEpIDoga2V5XG4gICAgY29uc3QgaWR4ID0gcmVzdC5pbmRleE9mKCc6JylcbiAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgY29uc3QgYmFzZSA9IGtleS5zbGljZSgwLCAocHJlZml4ID8gcHJlZml4Lmxlbmd0aCArIDEgOiAwKSArIGlkeClcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGJhc2UpKSBncm91cE1hcC5zZXQoYmFzZSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoYmFzZSkucHVzaChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGtleSkpIGdyb3VwTWFwLnNldChrZXksIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGtleSkucHVzaChrZXkpXG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKGdyb3VwTWFwLmtleXMoKSlcbiAgICAuc29ydCgpXG4gICAgLmZsYXRNYXAoKGdyb3VwS2V5KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGdyb3VwTWFwLmdldChncm91cEtleSlcbiAgICAgIGlmIChcbiAgICAgICAgY2hpbGRyZW4ubGVuZ3RoID4gMSAmJlxuICAgICAgICBjaGlsZHJlbi5zb21lKChrKSA9PiBrICE9PSBncm91cEtleSAmJiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdCA9IGNoaWxkcmVuXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gayA9PT0gZ3JvdXBLZXkgfHwgIWsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICBjb25zdCBuZXN0ZWQgPSBjaGlsZHJlbi5maWx0ZXIoKGspID0+IGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgIHJldHVybiBbLi4uZGlyZWN0LCAuLi5zb3J0U2NyaXB0TmFtZXMobmVzdGVkLCBncm91cEtleSldXG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGRyZW4uc29ydCgpXG4gICAgfSlcbn1cblxuY29uc3Qgc29ydFNjcmlwdHMgPSBvbk9iamVjdCgoc2NyaXB0cywgcGFja2FnZUpzb24pID0+IHtcbiAgbGV0IG5hbWVzID0gT2JqZWN0LmtleXMoc2NyaXB0cylcbiAgY29uc3QgcHJlZml4YWJsZSA9IG5ldyBTZXQoKVxuXG4gIG5hbWVzID0gbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgY29uc3Qgb21pdHRlZCA9IG5hbWUucmVwbGFjZSgvXig/OnByZXxwb3N0KS8sICcnKVxuICAgIGlmIChkZWZhdWx0TnBtU2NyaXB0cy5oYXMob21pdHRlZCkgfHwgbmFtZXMuaW5jbHVkZXMob21pdHRlZCkpIHtcbiAgICAgIHByZWZpeGFibGUuYWRkKG9taXR0ZWQpXG4gICAgICByZXR1cm4gb21pdHRlZFxuICAgIH1cbiAgICByZXR1cm4gbmFtZVxuICB9KVxuXG4gIGlmICghaGFzU2VxdWVudGlhbFNjcmlwdChwYWNrYWdlSnNvbikpIHtcbiAgICBuYW1lcyA9IHNvcnRTY3JpcHROYW1lcyhuYW1lcylcbiAgfVxuICBuYW1lcyA9IG5hbWVzLmZsYXRNYXAoKGtleSkgPT5cbiAgICBwcmVmaXhhYmxlLmhhcyhrZXkpID8gW2BwcmUke2tleX1gLCBrZXksIGBwb3N0JHtrZXl9YF0gOiBba2V5XSxcbiAgKVxuICByZXR1cm4gc29ydE9iamVjdEtleXMoc2NyaXB0cywgbmFtZXMpXG59KVxuXG4vKlxuLSBNb3ZlIGBkZWZhdWx0YCBjb25kaXRpb24gdG8gYm90dG9tXG4qL1xuY29uc3Qgc29ydENvbmRpdGlvbnMgPSAoY29uZGl0aW9ucykgPT4ge1xuICBjb25zdCB7IGRlZmF1bHRDb25kaXRpb25zID0gW10sIHJlc3RDb25kaXRpb25zID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgIGNvbmRpdGlvbnMsXG4gICAgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgIHJldHVybiAnZGVmYXVsdENvbmRpdGlvbnMnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAncmVzdENvbmRpdGlvbnMnXG4gICAgfSxcbiAgKVxuXG4gIHJldHVybiBbLi4ucmVzdENvbmRpdGlvbnMsIC4uLmRlZmF1bHRDb25kaXRpb25zXVxufVxuXG5jb25zdCBzb3J0RXhwb3J0cyA9IG9uT2JqZWN0KChleHBvcnRzKSA9PiB7XG4gIGNvbnN0IHsgcGF0aHMgPSBbXSwgY29uZGl0aW9ucyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICBPYmplY3Qua2V5cyhleHBvcnRzKSxcbiAgICAoa2V5KSA9PiAoa2V5LnN0YXJ0c1dpdGgoJy4nKSA/ICdwYXRocycgOiAnY29uZGl0aW9ucycpLFxuICApXG5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBbLi4ucGF0aHMsIC4uLnNvcnRDb25kaXRpb25zKGNvbmRpdGlvbnMpXS5tYXAoKGtleSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgc29ydEV4cG9ydHMoZXhwb3J0c1trZXldKSxcbiAgICBdKSxcbiAgKVxufSlcblxuLy8gZmllbGRzIG1hcmtlZCBgdnNjb2RlYCBhcmUgZm9yIGBWaXN1YWwgU3R1ZGlvIENvZGUgZXh0ZW5zaW9uIG1hbmlmZXN0YCBvbmx5XG4vLyBodHRwczovL2NvZGUudmlzdWFsc3R1ZGlvLmNvbS9hcGkvcmVmZXJlbmNlcy9leHRlbnNpb24tbWFuaWZlc3Rcbi8vIFN1cHBvcnRlZCBmaWVsZHM6XG4vLyBwdWJsaXNoZXIsIGRpc3BsYXlOYW1lLCBjYXRlZ29yaWVzLCBnYWxsZXJ5QmFubmVyLCBwcmV2aWV3LCBjb250cmlidXRlcyxcbi8vIGFjdGl2YXRpb25FdmVudHMsIGJhZGdlcywgbWFya2Rvd24sIHFuYSwgZXh0ZW5zaW9uUGFjayxcbi8vIGV4dGVuc2lvbkRlcGVuZGVuY2llcywgaWNvblxuXG4vLyBmaWVsZC5rZXl7c3RyaW5nfTogZmllbGQgbmFtZVxuLy8gZmllbGQub3ZlcntmdW5jdGlvbn06IHNvcnQgZmllbGQgc3ViS2V5XG5jb25zdCBmaWVsZHMgPSBbXG4gIHsga2V5OiAnJHNjaGVtYScgfSxcbiAgeyBrZXk6ICduYW1lJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdkaXNwbGF5TmFtZScgfSxcbiAgeyBrZXk6ICd2ZXJzaW9uJyB9LFxuICAvKiB5YXJuICovIHsga2V5OiAnc3RhYmxlVmVyc2lvbicgfSxcbiAgeyBrZXk6ICdwcml2YXRlJyB9LFxuICB7IGtleTogJ2Rlc2NyaXB0aW9uJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdjYXRlZ29yaWVzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2tleXdvcmRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2hvbWVwYWdlJyB9LFxuICB7IGtleTogJ2J1Z3MnLCBvdmVyOiBzb3J0T2JqZWN0QnkoWyd1cmwnLCAnZW1haWwnXSkgfSxcbiAgeyBrZXk6ICdyZXBvc2l0b3J5Jywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICB7IGtleTogJ2Z1bmRpbmcnLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnbGljZW5zZScsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncW5hJyB9LFxuICB7IGtleTogJ2F1dGhvcicsIG92ZXI6IHNvcnRQZW9wbGVPYmplY3QgfSxcbiAge1xuICAgIGtleTogJ21haW50YWluZXJzJyxcbiAgICBvdmVyOiBvbkFycmF5KChtYWludGFpbmVycykgPT4gbWFpbnRhaW5lcnMubWFwKHNvcnRQZW9wbGVPYmplY3QpKSxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbnRyaWJ1dG9ycycsXG4gICAgb3Zlcjogb25BcnJheSgoY29udHJpYnV0b3JzKSA9PiBjb250cmlidXRvcnMubWFwKHNvcnRQZW9wbGVPYmplY3QpKSxcbiAgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncHVibGlzaGVyJyB9LFxuICB7IGtleTogJ3NpZGVFZmZlY3RzJyB9LFxuICB7IGtleTogJ3R5cGUnIH0sXG4gIHsga2V5OiAnaW1wb3J0cycgfSxcbiAgeyBrZXk6ICdleHBvcnRzJywgb3Zlcjogc29ydEV4cG9ydHMgfSxcbiAgeyBrZXk6ICdtYWluJyB9LFxuICB7IGtleTogJ3N2ZWx0ZScgfSxcbiAgeyBrZXk6ICd1bWQ6bWFpbicgfSxcbiAgeyBrZXk6ICdqc2RlbGl2cicgfSxcbiAgeyBrZXk6ICd1bnBrZycgfSxcbiAgeyBrZXk6ICdtb2R1bGUnIH0sXG4gIHsga2V5OiAnc291cmNlJyB9LFxuICB7IGtleTogJ2pzbmV4dDptYWluJyB9LFxuICB7IGtleTogJ2Jyb3dzZXInIH0sXG4gIHsga2V5OiAncmVhY3QtbmF0aXZlJyB9LFxuICB7IGtleTogJ3R5cGVzJyB9LFxuICB7IGtleTogJ3R5cGVzVmVyc2lvbnMnIH0sXG4gIHsga2V5OiAndHlwaW5ncycgfSxcbiAgeyBrZXk6ICdzdHlsZScgfSxcbiAgeyBrZXk6ICdleGFtcGxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGVzdHlsZScgfSxcbiAgeyBrZXk6ICdhc3NldHMnIH0sXG4gIHsga2V5OiAnYmluJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ21hbicgfSxcbiAgeyBrZXk6ICdkaXJlY3RvcmllcycsIG92ZXI6IHNvcnREaXJlY3RvcmllcyB9LFxuICB7IGtleTogJ2ZpbGVzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ3dvcmtzcGFjZXMnLCBvdmVyOiBzb3J0V29ya3NwYWNlcyB9LFxuICAvLyBub2RlLXByZS1neXAgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvbm9kZS1wcmUtZ3lwIzEtYWRkLW5ldy1lbnRyaWVzLXRvLXlvdXItcGFja2FnZWpzb25cbiAge1xuICAgIGtleTogJ2JpbmFyeScsXG4gICAgb3Zlcjogc29ydE9iamVjdEJ5KFtcbiAgICAgICdtb2R1bGVfbmFtZScsXG4gICAgICAnbW9kdWxlX3BhdGgnLFxuICAgICAgJ3JlbW90ZV9wYXRoJyxcbiAgICAgICdwYWNrYWdlX25hbWUnLFxuICAgICAgJ2hvc3QnLFxuICAgIF0pLFxuICB9LFxuICB7IGtleTogJ3NjcmlwdHMnLCBvdmVyOiBzb3J0U2NyaXB0cyB9LFxuICB7IGtleTogJ2JldHRlclNjcmlwdHMnLCBvdmVyOiBzb3J0U2NyaXB0cyB9LFxuICB7IGtleTogJ3dpcmVpdCcsIG92ZXI6IHNvcnRXaXJlaXQgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbDEwbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY29udHJpYnV0ZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2FjdGl2YXRpb25FdmVudHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaHVza3knLCBvdmVyOiBvdmVyUHJvcGVydHkoJ2hvb2tzJywgc29ydEdpdEhvb2tzKSB9LFxuICB7IGtleTogJ3NpbXBsZS1naXQtaG9va3MnLCBvdmVyOiBzb3J0R2l0SG9va3MgfSxcbiAgeyBrZXk6ICdwcmUtY29tbWl0JyB9LFxuICB7IGtleTogJ2NvbW1pdGxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbGludC1zdGFnZWQnIH0sXG4gIHsga2V5OiAnbmFuby1zdGFnZWQnIH0sXG4gIHsga2V5OiAnY29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25vZGVtb25Db25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcmlmeScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdiYWJlbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2Vyc2xpc3QnIH0sXG4gIHsga2V5OiAneG8nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHJldHRpZXInLCBvdmVyOiBzb3J0UHJldHRpZXJDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRDb25maWcnLCBvdmVyOiBzb3J0RXNsaW50Q29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50SWdub3JlJyB9LFxuICB7IGtleTogJ25wbXBrZ2pzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbVBhY2thZ2VKc29uTGludENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1wYWNrYWdlanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVsZWFzZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZW1hcmtDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnc3R5bGVsaW50JyB9LFxuICB7IGtleTogJ2F2YScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QtanVuaXQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1zdGFyZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtb2NoYScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdueWMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYzgnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAndGFwJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ29jbGlmJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdyZXNvbHV0aW9ucycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvdmVycmlkZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RldkRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHNvcnRPYmplY3RCeUlkZW50LCB0cnVlKSB9LFxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIC8vIFRPRE86IG9ubHkgc29ydCBkZXB0aCA9IDJcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnYnVuZGxlZERlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdidW5kbGVEZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvblBhY2snLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvbkRlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdmbGF0JyB9LFxuICB7IGtleTogJ3BhY2thZ2VNYW5hZ2VyJyB9LFxuICB7IGtleTogJ2VuZ2luZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZW5naW5lU3RyaWN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2RldkVuZ2luZXMnLCBvdmVyOiBzb3J0RGV2RW5naW5lcyB9LFxuICB7IGtleTogJ3ZvbHRhJywgb3Zlcjogc29ydFZvbHRhIH0sXG4gIHsga2V5OiAnbGFuZ3VhZ2VOYW1lJyB9LFxuICB7IGtleTogJ29zJyB9LFxuICB7IGtleTogJ2NwdScgfSxcbiAgeyBrZXk6ICdwcmVmZXJHbG9iYWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHVibGlzaENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnaWNvbicgfSxcbiAgLyogdnNjb2RlICovIHtcbiAgICBrZXk6ICdiYWRnZXMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGJhZGdlKSA9PiBiYWRnZS5tYXAoc29ydFZTQ29kZUJhZGdlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2dhbGxlcnlCYW5uZXInLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3ByZXZpZXcnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ21hcmtkb3duJyB9LFxuICB7IGtleTogJ3BucG0nLCBvdmVyOiBzb3J0UG5wbUNvbmZpZyB9LFxuXVxuXG5jb25zdCBkZWZhdWx0U29ydE9yZGVyID0gZmllbGRzLm1hcCgoeyBrZXkgfSkgPT4ga2V5KVxuY29uc3Qgb3ZlckZpZWxkcyA9IHBpcGUoXG4gIGZpZWxkc1xuICAgIC5tYXAoKHsga2V5LCBvdmVyIH0pID0+IChvdmVyID8gb3ZlclByb3BlcnR5KGtleSwgb3ZlcikgOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoQm9vbGVhbiksXG4pXG5cbmZ1bmN0aW9uIGVkaXRTdHJpbmdKU09OKGpzb24sIG92ZXIpIHtcbiAgaWYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHsgaW5kZW50LCB0eXBlIH0gPSBkZXRlY3RJbmRlbnQoanNvbilcbiAgICBjb25zdCBlbmRDaGFyYWN0ZXJzID0ganNvbi5zbGljZSgtMSkgPT09ICdcXG4nID8gJ1xcbicgOiAnJ1xuICAgIGNvbnN0IG5ld2xpbmUgPSBkZXRlY3ROZXdsaW5lKGpzb24pXG4gICAganNvbiA9IEpTT04ucGFyc2UoanNvbilcblxuICAgIGxldCByZXN1bHQgPVxuICAgICAgSlNPTi5zdHJpbmdpZnkob3Zlcihqc29uKSwgbnVsbCwgdHlwZSA9PT0gJ3RhYicgPyAnXFx0JyA6IGluZGVudCkgK1xuICAgICAgZW5kQ2hhcmFjdGVyc1xuICAgIGlmIChuZXdsaW5lID09PSAnXFxyXFxuJykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1xcbi9nLCBuZXdsaW5lKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByZXR1cm4gb3Zlcihqc29uKVxufVxuXG5mdW5jdGlvbiBzb3J0UGFja2FnZUpzb24oanNvbklzaCwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBlZGl0U3RyaW5nSlNPTihcbiAgICBqc29uSXNoLFxuICAgIG9uT2JqZWN0KChqc29uKSA9PiB7XG4gICAgICBsZXQgc29ydE9yZGVyID0gb3B0aW9ucy5zb3J0T3JkZXIgfHwgZGVmYXVsdFNvcnRPcmRlclxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3J0T3JkZXIpKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhqc29uKVxuICAgICAgICBjb25zdCB7IHByaXZhdGVLZXlzID0gW10sIHB1YmxpY0tleXMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgICAgICAga2V5cyxcbiAgICAgICAgICAoa2V5KSA9PiAoa2V5WzBdID09PSAnXycgPyAncHJpdmF0ZUtleXMnIDogJ3B1YmxpY0tleXMnKSxcbiAgICAgICAgKVxuICAgICAgICBzb3J0T3JkZXIgPSBbXG4gICAgICAgICAgLi4uc29ydE9yZGVyLFxuICAgICAgICAgIC4uLmRlZmF1bHRTb3J0T3JkZXIsXG4gICAgICAgICAgLi4ucHVibGljS2V5cy5zb3J0KCksXG4gICAgICAgICAgLi4ucHJpdmF0ZUtleXMuc29ydCgpLFxuICAgICAgICBdXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdmVyRmllbGRzKHNvcnRPYmplY3RLZXlzKGpzb24sIHNvcnRPcmRlciksIGpzb24pXG4gICAgfSksXG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgc29ydFBhY2thZ2VKc29uXG5leHBvcnQgeyBzb3J0UGFja2FnZUpzb24sIGRlZmF1bHRTb3J0T3JkZXIgYXMgc29ydE9yZGVyIH1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+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/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICBuYW1lOiAnYXV0b2ZpeC5jaScsXG4gIG9uOiB7XG4gICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgIHB1c2g6IHtcbiAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICB9LFxuICB9LFxuICBwZXJtaXNzaW9uczoge1xuICAgIGNvbnRlbnRzOiAncmVhZCcsXG4gIH0sXG4gIGNvbmN1cnJlbmN5OiB7XG4gICAgZ3JvdXA6ICdhdXRvZml4LSR7eyBnaXRodWIuaGVhZF9yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDogeyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9LFxuICB9LFxufTtcblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgbGludGVyIGZpeFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgcGtnLXByZWZsaWdodCBQUiBmaWxlIGxpc3RpbmdcbiAgICAgICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAndGVzdC1ydXN0Jzoge1xuICAgIG5hbWU6ICdUZXN0IFJ1c3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAndGVzdC1ydXN0Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QtcnVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knIHwgJ2F1dG9maXgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZpZyBvZiBzZW1hbnRpYyBwdWxsIHJlcXVlc3RcbiAgICBjb25zdCBzZW1hbnRpY1ltbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICdzZW1hbnRpYy55bWwnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oc2VtYW50aWNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhaXNPYnNvbGV0ZUdlblByV29ya2Zsb3dGaWxlTmFtZShlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGVudHJ5Lm5hbWUpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWVTZXQgPSBuZXcgU2V0KFtcbiAgICAgICd0ZXN0LnltbCcsXG4gICAgICAnYXV0b2ZpeC55bWwnLFxuICAgICAgJ3NlbWFudGljLXByLnltbCcsXG4gICAgICAnY2xvc2UtY29tbWVudC55bWwnLFxuICAgICAgLi4uZW50cmllc1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpICYmICFpc09ic29sZXRlR2VuUHJXb3JrZmxvd0ZpbGVOYW1lKGRpcmVudC5uYW1lKVxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCd0ZXN0LXJ1c3QueW1sJyk7XG4gICAgfVxuICAgIGlmICghcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIC8vIFRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93IGFscmVhZHkgZml4ZXMgYW5kIHB1c2hlcyBjb2RlIG9uIHByaXZhdGUgcmVwb3MsXG4gICAgICAvLyBzbyBhIHNlcGFyYXRlIGF1dG9maXggd29ya2Zsb3cgb25seSBkdXBsaWNhdGVzIHRoZSBzYW1lIHByb2Nlc3MuXG4gICAgICBmaWxlTmFtZVNldC5kZWxldGUoJ2F1dG9maXgueW1sJyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdhdXRvZml4LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lU2V0KSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGNvbnN0IGtpbmQgPSBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lLCAnLnltbCcpIGFzIEtub3duS2luZDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9zaXRvcnk/LmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzT2Jzb2xldGVHZW5QcldvcmtmbG93RmlsZU5hbWUoZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15nZW4tcHIoPzotLispP1xcLnlhP21sJC91LnRlc3QoZmlsZU5hbWUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChjb25maWc6IFBhY2thZ2VDb25maWcsIHdvcmtmbG93c1BhdGg6IHN0cmluZywga2luZDogS25vd25LaW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGAke2tpbmR9LnltbGApO1xuICBjb25zdCBkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJykpO1xuXG4gIGlmIChraW5kID09PSAnYXV0b2ZpeCcpIHtcbiAgICBhd2FpdCB3cml0ZVlhbWwoZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnKSwgZmlsZVBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEEgdGVzdC1ydXN0LnltbCBpbiBhIHJlcG8gd2l0aG91dCBSdXN0IGNvZGUgaXMgYSBjdXN0b20gd29ya2Zsb3cgdGhhdCBtZXJlbHkgc2hhcmVzIHRoZSBuYW1lOyBsZWF2ZSBpdCBhbG9uZS5cbiAgaWYgKGtpbmQgPT09ICd0ZXN0LXJ1c3QnICYmIGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoa2luZCBpbiB3b3JrZmxvd3MgPyB3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA6IHt9KSBhcyBXb3JrZmxvdztcblxuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICAvLyBTa2lwIGEgYnJva2VuIHdvcmtmbG93XG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBpZiAoa2luZCA9PT0gJ3Rlc3QtcnVzdCcpIHtcbiAgICAvLyBNaWdyYXRlIGhhbmQtd3JpdHRlbiBSdXN0IHdvcmtmbG93cyAoZS5nLiBhbiBpbmxpbmUgY2FyZ28tY2hlY2sgam9iKSB0byB0aGUgcmV1c2FibGUgd29ya2Zsb3cuXG4gICAgZm9yIChjb25zdCBbam9iTmFtZSwgam9iXSBvZiBPYmplY3QuZW50cmllcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgICAgaWYgKCFqb2IudXNlcz8uaW5jbHVkZXMoJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnNbam9iTmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgfVxuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9ICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnO1xuICB9XG5cbiAgbGV0IGlzUmV1c2FibGVXb3JrZmxvdyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcygnL3JldXNhYmxlLXdvcmtmbG93cy8nKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCB1c2UgcmVsZWFzZS55bWwgaWYgcmVsZWFzZSBicmFuY2ggaXMgbm90IHNwZWNpZmllZFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3JlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6XG4gICAgY2FzZSAndGVzdC1ydXN0Jzoge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBwYXRocy1pZ25vcmVgIGZvciB0ZXN0IGJlY2F1c2UgR2l0SHViJ3MgQnJhbmNoIFByb3RlY3Rpb24gYW5kIFJ1bGVzZXRzIHJlcXVpcmUgam9iIHJ1bm5pbmcuXG4gICAgICAvLyBUaGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdyBubyBsb25nZXIgbmVlZHMgQWN0aW9ucyB3cml0ZSBhY2Nlc3MuXG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MucGVybWlzc2lvbnM/LmFjdGlvbnM7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1bGxfcmVxdWVzdCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVsbF9yZXF1ZXN0WydwYXRocy1pZ25vcmUnXTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ107XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzLmZpbHRlcigoYnJhbmNoKSA9PiBicmFuY2ggIT09ICdyZW5vdmF0ZS8qKicpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE5vIGRlZmF1bHRcbiAgfVxuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWluaXQueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgaWYgKCFuZXdTZXR0aW5ncy5qb2JzLnN5bmM/LndpdGgpIHJldHVybjtcblxuICAgIC8vIEdlbmVyYXRlIHN5bmMtZm9yY2UueW1sIGJhc2VkIG9uIHN5bmMueW1sIGlmIGl0IGV4aXN0cy5cbiAgICBuZXdTZXR0aW5ncy5qb2JzWydzeW5jLWZvcmNlJ10gPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gYC0tZm9yY2UgJHtwYXJhbXN9YDtcbiAgICBuZXdTZXR0aW5ncy5uYW1lID0gJ0ZvcmNlIHRvIFN5bmMnO1xuICAgIG5ld1NldHRpbmdzLm9uID0geyB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCB9O1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtZm9yY2UueW1sJykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUpvYihjb25maWc6IFBhY2thZ2VDb25maWcsIGpvYjogSm9iLCBraW5kOiBLbm93bktpbmQpOiB2b2lkIHtcbiAgam9iLndpdGggPz89IHt9O1xuICBqb2Iuc2VjcmV0cyA/Pz0ge307XG5cbiAgaWYgKGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kID09PSAncmVsZWFzZScpIHtcbiAgICBqb2Iuc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgaWYgKGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOKSB7XG4gICAgam9iLnNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSA9ICcke3sgc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIH19JztcbiAgICBkZWxldGUgam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU47XG4gIH1cbiAgaWYgKFxuICAgIChqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkpIHx8XG4gICAgKGpvYi53aXRoLnNlcnZlcl91cmwgJiYga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSlcbiAgKSB7XG4gICAgam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCA9ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUxFQVNFIH19JztcbiAgfVxuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBwYXJhbXMucmVwbGFjZSgnc3luYyAnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICd0ZXN0LXJ1c3QnKSB7XG4gICAgY29uc3QgW3J1c3REaXJQYXRoXSA9IGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocztcbiAgICBpZiAocnVzdERpclBhdGggJiYgcnVzdERpclBhdGggIT09ICcuJykge1xuICAgICAgam9iLndpdGgud29ya2luZ19kaXJlY3RvcnkgPSBydXN0RGlyUGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGpvYi53aXRoLndvcmtpbmdfZGlyZWN0b3J5O1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoLmRvdF9lbnZfcGF0aCA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmRvdF9lbnZfcGF0aDtcbiAgfVxuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0cy5GTFlfQVBJX1RPS0VOICYmIHR5cGVvZiBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9IGpvYi53aXRoLmRlcGxveV9jb21tYW5kLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCd0ZXN0JykgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lcjtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi5zZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gTW92ZSBzZWNyZXRzIHByb3AgYWZ0ZXIgd2l0aCBwcm9wXG4gICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKGpvYi5zZWNyZXRzKTtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBXb3JrZmxvdyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NicgfSxcbiAgICB7IHVzZXM6ICdhY3Rpb25zL3NldHVwLW5vZGVAdjYnLCB3aXRoOiB7ICdjaGVjay1sYXRlc3QnOiB0cnVlLCAnbm9kZS12ZXJzaW9uJzogJ2x0cy8qJyB9IH0sXG4gICAgLi4uKGNvbmZpZy5pc0J1biA/IFt7IHVzZXM6ICdvdmVuLXNoL3NldHVwLWJ1bkB2MicsIHdpdGg6IHsgJ2J1bi12ZXJzaW9uJzogJ2xhdGVzdCcgfSB9XSA6IFtdKSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgIH0sXG4gICAgeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gY2xlYW51cGAgfSxcbiAgXTtcbiAgaWYgKGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uYnVpbGQpIHtcbiAgICBzdGVwcy5wdXNoKHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGJ1aWxkYCB9KTtcbiAgfVxuICBzdGVwcy5wdXNoKHsgdXNlczogJ2F1dG9maXgtY2kvYWN0aW9uQGM1YjJkNjdhYTIyNzRlN2I1YTE4MjI0ZTgxNzE1NTA4NzFmYzdlNGEnIH0pO1xuXG4gIGNvbnN0IGF1dG9maXhXb3JrZmxvdyA9IHN0cnVjdHVyZWRDbG9uZShwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgY29uc3QgYXV0b2ZpeEpvYiA9IGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPz8geyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9O1xuICBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID0geyAuLi5hdXRvZml4Sm9iLCBzdGVwcyB9O1xuICByZXR1cm4gYXV0b2ZpeFdvcmtmbG93O1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0gcmVtb3ZlVHJhaWxpbmdTcGFjZXMoXG4gICAgeWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEsIG5vQ29tcGF0TW9kZTogdHJ1ZSwgc3R5bGVzOiB7ICchIW51bGwnOiAnZW1wdHknIH0gfSlcbiAgKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCB5YW1sVGV4dCk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVRyYWlsaW5nU3BhY2VzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGpzLXlhbWwgZW1pdHMgdmFsdWVsZXNzIEdpdEh1YiBBY3Rpb25zIGV2ZW50cyBhcyBgZXZlbnQ6IGAgd2hlbiB1c2luZyB0aGUgZW1wdHkgbnVsbCBzdHlsZS5cbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvWyBcXHRdKyQvZ20sICcnKTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBvcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocGFja2FnZUNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChvbGRDb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKD89XFxzfCQpL2csICdjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLig/PVxcc3wkKS9nLCAnZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKD89XFxzKS9nLCAnaS5lLicpO1xufVxuXG5mdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csIChjb21tZW50KSA9PiBmaXhUeXBvc0luVGV4dChjb21tZW50KSlcbiAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pY1xcLmZcXC4vZywgJyQxLy8kMmNmLicpXG4gICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KWVnXFwuL2csICckMS8vJDJlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8paWVcXC4vZywgJyQxLy8kMmkuZS4nKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmNvbnN0IHdiRGF0YWJhc2VDb21tYW5kUmVnZXggPSAvXFxid2JcXHMrKD86ZGJ8cHJpc21hKVxcYi9ndTtcbmNvbnN0IG1heFRleHRGaWxlQnl0ZXMgPSAxMDI0ICogMTAyNDtcbmNvbnN0IG1pZ3JhdGlvblRhcmdldHMgPSBbXG4gICcqKi8qLntjanMsY3RzLGpzLGpzb24sanN4LG1kLG1kYyxtanMsbXRzLHNoLHRzeCx0cyx0b21sLHR4dCx5YW1sLHltbH0nLFxuICAnKiovLmVudicsXG4gICcqKi8uZW52LionLFxuICAnKiovLmdpdGh1Yi93b3JrZmxvd3MvKicsXG4gICcqKi8uZ2l0aWdub3JlJyxcbiAgJyoqLy5kb2NrZXJpZ25vcmUnLFxuICAnKiovRG9ja2VyZmlsZScsXG4gICcqKi9Eb2NrZXJmaWxlLionLFxuICAnKiovTWFrZWZpbGUnLFxuICAnKiovbWlzZS50b21sJyxcbiAgJyoqLy5taXNlLnRvbWwnLFxuICAnKiovbGVmdGhvb2sueW1sJyxcbiAgJyoqL3BhY2thZ2UuanNvbicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4V2JEYkNvbW1hbmQocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgcGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZ10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHJvb3RDb25maWcucmVwb0F1dGhvciA9PT0gJ1dpbGxCb29zdGVyJyAmJiByb290Q29uZmlnLnJlcG9OYW1lID09PSAnc2hhcmVkJykgcmV0dXJuO1xuXG4gIGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sPHZvaWQ+KCk7XG4gIC8vIGBydW4oKWAgcmVzb2x2ZXMgYWZ0ZXIgYSB0YXNrIGVudGVycyB0aGUgcG9vbCwgd2hpbGUgYHByb21pc2VBbGwoKWAgd2FpdHNcbiAgLy8gZm9yIGFkbWl0dGVkIHRhc2tzIHRvIGZpbmlzaC4gQm90aCB3YWl0cyBhcmUgbmVlZGVkIHRvIGNvdmVyIHF1ZXVlZCB3b3JrLlxuICBjb25zdCByZXBsYWNlbWVudFByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgZm9yIChjb25zdCBjb25maWcgb2YgcGFja2FnZUNvbmZpZ3MpIHtcbiAgICBjb25zdCBjb21tYW5kID0gc2VsZWN0V2JEYXRhYmFzZUNvbW1hbmQoY29uZmlnKTtcbiAgICBpZiAoIWNvbW1hbmQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcobWlncmF0aW9uVGFyZ2V0cywge1xuICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgZG90OiB0cnVlLFxuICAgICAgaWdub3JlOiBbJyoqLy5naXQvKionLCAuLi4oY29uZmlnLmlzUm9vdCA/IFsncGFja2FnZXMvKionXSA6IFtdKSwgLi4uZ2xvYklnbm9yZV0sXG4gICAgICBvbmx5RmlsZXM6IHRydWUsXG4gICAgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICAgIHJlcGxhY2VtZW50UHJvbWlzZXMucHVzaChwcm9taXNlUG9vbC5ydW4oKCkgPT4gcmVwbGFjZVdiRGF0YWJhc2VDb21tYW5kKGZpbGVQYXRoLCBjb21tYW5kKSkpO1xuICAgIH1cbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChyZXBsYWNlbWVudFByb21pc2VzKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RXYkRhdGFiYXNlQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiAnd2IgZGInIHwgJ3diIHByaXNtYScgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHJldHVybiAnd2IgcHJpc21hJztcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuZHJpenpsZSkgcmV0dXJuICd3YiBkYic7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VXYkRhdGFiYXNlQ29tbWFuZChmaWxlUGF0aDogc3RyaW5nLCBjb21tYW5kOiAnd2IgZGInIHwgJ3diIHByaXNtYScpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRUZXh0RmlsZShmaWxlUGF0aCk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIC8vIFRlbXBvcmFyeSBtaWdyYXRpb246IG5vcm1hbGl6ZSBjb21tYW5kIHNwZWxsaW5nIGJ5IE9STSBzbyBQcmlzbWEga2VlcHMgdGhlXG4gIC8vIG5hdGl2ZSBjb21tYW5kIG5hbWUgd2hpbGUgRHJpenpsZSB1c2VzIHRoZSBnZW5lcmljIGRhdGFiYXNlIGNvbW1hbmQuXG4gIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwod2JEYXRhYmFzZUNvbW1hbmRSZWdleCwgY29tbWFuZCk7XG4gIGlmIChuZXdDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRUZXh0RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgaWYgKHN0YXRzLnNpemUgPiBtYXhUZXh0RmlsZUJ5dGVzKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKGJ1ZmZlci5pbmNsdWRlcygwKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCd1dGY4Jyk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kLCBhcmdzLCBjd2QsIHJldHJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogbnVtYmVyIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke2N3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICBpZiAoc3RhdHVzID09PSAwKSBicmVhaztcbiAgICBpZiAocmV0cnkgPD0gMCkgcmV0dXJuIHN0YXR1cztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3RkZXJyIG9uIEVOT0VOVC5cbiAgY29uc3Qgc3RkZXJyID0gcHJvYy5zdGRlcnIgPz8gJyc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycgPyBzdGRlcnIudHJpbSgpIDogc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAocHJvYy5lcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIGZhaWxlZCB3aXRoOiAke3Byb2MuZXJyb3IubWVzc2FnZX1gKTtcbiAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gb3V0cHV0cyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdG8gc3RkZXJyOlxcbiR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRvdXQgb24gRU5PRU5ULlxuICBjb25zdCBzdGRvdXQgPSBwcm9jLnN0ZG91dCA/PyAnJztcbiAgcmV0dXJuIHR5cGVvZiBzdGRvdXQgPT09ICdzdHJpbmcnID8gc3Rkb3V0LnRyaW0oKSA6IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5zcGxpdCgnOicpXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBlbnYuQkVSUllfQklOX0ZPTERFUilcbiAgICAgIC5qb2luKCc6Jyk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbi8qKlxuICogSG93IGEgYHdyYW5nbGVyIHR5cGVzYCBpbnZvY2F0aW9uIHJlbGF0ZXMgdG8gdGhlIGRlZmF1bHQgLi93b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIHRoYXQgd2JmeSBtYW5hZ2VzOlxuICogLSBgcmV1c2FibGVHZW5lcmF0b3JgOiByZWdlbmVyYXRlcyB0aGUgbWFuYWdlZCBmaWxlIGZyb20gdGhlIGlucHV0cyB0aGUgbWFuYWdlbWVudCBnYXRlIHZhbGlkYXRlZCwgc28gaXQgY2FuIHNlcnZlXG4gKiAgIGFzIHRoZSBzaGFyZWQgZ2VuZXJhdG9yIGNvbW1hbmQuXG4gKiAtIGBkZWZhdWx0T3V0cHV0Q29uZmxpY3RgOiB3cml0ZXMgdGhlIG1hbmFnZWQgZmlsZSBmcm9tIGlucHV0cyB0aGUgZ2F0ZSBjYW5ub3QgdmFsaWRhdGUgKGAtLWNvbmZpZ2AsIGAtLWVudmAsXG4gKiAgIGAtLWVudi1maWxlYCksIHNvIGEgbWFuYWdlZCBmYWxsYmFjayBnZW5lcmF0b3Igd291bGQgZmlnaHQgaXQgb3ZlciB0aGUgc2FtZSBmaWxlIOKAlCB3YmZ5IG11c3Qgbm90IG1hbmFnZSB0aGVcbiAqICAgcGFja2FnZSBhdCBhbGwuXG4gKiAtIGBoYXJtbGVzc2A6IGdlbmVyYXRlcyBub3RoaW5nIChgLS1jaGVja2AsIGAtLWhlbHBgLCBgLS12ZXJzaW9uYCkgb3Igd3JpdGVzIGFub3RoZXIgZmlsZSAoYC0tY3dkYCwgYSBjdXN0b21cbiAqICAgcG9zaXRpb25hbCBvdXRwdXQgcGF0aCksIHNvIGl0IGNhbiBjb2V4aXN0IHdpdGggdGhlIG1hbmFnZWQgZ2VuZXJhdG9yLlxuICovXG5leHBvcnQgdHlwZSBXcmFuZ2xlclR5cGVzSW52b2NhdGlvbktpbmQgPSAncmV1c2FibGVHZW5lcmF0b3InIHwgJ2RlZmF1bHRPdXRwdXRDb25mbGljdCcgfCAnaGFybWxlc3MnO1xuXG5jb25zdCBzY3JpcHRSdW5uZXJDb21tYW5kcyA9IG5ldyBTZXQoWyd5YXJuJywgJ2J1bicsICducG0nLCAncG5wbScsICdidW54JywgJ25weCddKTtcbmNvbnN0IHNjcmlwdFdyYXBwZXJSdW5uZXJDb21tYW5kcyA9IG5ldyBTZXQoWyd5YXJuJywgJ2J1bicsICducG0nLCAncG5wbSddKTtcbi8vIEZsYWdzIG9mIGB3cmFuZ2xlciB0eXBlc2AgdGhhdCBjb25zdW1lIHRoZSBmb2xsb3dpbmcgdG9rZW4gYXMgdGhlaXIgdmFsdWU7IHVua25vd24gc2VwYXJhdGUtdmFsdWUgZmxhZ3MgbWFrZVxuLy8gdGhlaXIgdmFsdWUgbG9vayBwb3NpdGlvbmFsLCB3aGljaCBzYWZlbHkgZGlzcXVhbGlmaWVzIHRoZSBpbnZvY2F0aW9uIGluc3RlYWQgb2YgbWlzcmVhZGluZyBpdHMgb3V0cHV0IHBhdGguXG5jb25zdCB3cmFuZ2xlclR5cGVzVmFsdWVGbGFncyA9IG5ldyBTZXQoWyctLWVudi1pbnRlcmZhY2UnXSk7XG5cbi8qKlxuICogV2hldGhlciB3YmZ5IGNhbiBtYW5hZ2Ugd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBmb3IgdGhlc2Ugc2NyaXB0cywgYW5kIHdpdGggd2hpY2ggcHJvamVjdC1zcGVjaWZpYyBnZW5lcmF0b3JcbiAqIGNvbW1hbmQuIGBjb25mbGljdGluZ2AgaXMgdHJ1ZSB3aGVuIGEgc2NyaXB0IHdyaXRlcyB0aGUgbWFuYWdlZCBkZWZhdWx0IGZpbGUgZnJvbSBpbnB1dHMgdGhlIG1hbmFnZW1lbnQgZ2F0ZVxuICogY2Fubm90IHZhbGlkYXRlIChlLmcuIGB3cmFuZ2xlciB0eXBlcyAtYyB3cmFuZ2xlci5qc29uYyAtYyAuLi9ib3VuZC13b3JrZXIvd3JhbmdsZXIuanNvbmNgIGZvciBSUEMgdHlwZXMg4oCUIGFcbiAqIG1hbmFnZWQgZmFsbGJhY2sgZ2VuZXJhdG9yIHdvdWxkIG92ZXJ3cml0ZSB0aGF0IHJpY2hlciBvdXRwdXQpLCBvciB3aGVuIHNldmVyYWwgZGlzdGluY3QgZmxhZ2dlZCBnZW5lcmF0b3JzXG4gKiBleGlzdCBpbiB0aGUgcHJlZmVycmVkIHNjcmlwdCB3aXRoIG5vIHdheSB0byBjaG9vc2Ugb25lIGRldGVybWluaXN0aWNhbGx5LiBgY29tbWFuZGAgaXMgdGhlIHNpbmdsZSBmbGFnZ2VkXG4gKiBnZW5lcmF0b3IgdG8gcmV1c2UsIHByZWZlcnJpbmcgd2hhdCBwb3N0aW5zdGFsbCBhbHJlYWR5IHJ1bnMgKHRoYXQgaXMgd2hhdCBzaGFwZXMgdGhlIGZpbGUgYWZ0ZXIgZXZlcnlcbiAqIGluc3RhbGwpLCB0aGVuIGdlbi1jb2RlLCB0aGVuIGFueSBvdGhlciBzY3JpcHQ7IHVuZGVmaW5lZCBtZWFucyB0aGUgbWFuYWdlZCBkZWZhdWx0IGNvbW1hbmQgYXBwbGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFByb2plY3RXcmFuZ2xlclR5cGVzR2VuZXJhdG9yKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB7XG4gIGNvbmZsaWN0aW5nOiBib29sZWFuO1xuICBjb21tYW5kOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59IHtcbiAgY29uc3Qgc2NyaXB0VmFsdWVzID0gT2JqZWN0LnZhbHVlcyhzY3JpcHRzKS5maWx0ZXIoKHNjcmlwdCk6IHNjcmlwdCBpcyBzdHJpbmcgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycpO1xuICAvLyBTY2FubmVkIG92ZXIgdGhlIGNvbnRleHQtZnJlZSBzZWdtZW50czogYW4gaW52b2NhdGlvbiBhZnRlciBhIHJlYWwgYGNkYCB3cml0ZXMgYW5vdGhlciBkaXJlY3RvcnkncyBmaWxlXG4gIC8vIGFuZCBtdXN0IG5vdCBkaXNhYmxlIG1hbmFnZW1lbnQgb2YgdGhpcyBwYWNrYWdlLlxuICBjb25zdCBjb25mbGljdGluZyA9IHNjcmlwdFZhbHVlcy5zb21lKFxuICAgIChzY3JpcHQpID0+XG4gICAgICBjb250ZXh0RnJlZUNvbW1hbmRTZWdtZW50cyhzY3JpcHQpLnNvbWUoKHNlZ21lbnQpID0+IHtcbiAgICAgICAgY29uc3QgaW52b2NhdGlvbkFyZ3MgPSBwYXJzZVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKHNlZ21lbnQpO1xuICAgICAgICBpZiAoaW52b2NhdGlvbkFyZ3MpIHJldHVybiBjbGFzc2lmeVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKGludm9jYXRpb25BcmdzKSA9PT0gJ2RlZmF1bHRPdXRwdXRDb25mbGljdCc7XG4gICAgICAgIHJldHVybiBpc1VubW9kZWxlZFdyYW5nbGVyVHlwZXNTZWdtZW50KHNlZ21lbnQsIHNjcmlwdHMpO1xuICAgICAgfSkgfHwgaGFzTm9uVHJhbnNwbGFudGFibGVHZW5lcmF0b3JQaXBlbGluZShzY3JpcHQsIHNjcmlwdHMpXG4gICk7XG4gIGNvbnN0IHByZWZlcnJlZENhbmRpZGF0ZXMgPSBbXG4gICAgY29sbGVjdFJldXNhYmxlR2VuZXJhdG9yU2VnbWVudHMoc2NyaXB0cy5wb3N0aW5zdGFsbCwgc2NyaXB0cyksXG4gICAgY29sbGVjdFJldXNhYmxlR2VuZXJhdG9yU2VnbWVudHMoc2NyaXB0c1snZ2VuLWNvZGUnXSwgc2NyaXB0cyksXG4gICAgc2NyaXB0VmFsdWVzLmZsYXRNYXAoKHNjcmlwdCkgPT4gY29sbGVjdFJldXNhYmxlR2VuZXJhdG9yU2VnbWVudHMoc2NyaXB0LCBzY3JpcHRzKSksXG4gIF0uZmluZCgoY2FuZGlkYXRlcykgPT4gY2FuZGlkYXRlcy5sZW5ndGggPiAwKTtcbiAgLy8gTm9ybWFsaXplZCBvbmx5IGFzIHRoZSBkZWR1cGxpY2F0aW9uIGtleTogcmV3cml0aW5nIHdoaXRlc3BhY2UgaW4gdGhlIGNvbW1hbmQgaXRzZWxmIHdvdWxkIGNoYW5nZSBxdW90ZWRcbiAgLy8gdmFsdWVzIChlLmcuIGEgcmVkaXJlY3Rpb24gdGFyZ2V0IHdpdGggZG91YmxlZCBzcGFjZXMpLlxuICBjb25zdCBkaXN0aW5jdENvbW1hbmRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHByZWZlcnJlZENhbmRpZGF0ZXMgPz8gW10pIHtcbiAgICBjb25zdCBrZXkgPSB0b2tlbml6ZUNvbW1hbmRTZWdtZW50KHNlZ21lbnQpLmpvaW4oJyAnKTtcbiAgICBpZiAoIWRpc3RpbmN0Q29tbWFuZHMuaGFzKGtleSkpIGRpc3RpbmN0Q29tbWFuZHMuc2V0KGtleSwgc2VnbWVudCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb25mbGljdGluZzogY29uZmxpY3RpbmcgfHwgZGlzdGluY3RDb21tYW5kcy5zaXplID4gMSxcbiAgICBjb21tYW5kOiBkaXN0aW5jdENvbW1hbmRzLnNpemUgPT09IDEgPyBbLi4uZGlzdGluY3RDb21tYW5kcy52YWx1ZXMoKV1bMF0gOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgc2NyaXB0IHBhaXJzIGEgcmV1c2FibGUgZ2VuZXJhdG9yIHdpdGggcHJlcmVxdWlzaXRlIHNlZ21lbnRzIHRoZSBtYW5hZ2VkIHNjcmlwdHMgY291bGQgbm90XG4gKiB0cmFuc3BsYW50IChlLmcuIGBub2RlIHNjcmlwdHMvcHJlcGFyZS5qcyAmJiB3cmFuZ2xlciB0eXBlcyAtLXN0cmljdC12YXJzPWZhbHNlYCk6IHJldXNpbmcgb25seSB0aGUgZ2VuZXJhdG9yXG4gKiBzZWdtZW50IHdvdWxkIGJ5cGFzcyB0aGUgcHJlcmVxdWlzaXRlcyBpbiBnZW4tY29kZSBhbmQgb24gZnJlc2ggaW5zdGFsbHMsIHNvIHN1Y2ggcGFja2FnZXMgc3RheSB1bm1hbmFnZWQuXG4gKi9cbmZ1bmN0aW9uIGhhc05vblRyYW5zcGxhbnRhYmxlR2VuZXJhdG9yUGlwZWxpbmUoc2NyaXB0OiBzdHJpbmcsIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBib29sZWFuIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBjb250ZXh0RnJlZUNvbW1hbmRTZWdtZW50cyhzY3JpcHQpO1xuICAvLyBCYXJlIGdlbmVyYXRvcnMgYW5kIHdyYXBwZXItcmVhY2hlZCBnZW5lcmF0b3JzIGZvcm0gcGlwZWxpbmVzIHRvbzogYSBwcmVwYXJhdGlvbiBzdGVwIHRoYXQgY3JlYXRlc1xuICAvLyAuZGV2LnZhcnMgYmVmb3JlIGB3cmFuZ2xlciB0eXBlc2AgbXVzdCBub3QgYmUgYnlwYXNzZWQgZWl0aGVyLiBBIGdlbmVyYXRvciByZWFjaGVkIG9ubHkgdGhyb3VnaCBhXG4gIC8vIG1hbmFnZWQgZ2VuLWNvZGUgc2VnbWVudCBkb2VzIG5vdCBjb3VudDogaXRzIHBpcGVsaW5lIGlzIGV4YWN0bHkgd2hhdCB0aGUgbWFuYWdlZCBzY3JpcHRzIHJ1biwgc28gYVxuICAvLyBjb21wb3NpdGlvbiBsaWtlIGB5YXJuIHJ1biBnZW4tY29kZSAmJiB2aXRlIGJ1aWxkYCBieXBhc3NlcyBub3RoaW5nIOKAlCB0cmVhdGluZyBpdCBhcyBhIHBpcGVsaW5lIHdvdWxkXG4gIC8vIChpZGVtcG90ZW5jeS1icmVha2luZ2x5KSBkaXNhYmxlIG1hbmFnZW1lbnQgcmlnaHQgYWZ0ZXIgd2JmeSBpdHNlbGYgYXBwZW5kZWQgdGhlIGdlbmVyYXRvciB0byBnZW4tY29kZS5cbiAgY29uc3QgaGFzUmV1c2FibGVHZW5lcmF0b3IgPSBzZWdtZW50cy5zb21lKFxuICAgIChzZWdtZW50KSA9PlxuICAgICAgIWlzTWFuYWdlZEdlbkNvZGVTZWdtZW50KHNlZ21lbnQsIHNjcmlwdHMpICYmXG4gICAgICByZWFjaGVzV3JhbmdsZXJUeXBlcyhcbiAgICAgICAgc2VnbWVudCxcbiAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgKGludm9jYXRpb25BcmdzKSA9PiBjbGFzc2lmeVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKGludm9jYXRpb25BcmdzKSA9PT0gJ3JldXNhYmxlR2VuZXJhdG9yJ1xuICAgICAgKVxuICApO1xuICBpZiAoIWhhc1JldXNhYmxlR2VuZXJhdG9yKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBzZWdtZW50cy5zb21lKFxuICAgIChzZWdtZW50KSA9PlxuICAgICAgc2VnbWVudCAhPT0gJycgJiZcbiAgICAgICFpc01hbmFnZWRHZW5Db2RlU2VnbWVudChzZWdtZW50LCBzY3JpcHRzKSAmJlxuICAgICAgIXBhcnNlV3JhbmdsZXJUeXBlc0ludm9jYXRpb24oc2VnbWVudCkgJiZcbiAgICAgICFyZWFjaGVzV3JhbmdsZXJUeXBlcyhzZWdtZW50LCBzY3JpcHRzLCAoKSA9PiB0cnVlKVxuICApO1xufVxuXG4vKiogVGhlIGZsYWdnZWQgcmV1c2FibGUtZ2VuZXJhdG9yIHNlZ21lbnRzIHRoZSBzY3JpcHQgcmVhY2hlcywgZGlyZWN0bHkgb3IgdGhyb3VnaCB3cmFwcGVyIHNjcmlwdHMuICovXG5mdW5jdGlvbiBjb2xsZWN0UmV1c2FibGVHZW5lcmF0b3JTZWdtZW50cyhcbiAgc2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIHZpc2l0ZWRTY3JpcHROYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoIXNjcmlwdCkgcmV0dXJuIHNlZ21lbnRzO1xuICByZWFjaGVzV3JhbmdsZXJUeXBlcyhcbiAgICBzY3JpcHQsXG4gICAgc2NyaXB0cyxcbiAgICAoaW52b2NhdGlvbkFyZ3MsIHNlZ21lbnQpID0+IHtcbiAgICAgIGlmIChpbnZvY2F0aW9uQXJncy5sZW5ndGggPiAwICYmIGNsYXNzaWZ5V3JhbmdsZXJUeXBlc0ludm9jYXRpb24oaW52b2NhdGlvbkFyZ3MpID09PSAncmV1c2FibGVHZW5lcmF0b3InKSB7XG4gICAgICAgIC8vIFdpdGhvdXQgdGhlIHRyYWlsaW5nIGNvbW1lbnQ6IGEgcmV1c2VkIGAuLi4gIyBub3RlYCB3b3VsZCBzd2FsbG93IGFueXRoaW5nIGNvbXBvc2VkIGFmdGVyIGl0LlxuICAgICAgICBzZWdtZW50cy5wdXNoKHN0cmlwVHJhaWxpbmdDb21tZW50KHNlZ21lbnQpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTsgLy8ga2VlcCBjb2xsZWN0aW5nIGluc3RlYWQgb2Ygc3RvcHBpbmcgYXQgdGhlIGZpcnN0IG1hdGNoXG4gICAgfSxcbiAgICB2aXNpdGVkU2NyaXB0TmFtZXNcbiAgKTtcbiAgcmV0dXJuIHNlZ21lbnRzO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHBhY2thZ2UncyBpbnN0YWxsIHBpcGVsaW5lIHJlZ2VuZXJhdGVzIHRoZSBtYW5hZ2VkIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMsIGRpcmVjdGx5IG9yIHRocm91Z2hcbiAqIHdyYXBwZXIgc2NyaXB0cy4gVW50cmFja2luZyB0aGUgZmlsZSBpcyBzYWZlIG9ubHkgd2hlbiB0aGlzIGhvbGRzIGZvciB0aGUgZmluYWwgZ2VuZXJhdGVkIHNjcmlwdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3N0aW5zdGFsbEdlbmVyYXRlc1dvcmtlclR5cGVzKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlYWNoZXNXcmFuZ2xlclR5cGVzKFxuICAgIHNjcmlwdHMucG9zdGluc3RhbGwsXG4gICAgc2NyaXB0cyxcbiAgICAoaW52b2NhdGlvbkFyZ3MpID0+IGNsYXNzaWZ5V3JhbmdsZXJUeXBlc0ludm9jYXRpb24oaW52b2NhdGlvbkFyZ3MpID09PSAncmV1c2FibGVHZW5lcmF0b3InXG4gICk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgc2NyaXB0IHJlYWNoZXMgYSBgd3JhbmdsZXIgdHlwZXNgIGludm9jYXRpb24gc2F0aXNmeWluZyB0aGUgcHJlZGljYXRlLCBkaXJlY3RseSBvciB0aHJvdWdoIHRoZVxuICogcGFja2FnZSBzY3JpcHRzIGl0IGludm9rZXMgKGUuZy4gYFwicG9zdGluc3RhbGxcIjogXCJ5YXJuIGdlbjp0eXBlc1wiYCwgd2l0aCBydW5uZXIgZmxhZ3MgYW5kIGVudmlyb25tZW50XG4gKiBhc3NpZ25tZW50cyBhbGxvd2VkIGFyb3VuZCB0aGUgc2NyaXB0IG5hbWUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhY2hlc1dyYW5nbGVyVHlwZXMoXG4gIHNjcmlwdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBwcmVkaWNhdGU6IChpbnZvY2F0aW9uQXJnczogc3RyaW5nW10sIHNlZ21lbnQ6IHN0cmluZykgPT4gYm9vbGVhbixcbiAgdmlzaXRlZFNjcmlwdE5hbWVzID0gbmV3IFNldDxzdHJpbmc+KClcbik6IGJvb2xlYW4ge1xuICBpZiAoIXNjcmlwdCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgY29udGV4dEZyZWVDb21tYW5kU2VnbWVudHMoc2NyaXB0KSkge1xuICAgIGNvbnN0IGludm9jYXRpb25BcmdzID0gcGFyc2VXcmFuZ2xlclR5cGVzSW52b2NhdGlvbihzZWdtZW50KTtcbiAgICBpZiAoaW52b2NhdGlvbkFyZ3MgJiYgcHJlZGljYXRlKGludm9jYXRpb25BcmdzLCBzZWdtZW50KSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVDb21tYW5kU2VnbWVudChzZWdtZW50KTtcbiAgICBsZXQgaW5kZXggPSBza2lwRW52aXJvbm1lbnRBc3NpZ25tZW50cyh0b2tlbnMpO1xuICAgIGxldCBpbnZva2VkU2NyaXB0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChzY3JpcHRXcmFwcGVyUnVubmVyQ29tbWFuZHMuaGFzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgbGV0IHJ1bm5lckZsYWdzID0gY29uc3VtZVJ1bm5lckZsYWdzKHRva2VucywgaW5kZXgpO1xuICAgICAgaWYgKFsncnVuJywgJ3J1bi1zY3JpcHQnXS5pbmNsdWRlcyh0b2tlbnNbcnVubmVyRmxhZ3MuaW5kZXhdID8/ICcnKSkge1xuICAgICAgICBydW5uZXJGbGFncyA9IGNvbnN1bWVSdW5uZXJGbGFncyh0b2tlbnMsIHJ1bm5lckZsYWdzLmluZGV4ICsgMSwgcnVubmVyRmxhZ3MubGVhdmVzUGFja2FnZSk7XG4gICAgICB9XG4gICAgICAvLyBBIHJ1bm5lciBkaXJlY3RlZCBhdCBhbm90aGVyIGRpcmVjdG9yeSAoZS5nLiBgeWFybiAtLWN3ZCAuLi9vdGhlciBnZW4tdHlwZXNgKSBydW5zIHRoYXQgcGFja2FnZSdzXG4gICAgICAvLyBzY3JpcHQsIG5vdCBvbmUgb2YgdGhlc2U7IGZvcndhcmRlZCBhcmd1bWVudHMgKGBucG0gcnVuIGdlbi10eXBlcyAtLSAtLWNoZWNrYCkgY2hhbmdlIHRoZSBlZmZlY3RpdmVcbiAgICAgIC8vIGludm9jYXRpb24sIHNvIHRoZSB3cmFwcGVyIGNhbm5vdCBzdGFuZCBmb3IgdGhlIHBsYWluIHNjcmlwdCBlaXRoZXIuXG4gICAgICBpbnZva2VkU2NyaXB0TmFtZSA9XG4gICAgICAgIHJ1bm5lckZsYWdzLmxlYXZlc1BhY2thZ2UgfHwgdG9rZW5zLmxlbmd0aCA+IHJ1bm5lckZsYWdzLmluZGV4ICsgMSA/IHVuZGVmaW5lZCA6IHRva2Vuc1tydW5uZXJGbGFncy5pbmRleF07XG4gICAgfVxuICAgIGlmICghaW52b2tlZFNjcmlwdE5hbWUgfHwgdmlzaXRlZFNjcmlwdE5hbWVzLmhhcyhpbnZva2VkU2NyaXB0TmFtZSkpIGNvbnRpbnVlO1xuICAgIHZpc2l0ZWRTY3JpcHROYW1lcy5hZGQoaW52b2tlZFNjcmlwdE5hbWUpO1xuICAgIGNvbnN0IGludm9rZWRTY3JpcHQgPSBzY3JpcHRzW2ludm9rZWRTY3JpcHROYW1lXTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgaW52b2tlZFNjcmlwdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIHJlYWNoZXNXcmFuZ2xlclR5cGVzKGludm9rZWRTY3JpcHQsIHNjcmlwdHMsIHByZWRpY2F0ZSwgdmlzaXRlZFNjcmlwdE5hbWVzKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUaGUgY29tbWFuZCBzZWdtZW50cyBvZiBhIHNjcmlwdCB0aGF0IHJ1biBpbiB0aGUgcGFja2FnZSBkaXJlY3Rvcnk6IHNlZ21lbnRzIGFmdGVyIGEgYGNkYCAoZXhjZXB0IGxpdGVyYWxcbiAqIG5vLW9wcyBsaWtlIGBjZCAuYCkgZXhlY3V0ZSBzb21ld2hlcmUgZWxzZSwgc28gYSBgd3JhbmdsZXIgdHlwZXNgIHRoZXJlIGdlbmVyYXRlcyBhbm90aGVyIHBhY2thZ2UncyBmaWxlLCBub3RcbiAqIHRoaXMgb25lJ3MsIGFuZCBtdXN0IGJlIGludmlzaWJsZSB0byBldmVyeSBkZWNpc2lvbiBhYm91dCB0aGUgbWFuYWdlZCBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGV4dEZyZWVDb21tYW5kU2VnbWVudHMoc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc3BsaXRDb21tYW5kU2VnbWVudHMoc2NyaXB0KSkge1xuICAgIGlmIChpc0RpcmVjdG9yeUNoYW5nZShzZWdtZW50KSkge1xuICAgICAgaWYgKGlzTm9PcERpcmVjdG9yeUNoYW5nZShzZWdtZW50KSkgY29udGludWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2VnbWVudHMucHVzaChzZWdtZW50KTtcbiAgfVxuICByZXR1cm4gc2VnbWVudHM7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBzY3JpcHQgbGVhdmVzIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSBhdCBzb21lIHBvaW50IChhbiBhcHBlbmRlZCBjb21tYW5kIHdvdWxkIHRoZW4gcnVuIGVsc2V3aGVyZSkuICovXG5leHBvcnQgZnVuY3Rpb24gc2NyaXB0Q2hhbmdlc1dvcmtpbmdEaXJlY3Rvcnkoc2NyaXB0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNwbGl0Q29tbWFuZFNlZ21lbnRzKHNjcmlwdCkuc29tZSgoc2VnbWVudCkgPT4gaXNEaXJlY3RvcnlDaGFuZ2Uoc2VnbWVudCkgJiYgIWlzTm9PcERpcmVjdG9yeUNoYW5nZShzZWdtZW50KSk7XG59XG5cbi8qKlxuICogU3BsaXQgYSBzaGVsbCBjb21tYW5kIGxpbmUgb24gYCYmYCBvdXRzaWRlIHF1b3RlczogYSBxdW90ZWQgYCYmYCAoZS5nLiBgZWNobyBcInNldHVwICYmIHdyYW5nbGVyIHR5cGVzIC4uLlwiYClcbiAqIGlzIGFyZ3VtZW50IHRleHQsIGFuZCBzcGxpdHRpbmcgaW5zaWRlIGl0IHdvdWxkIGZhYnJpY2F0ZSBhIGNvbW1hbmQgdGhhdCB3YXMgbmV2ZXIgcnVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRDb21tYW5kU2VnbWVudHMoc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudCA9ICcnO1xuICBsZXQgcXVvdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNjcmlwdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBzY3JpcHRbaW5kZXhdID8/ICcnO1xuICAgIGlmIChxdW90ZSkge1xuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnICYmIHF1b3RlID09PSAnXCInKSB7XG4gICAgICAgIGN1cnJlbnQgKz0gY2hhcmFjdGVyICsgKHNjcmlwdFsrK2luZGV4XSA/PyAnJyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gcXVvdGUpIHF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgY3VycmVudCArPSBjaGFyYWN0ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gXCInXCIgfHwgY2hhcmFjdGVyID09PSAnXCInKSB7XG4gICAgICBxdW90ZSA9IGNoYXJhY3RlcjtcbiAgICAgIGN1cnJlbnQgKz0gY2hhcmFjdGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICcmJyAmJiBzY3JpcHRbaW5kZXggKyAxXSA9PT0gJyYnKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgICAgIGN1cnJlbnQgPSAnJztcbiAgICAgIGluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY3VycmVudCArPSBjaGFyYWN0ZXI7XG4gIH1cbiAgc2VnbWVudHMucHVzaChjdXJyZW50LnRyaW0oKSk7XG4gIHJldHVybiBzZWdtZW50cztcbn1cblxuZnVuY3Rpb24gaXNEaXJlY3RvcnlDaGFuZ2Uoc2VnbWVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRva2VucyA9IHRva2VuaXplQ29tbWFuZFNlZ21lbnQoc2VnbWVudCk7XG4gIHJldHVybiB0b2tlbnNbc2tpcEVudmlyb25tZW50QXNzaWdubWVudHModG9rZW5zKV0gPT09ICdjZCc7XG59XG5cbmZ1bmN0aW9uIGlzTm9PcERpcmVjdG9yeUNoYW5nZShzZWdtZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVDb21tYW5kU2VnbWVudChzZWdtZW50KTtcbiAgbGV0IHRhcmdldEluZGV4ID0gc2tpcEVudmlyb25tZW50QXNzaWdubWVudHModG9rZW5zKSArIDE7XG4gIGlmICh0b2tlbnNbdGFyZ2V0SW5kZXhdID09PSAnLS0nKSB0YXJnZXRJbmRleCsrO1xuICAvLyBOb3JtYWxpemUgc3RhdGljIHNwZWxsaW5ncyBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkgKGAuYCwgYC4vYCwgYC4vLmAsIGAuLy4vYCwgLi4uKTsgYW55dGhpbmcgZWxzZVxuICAvLyAoaW5jbHVkaW5nIGEgYmFyZSBgY2RgLCB3aGljaCBnb2VzIHRvICRIT01FKSBjb3VudHMgYXMgYSByZWFsIGRpcmVjdG9yeSBjaGFuZ2UuXG4gIGxldCB0YXJnZXQgPSB1bnF1b3RlU2hlbGxUb2tlbih0b2tlbnNbdGFyZ2V0SW5kZXhdID8/ICcnKTtcbiAgd2hpbGUgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpKSB0YXJnZXQgPSB0YXJnZXQuc2xpY2UoMik7XG4gIGlmICh0YXJnZXQuZW5kc1dpdGgoJy8nKSkgdGFyZ2V0ID0gdGFyZ2V0LnNsaWNlKDAsIC0xKTtcbiAgcmV0dXJuIHRhcmdldCA9PT0gJy4nICYmIHRhcmdldEluZGV4ICsgMSA9PT0gdG9rZW5zLmxlbmd0aDtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHNlZ21lbnQganVzdCBydW5zIHRoZSBtYW5hZ2VkIGNvZGUgZ2VuZXJhdGlvbiAoYHdiIGdlbi1jb2RlYCwgb3IgYSBydW5uZXIgd3JhcHBlciBvZiBnZW4tY29kZSkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNYW5hZ2VkR2VuQ29kZVNlZ21lbnQoc2VnbWVudDogc3RyaW5nLCBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRva2VucyA9IHRva2VuaXplQ29tbWFuZFNlZ21lbnQoc2VnbWVudCk7XG4gIGxldCBpbmRleCA9IHNraXBFbnZpcm9ubWVudEFzc2lnbm1lbnRzKHRva2Vucyk7XG4gIGxldCBpc1J1blN1YmNvbW1hbmQgPSBmYWxzZTtcbiAgaWYgKHNjcmlwdFJ1bm5lckNvbW1hbmRzLmhhcyh0b2tlbnNbaW5kZXhdID8/ICcnKSkge1xuICAgIGluZGV4Kys7XG4gICAgbGV0IHJ1bm5lckZsYWdzID0gY29uc3VtZVJ1bm5lckZsYWdzKHRva2VucywgaW5kZXgpO1xuICAgIGlmIChbJ3J1bicsICdydW4tc2NyaXB0JywgJ2V4ZWMnLCAnZGx4JywgJ3gnXS5pbmNsdWRlcyh0b2tlbnNbcnVubmVyRmxhZ3MuaW5kZXhdID8/ICcnKSkge1xuICAgICAgaXNSdW5TdWJjb21tYW5kID0gWydydW4nLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKHRva2Vuc1tydW5uZXJGbGFncy5pbmRleF0gPz8gJycpO1xuICAgICAgcnVubmVyRmxhZ3MgPSBjb25zdW1lUnVubmVyRmxhZ3ModG9rZW5zLCBydW5uZXJGbGFncy5pbmRleCArIDEsIHJ1bm5lckZsYWdzLmxlYXZlc1BhY2thZ2UpO1xuICAgIH1cbiAgICBpZiAocnVubmVyRmxhZ3MubGVhdmVzUGFja2FnZSkgcmV0dXJuIGZhbHNlO1xuICAgIGluZGV4ID0gcnVubmVyRmxhZ3MuaW5kZXg7XG4gIH1cbiAgLy8gRXhhY3QgbWF0Y2ggb25seTogYHdiIGdlbi1jb2RlIDsgd3JhbmdsZXIgdHlwZXMgLS1jb25maWcgLi4uYCBvciBgd2IgZ2VuLWNvZGUgLS1mbGFnYCBpcyBub3QgdGhlIHBsYWluXG4gIC8vIG1hbmFnZWQgaW52b2NhdGlvbiBhbmQgbXVzdCBub3QgYmUgZGlzY2FyZGVkIGFzIG9uZS4gQWZ0ZXIgYHJ1bmAvYHJ1bi1zY3JpcHRgIG9ubHkgYSBwYWNrYWdlLXNjcmlwdCBuYW1lXG4gIC8vIGZvbGxvd3MsIHNvIGBucG0gcnVuIHdiIGdlbi1jb2RlYCBpbnZva2VzIHRoZSBzY3JpcHQgY2FsbGVkIGB3YmAsIG5vdCB0aGUgd2IgYmluYXJ5LlxuICBpZiAoIWlzUnVuU3ViY29tbWFuZCAmJiB0b2tlbnNbaW5kZXhdID09PSAnd2InICYmIHRva2Vuc1tpbmRleCArIDFdID09PSAnZ2VuLWNvZGUnKSB7XG4gICAgcmV0dXJuIGluZGV4ICsgMiA9PT0gdG9rZW5zLmxlbmd0aDtcbiAgfVxuICBpZiAodG9rZW5zW2luZGV4XSAhPT0gJ2dlbi1jb2RlJyB8fCBpbmRleCArIDEgIT09IHRva2Vucy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgLy8gQSBnZW4tY29kZSB3cmFwcGVyIGlzIGludGVyY2hhbmdlYWJsZSB3aXRoIGB3YiBnZW4tY29kZWAgb25seSB3aGVuIHRoZSBnZW4tY29kZSBzY3JpcHQgaXRzZWxmIGlzIHRoZVxuICAvLyBtYW5hZ2VkIHBpcGVsaW5lIChgd2IgZ2VuLWNvZGVgIHBsdXMgcmV1c2FibGUgbWFuYWdlZCBnZW5lcmF0aW9uKTsgYSBjdXN0b20gcGlwZWxpbmUgYmVoaW5kIGl0IChlLmcuXG4gIC8vIGBub2RlIHNjcmlwdHMvcHJlcGFyZVR5cGVzLmpzICYmIHdyYW5nbGVyIHR5cGVzIC4uLmAgb3IgYSBjdXN0b20tY29uZmlnIGludm9jYXRpb24pIG11c3QgYmUgcHJlc2VydmVkXG4gIC8vIGluc3RlYWQgb2YgYmVpbmcgcmVwbGFjZWQgYnkgdGhlIGJhcmUgd2IgY29tbWFuZC5cbiAgY29uc3QgZ2VuQ29kZVNjcmlwdCA9IHNjcmlwdHNbJ2dlbi1jb2RlJ107XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIGdlbkNvZGVTY3JpcHQgPT09ICdzdHJpbmcnICYmXG4gICAgY29udGV4dEZyZWVDb21tYW5kU2VnbWVudHMoZ2VuQ29kZVNjcmlwdCkuZXZlcnkoKGdlbkNvZGVTZWdtZW50KSA9PiB7XG4gICAgICBpZiAoZ2VuQ29kZVNlZ21lbnQgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGNvbnN0IGdlbkNvZGVUb2tlbnMgPSB0b2tlbml6ZUNvbW1hbmRTZWdtZW50KGdlbkNvZGVTZWdtZW50KTtcbiAgICAgIGxldCBnZW5Db2RlSW5kZXggPSBza2lwRW52aXJvbm1lbnRBc3NpZ25tZW50cyhnZW5Db2RlVG9rZW5zKTtcbiAgICAgIGlmIChzY3JpcHRSdW5uZXJDb21tYW5kcy5oYXMoZ2VuQ29kZVRva2Vuc1tnZW5Db2RlSW5kZXhdID8/ICcnKSkgZ2VuQ29kZUluZGV4Kys7XG4gICAgICBpZiAoZ2VuQ29kZVRva2Vuc1tnZW5Db2RlSW5kZXhdID09PSAnd2InICYmIGdlbkNvZGVUb2tlbnNbZ2VuQ29kZUluZGV4ICsgMV0gPT09ICdnZW4tY29kZScpIHJldHVybiB0cnVlO1xuICAgICAgY29uc3QgaW52b2NhdGlvbkFyZ3MgPSBwYXJzZVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKGdlbkNvZGVTZWdtZW50KTtcbiAgICAgIHJldHVybiAhIWludm9jYXRpb25BcmdzICYmIGNsYXNzaWZ5V3JhbmdsZXJUeXBlc0ludm9jYXRpb24oaW52b2NhdGlvbkFyZ3MpID09PSAncmV1c2FibGVHZW5lcmF0b3InO1xuICAgIH0pXG4gICk7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBzY3JpcHQgdGV4dHVhbGx5IG1lbnRpb25zIGB3cmFuZ2xlciB0eXBlc2Agb3V0c2lkZSBxdW90ZXMsIHdoYXRldmVyIGl0cyBzaGVsbCBmb3JtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbnRpb25zV3JhbmdsZXJUeXBlcyhzY3JpcHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL1xcYndyYW5nbGVyXFxzK3R5cGVzXFxiL3UudGVzdChzdHJpcFF1b3RlZFNwYW5zKHNjcmlwdCkpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHNlZ21lbnQgaW52b2x2ZXMgYHdyYW5nbGVyIHR5cGVzYCBpbiBhIHNoZWxsIGZvcm0gdGhlIHBhcnNlciBjYW5ub3QgZmFpdGhmdWxseSBtb2RlbDogYW4gdW5xdW90ZWRcbiAqIG1lbnRpb24gdGhhdCBkb2VzIG5vdCBwYXJzZSBhcyBhbiBpbnZvY2F0aW9uIChhIHN1YnNoZWxsLCBhIG5vbi1sb2NhbCBydW5uZXIsIGFyYml0cmFyeSBzaGVsbCBzeW50YXgpLCBhXG4gKiBzeW50YWN0aWNhbGx5IHF1b3RlZCBjb21tYW5kIHdvcmQgKGBcIndyYW5nbGVyXCIgdHlwZXNgIGV4ZWN1dGVzIHdyYW5nbGVyIGJ1dCBldmFkZXMgdG9rZW5pemF0aW9uKSwgb3IgYSB3cmFwcGVyXG4gKiBmb3J3YXJkaW5nIGV4dHJhIGFyZ3VtZW50cyAoYG5wbSBydW4gZ2VuLXR5cGVzIC0tIC0tY2hlY2tgKSB3aG9zZSB0YXJnZXQgaW52b2x2ZXMgYHdyYW5nbGVyIHR5cGVzYCDigJQgdGhlXG4gKiBmb3J3YXJkZWQgYXJndW1lbnRzIGNoYW5nZSB0aGUgZWZmZWN0aXZlIGludm9jYXRpb24uIFN1Y2ggc2VnbWVudHMgbWFrZSB0aGUgcGFja2FnZSB1bm1hbmFnZWFibGUgYW5kIG11c3QgYmVcbiAqIHByZXNlcnZlZCB2ZXJiYXRpbSB3aGVyZXZlciB3YmZ5IHJld3JpdGVzIHNjcmlwdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1VubW9kZWxlZFdyYW5nbGVyVHlwZXNTZWdtZW50KFxuICBzZWdtZW50OiBzdHJpbmcsXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIHZpc2l0ZWRTY3JpcHROYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4pOiBib29sZWFuIHtcbiAgaWYgKHBhcnNlV3JhbmdsZXJUeXBlc0ludm9jYXRpb24oc2VnbWVudCkpIHJldHVybiBmYWxzZTtcbiAgaWYgKG1lbnRpb25zV3JhbmdsZXJUeXBlcyhzZWdtZW50KSkgcmV0dXJuIHRydWU7XG4gIGlmICgvW1wiJ113cmFuZ2xlcltcIiddXFxzK3R5cGVzXFxifFxcYndyYW5nbGVyXFxzK1tcIidddHlwZXNbXCInXS91LnRlc3Qoc2VnbWVudCkpIHJldHVybiB0cnVlO1xuICAvLyBEb3VibGUgcXVvdGVzIGRvIG5vdCBzdXBwcmVzcyBjb21tYW5kIHN1YnN0aXR1dGlvbjogYGVjaG8gXCIkKHdyYW5nbGVyIHR5cGVzIC4uLilcImAgZXhlY3V0ZXMgd3JhbmdsZXIuXG4gIGlmICgvXFwkXFwofGAvdS50ZXN0KHN0cmlwU2luZ2xlUXVvdGVkU3BhbnMoc2VnbWVudCkpICYmIC9cXGJ3cmFuZ2xlclxccyt0eXBlc1xcYi91LnRlc3Qoc2VnbWVudCkpIHJldHVybiB0cnVlO1xuICAvLyBHbG9iYWwgb3B0aW9ucyBtYXkgcHJlY2VkZSB0aGUgc3ViY29tbWFuZCAoYHdyYW5nbGVyIC0tY29uZmlnIGFsdGVybmF0ZS5qc29uYyB0eXBlc2ApOyBhbnkgdW5wYXJzZWRcbiAgLy8gc2VnbWVudCBjYXJyeWluZyBib3RoIHdvcmRzIGNhbm5vdCBiZSBjbGFzc2lmaWVkLlxuICBjb25zdCB1bnF1b3RlZFRva2VucyA9IG5ldyBTZXQodG9rZW5pemVDb21tYW5kU2VnbWVudChzZWdtZW50KS5tYXAoKHRva2VuKSA9PiB1bnF1b3RlU2hlbGxUb2tlbih0b2tlbikpKTtcbiAgaWYgKHVucXVvdGVkVG9rZW5zLmhhcygnd3JhbmdsZXInKSAmJiB1bnF1b3RlZFRva2Vucy5oYXMoJ3R5cGVzJykpIHJldHVybiB0cnVlO1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZUNvbW1hbmRTZWdtZW50KHNlZ21lbnQpO1xuICBsZXQgaW5kZXggPSBza2lwRW52aXJvbm1lbnRBc3NpZ25tZW50cyh0b2tlbnMpO1xuICBpZiAoIXNjcmlwdFdyYXBwZXJSdW5uZXJDb21tYW5kcy5oYXModG9rZW5zW2luZGV4XSA/PyAnJykpIHJldHVybiBmYWxzZTtcbiAgaW5kZXgrKztcbiAgbGV0IHJ1bm5lckZsYWdzID0gY29uc3VtZVJ1bm5lckZsYWdzKHRva2VucywgaW5kZXgpO1xuICBpZiAoWydydW4nLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKHRva2Vuc1tydW5uZXJGbGFncy5pbmRleF0gPz8gJycpKSB7XG4gICAgcnVubmVyRmxhZ3MgPSBjb25zdW1lUnVubmVyRmxhZ3ModG9rZW5zLCBydW5uZXJGbGFncy5pbmRleCArIDEsIHJ1bm5lckZsYWdzLmxlYXZlc1BhY2thZ2UpO1xuICB9XG4gIGNvbnN0IGludm9rZWRTY3JpcHROYW1lID0gdG9rZW5zW3J1bm5lckZsYWdzLmluZGV4XTtcbiAgY29uc3QgZm9yd2FyZHNBcmd1bWVudHMgPSB0b2tlbnMubGVuZ3RoID4gcnVubmVyRmxhZ3MuaW5kZXggKyAxO1xuICBpZiAocnVubmVyRmxhZ3MubGVhdmVzUGFja2FnZSB8fCAhaW52b2tlZFNjcmlwdE5hbWUpIHJldHVybiBmYWxzZTtcbiAgaWYgKHZpc2l0ZWRTY3JpcHROYW1lcy5oYXMoaW52b2tlZFNjcmlwdE5hbWUpKSByZXR1cm4gZmFsc2U7XG4gIHZpc2l0ZWRTY3JpcHROYW1lcy5hZGQoaW52b2tlZFNjcmlwdE5hbWUpO1xuICBjb25zdCBpbnZva2VkU2NyaXB0ID0gc2NyaXB0c1tpbnZva2VkU2NyaXB0TmFtZV07XG4gIGlmICh0eXBlb2YgaW52b2tlZFNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgLy8gQSBwbGFpbiB3cmFwcGVyIG9mIGFuIHVubW9kZWxlZCB0YXJnZXQgaXMgaXRzZWxmIHVubW9kZWxlZDsgYSB3cmFwcGVyIGZvcndhcmRpbmcgYXJndW1lbnRzIGFkZGl0aW9uYWxseVxuICAvLyBjaGFuZ2VzIGFueSBtb2RlbGVkIHRhcmdldCdzIGVmZmVjdGl2ZSBpbnZvY2F0aW9uLCBzbyByZWFjaGluZyBvbmUgdGFpbnRzIGl0IHRvby5cbiAgcmV0dXJuIChcbiAgICBzcGxpdENvbW1hbmRTZWdtZW50cyhpbnZva2VkU2NyaXB0KS5zb21lKChpbnZva2VkU2VnbWVudCkgPT5cbiAgICAgIGlzVW5tb2RlbGVkV3JhbmdsZXJUeXBlc1NlZ21lbnQoaW52b2tlZFNlZ21lbnQsIHNjcmlwdHMsIHZpc2l0ZWRTY3JpcHROYW1lcylcbiAgICApIHx8XG4gICAgKGZvcndhcmRzQXJndW1lbnRzICYmIHJlYWNoZXNXcmFuZ2xlclR5cGVzKGludm9rZWRTY3JpcHQsIHNjcmlwdHMsICgpID0+IHRydWUsIG5ldyBTZXQodmlzaXRlZFNjcmlwdE5hbWVzKSkpXG4gICk7XG59XG5cbi8qKiBUb2tlbml6ZSBhIGNvbW1hbmQgc2VnbWVudCBvbiB3aGl0ZXNwYWNlIG91dHNpZGUgcXVvdGVzLCBzbyBxdW90ZWQgdmFsdWVzIChlLmcuIGBYPVwiYSBiXCJgKSBzdGF5IG9uZSB0b2tlbi4gKi9cbmZ1bmN0aW9uIHRva2VuaXplQ29tbWFuZFNlZ21lbnQoc2VnbWVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB0b2tlbnM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXJyZW50ID0gJyc7XG4gIGxldCBxdW90ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2VnbWVudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBzZWdtZW50W2luZGV4XSA/PyAnJztcbiAgICBpZiAocXVvdGUpIHtcbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXFxcJyAmJiBxdW90ZSA9PT0gJ1wiJykge1xuICAgICAgICBjdXJyZW50ICs9IGNoYXJhY3RlciArIChzZWdtZW50WysraW5kZXhdID8/ICcnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBxdW90ZSkgcXVvdGUgPSB1bmRlZmluZWQ7XG4gICAgICBjdXJyZW50ICs9IGNoYXJhY3RlcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSBcIidcIiB8fCBjaGFyYWN0ZXIgPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2hhcmFjdGVyO1xuICAgICAgY3VycmVudCArPSBjaGFyYWN0ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKC9cXHMvdS50ZXN0KGNoYXJhY3RlcikpIHtcbiAgICAgIGlmIChjdXJyZW50KSB0b2tlbnMucHVzaChjdXJyZW50KTtcbiAgICAgIGN1cnJlbnQgPSAnJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjdXJyZW50ICs9IGNoYXJhY3RlcjtcbiAgfVxuICBpZiAoY3VycmVudCkgdG9rZW5zLnB1c2goY3VycmVudCk7XG4gIHJldHVybiB0b2tlbnM7XG59XG5cbi8qKiBSZW1vdmUgcXVvdGVkIHNwYW5zIHNvIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIGluc2lkZSBhcmd1bWVudCB0ZXh0IGFyZSBub3QgbWlzdGFrZW4gZm9yIHN5bnRheC4gKi9cbmZ1bmN0aW9uIHN0cmlwUXVvdGVkU3BhbnMoc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGxldCBxdW90ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2NyaXB0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXJhY3RlciA9IHNjcmlwdFtpbmRleF0gPz8gJyc7XG4gICAgaWYgKHF1b3RlKSB7XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcgJiYgcXVvdGUgPT09ICdcIicpIGluZGV4Kys7XG4gICAgICBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IHF1b3RlKSBxdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSBcIidcIiB8fCBjaGFyYWN0ZXIgPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2hhcmFjdGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJlc3VsdCArPSBjaGFyYWN0ZXI7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIFJlbW92ZSBvbmx5IHNpbmdsZS1xdW90ZWQgc3BhbnM6IGRvdWJsZSBxdW90ZXMgZG8gbm90IHN1cHByZXNzIGNvbW1hbmQgc3Vic3RpdHV0aW9uIChgJCgpYCwgYmFja3RpY2tzKS4gKi9cbmZ1bmN0aW9uIHN0cmlwU2luZ2xlUXVvdGVkU3BhbnMoc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGxldCBpblNpbmdsZVF1b3RlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgY2hhcmFjdGVyIG9mIHNjcmlwdCkge1xuICAgIGlmIChpblNpbmdsZVF1b3RlKSB7XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBcIidcIikgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09IFwiJ1wiKSB7XG4gICAgICBpblNpbmdsZVF1b3RlID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXN1bHQgKz0gY2hhcmFjdGVyO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBSZW1vdmUgc2hlbGwgcXVvdGUgZGVsaW1pdGVycywga2VlcGluZyB0aGVpciBjb250ZW50OiBgJy0tY29uZmlnJ2AgaGFzIHRoZSBhcmd1bWVudCB2YWx1ZSAtLWNvbmZpZy4gKi9cbmZ1bmN0aW9uIHVucXVvdGVTaGVsbFRva2VuKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGxldCBxdW90ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG9rZW4ubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gdG9rZW5baW5kZXhdID8/ICcnO1xuICAgIGlmIChxdW90ZSkge1xuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnICYmIHF1b3RlID09PSAnXCInKSB7XG4gICAgICAgIHJlc3VsdCArPSB0b2tlblsrK2luZGV4XSA/PyAnJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBxdW90ZSkgcXVvdGUgPSB1bmRlZmluZWQ7XG4gICAgICBlbHNlIHJlc3VsdCArPSBjaGFyYWN0ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gXCInXCIgfHwgY2hhcmFjdGVyID09PSAnXCInKSB7XG4gICAgICBxdW90ZSA9IGNoYXJhY3RlcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXN1bHQgKz0gY2hhcmFjdGVyO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBDdXQgYSB0cmFpbGluZyB1bnF1b3RlZCBzaGVsbCBjb21tZW50IHNvIGNvbXBvc2luZyBmdXJ0aGVyIGNvbW1hbmRzIGFmdGVyIHRoZSBzZWdtZW50IHN0YXlzIGV4ZWN1dGFibGUuICovXG5mdW5jdGlvbiBzdHJpcFRyYWlsaW5nQ29tbWVudChzZWdtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcXVvdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNlZ21lbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gc2VnbWVudFtpbmRleF0gPz8gJyc7XG4gICAgaWYgKHF1b3RlKSB7XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcgJiYgcXVvdGUgPT09ICdcIicpIGluZGV4Kys7XG4gICAgICBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IHF1b3RlKSBxdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSBcIidcIiB8fCBjaGFyYWN0ZXIgPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2hhcmFjdGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICcjJyAmJiAoaW5kZXggPT09IDAgfHwgL1xccy91LnRlc3Qoc2VnbWVudFtpbmRleCAtIDFdID8/ICcnKSkpIHtcbiAgICAgIHJldHVybiBzZWdtZW50LnNsaWNlKDAsIGluZGV4KS50cmltKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzZWdtZW50O1xufVxuXG4vKipcbiAqIFBhcnNlIGEgY29tbWFuZCBzZWdtZW50IGFzIGEgYHdyYW5nbGVyIHR5cGVzYCBpbnZvY2F0aW9uIGFuZCByZXR1cm4gaXRzIGFyZ3VtZW50cyAod2l0aCBzaGVsbCByZWRpcmVjdGlvbnNcbiAqIHN0cmlwcGVkKSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHNlZ21lbnQgcnVucyBzb21ldGhpbmcgZWxzZS4gUmVxdWlyaW5nIGNvbW1hbmQgcG9zaXRpb24gKGFmdGVyIGVudmlyb25tZW50XG4gKiBhc3NpZ25tZW50cyBhbmQgYSBydW5uZXIgcHJlZml4IHdpdGggaXRzIGZsYWdzLCBlLmcuIGBucHggLS15ZXNgKSBrZWVwcyBzaGVsbCB0ZXh0IHRoYXQgbWVyZWx5IG1lbnRpb25zIHRoZVxuICogd29yZHMgKGUuZy4gYGVjaG8gd3JhbmdsZXIgdHlwZXNgKSBmcm9tIGJlaW5nIHRyZWF0ZWQgYXMgYSBnZW5lcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKHNlZ21lbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgLy8gQW4gdW5xdW90ZWQgbmV3bGluZSBzZXBhcmF0ZXMgY29tbWFuZHMgdGhlIHNlZ21lbnQgc3BsaXR0ZXIgZG9lcyBub3QgbW9kZWwuXG4gIGlmIChzdHJpcFF1b3RlZFNwYW5zKHNlZ21lbnQpLmluY2x1ZGVzKCdcXG4nKSkgcmV0dXJuO1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZUNvbW1hbmRTZWdtZW50KHNlZ21lbnQpO1xuICBsZXQgaW5kZXggPSBza2lwRW52aXJvbm1lbnRBc3NpZ25tZW50cyh0b2tlbnMpO1xuICBpZiAoc2NyaXB0UnVubmVyQ29tbWFuZHMuaGFzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgaW5kZXgrKztcbiAgICBsZXQgcnVubmVyRmxhZ3MgPSBjb25zdW1lUnVubmVyRmxhZ3ModG9rZW5zLCBpbmRleCk7XG4gICAgLy8gYHJ1bmAvYHJ1bi1zY3JpcHRgIG5hbWUgYSBwYWNrYWdlIHNjcmlwdCwgbmV2ZXIgYSBiaW5hcnk6IGBucG0gcnVuIHdyYW5nbGVyIHR5cGVzYCBpbnZva2VzIHRoZSBzY3JpcHRcbiAgICAvLyBjYWxsZWQgYHdyYW5nbGVyYCB3aXRoIGB0eXBlc2AgYXMgYW4gYXJndW1lbnQsIHNvIGl0IG11c3QgZ28gdGhyb3VnaCB3cmFwcGVyIHJlc29sdXRpb24gaW5zdGVhZC5cbiAgICBpZiAoWydydW4nLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKHRva2Vuc1tydW5uZXJGbGFncy5pbmRleF0gPz8gJycpKSByZXR1cm47XG4gICAgaWYgKFsnZXhlYycsICdkbHgnLCAneCddLmluY2x1ZGVzKHRva2Vuc1tydW5uZXJGbGFncy5pbmRleF0gPz8gJycpKSB7XG4gICAgICBydW5uZXJGbGFncyA9IGNvbnN1bWVSdW5uZXJGbGFncyh0b2tlbnMsIHJ1bm5lckZsYWdzLmluZGV4ICsgMSwgcnVubmVyRmxhZ3MubGVhdmVzUGFja2FnZSk7XG4gICAgfVxuICAgIC8vIEEgcnVubmVyIGRpcmVjdGVkIGF0IGFub3RoZXIgZGlyZWN0b3J5IHJ1bnMgdGhhdCBwYWNrYWdlJ3Mgd3JhbmdsZXIsIG5vdCB0aGlzIG9uZSdzLlxuICAgIGlmIChydW5uZXJGbGFncy5sZWF2ZXNQYWNrYWdlKSByZXR1cm47XG4gICAgaW5kZXggPSBydW5uZXJGbGFncy5pbmRleDtcbiAgfVxuICBpZiAodG9rZW5zW2luZGV4XSAhPT0gJ3dyYW5nbGVyJyB8fCB0b2tlbnNbaW5kZXggKyAxXSAhPT0gJ3R5cGVzJykgcmV0dXJuO1xuXG4gIGNvbnN0IGludm9jYXRpb25BcmdzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBhcmdJbmRleCA9IGluZGV4ICsgMjsgYXJnSW5kZXggPCB0b2tlbnMubGVuZ3RoOyBhcmdJbmRleCsrKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbYXJnSW5kZXhdID8/ICcnO1xuICAgIC8vIEEgdG9rZW4taW5pdGlhbCB1bnF1b3RlZCBgI2Agc3RhcnRzIGEgc2hlbGwgY29tbWVudDogZXZlcnl0aGluZyBhZnRlciBpdCBpcyBub3QgYW4gYXJndW1lbnQuXG4gICAgaWYgKHRva2VuLnN0YXJ0c1dpdGgoJyMnKSkgYnJlYWs7XG4gICAgLy8gU2hlbGwgcmVkaXJlY3Rpb25zIChgPiAvZGV2L251bGxgLCBgMj4mMWAsIGA+PmxvZ2ApIGFyZSBub3Qgd3JhbmdsZXIgYXJndW1lbnRzOyBhIGJhcmUgb3BlcmF0b3IgYWxzb1xuICAgIC8vIGNvbnN1bWVzIHRoZSBmb2xsb3dpbmcgdG9rZW4gYXMgaXRzIHRhcmdldC5cbiAgICBjb25zdCByZWRpcmVjdGlvbk9wZXJhdG9yID0gL14oPzpcXGQrfCYpPyg/Oj4+P3w8KS91LmV4ZWModG9rZW4pPy5bMF07XG4gICAgaWYgKHJlZGlyZWN0aW9uT3BlcmF0b3IpIHtcbiAgICAgIGlmIChyZWRpcmVjdGlvbk9wZXJhdG9yID09PSB0b2tlbikgYXJnSW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpbnZvY2F0aW9uQXJncy5wdXNoKHRva2VuKTtcbiAgfVxuICByZXR1cm4gaW52b2NhdGlvbkFyZ3M7XG59XG5cbi8qKiBDbGFzc2lmeSB3aGF0IHRoZSBpbnZvY2F0aW9uIHdyaXRlczsgc2VlIFdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uS2luZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKGludm9jYXRpb25BcmdzOiBzdHJpbmdbXSk6IFdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uS2luZCB7XG4gIGxldCB3cml0ZXNFbHNld2hlcmUgPSBmYWxzZTtcbiAgbGV0IGNoYW5nZXNJbnB1dHMgPSBmYWxzZTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGludm9jYXRpb25BcmdzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHJhd0FyZyA9IGludm9jYXRpb25BcmdzW2luZGV4XSA/PyAnJztcbiAgICAvLyBVbnF1b3RlZCBzaGVsbCBtZXRhY2hhcmFjdGVycyAocGlwZXMsIHN1YnNoZWxscywgYDtgLCBhIGJhY2tncm91bmRpbmcgYCZgKSBhcmUgbm90IG1vZGVsZWQgYnkgdGhlXG4gICAgLy8gcGFyc2VyLCBhbmQgY29tbWFuZCBzdWJzdGl0dXRpb24gZXhlY3V0ZXMgZXZlbiBpbnNpZGUgZG91YmxlIHF1b3RlczsgY29uc2VydmF0aXZlbHkgdHJlYXQgc3VjaFxuICAgIC8vIGludm9jYXRpb25zIGFzIGNvbmZsaWN0aW5nLlxuICAgIGlmICgvWygpO3xgJl18XFwkXFwoL3UudGVzdChzdHJpcFF1b3RlZFNwYW5zKHJhd0FyZykpIHx8IC9cXCRcXCh8YC91LnRlc3Qoc3RyaXBTaW5nbGVRdW90ZWRTcGFucyhyYXdBcmcpKSkge1xuICAgICAgcmV0dXJuICdkZWZhdWx0T3V0cHV0Q29uZmxpY3QnO1xuICAgIH1cbiAgICAvLyBTaGVsbCBxdW90aW5nIGRvZXMgbm90IGNoYW5nZSBhbiBhcmd1bWVudCdzIHZhbHVlOiBgJy0tY29uZmlnJ2AgaXMgc3RpbGwgLS1jb25maWcuXG4gICAgY29uc3QgYXJnID0gdW5xdW90ZVNoZWxsVG9rZW4ocmF3QXJnKTtcbiAgICBjb25zdCBuZXh0QXJnID0gdW5xdW90ZVNoZWxsVG9rZW4oaW52b2NhdGlvbkFyZ3NbaW5kZXggKyAxXSA/PyAnJyk7XG4gICAgLy8gTm9uLWdlbmVyYXRpbmcgbW9kZXMgd3JpdGUgbm8gZmlsZSBhdCBhbGwsIHdoYXRldmVyIG90aGVyIGZsYWdzIHNheS4gVGhleSBhcmUgYm9vbGVhbiBvcHRpb25zOiBvbmx5XG4gICAgLy8gdGhlaXIgZW5hYmxlZCBmb3JtcyBzdXBwcmVzcyBnZW5lcmF0aW9uLCB3aGlsZSBgLS1jaGVjaz1mYWxzZWAgKG9yIGAtLWNoZWNrICdmYWxzZSdgKSBzdGlsbCB3cml0ZXMuXG4gICAgaWYgKC9eKD86LS1oZWxwfC1ofC0tdmVyc2lvbnwtdikoPzo9dHJ1ZSk/JC91LnRlc3QoYXJnKSAmJiBuZXh0QXJnICE9PSAnZmFsc2UnKSByZXR1cm4gJ2hhcm1sZXNzJztcbiAgICBpZiAoL14tLWNoZWNrKD86PXRydWUpPyQvdS50ZXN0KGFyZykgJiYgbmV4dEFyZyAhPT0gJ2ZhbHNlJykgcmV0dXJuICdoYXJtbGVzcyc7XG4gICAgaWYgKC9eKD86LS1jb25maWd8LWN8LS1lbnZ8LWV8LS1lbnYtZmlsZSkoPzo9LiopPyQvdS50ZXN0KGFyZykpIHtcbiAgICAgIGNoYW5nZXNJbnB1dHMgPSB0cnVlO1xuICAgICAgaWYgKCFhcmcuaW5jbHVkZXMoJz0nKSkgaW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoL14tLWN3ZCg/Oj0uKik/JC91LnRlc3QoYXJnKSkge1xuICAgICAgLy8gYC0tY3dkIC5gIHN0aWxsIHJ1bnMgaW4gdGhpcyBwYWNrYWdlJ3MgZGlyZWN0b3J5LCBzbyBpdCBzdGF5cyBhbiBvcmRpbmFyeSBsb2NhbCBpbnZvY2F0aW9uLlxuICAgICAgY29uc3QgY3dkVmFsdWUgPSBhcmcuaW5jbHVkZXMoJz0nKVxuICAgICAgICA/IGFyZy5zbGljZSgnLS1jd2Q9Jy5sZW5ndGgpXG4gICAgICAgIDogdW5xdW90ZVNoZWxsVG9rZW4oaW52b2NhdGlvbkFyZ3NbKytpbmRleF0gPz8gJycpO1xuICAgICAgaWYgKGN3ZFZhbHVlICE9PSAnLicgJiYgY3dkVmFsdWUgIT09ICcuLycpIHdyaXRlc0Vsc2V3aGVyZSA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHdyYW5nbGVyVHlwZXNWYWx1ZUZsYWdzLmhhcyhhcmcpKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAvLyBCb29sZWFuIG9wdGlvbnMgYWNjZXB0IGEgc3BhY2Utc2VwYXJhdGVkIGxpdGVyYWwgKGUuZy4gYC0tc3RyaWN0LXZhcnMgZmFsc2VgKSwgd2hpY2ggbXVzdCBub3QgYmVcbiAgICAgIC8vIG1pc3JlYWQgYXMgYSBwb3NpdGlvbmFsIG91dHB1dCBwYXRoLlxuICAgICAgaWYgKG5leHRBcmcgPT09ICd0cnVlJyB8fCBuZXh0QXJnID09PSAnZmFsc2UnKSBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGxldCBvdXRwdXRQYXRoID0gYXJnO1xuICAgIHdoaWxlIChvdXRwdXRQYXRoLnN0YXJ0c1dpdGgoJy4vJykpIG91dHB1dFBhdGggPSBvdXRwdXRQYXRoLnNsaWNlKDIpO1xuICAgIGlmIChvdXRwdXRQYXRoICE9PSAnd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cycpIHdyaXRlc0Vsc2V3aGVyZSA9IHRydWU7XG4gIH1cbiAgaWYgKHdyaXRlc0Vsc2V3aGVyZSkgcmV0dXJuICdoYXJtbGVzcyc7XG4gIGlmIChjaGFuZ2VzSW5wdXRzKSByZXR1cm4gJ2RlZmF1bHRPdXRwdXRDb25mbGljdCc7XG4gIHJldHVybiAncmV1c2FibGVHZW5lcmF0b3InO1xufVxuXG5mdW5jdGlvbiBza2lwRW52aXJvbm1lbnRBc3NpZ25tZW50cyh0b2tlbnM6IHN0cmluZ1tdKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCAmJiAvXltBLVphLXpfXVtBLVphLXowLTlfXSo9L3UudGVzdCh0b2tlbnNbaW5kZXhdID8/ICcnKSkgaW5kZXgrKztcbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vLyBSdW5uZXIgb3B0aW9ucyB0aGF0IGNvbnN1bWUgdGhlIGZvbGxvd2luZyB0b2tlbiBhcyB0aGVpciB2YWx1ZTsgdGhlIGRpcmVjdG9yeS1jaGFuZ2luZyBvbmVzIG1ha2UgdGhlIHJ1bm5lclxuLy8gb3BlcmF0ZSBvbiBhbm90aGVyIHBhY2thZ2Ugd2hlbiB0aGUgdmFsdWUgaXMgbm90IHRoZSBwYWNrYWdlIGl0c2VsZiwgYW5kIHdvcmtzcGFjZS9maWx0ZXIgc2VsZWN0b3JzIGFsd2F5c1xuLy8gbWF5IChucG0gcnVucyBgLS13b3Jrc3BhY2U9b3RoZXJgIGNvbW1hbmRzIGluc2lkZSB0aGF0IHdvcmtzcGFjZSkuXG5jb25zdCBydW5uZXJEaXJlY3RvcnlWYWx1ZUZsYWdzID0gbmV3IFNldChbJy0tY3dkJywgJy1DJywgJy0tcHJlZml4JywgJy0tZGlyJ10pO1xuY29uc3QgcnVubmVyV29ya3NwYWNlVmFsdWVGbGFncyA9IG5ldyBTZXQoWyctdycsICctLXdvcmtzcGFjZScsICctRicsICctLWZpbHRlciddKTtcbi8vIEJhcmUgc2VsZWN0b3JzIHRoYXQgcnVuIHRoZSBjb21tYW5kIGluIGV2ZXJ5IHdvcmtzcGFjZSBpbnN0ZWFkIG9mIChvbmx5KSB0aGlzIHBhY2thZ2UuXG5jb25zdCBydW5uZXJBbGxXb3Jrc3BhY2VzRmxhZ3MgPSBuZXcgU2V0KFsnLS13b3Jrc3BhY2VzJywgJy13cycsICctLXJlY3Vyc2l2ZScsICctciddKTtcblxuZnVuY3Rpb24gY29uc3VtZVJ1bm5lckZsYWdzKFxuICB0b2tlbnM6IHN0cmluZ1tdLFxuICBpbmRleDogbnVtYmVyLFxuICBsZWF2ZXNQYWNrYWdlID0gZmFsc2Vcbik6IHsgaW5kZXg6IG51bWJlcjsgbGVhdmVzUGFja2FnZTogYm9vbGVhbiB9IHtcbiAgd2hpbGUgKCh0b2tlbnNbaW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICBjb25zdCBmbGFnID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICBpbmRleCsrO1xuICAgIGxldCBkaXJlY3RvcnlWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChydW5uZXJEaXJlY3RvcnlWYWx1ZUZsYWdzLmhhcyhmbGFnKSkge1xuICAgICAgZGlyZWN0b3J5VmFsdWUgPSB0b2tlbnNbaW5kZXhdO1xuICAgICAgaW5kZXgrKztcbiAgICB9IGVsc2UgaWYgKC9eKD86LS1jd2R8LS1wcmVmaXh8LS1kaXIpPS91LnRlc3QoZmxhZykpIHtcbiAgICAgIGRpcmVjdG9yeVZhbHVlID0gZmxhZy5zbGljZShmbGFnLmluZGV4T2YoJz0nKSArIDEpO1xuICAgIH0gZWxzZSBpZiAocnVubmVyV29ya3NwYWNlVmFsdWVGbGFncy5oYXMoZmxhZykpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgICBsZWF2ZXNQYWNrYWdlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKC9eKD86LXd8LS13b3Jrc3BhY2V8LUZ8LS1maWx0ZXIpPS91LnRlc3QoZmxhZykgfHwgcnVubmVyQWxsV29ya3NwYWNlc0ZsYWdzLmhhcyhmbGFnKSkge1xuICAgICAgbGVhdmVzUGFja2FnZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChkaXJlY3RvcnlWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGRpcmVjdG9yeVZhbHVlICE9PSAnLicgJiYgZGlyZWN0b3J5VmFsdWUgIT09ICcuLycpIGxlYXZlc1BhY2thZ2UgPSB0cnVlO1xuICB9XG4gIHJldHVybiB7IGluZGV4LCBsZWF2ZXNQYWNrYWdlIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgcG9zdGluc3RhbGxHZW5lcmF0ZXNXb3JrZXJUeXBlcyB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyVHlwZXNDb21tYW5kLmpzJztcblxuY29uc3Qgd29ya2VyVHlwZXNGaWxlTmFtZSA9ICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJztcblxuLyoqXG4gKiBTdG9wcyB0cmFja2luZyB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGluIENsb3VkZmxhcmUgcHJvamVjdHMgdGhhdCBjb21taXR0ZWQgaXQgYmVmb3JlIC5naXRpZ25vcmUgY292ZXJlZCBpdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVudHJhY2tXb3JrZXJUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCd1bnRyYWNrV29ya2VyVHlwZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gLmdpdGlnbm9yZSBpcyBpZ25vcmVkIGZvciBhbHJlYWR5LXRyYWNrZWQgZmlsZXMsIHNvIGEgY29tbWl0dGVkIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgd291bGQga2VlcFxuICAgIC8vIHByb2R1Y2luZyBhIGh1Z2UgZGlmZiBvbiBldmVyeSB3cmFuZ2xlciBidW1wIGRlc3BpdGUgYmVpbmcgcmVnZW5lcmF0ZWQgYnkgYHdyYW5nbGVyIHR5cGVzYCBvbiBpbnN0YWxsLlxuICAgIGNvbnN0IHRyYWNrZWQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtZmlsZXMnLCAnLS0nLCB3b3JrZXJUeXBlc0ZpbGVOYW1lXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmICghdHJhY2tlZCkgcmV0dXJuO1xuXG4gICAgLy8gVW50cmFjayBvbmx5IHdoZW4gdGhlIChyZSlnZW5lcmF0ZWQgcGFja2FnZS5qc29uJ3MgaW5zdGFsbCBwaXBlbGluZSByZWFsbHkgcmVnZW5lcmF0ZXMgdGhlIGZpbGU6XG4gICAgLy8gZ2VuZXJhdGVQYWNrYWdlSnNvbiBzd2FsbG93cyBpdHMgb3duIGV4Y2VwdGlvbnMsIHNvIGEgcGFydGlhbCBydW4gbXVzdCBub3QgbGVhdmUgdGhlIGRlY2xhcmF0aW9uIGRlbGV0ZWRcbiAgICAvLyB3aXRoIG5vdGhpbmcgcmVjcmVhdGluZyBpdCBvbiBmcmVzaCBjaGVja291dHMuXG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgKSBhcyBQYWNrYWdlSnNvbjtcbiAgICBpZiAoIXBvc3RpbnN0YWxsR2VuZXJhdGVzV29ya2VyVHlwZXMocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkpIHJldHVybjtcblxuICAgIC8vIFVudHJhY2tpbmcgYSBmaWxlIHRoZSBnZW5lcmF0ZWQgLmdpdGlnbm9yZSBkb2VzIG5vdCBhY3R1YWxseSBjb3ZlciAoZS5nLiB0aGUgZ2l0aWdub3JlLmlvIGZldGNoIGZhaWxlZCwgc28gdGhlXG4gICAgLy8gZmlsZSB3YXMgbmV2ZXIgd3JpdHRlbikgd291bGQgbGVhdmUgaXQgdW50cmFja2VkIGFuZCBkaXJ0eSBpbiB0aGUgcmVwb3NpdG9yeSwgc28gY29uZmlybSB0aGUgcnVsZSBhcHBsaWVzIGZpcnN0LlxuICAgIC8vIGBnaXQgY2hlY2staWdub3JlYCBhbHNvIGhvbm9ycyAuZ2l0L2luZm8vZXhjbHVkZSBhbmQgZ2xvYmFsIGV4Y2x1ZGVzLCB3aGljaCBhIGZyZXNoIGNsb25lIGxhY2tzLCBzbyB0aGVcbiAgICAvLyBjb21taXR0ZWQgcGFja2FnZSAuZ2l0aWdub3JlIG11c3QgY2FycnkgdGhlIG1hbmFnZWQgcnVsZSBpdHNlbGYuXG4gICAgY29uc3QgZ2l0aWdub3JlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBoYXNNYW5hZ2VkUnVsZSA9XG4gICAgICBmcy5leGlzdHNTeW5jKGdpdGlnbm9yZVBhdGgpICYmXG4gICAgICBmc1xuICAgICAgICAucmVhZEZpbGVTeW5jKGdpdGlnbm9yZVBhdGgsICd1dGY4JylcbiAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAuc29tZSgobGluZSkgPT4gbGluZS50cmltKCkgPT09IGAvJHt3b3JrZXJUeXBlc0ZpbGVOYW1lfWApO1xuICAgIGlmICghaGFzTWFuYWdlZFJ1bGUpIHJldHVybjtcbiAgICAvLyAtLW5vLWluZGV4IG1ha2VzIGdpdCByZXBvcnQgdGhlIHJ1bGUgdGhhdCB3b3VsZCBhcHBseSwgaW5zdGVhZCBvZiByZXBvcnRpbmcgbm90aGluZyBiZWNhdXNlIHRoZSBmaWxlIGlzIHRyYWNrZWQuXG4gICAgY29uc3QgaXNJZ25vcmVkID1cbiAgICAgIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhcbiAgICAgICAgJ2dpdCcsXG4gICAgICAgIFsnY2hlY2staWdub3JlJywgJy0tcXVpZXQnLCAnLS1uby1pbmRleCcsICctLScsIHdvcmtlclR5cGVzRmlsZU5hbWVdLFxuICAgICAgICBjb25maWcuZGlyUGF0aFxuICAgICAgKSA9PT0gMDtcbiAgICBpZiAoIWlzSWdub3JlZCkgcmV0dXJuO1xuXG4gICAgLy8gLS1jYWNoZWQga2VlcHMgdGhlIGZpbGUgb24gZGlzayBiZWNhdXNlIHR5cGUgY2hlY2tpbmcgbmVlZHMgaXQgYmVmb3JlIHRoZSBuZXh0IGluc3RhbGwgcmVnZW5lcmF0ZXMgaXQuXG4gICAgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdnaXQnLCBbJ3JtJywgJy0tY2FjaGVkJywgJy0tcXVpZXQnLCAnLS0nLCB3b3JrZXJUeXBlc0ZpbGVOYW1lXSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIEFHRU5UU19FWFRSQS5tZCBleGlzdHMgYW5kIHJlYWQgaXRzIGNvbnRlbnRcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBgLS0tXFxuZGVzY3JpcHRpb246IEdlbmVyYWwgQ29kaW5nIFJ1bGVzXFxuZ2xvYnM6XFxuYWx3YXlzQXBwbHk6IHRydWVcXG4tLS1gO1xuICBjb25zdCBib2R5ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKGNvbmZpZywgYWxsQ29uZmlncywgJ0N1cnNvcicsIGV4dHJhQ29udGVudCk7XG4gIHJldHVybiBgJHtmcm9udG1hdHRlcn1cXG5cXG4ke2JvZHl9YDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQocm9vdENvbmZpZyk7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb247XG4gIC8vIFdpbGxCb29zdGVyIFJhaWx3YXkgcHJvamVjdCBpZGVudGlmaWVycyBhcmUgbWFuYWdlZCBpbiBkZXBsb3kgd29ya2Zsb3cgc2V0dGluZ3MuXG4gIGNvbnN0IHJhaWx3YXlJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNSYWlsd2F5XG4gICAgPyAnXFxuLSBSYWlsd2F5IHByb2plY3QgaW5mb3JtYXRpb24gaXMgaW4gdGhlIGRlcGxveSB3b3JrZmxvd3MgdW5kZXIgYC5naXRodWIvd29ya2Zsb3dzYC4nXG4gICAgOiAnJztcbiAgY29uc3QgcGxheXdyaWdodFRlc3RTZXJ2ZXJJbnN0cnVjdGlvbiA9IGhhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGFsbENvbmZpZ3MpXG4gICAgPyBgXFxuLSBVc2UgXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2Igc3RhcnQgLS1tb2RlIHRlc3RcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYFxuICAgIDogJyc7XG4gIGNvbnN0IGNvQXV0aG9ySW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBgXFxuICAtIEVuZCB5b3VyIGNvbW1pdCBtZXNzYWdlIHdpdGggYSBibGFuayBsaW5lIGZvbGxvd2VkIGJ5IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgLmBcbiAgICA6ICcnO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiBcXGAke3Jvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgJ3Vua25vd24nfVxcYCR7ZGVzY3JpcHRpb24gPyBgXFxuLSBEZXNjcmlwdGlvbjogJHtkZXNjcmlwdGlvbn1gIDogJyd9XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn1cblxuIyMgR2VuZXJhbCBJbnN0cnVjdGlvbnNcblxuLSBJZiBvbiBcXGBtYWluXFxgLCBjcmVhdGUgYSBuZXcgYnJhbmNoOyBvdGhlcndpc2Ugd29yayBvbiB0aGUgY3VycmVudCBicmFuY2guXG4tIFJ1biBcXGBnaXRcXGAgY29tbWFuZHMgb25lIGF0IGEgdGltZSB0byBhdm9pZCBcXGBpbmRleC5sb2NrXFxgIGNvbmZsaWN0cy5cbi0gV3JpdGUgYSB0ZXN0IG9ubHkgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZCwgb3Igd2hlbiBhIGJlaGF2aW9yIGlzIGJvdGggbGlrZWx5IHRvIHJlZ3Jlc3MgQU5EIGhhcyBubyBvdGhlciBhdXRvbWF0aWMgc2FmZWd1YXJkICh0eXBlIGNoZWNraW5nLCBsaW50aW5nLCBvciBhbiBleGlzdGluZyB0ZXN0L0NJIGNoZWNrIHdvdWxkIG5vdCBjYXRjaCB0aGUgYnJlYWthZ2UpLiBTa2lwIHRoZSB0ZXN0IHdoZW4gYW4gZXhpc3Rpbmcgc2lnbmFsIGFscmVhZHkgY2F0Y2hlcyB0aGUgcmVncmVzc2lvbiwgb3Igd2hlbiB5b3UgYXJlIG9ubHkgY29uZmlybWluZyBhbiBleHRlcm5hbCBmYWN0IChhIGxpYnJhcnkncyBiZWhhdmlvciwgd2hldGhlciBhIHZlcnNpb24gZml4ZXMgYW4gaXNzdWUp4oCUdmVyaWZ5IHRob3NlIG9uY2UgbWFudWFsbHkgaW5zdGVhZCBvZiBhZGRpbmcgYSBwZXJtYW5lbnQgdGVzdC5cbi0gV2hlbiB3cml0aW5nIHRlc3RzLCBmb2xsb3cgdGhlc2UgcnVsZXM6XG4gIC0gQ29udGludWUgbW9kaWZ5aW5nIHRlc3RzIGFuZC9vciBjb2RlIHVudGlsIGFsbCB0ZXN0cyBwYXNzLlxuICAtIEVuc3VyZSB0ZXN0cyBhcmUgaWRlbXBvdGVudCBhbmQgaW5kZXBlbmRlbnQgKGUuZy4sIHJlc2V0IHBlcnNpc3RlbnQgZGF0YSkgc28gdGhleSBjYW4gcnVuIHJlcGVhdGVkbHkgb3IgaW4gcGFyYWxsZWwuXG4gIC0gUHJlZmVyIGFjdHVhbCBBUEkgY2FsbHMgb3ZlciBtb2NrcywgdW5sZXNzIGFjdHVhbCBjYWxscyBhcmUgaW1wcmFjdGljYWwsIGhhdmUgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMsIG9yIG1vY2tzIGFyZSBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAgLSBBdm9pZCBmaXhlZCB3YWl0cyBpbiBFMkUgdGVzdHM7IHdhaXQgZm9yIGNvbmRpdGlvbnMgaW5zdGVhZC5cbi0gV2hlbiBmaXhpbmcgaXNzdWVzIChpbmNsdWRpbmcgdGVzdCBmYWlsdXJlcyksIGludmVzdGlnYXRlIHRoZSByb290IGNhdXNlIGZpcnN0IChlLmcuLCB2aWEgZGVidWcgbG9ncyBvciBzY3JlZW5zaG90cykgYW5kIGZpeCBpdCBpbnN0ZWFkIG9mIGFwcGx5aW5nIHdvcmthcm91bmRzLlxuLSBBZnRlciBtYWtpbmcgY2hhbmdlcywgcnVuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHZlcmlmeVxcYCAodHlwZSBjaGVja2luZyBhbmQgbGludGluZzsgdGFrZXMgdXAgdG8gMTAgbWludXRlcyksIG9yIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHZlcmlmeS1mdWxsXFxgIChhbGwgdGVzdHM7IHRha2VzIHVwIHRvIDEgaG91cikgaWYgeW91IGNoYW5nZWQgcnVudGltZSBiZWhhdmlvciBvciB0ZXN0cy4gRml4IGVycm9ycyBhbmQgcmUtcnVuIHVudGlsIGl0IHBhc3Nlcy5cbi0gT25jZSB2ZXJpZmllZCwgY29tbWl0IGFuZCBwdXNoIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoLCBhbmQgY3JlYXRlIGEgUFIgdmlhIFxcYGdoXFxgIGlmIG5vbmUgZXhpc3RzIGZvciB0aGUgYnJhbmNoLlxuICAtIEZvbGxvdyB0aGUgQ29udmVudGlvbmFsIENvbW1pdHMgZm9ybWF0IChlLmcuLCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCkuJHtjb0F1dGhvckluc3RydWN0aW9ufVxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHM7IGF2b2lkIFxcYC0tYW1lbmRcXGAuXG4tIFVzZSBoZXJlZG9jIGZvciBtdWx0aS1saW5lIGNvbW1hbmQgaW5wdXQgKGUuZy4sIFxcYGdpdCBjb21taXQgLUYgLVxcYCwgXFxgZ2ggcHIgY3JlYXRlIC0tYm9keS1maWxlIC1cXGApLlxuLSBQdXQgdGVtcG9yYXJ5IGZpbGVzIGluIFxcYC50bXBcXGA7IHVzZSBcXGAvdG1wXFxgIG9ubHkgZm9yIGZpbGVzIHRoYXQgbXVzdCBsaXZlIG91dHNpZGUgdGhlIHJlcG8uJHtyYWlsd2F5SW5zdHJ1Y3Rpb259JHtwbGF5d3JpZ2h0VGVzdFNlcnZlckluc3RydWN0aW9ufVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IGhhc05ld1NlY3Rpb24gPSBleHRyYUNvbnRlbnQ/LnRyaW0oKS5zdGFydHNXaXRoKCcjJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnRcbiAgICA/IGhhc05ld1NlY3Rpb25cbiAgICAgID8gJ1xcblxcbicgKyBleHRyYUNvbnRlbnQudHJpbSgpXG4gICAgICA6ICdcXG4nICsgZXh0cmFDb250ZW50XG4gICAgOiAnJztcbiAgcmV0dXJuIGJhc2VDb250ZW50ICsgbm9ybWFsaXplZEV4dHJhQ29udGVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmcge1xuICAvLyBLZWVwIHRvcC1kb3duIG9yZGVyaW5nIGd1aWRhbmNlIGZ1bmN0aW9uLW9ubHkgYmVjYXVzZSBjbGFzc2VzIGFyZSBub3QgaG9pc3RlZCBhbmQgY2FuIGZhaWwgd2hlbiBpbmhlcml0YW5jZSBvciB0b3AtbGV2ZWwgaW5zdGFudGlhdGlvbiBkZXBlbmRzIG9uIGRlY2xhcmF0aW9uIG9yZGVyLlxuICByZXR1cm4gYFxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gVXNlIGNhbWVsQ2FzZSBmaWxlIG5hbWVzIGZvciBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgKFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMpLlxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBtb2R1bGVzIGFuZCBkaXJlY3RvcmllcyB3aXRoIGhpZ2ggY29oZXNpb24gYW5kIGxvdyBjb3VwbGluZzsgc3BsaXQgbGFyZ2UgbW9kdWxlcyB3aGVuIG5lZWRlZC5cbi0gUGxhY2UgY2FsbGluZyBmdW5jdGlvbnMgYWJvdmUgdGhlIGZ1bmN0aW9ucyB0aGV5IGNhbGwgKHRvcC1kb3duIG9yZGVyKTsgcGxhY2UgdmFyaWFibGUgYW5kIHR5cGUgZGVjbGFyYXRpb25zIGFib3ZlIHRoZWlyIHVzYWdlLlxuLSBXcml0ZSBjb21tZW50cyBhbmQgSlNEb2Mgb25seSBmb3IgaGFyZC10by11bmRlcnN0YW5kIGNvZGU6IGV4cGxhaW4gXCJ3aHlcIiBpbiBjb21tZW50cyBhbmQgXCJ3aGF0XCIgaW4gSlNEb2MuXG4tIElmIGxpbnQgZXJyb3JzIG9yIHdhcm5pbmdzIGNhbm5vdCBiZSBmaXhlZCwgdXNlIGlnbm9yZSBjb21tZW50cyB3aXRoIHJlYXNvbnMgKGUuZy4sIFxcYC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSA8cnVsZT4gLS0gPHJlYXNvbj5cXGApLlxuLSBQcmVmZXIgXFxgdW5kZWZpbmVkXFxgIG92ZXIgXFxgbnVsbFxcYCB1bmxlc3MgcmVxdWlyZWQgYnkgQVBJcyBvciBsaWJyYXJpZXMuXG4tIEJ1aWxkIHByb21wdHMgYXMgYSBzaW5nbGUgdGVtcGxhdGUgbGl0ZXJhbCBpbnN0ZWFkIG9mIFxcYGpvaW4oKVxcYCBvbiBhIHByZS1jb21wdXRhYmxlIGFycmF5IG9mIHN0cmluZ3MuXG4tIEFzc3VtZSBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBkZWZpbmVkOyBpZiB2YWxpZGF0aW9uIGlzIG5lZWRlZCwgXFxgYXNzZXJ0XFxgIGF0IHN0YXJ0dXAgdG8gZmFpbCBmYXN0LlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBXaGVuIGFkZGluZyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgcmVnaXN0ZXIgdGhlbSBpbiB0aGUgXFxgaTE4blxcYCByZXNvdXJjZSBmaWxlcyAoZS5nLiwgXFxgaTE4bi9qYS1KUC5qc29uXFxgKSBhbmQgcmVmZXJlbmNlIHRoZW0gdmlhIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkgKGUuZy4sIFxcYGkxOG4ucGFnZXMuaG9tZS50aXRsZSgpXFxgIGZvciBcXGB7IFwicGFnZXNcIjogeyBcImhvbWVcIjogeyBcInRpdGxlXCI6IFwiTXkgQXBwXCIgfSB9IH1cXGApLmBcbiAgICA6ICcnXG59XG5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcucmVhY3QgfHwgYy5kZXBlbmRpbmcubmV4dClcbiAgICA/IGAtIFByZWZlciBsYW1iZGEgb3ZlciBcXGBmdW5jdGlvblxcYCBmb3IgUmVhY3QgY29tcG9uZW50cywgZS5nLiwgXFxgY29uc3QgQnV0dG9uOiBSZWFjdC5GQyA9ICgpID0+IHtcXGAuXG4tIFByZWZlciBcXGB1c2VJbW1lclxcYCBvdmVyIFxcYHVzZVN0YXRlXFxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMuXG4tIFVzZSBcXGBhdXRvRm9jdXNcXGAgd2hlcmUgaXQgcmVkdWNlcyB1c2VyIGVmZm9ydC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYFxuLSBUaGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHNvIFxcYHVzZUNhbGxiYWNrXFxgIGFuZCBcXGB1c2VNZW1vXFxgIGFyZSB1bm5lY2Vzc2FyeSBmb3IgcGVyZm9ybWFuY2UuXG4tIEFzc3VtZSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UuXG5gXG4gICAgOiAnJ1xufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdzbW9sLXRvbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBCdW5maWdUb21sIHtcbiAgaW5zdGFsbD86IHtcbiAgICBleGFjdD86IGJvb2xlYW47XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgPSA0MzJfMDAwO1xuXG4vLyBQbGF0Zm9ybSBzZXRzIG11c3QgbWF0Y2ggZWFjaCBwYWNrYWdlJ3Mgb3B0aW9uYWxEZXBlbmRlbmNpZXMgb24gbnBtIGJlY2F1c2Vcbi8vIEJ1biBjaGVja3MgYWxsIHBsYXRmb3JtIGJpbmFyaWVzIGluIHRoZSBsb2NrZmlsZSwgbm90IGp1c3QgdGhlIGN1cnJlbnQgb25lLlxuLy8gS2VlcCB3aW4zMiBlbnRyaWVzIGV2ZW4gdGhvdWdoIHdlIGRyb3AgV2luZG93cyBzdXBwb3J0OiBvbWl0dGluZyBhbnlcbi8vIHBsYXRmb3JtIG1ha2VzIGBidW4gYWRkYCBmYWlsIHVudGlsIHRoZSBtaW5pbXVtLXJlbGVhc2UtYWdlIHdpbmRvdyBlbGFwc2VzLlxuY29uc3QgdHlwZXNjcmlwdFBsYXRmb3JtcyA9IFtcbiAgJ2FpeC1wcGM2NCcsXG4gICdkYXJ3aW4tYXJtNjQnLFxuICAnZGFyd2luLXg2NCcsXG4gICdmcmVlYnNkLWFybTY0JyxcbiAgJ2ZyZWVic2QteDY0JyxcbiAgJ2xpbnV4LWFybScsXG4gICdsaW51eC1hcm02NCcsXG4gICdsaW51eC1sb29uZzY0JyxcbiAgJ2xpbnV4LW1pcHM2NGVsJyxcbiAgJ2xpbnV4LXBwYzY0JyxcbiAgJ2xpbnV4LXJpc2N2NjQnLFxuICAnbGludXgtczM5MHgnLFxuICAnbGludXgteDY0JyxcbiAgJ25ldGJzZC1hcm02NCcsXG4gICduZXRic2QteDY0JyxcbiAgJ29wZW5ic2QtYXJtNjQnLFxuICAnb3BlbmJzZC14NjQnLFxuICAnc3Vub3MteDY0JyxcbiAgJ3dpbjMyLWFybTY0JyxcbiAgJ3dpbjMyLXg2NCcsXG5dO1xuY29uc3Qgb3hjQmluZGluZ1BsYXRmb3JtcyA9IFtcbiAgJ2FuZHJvaWQtYXJtLWVhYmknLFxuICAnYW5kcm9pZC1hcm02NCcsXG4gICdkYXJ3aW4tYXJtNjQnLFxuICAnZGFyd2luLXg2NCcsXG4gICdmcmVlYnNkLXg2NCcsXG4gICdsaW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ2xpbnV4LWFybS1tdXNsZWFiaWhmJyxcbiAgJ2xpbnV4LWFybTY0LWdudScsXG4gICdsaW51eC1hcm02NC1tdXNsJyxcbiAgJ2xpbnV4LXBwYzY0LWdudScsXG4gICdsaW51eC1yaXNjdjY0LWdudScsXG4gICdsaW51eC1yaXNjdjY0LW11c2wnLFxuICAnbGludXgtczM5MHgtZ251JyxcbiAgJ2xpbnV4LXg2NC1nbnUnLFxuICAnbGludXgteDY0LW11c2wnLFxuICAnb3Blbmhhcm1vbnktYXJtNjQnLFxuICAnd2luMzItYXJtNjQtbXN2YycsXG4gICd3aW4zMi1pYTMyLW1zdmMnLFxuICAnd2luMzIteDY0LW1zdmMnLFxuXTtcbmNvbnN0IHRzZ29saW50UGxhdGZvcm1zID0gWydkYXJ3aW4tYXJtNjQnLCAnZGFyd2luLXg2NCcsICdsaW51eC1hcm02NCcsICdsaW51eC14NjQnLCAnd2luMzItYXJtNjQnLCAnd2luMzIteDY0J107XG5jb25zdCBuZXh0UnNwYWNrUGxhdGZvcm1zID0gW1xuICAnYW5kcm9pZC1hcm0tZWFiaScsXG4gICdhbmRyb2lkLWFybTY0JyxcbiAgJ2Rhcndpbi1hcm02NCcsXG4gICdkYXJ3aW4teDY0JyxcbiAgJ2xpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnbGludXgtYXJtNjQtZ251JyxcbiAgJ2xpbnV4LWFybTY0LW11c2wnLFxuICAnbGludXgteDY0LWdudScsXG4gICdsaW51eC14NjQtbXVzbCcsXG4gICd3aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ3dpbjMyLWlhMzItbXN2YycsXG4gICd3aW4zMi14NjQtbXN2YycsXG5dO1xuY29uc3QgbmV4dFN3Y1BsYXRmb3JtcyA9IFtcbiAgJ2FuZHJvaWQtYXJtLWVhYmknLFxuICAnYW5kcm9pZC1hcm02NCcsXG4gICdkYXJ3aW4tYXJtNjQnLFxuICAnZGFyd2luLXg2NCcsXG4gICdmcmVlYnNkLXg2NCcsXG4gICdsaW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ2xpbnV4LWFybTY0LWdudScsXG4gICdsaW51eC1hcm02NC1tdXNsJyxcbiAgJ2xpbnV4LXg2NC1nbnUnLFxuICAnbGludXgteDY0LW11c2wnLFxuICAnd2FzbS1ub2RlanMnLFxuICAnd2FzbS13ZWInLFxuICAnd2luMzItYXJtNjQtbXN2YycsXG4gICd3aW4zMi1pYTMyLW1zdmMnLFxuICAnd2luMzIteDY0LW1zdmMnLFxuXTtcblxuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gIC8vIC0tLS0tLS0tLS0gU1RBUlQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cbiAgJ0BleGVyY29kZS9wcm9ibGVtLXV0aWxzJyxcbiAgJ0B3aWxsYm9vc3Rlci1wcml2YXRlL2FnZW50aWMtd29ya2Zsb3dzJyxcbiAgJ0B3aWxsYm9vc3Rlci9hZ2VudC1za2lsbHMnLFxuICAnQHdpbGxib29zdGVyL2JhYmVsLWNvbmZpZ3MnLFxuICAnQHdpbGxib29zdGVyL21vbmFjby1sb2FkZXInLFxuICAnQHdpbGxib29zdGVyL21vbmFjby1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYicsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZScsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvd2InLFxuICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAnYXQtZGVjb3JhdG9ycycsXG4gICdidWlsZC10cycsXG4gICdnZW4taTE4bi10cycsXG4gICdvbmUtd2F5LWdpdC1zeW5jJyxcbiAgLy8gLS0tLS0tLS0tLSBFTkQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cblxuICAvLyB3YmZ5IHBpbnMgdGhlc2UgdG9vbGluZyBwYWNrYWdlcyBhbmQgbWF5IGFwcGx5IHRoZW0gaW1tZWRpYXRlbHkgYWZ0ZXIgYVxuICAvLyByZWxlYXNlLCBiZWZvcmUgdGhlIGdsb2JhbCBtaW5pbXVtLXJlbGVhc2UtYWdlIHdpbmRvdyBoYXMgZWxhcHNlZC5cbiAgJ3R5cGVzY3JpcHQnLFxuICAuLi50eXBlc2NyaXB0UGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAdHlwZXNjcmlwdC90eXBlc2NyaXB0LSR7cGxhdGZvcm19YCksXG4gIC8vIEJ1biBpdHNlbGYgcmVsZWFzZXMgaXRzIGZpcnN0LXBhcnR5IHR5cGUgcGFja2FnZXMgaW4gbG9ja3N0ZXAgd2l0aCB0aGVcbiAgLy8gcnVudGltZSwgc28gZ2VuZXJhdGVkIEJ1biByZXBvcyBtdXN0IGJlIGFibGUgdG8gaW5zdGFsbCB0aGVtIGltbWVkaWF0ZWx5LlxuICAnQHR5cGVzL2J1bicsXG4gICdidW4tdHlwZXMnLFxuICAnb3hmbXQnLFxuICAuLi5veGNCaW5kaW5nUGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAb3hmbXQvYmluZGluZy0ke3BsYXRmb3JtfWApLFxuICAnb3hsaW50JyxcbiAgLi4ub3hjQmluZGluZ1BsYXRmb3Jtcy5tYXAoKHBsYXRmb3JtKSA9PiBgQG94bGludC9iaW5kaW5nLSR7cGxhdGZvcm19YCksXG4gICdveGxpbnQtdHNnb2xpbnQnLFxuICAuLi50c2dvbGludFBsYXRmb3Jtcy5tYXAoKHBsYXRmb3JtKSA9PiBgQG94bGludC10c2dvbGludC8ke3BsYXRmb3JtfWApLFxuICAnQG5leHQvZW52JyxcbiAgJ0BuZXh0L2ZvbnQnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmcnLFxuICAuLi5uZXh0UnNwYWNrUGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAbmV4dC9yc3BhY2stYmluZGluZy0ke3BsYXRmb3JtfWApLFxuICAuLi5uZXh0U3djUGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAbmV4dC9zd2MtJHtwbGF0Zm9ybX1gKSxcbiAgJ0BuZXh0L3RoaXJkLXBhcnRpZXMnLFxuICAnbmV4dCcsXG4gICdyZWFjdCcsXG4gICdyZWFjdC1kb20nLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdDb250ZW50KGV4aXN0aW5nQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSAoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBidW5maWdUb21sID0gcGFyc2VCdW5maWdUb21sKGV4aXN0aW5nQ29udGVudCk7XG4gIC8vIE5vIGBbcnVuXSBidW4gPSB0cnVlYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3NcbiAgLy8gdG9vbHMgcmVxdWlyaW5nIHJlYWwgTm9kZS5qcyAoUGxheXdyaWdodCwgd3JhbmdsZXIsIHZpbmV4dCk7IGFueSBleGlzdGluZyBzZXR0aW5nIGlzIGRyb3BwZWQuXG4gIHJldHVybiBgZW52ID0gZmFsc2VcbnRlbGVtZXRyeSA9IGZhbHNlXG5cbiR7ZXh0cmFjdFJhd1Rlc3RTZWN0aW9ucyhleGlzdGluZ0NvbnRlbnQpfVtpbnN0YWxsXVxuZXhhY3QgPSAke2J1bmZpZ1RvbWw/Lmluc3RhbGw/LmV4YWN0ID09PSBmYWxzZSA/ICdmYWxzZScgOiAndHJ1ZSd9XG5saW5rZXIgPSBcImhvaXN0ZWRcIlxubWluaW11bVJlbGVhc2VBZ2UgPSAke2J1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kc30gIyA1IGRheXNcbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4ke2J1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMubWFwKChwYWNrYWdlTmFtZSkgPT4gYCAgICBcIiR7cGFja2FnZU5hbWV9XCIsYCkuam9pbignXFxuJyl9XG5dXG5gO1xufTtcblxuLyoqXG4gKiBQcmVzZXJ2ZSB0aGUgcHJvamVjdCdzIGBbdGVzdF1gIHNlY3Rpb25zIChlLmcuIHByZWxvYWQgc2NyaXB0cyBzd2FwcGluZyBhIENsb3VkZmxhcmUgRDEgY2xpZW50XG4gKiBmb3IgYSBsb2NhbCBTUUxpdGUgb25lKSB2ZXJiYXRpbSwgY29tbWVudHMgaW5jbHVkZWQ7IHdiZnkgbWFuYWdlcyBvbmx5IHRoZSBvdGhlciBzZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSYXdUZXN0U2VjdGlvbnMoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKCFjb250ZW50KSByZXR1cm4gJyc7XG5cbiAgY29uc3QgcHJlc2VydmVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBpblRlc3RTZWN0aW9uID0gZmFsc2U7XG4gIGZvciAoY29uc3QgbGluZSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IHNlY3Rpb25NYXRjaCA9IC9eXFxzKlxcWyhbXlxcXV0rKVxcXS8uZXhlYyhsaW5lKTtcbiAgICBpZiAoc2VjdGlvbk1hdGNoKSB7XG4gICAgICBpblRlc3RTZWN0aW9uID0gc2VjdGlvbk1hdGNoWzFdID09PSAndGVzdCcgfHwgKHNlY3Rpb25NYXRjaFsxXSBhcyBzdHJpbmcpLnN0YXJ0c1dpdGgoJ3Rlc3QuJyk7XG4gICAgfVxuICAgIGlmIChpblRlc3RTZWN0aW9uICYmIGxpbmUudHJpbSgpKSB7XG4gICAgICBwcmVzZXJ2ZWRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJlc2VydmVkTGluZXMubGVuZ3RoID4gMCA/IGAke3ByZXNlcnZlZExpbmVzLmpvaW4oJ1xcbicpfVxcblxcbmAgOiAnJztcbn1cblxuZnVuY3Rpb24gcGFyc2VCdW5maWdUb21sKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEJ1bmZpZ1RvbWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlKGNvbnRlbnQpIGFzIEJ1bmZpZ1RvbWw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZSBkZXBsb3lzIEdpdC1iYXNlZCBwcml2YXRlIHBhY2thZ2VzIGZyb20gbm9kZV9tb2R1bGVzLCBidXQgdGhlIERvY2tlciBjb250ZXh0IHNob3VsZCBzdGF5IG5hcnJvdy5cbmNvbnN0IGluY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJucyA9IFsnQHdpbGxib29zdGVyJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4qKi8uRFNfU3RvcmVcbioqLy5jYWNoZVxuKiovLmNsYXVkZVxuKiovLmN1cnNvclxuKiovLmVkaXRvcmNvbmZpZ1xuKiovLmVzbGludGNhY2hlXG4qKi8uZ2VtaW5pXG4qKi8uZ2l0XG4qKi8uZ2l0YXR0cmlidXRlc1xuKiovLmdpdGh1YlxuKiovLmdpdGlnbm9yZVxuKiovLmlkZWFcbioqLy5sZWZ0aG9va1xuKiovLm15cHlfY2FjaGVcbioqLy5uZXh0L2NhY2hlXG4qKi8ubnBtXG4qKi8ucGFyY2VsLWNhY2hlXG4qKi8ucG5wbS1zdG9yZVxuKiovLnB5dGVzdF9jYWNoZVxuKiovLnJhaWx3YXlpZ25vcmVcbioqLy5yZWxlYXNlcmMuanNvblxuKiovLnJ1ZmZfY2FjaGVcbioqLy50bXBcbioqLy50dXJib1xuKiovLnRveFxuKiovLnZzY29kZVxuKiovLnlhcm4vY2FjaGVcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG4qKi9fX3B5Y2FjaGVfX1xuKiovKi5sb2dcbioqLyoucHljXG4qKi8qLnRzYnVpbGRpbmZvXG4qKi9jb3ZlcmFnZVxuKiovbm9kZV9tb2R1bGVzLyoqXG4ke2luY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJuc1xuICAubWFwKFxuICAgIChwYXR0ZXJuKSA9PiBgISoqL25vZGVfbW9kdWxlcy8ke3BhdHRlcm59XG4hKiovbm9kZV9tb2R1bGVzLyR7cGF0dGVybn0vKipgXG4gIClcbiAgLmpvaW4oJ1xcbicpfVxuKiovbm9kZV9tb2R1bGVzLy5jYWNoZVxuKiovcGxheXdyaWdodC1yZXBvcnRcbioqL3N0b3J5Ym9vay1zdGF0aWNcbioqL3RhcmdldFxuKiovdGVzdC1yZXN1bHRzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IHtcbiAgY29kZVdpdGgySW5kZW50U2l6ZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjcHAnLFxuICAgICdkYXJ0JyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3B1JyxcbiAgICAncHVtbCcsXG4gICAgJ3JiJyxcbiAgICAndnVlJyxcbiAgICAneG1sJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ3NoJyxcbiAgXS50b1NvcnRlZCgpLFxuICBjb2RlV2l0aDRJbmRlbnRTaXplOiBbJ2dvJywgJ2dyYWRsZScsICdqYXZhJywgJ3B5J10udG9Tb3J0ZWQoKSxcbiAgbWFya2Rvd25MaWtlOiBbJ21kJ10udG9Tb3J0ZWQoKSxcbiAgb3hsaW50OiBbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXS50b1NvcnRlZCgpLFxuICBveGZtdDogW1xuICAgICdhc3RybycsXG4gICAgJ2NqcycsXG4gICAgJ2NzcycsXG4gICAgJ2N0cycsXG4gICAgJ2dxbCcsXG4gICAgJ2dyYXBocWwnLFxuICAgICdoYnMnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnanMnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2pzeCcsXG4gICAgJ2xlc3MnLFxuICAgICdtZCcsXG4gICAgJ21keCcsXG4gICAgJ21qcycsXG4gICAgJ210cycsXG4gICAgJ3Njc3MnLFxuICAgICdzdmVsdGUnLFxuICAgICd0b21sJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICd2dWUnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS50b1NvcnRlZCgpLFxuICBwcmV0dGllck9ubHk6IFsnamF2YSddLnRvU29ydGVkKCksXG59O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYHJvb3QgPSB0cnVlXG5cblsqXVxuY2hhcnNldCA9IHV0Zi04XG5lbmRfb2ZfbGluZSA9IGxmXG5pbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWVcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWVcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gMlxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gNFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2UpfVxubWF4X2xpbmVfbGVuZ3RoID0gb2ZmXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSBmYWxzZVxuXG5be01ha2VmaWxlLCoubWt9XVxuaW5kZW50X3N0eWxlID0gdGFiXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZGl0b3Jjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFZGl0b3Jjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZWRpdG9yY29uZmlnJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgWyoueyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fV1gIDogYFsqLiR7ZXh0ZW5zaW9uc1swXX1dYDtcbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSB9IGZyb20gJy4vYWdlbnRzLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcblxuICAgIGxldCBuZXdDb25maWc6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShkZWZhdWx0Q29uZmlnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGNvbmZpZ0ZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld0NvbmZpZyA9IG1lcmdlLmFsbChbbmV3Q29uZmlnLCBvbGRDb25maWcsIG5ld0NvbmZpZ10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nIC0gZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIHBhcnNlZFxuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0geWFtbC5kdW1wKG5ld0NvbmZpZywge1xuICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG4gICAgY29uc3QgY29kaW5nUnVsZUV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudD8udHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpID8gdW5kZWZpbmVkIDogZXh0cmFDb250ZW50O1xuICAgIGNvbnN0IHJldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb24gPSBjb25maWcuaXNQdWJsaWNSZXBvXG4gICAgICA/ICdSZXZpZXcgaW4gRW5nbGlzaCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNvZGluZyBzdGFuZGFyZHMuJ1xuICAgICAgOiAn5Lul5LiL44Gu44Kz44O844OH44Kj44Oz44Kw6KaP57SE44KS6LiP44G+44GI44Gm44CB5pel5pys6Kqe44Gn44Os44OT44Ol44O844GX44Gm44GP44Gg44GV44GE44CCJztcbiAgICBjb25zdCBzdHlsZWd1aWRlQ29udGVudCA9IGAke3Jldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb259XFxuXFxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9JHtcbiAgICAgIGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPyBgXFxuJHtjb2RpbmdSdWxlRXh0cmFDb250ZW50LnRyaW1FbmQoKX1gIDogJydcbiAgICB9YDtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSksXG4gICAgXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VtaW5pU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIGNvbnN0IGtleSA9IG93bmVyID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gICAgZ2V0R2l0SHViQ2xpVG9rZW4oKVxuICApO1xufVxuXG5sZXQgZ2l0SHViQ2xpVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0R2l0SHViQ2xpVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGdpdEh1YkNsaVRva2VuICE9PSB1bmRlZmluZWQpIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTb21lIGxvY2FsIHJ1bnMgcmVseSBvbiBHaXRIdWIgQ0xJIGF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZXhwb3J0ZWQgZW52IHRva2Vucy5cbiAgICBnaXRIdWJDbGlUb2tlbiA9XG4gICAgICBjaGlsZFByb2Nlc3NcbiAgICAgICAgLmV4ZWNGaWxlU3luYygnZ2gnLCBbJ2F1dGgnLCAndG9rZW4nXSwge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICAgIH0pXG4gICAgICAgIC50cmltKCkgfHwgJyc7XG4gIH0gY2F0Y2gge1xuICAgIGdpdEh1YkNsaVRva2VuID0gJyc7XG4gIH1cbiAgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFyc2VFcnJvciB9IGZyb20gJ2pzb25jLXBhcnNlcic7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZUpzb25jIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IHNpbXBsZUdpdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VUb21sIH0gZnJvbSAnc21vbC10b21sJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgc2VsZWN0UHJvamVjdFdyYW5nbGVyVHlwZXNHZW5lcmF0b3IgfSBmcm9tICcuL3V0aWxzL3dyYW5nbGVyVHlwZXNDb21tYW5kLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIHJlcG9BdXRob3I/OiBzdHJpbmc7XG4gIHJlcG9OYW1lPzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNDbG91ZGZsYXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnOiBib29sZWFuO1xuICBpc1JhaWx3YXk6IGJvb2xlYW47XG4gIGlzQnVuOiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICAvLyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uXG4gIC8qKiBEaXJlY3RvcmllcyBjb250YWluaW5nIENhcmdvLnRvbWwgKHJlbGF0aXZlIHRvIGRpclBhdGgsIHJvb3QtbW9zdCBmaXJzdCkuIEVtcHR5IGlmIHRoZSByZXBvIGhhcyBubyBSdXN0IGNvZGUuICovXG4gIGNhcmdvVG9tbERpclBhdGhzOiBzdHJpbmdbXTtcbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVXZMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZzogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZ0luUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcbiAgLy8gc291cmNlIGNvZGUgZmlsZXNcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YUluUGFja2FnZXM6IGJvb2xlYW47XG5cbiAgZGVwZW5kaW5nOiB7XG4gICAgYmxpdHo6IGJvb2xlYW47XG4gICAgZmlyZWJhc2U6IGJvb2xlYW47XG4gICAgZ2VuSTE4blRzOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0UnVudGltZTogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHRhdXJpOiBib29sZWFuO1xuICAgIHZpbmV4dDogYm9vbGVhbjtcbiAgICB2aXRlOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICAgIGNoYWtyYTogYm9vbGVhbjtcbiAgICBkcml6emxlOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGhhc1ZlcnNpb25TZXR0aW5nczogYm9vbGVhbjtcbiAgbWlzZVRhc2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc/OiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpblBhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgICAgICAgICBwbHVnaW5zPzogc3RyaW5nW11bXTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgPz8gW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSA/PyBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzVmVyc2lvblNldHRpbmdzID0gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXSkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSkpIHtcbiAgICAgICAgaGFzVmVyc2lvblNldHRpbmdzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvRnVsbE5hbWUgPyBgZ2l0aHViOiR7cmVwb0Z1bGxOYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgLy8gVGF1cmkgb2ZmaWNpYWxseSBzdXBwb3J0cyBKU09OLCBKU09ONSwgYW5kIFRPTUwgY29uZmlndXJhdGlvbiBmb3JtYXRzLlxuICAgIGNvbnN0IGRvZXNDb250YWluVGF1cmlDb25maWcgPSBbJ3RhdXJpLmNvbmYuanNvbicsICd0YXVyaS5jb25mLmpzb241JywgJ1RhdXJpLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdzcmMtdGF1cmknLCBmaWxlTmFtZSkpXG4gICAgKTtcbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiAhIXBhY2thZ2VKc29uLmZpbGVzLFxuICAgICAgcmVwb3NpdG9yeSxcbiAgICAgIHJlcG9BdXRob3IsXG4gICAgICByZXBvTmFtZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJSZXBvOiBCb29sZWFuKFxuICAgICAgICByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHwgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpXG4gICAgICApLFxuICAgICAgaXNDbG91ZGZsYXJlOiBkZXRlY3RDbG91ZGZsYXJlKGRpclBhdGgsIHBhY2thZ2VKc29uKSxcbiAgICAgIGRvZXNDb250YWluV3JhbmdsZXJDb25maWc6IGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGgpLFxuICAgICAgaXNSYWlsd2F5OiBkZXRlY3RSYWlsd2F5KGRpclBhdGgsIHBhY2thZ2VKc29uKSxcbiAgICAgIGlzQnVuOlxuICAgICAgICByb290Q29uZmlnPy5pc0J1biB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2tiJykpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdidW4ubG9jaycpKSB8fFxuICAgICAgICAvLyBTb21lIHJlcG9zIGdpdGlnbm9yZSBidW4ubG9jaywgc28gaXQgbWF5IGJlIG1pc3Npbmcgb24gZnJlc2ggY2xvbmVzLlxuICAgICAgICAvLyBidW5maWcudG9tbCBpcyBjb21taXR0ZWQgYW5kIGdlbmVyYXRlZCBvbmx5IGZvciBCdW4gcHJvamVjdHMsIG1ha2luZyBpdCBhIHJlbGlhYmxlIHNpZ25hbC5cbiAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bmZpZy50b21sJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcygnL3dpbGxib29zdGVyLWNvbmZpZ3MnKSxcbiAgICAgIGNhcmdvVG9tbERpclBhdGhzOiBmaW5kQ2FyZ29Ub21sRGlyUGF0aHMoZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbkdvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5VdkxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd1di5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWcsXG4gICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlczogY29udGFpbnNBbnkoXG4gICAgICAgICdwYWNrYWdlcy8qKi9zcmMtdGF1cmkve3RhdXJpLmNvbmYuanNvbix0YXVyaS5jb25mLmpzb241LFRhdXJpLnRvbWx9JyxcbiAgICAgICAgZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmE6IGNvbnRhaW5zQW55KCcqKi8qLmphdmEnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqLyouamF2YScsIGRpclBhdGgpLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgY2hha3JhOiAhIWRldkRlcGVuZGVuY2llc1snQGNoYWtyYS11aS9jbGknXSxcbiAgICAgICAgZHJpenpsZTogISFkZXBlbmRlbmNpZXNbJ2RyaXp6bGUtb3JtJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ2RyaXp6bGUta2l0J10sXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHBsYXl3cmlnaHRSdW50aW1lOiBkb2VzSW1wb3J0UGxheXdyaWdodEF0UnVudGltZShkaXJQYXRoKSxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB0YXVyaTpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnLFxuICAgICAgICB2aW5leHQ6ICEhZGVwZW5kZW5jaWVzLnZpbmV4dCB8fCAhIWRldkRlcGVuZGVuY2llcy52aW5leHQsXG4gICAgICAgIHZpdGU6ICEhZGVwZW5kZW5jaWVzLnZpdGUgfHwgISFkZXZEZXBlbmRlbmNpZXMudml0ZSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgaGFzVmVyc2lvblNldHRpbmdzLFxuICAgICAgbWlzZVRhc2tzOiBhd2FpdCByZWFkTWlzZVRhc2tzKGRpclBhdGgpLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVXZMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHJldHVybiAoXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJ21pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcubWlzZS50b21sJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy50b29sLXZlcnNpb25zJykpXG4gICk7XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB3YmZ5IG1hbmFnZXMgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBmb3IgdGhlIHBhY2thZ2UuIFRoZSBmaWxlIGlzIGdpdGlnbm9yZWQgYW5kIHVudHJhY2tlZCBvbiB0aGVcbiAqIGFzc3VtcHRpb24gdGhhdCBgd3JhbmdsZXIgdHlwZXNgIHJlZ2VuZXJhdGVzIGl0IG9uIGluc3RhbGwsIHNvIGFsbCB0aHJlZSBzdGVwcyBtdXN0IGFncmVlOiB0aGUgcGFja2FnZSBoYXMgdG8gb3duIGFcbiAqIHdyYW5nbGVyIGNvbmZpZyAoYHdyYW5nbGVyIHR5cGVzYCBleGl0cyBub24temVybyB3aXRob3V0IG9uZSksIHRvIGRlcGVuZCBvbiB3cmFuZ2xlciAoYSBwYWNrYWdlIGRlcGxveWluZyB2aWEgYVxuICogQ0kgYWN0aW9uIGNhbm5vdCByZXNvbHZlIHRoZSBjb21tYW5kKSwgYW5kIHRvIHJlZ2VuZXJhdGUgdGhlIHNhbWUgZmlsZSBvbiBldmVyeSBjaGVja291dC4gT3RoZXJ3aXNlIHdiZnkgd291bGRcbiAqIGlnbm9yZSBhbmQgZGVsZXRlIGEgZmlsZSB0aGF0IG5vdGhpbmcgcmVjcmVhdGVzIGlkZW50aWNhbGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnICYmXG4gICAgQm9vbGVhbihwYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5bJ3dyYW5nbGVyJ10gfHwgcGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uWyd3cmFuZ2xlciddKSAmJlxuICAgIC8vIEEgcHJvamVjdCBpbnZvY2F0aW9uIHRoYXQgd3JpdGVzIHRoZSBtYW5hZ2VkIGRlZmF1bHQgZmlsZSBmcm9tIGlucHV0cyB3YmZ5IGNhbm5vdCB2YWxpZGF0ZSAoZS5nLlxuICAgIC8vIGB3cmFuZ2xlciB0eXBlcyAtYyB3cmFuZ2xlci5qc29uYyAtYyAuLi9ib3VuZC13b3JrZXIvd3JhbmdsZXIuanNvbmNgIGZvciBSUEMgdHlwZXMpIHdvdWxkIGZpZ2h0IGEgbWFuYWdlZFxuICAgIC8vIGZhbGxiYWNrIGdlbmVyYXRvciBvdmVyIHRoZSBzYW1lIGZpbGUsIGFuZCBzZXZlcmFsIGRpc3RpbmN0IGZsYWdnZWQgZ2VuZXJhdG9ycyBsZWF2ZSBubyBkZXRlcm1pbmlzdGljXG4gICAgLy8gY2hvaWNlLCBzbyBzdWNoIHBhY2thZ2VzIHN0YXkgdW5tYW5hZ2VkLlxuICAgICFzZWxlY3RQcm9qZWN0V3JhbmdsZXJUeXBlc0dlbmVyYXRvcihwYWNrYWdlSnNvbj8uc2NyaXB0cyA/PyB7fSkuY29uZmxpY3RpbmcgJiZcbiAgICBoYXNSZXByb2R1Y2libGVXb3JrZXJUeXBlc0luZmVyZW5jZShjb25maWcpXG4gICk7XG59XG5cbi8qKlxuICogYHdyYW5nbGVyIHR5cGVzYCBpbmZlcnMgYEVudmAgbWVtYmVycyBmcm9tIHRoZSAuZGV2LnZhcnMvLmVudiBmaWxlcyBiZXNpZGUgdGhlIHdyYW5nbGVyIGNvbmZpZyDigJQgaW5jbHVkaW5nIHRoZVxuICogbGF5ZXJlZCB2YXJpYW50cyB3cmFuZ2xlciByZXNvbHZlcywgc3VjaCBhcyAuZW52LmxvY2FsIGFuZCBlbnZpcm9ubWVudC1zcGVjaWZpYyBmaWxlcyDigJQgdW5sZXNzIHRoZSBjb25maWdcbiAqIGRlY2xhcmVzIGBzZWNyZXRzLnJlcXVpcmVkYC4gVW50cmFja2luZyB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGlzIHNhZmUgb25seSB3aGVuIGV2ZXJ5IHN1Y2ggaW5wdXQgaXNcbiAqIGlkZW50aWNhbCBvbiBldmVyeSBjaGVja291dDogd2l0aCBhIGdpdGlnbm9yZWQgb3IgbG9jYWxseSBtb2RpZmllZCBmaWxlLCBDSSB3b3VsZCByZWdlbmVyYXRlIGFuIGBFbnZgIHdpdGhvdXRcbiAqIHRoZSBzZWNyZXQgbWVtYmVycyB0aGF0IHR5cGUtY2hlY2sgbG9jYWxseS5cbiAqL1xuZnVuY3Rpb24gaGFzUmVwcm9kdWNpYmxlV29ya2VyVHlwZXNJbmZlcmVuY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRpclBhdGggPSBjb25maWcuZGlyUGF0aDtcbiAgaWYgKGRlY2xhcmVzU3VwcG9ydGVkUmVxdWlyZWRTZWNyZXRzKGNvbmZpZykpIHJldHVybiB0cnVlO1xuICAvLyBUaGUgd3JhbmdsZXIgY29uZmlnIGl0c2VsZiBkcml2ZXMgdGhlIGdlbmVyYXRpb24sIHNvIGFuIHVudHJhY2tlZCwgbW9kaWZpZWQsIG9yIHN5bWxpbmtlZCBjb25maWcgbWFrZXMgdGhlXG4gIC8vIGdlbmVyYXRlZCBmaWxlIGlycmVwcm9kdWNpYmxlIHdoYXRldmVyIHRoZSBkb3RlbnYgaW5wdXRzIHNheS5cbiAgY29uc3QgY29uZmlnRmlsZU5hbWVzID0gWyd3cmFuZ2xlci5qc29uYycsICd3cmFuZ2xlci5qc29uJywgJ3dyYW5nbGVyLnRvbWwnXS5maWx0ZXIoKGZpbGVOYW1lKSA9PlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKSlcbiAgKTtcbiAgaWYgKCFhcmVUcmFja2VkQ2xlYW5SZWd1bGFyRmlsZXMoZGlyUGF0aCwgY29uZmlnRmlsZU5hbWVzKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBpbmZlcmVuY2VTb3VyY2VOYW1lcyA9IGZzXG4gICAgLnJlYWRkaXJTeW5jKGRpclBhdGgpXG4gICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IC9eXFwuKD86ZGV2XFwudmFyc3xlbnYpKD86XFwuLispPyQvdS50ZXN0KGZpbGVOYW1lKSk7XG4gIHJldHVybiBhcmVUcmFja2VkQ2xlYW5SZWd1bGFyRmlsZXMoZGlyUGF0aCwgaW5mZXJlbmNlU291cmNlTmFtZXMpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZXZlcnkgbGlzdGVkIGZpbGUgaXMgYSByZWd1bGFyIGZpbGUgKGEgdHJhY2tlZCBzeW1saW5rJ3MgZ2l0IHN0YXRlIHNheXMgbm90aGluZyBhYm91dCBpdHMgdGFyZ2V0J3NcbiAqIGNvbnRlbnQpLCB0cmFja2VkLCBBTkQgdW5tb2RpZmllZDogYGdpdCBscy1maWxlc2AgcHJpbnRzIG5vdGhpbmcgZm9yIGFuIHVudHJhY2tlZCBmaWxlIChhbmQgZmFpbHMgcHJpbnRpbmdcbiAqIG5vdGhpbmcgb3V0c2lkZSBhIHJlcG9zaXRvcnkpLCB3aGlsZSBgZ2l0IHN0YXR1cyAtLXBvcmNlbGFpbmAgcHJpbnRzIG5vdGhpbmcgZm9yIGEgY2xlYW4gZmlsZSDigJQgd3JhbmdsZXIgcmVhZHNcbiAqIHRoZSB3b3JraW5nIHRyZWUsIGJ1dCBDSSByZWFkcyB0aGUgY29tbWl0dGVkIGNvbnRlbnRzLCBzbyBsb2NhbCBlZGl0cyBicmVhayByZXByb2R1Y2liaWxpdHkgdG9vLiAoQW4gaWdub3JlZFxuICogZmlsZSBhbHNvIHByb2R1Y2VzIGVtcHR5IHN0YXR1cyBvdXRwdXQsIHdoaWNoIHRoZSB0cmFja2VkIGNoZWNrIGNhdGNoZXMuKVxuICovXG5mdW5jdGlvbiBhcmVUcmFja2VkQ2xlYW5SZWd1bGFyRmlsZXMoZGlyUGF0aDogc3RyaW5nLCBmaWxlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGlmIChmaWxlTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGZpbGVOYW1lcy5zb21lKChmaWxlTmFtZSkgPT4gZnMubHN0YXRTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSkpLmlzU3ltYm9saWNMaW5rKCkpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHRyYWNrZWRPdXRwdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtZmlsZXMnLCAnLS0nLCAuLi5maWxlTmFtZXNdLCBkaXJQYXRoKTtcbiAgY29uc3QgdHJhY2tlZENvdW50ID0gdHJhY2tlZE91dHB1dCA9PT0gJycgPyAwIDogdHJhY2tlZE91dHB1dC5zcGxpdCgnXFxuJykubGVuZ3RoO1xuICByZXR1cm4gKFxuICAgIHRyYWNrZWRDb3VudCA9PT0gZmlsZU5hbWVzLmxlbmd0aCAmJlxuICAgIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydzdGF0dXMnLCAnLS1wb3JjZWxhaW4nLCAnLS0nLCAuLi5maWxlTmFtZXNdLCBkaXJQYXRoKSA9PT0gJydcbiAgKTtcbn1cblxuLy8gYHdyYW5nbGVyIHR5cGVzYCBnZW5lcmF0ZXMgZnJvbSBgc2VjcmV0cy5yZXF1aXJlZGAgb25seSBzaW5jZSB3cmFuZ2xlciA0Ljc3LjAgKGFubm91bmNlZCAyMDI2LTAzLTI0LCB0aGUgNC43Ny4wXG4vLyByZWxlYXNlIGRhdGUpOyBvbGRlciB3cmFuZ2xlcnMgd2FybiBhYm91dCB0aGUgdW5leHBlY3RlZCBmaWVsZCBhbmQga2VlcCBpbmZlcnJpbmcgZnJvbSAuZGV2LnZhcnMuXG5jb25zdCBtaW5pbXVtV3JhbmdsZXJWZXJzaW9uRm9yUmVxdWlyZWRTZWNyZXRzID0gJzQuNzcuMCc7XG5cbmZ1bmN0aW9uIGRlY2xhcmVzU3VwcG9ydGVkUmVxdWlyZWRTZWNyZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBjb25zdCB3cmFuZ2xlclZlcnNpb25SYW5nZSA9XG4gICAgY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/Llsnd3JhbmdsZXInXSA/PyBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uWyd3cmFuZ2xlciddO1xuICBpZiAoIXdyYW5nbGVyVmVyc2lvblJhbmdlKSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgbWluaW11bVZlcnNpb24gPSBzZW12ZXIubWluVmVyc2lvbih3cmFuZ2xlclZlcnNpb25SYW5nZSk7XG4gICAgaWYgKCFtaW5pbXVtVmVyc2lvbiB8fCBzZW12ZXIubHQobWluaW11bVZlcnNpb24sIG1pbmltdW1XcmFuZ2xlclZlcnNpb25Gb3JSZXF1aXJlZFNlY3JldHMpKSByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gd3JhbmdsZXJDb25maWdEZWNsYXJlc1JlcXVpcmVkU2VjcmV0cyhjb25maWcuZGlyUGF0aCk7XG59XG5cbmludGVyZmFjZSBXcmFuZ2xlckNvbmZpZ1NlY3JldHNTdWJ0cmVlIHtcbiAgc2VjcmV0cz86IHsgcmVxdWlyZWQ/OiBzdHJpbmdbXSB9O1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCB7IHNlY3JldHM/OiB7IHJlcXVpcmVkPzogc3RyaW5nW10gfSB9IHwgdW5kZWZpbmVkPjtcbn1cblxuZnVuY3Rpb24gd3JhbmdsZXJDb25maWdEZWNsYXJlc1JlcXVpcmVkU2VjcmV0cyhkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbiddKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSBjb250aW51ZTtcbiAgICAgIC8vIGpzb25jLXBhcnNlciBpcyBmYXVsdCB0b2xlcmFudCBhbmQgd291bGQgcmV0dXJuIGEgcGFydGlhbCBvYmplY3QgZm9yIG1hbGZvcm1lZCBpbnB1dCxcbiAgICAgIC8vIHdoaWNoIGNhbm5vdCBwcm92ZSBhIGRlY2xhcmF0aW9uOyByZWplY3QgYW55IHBhcnNlIGVycm9yLlxuICAgICAgY29uc3QgcGFyc2VFcnJvcnM6IFBhcnNlRXJyb3JbXSA9IFtdO1xuICAgICAgY29uc3QgY29uZmlnID0gcGFyc2VKc29uYyhmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JyksIHBhcnNlRXJyb3JzLCB7IGFsbG93VHJhaWxpbmdDb21tYTogdHJ1ZSB9KSBhc1xuICAgICAgICB8IFdyYW5nbGVyQ29uZmlnU2VjcmV0c1N1YnRyZWVcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gcGFyc2VFcnJvcnMubGVuZ3RoID09PSAwICYmICEhY29uZmlnICYmIGRlY2xhcmVzUmVxdWlyZWRTZWNyZXRzQW55d2hlcmUoY29uZmlnKTtcbiAgICB9XG4gICAgY29uc3QgdG9tbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dyYW5nbGVyLnRvbWwnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh0b21sUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHBhcnNlVG9tbChmcy5yZWFkRmlsZVN5bmModG9tbFBhdGgsICd1dGY4JykpIGFzIFdyYW5nbGVyQ29uZmlnU2VjcmV0c1N1YnRyZWU7XG4gICAgICByZXR1cm4gZGVjbGFyZXNSZXF1aXJlZFNlY3JldHNBbnl3aGVyZShjb25maWcpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gQSBjb25maWcgdGhhdCBkb2VzIG5vdCBwYXJzZSBjYW5ub3QgcHJvdmUgYSBkZWNsYXJhdGlvbi5cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIEEgZGVjbGFyYXRpb24gYXQgYW55IGNvbmZpZyBsZXZlbCByZXBsYWNlcyB0aGUgLmRldi52YXJzLy5lbnYgaW5mZXJlbmNlOiBgd3JhbmdsZXIgdHlwZXNgIGFnZ3JlZ2F0ZXNcbi8vIHBlci1lbnZpcm9ubWVudCBzZWNyZXRzIGludG8gdGhlIGdlbmVyYXRlZCB0eXBlIChDbG91ZGZsYXJlIGNoYW5nZWxvZyAyMDI2LTAzLTI0KS5cbmZ1bmN0aW9uIGRlY2xhcmVzUmVxdWlyZWRTZWNyZXRzQW55d2hlcmUoY29uZmlnOiBXcmFuZ2xlckNvbmZpZ1NlY3JldHNTdWJ0cmVlKTogYm9vbGVhbiB7XG4gIGlmICgoY29uZmlnLnNlY3JldHM/LnJlcXVpcmVkPy5sZW5ndGggPz8gMCkgPiAwKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoY29uZmlnLmVudiA/PyB7fSkuc29tZSgoZW52Q29uZmlnKSA9PiAoZW52Q29uZmlnPy5zZWNyZXRzPy5yZXF1aXJlZD8ubGVuZ3RoID8/IDApID4gMCk7XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB0aGUgZGlyZWN0b3J5IG93bnMgYSBXb3JrZXIsIHVubGlrZSB0aGUgaXNDbG91ZGZsYXJlIGhldXJpc3RpYywgd2hpY2ggYWxzbyBtYXRjaGVzIGEgcGFja2FnZSB0aGF0XG4gKiBtZXJlbHkgbWVudGlvbnMgd3JhbmdsZXIgaW4gYSBzY3JpcHQgb3Igd29ya2Zsb3cgKGUuZy4gdGhlIHJvb3Qgb2YgYSBtb25vcmVwbyB3aG9zZSBXb3JrZXIgbGl2ZXMgaW4gYSBzdWItcGFja2FnZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RXcmFuZ2xlckNvbmZpZyhkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbicsICd3cmFuZ2xlci50b21sJ10uc29tZSgoZmlsZU5hbWUpID0+XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZU5hbWUpKVxuICApO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RDbG91ZGZsYXJlKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCd3cmFuZ2xlcicpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGgpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gd29ya2Zsb3dGaWxlc01hdGNoKGRpclBhdGgsIC9jbG91ZGZsYXJlfHdyYW5nbGVyL2l1KTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0UmFpbHdheShkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cztcbiAgaWYgKHNjcmlwdHMgJiYgT2JqZWN0LnZhbHVlcyhzY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIHNjcmlwdC5pbmNsdWRlcygncmFpbHdheScpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmFpbHdheWlnbm9yZScpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncmFpbHdheS5qc29uJykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gd29ya2Zsb3dGaWxlc01hdGNoKGRpclBhdGgsIC9yYWlsd2F5L2l1KTtcbn1cblxuZnVuY3Rpb24gd29ya2Zsb3dGaWxlc01hdGNoKGRpclBhdGg6IHN0cmluZywgcmVnZXg6IFJlZ0V4cCk6IGJvb2xlYW4ge1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICB0cnkge1xuICAgIHJldHVybiBmc1xuICAgICAgLnJlYWRkaXJTeW5jKHdvcmtmbG93c1BhdGgpXG4gICAgICAuc29tZSgoZmlsZU5hbWUpID0+IC9cXC55YT9tbCQvaXUudGVzdChmaWxlTmFtZSkgJiYgd29ya2Zsb3dGaWxlTWF0Y2hlcyh3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSwgcmVnZXgpKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdvcmtmbG93RmlsZU1hdGNoZXMod29ya2Zsb3dzUGF0aDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nLCByZWdleDogUmVnRXhwKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4JykpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1pc2VUYXNrcyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgdGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBbJ21pc2UudG9tbCcsICcubWlzZS50b21sJ10pIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNldHRpbmdzID0gcGFyc2VUb21sKGF3YWl0IGZzcC5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgeyB0YXNrcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MudGFza3MgPz8ge30pKSB7XG4gICAgICAgIHRhc2tzW25hbWVdID0gcmVhZE1pc2VUYXNrQ29tbWFuZCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG9yIHRlbXBvcmFyaWx5IGludmFsaWQgbWlzZSBmaWxlcyBzaG91bGQgbm90IGJsb2NrIG90aGVyIHdiZnkgZ2VuZXJhdG9ycy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhc2tzO1xufVxuXG5mdW5jdGlvbiByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgLy8gUHJlc2VydmUgYXJyYXktZm9ybSBtaXNlIGNvbW1hbmRzIHNvIHJlY3Vyc2lvbiBjaGVja3MgY2FuIHN0aWxsIHNlZSBwYWNrYWdlIHNjcmlwdCBjYWxscy5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuZmlsdGVyKChjb21tYW5kKTogY29tbWFuZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGNvbW1hbmQgPT09ICdzdHJpbmcnKS5qb2luKCdcXG4nKTtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHJldHVybiByZWFkTWlzZVRhc2tDb21tYW5kKCh2YWx1ZSBhcyB7IHJ1bj86IHVua25vd24gfSkucnVuKTtcbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmZ1bmN0aW9uIGZpbmRDYXJnb1RvbWxEaXJQYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBmZ1xuICAgIC5nbG9iU3luYygnKiovQ2FyZ28udG9tbCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KVxuICAgIC5tYXAoKGZpbGVQYXRoKSA9PiBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKVxuICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5zcGxpdCgnLycpLmxlbmd0aCAtIGIuc3BsaXQoJy8nKS5sZW5ndGggfHwgYS5sb2NhbGVDb21wYXJlKGIpKTtcbn1cblxuZnVuY3Rpb24gZG9lc0ltcG9ydFBsYXl3cmlnaHRBdFJ1bnRpbWUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGZpbGVzID0gZmcuZ2xvYlN5bmMoJ3thcHAsc3JjfS8qKi8qLntjanMsY3RzLGpzLGpzeCxtanMsbXRzLHRzLHRzeH0nLCB7XG4gICAgZG90OiB0cnVlLFxuICAgIGN3ZDogZGlyUGF0aCxcbiAgICBpZ25vcmU6IFsuLi5nbG9iSWdub3JlLCAnKiovX190ZXN0c19fLyoqJywgJyoqLyouc3BlYy4qJywgJyoqLyoudGVzdC4qJywgJyoqL3BsYXl3cmlnaHQuY29uZmlnLionXSxcbiAgfSk7XG4gIHJldHVybiBmaWxlcy5zb21lKChmaWxlKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZSksICd1dGY4Jyk7XG4gICAgcmV0dXJuIC9cXGJmcm9tXFxzK1snXCJdcGxheXdyaWdodFsnXCJdfFxcYmltcG9ydFxccypcXChcXHMqWydcIl1wbGF5d3JpZ2h0WydcIl1cXHMqXFwpfFxcYnJlcXVpcmVcXHMqXFwoXFxzKlsnXCJdcGxheXdyaWdodFsnXCJdXFxzKlxcKS91LnRlc3QoXG4gICAgICBjb250ZW50XG4gICAgKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGdpdCA9IHNpbXBsZUdpdChkaXJQYXRoKTtcbiAgY29uc3QgcmVtb3RlcyA9IGF3YWl0IGdpdC5nZXRSZW1vdGVzKHRydWUpO1xuICBjb25zdCBvcmlnaW4gPSByZW1vdGVzLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gJ29yaWdpbicpO1xuICBjb25zdCByZW1vdGVVcmwgPSBvcmlnaW4/LnJlZnMuZmV0Y2ggPz8gb3JpZ2luPy5yZWZzLnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgLy8gTWV0YWRhdGEgcGVybWlzc2lvblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdCgpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWRpcmVjdGVkRnVsbE5hbWUgPSBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yKTtcbiAgICBpZiAocmVkaXJlY3RlZEZ1bGxOYW1lKSB7XG4gICAgICByZXR1cm4geyBmdWxsX25hbWU6IHJlZGlyZWN0ZWRGdWxsTmFtZSB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlc1dvcmtlclR5cGVzLCB0eXBlIFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBEbyBub3QgcmVtb3ZlIGB3aW5kb3dzYDogZ2VuZXJhdGVkIC5naXRpZ25vcmUgZmlsZXMgbXVzdCBrZWVwIGlnbm9yaW5nIFdpbmRvd3MtY3JlYXRlZCBsb2NhbCBhcnRpZmFjdHMuXG5jb25zdCBkZWZhdWx0TmFtZXMgPSBbJ3dpbmRvd3MnLCAnbWFjb3MnLCAnbGludXgnLCAnamV0YnJhaW5zJywgJ3Zpc3VhbHN0dWRpb2NvZGUnLCAnZW1hY3MnLCAndmltJywgJ3lhcm4nXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbl9fZ2VuZXJhdGVkX18vXG4hLmtlZXBcbi5haWRlcipcbi5hbnRpZ3Jhdml0eWNsaS9cbi5jbGF1ZGUvKi5sb2NhbC4qXG4uY2xhdWRlL3NjaGVkdWxlZF90YXNrcy5sb2NrXG4uZGV2Y29udGFpbmVyL1xuLmVudi5wcm9kdWN0aW9uXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90Lipcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLnBsYXl3cmlnaHQtY2xpL1xuLnBsYXl3cmlnaHQtbWNwL1xuLnNlcmVuYS9cbi50bXAvXG4udG9rZW5zYXZlL1xuLndiL1xuQHdpbGxib29zdGVyL1xuKi9tb3VudC8qLmhhc2hcbkNMQVVERS5sb2NhbC5tZFxuZGlzdC9cbmRyaXp6bGUvbW91bnQvXG50ZW1wL1xudG1wL1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGxldCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCkgKyBjb21tb25Db250ZW50O1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IG5hbWVzID0gWy4uLmRlZmF1bHROYW1lc107XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1YnknKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kKSB7XG4gICAgICBuYW1lcy5wdXNoKCdnbycpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAke3BhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpfVxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBuYW1lcy5wdXNoKCdub2RlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ21hdmVuJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5pZGVhL2dvb2dsZS1qYXZhLWZvcm1hdC54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgbmFtZXMucHVzaCgnZmx1dHRlcicsICdBbmRyb2lkU3R1ZGlvJywgJ3J1YnknKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmZsdXR0ZXItcGx1Z2lucy1kZXBlbmRlbmNpZXNcbmFuZHJvaWQva2V5LnByb3BlcnRpZXNcbmlvcy8uYnVuZGxlXG4uaWRlYS9ydW5Db25maWd1cmF0aW9ucy54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmF3cy1zYW0vXG5wYWNrYWdlZC55YW1sXG5gO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIC52ZW52IHNob3VsZCBiZSBpZ25vcmVkIG9uIHJvb3QgZGlyZWN0b3J5XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSB8fCBjb25maWcuZGVwZW5kaW5nLmRyaXp6bGUpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcudGF1cmkpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1c3QnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnKSB7XG4gICAgICAvLyAhQ2FyZ28ubG9jayBvdmVycmlkZXMgYW55IHByZS1leGlzdGluZyB1bmFuY2hvcmVkIENhcmdvLmxvY2sgcnVsZSBmcm9tIGFcbiAgICAgIC8vIHBhcmVudCAuZ2l0aWdub3JlLCBzbyB0aGUgYXBwbGljYXRpb24gbG9ja2ZpbGUgc3RheXMgY29tbWl0dGFibGUuXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCFDYXJnby5sb2NrXG5zcmMtdGF1cmkvZ2VuL3NjaGVtYXMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc0Nsb3VkZmxhcmUgfHwgcm9vdENvbmZpZy5pc0Nsb3VkZmxhcmUpIHtcbiAgICAgIC8vIC5kZXYudmFycyogaG9sZCBsb2NhbCBzZWNyZXRzIGZvciB3cmFuZ2xlciBkZXYgYW5kIG11c3QgbmV2ZXIgYmUgY29tbWl0dGVkLFxuICAgICAgLy8gdW5saWtlIHRoZSBjb21taXR0ZWQgLmVudi8uZW52LnN0YWdpbmcgZmlsZXMgb2YgdGhlIFdpbGxCb29zdGVyIGNvbnZlbnRpb24uXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5kZXYudmFycypcbi53cmFuZ2xlci9cbmA7XG4gICAgfVxuICAgIC8vIElnbm9yZWQgb25seSB3aGVyZSBwb3N0aW5zdGFsbCByZWdlbmVyYXRlcyBpdCwgc28gd2JmeSBuZXZlciBpZ25vcmVzIGEgZmlsZSB0aGF0IG5vdGhpbmcgcmVjcmVhdGVzLiBUaGlzIGtlZXBzXG4gICAgLy8gaXRzIHRob3VzYW5kcyBvZiBsaW5lcyBvdXQgb2YgZXZlcnkgd3JhbmdsZXIgYnVtcCdzIGRpZmYuIEFuY2hvcmVkIHdpdGggYSBsZWFkaW5nIHNsYXNoIGJlY2F1c2UgYHdyYW5nbGVyIHR5cGVzYFxuICAgIC8vIGFuZCB0aGUgdW50cmFja2luZyBiZWxvdyBvbmx5IGV2ZXIgdG91Y2ggdGhpcyBwYWNrYWdlJ3Mgb3duIGZpbGUsIG5vdCBhIG5lc3RlZCBvbmUgYXQgYW55IGRlcHRoLlxuICAgIGlmIChnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC93b3JrZXItY29uZmlndXJhdGlvbi5kLnRzXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcudmluZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcudmluZXh0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52aW5leHQvXG5gO1xuICAgIH1cblxuICAgIGxldCBnZW5lcmF0ZWQgPSAnJztcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGxldCBjb250ZW50ID0gKGF3YWl0IHJlYWRDYWNoZShuYW1lKSkgPz8gJyc7XG4gICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vd3d3LnRvcHRhbC5jb20vZGV2ZWxvcGVycy9naXRpZ25vcmUvYXBpLyR7bmFtZX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJ0F0dGVudGlvbiBSZXF1aXJlZCEnKSB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJzx0aXRsZT4nKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IHJlc3BvbnNlVGV4dC50cmltKCk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZUNhY2hlKG5hbWUsIGNvbnRlbnQpKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBGZXRjaGVkICR7dXJsfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ2VuZXJhdGVkKSBnZW5lcmF0ZWQgKz0gJ1xcbic7XG4gICAgICBnZW5lcmF0ZWQgKz0gY29udGVudCArICdcXG4nO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBpZ25vcmVGaWxlVXRpbC5pc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoKSkpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlKCchLnlhcm4vY2FjaGUnLCAnIyAhLnlhcm4vY2FjaGUnKS5yZXBsYWNlKCcjIC5wbnAuKicsICcucG5wLionKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2FydGlmYWN0cyQvZ20sICcuaWRlYS9hcnRpZmFjdHMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9jb21waWxlci54bWwkL2dtLCAnLmlkZWEvY29tcGlsZXIueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvamFyUmVwb3NpdG9yaWVzLnhtbCQvZ20sICcuaWRlYS9qYXJSZXBvc2l0b3JpZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnLmlkZWEvbW9kdWxlcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC8qLmltbCQvZ20sICcuaWRlYS8qLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMkL2dtLCAnLmlkZWEvbW9kdWxlcycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmltbCQvZ20sICcqLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmlwciQvZ20sICcqLmlwcicpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcjIC5pZGVhL21vZHVsZXMueG1sJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy50YXVyaSkge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUncyB1bmFuY2hvcmVkIGRlYnVnLyB3b3VsZCBhbHNvIGhpZGUgZnJvbnRlbmQgc291cmNlXG4gICAgICAvLyBkaXJlY3RvcmllcyBzdWNoIGFzIHNyYy9kZWJ1Zy87IGNhcmdvIG91dHB1dCBpcyBhbHJlYWR5IGNvdmVyZWQgYnkgdGFyZ2V0Ly5cbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eZGVidWdcXC8kL2dtLCAnIyBkZWJ1Zy8nKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8IGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcykge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUgaWdub3JlcyBDYXJnby5sb2NrLCBidXQgYSBzcmMtdGF1cmkgY29uZmlndXJhdGlvbiBtYXJrcyBhblxuICAgICAgLy8gYXBwbGljYXRpb24sIHdob3NlIENhcmdvLmxvY2sgbXVzdCBiZSBjb21taXR0ZWQgZm9yIHJlcHJvZHVjaWJsZSBidWlsZHMuIFRoZVxuICAgICAgLy8gcnVsZSBpcyBhbHNvIGRpc2FibGVkIHdoZW4gYSBzdWIgcGFja2FnZSBjb250YWlucyBhIFRhdXJpIGFwcGxpY2F0aW9uLCBiZWNhdXNlXG4gICAgICAvLyBhbiB1bmFuY2hvcmVkIENhcmdvLmxvY2sgcnVsZSBpbiBhIHBhcmVudCAuZ2l0aWdub3JlIHdvdWxkIGhpZGUgdGhlIG5lc3RlZFxuICAgICAgLy8gYXBwbGljYXRpb24ncyBsb2NrZmlsZS4gVGF1cmkgcGx1Z2luIGxpYnJhcmllcyAoZGV0ZWN0ZWQgb25seSB2aWFcbiAgICAgIC8vIEB0YXVyaS1hcHBzLyogZGVwZW5kZW5jaWVzKSBrZWVwIHRoZSB0ZW1wbGF0ZSdzIHBvbGljeSBvZiBpZ25vcmluZyBDYXJnby5sb2NrLlxuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL15DYXJnb1xcLmxvY2skL2dtLCAnIyBDYXJnby5sb2NrJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gS2VlcCBwYWNrYWdlLW1hbmFnZXIgc2hpbXMgaW4gdGhlIEZpbGUgV2F0Y2hlciBwcm9ncmFtIGZpZWxkIHNvIG5vZGUgZG9lcyBub3Rcbi8vIHBhcnNlIHdyYXBwZXIgc2NyaXB0cyBwYXNzZWQgdGhyb3VnaCBhcmd1bWVudHMuXG5jb25zdCBveGZtdFByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9veGZtdCc7XG5jb25zdCBwcmV0dGllclByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllcic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGdldFdhdGNoZXJUYXNrc0NvbnRlbnQoY29uZmlnKSkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCB0YXNrT3B0aW9ucyA9IFtcbiAgICB7XG4gICAgICBhcmdzOiAnLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICEqKi9wYWNrYWdlLmpzb24nLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucy5veGZtdCxcbiAgICAgIG5hbWU6ICdPeGZtdCcsXG4gICAgICBwcm9ncmFtOiBveGZtdFByb2dyYW0sXG4gICAgfSxcbiAgICB7XG4gICAgICBhcmdzOiAnLS1jYWNoZSAtLXdyaXRlJyxcbiAgICAgIGNvbmRpdGlvbjogZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLnByZXR0aWVyT25seSxcbiAgICAgIG5hbWU6ICdQcmV0dGllcicsXG4gICAgICBwcm9ncmFtOiBwcmV0dGllclByb2dyYW0sXG4gICAgfSxcbiAgXVxuICAgIC5maWx0ZXIoKHRhc2spID0+IHRhc2suY29uZGl0aW9uKVxuICAgIC5mbGF0TWFwKCh0YXNrKSA9PiB0YXNrLmV4dGVuc2lvbnMubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKHRhc2sucHJvZ3JhbSwgdGFzay5hcmdzLCB0YXNrLm5hbWUsIGV4dCkpKTtcblxuICByZXR1cm4gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuICAgICR7dGFza09wdGlvbnMuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGFza09wdGlvbnMocnVubmVyOiBzdHJpbmcsIGFyZ3M6IHN0cmluZywgbmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgICAgIDxUYXNrT3B0aW9ucyBpc0VuYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJhcmd1bWVudHNcIiB2YWx1ZT1cIiR7YXJnc30gJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJjaGVja1N5bnRheEVycm9yc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZXhpdENvZGVCZWhhdmlvclwiIHZhbHVlPVwiRVJST1JcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZmlsZUV4dGVuc2lvblwiIHZhbHVlPVwiJHtleHRlbnNpb259XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImltbWVkaWF0ZVN5bmNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm5hbWVcIiB2YWx1ZT1cIiR7bmFtZX0gKC4ke2V4dGVuc2lvbn0pXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dFwiIHZhbHVlPVwiJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGaWx0ZXJzXCI+XG4gICAgICAgIDxhcnJheSAvPlxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGcm9tU3Rkb3V0XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJwcm9ncmFtXCIgdmFsdWU9XCIke3J1bm5lcn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicnVuT25FeHRlcm5hbENoYW5nZXNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInNjb3BlTmFtZVwiIHZhbHVlPVwiUHJvamVjdCBGaWxlc1wiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ0cmFja09ubHlSb290XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ3b3JraW5nRGlyXCIgdmFsdWU9XCIkUHJvamVjdEZpbGVEaXIkXCIgLz5cbiAgICAgIDxlbnZzIC8+XG4gICAgPC9UYXNrT3B0aW9ucz5cbmA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5JMThuVHNDb21tYW5kKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RlcGVuZGluZycgfCAnaXNCdW4nPixcbiAgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLmdlbkkxOG5UcyB8fCAhc2NyaXB0cz8uWydnZW4taTE4bi10cyddKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYCR7Y29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybid9IHJ1biBnZW4taTE4bi10cyA+IC9kZXYvbnVsbGA7XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmdhbml6YXRpb246IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvVXJsID0gYGdpdEBnaXRodWIuY29tOiR7b3JnYW5pemF0aW9ufS8ke3JlcG99LmdpdGA7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdnaXQnLCBbJ2xzLXJlbW90ZScsIHJlcG9VcmwsICdIRUFEJ10sIHByb2Nlc3MuY3dkKCkpO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBvdXRwdXQuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZiAoIWNvbW1pdEhhc2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb21taXRIYXNoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggY29tbWl0cyBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb306ICR7U3RyaW5nKGVycm9yKX1gKSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IFtcbiAgJ0B0c2NvbmZpZy9idW4nLFxuICAnQHRzY29uZmlnL25vZGUtbHRzJyxcbiAgJ0B0c2NvbmZpZy9ub2RlLXRzJyxcbiAgJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnLFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9idW4vdHNjb25maWcuanNvbic7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUvdHNjb25maWcuanNvbic7XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzL3RzY29uZmlnLmpzb24nLCAnQHRzY29uZmlnL25vZGUtdHMvdHNjb25maWcuanNvbiddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzJywgJ0B0c2NvbmZpZy9ub2RlLXRzJ107XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiZcbiAgICAhY29uZmlnLmlzUm9vdCAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8ucHJpdmF0ZSAhPT0gdHJ1ZSAmJlxuICAgIEFycmF5LmlzQXJyYXkoY29uZmlnLnBhY2thZ2VKc29uPy5maWxlcykgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24uZmlsZXMubGVuZ3RoID4gMFxuICApO1xufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBsb2FkL2R1bXAgdXNhZ2UgY2xlYXJlci5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvblZhbHVlTWFwIH0gZnJvbSAnQHlhcm5wa2cvY29yZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbnR5cGUgU2V0dGluZ3MgPSB7XG4gIGFwcHJvdmVkR2l0UmVwb3NpdG9yaWVzPzogc3RyaW5nW107XG4gIGRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeDogc3RyaW5nO1xuICBlbmFibGVTY3JpcHRzPzogYm9vbGVhbjtcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgbnBtTWluaW1hbEFnZUdhdGU/OiBzdHJpbmc7XG4gIG5wbVByZWFwcHJvdmVkUGFja2FnZXM/OiBzdHJpbmdbXTtcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufSAmIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPjtcblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgeWFybk5wbU1pbmltYWxBZ2VHYXRlID0gJzVkJztcbmV4cG9ydCBjb25zdCB5YXJuTnBtUHJlYXBwcm92ZWRQYWNrYWdlcyA9IFtcbiAgLy8gLS0tLS0tLS0tLSBTVEFSVDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuICAnQGV4ZXJjb2RlLyonLFxuICAnQHdpbGxib29zdGVyLyonLFxuICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAnYXQtZGVjb3JhdG9ycycsXG4gICdidWlsZC10cycsXG4gICdnZW4taTE4bi10cycsXG4gICdvbmUtd2F5LWdpdC1zeW5jJyxcbiAgLy8gLS0tLS0tLS0tLSBFTkQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cblxuICAvLyBUbyBkZWFsIHdpdGggQ1ZFIGxpa2UgaHR0cHM6Ly9uZXh0anMub3JnL2Jsb2cvQ1ZFLTIwMjUtNjY0NzhcbiAgJ25leHQnLFxuICAnQG5leHQvKicsXG4gICdAdHlwZXMvKicsXG4gIC8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGFzIGB0eXBlc2NyaXB0YDsgYEB0eXBlc2NyaXB0LypgIGNvdmVycyBpdHMgcGxhdGZvcm0gYmluYXJpZXMuXG4gICd0eXBlc2NyaXB0JyxcbiAgJ0B0eXBlc2NyaXB0LyonLFxuICAnQG94Zm10LyonLFxuICAnQG94bGludC8qJyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvKicsXG4gICdveGZtdCcsXG4gICdveGxpbnQnLFxuICAnb3hsaW50LXRzZ29saW50JyxcbiAgJ3JlYWN0JyxcbiAgJ3JlYWN0LWRvbScsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGlzTmV3ZXJWZXJzaW9uKGxhdGVzdFZlcnNpb24sIGN1cnJlbnRWZXJzaW9uKSkge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGxldCBzZXR0aW5ncyA9IHt9IGFzIFNldHRpbmdzO1xuICAgIHRyeSB7XG4gICAgICBzZXR0aW5ncyA9ICh5YW1sLmxvYWQoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoeWFybnJjWW1sUGF0aCwgJ3V0ZjgnKSkgYXMgU2V0dGluZ3MgfCB1bmRlZmluZWQpID8/IHNldHRpbmdzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzZXR0aW5ncy5kZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXggPSAnJztcbiAgICAvLyBJbnN0YWxsLXRpbWUgc2NyaXB0cyBhcmUgYSBjb21tb24gc3VwcGx5LWNoYWluIGV4ZWN1dGlvbiBwYXRoLiBLZWVwIHRoaXNcbiAgICAvLyBleHBsaWNpdCBzbyBzdGFsZSBwcm9qZWN0IHNldHRpbmdzIGNhbm5vdCByZS1lbmFibGUgdGhlbSBnbG9iYWxseS5cbiAgICBzZXR0aW5ncy5lbmFibGVTY3JpcHRzID0gZmFsc2U7XG4gICAgc2V0dGluZ3Mubm9kZUxpbmtlciA9ICdub2RlLW1vZHVsZXMnO1xuICAgIHNldHRpbmdzLm5tTW9kZSA9ICdoYXJkbGlua3MtZ2xvYmFsJztcbiAgICBzZXR0aW5ncy5ucG1NaW5pbWFsQWdlR2F0ZSA9IHlhcm5OcG1NaW5pbWFsQWdlR2F0ZTtcbiAgICBzZXR0aW5ncy5hcHByb3ZlZEdpdFJlcG9zaXRvcmllcyA9IFtcbiAgICAgIC8vIFlhcm4gNC4xNCBibG9ja3MgZ2l0IGRlcGVuZGVuY2llcyB1bmxlc3MgdGhlIHJlcG9zaXRvcnkgVVJMIGlzIGV4cGxpY2l0bHkgYWxsb3dlZC5cbiAgICAgICdodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvKi5naXQnLFxuICAgICAgJ3NzaDovL2dpdEBnaXRodWIuY29tL1dpbGxCb29zdGVyLyouZ2l0JyxcbiAgICAgICdodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXJMYWIvKi5naXQnLFxuICAgICAgJ3NzaDovL2dpdEBnaXRodWIuY29tL1dpbGxCb29zdGVyTGFiLyouZ2l0JyxcbiAgICBdO1xuICAgIHNldHRpbmdzLm5wbVByZWFwcHJvdmVkUGFja2FnZXMgPSB5YXJuTnBtUHJlYXBwcm92ZWRQYWNrYWdlcztcbiAgICBkZWxldGUgc2V0dGluZ3MuY29tcHJlc3Npb25MZXZlbDtcbiAgICBpZiAoc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcztcbiAgICB9XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L3B1bGwvNDY5OFxuICAgIHNldHRpbmdzLmVuYWJsZUdsb2JhbENhY2hlID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IHNldHRpbmdzLnBsdWdpbnM/Lmxlbmd0aCA/PyAwO1xuICAgIHNldHRpbmdzLnBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zPy5maWx0ZXIoKHApID0+IHAucGF0aCAhPT0gJy55YXJuL3BsdWdpbnMvdW5kZWZpbmVkLmNqcycpID8/IFtdO1xuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCAhPT0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicsICdwbHVnaW5zJywgJ3VuZGVmaW5lZC5janMnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwbHVnaW5QYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MucGx1Z2lucztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHlhcm5yY1ltbFBhdGgsIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKTtcblxuICAgIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ3lhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgLy8gVGhlIHRhcmdldCByZXBvIG1heSBub3QgaGF2ZSBwcmV0dGllciBpbnN0YWxsZWQgeWV0LCBhbmQgeWFybi1wbHVnaW4tYXV0by1pbnN0YWxsIGVkaXRzIHRoaXMgZmlsZSBhZnRlciBqcy15YW1sLlxuICAgIHNwYXduU3luYygneWFybicsIGdldFlhcm5yY1ByZXR0aWVyQXJncyhjb25maWcuZGlyUGF0aCwgeWFybnJjWW1sUGF0aCksIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRZYXJucmNQcmV0dGllckFyZ3MoZGlyUGF0aDogc3RyaW5nLCB5YXJucmNZbWxQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbJ2RseCcsICdwcmV0dGllcicsICctLW5vLWNvbmZpZycsICctLXdyaXRlJywgcGF0aC5yZWxhdGl2ZShkaXJQYXRoLCB5YXJucmNZbWxQYXRoKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndmVyc2lvbiddLCBkaXJQYXRoKSB8fCAnMC4wLjAnO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyVmVyc2lvbihuZXdWZXJzaW9uOiBzdHJpbmcsIG9sZFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB2YWxpZE5ld1ZlcnNpb24gPSBzZW12ZXIudmFsaWQobmV3VmVyc2lvbik7XG4gIGlmICghdmFsaWROZXdWZXJzaW9uKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHNlbXZlci5ndCh2YWxpZE5ld1ZlcnNpb24sIHNlbXZlci52YWxpZChvbGRWZXJzaW9uKSA/PyAnMC4wLjAnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVzV29ya2VyVHlwZXMsIHR5cGUgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHtcbiAgY2xhc3NpZnlXcmFuZ2xlclR5cGVzSW52b2NhdGlvbixcbiAgaXNNYW5hZ2VkR2VuQ29kZVNlZ21lbnQsXG4gIGlzVW5tb2RlbGVkV3JhbmdsZXJUeXBlc1NlZ21lbnQsXG4gIHBhcnNlV3JhbmdsZXJUeXBlc0ludm9jYXRpb24sXG4gIHBvc3RpbnN0YWxsR2VuZXJhdGVzV29ya2VyVHlwZXMsXG4gIHJlYWNoZXNXcmFuZ2xlclR5cGVzLFxuICBzY3JpcHRDaGFuZ2VzV29ya2luZ0RpcmVjdG9yeSxcbiAgc2VsZWN0UHJvamVjdFdyYW5nbGVyVHlwZXNHZW5lcmF0b3IsXG4gIHNwbGl0Q29tbWFuZFNlZ21lbnRzLFxufSBmcm9tICcuLi91dGlscy93cmFuZ2xlclR5cGVzQ29tbWFuZC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuaW1wb3J0IHsgaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5pbXBvcnQgeyBidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgfSBmcm9tICcuL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyB5YXJuTnBtTWluaW1hbEFnZUdhdGUsIHlhcm5OcG1QcmVhcHByb3ZlZFBhY2thZ2VzIH0gZnJvbSAnLi95YXJucmMuanMnO1xuXG5jb25zdCBveGxpbnREZXBzID0gWydAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJywgJ294Zm10JywgJ294bGludCcsICdveGxpbnQtdHNnb2xpbnQnXTtcbmNvbnN0IHR5cGVzY3JpcHREZXBlbmRlbmN5ID0gJ3R5cGVzY3JpcHQnO1xuLy8gVHlwZVNjcmlwdCA3J3MgYHR5cGVzY3JpcHRgIHBhY2thZ2UgaXMgdGhlIHRzZ28gbmF0aXZlIGNvbXBpbGVyIGFuZCBleHBvc2VzIG5vXG4vLyBwcm9ncmFtbWF0aWMgQVBJLiBOZXh0LmpzJ3MgYnVpbGQtdGltZSBgdmVyaWZ5VHlwZVNjcmlwdFNldHVwYCBuZWVkcyB0aGF0IEFQSSwgc29cbi8vIGBuZXh0IGJ1aWxkYCBmYWlscyAoXCJ0cnlpbmcgdG8gdXNlIFR5cGVTY3JpcHQgYnV0IGRvIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBwYWNrYWdlKHMpXCIpXG4vLyB3aXRoIG9ubHkgYHR5cGVzY3JpcHRgIHY3IGluc3RhbGxlZC4gTmV4dC5qcyByZXNvbHZlcyB0aGUgdHNnbyBiaW5hcnkgdGhyb3VnaCB0aGVcbi8vIHNlcGFyYXRlIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgcGFja2FnZSwgc28gTmV4dC5qcy1mYW1pbHkgcmVwb3MgbXVzdCBpbnN0YWxsXG4vLyBib3RoOyBvdGhlciByZXBvcyBvbmx5IG5lZWQgYHR5cGVzY3JpcHRgIGZvciBgdHNjYCB0eXBlY2hlY2tzLlxuY29uc3QgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSA9ICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldyc7XG5jb25zdCB3YkRlcGVuZGVuY3kgPSAnQHdpbGxib29zdGVyL3diJztcbmNvbnN0IGJ1aWxkVHNEZXBlbmRlbmN5ID0gJ2J1aWxkLXRzJztcbmNvbnN0IGxlZnRob29rRGVwZW5kZW5jeSA9ICdsZWZ0aG9vayc7XG5jb25zdCBkZWZhdWx0R2VuSTE4blRzU2NyaXB0ID0gJ2dlbi1pMThuLXRzIC1pIGkxOG4gLW8gc3JjL19fZ2VuZXJhdGVkX18vaTE4bi50cyAtZCBqYS1KUCc7XG5jb25zdCBtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzID0gbmV3IFNldChbXG4gIHdiRGVwZW5kZW5jeSxcbiAgYnVpbGRUc0RlcGVuZGVuY3ksXG4gIGxlZnRob29rRGVwZW5kZW5jeSxcbiAgdHlwZXNjcmlwdERlcGVuZGVuY3ksXG4gIHR5cGVzY3JpcHRHb0RlcGVuZGVuY3ksXG4gICdzb3J0LXBhY2thZ2UtanNvbicsXG4gIC4uLm94bGludERlcHMsXG5dKTtcbmNvbnN0IHdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMgPSBbXG4gICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyxcbiAgLi4ub3hsaW50RGVwcy5maWx0ZXIoKGRlcGVuZGVuY3kpID0+IGRlcGVuZGVuY3kuc3RhcnRzV2l0aCgnQHdpbGxib29zdGVyLycpKSxcbl07XG5jb25zdCBvYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMgPSBbXG4gICdAYmlvbWVqcy9iaW9tZScsXG4gICdAZXNsaW50LXJlYWN0L2VzbGludC1wbHVnaW4nLFxuICAnQGVzbGludC9qcycsXG4gICdAbmV4dC9lc2xpbnQtcGx1Z2luLW5leHQnLFxuICAnQHR5cGVzL2VzbGludCcsXG4gICdAdHlwZXMvbWljcm9tYXRjaCcsXG4gICdAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpbicsXG4gICdAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyJyxcbiAgJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctYmxpdHotbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyxcbiAgJ2Jpb21lJyxcbiAgJ2VzbGludCcsXG4gICdlc2xpbnQtY29uZmlnLWZsYXQtZ2l0aWdub3JlJyxcbiAgJ2VzbGludC1jb25maWctbmV4dCcsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItbm9kZScsXG4gICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLXR5cGVzY3JpcHQnLFxuICAnZXNsaW50LXBsdWdpbi1pbXBvcnQnLFxuICAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsXG4gICdlc2xpbnQtcGx1Z2luLXBlcmZlY3Rpb25pc3QnLFxuICAnZXNsaW50LXBsdWdpbi1wcmV0dGllcicsXG4gICdlc2xpbnQtcGx1Z2luLXJlYWN0JyxcbiAgJ2VzbGludC1wbHVnaW4tcmVhY3QtY29tcGlsZXInLFxuICAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcycsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtY2xhc3MtbWVtYmVycycsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtZGVzdHJ1Y3R1cmUta2V5cycsXG4gICdlc2xpbnQtcGx1Z2luLXN0b3J5Ym9vaycsXG4gICdlc2xpbnQtcGx1Z2luLXVuaWNvcm4nLFxuICAnZXNsaW50LXBsdWdpbi11bnVzZWQtaW1wb3J0cycsXG4gICdnbG9iYWxzJyxcbiAgJ21pY3JvbWF0Y2gnLFxuICAndHlwZXNjcmlwdC1lc2xpbnQnLFxuXTtcbmNvbnN0IG1pY3JvbWF0Y2hQYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsnbWljcm9tYXRjaCcsICdAdHlwZXMvbWljcm9tYXRjaCddKTtcbmNvbnN0IG1pY3JvbWF0Y2hJbXBvcnRQYXR0ZXJuID1cbiAgL1xcYmZyb21cXHMrWydcIl1taWNyb21hdGNoWydcIl18XFxicmVxdWlyZVxcKFxccypbJ1wiXW1pY3JvbWF0Y2hbJ1wiXVxccypcXCl8XFxiaW1wb3J0XFwoXFxzKlsnXCJdbWljcm9tYXRjaFsnXCJdXFxzKlxcKS91O1xuXG5jb25zdCBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbmNvbnN0IG5wbVBhY2thZ2VUaW1lc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG50eXBlIFdyaXRhYmxlUGFja2FnZUpzb24gPSBTZXRSZXF1aXJlZDxcbiAgUGFja2FnZUpzb24sXG4gICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcydcbj47XG5cbmludGVyZmFjZSBEZXBlbmRlbmN5VXBkYXRlcyB7XG4gIGRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIGRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvbk9iaiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG5cbiAgYXdhaXQgcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKGNvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IHVwZGF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqKTtcbiAgbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iaik7XG4gIGNvbnN0IGRlcGVuZGVuY3lVcGRhdGVzID0gYXdhaXQgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihjb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzLCBza2lwQWRkaW5nRGVwcyk7XG4gIGF3YWl0IHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqKTtcbiAgcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaik7XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIC8vIFlhcm4gcmVhZHMgcGFja2FnZS5qc29uIGZyb20gZGlzayBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciBgeWFybiBhZGQgLURgXG4gIC8vIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHJlZ3VsYXIgZGVwZW5kZW5jeSwgc28gdGhpcyB3cml0ZSBtdXN0IGZpbmlzaFxuICAvLyBiZWZvcmUgaW5zdGFsbGluZyB0aGUgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZXMgYmVsb3cuIEtlZXAgdGhpcyBnZW5lcmF0ZWRcbiAgLy8gZmlsZSBzb3J0ZWQgZXZlbiB3aGVuIHdlIGxhdGVyIHJ1biB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBmb3JtYXR0ZXIgc28gYVxuICAvLyBtaWQtcnVuIGludGVycnVwdGlvbiBuZXZlciBsZWF2ZXMgcGFja2FnZS5qc29uIGluIGEgcGFydGlhbGx5IG1hbmFnZWQgb3JkZXIuXG4gIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmopKTtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKGNvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMsIHBhY2thZ2VNYW5hZ2VyKTtcbiAgICBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGZpbGVQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogc3RyaW5nIHtcbiAgLy8gZnNVdGlsLmdlbmVyYXRlRmlsZSgpIG5vcm1hbGl6ZXMgdGhlIHRyYWlsaW5nIG5ld2xpbmUsIHNvIGtlZXAgdGhlIHNlcmlhbGl6ZXJcbiAgLy8gZm9jdXNlZCBvbiB0aGUgSlNPTiBwYXlsb2FkIGl0c2VsZi5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNvcnRQYWNrYWdlSnNvbihqc29uT2JqKSwgdW5kZWZpbmVkLCAyKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFdyaXRhYmxlUGFja2FnZUpzb24+IHtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgcmV0dXJuIGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmVtb3ZlTGVnYWN5SW5zdGFsbENvbW1hbmRzKGpzb25PYmouc2NyaXB0cyk7XG5cbiAganNvbk9iai5zY3JpcHRzID0geyAuLi5qc29uT2JqLnNjcmlwdHMsIC4uLmdlbmVyYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmouc2NyaXB0cykgfTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc3RhcnQtdGVzdC1zZXJ2ZXInXTtcblxuICBjb25zdCBzY3JpcHRzID0ganNvbk9iai5zY3JpcHRzO1xuICBpZiAoY29uZmlnLmlzQnVuIHx8ICFkb2VzQ29udGFpbkphdmEoY29uZmlnKSkge1xuICAgIGRlbGV0ZSBzY3JpcHRzLnByZXR0aWZ5O1xuICB9IGVsc2Uge1xuICAgIHNjcmlwdHMucHJldHRpZnkgPSAoc2NyaXB0cy5wcmV0dGlmeSA/PyAnJykgKyAoYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCkpO1xuICB9XG4gIG5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyhzY3JpcHRzKTtcbiAgbm9ybWFsaXplUmFpbHdheUNsaVNjcmlwdChjb25maWcsIHNjcmlwdHMpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVMZWdhY3lJbnN0YWxsQ29tbWFuZHMoc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAvLyBGcmVzaCByZXBvcyBzdGlsbCByZXF1aXJlIHN0YW5kYWxvbmUgYHlhcm4gaW5zdGFsbGA7IG9ubHkgcmVtb3ZlIGxlZ2FjeSBpbnN0YWxsIHByZWZpeGVzIGJlZm9yZSBhbm90aGVyIGNvbW1hbmQuXG4gICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnZ2l0IGNsb25lJykpIHtcbiAgICAgIHNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoL3lhcm5cXHMqKD86aW5zdGFsbFxccyopPyYmXFxzKi9ndSwgJycpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVQb3N0aW5zdGFsbFNjcmlwdChzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLCB3cmFuZ2xlclR5cGVzOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKHNjcmlwdHNbJ2dlbi1jb2RlJ10pIHtcbiAgICAvLyBLZWVwIHRoZSBwcm9qZWN0J3Mgb3duIHdvcmtlci10eXBlcyBwaXBlbGluZSAocHJlcmVxdWlzaXRlcyBpbmNsdWRlZCDigJQgZS5nLiBgbm9kZSBzY3JpcHRzL3ByZXBhcmVUeXBlcy5qc1xuICAgIC8vICYmIHdyYW5nbGVyIHR5cGVzIC4uLmApIHdoZW4gcmV3cml0aW5nIHBvc3RpbnN0YWxsOiBkcm9wcGluZyBhIHByZXJlcXVpc2l0ZSB3b3VsZCBsZWF2ZSBmcmVzaCBjaGVja291dHNcbiAgICAvLyB1bmFibGUgdG8gcmVnZW5lcmF0ZSB0aGUgZmlsZSwgYW5kIGRyb3BwaW5nIHRoZSBpbnZvY2F0aW9uIGl0c2VsZiAoZS5nLiBgd3JhbmdsZXIgdHlwZXMgLS1jb25maWdcbiAgICAvLyBjb25maWcvd29ya2VyLmpzb25jYCwgd2hpY2ggd2JmeSBkb2VzIG5vdCBtYW5hZ2UsIHBvc3NpYmx5IGJlaGluZCBhIHdyYXBwZXIgc2NyaXB0KSB3b3VsZCBkcm9wIHRoZVxuICAgIC8vIGdlbmVyYXRpb24gZW50aXJlbHkuXG4gICAgY29uc3QgcG9zdGluc3RhbGxTZWdtZW50cyA9IHNjcmlwdHMucG9zdGluc3RhbGwgPyBzcGxpdENvbW1hbmRTZWdtZW50cyhzY3JpcHRzLnBvc3RpbnN0YWxsKSA6IFtdO1xuICAgIGNvbnN0IGludm9sdmVzV3JhbmdsZXJUeXBlcyA9XG4gICAgICByZWFjaGVzV3JhbmdsZXJUeXBlcyhzY3JpcHRzLnBvc3RpbnN0YWxsLCBzY3JpcHRzLCAoKSA9PiB0cnVlKSB8fFxuICAgICAgLy8gU2hlbGwgZm9ybXMgdGhlIHBhcnNlciBjYW5ub3QgbW9kZWwgKGUuZy4gYG5vZGUgc2NyaXB0cy9wcmVwYXJlLmpzOyB3cmFuZ2xlciB0eXBlcyAtLWNvbmZpZyAuLi5gLFxuICAgICAgLy8gYSB3cmFwcGVyIGZvcndhcmRpbmcgYXJndW1lbnRzKSBzdGlsbCBnZW5lcmF0ZSBvbiBpbnN0YWxsIGFuZCBtdXN0IHN1cnZpdmUgdGhlIHJld3JpdGUgdmVyYmF0aW0g4oCUXG4gICAgICAvLyBoZW5jZSBzcGxpdENvbW1hbmRTZWdtZW50cywgd2hpY2ggbmV2ZXIgdHJ1bmNhdGVzIGF0IGEgYGNkYC4gQSBnZW5lcmF0b3IgYmVoaW5kIGEgcmVhbCBgY2RgIHBhcnNlc1xuICAgICAgLy8gaW4gaXNvbGF0aW9uIGJ1dCBydW5zIGVsc2V3aGVyZSwgc28gaXQgY291bnRzIGFzIGludm9sdmVkIHRvby5cbiAgICAgIHBvc3RpbnN0YWxsU2VnbWVudHMuc29tZSgoc2VnbWVudCkgPT4gaXNVbm1vZGVsZWRXcmFuZ2xlclR5cGVzU2VnbWVudChzZWdtZW50LCBzY3JpcHRzKSkgfHxcbiAgICAgIChzY3JpcHRDaGFuZ2VzV29ya2luZ0RpcmVjdG9yeShzY3JpcHRzLnBvc3RpbnN0YWxsID8/ICcnKSAmJlxuICAgICAgICBwb3N0aW5zdGFsbFNlZ21lbnRzLnNvbWUoKHNlZ21lbnQpID0+ICEhcGFyc2VXcmFuZ2xlclR5cGVzSW52b2NhdGlvbihzZWdtZW50KSkpO1xuICAgIGNvbnN0IHByZXNlcnZlZFNlZ21lbnRzID0gaW52b2x2ZXNXcmFuZ2xlclR5cGVzXG4gICAgICA/IHBvc3RpbnN0YWxsU2VnbWVudHMuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50ICE9PSAnJyAmJiAhaXNNYW5hZ2VkR2VuQ29kZVNlZ21lbnQoc2VnbWVudCwgc2NyaXB0cykpXG4gICAgICA6IFtdO1xuICAgIHNjcmlwdHMucG9zdGluc3RhbGwgPSBbJ3diIGdlbi1jb2RlJywgLi4ucHJlc2VydmVkU2VnbWVudHNdLmpvaW4oJyAmJiAnKTtcbiAgfSBlbHNlIGlmIChzY3JpcHRzLnBvc3RpbnN0YWxsPy5pbmNsdWRlcygnZ2VuLWkxOG4tdHMnKSkge1xuICAgIGRlbGV0ZSBzY3JpcHRzLnBvc3RpbnN0YWxsO1xuICB9XG4gIGlmICghd3JhbmdsZXJUeXBlcykgcmV0dXJuO1xuICAvLyBBIFdvcmtlciBwYWNrYWdlIHdpdGhvdXQgYSBnZW4tY29kZSBzY3JpcHQgc3RpbGwgbmVlZHMgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBiZWZvcmUgdHlwZSBjaGVja2luZy5cbiAgLy8gV3JhcHBlciBpbnZvY2F0aW9ucyAoZS5nLiBgXCJwb3N0aW5zdGFsbFwiOiBcInlhcm4gZ2VuOnR5cGVzXCJgKSBhbHJlYWR5IGdlbmVyYXRlIGl0LCBzbyBhZGRpbmcgdGhlIHJlc29sdmVkXG4gIC8vIGNvbW1hbmQgd291bGQgZ2VuZXJhdGUgdGhlIH4xNWstbGluZSBmaWxlIHR3aWNlIHBlciBpbnN0YWxsLiBPbmx5IGEgZ2VuZXJhdGluZyBkZWZhdWx0LW91dHB1dCBpbnZvY2F0aW9uXG4gIC8vIGNvdW50czogYHdyYW5nbGVyIHR5cGVzIC0tY2hlY2tgIG9yIGEgY3VzdG9tIG91dHB1dCBwYXRoIGxlYXZlcyB0aGUgbWFuYWdlZCBmaWxlIGFic2VudCBvbiBhIGZyZXNoIGNsb25lLlxuICBpZiAocG9zdGluc3RhbGxHZW5lcmF0ZXNXb3JrZXJUeXBlcyhzY3JpcHRzKSkgcmV0dXJuO1xuXG4gIC8vIEEgcmVhY2hhYmxlIG5vbi1nZW5lcmF0aW5nIGludm9jYXRpb24gKGUuZy4gYHdyYW5nbGVyIHR5cGVzIC0tY2hlY2tgLCB3aGljaCBmYWlscyB3aGlsZSB0aGUgZ2l0aWdub3JlZCBmaWxlXG4gIC8vIGlzIHN0aWxsIGFic2VudCkgbXVzdCBzZWUgdGhlIGdlbmVyYXRlZCBmaWxlLCBhbmQgYSBkaXJlY3RvcnktY2hhbmdpbmcgcG9zdGluc3RhbGwgKGBjZCAuLi90b29scyAmJiAuLi5gKVxuICAvLyB3b3VsZCBydW4gYW4gYXBwZW5kZWQgZ2VuZXJhdG9yIHNvbWV3aGVyZSBlbHNlIOKAlCBib3RoIG5lZWQgdGhlIGdlbmVyYXRvciBmaXJzdDsgb3RoZXJ3aXNlIGFwcGVuZCB0byBrZWVwXG4gIC8vIHRoZSBwcm9qZWN0J3Mgb3duIG9yZGVyLlxuICBjb25zdCBvbGRQb3N0aW5zdGFsbCA9IHNjcmlwdHMucG9zdGluc3RhbGw7XG4gIHNjcmlwdHMucG9zdGluc3RhbGwgPVxuICAgIG9sZFBvc3RpbnN0YWxsICYmXG4gICAgKHJlYWNoZXNXcmFuZ2xlclR5cGVzKG9sZFBvc3RpbnN0YWxsLCBzY3JpcHRzLCAoKSA9PiB0cnVlKSB8fCBzY3JpcHRDaGFuZ2VzV29ya2luZ0RpcmVjdG9yeShvbGRQb3N0aW5zdGFsbCkpXG4gICAgICA/IGAke3dyYW5nbGVyVHlwZXN9ICYmICR7b2xkUG9zdGluc3RhbGx9YFxuICAgICAgOiBhcHBlbmRXcmFuZ2xlclR5cGVzKG9sZFBvc3RpbnN0YWxsID8/ICcnLCB3cmFuZ2xlclR5cGVzKS5yZXBsYWNlKC9eICYmIC91LCAnJyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHNpbmdsZSBgd3JhbmdsZXIgdHlwZXNgIGNvbW1hbmQgdGhhdCBldmVyeSBtYW5hZ2VkIHNjcmlwdCBtdXN0IHJ1biwgb3IgdW5kZWZpbmVkIHdoZW4gd2JmeSBkb2VzIG5vdFxuICogbWFuYWdlIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgZm9yIHRoZSBwYWNrYWdlLlxuICpcbiAqIFNjYW5uaW5nIGV2ZXJ5IHNjcmlwdCAobm90IGp1c3QgcG9zdGluc3RhbGwpIG1hdHRlcnMgYmVjYXVzZSBwcm9qZWN0cyBrZWVwIHRoZSBmbGFnZ2VkIGludm9jYXRpb24gaW4gYSBzY3JpcHQgb2ZcbiAqIHRoZWlyIG93biwgZS5nLiBgXCJnZW4tdHlwZXNcIjogXCJ3cmFuZ2xlciB0eXBlcyAtLXN0cmljdC12YXJzPWZhbHNlXCJgLiBSZXVzaW5nIGl0IGtlZXBzIHRoZSBkZWNsYXJhdGlvbnMgd2JmeVxuICogcmVnZW5lcmF0ZXMgaWRlbnRpY2FsIHRvIHRoZSBvbmVzIHRoZSBwcm9qZWN0IGludGVuZGVkOiAtLXN0cmljdC12YXJzPWZhbHNlIHdpZGVucyBgdmFyc2AgdG8gc3RyaW5nLCB3aGVyZWFzIHRoZVxuICogZGVmYXVsdCBlbWl0cyBsaXRlcmFsIHVuaW9uIHR5cGVzLiBCb3RoIG1hbmFnZWQgc2NyaXB0cyBnZXQgdGhlIHNhbWUgY29tbWFuZCBzbyB0aGUgZmlsZSBjYW5ub3QgZGVwZW5kIG9uIHdoaWNoIG9mXG4gKiB0aGVtIHJhbiBsYXN0LiBPbmx5IGEgZ2VuZXJhdGluZyBkZWZhdWx0LW91dHB1dCBpbnZvY2F0aW9uIHF1YWxpZmllcyAoc2VlXG4gKiBjbGFzc2lmeVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKTsgYW55dGhpbmcgZWxzZSBmYWxscyBiYWNrIHRvIHRoZSBtYW5hZ2VkIGRlZmF1bHQgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVdyYW5nbGVyVHlwZXNDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZywgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnKSkgcmV0dXJuO1xuXG4gIC8vIE9ubHkgYW4gaW52b2NhdGlvbiBwYXNzaW5nIGZsYWdzIGlzIHdvcnRoIHByZXNlcnZpbmc7IGEgYmFyZSBvbmUgaXMgbm9ybWFsaXplZCB0byB0aGUgbWFuYWdlZCBjb21tYW5kLlxuICBjb25zdCB7IGNvbW1hbmQgfSA9IHNlbGVjdFByb2plY3RXcmFuZ2xlclR5cGVzR2VuZXJhdG9yKHNjcmlwdHMpO1xuICByZXR1cm4gY29tbWFuZCA/PyBgJHtjb25maWcuaXNCdW4gPyAnYnVueCAnIDogJyd9d3JhbmdsZXIgdHlwZXNgO1xufVxuXG4vKipcbiAqIENsb3VkZmxhcmUgV29ya2VycyBwcm9qZWN0cyByZWx5IG9uIGB3cmFuZ2xlciB0eXBlc2AgdG8gKHJlKWdlbmVyYXRlIHRoZSBnaXRpZ25vcmVkIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMuXG4gKiBCZWNhdXNlIGB3YiBnZW4tY29kZWAgZG9lcyBub3QgcHJvZHVjZSBpdCwgYXBwZW5kIHRoZSBjb21tYW5kIHRvIGNvZGUtZ2VuZXJhdGlvbiBzY3JpcHRzOyBvdGhlcndpc2UgYSBmcmVzaFxuICogY2hlY2tvdXQgKGUuZy4gQ0kpIHdvdWxkIGZhaWwgdHlwZSBjaGVja2luZy5cbiAqL1xuZnVuY3Rpb24gYXBwZW5kV3JhbmdsZXJUeXBlcyhzY3JpcHQ6IHN0cmluZywgd3JhbmdsZXJUeXBlczogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKCF3cmFuZ2xlclR5cGVzKSByZXR1cm4gc2NyaXB0O1xuICByZXR1cm4gYCR7c2NyaXB0fSAmJiAke3dyYW5nbGVyVHlwZXN9YDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgLy8gRGVhbCB3aXRoIGJyZWFraW5nIGNoYW5nZXMgaW4geWFybiBiZXJyeSA0LjAuMC1yYy40OVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBzY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKFxuICAgICAgL3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoKD8hXFxzKyg/Oi1BfC1SfC0tKD86YWxsfHJlY3Vyc2l2ZXxzaW5jZXx3b3JrdHJlZXxmcm9tfGluY2x1ZGV8ZXhjbHVkZXxwdWJsaWN8cHJpdmF0ZSkpKS9ndSxcbiAgICAgICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCdcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhaWx3YXlDbGlTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGlmIChjb25maWcuaXNCdW4gfHwgIXNjcmlwdHMucmFpbHdheT8uaW5jbHVkZXMoJ0ByYWlsd2F5L2NsaScpKSByZXR1cm47XG5cbiAgc2NyaXB0cy5yYWlsd2F5ID0gJ1lBUk5fRU5BQkxFX1NDUklQVFM9dHJ1ZSB5YXJuIGRseCBAcmFpbHdheS9jbGknO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTxEZXBlbmRlbmN5VXBkYXRlcz4ge1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG5cbiAgaWYgKFxuICAgIGhhc0phdmEgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyJyk7XG4gIH0gZWxzZSB7XG4gICAgcmVtb3ZlUHJldHRpZXJBcnRpZmFjdHMoanNvbk9iaik7XG4gIH1cblxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIGRlbGV0ZSAoanNvbk9iaiBhcyBQYWNrYWdlSnNvbiAmIHsgJ2xpbnQtc3RhZ2VkJz86IHVua25vd24gfSlbJ2xpbnQtc3RhZ2VkJ107XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuaHVza3k7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcGFjaztcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrO1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2gobGVmdGhvb2tEZXBlbmRlbmN5KTtcblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgaWYgKGRvZXNSZWxlYXNlU2NyaXB0SW5zdGFsbFNlbWFudGljUmVsZWFzZShqc29uT2JqLnNjcmlwdHMucmVsZWFzZSkpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ107XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXVxuICAgICAgKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnZlcnNpb24gPSAnMC4wLjAtc2VtYW50aWNhbGx5LXJlbGVhc2VkJztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgLy8gU2luY2UgYXJ0aWxsZXJ5IHJlcXVpcmVzIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBAcGxheXdyaWdodC90ZXN0XG4gICAgICBjb25zdCBoYXNBcnRpbGxlcnkgPSBqc29uT2JqLmRlcGVuZGVuY2llcy5hcnRpbGxlcnkgfHwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5O1xuICAgICAgLy8gU2luY2UgbGxtLXRvb2xib3ggcmVxdWlyZXMgQHBsYXl3cmlnaHQvdGVzdCBpbiBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICghaGFzQXJ0aWxsZXJ5ICYmICFqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAcGxheXdyaWdodC90ZXN0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0UnVudGltZSkge1xuICAgICAgICAvLyBSdW50aW1lIGltcG9ydHMgbmVlZCB0aGUgc3RhbmRhbG9uZSBwYWNrYWdlIGFmdGVyIERvY2tlciBwcnVuaW5nIHJlbW92ZXMgZGV2RGVwZW5kZW5jaWVzLlxuICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0ID8/PVxuICAgICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz9cbiAgICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddID8/XG4gICAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ3BsYXl3cmlnaHQnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZml4ZXJzL25leHRDb25maWcudHMgZW5hYmxlcyBgcmVhY3RDb21waWxlcjogdHJ1ZWAgZm9yIGV2ZXJ5IE5leHQuanMgcHJvamVjdCwgYW5kIE5leHQuanNcbiAgLy8gcmVzb2x2ZXMgYGJhYmVsLXBsdWdpbi1yZWFjdC1jb21waWxlcmAgYXQgYnVpbGQgdGltZSB3aGVuIFJlYWN0IENvbXBpbGVyIGlzIG9uLiBBZGQgaXQgaGVyZSBzb1xuICAvLyB0aGUgbWFuYWdlZCBuZXh0LmNvbmZpZyBuZXZlciBicmVha3MgYG5leHQgYnVpbGRgIHdpdGggYW4gdW5yZXNvbHZlZC1wYWNrYWdlIGVycm9yLlxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JhYmVsLXBsdWdpbi1yZWFjdC1jb21waWxlcicpO1xuICB9XG5cbiAgaWYgKCFpc1diUGFja2FnZShqc29uT2JqKSkge1xuICAgIGlmIChzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxuICAvLyBidWlsZC10cyBvd25zIFR5cGVTY3JpcHQgZXhlY3V0aW9uIGFuZCBkZWNsYXJhdGlvbiBlbWl0LiB3YmZ5IG11c3QgYWx3YXlzXG4gIC8vIGtlZXAgZXhpc3RpbmcgYnVpbGQtdHMgdXNlcnMgY3VycmVudCBiZWNhdXNlIG9sZGVyIHJlbGVhc2VzIGNhbiBlbWl0IC5kLnRzXG4gIC8vIGZpbGVzIGF0IHBhdGhzIHRoYXQgbm8gbG9uZ2VyIG1hdGNoIHBhY2thZ2UgZXhwb3J0cy5cbiAgaWYgKFxuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIE9iamVjdC52YWx1ZXMoanNvbk9iai5zY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHNjcmlwdD8uaW5jbHVkZXMoYnVpbGRUc0RlcGVuZGVuY3kpKVxuICApIHtcbiAgICBpZiAoc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5veGxpbnREZXBzKTtcbiAgfVxuXG4gIGNvbnN0IHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKSA6IFtdO1xuICBhd2FpdCByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqLCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi50c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlLCBzbyBpdCBpc1xuICAgIC8vIG5vdyB0aGUgbWFuYWdlZCBjb21waWxlciBmb3IgZXZlcnkgVHlwZVNjcmlwdCByZXBvICh0eXBlY2hlY2tpbmcgcnVucyBgdHNjYCkuXG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdERlcGVuZGVuY3kpO1xuICAgIC8vIE5leHQuanMncyBgbmV4dCBidWlsZGAgaW5zcGVjdHMgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCAodHNnbykgdG8gcnVuIGl0cyB0eXBlXG4gICAgLy8gY2hlY2s7IHRoZSBgdHlwZXNjcmlwdGAgdjcgcGFja2FnZSBhbG9uZSBsYWNrcyB0aGUgQVBJIG5leHQgbmVlZHMsIHNvIGtlZXAgYm90aFxuICAgIC8vIGluc3RhbGxlZCBmb3IgTmV4dC5qcy1mYW1pbHkgcmVwb3MuIFNlZSB0aGUgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSBjb21tZW50IGFib3ZlLlxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdEdvRGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9ub2RlJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0cy1qZXN0J10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgICApIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvamVzdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVwZW5kZW5jaWVzOiBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBkZXZEZXBlbmRlbmNpZXM6IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIHB5dGhvbkRldkRlcGVuZGVuY2llcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMsIHB5dGhvbkRldkRlcGVuZGVuY2llcyB9O1xufVxuXG5mdW5jdGlvbiBkb2VzUmVsZWFzZVNjcmlwdEluc3RhbGxTZW1hbnRpY1JlbGVhc2Uoc2NyaXB0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gL1xcYig/OmJ1bnh8bnB4fHBucG1cXHMrZGx4fHlhcm5cXHMrZGx4KVxccytzZW1hbnRpYy1yZWxlYXNlKD86QFxcUyspP1xcYi91LnRlc3Qoc2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5LCBrZWVwQXNSdW50aW1lXSBvZiBbXG4gICAgW3diRGVwZW5kZW5jeSwgc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKV0sXG4gICAgW2J1aWxkVHNEZXBlbmRlbmN5LCBzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iaildLFxuICBdIGFzIGNvbnN0KSB7XG4gICAgaWYgKGtlZXBBc1J1bnRpbWUpIHtcbiAgICAgIGNvbnN0IGRldlZlcnNpb24gPSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghZGV2VmVyc2lvbikgY29udGludWU7XG4gICAgICBjb25zdCBydW50aW1lVmVyc2lvbiA9IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFydW50aW1lVmVyc2lvbiB8fCBpc05ld2VyUGFja2FnZVZlcnNpb24oZGV2VmVyc2lvbiwgcnVudGltZVZlcnNpb24pKSB7XG4gICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gZGV2VmVyc2lvbjtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICB9IGVsc2UgaWYgKGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSB7XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA/Pz0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iajogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgY29uc3QgcG9zdGluc3RhbGxTY3JpcHQgPSBqc29uT2JqLnNjcmlwdHM/LnBvc3RpbnN0YWxsO1xuICByZXR1cm4gdHlwZW9mIHBvc3RpbnN0YWxsU2NyaXB0ID09PSAnc3RyaW5nJyAmJiAvXFxid2JcXGIvdS50ZXN0KHBvc3RpbnN0YWxsU2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmo6IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIGNvbnN0IHByaXNtYSA9IGpzb25PYmoucHJpc21hIGFzIHsgc2VlZD86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMocHJpc21hPy5zZWVkKSB8fCBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKGpzb25PYmouc2NyaXB0cz8uc2VlZCk7XG59XG5cbmZ1bmN0aW9uIGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMoc2VlZENvbW1hbmQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgLy8gUHJvZHVjdGlvbiBEb2NrZXIgaW1hZ2VzIHJ1biBzZWVkIHNjcmlwdHMgYWZ0ZXIgZGV2RGVwZW5kZW5jaWVzIGFyZSBwcnVuZWQsXG4gIC8vIHNvIFR5cGVTY3JpcHQgc2VlZCBydW5uZXJzIG11c3QgcmVtYWluIGF2YWlsYWJsZSBhdCBydW50aW1lLlxuICByZXR1cm4gdHlwZW9mIHNlZWRDb21tYW5kID09PSAnc3RyaW5nJyAmJiAvKD88IVtcXHctXSlidWlsZC10cyg/IVtcXHctXSkvdS50ZXN0KHNlZWRDb21tYW5kKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAganNvbk9iai5wcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWpzb25PYmoubGljZW5zZSkge1xuICAgIGpzb25PYmoubGljZW5zZSA9ICdVTkxJQ0VOU0VEJztcbiAgfVxuICBpZiAoIWpzb25PYmoucHJpdmF0ZSAmJiBqc29uT2JqLmxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJyAmJiByb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZyA/Pz0ge307XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLmFjY2VzcyA/Pz0gJ3B1YmxpYyc7XG4gIH1cbiAgY29uc3QgW293bmVyXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJyB8fCBvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGF3YWl0IG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShjb25maWcsIGpzb25PYmopO1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gWWFybiB0cmVhdHMgdGhlIGxlZ2FjeSBucG0vY2hhbGsgcmVzb2x1dGlvbiBhbGlhcyBhcyBhbiBpbnZhbGlkIHBhY2thZ2UgdG9rZW4uXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBbJ2NsZWFudXAnXSkge1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICAgICAgICBpZiAoIXNjcmlwdCkgY29udGludWU7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdID0gc2NyaXB0LnJlcGxhY2UoLyA/JiYgP3lhcm4gbGludC1maXgoPzogLS1xdWlldCk/LywgJycpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPz8gJ3lhcm4gbGludCAtLWZpeCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCwgY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICBpZiAoanNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID09PSAncG9ldHJ5IGluc3RhbGwnKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHRSdW5uZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2NvbW1vbi9jaS1zZXR1cCddID0gYCR7c2NyaXB0UnVubmVyfSBzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWA7XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5JyA/ICd1dicgOiAncG9ldHJ5J31gXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NldHVwLXBvZXRyeS1hc2RmJ107XG4gICAgICBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YF0gPSBnZXRQeXRob25TZXR1cENvbW1hbmQocHl0aG9uUGFja2FnZU1hbmFnZXIpO1xuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBjb25zdCBweXRob25SdW5uZXIgPSBgJHtweXRob25QYWNrYWdlTWFuYWdlcn0gcnVuYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgJHtweXRob25SdW5uZXJ9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiAke3B5dGhvblJ1bm5lcn0gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSBgJHtzY3JpcHRSdW5uZXJ9IGxpbnRgO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0LCBjb25maWcpO1xuICAgICAgICBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5IHx8IGpzb25PYmoucmVwb3NpdG9yeSkge1xuICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihjb25maWcucmVwb3NpdG9yeSA/PyBqc29uT2JqLnJlcG9zaXRvcnksIGpzb25PYmoucmVwb3NpdG9yeSk7XG4gIH1cblxuICAvLyBSZXNvbHZlZCBiZWZvcmUgdGhlIG1hbmFnZWQgc2NyaXB0cyBhcmUgb3ZlcndyaXR0ZW4sIHNvIGEgcHJvamVjdC1zcGVjaWZpYyBpbnZvY2F0aW9uIGlzIHN0aWxsIHZpc2libGUuXG4gIGNvbnN0IHdyYW5nbGVyVHlwZXMgPSByZXNvbHZlV3JhbmdsZXJUeXBlc0NvbW1hbmQoY29uZmlnLCBqc29uT2JqLnNjcmlwdHMpO1xuICBjb25zdCBnZW5Db2RlU2NyaXB0ID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddO1xuICBpZiAoZ2VuQ29kZVNjcmlwdD8uaW5jbHVkZXMoJ05vIGNvZGUgZ2VuZXJhdGlvbiBuZWVkZWQnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ107XG4gIH0gZWxzZSBpZiAoc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnLCBnZW5Db2RlU2NyaXB0KSkge1xuICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IGFwcGVuZFdyYW5nbGVyVHlwZXMoYCR7Y29uZmlnLmlzQnVuID8gJ2J1biAnIDogJyd9d2IgZ2VuLWNvZGVgLCB3cmFuZ2xlclR5cGVzKTtcbiAgfSBlbHNlIGlmIChcbiAgICBnZW5Db2RlU2NyaXB0ICYmXG4gICAgd3JhbmdsZXJUeXBlcyAmJlxuICAgICFyZWFjaGVzV3JhbmdsZXJUeXBlcyhcbiAgICAgIGdlbkNvZGVTY3JpcHQsXG4gICAgICBqc29uT2JqLnNjcmlwdHMsXG4gICAgICAoaW52b2NhdGlvbkFyZ3MpID0+IGNsYXNzaWZ5V3JhbmdsZXJUeXBlc0ludm9jYXRpb24oaW52b2NhdGlvbkFyZ3MpID09PSAncmV1c2FibGVHZW5lcmF0b3InXG4gICAgKVxuICApIHtcbiAgICAvLyBBIHByb2plY3Qtc3BlY2lmaWMgZ2VuLWNvZGUgbXVzdCBwcm9kdWNlIHRoZSBzYW1lIGRlY2xhcmF0aW9ucyBhcyBwb3N0aW5zdGFsbCwgb3IgcnVubmluZyB0aGUgZG9jdW1lbnRlZFxuICAgIC8vIGNvZGUtZ2VuZXJhdGlvbiBlbnRyeSBwb2ludCB3b3VsZCBsZWF2ZSB0aGUgZ2VuZXJhdGVkIHdvcmtlciB0eXBlcyBzdGFsZS4gTGlrZSB0aGUgcG9zdGluc3RhbGwgcmV3cml0ZSxcbiAgICAvLyBhIHJlYWNoYWJsZSBub24tZ2VuZXJhdGluZyBpbnZvY2F0aW9uIChlLmcuIGB3cmFuZ2xlciB0eXBlcyAtLWNoZWNrYCkgb3IgYSBkaXJlY3RvcnkgY2hhbmdlIG5lZWRzIHRoZVxuICAgIC8vIGdlbmVyYXRvciBmaXJzdC5cbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPVxuICAgICAgcmVhY2hlc1dyYW5nbGVyVHlwZXMoZ2VuQ29kZVNjcmlwdCwganNvbk9iai5zY3JpcHRzLCAoKSA9PiB0cnVlKSB8fCBzY3JpcHRDaGFuZ2VzV29ya2luZ0RpcmVjdG9yeShnZW5Db2RlU2NyaXB0KVxuICAgICAgICA/IGAke3dyYW5nbGVyVHlwZXN9ICYmICR7Z2VuQ29kZVNjcmlwdH1gXG4gICAgICAgIDogYXBwZW5kV3JhbmdsZXJUeXBlcyhnZW5Db2RlU2NyaXB0LCB3cmFuZ2xlclR5cGVzKTtcbiAgfVxuICBub3JtYWxpemVHZW5JMThuVHNTY3JpcHQoY29uZmlnLCBqc29uT2JqKTtcbiAgdXBkYXRlUG9zdGluc3RhbGxTY3JpcHQoanNvbk9iai5zY3JpcHRzLCB3cmFuZ2xlclR5cGVzKTtcblxuICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzLnByZXR0aWVyKSB7XG4gICAgLy8gQmVjYXVzZSBAdHlwZXMvcHJldHRpZXIgYmxvY2tzIHByZXR0aWVyIGV4ZWN1dGlvbi5cbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlcy9wcmV0dGllciddO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2xkR2VuQ29kZVNjcmlwdDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fFxuICAgIGNvbmZpZy5kZXBlbmRpbmcuY2hha3JhIHx8XG4gICAgY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgfHxcbiAgICBjb25maWcuZGVwZW5kaW5nLnByaXNtYSB8fFxuICAgIChjb25maWcuZGVwZW5kaW5nLmRyaXp6bGUgJiYgISFvbGRHZW5Db2RlU2NyaXB0Py5pbmNsdWRlcygnZHJpenpsZS1raXQgY2hlY2snKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoZm9ybWF0U2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIEJ1biBwcm9qZWN0cyBtYXkgbm90IGhhdmUgYSBZYXJuIGxvY2tmaWxlLCBzbyBnZW5lcmF0ZWQgcGFja2FnZSBzY3JpcHRzXG4gIC8vIG11c3QgaW52b2tlIGxvY2FsIHBhY2thZ2Ugc2NyaXB0cyB0aHJvdWdoIHRoZSByZXBvc2l0b3J5J3MgcGFja2FnZSBtYW5hZ2VyLlxuICBjb25zdCBzY3JpcHRSdW5uZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIHJldHVybiBmb3JtYXRTY3JpcHQgPyBgJHtmb3JtYXRTY3JpcHR9ICYmICR7c2NyaXB0UnVubmVyfSBmb3JtYXQtY29kZWAgOiBgJHtzY3JpcHRSdW5uZXJ9IGZvcm1hdC1jb2RlYDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplR2VuSTE4blRzU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIXNob3VsZE1hbmFnZUdlbkkxOG5Ucyhjb25maWcpKSByZXR1cm47XG5cbiAgaWYgKGpzb25PYmouc2NyaXB0c1snZ2VuLWkxOG4tdHMnXSA9PT0gZGVmYXVsdEdlbkkxOG5Uc1NjcmlwdCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1pMThuLXRzJ107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpKSByZXR1cm47XG5cbiAgY29uc3QgY29uZmlnTWpzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5tanMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ01qc1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai50eXBlID0gJ21vZHVsZSc7XG5cbiAgY29uc3QgY29uZmlnRHRzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLnRzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdEdHNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmouZmlsZXMgPSBbLi4ubmV3IFNldChbLi4uKGpzb25PYmouZmlsZXMgPz8gW10pLCAnY29uZmlnLmQubXRzJ10pXTtcbiAgLy8gTm9kZU5leHQgcmVzb2x2ZXMgYSByZWxhdGl2ZSBgLi9jb25maWcubWpzYCBpbXBvcnQgdG8gYGNvbmZpZy5kLm10c2AsIG5vdFxuICAvLyB0aGUgcGFja2FnZS1sZXZlbCBgdHlwZXNgIGZpZWxkLiBLZWVwIHRoZSBwdWJsaXNoZWQgY29uZmlnIGltcG9ydGFibGUgZnJvbVxuICAvLyBwYWNrYWdlLWxvY2FsIFR5cGVTY3JpcHQgbGludGVyIHNldHRpbmdzLlxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC5tdHMnKSwgY29uZmlnRG10c0NvbnRlbnQpKTtcbn1cblxuY29uc3QgY29uZmlnRG10c0NvbnRlbnQgPSBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vY29uZmlnLmpzJztcbmA7XG5cbmZ1bmN0aW9uIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIGNvbmZpZyxcbiAgICBqc29uT2JqLFxuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzLFxuICAgIFsuLi5kZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMsIC4uLmdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyldLFxuICAgIHNraXBBZGRpbmdEZXBzXG4gICk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcF0pO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBjb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMpXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xufVxuXG5mdW5jdGlvbiBnZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcykuZmlsdGVyKChkZXBlbmRlbmN5KSA9PiBtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzLmhhcyhkZXBlbmRlbmN5KSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBqc29uT2JqW2tleV07XG4gICAgaWYgKHNlY3Rpb24gJiYgT2JqZWN0LmtleXMoc2VjdGlvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmosIGtleSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybidcbik6IHZvaWQge1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGRlcGVuZGVuY2llcywgZmFsc2UpO1xuXG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwgZGV2RGVwZW5kZW5jaWVzLCB0cnVlKTtcblxuICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gIGlmIChweXRob25QYWNrYWdlTWFuYWdlciAmJiBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IFsuLi5uZXcgU2V0KGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcyldO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScpIHtcbiAgICAgIHNwYXduU3luYygncG9ldHJ5JywgWydhZGQnLCAnLS1ncm91cCcsICdkZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYygndXYnLCBbJ2FkZCcsICctLWRldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeScgfCAndXYnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykgcmV0dXJuICd1dic7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSByZXR1cm4gJ3BvZXRyeSc7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblNldHVwQ29tbWFuZChwYWNrYWdlTWFuYWdlcjogJ3BvZXRyeScgfCAndXYnKTogc3RyaW5nIHtcbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAndXYnKSByZXR1cm4gJ3V2IHN5bmMgLS1mcm96ZW4nO1xuICByZXR1cm4gJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlICYmIHBvZXRyeSBlbnYgdXNlICQobWlzZSBjdXJyZW50IHB5dGhvbikgJiYgcG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwICYmIHBvZXRyeSBpbnN0YWxsJztcbn1cblxuZnVuY3Rpb24gaW5zdGFsbE5wbURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybicsXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIGRldjogYm9vbGVhblxuKTogdm9pZCB7XG4gIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGVwZW5kZW5jeVNwZWNpZmllcnMgPSBbXG4gICAgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMubWFwKChkZXBlbmRlbmN5KSA9PiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWcsIGRlcGVuZGVuY3kpKSksXG4gIF07XG4gIHNwYXduU3luYyhcbiAgICBwYWNrYWdlTWFuYWdlcixcbiAgICBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksIC4uLihjb25maWcuaXNCdW4gPyBbJy0tZXhhY3QnXSA6IFtdKSwgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLFxuICAgIGNvbmZpZy5kaXJQYXRoXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXBlbmRlbmNpZXNUb0luc3RhbGw6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBuZXcgU2V0KGRlcGVuZGVuY2llcykpIHtcbiAgICBjb25zdCBzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgPSBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICAgICAgY29uZmlnLFxuICAgICAgZGVwZW5kZW5jeSxcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5KSB7XG4gICAgICBkZXBlbmRlbmNpZXNUb0luc3RhbGwucHVzaChkZXBlbmRlbmN5KTtcbiAgICAgIGlmICghc2tpcEFkZGluZ0RlcHMpIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAmJlxuICAgICAgIXNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSAmJlxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gIT09ICcqJ1xuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIGRlcGVuZGVuY3kpO1xuICAgIGlmIChsYXRlc3RWZXJzaW9uID09PSAnKicgJiYgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIGNvbnRpbnVlO1xuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzVG9JbnN0YWxsO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyxcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gIGlmICghcmVsYXRpdmVGaWxlUGF0aCkgcmV0dXJuO1xuXG4gIC8vIFJldXNlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIG93biBmb3JtYXR0ZXIgYWZ0ZXIgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24gc29cbiAgLy8gcGFja2FnZS5qc29uIG1hdGNoZXMgd2hhdGV2ZXIgaXRzIGN1cnJlbnQgc29ydC1wYWNrYWdlLWpzb24gdmVyc2lvbiBleHBlY3RzLlxuICAvLyBUaGlzIGF2b2lkcyBmb2xsb3ctdXAgYXV0b2ZpeCBjb21taXRzIGNhdXNlZCBvbmx5IGJ5IGZvcm1hdHRlciB2ZXJzaW9uIGRyaWZ0XG4gIC8vIGJldHdlZW4gd2JmeSBhbmQgdGhlIHByb2plY3QgYmVpbmcgdXBkYXRlZC5cbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAnYnVuJykge1xuICAgIHNwYXduU3luYygnYnVueCcsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xuICB9IGVsc2Uge1xuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIHJlbW92ZVNlbGZEZXBlbmRlbmN5KGNvbmZpZywganNvbk9iaik7XG4gIHJlcGxhY2VXaWxsQm9vc3RlckNvbmZpZ3NXb3Jrc3BhY2VEZXBlbmRlbmN5UmFuZ2VzKGNvbmZpZywganNvbk9iaik7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwtZm9yLWFpJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnRzbGliO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvdHNjb25maWcnXTtcbiAgLy8gRHJvcCBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgICh0c2dvKSBoZXJlIHNvIG5vbi1OZXh0LmpzIHJlcG9zIG5ldmVyIGNhcnJ5IGl0O1xuICAvLyB0aGlzIHJ1bnMgYmVmb3JlIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucywgd2hpY2ggcmUtYWRkcyBpdCBmb3IgTmV4dC5qcy1mYW1pbHlcbiAgLy8gcmVwb3MgdGhhdCBuZWVkIGl0IGFsb25nc2lkZSB0aGUgYHR5cGVzY3JpcHRgIHY3IHBhY2thZ2UgZm9yIGBuZXh0IGJ1aWxkYC5cbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW3R5cGVzY3JpcHRHb0RlcGVuZGVuY3ldO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbdHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIC8vIE5vbi1UeXBlU2NyaXB0IHJlcG9zIHNob3VsZCBub3Qga2VlcCBhIHN0cmF5IGB0eXBlc2NyaXB0YCBwYWNrYWdlLlxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbdHlwZXNjcmlwdERlcGVuZGVuY3ldO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5sZXJuYTtcbiAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5waW5zdDtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZmx1dHRlci1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWZsdXR0ZXInXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHl0aG9uLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtcHl0aG9uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZXI7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWFsbCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd2ZXJpZnktY29kZSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd2ZXJpZnktY29kZS13aXRoLXRlc3RzJ107XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdsZXJuYS5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gIHJlbW92ZVdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgcmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKGpzb25PYmosIGNvbmZpZyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVNlbGZEZXBlbmRlbmN5KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPlxuKTogdm9pZCB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0ganNvbk9iai5uYW1lIHx8IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuXG4gIC8vIEEgcGFja2FnZSBjYW4gaW1wb3J0IGl0c2VsZiB0aHJvdWdoIE5vZGUncyBwYWNrYWdlIHNlbGYtcmVmZXJlbmNlIHdpdGhvdXRcbiAgLy8gZGVjbGFyaW5nIGl0c2VsZjsga2VlcGluZyB0aGF0IGVkZ2UgYnJlYWtzIG1vbm9yZXBvIHJlbGVhc2UgdG9wb2xvZ2ljYWwgc29ydGluZy5cbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgcGFja2FnZU5hbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaWxsQm9vc3RlckNvbmZpZ3NXb3Jrc3BhY2VEZXBlbmRlbmN5UmFuZ2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeSwgdmVyc2lvbl0gb2YgT2JqZWN0LmVudHJpZXMoc2VjdGlvbikpIHtcbiAgICAgIGlmICghdmVyc2lvbikgY29udGludWU7XG4gICAgICBpZiAoIWlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSh2ZXJzaW9uKSkgY29udGludWU7XG4gICAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyB0aGVzZSBwYWNrYWdlcyBpbmRlcGVuZGVudGx5LCBzbyBnZW5lcmF0ZWRcbiAgICAgIC8vIHBhY2thZ2UgbWV0YWRhdGEgbXVzdCBkZXNjcmliZSBucG0gcmVsZWFzZSBlZGdlcyBpbnN0ZWFkIG9mIGxvY2FsXG4gICAgICAvLyB3b3Jrc3BhY2UgZWRnZXMgdGhhdCByZWxlYXNlIHRvb2xpbmcgdHJlYXRzIGFzIG1vbm9yZXBvIGdyYXBoIGxpbmtzLlxuICAgICAgLy8gVGhlIGZpbmFsIGB5YXJuIGluc3RhbGwgLS1uby1pbW11dGFibGVgIHN5bmNzIHRoZSBsb2NrZmlsZSBhZnRlciB0aGlzXG4gICAgICAvLyBtaWdyYXRpb24sIGV2ZW4gd2hlbiB0aGUgZGVwZW5kZW5jeSBpcyBub3QgcGFydCBvZiB3YmZ5J3MgbWFuYWdlZCBsaXN0LlxuICAgICAgc2VjdGlvbltkZXBlbmRlbmN5XSA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHJldHVybjtcblxuICBjb25zdCBzZWN0aW9ucyA9IGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMpIHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIG93bnMgdGhlc2UgY29uZmlnIHBhY2thZ2VzLiBQYWNrYWdlLWxvY2FsIGZvcm1hdHRlclxuICAgIC8vIGFuZCBsaW50ZXIgY29uZmlnIGZpbGVzIGFyZSByZXBvIHRvb2xpbmcsIG5vdCBwdWJsaXNoZWQgcGFja2FnZSBkYXRhLCBzb1xuICAgIC8vIHRoZSBwYWNrYWdlIG1ldGFkYXRhIG9ubHkgbmVlZHMgdGhlIGZvcm1hdHRlci9saW50ZXIgZXhlY3V0YWJsZXMuXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgdXNlZERlcGVuZGVuY2llczogc3RyaW5nW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1c2VkRGVwZW5kZW5jeVNldCA9IG5ldyBTZXQodXNlZERlcGVuZGVuY2llcyk7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gYXdhaXQgZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAodXNlZERlcGVuZGVuY3lTZXQuaGFzKGRlcGVuZGVuY3kpIHx8IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIGJhc2UtY29uZmlnIHBhY2thZ2VzLiBSZW1vdmUgc3RhbGUgdmFyaWFudHMgd2hlbiByZXBvXG4gICAgLy8gY2FwYWJpbGl0aWVzIGNoYW5nZSwgc3VjaCBhcyBOZXh0LmpzIHRha2luZyBvd25lcnNoaXAgb2YgdHNjb25maWcuanNvbi5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IGZnLmdsb2IoJyoqL3RzY29uZmlnKi5qc29uJywge1xuICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICBjb25zdCBhYnNvbHV0ZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gICAgLy8gVHlwZVNjcmlwdCA3J3MgbmF0aXZlIGNvbXBpbGVyIGRyb3BwZWQgdGhlIGluLXByb2Nlc3MgYHBhcnNlQ29uZmlnRmlsZVRleHRUb0pzb25gXG4gICAgLy8gaGVscGVyLCBzbyBwYXJzZSB0aGUgdHNjb25maWcgaW50byBhbiBBU1QgYW5kIHJlYWQgaXRzIHRvcC1sZXZlbCBgZXh0ZW5kc2AgZGlyZWN0bHkuXG4gICAgY29uc3Qgc291cmNlID0gcGFyc2VTb3VyY2VGaWxlKGFic29sdXRlRmlsZVBhdGgpO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFByZXNlcnZlIG1hbmFnZWQgQHRzY29uZmlnIGRlcGVuZGVuY2llcyBiZWNhdXNlICR7YWJzb2x1dGVGaWxlUGF0aH0gY291bGQgbm90IGJlIHBhcnNlZC5gKTtcbiAgICAgIHJldHVybiBuZXcgU2V0KG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHJlYWRUc2NvbmZpZ0V4dGVuZHMoc291cmNlKSkge1xuICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBkZXBlbmRlbmN5IHx8IHZhbHVlLnN0YXJ0c1dpdGgoYCR7ZGVwZW5kZW5jeX0vYCkpIHtcbiAgICAgICAgICBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXM7XG59XG5cbi8qKiBSZWFkcyB0aGUgdG9wLWxldmVsIGBleHRlbmRzYCBlbnRyaWVzIChhIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzKSBmcm9tIGEgcGFyc2VkIHRzY29uZmlnLiAqL1xuZnVuY3Rpb24gcmVhZFRzY29uZmlnRXh0ZW5kcyhzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogc3RyaW5nW10ge1xuICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgZ2V0VHNjb25maWdSb290UHJvcGVydGllcyhzb3VyY2UpKSB7XG4gICAgaWYgKGFzdC5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgJiYgYXN0LmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSAmJiBwcm9wZXJ0eS5uYW1lLnRleHQgPT09ICdleHRlbmRzJykge1xuICAgICAgY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHZhbHVlcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmZ1bmN0aW9uIGdldFRzY29uZmlnUm9vdFByb3BlcnRpZXMoc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHJlYWRvbmx5IGFzdC5PYmplY3RMaXRlcmFsRWxlbWVudExpa2VbXSB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHNvdXJjZS5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKGFzdC5pc0V4cHJlc3Npb25TdGF0ZW1lbnQoc3RhdGVtZW50KSAmJiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbikpIHtcbiAgICAgIHJldHVybiBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5wcm9wZXJ0aWVzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKG5vZGU6IGFzdC5FeHByZXNzaW9uLCB2YWx1ZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGlmIChhc3QuaXNTdHJpbmdMaXRlcmFsKG5vZGUpKSB7XG4gICAgdmFsdWVzLnB1c2gobm9kZS50ZXh0KTtcbiAgfSBlbHNlIGlmIChhc3QuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG5vZGUuZWxlbWVudHMpIHtcbiAgICAgIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKGVsZW1lbnQsIHZhbHVlcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj5bXSB7XG4gIHJldHVybiBkZXBlbmRlbmN5U2VjdGlvbktleXNcbiAgICAubWFwKChrZXkpID0+IGpzb25PYmpba2V5XSlcbiAgICAuZmlsdGVyKChzZWN0aW9uKTogc2VjdGlvbiBpcyBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+ICEhc2VjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2FjaGVLZXkgPSBgJHtjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJ306JHtkZXBlbmRlbmN5fWA7XG4gIGNvbnN0IGNhY2hlZFZlcnNpb24gPSBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLmdldChjYWNoZUtleSk7XG4gIGlmIChjYWNoZWRWZXJzaW9uKSByZXR1cm4gY2FjaGVkVmVyc2lvbjtcblxuICBjb25zdCB2ZXJzaW9uID0gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGNvbmZpZywgZGVwZW5kZW5jeSk7XG4gIGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuc2V0KGNhY2hlS2V5LCB2ZXJzaW9uKTtcbiAgcmV0dXJuIHZlcnNpb247XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShjb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIHdiZnktbWFuYWdlZCB0b29saW5nIChwcmVhcHByb3ZlZCBwYWNrYWdlcykgYWRvcHRzIHRoZSBsYXRlc3QgcmVsZWFzZSBpbW1lZGlhdGVseSxcbiAgLy8gYnlwYXNzaW5nIHRoZSBtaW5pbXVtLXJlbGVhc2UtYWdlIGdhdGUgYXBwbGllZCB0byB1bnJldmlld2VkIGRlcGVuZGVuY2llcy5cbiAgaWYgKCFzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGNvbmZpZywgZGVwZW5kZW5jeSkpIHtcbiAgICByZXR1cm4gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICB9XG5cbiAgcmV0dXJuIGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSwgZ2V0UGFja2FnZUFnZUdhdGVNcyhjb25maWcpKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcsIHBhY2thZ2VBZ2VHYXRlTXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHRpbWVzID0gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3kpO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBpZiAobGF0ZXN0VmVyc2lvbiAhPT0gJyonICYmIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZSh0aW1lc1tsYXRlc3RWZXJzaW9uXSwgcGFja2FnZUFnZUdhdGVNcykpIHtcbiAgICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHZlcnNpb25zID0gT2JqZWN0LmVudHJpZXModGltZXMpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiBzZW12ZXIudmFsaWQodmVyc2lvbikpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiAoc2VtdmVyLnByZXJlbGVhc2UodmVyc2lvbik/Lmxlbmd0aCA/PyAwKSA9PT0gMClcbiAgICAuZmlsdGVyKChbLCBwdWJsaXNoZWRBdF0pID0+IE51bWJlci5pc0Zpbml0ZShEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSkpXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBub3cgLSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSA+PSBwYWNrYWdlQWdlR2F0ZU1zKVxuICAgIC50b1NvcnRlZCgoW3ZlcnNpb25BXSwgW3ZlcnNpb25CXSkgPT4gc2VtdmVyLnJjb21wYXJlKHZlcnNpb25BLCB2ZXJzaW9uQikpO1xuXG4gIHJldHVybiB2ZXJzaW9uc1swXT8uWzBdID8/ICcqJztcbn1cblxuZnVuY3Rpb24gaXNQdWJsaXNoZWRCZWZvcmVBZ2VHYXRlKHB1Ymxpc2hlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQsIHBhY2thZ2VBZ2VHYXRlTXM6IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAoIXB1Ymxpc2hlZEF0KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHB1Ymxpc2hlZFRpbWUgPSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwdWJsaXNoZWRUaW1lKSAmJiBEYXRlLm5vdygpIC0gcHVibGlzaGVkVGltZSA+PSBwYWNrYWdlQWdlR2F0ZU1zO1xufVxuXG5mdW5jdGlvbiBnZXROcG1QYWNrYWdlVGltZXMoZGVwZW5kZW5jeTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gZGVwZW5kZW5jeS5yZXBsYWNlKC9AW15AL10rJC91LCAnJyk7XG4gIGNvbnN0IGNhY2hlZFRpbWVzID0gbnBtUGFja2FnZVRpbWVzQ2FjaGUuZ2V0KHBhY2thZ2VOYW1lKTtcbiAgaWYgKGNhY2hlZFRpbWVzKSByZXR1cm4gY2FjaGVkVGltZXM7XG5cbiAgY29uc3Qgc3Rkb3V0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICducG0nLFxuICAgIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndGltZScsICctLWpzb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sXG4gICAgcHJvY2Vzcy5jd2QoKVxuICApO1xuICBpZiAoIXN0ZG91dCkgcmV0dXJuIHt9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzdGRvdXQpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgbnBtUGFja2FnZVRpbWVzQ2FjaGUuc2V0KHBhY2thZ2VOYW1lLCBwYXJzZWQpO1xuICAgIHJldHVybiBwYXJzZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHByZWFwcHJvdmVkUGFja2FnZXMgPSBjb25maWcuaXNCdW4gPyBidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzIDogeWFybk5wbVByZWFwcHJvdmVkUGFja2FnZXM7XG4gIHJldHVybiAhcHJlYXBwcm92ZWRQYWNrYWdlcy5zb21lKChwYXR0ZXJuKSA9PiBkb2VzUGFja2FnZVBhdHRlcm5NYXRjaChwYXR0ZXJuLCBkZXBlbmRlbmN5KSk7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2thZ2VBZ2VHYXRlTXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogbnVtYmVyIHtcbiAgaWYgKGNvbmZpZy5pc0J1bikgcmV0dXJuIGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyAqIDEwMDA7XG5cbiAgY29uc3QgbWF0Y2hlZCA9IC9eKD88ZGF5cz5cXGQrKWQkL3UuZXhlYyh5YXJuTnBtTWluaW1hbEFnZUdhdGUpO1xuICByZXR1cm4gTnVtYmVyKG1hdGNoZWQ/Lmdyb3Vwcz8uZGF5cyA/PyAwKSAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG59XG5cbmZ1bmN0aW9uIGRvZXNQYWNrYWdlUGF0dGVybk1hdGNoKHBhdHRlcm46IHN0cmluZywgZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwYXR0ZXJuID09PSBkZXBlbmRlbmN5KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFwYXR0ZXJuLmluY2x1ZGVzKCcqJykpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlc2NhcGVkUGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZUFsbCgvWy4rP14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApLnJlcGxhY2VBbGwoJyonLCAnLionKTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRQYXR0ZXJufSRgLCAndScpLnRlc3QoZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCducG0nLCBbJ3Nob3cnLCBkZXBlbmRlbmN5LCAndmVyc2lvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSwgcHJvY2Vzcy5jd2QoKSkgfHwgJyonO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChkZXBlbmRlbmN5ID09PSB3YkRlcGVuZGVuY3kpIHJldHVybiBgJHtkZXBlbmRlbmN5fUAke2dldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgZGVwZW5kZW5jeSl9YDtcbiAgcmV0dXJuIGRlcGVuZGVuY3k7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU9ic29sZXRlTGludERlcGVuZGVuY2llcyhcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+LFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IHZvaWQge1xuICBjb25zdCBwcmVzZXJ2ZU1pY3JvbWF0Y2ggPSBzaG91bGRQcmVzZXJ2ZU1pY3JvbWF0Y2goY29uZmlnKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG9ic29sZXRlTGludERlcGVuZGVuY2llcykge1xuICAgIGlmIChwcmVzZXJ2ZU1pY3JvbWF0Y2ggJiYgbWljcm9tYXRjaFBhY2thZ2VOYW1lcy5oYXMoZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIGlmIChzaG91bGRQcmVzZXJ2ZUNvbmZpZ1BhY2thZ2VMaW50RGVwZW5kZW5jeShqc29uT2JqLCBjb25maWcsIGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkUHJlc2VydmVDb25maWdQYWNrYWdlTGludERlcGVuZGVuY3koXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPixcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmN5OiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAoIWlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIHJldHVybiB0cnVlO1xuXG4gIC8vIFB1Ymxpc2hlZCBjb25maWcgcGFja2FnZXMgbmVlZCBsb2NhbCB0eXBlLW9ubHkgZGVwcyB0byB2YWxpZGF0ZSB0aGVcbiAgLy8gcGFja2FnZS1wcm92aWRlZCBjb25maWcgZGVjbGFyYXRpb25zIHVuZGVyIFlhcm4gUG5QLlxuICByZXR1cm4gZGVwZW5kZW5jeSA9PT0gJ0B0eXBlcy9lc2xpbnQnICYmICEhanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzLmVzbGludDtcbn1cblxuZnVuY3Rpb24gc2hvdWxkUHJlc2VydmVNaWNyb21hdGNoKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHN1YnBhY2thZ2VzIHB1Ymxpc2ggY29uZmlnIGZpbGVzIGFzIHRoZWlyIHByb2R1Y3QsIHNvXG4gIC8vIG1pY3JvbWF0Y2ggaXMgcGFja2FnZSBkYXRhIHRoZXJlLiBPdGhlciByZXBvcyBrZWVwIG1pY3JvbWF0Y2ggb25seSB3aGVuXG4gIC8vIHByb2R1Y3QgY29kZSBpbXBvcnRzIGl0OyBvdGhlcndpc2UgaXQgaXMgdHJlYXRlZCBhcyBvYnNvbGV0ZSBFU0xpbnQtZXJhXG4gIC8vIHRvb2xpbmcuXG4gIHJldHVybiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmICFjb25maWcuaXNSb290KSB8fCBkb2VzUHJvZHVjdENvZGVJbXBvcnRNaWNyb21hdGNoKGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gZG9lc1Byb2R1Y3RDb2RlSW1wb3J0TWljcm9tYXRjaChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZmlsZVBhdGhzID0gZmcuZ2xvYlN5bmMoJ3NyYy8qKi8qLntqcyxqc3gsbWpzLGNqcyx0cyx0c3gsbXRzLGN0c30nLCB7XG4gICAgY3dkOiBkaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuICByZXR1cm4gZmlsZVBhdGhzLnNvbWUoKGZpbGVQYXRoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtaWNyb21hdGNoSW1wb3J0UGF0dGVybi50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZVBhdGgpLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY3k6IHN0cmluZyxcbiAgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIGlmICghY3VycmVudFZlcnNpb24pIHJldHVybiB0cnVlO1xuICBpZiAoY3VycmVudFZlcnNpb24gPT09ICcqJykgcmV0dXJuIHRydWU7XG4gIGlmIChpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UoY3VycmVudFZlcnNpb24pKSByZXR1cm4gdHJ1ZTtcbiAgLy8gd2JmeSBvd25zIHRoZXNlIHRvb2wgZGVwZW5kZW5jaWVzLCBidXQgYXBwbHlpbmcgd2JmeSBzaG91bGQgbm90IGRvd25ncmFkZSBhXG4gIC8vIHJlcG9zaXRvcnkgdGhhdCBhbHJlYWR5IHBpbnMgYSBuZXdlciByZXZpZXdlZCByZWxlYXNlLlxuICByZXR1cm4gbWFuYWdlZERlcGVuZGVuY3lOYW1lcy5oYXMoZGVwZW5kZW5jeSkgJiYgaXNOZXdlck1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIGRlcGVuZGVuY3ksIGN1cnJlbnRWZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNOZXdlck1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZywgY3VycmVudFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgcmV0dXJuIGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihsYXRlc3RWZXJzaW9uLCBjdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihjYW5kaWRhdGVWZXJzaW9uOiBzdHJpbmcsIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdmFsaWRMYXRlc3RWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGNhbmRpZGF0ZVZlcnNpb24pO1xuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgcmV0dXJuICF2YWxpZExhdGVzdFZlcnNpb24gfHwgIXZhbGlkQ3VycmVudFZlcnNpb24gfHwgc2VtdmVyLmd0KHZhbGlkTGF0ZXN0VmVyc2lvbiwgdmFsaWRDdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSh2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcnNpb24uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/KSg/OlxcLmdpdCk/JC91LmV4ZWMocmVwb3NpdG9yeVVybCk7XG4gIGlmICghbWF0Y2hlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IFssIG93bmVyLCByZXBvXSA9IG1hdGNoZWQ7XG4gIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgbm9ybWFsaXplZFVybDogc3RyaW5nLFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3QgcmVwb3NpdG9yeU9iaiA9XG4gICAgdHlwZW9mIHJlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICA/IHJlcG9zaXRvcnlcbiAgICAgIDogdHlwZW9mIGV4aXN0aW5nUmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBleGlzdGluZ1JlcG9zaXRvcnlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXBvc2l0b3J5T2JqLFxuICAgIHR5cGU6ICdnaXQnLFxuICAgIHVybDogbm9ybWFsaXplZFVybCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIC8vIE5vIGAtLWJ1bmA6IGl0cyBub2RlLT5idW4gUEFUSCBzaGltIGxlYWtzIGludG8gZXZlcnkgY2hpbGQgcHJvY2VzcyBhbmQgYnJlYWtzIHRvb2xzXG4gICAgICAvLyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KS5cbiAgICAgIGNsZWFudXA6ICdidW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gd2IgdHlwZWNoZWNrJyxcbiAgICAgIHZlcmlmeTogJ2J1biB3YiB2ZXJpZnknLFxuICAgICAgJ3ZlcmlmeS1mdWxsJzogJ2J1biB3YiB2ZXJpZnkgLS1mdWxsJyxcbiAgICB9O1xuICAgIGFwcGx5RGF0YWJhc2VTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgYGJ1biAke2dldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZyl9YCk7XG4gICAgYXBwbHlNaXNlVGFza1NjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ2J1aWxkJywgJ2RldicsICdzdGFydCcsICd0ZXN0JywgJ3R5cGVjaGVjayddKTtcbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAnICYmIHB5cmlnaHQnO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG4gICAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuICAgIGNvbnN0IG9sZFRlc3QgPSBvbGRTY3JpcHRzLnRlc3Q7XG4gICAgbGV0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBjbGVhbnVwOiAneWFybiBmb3JtYXQgJiYgeWFybiBsaW50LWZpeCcsXG4gICAgICBmb3JtYXQ6IGdlbmVyYXRlRm9ybWF0U2NyaXB0KGhhc0pzT3JUcywgaGFzSmF2YSksXG4gICAgICAvLyBQYWNrYWdlLWxvY2FsIGNvbmZpZ3MgbXVzdCBkZWxldGUgdGhlIHJvb3Qtb25seSB0eXBlLWF3YXJlIG9wdGlvbnMsIHNvIHBhc3MgdGhlIGZsYWdzXG4gICAgICAvLyBleHBsaWNpdGx5LiBPdGhlcndpc2UgdGhpcyBzY3JpcHQgd291bGQgc2lsZW50bHkgc2tpcCB0eXBlIGNoZWNraW5nIGluIHdvcmtzcGFjZSBwYWNrYWdlcy5cbiAgICAgIGxpbnQ6IGBveGxpbnQke2hhc1R5cGVjaGVjayA/ICcgLS10eXBlLWF3YXJlIC0tdHlwZS1jaGVjaycgOiAnJ30gLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAuYCxcbiAgICAgICdsaW50LWZpeCc6ICd5YXJuIGxpbnQgLS1maXgnLFxuICAgICAgJ2Zvcm1hdC1jb2RlJzogYG94Zm10IC0td3JpdGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAuICchKiovcGFja2FnZS5qc29uJ2AsXG4gICAgICB0eXBlY2hlY2s6ICd0c2MgLS1ub0VtaXQnLFxuICAgIH07XG4gICAgaWYgKGhhc0phdmEpIHtcbiAgICAgIHNjcmlwdHMucHJldHRpZnkgPSBgcHJldHRpZXIgLS1jYWNoZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXJPbmx5LmpvaW4oJywnKX19XCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIHNjcmlwdHMgPSBtZXJnZShcbiAgICAgICAgeyAuLi5zY3JpcHRzIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmb3JtYXQ6IGAke3NjcmlwdHMuZm9ybWF0fSAmJiB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gZm9ybWF0YCxcbiAgICAgICAgICBsaW50OiBgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnRgLFxuICAgICAgICAgICdsaW50LWZpeCc6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludC1maXgnLFxuICAgICAgICAgIC8vIENJPTEgcHJldmVudHMgdml0ZXN0IGZyb20gZW5hYmxpbmcgd2F0Y2guIENvbG9yIHBvbGljeSBiZWxvbmdzIHRvIHdiLCBub3QgZ2VuZXJhdGVkIHBhY2thZ2Ugc2NyaXB0cy5cbiAgICAgICAgICB0ZXN0OiAnQ0k9MSB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXZlcmJvc2UgcnVuIHRlc3QnLFxuICAgICAgICAgIHR5cGVjaGVjazogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biB0eXBlY2hlY2snLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKGhhc0phdmEpIHtcbiAgICAgICAgc2NyaXB0cy5wcmV0dGlmeSA9IGBwcmV0dGllciAtLWNhY2hlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkuam9pbihcbiAgICAgICAgICAnLCdcbiAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgIH1cbiAgICBpZiAoIWhhc0pzT3JUcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ107XG4gICAgICBkZWxldGUgc2NyaXB0cy5saW50O1xuICAgICAgZGVsZXRlIHNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgfVxuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLndiKSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9ICd3YiB0eXBlY2hlY2snO1xuICAgIH1cbiAgICBpZiAoaXNXYlBhY2thZ2UoY29uZmlnLnBhY2thZ2VKc29uKSkge1xuICAgICAgc2NyaXB0cy52ZXJpZnkgPSBvbGRTY3JpcHRzLnZlcmlmeSA/PyAneWFybiB3b3Jrc3BhY2UgQHdpbGxib29zdGVyL3diIHN0YXJ0IC0td29ya2luZy1kaXIgXCIkSU5JVF9DV0RcIiB2ZXJpZnknO1xuICAgICAgc2NyaXB0c1sndmVyaWZ5LWZ1bGwnXSA9IG9sZFNjcmlwdHNbJ3ZlcmlmeS1mdWxsJ10gPz8gJ3lhcm4gdmVyaWZ5IC0tZnVsbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMudmVyaWZ5ID0gJ3diIHZlcmlmeSc7XG4gICAgICBzY3JpcHRzWyd2ZXJpZnktZnVsbCddID0gJ3diIHZlcmlmeSAtLWZ1bGwnO1xuICAgIH1cbiAgICBhcHBseURhdGFiYXNlU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIGdldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZykpO1xuICAgIGFwcGx5TWlzZVRhc2tTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgWydidWlsZCcsICdkZXYnLCAnc3RhcnQnLCAndGVzdCcsICd0eXBlY2hlY2snXSk7XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkTWFuYWdlR2VuSTE4blRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdpMThuJykpO1xufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICB3YkRiQ29tbWFuZDogc3RyaW5nXG4pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSByZXR1cm47XG5cbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItY3JlYXRlLW1pZ3JhdGlvbicsIGAke3diRGJDb21tYW5kfSBtaWdyYXRlLWRldmApO1xuICBhcHBseURhdGFiYXNlU2NyaXB0KHNjcmlwdHMsIG9sZFNjcmlwdHMsICdkYi1taWdyYXRlJywgYCR7d2JEYkNvbW1hbmR9IG1pZ3JhdGUgLS1jaGVjay1pZGVtcG90ZW5jeWApO1xuICBhcHBseURhdGFiYXNlU2NyaXB0KHNjcmlwdHMsIG9sZFNjcmlwdHMsICdkYi12aWV3JywgYCR7d2JEYkNvbW1hbmR9IHN0dWRpb2ApO1xufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0KFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lOiBzdHJpbmcsXG4gIGdlbmVyYXRlZFNjcmlwdDogc3RyaW5nXG4pOiB2b2lkIHtcbiAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1tuYW1lXTtcbiAgLy8gU29tZSByZXBvc2l0b3JpZXMgd3JhcCBtaWdyYXRpb24gY29tbWFuZHMgdG8gcHJlcGFyZSBTUUxpdGUgZGlyZWN0b3JpZXMsXG4gIC8vIGZhbiBvdXQgb3ZlciB0ZW5hbnRzLCBvciBwZXJmb3JtIGNsZWFudXAgdGhhdCB3YiBjYW5ub3QgaW5mZXIgZ2VuZXJpY2FsbHkuXG4gIHNjcmlwdHNbbmFtZV0gPSBvbGRTY3JpcHQgJiYgIWlzR2VuZXJhdGVkRGF0YWJhc2VTY3JpcHQob2xkU2NyaXB0KSA/IG9sZFNjcmlwdCA6IGdlbmVyYXRlZFNjcmlwdDtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWREYXRhYmFzZVNjcmlwdChzY3JpcHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL1xcYndiXFxzKyg/OmRifHByaXNtYSlcXGIvdS50ZXN0KHNjcmlwdCk7XG59XG5cbmZ1bmN0aW9uIGdldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICd3YiBkYicgfCAnd2IgcHJpc21hJyB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkgcmV0dXJuICd3YiBwcmlzbWEnO1xuICByZXR1cm4gJ3diIGRiJztcbn1cblxuZnVuY3Rpb24gaXNXYlBhY2thZ2UocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYWNrYWdlSnNvbj8ubmFtZSA9PT0gd2JEZXBlbmRlbmN5O1xufVxuXG5mdW5jdGlvbiBhcHBseU1pc2VUYXNrU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lczogc3RyaW5nW11cbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAoIWhhc01pc2VUYXNrKGNvbmZpZywgbmFtZSkpIGNvbnRpbnVlO1xuICAgIGlmIChkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICAvLyBQcmVzZXJ2ZSBhIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudiBwcmVmaXggKGUuZy4gYE1JU0VfRU5WPXRlc3RgKSBvbiBhbiBleGlzdGluZyBtaXNlIGJyaWRnZS5cbiAgICAvLyBTdWNoIGEgcHJlZml4IGlzIHJlcXVpcmVkIGZvciBtaXNlIGNvbmZpZyBlbnZpcm9ubWVudHMgKG1pc2UuPE1JU0VfRU5WPi50b21sKSwgd2hpY2ggYXJlXG4gICAgLy8gc2VsZWN0ZWQgZnJvbSBNSVNFX0VOViAqYmVmb3JlKiBtaXNlIHN0YXJ0cyBhbmQgY2Fubm90IGJlIHN3aXRjaGVkIGZyb20gaW5zaWRlIGEgdGFzazsgZHJvcHBpbmdcbiAgICAvLyBpdCB3b3VsZCBzaWxlbnRseSBydW4gdGhlIHRhc2sgaW4gdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQuXG4gICAgY29uc3QgZW52UHJlZml4ID0gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgob2xkU2NyaXB0c1tuYW1lXSwgbmFtZSk7XG4gICAgaWYgKGVudlByZWZpeCA9PT0gdW5kZWZpbmVkICYmIG9sZFNjcmlwdHNbbmFtZV0gJiYgIShuYW1lIGluIHNjcmlwdHMpKSBjb250aW51ZTtcbiAgICBzY3JpcHRzW25hbWVdID0gYCR7ZW52UHJlZml4ID8/ICcnfW1pc2UgcnVuICR7bmFtZX1gO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGVhZGluZyBgS0VZPVZBTFVFIGAgZW52LXZhciBwcmVmaXggb2YgYW4gZXhpc3RpbmcgYG1pc2UgcnVuIDxuYW1lPmAgYnJpZGdlIHNjcmlwdFxuICogKHBvc3NpYmx5IGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBicmlkZ2UgaGFzIG5vIHByZWZpeCksIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHNjcmlwdCBpcyBub3QgYVxuICogbWlzZSBicmlkZ2UgZm9yIHRoZSBnaXZlbiB0YXNrLlxuICovXG5mdW5jdGlvbiBleHRyYWN0TWlzZUJyaWRnZUVudlByZWZpeChzY3JpcHQ6IHVua25vd24sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gRWFjaCBhc3NpZ25tZW50IHZhbHVlIG1heSBiZSBkb3VibGUtcXVvdGVkLCBzaW5nbGUtcXVvdGVkLCBvciBhbiB1bnF1b3RlZCBydW4gb2Ygbm9uLXdoaXRlc3BhY2UsXG4gIC8vIHNvIHByZWZpeGVzIGxpa2UgYE1JU0VfRU5WPVwiYSBiXCJgICh3aG9zZSB2YWx1ZSBjb250YWlucyBzcGFjZXMpIGFyZSBtYXRjaGVkIGluc3RlYWQgb2YgZHJvcHBlZC5cbiAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXigoPzpcXHcrPSg/OlwiW15cIl0qXCJ8J1teJ10qJ3xcXFMrKVxccyspKiltaXNlIHJ1biAke2VzY2FwZVJlZ0V4cChuYW1lKX0kYCwgJ3UnKS5leGVjKFxuICAgIHNjcmlwdC50cmltKClcbiAgKTtcbiAgcmV0dXJuIG1hdGNoPy5bMV07XG59XG5cbmZ1bmN0aW9uIGhhc01pc2VUYXNrKGNvbmZpZzogUGFja2FnZUNvbmZpZywgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QuaGFzT3duKGNvbmZpZy5taXNlVGFza3MsIG5hbWUpO1xufVxuXG5mdW5jdGlvbiBkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0YXNrID0gY29uZmlnLm1pc2VUYXNrc1tuYW1lXTtcbiAgaWYgKCF0YXNrKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VycyA9IFsnYnVuJywgJ3lhcm4nLCAnbnBtJywgJ3BucG0nXTtcbiAgcmV0dXJuIHBhY2thZ2VNYW5hZ2Vycy5zb21lKChwYWNrYWdlTWFuYWdlcikgPT5cbiAgICBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXFxiJHtwYWNrYWdlTWFuYWdlcn1cXHMrKD86cnVuXFxzKyk/JHtlc2NhcGVSZWdFeHAobmFtZSl9KD8hW2EtekEtWjAtOV9cXC06Ll0pYCwgJ3UnKS50ZXN0KHRhc2spXG4gICk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVGb3JtYXRTY3JpcHQoaGFzSnNPclRzOiBib29sZWFuLCBoYXNKYXZhOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgY29tbWFuZHMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGlmIChoYXNKc09yVHMpIHtcbiAgICBjb21tYW5kcy5wdXNoKCd5YXJuIGZvcm1hdC1jb2RlJyk7XG4gIH1cbiAgaWYgKGhhc0phdmEpIHtcbiAgICBjb21tYW5kcy5wdXNoKCd5YXJuIHByZXR0aWZ5Jyk7XG4gIH1cbiAgcmV0dXJuIGNvbW1hbmRzLmpvaW4oJyAmJiAnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpLmNhdGNoKCgpID0+ICcnKTtcbiAgY29uc3QgaW5kZXggPSBleGlzdGluZ0NvbnRlbnQuaW5kZXhPZihpZ25vcmVGaWxlVXRpbC5zZXBhcmF0b3JQcmVmaXgpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZXhpc3RpbmdDb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgY29uc3QgbGluZXMgPSBvcmlnaW5hbENvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgcmV0dXJuIG5ld0xpbmUuZW5kc1dpdGgoJy8nKSA/IG5ld0xpbmUuc2xpY2UoMCwgLTEpIDogbmV3TGluZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGwpID0+IGwgJiYgIWwuc3RhcnRzV2l0aCgnIycpICYmICFsLmluY2x1ZGVzKCcvJykpO1xuXG4gIHJldHVybiBgJHtsaW5lcy5tYXAoKGxpbmUpID0+IGAgXCIhKiovJHtsaW5lfS8qKlwiYCkuam9pbignJyl9IHx8IHRydWVgO1xufVxuXG5mdW5jdGlvbiByZW1vdmVQcmV0dGllckFydGlmYWN0cyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBqc29uT2JqLnByZXR0aWVyO1xuICBjb25zdCBkZXBlbmRlbmN5U2VjdGlvbnM6IEFycmF5PFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gfCB1bmRlZmluZWQ+ID0gW1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLFxuICAgIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyxcbiAgXTtcbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGRlcGVuZGVuY3lTZWN0aW9ucykge1xuICAgIGlmICghc2VjdGlvbikgY29udGludWU7XG4gICAgZGVsZXRlIHNlY3Rpb24ucHJldHRpZXI7XG4gICAgZGVsZXRlIHNlY3Rpb25bJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJ107XG4gICAgZGVsZXRlIHNlY3Rpb25bJ3ByZXR0aWVyLXBsdWdpbi1wcmlzbWEnXTtcbiAgICBkZWxldGUgc2VjdGlvblsnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyddO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2F1dGgnLCByZXBvOiAnYXV0aCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQGRpc2NvcmQtYm90L3NoYXJlZCcsIHJlcG86ICdkaXNjb3JkLWJvdCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCByZXBvOiAnY29kZS1hbmFseXplcicsIHRhcmdldDogJ2RldkRlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2p1ZGdlJywgcmVwbzogJ2p1ZGdlJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IHBhY2thZ2VOYW1lLCByZXBvLCB0YXJnZXQgfSkgPT4ge1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSB8fCBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgcGFja2FnZU5hbWUpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gdGFyZ2V0ID09PSAnZGVwZW5kZW5jaWVzJyA/ICdkZXZEZXBlbmRlbmNpZXMnIDogJ2RlcGVuZGVuY2llcyc7XG4gICAgICAvLyBUaGUgbGludCBydWxlIGRpc2FsbG93cyBgZGVsZXRlYCB3aXRoIGNvbXB1dGVkIHBhY2thZ2UgbmFtZXM7IFJlZmxlY3QgaGFzIHRoZSBzYW1lIGRlbGV0aW9uIHNlbWFudGljcyBoZXJlLlxuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqW290aGVyVGFyZ2V0XSwgcGFja2FnZU5hbWUpO1xuICAgICAganNvbk9ialt0YXJnZXRdW3BhY2thZ2VOYW1lXSA9IGF3YWl0IGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG8pO1xuICAgIH0pXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsIHJlcG8pO1xuICByZXR1cm4gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiLyR7cmVwb30uZ2l0IyR7Y29tbWl0SGFzaH1gO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBkdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2V0R2VuSTE4blRzQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2dlbkkxOG5Ucy5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuaW50ZXJmYWNlIExlZnRob29rU2V0dGluZ3Mge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJztcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG59XG5cbmludGVyZmFjZSBMZWZ0aG9va0pvYiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZ2xvYj86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICBzY3JpcHQ/OiBzdHJpbmc7XG4gIHJ1bm5lcj86ICdiYXNoJztcbiAgc3RhZ2VfZml4ZWQ/OiB0cnVlO1xufVxuXG5jb25zdCBiYXNlU2V0dGluZ3M6IE9taXQ8TGVmdGhvb2tTZXR0aW5ncywgJ3ByZS1jb21taXQnPiA9IHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3RhcicsXG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3ByZXBhcmUnLFxuICAgICAgICBzY3JpcHQ6ICdwcmVwYXJlLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdjaGVjaycsXG4gICAgICAgIHNjcmlwdDogJ2NoZWNrLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG5jb25zdCBwcmVDb21taXRTZXR0aW5nczogTGVmdGhvb2tTZXR0aW5nc1sncHJlLWNvbW1pdCddID0ge1xuICBqb2JzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2NsZWFudXAnLFxuICAgICAgZ2xvYjogJycsXG4gICAgICBydW46ICcnLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnY2hlY2stbWlncmF0aW9ucycsXG4gICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICBydW46IGBcbmZhaWxlZD0wXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbmZvciBmaWxlIGluIHtzdGFnZWRfZmlsZXN9OyBkb1xuICBpZiBncmVwIC1xICdXYXJuaW5nczonIFwiJGZpbGVcIjsgdGhlblxuICAgIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGUgKCRmaWxlKSBjb250YWlucyB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gICAgZmFpbGVkPTFcbiAgZmlcbmRvbmVcbmV4aXQgXCIkZmFpbGVkXCJcbmAudHJpbSgpLFxuICAgIH0sXG4gIF0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwb3N0TWVyZ2U6IGBcbiMhL2Jpbi9iYXNoXG5cbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IGh1c2t5RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreScpO1xuICBjb25zdCBoYXNIdXNreURpciA9IGZzLmV4aXN0c1N5bmMoaHVza3lEaXJQYXRoKTtcbiAgY29uc3QgeyBsaW50IH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCB7fSk7XG4gIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPExlZnRob29rU2V0dGluZ3M+ID0ge1xuICAgIC4uLmJhc2VTZXR0aW5ncyxcbiAgICAncHJlLWNvbW1pdCc6IHtcbiAgICAgIGpvYnM6IGdldFByZUNvbW1pdEpvYnMoY29uZmlnKSxcbiAgICB9LFxuICB9O1xuICBpZiAoIWxpbnQpIHtcbiAgICBkZWxldGUgc2V0dGluZ3NbJ3ByZS1wdXNoJ107XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShcbiAgICAgIHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2xlZnRob29rLnltbCcpLFxuICAgICAgeWFtbC5kdW1wKHNldHRpbmdzLCB7XG4gICAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgICAgc3R5bGVzOiB7XG4gICAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcbiAgaWYgKGhhc0h1c2t5RGlyKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZnMucHJvbWlzZXMucm0oaHVza3lEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSksXG4gICAgXSk7XG4gICAgc3Bhd25TeW5jKCdnaXQnLCBbJ2NvbmZpZycsICctLXVuc2V0JywgJ2NvcmUuaG9va3NQYXRoJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChsaW50KSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBsZXQgbGludENvbW1hbmQ6IHN0cmluZztcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIC8vIEJ1biByZXBvcyByZWNlaXZlIHdiIGFzIHBhcnQgb2Ygd2JmeSdzIG1hbmFnZWQgdG9vbGNoYWluLCBzbyBnZW5lcmF0ZSB0aGVcbiAgICAvLyBmaW5hbCBob29rIGNvbW1hbmQgb24gdGhlIGZpcnN0IHJ1biBpbnN0ZWFkIG9mIGNoYW5naW5nIGl0IG9uIHRoZSBzZWNvbmQuXG4gICAgbGludENvbW1hbmQgPSAnYnVuIHdiIGxpbnQnO1xuICB9IGVsc2Uge1xuICAgIGxpbnRDb21tYW5kID0gY29uZmlnLmRlcGVuZGluZy53YiA/ICd5YXJuIHdiIGxpbnQnIDogJ3lhcm4gcnVuIGxpbnQnO1xuICB9XG4gIGNvbnN0IHF1aWV0TGludENvbW1hbmQgPSBgJHtsaW50Q29tbWFuZH0gLS1xdWlldGA7XG4gIC8vIE5vIHNlcGFyYXRlIHR5cGVjaGVjayBzdGVwIG5lZWRlZCDigJQgdGhlIGxpbnQgY29tbWFuZCBhbHJlYWR5IGluY2x1ZGVzIHR5cGVjaGVja2luZy5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICByZXR1cm4gYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbiR7cXVpZXRMaW50Q29tbWFuZH1cbmAudHJpbSgpO1xuICB9XG4gIHJldHVybiBxdWlldExpbnRDb21tYW5kO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IExlZnRob29rSm9iW10ge1xuICByZXR1cm4gcHJlQ29tbWl0U2V0dGluZ3Muam9icy5tYXAoKGpvYikgPT5cbiAgICBqb2IubmFtZSA9PT0gJ2NsZWFudXAnXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5qb2IsXG4gICAgICAgICAgZ2xvYjogZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZyksXG4gICAgICAgICAgcnVuOiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWcpLFxuICAgICAgICB9XG4gICAgICA6IGpvYlxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gTGV0IGB3YiBsaW50IC0tZm9ybWF0YCBkZWNpZGUgd2hldGhlciBQcmV0dGllciBpcyBhdmFpbGFibGU7IHRoZSBob29rXG4gIC8vIHN0aWxsIG5lZWRzIHRvIHRyaWdnZXIgd2hlbiBhZGRpbmcgdGhlIGZpcnN0IHByZXR0aWVyLW9ubHkgZmlsZS5cbiAgY29uc3Qgc3VwcG9ydGVkRXh0ZW5zaW9ucyA9XG4gICAgY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykgPyBbLi4uZXh0ZW5zaW9ucy5wcmV0dGllck9ubHldIDogW107XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKC4uLmV4dGVuc2lvbnMub3hmbXQsIC4uLmV4dGVuc2lvbnMub3hsaW50KTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ3B5Jyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdkYXJ0Jyk7XG4gIH1cbiAgY29uc3QgZmlsdGVyZWRFeHRlbnNpb25zID0gWy4uLm5ldyBTZXQoc3VwcG9ydGVkRXh0ZW5zaW9ucyldLnRvU29ydGVkKCk7XG4gIHJldHVybiBgKiovKi57JHtmaWx0ZXJlZEV4dGVuc2lvbnMuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWcpKSB7XG4gICAgcmV0dXJuIFN0cmluZy5yYXdgXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbnlhcm4gd29ya3NwYWNlIEB3aWxsYm9vc3Rlci93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbClcIiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuICAvLyBQeXRob24tb25seSBCdW4gcmVwb3MgaW5zdGFsbCB3YiBmb3Igc2hhcmVkIHNjcmlwdHMgYnV0IG5vdCBPeGxpbnQsIHNvXG4gIC8vIHN0YWdlZC1maWxlIGhvb2tzIG11c3QgdXNlIHRoZSBsYW5ndWFnZS1zcGVjaWZpYyBmb3JtYXR0ZXIgcGF0aCBiZWxvdy5cbiAgY29uc3QgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gIGlmICgoY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcud2IpICYmIGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMpIHtcbiAgICByZXR1cm4gYFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG4ke2NvbmZpZy5pc0J1biA/ICdidW4gd2InIDogJ3lhcm4gd2InfSBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuXG4gIGNvbnN0IG94bGludFBhdHRlcm4gPSBleHRlbnNpb25zLm94bGludC5tYXAoKGV4dGVuc2lvbikgPT4gU3RyaW5nLnJhd2BcXC4ke2V4dGVuc2lvbn0kYCkuam9pbignfCcpO1xuICBjb25zdCBveGZtdFBhdHRlcm4gPSBleHRlbnNpb25zLm94Zm10Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IHByZXR0aWVyUGF0dGVybiA9IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG4gIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcblxuICByZXR1cm4gU3RyaW5nLnJhd2BcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxuJHtoYXNKc09yVHMgPyBTdHJpbmcucmF3YG94bGludF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoJHtveGxpbnRQYXR0ZXJufSknIHx8IHRydWUpXCJgIDogJyd9XG4ke2hhc0pzT3JUcyA/IFN0cmluZy5yYXdgb3hmbXRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKCR7b3hmbXRQYXR0ZXJufSknIHwgZ3JlcCAtdiAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2hhc0phdmEgPyBTdHJpbmcucmF3YHByZXR0aWVyX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke3ByZXR0aWVyUGF0dGVybn0pJyB8fCB0cnVlKVwiYCA6ICcnfVxucGFja2FnZV9qc29uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiXG4ke2hhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZykgPyBTdHJpbmcucmF3YHB5dGhvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5weSQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2NvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sID8gU3RyaW5nLnJhd2BkYXJ0X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLmRhcnQkJyB8IGdyZXAgLXYgJ2dlbmVyYXRlZCcgfCBncmVwIC12ICdcXC5mcmVlemVkXFwuZGFydCQnIHwgZ3JlcCAtdiAnXFwuZ1xcLmRhcnQkJyB8fCB0cnVlKVwiYCA6ICcnfVxuXG4ke1xuICBoYXNKc09yVHNcbiAgICA/IFN0cmluZy5yYXdgXG5pZiBbIC1uIFwiJG94Zm10X2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL294Zm10IC0td3JpdGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAnISoqL3BhY2thZ2UuanNvbicgJG94Zm10X2ZpbGVzXG5maVxuYFxuICAgIDogJydcbn1cbiR7XG4gIGhhc0phdmFcbiAgICA/IFN0cmluZy5yYXdgaWYgWyAtbiBcIiRwcmV0dGllcl9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUgLS1pZ25vcmUtdW5rbm93biAtLSAkcHJldHRpZXJfZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGhhc0pzT3JUc1xuICAgID8gU3RyaW5nLnJhd2BcbmlmIFsgLW4gXCIkb3hsaW50X2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL294bGludCAtLWZpeCAkb3hsaW50X2ZpbGVzXG5maVxuYFxuICAgIDogJydcbn1cbmlmIFsgLW4gXCIkcGFja2FnZV9qc29uX2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3NvcnQtcGFja2FnZS1qc29uIC0tICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcyAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGJsYWNrICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5oYXNWZXJzaW9uU2V0dGluZ3MpIHtcbiAgICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWx8XFwudG9vbC12ZXJzaW9uc3xcXC4uKy12ZXJzaW9uKWA7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJ1dlxcLmxvY2tcIiBcInV2IHN5bmMgLS1mcm96ZW5cImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi93YiBwcmlzbWEgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL3diIHByaXNtYSBnZW5lcmF0ZVwiYFxuICAgICk7XG4gIH1cbiAgY29uc3QgZ2VuSTE4blRzQ29tbWFuZCA9IGdldEdlbkkxOG5Uc0NvbW1hbmQoY29uZmlnLCBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMpO1xuICBpZiAoZ2VuSTE4blRzQ29tbWFuZCkge1xuICAgIC8vIGdlbi1pMThuLXRzIG91dHB1dHMgYXJlIGNvbW1vbmx5IGlnbm9yZWQsIHNvIHBvc3QtbWVyZ2UgcmVnZW5lcmF0ZXMgdGhlbSBhZnRlciBwdWxsZWQgcmVzb3VyY2UgY2hhbmdlcy5cbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIoXnwvKWkxOG4vLipcXC5qc29uJFwiIFwiJHtnZW5JMThuVHNDb21tYW5kfVwiYCk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuXG5mdW5jdGlvbiBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25SdW5uZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeSBydW4nIHwgJ3V2IHJ1bicge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluVXZMb2NrID8gJ3V2IHJ1bicgOiAncG9ldHJ5IHJ1bic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMaW50c3RhZ2VkcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmNqc2AsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmpzYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuanNvbmAsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgIF0pO1xuICB9KTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb25maWdDb250ZW50KGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZW50Py50cmltKCk7XG59XG4iLCJleHBvcnQgdHlwZSBDb25maWdCbG9ja05hbWUgPSAnYmFzZScgfCAnZXhwb3J0JztcblxuaW50ZXJmYWNlIE1hbmFnZWRDb25maWdCbG9ja3NPcHRpb25zIHtcbiAgYmxvY2tOYW1lczogcmVhZG9ubHkgQ29uZmlnQmxvY2tOYW1lW107XG4gIG1hcmtlclByZWZpeDogc3RyaW5nO1xuICB0b29sTmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgR2V0Q29uZmlnQ29udGVudE9wdGlvbnMge1xuICBkZXNpcmVkQ29udGVudDogc3RyaW5nO1xuICBleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZmlsZVBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE1hbmFnZWRDb25maWdCbG9ja3Mge1xuICBwcml2YXRlIHJlYWRvbmx5IGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWFya2VyUHJlZml4OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0b29sTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1hbmFnZWRDb25maWdCbG9ja3NPcHRpb25zKSB7XG4gICAgdGhpcy5ibG9ja05hbWVzID0gb3B0aW9ucy5ibG9ja05hbWVzO1xuICAgIHRoaXMubWFya2VyUHJlZml4ID0gb3B0aW9ucy5tYXJrZXJQcmVmaXg7XG4gICAgdGhpcy50b29sTmFtZSA9IG9wdGlvbnMudG9vbE5hbWU7XG4gIH1cblxuICBnZXRDb25maWdDb250ZW50KG9wdGlvbnM6IEdldENvbmZpZ0NvbnRlbnRPcHRpb25zKTogc3RyaW5nIHtcbiAgICBpZiAoIW9wdGlvbnMuZXhpc3RpbmdDb250ZW50KSByZXR1cm4gb3B0aW9ucy5kZXNpcmVkQ29udGVudDtcbiAgICBpZiAodGhpcy5oYXNNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZU1hbmFnZWRCbG9ja3Mob3B0aW9ucy5leGlzdGluZ0NvbnRlbnQsIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQsIG9wdGlvbnMuZmlsZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucy5kZXNpcmVkQ29udGVudDtcbiAgfVxuXG4gIGdldEJsb2NrKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lLCBjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSl9XG4ke2NvbnRlbnR9XG4ke3RoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSl9YDtcbiAgfVxuXG4gIGhhc01hbmFnZWRCbG9ja3MoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2tOYW1lcy5zb21lKChibG9ja05hbWUpID0+IGNvbnRlbnQuaW5jbHVkZXModGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKSk7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudDogc3RyaW5nLCBkZXNpcmVkQ29udGVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgY29udGVudCA9IGV4aXN0aW5nQ29udGVudDtcbiAgICBmb3IgKGNvbnN0IGJsb2NrTmFtZSBvZiB0aGlzLmJsb2NrTmFtZXMpIHtcbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gdGhpcy5leHRyYWN0TWFuYWdlZEJsb2NrKGRlc2lyZWRDb250ZW50LCBibG9ja05hbWUpO1xuICAgICAgaWYgKCFyZXBsYWNlbWVudCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG5leHRDb250ZW50ID0gdGhpcy5yZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQsIGJsb2NrTmFtZSwgcmVwbGFjZW1lbnQpO1xuICAgICAgaWYgKCFuZXh0Q29udGVudCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXBkYXRpbmcgaW5jb21wbGV0ZSAke2Jsb2NrTmFtZX0gYmxvY2sgaW4gJHt0aGlzLnRvb2xOYW1lfSBjb25maWc6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0NvbnRlbnQ7XG4gICAgICB9XG4gICAgICBjb250ZW50ID0gbmV4dENvbnRlbnQ7XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0TWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpLmV4ZWMoY29udGVudCk/LlswXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lLCByZXBsYWNlbWVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKTtcbiAgICBpZiAoIXBhdHRlcm4udGVzdChjb250ZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogUmVnRXhwIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChcbiAgICAgIGAke2VzY2FwZVJlZ0V4cCh0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpfVtcXFxcc1xcXFxTXSo/JHtlc2NhcGVSZWdFeHAodGhpcy5nZXRFbmRNYXJrZXIoYmxvY2tOYW1lKSl9YFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC8vIHdiZnk6c3RhcnQgJHt0aGlzLm1hcmtlclByZWZpeH0tJHtibG9ja05hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW5kTWFya2VyKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC8vIHdiZnk6ZW5kICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hmbXQnLFxuICB0b29sTmFtZTogJ294Zm10Jyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94Zm10Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxlZ2FjeUpzb25Db25maWdQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm94Zm10cmMuanNvbicpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hmbXQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgZGVzaXJlZENvbnRlbnQ6IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKSxcbiAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgIGZpbGVQYXRoLFxuICAgIH0pO1xuICAgIGNvbnN0IHByb21pc2VzID0gW3Byb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShsZWdhY3lKc29uQ29uZmlnUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSldO1xuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCkpKTtcbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBDb21tb25KUyBwYWNrYWdlcyBuZWVkIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMgaGVyZTogb3hmbXQgY29uZmlnIGZpbGVzIGFyZVxuICAvLyBvbmx5IGF1dG8tZGlzY292ZXJlZCBhcyAudHMsIGFuZCB0aGUgc2hhcmVkIGNvbmZpZyBwYWNrYWdlIGlzIEVTTS1vbmx5LlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIm5vZGVcIiAvPlxuaW1wb3J0IHR5cGUgeyBPeGZtdENvbmZpZyB9IGZyb20gJ294Zm10JztcblxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94Zm10IGNvbmZpZyBmaWxlcyBhcmUgb25seSBhdXRvLWRpc2NvdmVyZWQgYXMgLnRzLCBhbmQgQ29tbW9uSlMgYXZvaWRzIEVTTSBwYWNrYWdlIGxvYWRpbmcgaXNzdWVzLlxuY29uc3Qgb3hmbXRDb25maWcgPSByZXF1aXJlKCdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyk7XG5cbmNvbnN0IG94Zm10UmVzb2x2ZWRDb25maWc6IE94Zm10Q29uZmlnID0gb3hmbXRDb25maWcuZGVmYXVsdCA/PyBveGZtdENvbmZpZztgXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICdiYXNlJyxcbiAgICBgaW1wb3J0IHR5cGUgeyBPeGZtdENvbmZpZyB9IGZyb20gJ294Zm10JztcblxuaW1wb3J0IGNvbmZpZyBmcm9tICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJztcblxuY29uc3Qgb3hmbXRSZXNvbHZlZENvbmZpZzogT3hmbXRDb25maWcgPSBjb25maWc7YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hsaW50JyxcbiAgdG9vbE5hbWU6ICdveGxpbnQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIF9yb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGxpbnRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgY29uZmlnIGZpbGVzIGFzIHByb2R1Y3QgY29kZSwgc28gbWlncmF0aW9uXG4gICAgLy8gbXVzdCBub3QgcmVtb3ZlIHBhY2thZ2UtcHJvdmlkZWQgbGludGVyIHNldHRpbmdzLiBHZW5lcmF0ZWQgZmlsZXMgd2l0aFxuICAgIC8vIG1hbmFnZWQgYmxvY2tzIGFyZSBzdGlsbCBzYWZlIHRvIHVwZGF0ZS5cbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyA9IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hsaW50LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50ID1cbiAgICAgIHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnICYmIGV4aXN0aW5nQ29udGVudCAmJiAhbWFuYWdlZENvbmZpZ0Jsb2Nrcy5oYXNNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nQ29udGVudFxuICAgICAgPyBleGlzdGluZ0NvbnRlbnRcbiAgICAgIDogcmVwbGFjZUxlZ2FjeUNvbmZpZ1JlZmVyZW5jZXMoXG4gICAgICAgICAgbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgICAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICAgICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGlmICghc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcpIHtcbiAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcub3hsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5janMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy55YW1sJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy50cycpLCB7IGZvcmNlOiB0cnVlIH0pKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlTGVnYWN5Q29uZmlnUmVmZXJlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlQWxsKC8oPzwhWy4vXSlcXGJjb25maWdcXC4vZ3UsICdveGxpbnRSZXNvbHZlZENvbmZpZy4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBpc1Jvb3RDb25maWcgPSBjb25maWcuaXNSb290O1xuICBjb25zdCBveGxpbnRCYXNlQ29uZmlnTW9kdWxlID0gZ2V0T3hsaW50QmFzZUNvbmZpZ01vZHVsZShjb25maWcpO1xuXG4gIC8vIERvIG5vdCBjb2xsYXBzZSB0aGlzIHRvIGEgc3RhdGljIGltcG9ydCBmb3IgZXZlcnkgcGFja2FnZS4gQ29tbW9uSlMgcGFja2FnZXNcbiAgLy8gdHlwZS1jaGVjayBhdXRvLWRpc2NvdmVyZWQgb3hsaW50LmNvbmZpZy50cyBhcyBDb21tb25KUywgc28gaW1wb3J0aW5nIHRoZSBFU01cbiAgLy8gQHdpbGxib29zdGVyL294bGludC1jb25maWcgcGFja2FnZSB0cmlnZ2VycyBUUzE0NzkuIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGhcbiAgLy8gbGl0ZXJhY3ktdGVzdCdzIGdlbmVyYXRlZCBjb25maWcgcGF0dGVybi5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJub2RlXCIgLz5cbmltcG9ydCB0eXBlIHsgT3hsaW50Q29uZmlnIH0gZnJvbSAnb3hsaW50JztcblxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94bGludCBvbmx5IGF1dG8tZGlzY292ZXJzIC50cyBjb25maWcgZmlsZXMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGxpbnRCYXNlQ29uZmlnID0gcmVxdWlyZSgnQHdpbGxib29zdGVyL294bGludC1jb25maWcnKTtcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcuZGVmYXVsdCA/PyBveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCB0eXBlIHsgT3hsaW50Q29uZmlnIH0gZnJvbSAnb3hsaW50JztcblxuaW1wb3J0IG94bGludEJhc2VDb25maWcgZnJvbSAnJHtveGxpbnRCYXNlQ29uZmlnTW9kdWxlfSc7XG5cbiR7Z2V0UmVzb2x2ZWRDb25maWdDb250ZW50KCdveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ2V4cG9ydCBkZWZhdWx0IG94bGludFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3hsaW50QmFzZUNvbmZpZ01vZHVsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLnBhY2thZ2VKc29uPy5uYW1lID09PSAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnID8gJy4vY29uZmlnLm1qcycgOiAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnO1xufVxuXG5mdW5jdGlvbiBnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoYmFzZUNvbmZpZ05hbWU6IHN0cmluZywgaXNSb290Q29uZmlnOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGlzUm9vdENvbmZpZykge1xuICAgIHJldHVybiBgLy8gS2VlcCBhIHBhY2thZ2UtbG9jYWwgY29weSBzbyByZXBvc2l0b3JpZXMgY2FuIGFkZCBzZXR0aW5ncyBvdXRzaWRlXG4vLyBtYW5hZ2VkIGJsb2NrcyB3aXRob3V0IG11dGF0aW5nIHRoZSBzaGFyZWQgaW1wb3J0ZWQgY29uZmlnIG9iamVjdC5cbmNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBPeGxpbnRDb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUoJHtiYXNlQ29uZmlnTmFtZX0pO1xuLy8gVGhlIHR5cGUtYXdhcmUgb3B0aW9ucyBtYWtlIGxpbnQgcGVyZm9ybSB0eXBlIGNoZWNraW5nLiBBbHdheXMgZm9yY2UgdGhlbSBvbiBoZXJlLFxuLy8gaW5zaWRlIHRoZSBtYW5hZ2VkIGJsb2NrLCBzbyBubyBjdXN0b21pemF0aW9uIGNhbiBzaWxlbnRseSBkaXNhYmxlIHR5cGUgY2hlY2tpbmcuXG5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zID0geyAuLi5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zLCB0eXBlQXdhcmU6IHRydWUsIHR5cGVDaGVjazogdHJ1ZSB9O2A7XG4gIH1cblxuICByZXR1cm4gYC8vIE94bGludCByZWplY3RzIHRoZSByb290LW9ubHkgdHlwZS1hd2FyZSBvcHRpb25zIG91dHNpZGUgdGhlIHJvb3QgY29uZmlnLCBzbyBkZWxldGUgdGhlbVxuLy8gaGVyZS4gVGhpcyBkb2VzIE5PVCBkaXNhYmxlIHR5cGUgY2hlY2tpbmc6IHRoZSBsaW50IGNvbW1hbmRzIHBhc3MgdGhlIC0tdHlwZS1hd2FyZSBhbmRcbi8vIC0tdHlwZS1jaGVjayBmbGFncyBleHBsaWNpdGx5LlxuY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWc6IE94bGludENvbmZpZyA9IHN0cnVjdHVyZWRDbG9uZSgke2Jhc2VDb25maWdOYW1lfSk7XG5kZWxldGUgb3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucztgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGlmICghZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG1hbmFnZWRTY3JpcHRzQmxvY2sgPSBgc2NyaXB0cy8qKlxuIXNjcmlwdHMvXG4hc2NyaXB0cy8qLnNoYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFJhaWx3YXlpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UmFpbHdheWlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXnNjcmlwdHNcXC8kL20sIG1hbmFnZWRTY3JpcHRzQmxvY2spO1xuICAgIGlmIChuZXdDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkge1xuICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLmV4aXN0c1N5bmMod29ya2Zsb3dzUGF0aCkgPyBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NQYXRoKSA6IFtdO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuXG4gICAgICBsZXQgYmFkZ2VOYW1lID0gZmlsZU5hbWU7XG4gICAgICBiYWRnZU5hbWUgPSAoYmFkZ2VOYW1lWzBdIHx8ICcnKS50b1VwcGVyQ2FzZSgpICsgYmFkZ2VOYW1lLnNsaWNlKDEsIGJhZGdlTmFtZS5pbmRleE9mKCcuJykpO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgICAgaWYgKCFyZXBvc2l0b3J5KSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGJhZGdlID0gYFshWyR7YmFkZ2VOYW1lfV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0vYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0pYDtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC5naXRodWIvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZW1vdmVHaXRIdWJBY3Rpb25zQmFkZ2UobmV3Q29udGVudCwgYmFkZ2VOYW1lLCBmaWxlTmFtZSk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBiYWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOaXouOBq2JhZGdl44GM44GC44KL5aC05ZCI44Gv5YmK6ZmkXG4gIHJlYWRtZSA9IHJlYWRtZS5yZXBsYWNlKGJhZGdlLCAnJykucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFkbWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVhZG1lW2kgLSAxXSA9PT0gJ1xcbicgJiYgcmVhZG1lW2ldID09PSAnXFxuJykge1xuICAgICAgY29uc3QgYmVmb3JlID0gcmVhZG1lLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgIGxldCBhZnRlciA9IHJlYWRtZS5zbGljZShpICsgMSk7XG4gICAgICBpZiAoIWFmdGVyLnN0YXJ0c1dpdGgoJ1snKSAmJiAhYWZ0ZXIuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgIGFmdGVyID0gYFxcbiR7YWZ0ZXJ9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtiZWZvcmV9JHtiYWRnZX1cXG4ke2FmdGVyfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHtyZWFkbWV9XFxuJHtiYWRnZX1cXG5gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlR2l0SHViQWN0aW9uc0JhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZU5hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGVzY2FwZWRCYWRnZU5hbWUgPSBlc2NhcGVSZWdFeHAoYmFkZ2VOYW1lKTtcbiAgY29uc3QgZXNjYXBlZEZpbGVOYW1lID0gZXNjYXBlUmVnRXhwKGZpbGVOYW1lKTtcbiAgcmV0dXJuIHJlYWRtZVxuICAgIC5yZXBsYWNlQWxsKFxuICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgU3RyaW5nLnJhd2BcXFshXFxbJHtlc2NhcGVkQmFkZ2VOYW1lfVxcXVxcKGh0dHBzOi8vZ2l0aHViXFwuY29tL1teL1xccyldKy9bXi9cXHMpXSsvYWN0aW9ucy93b3JrZmxvd3MvJHtlc2NhcGVkRmlsZU5hbWV9L2JhZGdlXFwuc3ZnXFwpXFxdXFwoaHR0cHM6Ly9naXRodWJcXC5jb20vW14vXFxzKV0rL1teL1xccyldKy9hY3Rpb25zL3dvcmtmbG93cy8ke2VzY2FwZWRGaWxlTmFtZX1cXClcXG4/YCxcbiAgICAgICAgJ2d1J1xuICAgICAgKSxcbiAgICAgICcnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucyA/PyBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbkVudHJ5ID0gcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IGlzQXJyYXkgPyBwbHVnaW5FbnRyeVswXSA6IHBsdWdpbkVudHJ5O1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKGlzQXJyYXkgJiYgcGx1Z2luRW50cnlbMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFsnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbjUnXSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSBPbWl0PHR5cGVvZiBqc29uT2JqLCAnZXh0ZW5kcyc+ICYge1xuICBleHRlbmRzPzogc3RyaW5nW107XG4gIHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W107XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopIGFzIFNldHRpbmdzO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncmVub3ZhdGUuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2ZpbGVQYXRofTVgKSkge1xuICAgICAgLy8gU2luY2UgaXQgaXMgZGlmZmljdWx0IGZvciBwYXJzaW5nIHJlbm92YXRlLmpzb241LCB3ZSBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVJlbm92YXRlRXh0ZW5kcyhqc29uT2JqLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMgPz8gW10pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMuc29tZSgocnVsZTogeyBtYXRjaFBhY2thZ2VOYW1lcz86IHN0cmluZ1tdIH0pID0+XG4gICAgICAgICAgcnVsZS5tYXRjaFBhY2thZ2VOYW1lcz8uaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUmVub3ZhdGVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHM6IHN0cmluZ1tdLCBleGlzdGluZ0V4dGVuZHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLmdlbmVyYXRlZEV4dGVuZHMsIC4uLmV4aXN0aW5nRXh0ZW5kc10pXS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbn1cbiIsImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBZ2VudFNraWxscyhfcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2luc3RhbGxBZ2VudFNraWxscycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUT0RPOiBXZSBhcmUgdGVtcG9yYXJpbHkgbm90IGluc3RhbGxpbmcgbWFuYWdlZCBhZ2VudCBza2lsbHMgaW50byByZXBvcy5cbiAgICAvLyBhd2FpdCBydW5JbnN0YWxsQWdlbnRTa2lsbHMoX3Jvb3RDb25maWcpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnRXh0ZW5kcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5cbmNvbnN0IHJvb3RKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3BhY2thZ2VzLyovdGVzdC9maXh0dXJlcycsICd0ZXN0L2ZpeHR1cmVzJ10sXG4gIGluY2x1ZGU6IFtcbiAgICAnKi5jb25maWcudHMnLFxuICAgICdwYWNrYWdlcy8qLyouY29uZmlnLnRzJyxcbiAgICAncGFja2FnZXMvKi9zY3JpcHRzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NyYy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi90ZXN0LyoqLyonLFxuICAgICdzY3JpcHRzLyoqLyonLFxuICAgICdzcmMvKiovKicsXG4gICAgJ3Rlc3QvKiovKicsXG4gIF0sXG59O1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgLy8gd2JmeSBnZW5lcmF0ZXMgcm9vdC1sZXZlbCB0b29sIGNvbmZpZ3Mgc3VjaCBhcyBwbGF5d3JpZ2h0LmNvbmZpZy50cywgYW5kXG4gIC8vIHR5cGUtYXdhcmUgbGludGluZyBuZWVkcyB0aG9zZSBmaWxlcyBpbiB0aGUgcHJvamVjdCB0byBzZWUgTm9kZS9CdW4gZ2xvYmFscy5cbiAgaW5jbHVkZTogWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgYXdhaXQgY2xlYW51cExlZ2FjeVRzY29uZmlnTW9kdWxlU2V0dGluZ3MoY29uZmlnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpciA9IGdldFJvb3REaXIoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHR5cGVzOiBnZW5lcmF0ZWRUeXBlcyB9O1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNCdW4gJiYgIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBqc3g6ICdyZWFjdC1qc3gnIH07XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgICBuZXdTZXR0aW5ncy5leGNsdWRlID0gbmV3U2V0dGluZ3MuZXhjbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIC8vIFByaXNtYSBzZWVkcyBhbmQgbWlncmF0aW9uIGhlbHBlciBzY3JpcHRzIG9mdGVuIGxpdmUgb3V0c2lkZSBzcmMsIGJ1dFxuICAgICAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIHN0aWxsIG5lZWRzIHRoZW0gY292ZXJlZCBieSB0aGUgcHJvamVjdCBjb25maWcuXG4gICAgICBhZGRJbmNsdWRlUGF0aChuZXdTZXR0aW5ncywgJ3ByaXNtYS8qKi8qJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgVHNDb25maWdKc29uO1xuICAgICAgY29uc3QgZXhpc3RpbmdUeXBlcyA9IG5vcm1hbGl6ZVN0cmluZ0FycmF5KG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXMpO1xuICAgICAgY29uc3QgZXhpc3RpbmdFbWl0TWV0YWRhdGEgPSBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVRzY29uZmlnRXh0ZW5kcyhuZXdTZXR0aW5ncy5leHRlbmRzLCBvbGRTZXR0aW5ncy5leHRlbmRzKTtcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgIWRpclBhdGguaW5jbHVkZXMoJ0B0eXBlcycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCdfX3Rlc3RzX18vJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ3Rlc3RzLycpXG4gICAgICApO1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICAgIC8vIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnLmpzb24gaXMgYSBsaW50L3R5cGVjaGVjayBwcm9qZWN0LCBub3QgdGhlIGVtaXRcbiAgICAgIC8vIGNvbnRyYWN0LiBJdCBtdXN0IGtlZXAgcm9vdERpciBicm9hZCBlbm91Z2ggZm9yIHJvb3QgY29uZmlnIGZpbGVzLFxuICAgICAgLy8gc2NyaXB0cywgc3JjLCBhbmQgdGVzdHMuIGJ1aWxkLXRzIG93bnMgZW1pdCBhbmQgY3JlYXRlcyBhIHRlbXBvcmFyeVxuICAgICAgLy8gc3JjLW9ubHkgdHNjb25maWcgd2l0aCBub0VtaXQ9ZmFsc2UsIGVtaXREZWNsYXJhdGlvbk9ubHk9dHJ1ZSxcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiwgYW5kIGluY2x1ZGU9W1wic3JjLyoqLypcIl0sIHNvIHByZXNlcnZpbmcgbm9FbWl0PWZhbHNlIG9yXG4gICAgICAvLyByb290RGlyPVwic3JjXCIgaGVyZSB3b3VsZCBvbmx5IGJyZWFrIG5vbi1zcmMgdHlwZS1hd2FyZSBsaW50IGNvdmVyYWdlLlxuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIC4uLmV4aXN0aW5nRW1pdE1ldGFkYXRhIH07XG4gICAgICBlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5KG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG5cbiAgICAgIGNvbnN0IG1lcmdlZFR5cGVzID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlcywgZ2VuZXJhdGVkVHlwZXMpLCAuLi5nZW5lcmF0ZWRUeXBlc10pXTtcbiAgICAgIGlmIChtZXJnZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IG1lcmdlZFR5cGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGREZWxldGVUeXBlUm9vdHMoZ2VuZXJhdGVkVHlwZXMpKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZVJvb3RzO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICAvLyBQYWNrYWdlIGltcG9ydHMgc2hvdWxkIHJlc29sdmUgdGhyb3VnaCBwYWNrYWdlIGV4cG9ydHMgaW5zdGVhZCBvZiBiYXNlVXJsLlxuICAgIC8vIHBhdGhzIGlzIGludGVudGlvbmFsbHkgcHJlc2VydmVkIHNvIHJlcG8tbG9jYWwgdG9vbGluZyBjYW4ga2VlcCBleHBsaWNpdFxuICAgIC8vIGFsaWFzZXMgd2l0aG91dCByZWx5aW5nIG9uIGJhc2VVcmwncyBicm9hZCBmYWxsYmFjayByZXNvbHV0aW9uLlxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmw7XG4gICAgZGVsZXRlTGVnYWN5TW9kdWxlU2V0dGluZ3MobmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBjb25maWcpO1xuICAgIG5vcm1hbGl6ZUNvbW1vbkpzVHNjb25maWdTZXR0aW5ncyhuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGNvbmZpZyk7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICBhZGRTY3JpcHRzSW5jbHVkZUZvckZyYW1ld29ya1Byb2plY3Qoc2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSkpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBOZXh0L0JsaXR6IG93biB0aGVpciB0c2NvbmZpZyBzaGFwZSwgYnV0IFR5cGVTY3JpcHQgNiBubyBsb25nZXIgYWNjZXB0c1xuICAgIC8vIG5vZGUxMCByZXNvbHZlciBzcGVsbGluZ3MgdGhhdCBvbGRlciBwcm9qZWN0cyBjb21tb25seSBpbmhlcml0ZWQuXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzOiBUc0NvbmZpZ0pzb24pOiB2b2lkIHtcbiAgLy8gT21pdHRpbmcgaW5jbHVkZSBsZXRzIGZyYW1ld29yayB0c2NvbmZpZ3Mga2VlcCBUeXBlU2NyaXB0J3MgZGVmYXVsdFxuICAvLyBcImFsbCBUUy9UU1ggZmlsZXNcIiBiZWhhdmlvciwgd2hpY2ggYWxyZWFkeSBjb3ZlcnMgc2NyaXB0cy5cbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlKSByZXR1cm47XG4gIGlmIChzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKCdzY3JpcHRzLyoqLyonKSkgcmV0dXJuO1xuXG4gIHNldHRpbmdzLmluY2x1ZGUucHVzaCgnc2NyaXB0cy8qKi8qJyk7XG4gIHNldHRpbmdzLmluY2x1ZGUuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucztcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgY29uc3QgbW9kdWxlUmVzb2x1dGlvbiA9IGxvd2VyQ2FzZVNldHRpbmcoY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24pO1xuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzZXR0aW5ncy5leHRlbmRzKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBjb25maWcgbWF5IGFscmVhZHkgc3VwcGx5IGEgdmFsaWQgbW9kdWxlL3Jlc29sdmVyIHBhaXIsIHNvIG9ubHlcbiAgICAgIC8vIHJlbW92ZSB0aGUgcmVtb3ZlZC1pbi1UUzYgbm9kZTEwIHNwZWxsaW5ncyBpbnN0ZWFkIG9mIGZvcmNpbmcgYnVuZGxlciBvbiBpdC5cbiAgICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmV4dC5qcyB3cml0ZXMgXCJub2RlXCIgZHVyaW5nIGJ1aWxkIHdoZW4gdGhpcyBvcHRpb24gaXMgbWlzc2luZywgYnV0XG4gICAgICAvLyB0c2dvbGludCB0cmVhdHMgdGhhdCBzcGVsbGluZyBhcyB0aGUgcmVtb3ZlZCBub2RlMTAgcmVzb2x2ZXIuXG4gICAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9ICdidW5kbGVyJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gdHNnb2xpbnQgZm9sbG93cyBUeXBlU2NyaXB0IDYgdmFsaWRhdGlvbiwgd2hlcmUgYmFzZVVybCBpcyByZW1vdmVkIGFuZFxuICAvLyBwYXRoIHRhcmdldHMgbXVzdCBiZSBleHBsaWNpdGx5IHJlbGF0aXZlLiBOZXh0LmpzIHN0aWxsIGFjY2VwdHMgdGhlIGFsaWFzXG4gIC8vIHNoYXBlIGFmdGVyIGVhY2ggdGFyZ2V0IGlzIHdyaXR0ZW4gd2l0aCBhIGxlYWRpbmcgLi8uXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMuYmFzZVVybDtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMucGF0aHMpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZXJPcHRpb25zLnBhdGhzKSkge1xuICAgIGNvbXBpbGVyT3B0aW9ucy5wYXRoc1thbGlhc10gPSBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG4gICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpIHx8IHRhcmdldC5zdGFydHNXaXRoKCcuLi8nKSB8fCBwYXRoLmlzQWJzb2x1dGUodGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgICByZXR1cm4gYC4vJHt0YXJnZXR9YDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHJldHVybiAnLic7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKSA/ICcuLi8uLicgOiAnLic7XG59XG5cbmZ1bmN0aW9uIG1lcmdlVHNjb25maWdFeHRlbmRzKFxuICBnZW5lcmF0ZWRFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSxcbiAgZXhpc3RpbmdFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXVxuKTogVHNDb25maWdKc29uWydleHRlbmRzJ10ge1xuICBjb25zdCBtZXJnZWRFeHRlbmRzID0gWy4uLm5vcm1hbGl6ZUV4dGVuZHMoZ2VuZXJhdGVkRXh0ZW5kcyksIC4uLm5vcm1hbGl6ZUV4dGVuZHMoZXhpc3RpbmdFeHRlbmRzKV07XG4gIGNvbnN0IHVuaXF1ZUV4dGVuZHMgPSBbLi4ubmV3IFNldChtZXJnZWRFeHRlbmRzKV07XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAxKSByZXR1cm4gdW5pcXVlRXh0ZW5kc1swXTtcbiAgcmV0dXJuIHVuaXF1ZUV4dGVuZHM7XG59XG5cbmZ1bmN0aW9uIGFkZEluY2x1ZGVQYXRoKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBzZXR0aW5ncy5pbmNsdWRlID8/PSBbXTtcbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKGRpclBhdGgpKSB7XG4gICAgc2V0dGluZ3MuaW5jbHVkZS5wdXNoKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV4dGVuZHModmFsdWU6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddKTogc3RyaW5nW10ge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gW3ZhbHVlXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVHlwZVJvb3RzKHR5cGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgLy8gT25seSBnZW5lcmF0ZWQgcGFja2FnZS1vd25lZCB0ZXN0IHR5cGVzIHNob3VsZCB0cmlnZ2VyIHRoaXMuIFVzZXItZGVmaW5lZCBzbGFzaC1iYXNlZFxuICAvLyBlbnRyaWVzIG1heSBpbnRlbnRpb25hbGx5IHJlbHkgb24gY3VzdG9tIHR5cGVSb290cyBhbmQgc2hvdWxkIGJlIHByZXNlcnZlZCBhcy1pcy5cbiAgcmV0dXJuIHR5cGVOYW1lcy5zb21lKCh0eXBlTmFtZSkgPT4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZS5pbmNsdWRlcygnLycpKTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzOiBzdHJpbmdbXSwgZ2VuZXJhdGVkVHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBnZW5lcmF0ZWRUeXBlU2V0ID0gbmV3IFNldChnZW5lcmF0ZWRUeXBlcyk7XG4gIHJldHVybiBleGlzdGluZ1R5cGVzLmZpbHRlcigodHlwZU5hbWUpID0+IHtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgcGFja2FnZS1wcm92aWRlZCB0ZXN0IGdsb2JhbHMuIERyb3Agc3RhbGUgZW50cmllcyB3aGVuIHRoZVxuICAgIC8vIGNvcnJlc3BvbmRpbmcgZGVwZW5kZW5jeSBpcyBubyBsb25nZXIgcHJlc2VudCBzbyBUeXBlU2NyaXB0IHdvbid0IHJlcXVpcmVcbiAgICAvLyBtaXNzaW5nIHBhY2thZ2VzIHN1Y2ggYXMgdml0ZXN0LlxuICAgIGlmIChpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lKSAmJiAhZ2VuZXJhdGVkVHlwZVNldC5oYXModHlwZU5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUgPT09ICdqZXN0JyB8fCB0eXBlTmFtZSA9PT0gJ21vY2hhJyB8fCB0eXBlTmFtZSA9PT0gJ3ZpdGVzdC9nbG9iYWxzJztcbn1cblxuZnVuY3Rpb24gZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eShjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgaWYgKGNvbXBpbGVyT3B0aW9ucy5ub0VtaXQgIT09IGZhbHNlIHx8IGNvbXBpbGVyT3B0aW9ucy5lbWl0RGVjbGFyYXRpb25Pbmx5ID09PSB0cnVlKSByZXR1cm47XG5cbiAgLy8gQHRzY29uZmlnL2J1biBlbmFibGVzIGFsbG93SW1wb3J0aW5nVHNFeHRlbnNpb25zLCB3aGljaCBUeXBlU2NyaXB0IHBlcm1pdHNcbiAgLy8gZHVyaW5nIGVtaXQgb25seSB3aGVuIHJlbGF0aXZlIFRTIGV4dGVuc2lvbnMgYXJlIHJld3JpdHRlbi5cbiAgY29tcGlsZXJPcHRpb25zLnJld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbnMgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBkZWxldGVMZWdhY3lNb2R1bGVTZXR0aW5ncyhcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuXG4gIC8vIFR5cGVTY3JpcHQgdHJlYXRzIG9wdGlvbiB2YWx1ZXMgY2FzZS1pbnNlbnNpdGl2ZWx5LCBzbyBub3JtYWxpemUgYmVmb3JlIGNvbXBhcmlzb24uXG4gIGNvbnN0IG1vZHVsZVJlc29sdXRpb24gPSBsb3dlckNhc2VTZXR0aW5nKGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uKTtcbiAgLy8gVHlwZVNjcmlwdCA2IHJlbW92ZWQgdGhlIG9sZCBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmcsIHNvIGluaGVyaXRlZCBiYXNlIGNvbmZpZ3NcbiAgLy8gc2hvdWxkIGNob29zZSB0aGUgcmVzb2x2ZXIgdW5sZXNzIGEgcHJvamVjdCBhbHJlYWR5IG9wdGVkIGludG8gYSBtb2Rlcm4gb25lLlxuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnKSB7XG4gICAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkgcmV0dXJuO1xuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnZpdGUgfHwgY29uZmlnLmRlcGVuZGluZy50YXVyaSkge1xuICAgIC8vIFZpdGUgb3ducyBtb2R1bGUgc2VtYW50aWNzIGZvciB0aGVzZSBwYWNrYWdlcyBhbmQgdGhlaXIgc291cmNlcyByZWx5IG9uXG4gICAgLy8gYnVuZGxlci1tb2RlIHJlc29sdXRpb24gKGUuZy4gZXh0ZW5zaW9ubGVzcyBpbXBvcnRzKSwgc28gcGluIHRoZSBidW5kbGVyIHBhaXJcbiAgICAvLyBldmVuIHdoZW4gYSBsZWdhY3kgY29uZmlnIHVzZWQgdGhlIG5vZGUgcmVzb2x2ZXIsIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvXG4gICAgLy8gdGhlIG5vZGUgYmFzZSBjb25maWdzJyBOb2RlTmV4dC5cbiAgICBpZiAobW9kdWxlUmVzb2x1dGlvbiAhPT0gJ2J1bmRsZXInKSB7XG4gICAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9ICdidW5kbGVyJztcbiAgICB9XG4gICAgY29uc3QgbW9kdWxlS2luZCA9IGxvd2VyQ2FzZVNldHRpbmcoY29tcGlsZXJPcHRpb25zLm1vZHVsZSk7XG4gICAgLy8gVHlwZVNjcmlwdCBwYWlycyB0aGUgYnVuZGxlciByZXNvbHZlciB3aXRoIFByZXNlcnZlIG9yIEVTLW1vZHVsZSBraW5kcy4gS2VlcCBhblxuICAgIC8vIGV4aXN0aW5nIHZhbGlkIGtpbmQgKGUuZy4gUHJlc2VydmUsIHdoaWNoIGhhbmRsZXMgaW1wb3J0IGFuZCByZXF1aXJlIHN5bnRheFxuICAgIC8vIHNlcGFyYXRlbHkpIGFuZCBmaWxsIGluIEVTTmV4dCBvbmx5IHdoZW4gdGhlIHBhaXIgd291bGQgb3RoZXJ3aXNlIGJlIGludmFsaWQuXG4gICAgaWYgKG1vZHVsZUtpbmQgPT09IHVuZGVmaW5lZCB8fCAobW9kdWxlS2luZCAhPT0gJ3ByZXNlcnZlJyAmJiAhbW9kdWxlS2luZC5zdGFydHNXaXRoKCdlcycpKSkge1xuICAgICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZSA9ICdFU05leHQnO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ2J1bmRsZXInKSB7XG4gICAgLy8gVGhlIG5vZGUgYmFzZSBjb25maWdzIHByb3ZpZGUgYSBjb25zaXN0ZW50IG1vZHVsZS9yZXNvbHZlciBwYWlyLCBhbmQgZXZlcnlcbiAgICAvLyBtb2R1bGUga2luZCB0aGV5IG1heSBjaG9vc2UgaXMgaW52YWxpZCB3aXRoIGEgbGVmdG92ZXIgYnVuZGxlciByZXNvbHZlci5cbiAgICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb247XG4gIH1cblxuICBjb25zdCBtb2R1bGVLaW5kID0gbG93ZXJDYXNlU2V0dGluZyhjb21waWxlck9wdGlvbnMubW9kdWxlKTtcbiAgaWYgKG1vZHVsZUtpbmQgPT09ICdwcmVzZXJ2ZScgfHwgbW9kdWxlS2luZD8uc3RhcnRzV2l0aCgnZXMnKSkge1xuICAgIC8vIE5vZGUgYmFzZSBjb25maWdzIHBhaXIgdGhlaXIgcmVzb2x2ZXIgd2l0aCBhIG1hdGNoaW5nIG1vZHVsZSBraW5kOyBsZWZ0b3ZlclxuICAgIC8vIEVTL1ByZXNlcnZlIG92ZXJyaWRlcyBhcmUgaW52YWxpZCB3aXRoIGV2ZXJ5IHBhaXIgdGhleSBtYXkgY2hvb3NlLlxuICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxvd2VyQ2FzZVNldHRpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbW1vbkpzVHNjb25maWdTZXR0aW5ncyhcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucyB8fCBjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuaXNFc21QYWNrYWdlKSByZXR1cm47XG5cbiAgaWYgKGNvbXBpbGVyT3B0aW9ucy5tb2R1bGU/LnRvTG93ZXJDYXNlKCkgPT09ICdjb21tb25qcycpIHtcbiAgICAvLyBAdHNjb25maWcvbm9kZS1sdHMgbm93IHByb3ZpZGVzIG1vZHVsZVJlc29sdXRpb249bm9kZTE2LiBUeXBlU2NyaXB0IHJlcXVpcmVzXG4gICAgLy8gdGhlIG1vZHVsZSBraW5kIHRvIG1vdmUgd2l0aCB0aGF0IHJlc29sdmVyLCB3aGlsZSB2ZXJiYXRpbU1vZHVsZVN5bnRheD1mYWxzZVxuICAgIC8vIHByZXNlcnZlcyB0aGUgbG9uZy1zdGFuZGluZyBDb21tb25KUyBlbWl0IHNoYXBlIGZvciBleGlzdGluZyBwYWNrYWdlcy5cbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlID0gJ05vZGUxNic7XG4gIH1cbiAgY29tcGlsZXJPcHRpb25zLnZlcmJhdGltTW9kdWxlU3ludGF4ID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddXG4pOiBQaWNrPE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LCAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnPiB7XG4gIGNvbnN0IGVtaXRPcHRpb25zID0ge30gYXMgUGljazxcbiAgICBOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPixcbiAgICAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnXG4gID47XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnZGVjbGFyYXRpb24nLCAnZGVjbGFyYXRpb25NYXAnLCAnc291cmNlTWFwJ10gYXMgY29uc3QpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbXBpbGVyT3B0aW9ucz8uW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVtaXRPcHRpb25zW2tleV0gPSB2YWx1ZSBhcyBuZXZlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVtaXRPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2J1bicpO1xuICB9IGVsc2UgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbm9kZScpO1xuICB9XG4gIGlmIChcbiAgICBkZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgIGRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgZGVwZW5kZW5jaWVzWydqZXN0LWVudmlyb25tZW50LWpzZG9tJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICApIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdqZXN0Jyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy52aXRlc3QpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCd2aXRlc3QvZ2xvYmFscycpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMubW9jaGEpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdtb2NoYScpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMuY3lwcmVzcykge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2N5cHJlc3MnKTtcbiAgfVxuXG4gIHJldHVybiBbLi4udHlwZU5hbWVzXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBleGNsdWRlRmlsZVBhdHRlcm5zID0gW1xuICAnKiovLmdpdC9vYmplY3RzLyoqJyxcbiAgJyoqLy5naXQvc3VidHJlZS1jYWNoZS8qKicsXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovdG1wLyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovZGlzdC8qKicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVZzY29kZVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpO1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIC8vIExMTeOBq+OCiOOCi3ZpYmUgY29kaW5n44Gn44Gv44CB6Ieq5YuV44OV44Kp44O844Oe44OD44OI44KE44Kz44O844OJ44Ki44Kv44K344On44Oz44KS54Sh5Yq55YyW44GZ44KL44GT44Go44GnXG4gICAgICAvLyDnlJ/miJDjgZXjgozjgZ/jgrPjg7zjg4njga7lhYPjga7lvaLlvI/jgpLntq3mjIHjgafjgY3jgotcbiAgICAgIGlmICgnZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZSddO1xuICAgICAgfVxuICAgICAgaWYgKCdlZGl0b3IuZm9ybWF0T25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5mb3JtYXRPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc3ZlbHRlJywgJ2ZmM2UwMCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHknKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2xsbS1wciA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2FpLXByIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWFsbCA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jbGF1ZGUgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY29kZXggOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItZ2VtaW5pIDpyb2JvdDonKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmludGVyZmFjZSBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRhcmdldDogJ2JyYW5jaCc7XG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJztcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBpbmNsdWRlOiBzdHJpbmdbXTtcbiAgICAgIGV4Y2x1ZGU6IHN0cmluZ1tdO1xuICAgIH07XG4gIH07XG4gIHJ1bGVzOiAoXG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdkZWxldGlvbicgfCAnbm9uX2Zhc3RfZm9yd2FyZCc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJztcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIHN0cmljdF9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzX3BvbGljeTogYm9vbGVhbjtcbiAgICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfc3RhdHVzX2NoZWNrczoge1xuICAgICAgICAgICAgY29udGV4dDogc3RyaW5nO1xuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IG51bWJlcjtcbiAgICAgICAgICB9W107XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdwdWxsX3JlcXVlc3QnO1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgcmVxdWlyZWRfYXBwcm92aW5nX3Jldmlld19jb3VudDogbnVtYmVyO1xuICAgICAgICAgIGRpc21pc3Nfc3RhbGVfcmV2aWV3c19vbl9wdXNoOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3Jldmlld2VyczogW107XG4gICAgICAgICAgcmVxdWlyZV9jb2RlX293bmVyX3JldmlldzogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlX2xhc3RfcHVzaF9hcHByb3ZhbDogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9yZXZpZXdfdGhyZWFkX3Jlc29sdXRpb246IGJvb2xlYW47XG4gICAgICAgICAgYWxsb3dlZF9tZXJnZV9tZXRob2RzOiBbJ3NxdWFzaCddO1xuICAgICAgICB9O1xuICAgICAgfVxuICApW107XG4gIGJ5cGFzc19hY3RvcnM6IHtcbiAgICBhY3Rvcl9pZDogbnVtYmVyO1xuICAgIGFjdG9yX3R5cGU6ICdUZWFtJztcbiAgICBieXBhc3NfbW9kZTogJ3B1bGxfcmVxdWVzdCc7XG4gIH1bXTtcbn1cblxuaW50ZXJmYWNlIFJlcG9zaXRvcnlSdWxlc2V0U3VtbWFyeSB7XG4gIGlkPzogbnVtYmVyO1xuICBuYW1lPzogc3RyaW5nO1xuICBzb3VyY2VfdHlwZT86IHN0cmluZztcbn1cblxuY29uc3QgR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUiA9IHtcbiAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxufSBhcyBjb25zdDtcblxuY29uc3QgR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQgPSAxNV8zNjg7XG5cbmNvbnN0IFBST1RFQ1RfTUFJTl9SVUxFU0VUOiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQgPSB7XG4gIG5hbWU6ICdQcm90ZWN0IG1haW4nLFxuICB0YXJnZXQ6ICdicmFuY2gnLFxuICBlbmZvcmNlbWVudDogJ2FjdGl2ZScsXG4gIGNvbmRpdGlvbnM6IHtcbiAgICByZWZfbmFtZToge1xuICAgICAgZXhjbHVkZTogW10sXG4gICAgICBpbmNsdWRlOiBbJ35ERUZBVUxUX0JSQU5DSCddLFxuICAgIH0sXG4gIH0sXG4gIHJ1bGVzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2RlbGV0aW9uJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgc3RyaWN0X3JlcXVpcmVkX3N0YXR1c19jaGVja3NfcG9saWN5OiBmYWxzZSxcbiAgICAgICAgZG9fbm90X2VuZm9yY2Vfb25fY3JlYXRlOiB0cnVlLFxuICAgICAgICByZXF1aXJlZF9zdGF0dXNfY2hlY2tzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGV4dDogJ3Rlc3QgLyB0ZXN0JyxcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRleHQ6ICdzZW1hbnRpYy1wciAvIHNlbWFudGljLXByJyxcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdub25fZmFzdF9mb3J3YXJkJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdwdWxsX3JlcXVlc3QnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICByZXF1aXJlZF9hcHByb3ZpbmdfcmV2aWV3X2NvdW50OiAwLFxuICAgICAgICBkaXNtaXNzX3N0YWxlX3Jldmlld3Nfb25fcHVzaDogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVkX3Jldmlld2VyczogW10sXG4gICAgICAgIHJlcXVpcmVfY29kZV9vd25lcl9yZXZpZXc6IGZhbHNlLFxuICAgICAgICByZXF1aXJlX2xhc3RfcHVzaF9hcHByb3ZhbDogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVkX3Jldmlld190aHJlYWRfcmVzb2x1dGlvbjogZmFsc2UsXG4gICAgICAgIGFsbG93ZWRfbWVyZ2VfbWV0aG9kczogWydzcXVhc2gnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgXSxcbiAgYnlwYXNzX2FjdG9yczogW1xuICAgIHtcbiAgICAgIGFjdG9yX2lkOiAxN183NzdfNDk1LFxuICAgICAgYWN0b3JfdHlwZTogJ1RlYW0nLFxuICAgICAgYnlwYXNzX21vZGU6ICdwdWxsX3JlcXVlc3QnLFxuICAgIH0sXG4gIF0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJykgcmV0dXJuO1xuICAgIC8vIFRoZSByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBob3N0cyB3b3JrZmxvd19jYWxsIGRlZmluaXRpb25zLCBzbyB0aGVcbiAgICAvLyBQcm90ZWN0IG1haW4gcnVsZXNldCB3b3VsZCByZXF1aXJlIHRlc3Qvc2VtYW50aWMtcHIgY2hlY2tzIHRoYXQgbmV2ZXIgcnVuIHRoZXJlLlxuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhjb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHVwc2VydFByb3RlY3RNYWluUnVsZXNldChvY3Rva2l0LCBvd25lciwgcmVwbywgYnVpbGRQcm90ZWN0TWFpblJ1bGVzZXQoY29uZmlnKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gUmVwb3NpdG9yeSBydWxlc2V0cyByZXF1aXJlIGFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb24sIHdoaWNoIGxvY2FsIHJ1bnNcbiAgICAgIC8vIG1heSBub3QgaGF2ZSBldmVuIHdoZW4gZmlsZS1nZW5lcmF0aW9uIGFuZCBwdXNoZXMgYXJlIGFsbG93ZWQuXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFByb3RlY3RNYWluUnVsZXNldChjb25maWc6IFBhY2thZ2VDb25maWcpOiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQge1xuICBjb25zdCBydWxlc2V0ID0gc3RydWN0dXJlZENsb25lKFBST1RFQ1RfTUFJTl9SVUxFU0VUKTtcbiAgaWYgKGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzZXQucnVsZXMpIHtcbiAgICAgIGlmIChydWxlLnR5cGUgIT09ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJykgY29udGludWU7XG4gICAgICAvLyBUaGUgY29udGV4dCBpcyBgPGNhbGxlciBqb2IgaWQ+IC8gPHJldXNhYmxlIGpvYiBpZD5gIG9mIHRoZSB3YmZ5LWdlbmVyYXRlZCB0ZXN0LXJ1c3QueW1sLlxuICAgICAgcnVsZS5wYXJhbWV0ZXJzLnJlcXVpcmVkX3N0YXR1c19jaGVja3MucHVzaCh7XG4gICAgICAgIGNvbnRleHQ6ICd0ZXN0LXJ1c3QgLyB0ZXN0LXJ1c3QnLFxuICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ1bGVzZXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwc2VydFByb3RlY3RNYWluUnVsZXNldChcbiAgb2N0b2tpdDogT2N0b2tpdCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nLFxuICBydWxlc2V0OiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBleGlzdGluZ1J1bGVzZXQgPSBhd2FpdCBmaW5kUmVwb3NpdG9yeVJ1bGVzZXQob2N0b2tpdCwgb3duZXIsIHJlcG8sIHJ1bGVzZXQubmFtZSk7XG4gIGNvbnN0IGV4aXN0aW5nUnVsZXNldElkID0gZXhpc3RpbmdSdWxlc2V0Py5pZDtcblxuICBhd2FpdCB3aXRoUmV0cnkoXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGV4aXN0aW5nUnVsZXNldElkKSB7XG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBydWxlc2V0X2lkOiBleGlzdGluZ1J1bGVzZXRJZCxcbiAgICAgICAgICAuLi5ydWxlc2V0LFxuICAgICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMnLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgICAuLi5ydWxlc2V0LFxuICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICB7XG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgIH1cbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSdWxlc2V0KFxuICBvY3Rva2l0OiBPY3Rva2l0LFxuICBvd25lcjogc3RyaW5nLFxuICByZXBvOiBzdHJpbmcsXG4gIHJ1bGVzZXROYW1lOiBzdHJpbmdcbik6IFByb21pc2U8UmVwb3NpdG9yeVJ1bGVzZXRTdW1tYXJ5IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2l0aFJldHJ5KFxuICAgICgpID0+XG4gICAgICBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMnLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgICBpbmNsdWRlc19wYXJlbnRzOiBmYWxzZSxcbiAgICAgICAgdGFyZ2V0czogJ2JyYW5jaCcsXG4gICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICB9KSxcbiAgICB7XG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgIH1cbiAgKTtcbiAgY29uc3QgcnVsZXNldHMgPSByZXNwb25zZS5kYXRhO1xuICBpZiAoIUFycmF5LmlzQXJyYXkocnVsZXNldHMpKSByZXR1cm47XG4gIHJldHVybiBydWxlc2V0cy5maW5kKChydWxlc2V0KSA9PiBydWxlc2V0Lm5hbWUgPT09IHJ1bGVzZXROYW1lICYmIHJ1bGVzZXQuc291cmNlX3R5cGUgPT09ICdSZXBvc2l0b3J5Jyk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICByZXR1cm4gc3RhdHVzID09PSA0MDEgfHwgc3RhdHVzID09PSA0MDMgfHwgc3RhdHVzID09PSA0MDQ7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGRvdGVudiBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgc29kaXVtTW9kdWxlIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IERFUFJFQ0FURURfU0VDUkVUX05BTUVTID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJywgJ0dIX0JPVF9QQVQnLCAnUFVCTElDX0dIX0JPVF9QQVQnXTtcbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlY3JldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBTZWNyZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8gfHwgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSB8fCAhb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycykgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gZG90ZW52LmNvbmZpZyh7IHBhdGg6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lbnYnKSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBjb25zdCBzb2RpdW0gPSBnZXRTb2RpdW0oKTtcbiAgICAgIGF3YWl0IHNvZGl1bS5yZWFkeTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2VjcmV0XSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVCcgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVInIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBzZWNyZXRfbmFtZTogbmFtZSxcbiAgICAgICAgICBlbmNyeXB0ZWRfdmFsdWU6IGVuY0Jhc2U2NCxcbiAgICAgICAgICBrZXlfaWQ6IGtleUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwU2VjcmV0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFNvZGl1bSgpOiB0eXBlb2Ygc29kaXVtTW9kdWxlIHtcbiAgLy8gbGlic29kaXVtLXdyYXBwZXJzJyBFU00gZW50cnkgY2FuIGJpbmQgdG8gbGlic29kaXVtQDAuOC4zLCB3aG9zZSBkZWZhdWx0XG4gIC8vIGV4cG9ydCBubyBsb25nZXIgZXhwb3NlcyByZWFkeS4gVGhlIENvbW1vbkpTIGVudHJ5IGtlZXBzIHRoZSBBUEkgc2hhcGUuXG4gIHJldHVybiByZXF1aXJlKCdsaWJzb2RpdW0td3JhcHBlcnMnKSBhcyB0eXBlb2Ygc29kaXVtTW9kdWxlO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBHaXRIdWJTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXBvc2l0b3J5IHNldHRpbmdzIG5lZWQgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgdW5saWtlIGZpbGUgZ2VuZXJhdGlvbi5cbiAgICAgIGF3YWl0IHdpdGhSZXRyeShcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgICAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIExvY2FsIHdiZnkgcnVucyBvZnRlbiBoYXZlIHB1c2ggcGVybWlzc2lvbiB3aXRob3V0IGFkbWluIHBlcm1pc3Npb24uXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBHaXRIdWJTZXR0aW5ncyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCAhKCdzdGF0dXMnIGluIGVycm9yKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZXJyb3Iuc3RhdHVzID09PSA0MDEgfHwgZXJyb3Iuc3RhdHVzID09PSA0MDMgfHwgZXJyb3Iuc3RhdHVzID09PSA0MDQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIgPSAnX19QTV9SVU5fXyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIFRoZSB0ZXN0IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gdGVzdFxcYCkgcGFzc2VkLlxuICAtIFRoZSBsaW50IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gbGludFxcYCkgcGFzc2VkLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiB0aGUgR2l0SHViIGRpZmYgdmlldy5cbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdCBteSBjaGFuZ2VzLlxuLSBbIF0gSSd2ZSBhZGRlZCBzY3JlZW5zaG90cyAoaWYgdGhlIFVJIGNoYW5nZWQpLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlclJlcG8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgbmV3Q29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZShuZXdDb250ZW50LCBjb25maWcpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlKG9sZENvbnRlbnQsIGNvbnRlbnQpID4gY29udGVudC5sZW5ndGggLyAyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2VBbGwocGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciwgcGFja2FnZU1hbmFnZXJDb21tYW5kKTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuY29uc3QgYWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm4gPSBTdHJpbmcucmF3YCg/OldpbGxCb29zdGVyfFdpbGxCb29zdGVyTGFiKWA7XG5jb25zdCBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zID0gW1xuICBuZXcgUmVnRXhwKGBeJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKGBeZ2l0aHViOiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzojXFxcXFMrKT8kYCwgJ3UnKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9odHRwczovL2dpdGh1YlxcXFwuY29tLyR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsXG4gICAgJ3UnXG4gICksXG4gIG5ldyBSZWdFeHAoXG4gICAgYF4oPzpnaXRcXFxcKyk/c3NoOi8vZ2l0QGdpdGh1YlxcXFwuY29tWzovXSR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsXG4gICAgJ3UnXG4gICksXG4gIG5ldyBSZWdFeHAoYF4oPzpnaXRcXFxcKyk/Z2l0QGdpdGh1YlxcXFwuY29tOiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsICd1JyksXG5dO1xuXG5pbnRlcmZhY2UgRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2Uge1xuICBkZXBlbmRlbmN5TmFtZTogc3RyaW5nO1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIHNlY3Rpb25OYW1lOiAodHlwZW9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cylbbnVtYmVyXTtcbiAgc3BlY2lmaWVyOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzID0gY29uZmlncy5mbGF0TWFwKGdldERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlcyk7XG4gIGlmIChkaXNhbGxvd2VkU291cmNlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXRhaWxzID0gZGlzYWxsb3dlZFNvdXJjZXNcbiAgICAubWFwKFxuICAgICAgKHsgZGVwZW5kZW5jeU5hbWUsIGRpclBhdGgsIHNlY3Rpb25OYW1lLCBzcGVjaWZpZXIgfSkgPT5cbiAgICAgICAgYC0gJHtwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpfTogJHtzZWN0aW9uTmFtZX0uJHtkZXBlbmRlbmN5TmFtZX0gdXNlcyAke3NwZWNpZmllcn1gXG4gICAgKVxuICAgIC5qb2luKCdcXG4nKTtcblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYERpc2FsbG93ZWQgR2l0IGRlcGVuZGVuY3kgc291cmNlcyBmb3VuZC5cXG5Pbmx5IFdpbGxCb29zdGVyIGFuZCBXaWxsQm9vc3RlckxhYiBHaXRIdWIgZGVwZW5kZW5jaWVzIGFyZSBhbGxvd2VkLlxcbiR7ZGV0YWlsc31gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdIHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBjb25maWcucGFja2FnZUpzb247XG4gIGlmICghcGFja2FnZUpzb24pIHJldHVybiBbXTtcblxuICBjb25zdCBkaXNhbGxvd2VkU291cmNlczogRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHNlY3Rpb25OYW1lIG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBwYWNrYWdlSnNvbltzZWN0aW9uTmFtZV07XG4gICAgaWYgKCFzZWN0aW9uKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW2RlcGVuZGVuY3lOYW1lLCBzcGVjaWZpZXJdIG9mIE9iamVjdC5lbnRyaWVzKHNlY3Rpb24pKSB7XG4gICAgICBpZiAoIXNwZWNpZmllcikgY29udGludWU7XG4gICAgICBpZiAoIWlzR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXIpKSBjb250aW51ZTtcbiAgICAgIGlmIChpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuXG4gICAgICBkaXNhbGxvd2VkU291cmNlcy5wdXNoKHtcbiAgICAgICAgZGVwZW5kZW5jeU5hbWUsXG4gICAgICAgIGRpclBhdGg6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBzZWN0aW9uTmFtZSxcbiAgICAgICAgc3BlY2lmaWVyLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkaXNhbGxvd2VkU291cmNlcztcbn1cblxuZnVuY3Rpb24gaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaXNHaXRIdWJTaG9ydGhhbmRTcGVjaWZpZXIoc3BlY2lmaWVyKSB8fFxuICAgIC9eKD86Yml0YnVja2V0fGdpc3R8Z2l0aHVifGdpdGxhYik6L3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL15odHRwcz86XFwvXFwvKD86Yml0YnVja2V0XFwub3JnfGdpdGh1YlxcLmNvbXxnaXRsYWJcXC5jb20pXFwvL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpodHRwcz98c3NoKTpcXC9cXC9cXFMrXFwuZ2l0KD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXlteQFxcc10rQFteOlxcc10rOlxcUysoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQ6JykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZ2l0KycpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ3NzaDovL2dpdEAnKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15bYS16QS1aMC05XVtcXHcuLV0qXFwvW1xcdy4tXSsoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKTtcbn1cblxuZnVuY3Rpb24gaXNBbGxvd2VkR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gYWxsb3dlZEdpdERlcGVuZGVuY3lQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3Qoc3BlY2lmaWVyKSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpeE5leHRDb25maWdKc29uIH0gZnJvbSAnLi9maXhlcnMvbmV4dENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQbGF5d3JpZ2h0Q29uZmlnIH0gZnJvbSAnLi9maXhlcnMvcGxheXdyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQcmlzbWFFbnZGaWxlcyB9IGZyb20gJy4vZml4ZXJzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9maXhlcnMvdGVzdERpcmVjdG9yeS5qcyc7XG5pbXBvcnQgeyBmaXhUeXBlRGVmaW5pdGlvbnMgfSBmcm9tICcuL2ZpeGVycy90eXBlRGVmaW5pdGlvbi5qcyc7XG5pbXBvcnQgeyBmaXhUeXBvcyB9IGZyb20gJy4vZml4ZXJzL3R5cG9zLmpzJztcbmltcG9ydCB7IGZpeFdiRGJDb21tYW5kIH0gZnJvbSAnLi9maXhlcnMvd2JEYkNvbW1hbmQuanMnO1xuaW1wb3J0IHsgdW50cmFja1dvcmtlclR5cGVzIH0gZnJvbSAnLi9maXhlcnMvd29ya2VyVHlwZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZW1vdmVHZW1pbmlTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94Zm10Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294Zm10Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hsaW50Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294bGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhSYWlsd2F5aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JhaWx3YXlpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWFkbWUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVhZG1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVsZWFzZXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlbGVhc2VyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbm92YXRlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb24uanMnO1xuaW1wb3J0IHsgaW5zdGFsbEFnZW50U2tpbGxzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3NraWxscy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRzY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3RzY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MsIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlWWFybnJjWW1sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3lhcm5yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIH0gZnJvbSAnLi9naXRodWIvcnVsZXNldC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZXNXb3JrZXJUeXBlcywgZ2V0UGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMgfSBmcm9tICcuL3V0aWxzL2RlcGVuZGVuY3lTb3VyY2VQb2xpY3kuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzIH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVR5cGVTY3JpcHRBcGkgfSBmcm9tICcuL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKCckMCBbcGF0aHMuLl0nLCAnTWFrZSBhIGdpdmVuIHByb2plY3QgZm9sbG93IHRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCcsICh5YXJncykgPT4ge1xuICAgICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aHMnLCB7XG4gICAgICAgIGRlc2NyaWJlOiAncHJvamVjdCBwYXRocyB0byBiZSB3YmZpZWQnLFxuICAgICAgICBhcnJheTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IFsnLiddLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAub3B0aW9ucyh7XG4gICAgICBlbnY6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdVcGxvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHNlY3JldHMgdG8gR2l0SHViJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdlJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1NraXAgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gICAgLnN0cmljdCgpLmFyZ3Y7XG4gIG9wdGlvbnMuaXNWZXJib3NlID0gYXJndi52ZXJib3NlO1xuICBvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzID0gYXJndi5lbnY7XG5cbiAgbGV0IGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBhd2FpdCB3aWxsYm9vc3RlcmlmeVBhdGhzKGFyZ3YucGF0aHMgYXMgc3RyaW5nW10sIGFyZ3Yuc2tpcERlcHMpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIFRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyIHNlcnZlciBzcGF3bmVkIGZvciBBU1QgcGFyc2luZyBrZWVwcyBhbiBvcGVuIElQQ1xuICAgIC8vIGNoYW5uZWwgdGhhdCB3b3VsZCBvdGhlcndpc2UgcHJldmVudCB0aGUgTm9kZS5qcyBwcm9jZXNzIGZyb20gZXhpdGluZy5cbiAgICBkaXNwb3NlVHlwZVNjcmlwdEFwaSgpO1xuICB9XG4gIGlmIChoYXNJbnZhbGlkUGFja2FnZUNvbmZpZykge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdpbGxib29zdGVyaWZ5UGF0aHMocGF0aHM6IHN0cmluZ1tdLCBza2lwRGVwczogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgZm9yIChjb25zdCByb290RGlyUGF0aCBvZiBwYXRocykge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIH1cbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICByZW1vdmVHZW1pbmlTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBmaXhSYWlsd2F5aWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZW5vdmF0ZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihzaG91bGRSdW5Xb3JrZmxvd3MgPyBbZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyldIDogW10pLFxuICAgICAgc2V0dXBMYWJlbHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwU2VjcmV0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGludHN0YWdlZHJjKHJvb3RDb25maWcpLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcERlcHMpO1xuICAgICAgLy8gT25seSBhZnRlciBib3RoIHRoZSBiYXJyaWVyIGFib3ZlIOKAlCB3aGVyZSB0aGUgcG9vbGVkIC5naXRpZ25vcmUgd3JpdGUgYWN0dWFsbHkgY29tcGxldGVzIOKAlCBhbmQgdGhlXG4gICAgICAvLyBwYWNrYWdlLmpzb24gZ2VuZXJhdGlvbjogdW50cmFja2luZyBhIGZpbGUgdGhhdCBkaWQgbm90IGdldCBpZ25vcmVkIChlLmcuIHRoZSBnaXRpZ25vcmUuaW8gZmV0Y2ggZmFpbGVkKSBvclxuICAgICAgLy8gd2hvc2UgcG9zdGluc3RhbGwgZG9lcyBub3QgYWN0dWFsbHkgcmVnZW5lcmF0ZSBpdCAoZ2VuZXJhdGVQYWNrYWdlSnNvbiBzd2FsbG93cyBpdHMgb3duIGV4Y2VwdGlvbnMsIHNvIGFcbiAgICAgIC8vIHBhcnRpYWwgcnVuIGlzIHBvc3NpYmxlKSB3b3VsZCBkZWxldGUgdGhlIGRlY2xhcmF0aW9uIHdpdGggbm90aGluZyByZWNyZWF0aW5nIGl0IG9uIGZyZXNoIGNoZWNrb3V0cy5cbiAgICAgIGlmIChnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKSB7XG4gICAgICAgIGF3YWl0IHVudHJhY2tXb3JrZXJUeXBlcyhjb25maWcpO1xuICAgICAgfVxuXG4gICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZykpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiAmJiBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnKSk7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmIGRvZXNDb250YWluSnNPclRzKHJvb3RDb25maWcpKSB7XG4gICAgICAgIC8vIE1vbm9yZXBvIHZlcmlmaWNhdGlvbiBjYW4gaW52b2tlIG94bGludCBmcm9tIGV2ZXJ5IHdvcmtzcGFjZS4gR2l2ZVxuICAgICAgICAvLyBub24tY29kZSBwYWNrYWdlcyBhIGxvY2FsIGNvbmZpZyBzbyBveGxpbnQgZG9lcyBub3QgY2xpbWIgdG8gdGhlXG4gICAgICAgIC8vIHJvb3QgY29uZmlnIGFuZCByZWplY3Qgcm9vdC1vbmx5IHR5cGUtYXdhcmUgb3B0aW9ucyBmcm9tIGEgcGFja2FnZSBjd2QuXG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICBhd2FpdCBmaXhXYkRiQ29tbWFuZChyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICAvLyBSZWZyZXNoIGxvY2sgZmlsZXNcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3JlZnJlc2hCdW5Mb2NrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuXG4gICAgYXdhaXQgaW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWcpO1xuICB9XG4gIHJldHVybiBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZztcbn1cblxuZnVuY3Rpb24gcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAvLyB3YmZ5IHNob3VsZCB1cGRhdGUgb25seSB0aGUgcGFja2FnZXMgaXQgZXhwbGljaXRseSBtYW5hZ2VzIHRocm91Z2ggYnVuIGFkZC5cbiAgLy8gUnVubmluZyBidW4gdXBkYXRlIGhlcmUgcmVmcmVzaGVzIHVucmVsYXRlZCBhcHBsaWNhdGlvbiBkZXBlbmRlbmNpZXMgYW5kXG4gIC8vIGNhbiBjaGFuZ2UgcHJvZHVjdCBiZWhhdmlvciwgc28ga2VlcCB0aGUgZXhpc3RpbmcgbG9jayBhbmQgcmVjb25jaWxlIGl0LlxuICBjb25zdCBzdGF0dXMgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoJ2J1bicsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCk7XG4gIGlmIChzdGF0dXMgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIEJ1biBsb2NrZmlsZTogYnVuIGluc3RhbGwgZXhpdGVkIHdpdGggc3RhdHVzICR7c3RhdHVzfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMTIsMTMsMTQsMTUsMTYsMTddLCJtYXBwaW5ncyI6InF3QkFBQSxlQUFzQixHQUFNLEVBQXFDLENBQy9ELE9BQU8sSUFBSSxRQUFTLEdBQVksV0FBVyxFQUFTLENBQVksQ0FBQyxDQUNuRSxDQ2lDQSxlQUFzQixFQUFvQixFQUE4QyxDQUN0RixHQUFJLENBQ0YsT0FBTyxNQUFNLEVBQUcsQ0FDbEIsTUFBUSxDQUVSLENBQ0YsQ0FFQSxlQUFzQixHQUFxQixFQUE4QyxDQUN2RixHQUFJLENBQ0YsT0FBTyxNQUFNLEVBQUcsQ0FDbEIsT0FBUyxFQUFPLENBQ2QsR0FBSSxPQUFPLEdBQVUsVUFBWSxHQUFTLFNBQVUsR0FBUyxFQUFNLE9BQVMsU0FDMUUsT0FFRixNQUFNLENBQ1IsQ0FDRixDQTBCQSxlQUFzQixHQUNwQixFQUNBLENBQ0UsY0FDQSxjQUNBLGFBQWEsRUFDYixjQUNBLGNBQ0Esb0JBQW9CLEVBQ3BCLDJCQUNnQixDQUFDLEVBQ1AsQ0FDWixJQUFJLEVBQWMsRUFDbEIsT0FDRSxHQUFJLENBQ0YsT0FBTyxNQUFNLEVBQUssQ0FBVyxDQUMvQixPQUFTLEVBQU8sQ0FNZCxHQUxBLE1BQU0sSUFBYyxDQUFLLEVBQ3pCLElBQ0ksR0FBZSxHQUdmLEdBQWUsQ0FBQyxFQUFZLENBQUssRUFDbkMsTUFBTSxFQUVKLEVBQW9CLEdBQ3RCLE1BQU0sR0FBTSxDQUFpQixFQUUzQixJQUNGLEVBQW9CLEVBQXdCLENBQWlCLEdBRS9ELElBQWMsaUJBQWlCLEVBQU07RUFDekMsYUFBaUIsTUFBUTtHQUFXLEVBQU0sT0FBUyxJQUFNLElBQUksRUFDekQsTUFBTSxJQUFjLENBQUssQ0FDM0IsQ0FFSixDQzdHQSxNQUFhLEVBQVUsSUFBSSxLQUxiLENBQ1osVUFBWSxHQUNaLGtCQUFvQixFQUN0QixFQ2VhLEVBQVMsSUFBSSxLQWhCYixDQUNYLE1BQU0sMEJBQTBCLEVBQWMsRUFBMEMsQ0FDbEYsRUFBUSxXQUNWLFFBQVEsS0FBSyxhQUFhLEVBQUssaUJBQWlCLEVBRWxELEdBQUksQ0FDRixNQUFNLEVBQUssQ0FDYixPQUFTLEVBQU8sQ0FDZCxRQUFRLEtBQUsscUJBQXFCLEVBQUssSUFBSSxhQUFpQixNQUFRLEVBQU0sTUFBUSxPQUFPLENBQUssRUFBRSxFQUFFLENBQ3BHLENBQ0ksRUFBUSxXQUNWLFFBQVEsS0FBSyxjQUFjLEVBQUssZ0JBQWdCLENBRXBELENBQ0YsRUNiYSxFQUFTLENBQ3BCLE1BQU0sc0JBQXNCLEVBQStDLENBQ3pFLEdBQUksQ0FDRixPQUFPLE1BQU0sRUFBRyxTQUFTLFNBQVMsRUFBVSxNQUFNLENBQ3BELE1BQVEsQ0FFUixDQUNGLEVBQ0EsTUFBTSxhQUFhLEVBQWtCLEVBQWdDLENBQ25FLE1BQU0sRUFBRyxTQUFTLE1BQU0sRUFBSyxRQUFRLENBQVEsRUFBRyxDQUFFLFVBQVcsRUFBSyxDQUFDLEVBQ25FLElBQUksRUFBb0IsRUFBUSxLQUFLLEVBQ2pDLElBQ0YsR0FBcUI7R0FFdkIsTUFBTSxFQUFHLFNBQVMsVUFBVSxFQUFVLENBQWlCLENBRXpELENBQ0YsRUNsQmEsRUFBYyxJQUFJLEVDTS9CLElBQUksR0FFSixTQUFTLElBQWMsQ0FDckIsTUFBUSxNQUFRLElBQUksRUFBSSxDQUFFLElBQUssUUFBUSxJQUFJLENBQUUsQ0FBQyxDQUNoRCxDQU9BLFNBQWdCLEdBQWdCLEVBQTBDLENBQ3hFLEdBQUksQ0FFRixPQURpQixHQUFPLENBQUMsQ0FBQyxlQUFlLENBQUUsVUFBVyxDQUFDLENBQVEsQ0FBRSxDQUNuRCxDQUFDLENBQUMseUJBQXlCLENBQVEsQ0FBQyxFQUFFLFFBQVEsY0FBYyxDQUFRLENBQ3BGLE1BQVEsQ0FDTixNQUNGLENBQ0YsQ0FPQSxTQUFnQixJQUE2QixDQUMzQyxJQUFLLE1BQU0sRUFDWCxHQUFNLElBQUEsRUFDUixDQ3RCQSxNQUFNLEdBQStELENBQ25FLENBQUUsS0FBTSxnQkFBaUIsS0FBTSxxQkFBc0IsRUFDckQsQ0FBRSxLQUFNLGtCQUFtQixLQUFNLHVCQUF3QixFQUN6RCxDQUFFLEtBQU0sYUFBYyxLQUFNLHlDQUEwQyxDQUN4RSxFQUVBLGVBQXNCLEdBQWtCLEVBQXNDLENBQzVFLE9BQU8sRUFBTywwQkFBMEIsb0JBQXFCLFNBQVksQ0FDdkUsSUFBTSxFQUFXLENBQUMsS0FBTSxNQUFPLE1BQU8sS0FBTSxNQUFPLEtBQUssQ0FBQyxDQUN0RCxJQUFLLEdBQVEsRUFBSyxRQUFRLEVBQU8sUUFBUyxlQUFlLEdBQUssQ0FBQyxDQUFDLENBQ2hFLEtBQU0sR0FBTSxFQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQy9CLEdBQUksQ0FBQyxFQUFVLE9BRWYsSUFBTSxFQUFZLEdBQTJCLENBQVEsRUFDckQsR0FBSSxDQUFDLEVBQVcsT0FDaEIsR0FBTSxDQUFFLFNBQVEsaUJBQWtCLEVBRzVCLEVBQXFCLElBQUksSUFDN0IsRUFBYyxXQUFXLElBQUssR0FDNUIsU0FBVSxHQUFZLEVBQVMsS0FBTyxHQUFlLEVBQVMsS0FBTSxDQUFNLEVBQUksSUFBQSxFQUNoRixDQUNGLEVBQ00sRUFBZ0IsR0FDbkIsT0FBUSxHQUFhLENBQUMsRUFBbUIsSUFBSSxFQUFTLElBQUksQ0FBQyxDQUFDLENBQzVELElBQUssR0FBYSxFQUFTLElBQUksRUFDbEMsR0FBSSxFQUFjLFNBQVcsRUFBRyxPQUVoQyxJQUFNLEVBQWEsRUFBTyxLQUNwQixFQUFpQixFQUFjLE9BQU8sRUFBSSxFQUkxQyxFQUFlLEVBQWMsV0FBVyxHQUFHLEVBQUUsRUFDN0MsRUFBbUIsRUFDckIsR0FBYyxFQUFXLE1BQU0sRUFBYSxPQUFPLEVBQUcsQ0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFDbkYsR0FDRSxFQUFTLEVBQWMsV0FBVyxPQUFTLEdBQUssQ0FBQyxFQUFtQixLQUFPLEdBQzNFLEVBQWEsR0FBRyxFQUFXLE1BQU0sRUFBRyxDQUFjLElBQUksSUFBUyxFQUFjLEtBQUssSUFBSSxJQUFJLEVBQVcsTUFDekcsQ0FDRixJQUNBLE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVLENBQVUsQ0FBQyxDQUN2RSxDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQ1AsRUFDb0YsQ0FDcEYsSUFBTSxFQUFTLEdBQWdCLENBQVEsRUFDdkMsR0FBSSxDQUFDLEVBQVEsT0FNYixJQUFJLEVBQ0EsRUFDRSxFQUF5QixJQUFJLElBQzdCLEVBQTJELENBQUMsRUFFNUQsRUFBUyxHQUF5QixDQUN0QyxHQUFJLEVBQUksbUJBQW1CLENBQUksRUFBRyxDQUNoQyxJQUFNLEVBQWdCLEdBQW9CLEVBQUssVUFBVSxFQUNyRCxFQUNGLElBQXdCLEVBQ2YsRUFBSSxhQUFhLEVBQUssVUFBVSxJQUN6QyxJQUF1QixFQUFLLFdBQVcsUUFBUSxDQUFNLEVBRXpELE1BQU8sR0FDTCxFQUFJLG1CQUFtQixDQUFJLEdBQzNCLEVBQUssY0FBYyxPQUFTLEVBQUksV0FBVyxhQUMzQyxFQUFLLEtBQUssUUFBUSxDQUFNLElBQU0saUJBQzlCLENBQ0EsSUFBTSxFQUFnQixHQUFvQixFQUFLLEtBQUssRUFDaEQsRUFDRixJQUF3QixFQUNmLEVBQUksYUFBYSxFQUFLLEtBQUssSUFDcEMsSUFBdUIsRUFBSyxNQUFNLFFBQVEsQ0FBTSxFQUVwRCxNQUFPLEdBQUksRUFBSSxzQkFBc0IsQ0FBSSxHQUFLLEVBQUssWUFBYSxDQUM5RCxJQUFNLEVBQWdCLEdBQW9CLEVBQUssV0FBVyxFQUMxRCxHQUFJLEdBQWlCLEVBQUksYUFBYSxFQUFLLElBQUksRUFBRyxDQUNoRCxFQUF1QixJQUFJLEVBQUssS0FBSyxRQUFRLENBQU0sRUFBRyxDQUFhLEVBR25FLElBQU0sRUFBaUIsRUFBSyxNQUFNLFFBQVEsQ0FBTSxFQUMxQyxFQUFlLEdBQWdCLEVBQUssV0FBVyxDQUFDLEVBQUUsUUFBUSxDQUFNLEdBRW5FLElBQW1CLElBQUEsSUFBYSxHQUFpQixDQUFjLEdBQy9ELElBQWlCLElBQUEsSUFBYSxHQUFpQixDQUFZLElBQ3JDLEVBQTBCLEtBQUssQ0FBYSxDQUN2RSxDQUNGLENBQ0EsRUFBSyxhQUFhLENBQUssQ0FDekIsRUFDQSxFQUFPLGFBQWEsQ0FBSyxFQUV6QixJQUFNLEVBQ0osRUFBMEIsSUFDMUIsSUFDQyxFQUFxQixFQUF1QixJQUFJLENBQWtCLEVBQUksSUFBQSxLQUN2RSxFQUF1QixJQUFJLFlBQVksRUFDekMsT0FBTyxFQUFnQixDQUFFLFNBQVEsZUFBYyxFQUFJLElBQUEsRUFDckQsQ0FHQSxTQUFTLEdBQW9CLEVBQStELENBQzFGLElBQU0sRUFBVSxHQUFpQixDQUFJLEVBQ3JDLE9BQU8sRUFBSSwwQkFBMEIsQ0FBTyxFQUFJLEVBQVUsSUFBQSxFQUM1RCxDQUdBLFNBQVMsR0FBZ0IsRUFBZ0QsQ0FDdkUsSUFBTSxFQUFVLEdBQWtCLENBQUksRUFDdEMsT0FBTyxFQUFJLGVBQWUsQ0FBTyxHQUFLLEVBQUksc0JBQXNCLENBQU8sRUFBSSxFQUFRLEtBQU8sSUFBQSxFQUM1RixDQUdBLFNBQVMsR0FBaUIsRUFBZ0MsQ0FDeEQsSUFBSSxFQUFvQixHQUFrQixDQUFJLEVBQzlDLEtBQU8sRUFBSSxlQUFlLENBQU8sR0FBSyxFQUFJLHNCQUFzQixDQUFPLEdBQ3JFLEVBQVUsR0FBa0IsRUFBUSxVQUFVLEVBRWhELE9BQU8sQ0FDVCxDQUdBLFNBQVMsR0FBa0IsRUFBc0MsQ0FDL0QsSUFBSSxFQUFVLEVBQ2QsS0FBTyxFQUFJLDBCQUEwQixDQUFPLEdBQzFDLEVBQVUsRUFBUSxXQUVwQixPQUFPLENBQ1QsQ0FHQSxTQUFTLEdBQWlCLEVBQTJCLENBQ25ELE9BQU8sSUFBYSxjQUFnQixFQUFTLFNBQVMsYUFBYSxDQUNyRSxDQUlBLFNBQVMsR0FBZSxFQUF3QixFQUFnQyxDQUM5RSxNQUFPLFNBQVUsR0FBUSxPQUFPLEVBQUssTUFBUyxTQUFXLEVBQUssS0FBTyxFQUFLLFFBQVEsQ0FBTSxDQUMxRixDQUdBLFNBQVMsR0FBYyxFQUFzQixDQUMzQyxPQUFPLEVBQUssV0FBVywrQkFBZ0MsRUFBRSxDQUMzRCxDQ2pLQSxTQUFnQixFQUFrQixFQUFnQyxDQUNoRSxPQUNFLEVBQU8sdUJBQ1AsRUFBTyxpQ0FDUCxFQUFPLHVCQUNQLEVBQU8sK0JBRVgsQ0FFQSxTQUFnQixFQUFnQixFQUFnQyxDQUM5RCxPQUFPLEVBQU8saUJBQW1CLEVBQU8seUJBQzFDLENBRUEsU0FBZ0IsR0FBeUIsRUFBc0QsQ0FDN0YsT0FBTyxFQUFPLE1BQVEsTUFBUSxNQUNoQyxDQ1VBLE1BQU0sRUFBVyxJQUFnQyxDQUFFLEtBQU0sVUFBVyxPQUFNLEdBQ3BFLEdBQVcsSUFBdUMsQ0FBRSxLQUFNLFFBQVMsT0FBTSxHQUN6RSxJQUFZLEVBQXlDLEVBQXlCLENBQUMsS0FBb0IsQ0FDdkcsS0FBTSxTQUNOLE1BQU8sR0FBZSxFQUFZLENBQVksQ0FDaEQsR0FFQSxTQUFTLEdBQW9CLEVBQXVCLEVBQW1ELENBQ3JHLElBQU0sRUFBTSxHQUFlLENBQ3pCLE1BQU8sRUFBUSx5REFBeUQsRUFDeEUsV0FBWSxFQUFRLDJDQUEyQyxFQUMvRCxNQUFPLEVBQVEseURBQXlELENBQzFFLENBQUMsRUFPRCxPQUxJLElBQ0YsRUFBSSxXQUFXLFFBQVUsRUFBUSxrQ0FBa0MsRUFDbkUsRUFBSSxZQUFZLFFBQVEsQ0FBRSxLQUFNLFdBQVksSUFBSyxTQUFVLENBQUMsR0FHdkQsR0FBZSxDQUNwQixXQUFZLEVBQVEsa0JBQWtCLEVBQ3RDLFFBQVMsRUFBUSxrREFBa0QsRUFDbkUsSUFBSyxDQUFFLEtBQU0sU0FBVSxNQUFPLENBQUksRUFDbEMsR0FBSSxFQUNBLENBQ0UsVUFBVyxHQUFTLENBQ2xCLFFBQVMsRUFBUSxHQUFzQixDQUFNLENBQUMsRUFDOUMsSUFBSyxFQUFRLGtDQUFrQyxFQUMvQyxvQkFBcUIsRUFBUSxrQkFBa0IsRUFDL0MsUUFBUyxFQUFRLFNBQVMsRUFDMUIsT0FBUSxFQUFRLFFBQVEsRUFDeEIsT0FBUSxFQUFRLFFBQVEsRUFDeEIsSUFBSyxFQUFROzs7RUFHdkIsRUFDVSxpQkFBa0IsRUFBUTs7O0VBR3BDLENBQ1EsQ0FBQyxDQUNILEVBQ0EsQ0FBQyxDQUNQLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBZSxFQUF5QyxFQUF5QixDQUFDLEVBQWlCLENBQzFHLE1BQU8sQ0FDTCxlQUNBLFlBQWEsQ0FDWCxHQUFHLE9BQU8sS0FBSyxDQUFVLENBQUMsQ0FBQyxJQUFLLElBQXVCLENBQUUsS0FBTSxXQUFZLEtBQUksRUFBRSxFQUNqRixHQUFHLEVBQWEsS0FBSyxFQUFHLEtBQXlCLENBQUUsS0FBTSxRQUFTLE9BQU0sRUFBRSxDQUM1RSxFQUNBLFlBQ0YsQ0FDRixDQUVBLGVBQXNCLEdBQW9CLEVBQXNDLENBQzlFLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLHNCQUFzQixFQUMvRCxLQUFHLFdBQVcsQ0FBUSxFQUUzQixPQUFPLEVBQU8sMEJBQTBCLHNCQUF1QixTQUFZLENBQ3pFLElBQU0sRUFBeUIsR0FBaUMsQ0FBUSxFQUN4RSxHQUFJLENBQUMsRUFBd0IsT0FFN0IsSUFBTSxFQUFTLEdBQTZCLEVBQXVCLEtBQU0sRUFBdUIsTUFBTSxFQUN0RyxHQUFJLENBQUMsRUFBUSxPQUliLElBQU0sRUFBZ0IsR0FBb0IsRUFEdkMsTUFBTSxHQUE0QixFQUFPLE9BQU8sR0FBTSxHQUE4QixFQUFRLENBQU0sQ0FDekIsRUFDdEUsRUFBUyxHQUFtQixFQUFlLENBQU0sRUFDdkQsR0FBd0IsRUFBUSxDQUFhLEVBQzdDLEdBQW9CLEVBQVEsQ0FBTSxFQUVsQyxJQUFNLEVBQW1CLEdBQWUsQ0FBRSxLQUFNLFNBQVUsTUFBTyxDQUFPLEVBQUcsQ0FBQyxFQUN0RSxFQUFhLEVBQXVCLE9BQU8sS0FDM0MsRUFBUSxFQUF1QixLQUFLLFNBQVMsRUFBdUIsTUFBTSxFQUMxRSxFQUFNLEVBQXVCLEtBQUssT0FBTyxFQUN6QyxFQUFhLEdBQUcsRUFBVyxNQUFNLEVBQUcsQ0FBSyxJQUFJLElBQW1CLEVBQVcsTUFBTSxDQUFHLElBRTFGLE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVLENBQVUsQ0FBQyxDQUN2RSxDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQW1CLEVBQW9CLEVBQXNDLENBQ3BGLElBQU0sRUFBdUIsSUFBSSxJQUFJLE9BQU8sS0FBSyxFQUFTLFVBQVUsQ0FBQyxFQUMvRCxFQUFlLENBQUMsR0FBRyxFQUFLLGFBQWMsR0FBRyxFQUFTLFlBQVksRUFFOUQsRUFBYyxDQUNsQixHQUFHLEVBQUssWUFBWSxPQUFRLEdBQVcsRUFBTyxPQUFTLFlBQWMsQ0FBQyxFQUFxQixJQUFJLEVBQU8sR0FBRyxDQUFDLEVBQzFHLEdBQUcsRUFBUyxZQUFZLElBQUssR0FDdkIsRUFBTyxPQUFTLFdBQW1CLEVBQ2hDLENBQUUsS0FBTSxRQUFTLE1BQU8sRUFBSyxhQUFhLE9BQVMsRUFBTyxLQUFNLENBQ3hFLENBQ0gsRUFDTSxFQUFhLENBQUUsR0FBRyxFQUFLLFVBQVcsRUFDeEMsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLE9BQU8sUUFBUSxFQUFTLFVBQVUsRUFDM0QsRUFBVyxHQUFPLEdBQWlCLEVBQVcsR0FBTSxDQUFLLEVBRTNELE1BQU8sQ0FBRSxlQUFjLGNBQWEsWUFBVyxDQUNqRCxDQUVBLFNBQVMsR0FBaUIsRUFBK0IsRUFBb0MsQ0FJM0YsT0FISSxHQUFNLE9BQVMsVUFBWSxFQUFTLE9BQVMsU0FDeEMsQ0FBRSxLQUFNLFNBQVUsTUFBTyxHQUFtQixFQUFLLE1BQU8sRUFBUyxLQUFLLENBQUUsRUFFMUUsQ0FDVCxDQUVBLFNBQVMsR0FBd0IsRUFBc0IsRUFBbUMsQ0FDeEYsSUFBTSxFQUFNLEVBQU8sV0FBVyxJQUN4QixFQUFhLEVBQWMsV0FBVyxJQUN4QyxRQUFLLE9BQVMsVUFBWSxHQUFZLE9BQVMsVUFFbkQsSUFBSyxJQUFNLElBQU8sQ0FBQyxRQUFTLGFBQWMsT0FBTyxFQUFHLENBQ2xELElBQU0sRUFBZSxFQUFXLE1BQU0sV0FBVyxHQUM3QyxJQUNGLEVBQUksTUFBTSxXQUFXLEdBQU8sRUFFaEMsQ0FDRixDQUVBLFNBQVMsR0FBOEIsRUFBdUIsRUFBK0IsQ0FDM0YsT0FDRSxFQUFPLFVBQVUsTUFDakIsRUFBTyxXQUFXLFlBQWMsSUFBQSxJQUNoQyxHQUFzQixFQUFPLFdBQVcsR0FBRyxHQUMzQyxHQUF3QixDQUFFLEtBQU0sU0FBVSxNQUFPLENBQU8sRUFBRyxzQkFBc0IsQ0FFckYsQ0FFQSxTQUFTLEdBQXNCLEVBQXlDLENBQ3RFLE9BQU8sR0FBTyxPQUFTLFVBQVksRUFBTSxNQUFNLFdBQVcsVUFBWSxJQUFBLEVBQ3hFLENBRUEsU0FBUyxHQUF3QixFQUFvQixFQUE4QixDQUdqRixPQUZJLEVBQU0sT0FBUyxVQUFrQixFQUFNLE1BQU0sU0FBUyxDQUFXLEVBQ2pFLEVBQU0sT0FBUyxRQUFnQixFQUFNLE1BQU0sS0FBTSxHQUFVLEdBQXdCLEVBQU8sQ0FBVyxDQUFDLEVBRXhHLEVBQU0sTUFBTSxhQUFhLEtBQU0sR0FBVyxFQUFPLFNBQVMsQ0FBVyxDQUFDLEdBQ3RFLE9BQU8sT0FBTyxFQUFNLE1BQU0sVUFBVSxDQUFDLENBQUMsS0FBTSxHQUFVLEdBQXdCLEVBQU8sQ0FBVyxDQUFDLENBRXJHLENBRUEsZUFBZSxHQUE0QixFQUFtQyxDQUM1RSxJQUFLLElBQU0sS0FBZSxHQUFnQixDQUFPLEVBQy9DLEdBQUksQ0FDRixJQUFNLEVBQVUsTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFhLE1BQU0sRUFDOUQsR0FBSSw0QkFBNEIsS0FBSyxDQUFPLEVBQzFDLE1BQU8sRUFFWCxNQUFRLENBRVIsQ0FLRixNQUFPLEVBQ1QsQ0FFQSxTQUFTLEdBQWdCLEVBQTJCLENBQ2xELElBQU0sRUFBZSxDQUFDLE9BQVEsWUFBYSxlQUFnQixZQUFhLGdCQUFnQixFQUNsRixFQUF5QixDQUFDLEVBRWhDLElBQUssSUFBSSxFQUFpQixFQUFLLFFBQVEsQ0FBTyxFQUM1QyxFQUFhLEtBQUssR0FBRyxFQUFhLElBQUssR0FBYSxFQUFLLFFBQVEsRUFBZ0IsQ0FBUSxDQUFDLENBQUMsRUFNckUsRUFGbEIsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFnQixNQUFNLENBQUMsR0FFaEMsRUFBSyxRQUFRLENBQ25CLElBQU0sR0FSMkIsRUFBaUIsRUFBSyxRQUFRLENBQWMsR0FXL0YsT0FBTyxDQUNULENBRUEsU0FBUyxHQUFvQixFQUFzQixFQUE2QixDQUM5RSxJQUFNLEVBQVksRUFBTyxXQUFXLFVBQ2hDLEdBQVcsT0FBUyxXQUt4QixFQUFVLE1BQU0sV0FBVyxRQUFVLEVBQVEsR0FBc0IsQ0FBTSxDQUFDLEVBQzVFLENBRUEsU0FBUyxHQUFzQixFQUErQixDQUM1RCxNQUFPLElBQUksR0FBeUIsQ0FBTSxFQUFFLHVCQUM5QyxDQUVBLFNBQVMsR0FBaUMsRUFBc0QsQ0FDOUYsSUFBTSxFQUFTLEdBQWdCLENBQVEsRUFDdkMsR0FBSSxDQUFDLEVBQVEsT0FJYixJQUFJLEVBQ0UsRUFBUyxHQUF5QixDQUNsQyxNQUNKLElBQUksRUFBSSxpQkFBaUIsQ0FBSSxHQUFLLEVBQUssV0FBVyxRQUFRLENBQU0sSUFBTSxlQUFnQixDQUNwRixJQUFNLEVBQWdCLEVBQUssVUFBVSxHQUNyQyxHQUFJLEdBQWlCLEVBQUksMEJBQTBCLENBQWEsRUFBRyxDQUNqRSxFQUFRLEVBQ1IsTUFDRixDQUNGLENBQ0EsRUFBSyxhQUFhLENBQUssQ0FEdkIsQ0FFRixFQUdBLE9BRkEsRUFBTyxhQUFhLENBQUssRUFFbEIsRUFBUSxDQUFFLFNBQVEsS0FBTSxDQUFNLEVBQUksSUFBQSxFQUMzQyxDQUVBLFNBQVMsR0FBZ0IsRUFBNEIsRUFBaUQsQ0FDcEcsR0FBSSxFQUFJLDBCQUEwQixDQUFVLEVBQUcsQ0FDN0MsSUFBTSxFQUFlLEdBQTZCLEVBQVksQ0FBTSxFQUNwRSxPQUFPLEVBQWUsQ0FBRSxLQUFNLFNBQVUsTUFBTyxDQUFhLEVBQUksRUFBUSxFQUFXLFFBQVEsQ0FBTSxDQUFDLENBQ3BHLENBQ0EsR0FBSSxFQUFJLHlCQUF5QixDQUFVLEVBQUcsQ0FDNUMsSUFBTSxFQUFXLEVBQVcsU0FBUyxJQUFLLEdBQVksR0FBZ0IsRUFBUyxDQUFNLENBQUMsRUFJdEYsT0FISSxFQUFTLEtBQU0sR0FBa0MsSUFBWSxJQUFBLEVBQVMsRUFDakUsRUFBUSxFQUFXLFFBQVEsQ0FBTSxDQUFDLEVBRXBDLEdBQVEsQ0FBeUIsQ0FDMUMsQ0FDQSxPQUFPLEVBQVEsRUFBVyxRQUFRLENBQU0sQ0FBQyxDQUMzQyxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQzBCLENBQzFCLElBQU0sRUFBdUIsQ0FBRSxhQUFjLENBQUMsRUFBRyxZQUFhLENBQUMsRUFBRyxXQUFZLENBQUMsQ0FBRSxFQUNqRixJQUFLLElBQU0sS0FBWSxFQUFjLFdBQVksQ0FDL0MsR0FBSSxFQUFJLDhCQUE4QixDQUFRLEVBQUcsQ0FDL0MsSUFBTSxFQUFNLEVBQVMsS0FBSyxRQUFRLENBQU0sRUFDeEMsRUFBTyxXQUFXLEdBQU8sRUFBUSxDQUFHLEVBQ3BDLEVBQU8sWUFBWSxLQUFLLENBQUUsS0FBTSxXQUFZLEtBQUksQ0FBQyxFQUNqRCxRQUNGLENBQ0EsR0FDRSxDQUFDLEVBQUkscUJBQXFCLENBQVEsR0FDakMsQ0FBQyxFQUFJLGFBQWEsRUFBUyxJQUFJLEdBQUssQ0FBQyxFQUFJLGdCQUFnQixFQUFTLElBQUksRUFDdkUsQ0FDQSxJQUFNLEVBQVEsRUFBTyxhQUFhLEtBQUssRUFBUyxRQUFRLENBQU0sQ0FBQyxFQUFJLEVBQ25FLEVBQU8sWUFBWSxLQUFLLENBQUUsS0FBTSxRQUFTLE9BQU0sQ0FBQyxFQUNoRCxRQUNGLENBQ0EsSUFBTSxFQUFRLEdBQWdCLEVBQVMsWUFBYSxDQUFNLEVBQzFELEdBQUksSUFBVSxJQUFBLEdBQVcsT0FDekIsSUFBTSxFQUFNLEVBQVMsS0FBSyxRQUFRLENBQU0sRUFDeEMsRUFBTyxXQUFXLEdBQU8sRUFDekIsRUFBTyxZQUFZLEtBQUssQ0FBRSxLQUFNLFdBQVksS0FBSSxDQUFDLENBQ25ELENBQ0EsT0FBTyxDQUNULENBRUEsU0FBUyxHQUFlLEVBQW9CLEVBQXVCLENBQ2pFLElBQU0sRUFBZ0IsS0FBSyxPQUFPLENBQUssRUFDdkMsR0FBSSxFQUFNLE9BQVMsUUFBUyxDQUMxQixHQUFJLEVBQU0sTUFBTSxTQUFXLEVBQUcsTUFBTyxLQUNyQyxJQUFNLEVBQVMsS0FBSyxPQUFPLEVBQVEsQ0FBQyxFQVlwQyxNQUFPLE1BWE8sRUFBTSxNQUFNLElBQUssR0FBUyxDQUN0QyxJQUFNLEVBQWMsR0FBZSxFQUFNLEVBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTTtDQUFJLEVBRTlELEdBREEsRUFBWSxFQUFZLE9BQVMsR0FBSyxHQUFHLEVBQVksR0FBRyxFQUFFLEVBQUUsR0FDeEQsRUFBSyxPQUFTLFVBQ2hCLElBQUssSUFBSSxFQUFRLEVBQUcsRUFBUSxFQUFZLE9BQVEsR0FBUyxFQUN2RCxFQUFZLEdBQVMsR0FBRyxJQUFTLEVBQVksS0FJakQsTUFEQSxHQUFZLEdBQUssR0FBRyxJQUFTLEVBQVksS0FDbEMsRUFBWSxLQUFLO0NBQUksQ0FDOUIsQ0FDaUIsQ0FBQyxDQUFDLEtBQUs7Q0FBSSxFQUFFLElBQUksRUFBYyxFQUNsRCxDQUNBLEdBQUksRUFBTSxPQUFTLFVBQVcsT0FBTyxFQUFNLE1BRTNDLElBQU0sRUFBUyxLQUFLLE9BQU8sRUFBUSxDQUFDLEVBQzlCLEVBQW9CLElBQUksSUFDeEIsRUFBeUIsR0FBMEIsRUFBTSxNQUFNLFdBQVcsRUFDMUUsRUFBUSxFQUFNLE1BQU0sWUFBWSxTQUFTLEVBQVEsSUFBVSxDQUMvRCxHQUFJLEVBQU8sT0FBUyxRQUNsQixNQUFPLENBQUMsR0FBc0IsRUFBTSxNQUFNLGFBQWEsRUFBTyxRQUFVLEdBQUksQ0FBTSxDQUFDLEVBR3JGLEdBQUksRUFBdUIsSUFBSSxFQUFPLEdBQUcsSUFBTSxFQUFPLE1BQU8sQ0FBQyxFQUM5RCxJQUFNLEVBQU8sRUFBTSxNQUFNLFdBQVcsRUFBTyxLQUczQyxNQUZJLENBQUMsR0FBUSxFQUFrQixJQUFJLEVBQU8sR0FBRyxFQUFVLENBQUMsR0FDeEQsRUFBa0IsSUFBSSxFQUFPLEdBQUcsRUFDekIsQ0FBQyxHQUF3QixFQUFPLElBQUssRUFBTSxFQUFPLENBQU0sQ0FBQyxFQUNsRSxDQUFDLEVBT0QsT0FOQSxFQUFNLEtBQ0osR0FBRyxPQUFPLFFBQVEsRUFBTSxNQUFNLFVBQVUsQ0FBQyxDQUN0QyxRQUFRLENBQUMsS0FBUyxDQUFDLEVBQWtCLElBQUksQ0FBRyxDQUFDLENBQUMsQ0FDOUMsS0FBSyxDQUFDLEVBQUssS0FBVSxHQUF3QixFQUFLLEVBQU0sRUFBTyxDQUFNLENBQUMsQ0FDM0UsRUFDSSxFQUFNLFNBQVcsRUFBVSxNQUFNLEVBQWMsR0FDNUMsTUFBTSxFQUFNLEtBQUs7Q0FBSSxFQUFFLElBQUksRUFBYyxFQUNsRCxDQUVBLFNBQVMsR0FBMEIsRUFBa0QsQ0FDbkYsSUFBTSxFQUF5QixJQUFJLElBQ25DLElBQUssR0FBTSxDQUFDLEVBQU8sS0FBVyxFQUFZLFFBQVEsRUFDNUMsRUFBTyxPQUFTLFlBQ2xCLEVBQXVCLElBQUksRUFBTyxJQUFLLENBQUssRUFHaEQsT0FBTyxDQUNULENBRUEsU0FBUyxHQUF3QixFQUFhLEVBQW1CLEVBQWUsRUFBd0IsQ0FDdEcsSUFBTSxFQUFjLEdBQWUsRUFBTSxFQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU07Q0FBSSxFQUU5RCxHQURBLEVBQVksRUFBWSxPQUFTLEdBQUssR0FBRyxFQUFZLEdBQUcsRUFBRSxFQUFFLEdBQ3hELEVBQUssT0FBUyxVQUNoQixJQUFLLElBQUksRUFBUSxFQUFHLEVBQVEsRUFBWSxPQUFRLEdBQVMsRUFDdkQsRUFBWSxHQUFTLEdBQUcsSUFBUyxFQUFZLEtBSWpELE1BREEsR0FBWSxHQUFLLEdBQUcsSUFBUyxFQUFJLElBQUksRUFBWSxLQUMxQyxFQUFZLEtBQUs7Q0FBSSxDQUM5QixDQUVBLFNBQVMsR0FBc0IsRUFBZ0IsRUFBd0IsQ0FDckUsSUFBTSxFQUFjLEVBQU8sTUFBTTtDQUFJLEVBQ3JDLEVBQVksRUFBWSxPQUFTLEdBQUssR0FBRyxFQUFZLEdBQUcsRUFBRSxFQUFFLEdBQzVELElBQUssR0FBTSxDQUFDLEVBQU8sS0FBUyxFQUFZLFFBQVEsRUFDOUMsRUFBWSxHQUFTLEdBQUcsSUFBUyxJQUVuQyxPQUFPLEVBQVksS0FBSztDQUFJLENBQzlCLENDeFdBLE1BQWEsRUFBYSxDQUN4QixxQkFDQSx3QkFDQSxjQUNBLHNCQUNBLHNCQUNBLGFBQ0EsY0FDQSxlQUNBLGFBQ0EsV0FDRixFQ0ZBLGVBQXNCLEdBQWtCLEVBQXNDLENBQzVFLE9BQU8sRUFBTywwQkFBMEIsb0JBQXFCLFNBQVksQ0FDdkUsSUFBTSxFQUEyQixHQUErQixDQUFNLEVBQ2hFLEVBQVcsTUFBTSxFQUFHLEtBQUssQ0FBQyxRQUFTLFNBQVMsRUFBRyxDQUFFLElBQUssR0FBTSxJQUFLLEVBQU8sUUFBUyxPQUFRLENBQVcsQ0FBQyxFQUMzRyxJQUFLLElBQU0sS0FBVyxFQUFVLENBQzlCLElBQU0sRUFBYyxFQUFLLFFBQVEsRUFBTyxRQUFTLENBQU8sRUFDbEQsRUFBVSxNQUFNQSxFQUFHLFNBQVMsRUFBYSxNQUFNLEVBQy9DLEVBQWEsRUFBUSxXQUN6Qix3REFDQyxFQUFPLElBQ0MsaUJBQWlCLEdBQTJCLEVBQUssQ0FBd0IsRUFBRSxFQUV0RixFQUNJLElBQWUsR0FDakIsTUFBTUEsRUFBRyxVQUFVLEVBQWEsQ0FBVSxDQUU5QyxDQUNGLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBK0IsRUFBZ0MsQ0FDdEUsR0FBSSxDQUFDLEVBQU8sVUFBVSxPQUFRLE1BQU8sR0FFckMsSUFBTSxFQUFlLENBQ25CLEdBQUcsRUFBTyxhQUFhLGFBQ3ZCLEdBQUcsRUFBTyxhQUFhLGVBQ3pCLEVBSUEsTUFBTyxDQUFDLEVBQWEsbUNBQXFDLENBQUMsRUFBYSx5QkFDMUUsQ0FFQSxTQUFTLEdBQTJCLEVBQWEsRUFBMkMsQ0FDMUYsSUFBTSxFQUFhLEVBQUksUUFBUSxHQUFHLEVBQzVCLEVBQVcsSUFBZSxHQUFnQyxFQUEzQixFQUFJLE1BQU0sRUFBRyxDQUFVLEVBQ3RELEVBQVksSUFBZSxHQUFpQyxHQUE1QixFQUFJLE1BQU0sRUFBYSxDQUFDLEVBQ3hELEVBQVMsSUFBSSxnQkFBZ0IsQ0FBUyxFQUU1QyxFQUFPLE9BQU8sa0JBQWtCLEVBQzVCLEdBQ0YsRUFBTyxJQUFJLG1CQUFvQixHQUFHLEVBR3BDLElBQU0sRUFBa0IsRUFBTyxTQUFTLEVBQ3hDLE9BQU8sRUFBa0IsR0FBRyxFQUFTLEdBQUcsSUFBb0IsQ0FDOUQsQ0N2REEsTUFBTSxJQUFPLEVBQVEsSUFBUSxPQUFPLFVBQVUsZUFBZSxLQUFLLEVBQVEsQ0FBRyxFQUU3RSxTQUF3QixFQUF3QixFQUFRLEVBQVUsQ0FDaEUsSUFBSSxFQUFNLEVBQVEsRUFFZCxPQUFPLEdBQWEsV0FDdEIsRUFBUyxFQUVULEVBQU8sRUFHVCxJQUFNLEVBQVEsQ0FBQyxFQUdmLElBQUssSUFBTyxDQUZRLEdBQUksR0FBUSxDQUFDLEVBQUksR0FBRyxPQUFPLEtBQUssQ0FBTSxDQUFDLENBQUMsS0FBSyxDQUFNLENBRWxELEVBQ2YsR0FBSSxFQUFRLENBQUcsSUFDakIsRUFBTSxHQUFPLEVBQU8sSUFJeEIsT0FBTyxDQUNULENDcEJBLE1BQU0sR0FBZSxnQkFFZixHQUFvQixRQUkxQixTQUFTLEdBQXdCLEVBQW9CLEVBQVksRUFBTyxDQUN2RSxPQUFPLEdBQXNCLElBQWUsSUFBcUIsSUFBVSxDQUM1RSxDQWdCQSxTQUFTLEdBQWUsRUFBUSxFQUFvQixDQUNuRCxJQUFNLEVBQVUsSUFBSSxJQUdoQixFQUFlLEVBQ2YsRUFHQSxFQUVKLElBQUssSUFBTSxLQUFRLEVBQU8sTUFBTSxLQUFLLEVBQUcsQ0FDdkMsR0FBSSxDQUFDLEVBRUosU0FHRCxJQUFNLEVBQVUsRUFBSyxNQUFNLEVBQVksRUFFdkMsR0FBSSxJQUFZLEtBQ2YsRUFBZSxFQUNmLEVBQXFCLE9BQ2YsQ0FDTixJQUFNLEVBQVMsRUFBUSxFQUFFLENBQUMsT0FDcEIsRUFBYSxFQUFRLEdBQUssR0FBb0IsTUFHcEQsR0FBSSxHQUF3QixFQUFvQixFQUFZLENBQU0sRUFDakUsU0FHRyxJQUFlLElBQ2xCLEVBQWUsR0FHaEIsRUFBcUIsRUFFckIsSUFBSSxFQUFNLEVBQ04sRUFBUyxFQUVQLEVBQW1CLEVBQVMsRUFJbEMsR0FIQSxFQUFlLEVBR1gsSUFBcUIsRUFFeEIsRUFBTSxFQUVOLEVBQVMsTUFFSCxDQUNOLElBQU0sRUFBMkIsS0FBSyxJQUFJLENBQWdCLEVBSTFELEdBQUksR0FBd0IsRUFBb0IsRUFBWSxDQUF3QixFQUNuRixTQUdELEVBQU0sR0FBaUIsRUFBWSxDQUF3QixDQUM1RCxDQUdBLElBQU0sRUFBUSxFQUFRLElBQUksQ0FBRyxFQUM3QixFQUFRLElBQUksRUFBSyxJQUFVLElBQUEsR0FBWSxDQUFDLEVBQUcsQ0FBQyxFQUFJLENBQUMsRUFBTSxHQUFLLEVBQUssRUFBTSxHQUFLLENBQU0sQ0FBQyxDQUNwRixDQUNELENBRUEsT0FBTyxDQUNSLENBR0EsU0FBUyxHQUFpQixFQUFZLEVBQWMsQ0FFbkQsT0FEc0IsSUFBZSxHQUFvQixJQUFNLEtBQ3hDLE9BQU8sQ0FBWSxDQUMzQyxDQUdBLFNBQVMsR0FBaUIsRUFBWSxDQU1yQyxNQUFPLENBQUMsS0FMZ0IsRUFBVyxLQUFPLElBQ1gsR0FBb0IsTUFJckMsT0FGQyxPQUFPLEVBQVcsTUFBTSxDQUFDLENBRXJCLENBQUMsQ0FDckIsQ0FJQSxTQUFTLEdBQWUsRUFBUyxDQUNoQyxJQUFJLEVBQ0EsRUFBVSxFQUNWLEVBQVksRUFFaEIsSUFBSyxHQUFNLENBQUMsRUFBSyxDQUFDLEVBQVcsTUFBWSxHQUNwQyxFQUFZLEdBQVksSUFBYyxHQUFXLEVBQVMsS0FDN0QsRUFBVSxFQUNWLEVBQVksRUFDWixFQUFTLEdBSVgsT0FBTyxDQUNSLENBRUEsU0FBUyxHQUFpQixFQUFNLEVBQVEsQ0FFdkMsT0FEd0IsSUFBUyxHQUFvQixJQUFNLElBQUEsQ0FDcEMsT0FBTyxDQUFNLENBQ3JDLENBRUEsU0FBd0IsR0FBYSxFQUFRLENBQzVDLEdBQUksT0FBTyxHQUFXLFNBQ3JCLE1BQVUsVUFBVSxtQkFBbUIsRUFLeEMsSUFBSSxFQUFVLEdBQWUsRUFBUSxFQUFJLEVBQ3JDLEVBQVEsT0FBUyxJQUNwQixFQUFVLEdBQWUsRUFBUSxFQUFLLEdBR3ZDLElBQU0sRUFBc0IsR0FBZSxDQUFPLEVBRTlDLEVBQ0EsRUFBUyxFQUNULEVBQVMsR0FPYixPQUxJLElBQXdCLElBQUEsS0FDMUIsa0JBQWlCLEdBQWlCLENBQW1CLEVBQ3RELEVBQVMsR0FBaUIsRUFBTSxDQUFNLEdBR2hDLENBQ04sU0FDQSxPQUNBLFFBQ0QsQ0FDRCxDQ2xLQSxTQUFnQixHQUFjLEVBQVEsQ0FDckMsR0FBSSxPQUFPLEdBQVcsU0FDckIsTUFBVSxVQUFVLG1CQUFtQixFQUd4QyxJQUFNLEVBQVcsRUFBTyxNQUFNLFlBQVksR0FBSyxDQUFDLEVBRWhELEdBQUksRUFBUyxTQUFXLEVBQ3ZCLE9BR0QsSUFBTSxFQUFPLEVBQVMsT0FBTyxHQUFXLElBQVk7Q0FBTSxDQUFDLENBQUMsT0FHNUQsT0FBTyxFQUZJLEVBQVMsT0FBUyxFQUVWO0VBQVM7Q0FDN0IsQ0FFQSxTQUFnQixHQUFzQixFQUFRLENBQzdDLE9BQVEsT0FBTyxHQUFXLFVBQVksR0FBYyxDQUFNLEdBQU07Q0FDakUsNGFFbkJBLFNBQXdCLEdBQWMsRUFBTyxDQUM1QyxHQUFJLE9BQU8sR0FBVSxXQUFZLEVBQ2hDLE1BQU8sR0FHUixJQUFNLEVBQVksT0FBTyxlQUFlLENBQUssRUFDN0MsT0FBUSxJQUFjLE1BQVEsSUFBYyxPQUFPLFdBQWEsT0FBTyxlQUFlLENBQVMsSUFBTSxPQUFTLEVBQUUsT0FBTyxlQUFlLElBQVUsRUFBRSxPQUFPLFlBQVksRUFDdEssQ0NFQSxNQUFNLEVBQ0gsSUFDQSxFQUFHLEdBQUcsSUFDTCxFQUFJLFFBQVEsRUFBUSxJQUFPLEVBQUcsRUFBUSxHQUFHLENBQUksRUFBRyxDQUFDLEVBQy9DLEVBQVcsR0FBUSxHQUFPLE1BQU0sUUFBUSxDQUFDLEVBQUksRUFBRyxDQUFDLEVBQUksRUFDckQsR0FBaUIsR0FBUSxHQUM3QixNQUFNLFFBQVEsQ0FBQyxHQUFLLEVBQUUsTUFBTyxHQUFTLE9BQU8sR0FBUyxRQUFRLEVBQUksRUFBRyxDQUFDLEVBQUksRUFDdEUsR0FBTyxHQUFlLEdBQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFFLENBQUMsQ0FBQyxFQUU3QyxHQUFtQixFQUFLLENBQUMsR0FEYixHQUFlLEdBQVUsRUFBTSxTQUFTLENBQ2IsQ0FBQyxDQUFDLEVBQ3pDLEVBQ0gsSUFDQSxFQUFHLEdBQUcsSUFDTCxHQUFjLENBQUMsRUFBSSxFQUFHLEVBQUcsR0FBRyxDQUFJLEVBQUksRUFDbEMsR0FBZ0IsRUFBWSxJQUFTLENBQ3pDLElBQU0sRUFBTyxFQUFVLElBQ2pCLElBQ0YsRUFBUyxPQUFPLFlBQ2QsT0FBTyxRQUFRLENBQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFLLEtBQVcsQ0FBQyxFQUFLLEVBQUssQ0FBSyxDQUFDLENBQUMsQ0FDakUsR0FHS0MsRUFBZSxFQUFRLENBQVUsRUFDekMsRUFFRCxPQUFPLENBQ1QsRUFDTSxFQUFhLEVBQWEsRUFDMUIsR0FBZ0IsRUFBYSxDQUFDLE9BQVEsS0FBSyxDQUFDLEVBQzVDLEdBQW1CLEVBQWEsQ0FBQyxPQUFRLFFBQVMsS0FBSyxDQUFDLEVBQ3hELEdBQWtCLEVBQWEsQ0FDbkMsTUFDQSxNQUNBLE1BQ0EsTUFDQSxVQUNBLE1BQ0YsQ0FBQyxFQUNLLEdBQWdCLEVBQVUsSUFDOUIsR0FBVSxFQUFRLEdBQUcsSUFDbkIsT0FBTyxPQUFPLEVBQVEsQ0FBUSxFQUMxQixDQUFFLEdBQUcsR0FBUyxHQUFXLEVBQUssRUFBTyxHQUFXLEdBQUcsQ0FBSSxDQUFFLEVBQ3pELENBQ04sRUFDSSxHQUFlLEVBQWFDLEVBQVEsRUFFcEMsR0FBNEIsR0FBYyxDQUU5QyxHQUFNLENBQUMsR0FBa0IsRUFBVSxNQUFNLEdBQUcsRUFDdEMsRUFBWSxDQUFDLEdBQUcsRUFBZSxTQUFTLEdBQUcsQ0FBQyxFQUNsRCxHQUNFLENBQUMsRUFBVSxRQUNWLEVBQVUsU0FBVyxHQUFLLEVBQVUsRUFBRSxDQUFDLFFBQVUsRUFFbEQsTUFBTyxDQUFFLEtBQU0sQ0FBVSxFQUUzQixJQUFNLEVBQWEsRUFBVSxJQUFJLENBQUMsQ0FBQyxNQUNuQyxNQUFPLENBQ0wsS0FBTSxFQUFlLFVBQVUsRUFBRyxDQUFVLEVBQzVDLE1BQU8sRUFBZSxVQUFVLEVBQWEsQ0FBQyxDQUNoRCxDQUNGLEVBRU0sR0FBcUIsR0FBYyxFQUFHLElBQU0sQ0FDaEQsR0FBTSxDQUFFLEtBQU0sRUFBTyxNQUFPLEdBQVcsR0FBeUIsQ0FBQyxFQUMzRCxDQUFFLEtBQU0sRUFBTyxNQUFPLEdBQVcsR0FBeUIsQ0FBQyxFQVdqRSxPQVRJLElBQVUsRUFHVCxFQUdBLEVBR0UsRUFBYyxFQUFpQixDQUFNLEVBQUcsRUFBaUIsQ0FBTSxDQUFDLEVBRjlELEVBSEEsR0FIQSxFQUFNLGNBQWMsRUFBTyxJQUFJLENBUzFDLENBQUMsRUFFSyxHQUFrQixHQUFVLENBQ2hDLElBQU0sRUFBUSxFQUFNLFFBQVEsSUFBSyxLQUFNLFdBQVcsR0FBRyxDQUFTLEVBRTlELE9BQU8sSUFBVSxHQUFLLEVBQVEsRUFBTSxNQUFNLEVBQUcsQ0FBSyxDQUNwRCxFQUVNLElBQXFCLEVBQUcsSUFBTSxDQUNsQyxJQUFNLEVBQWUsR0FBZSxDQUFDLEVBQy9CLEVBQWUsR0FBZSxDQUFDLEVBSXJDLE9BRkksRUFBZSxFQUFxQixHQUN4QyxFQUFJLEVBQWUsRUFFckIsRUFHTSxHQUFRLElBQUksSUFDWixPQUEyQixDQUMvQixJQUFNLEVBQU0sUUFBUSxJQUFJLEVBV3hCLE9BVkssR0FBTSxJQUFJLENBQUcsR0FDaEIsR0FBTSxJQUNKLEVBQ0EsRUFBRyxXQUFXLFdBQVcsR0FDdkIsRUFBRyxXQUFXLFFBQVEsR0FDdEIsRUFBRyxXQUFXLGFBQWEsR0FDM0IsRUFBRyxXQUFXLGdCQUFnQixHQUM5QixFQUFHLFdBQVcscUJBQXFCLENBQ3ZDLEVBRUssR0FBTSxJQUFJLENBQUcsQ0FDdEIsRUFPQSxTQUFTLEdBQThCLEVBQWEsQ0F1QmxELE9BckJJLE9BQU8sRUFBWSxnQkFBbUIsU0FDakMsRUFBWSxlQUFlLFdBQVcsTUFBTSxFQUdqRCxFQUFZLFlBQVksZ0JBQWdCLEtBQ25DLEVBQVksV0FBVyxlQUFlLE9BQVMsTUFHcEQsRUFBWSxLQUNQLEdBSUwsRUFBWSxTQUFTLElBQ2hCLEdBR1QsQ0FBSSxHQUFtQixDQUt6QixDQU9BLE1BQU0sRUFBbUIsR0FBVSxFQUFjLElBRTNDLE9BQU8sS0FBSyxDQUFZLENBQUMsQ0FBQyxPQUFTLEVBQzlCLEVBS0wsR0FBOEIsQ0FBVyxFQUNwQ0QsRUFBZSxHQUFlLEVBQUcsSUFBTSxFQUFFLGNBQWMsRUFBRyxJQUFJLENBQUMsRUFHakVBLEVBQWUsQ0FBWSxDQUNuQyxFQVNLLEdBQWlCLEVBQUssQ0FDMUIsRUFBYSxDQUFDLFdBQVksU0FBUyxDQUFDLEVBQ3BDLEVBQWEsV0FBWSxFQUFnQixFQUN6QyxFQUFhLFVBQVcsQ0FBZ0IsQ0FDMUMsQ0FBQyxFQXVCSyxHQUFtQixFQUFLLENBQzVCLEVBQWEsQ0FqQmIsUUFDQSxnQkFFQSxNQUNBLFNBQ0EsZ0JBQ0EsV0FDQSxVQUNBLFVBQ0EsUUFDQSxZQUNBLFVBQ0EsWUFDQSxpQkFDQSwrQkFHc0MsQ0FBQyxFQUN2QyxFQUFhLE1BQU8sQ0FBVSxFQUM5QixFQUFhLFVBQVcsQ0FBVSxFQUNsQyxFQUNFLFlBQ0EsRUFBUyxHQUFjLEVBQVUsSUFBSSxFQUFnQixDQUFDLENBQ3hELEVBQ0EsRUFBYSxnQkFBaUIsQ0FBVSxFQUN4QyxFQUNFLFFBQ0EsR0FDRyxFQUFPLElBQ04sRUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE9BQVMsRUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLFFBQzNDLEVBQU0sY0FBYyxDQUFLLENBQzdCLENBQ0YsRUFDQSxFQUFhLFdBQVksQ0FBVSxDQUNyQyxDQUFDLEVBQ0ssR0FBd0IsRUFBYSxDQUFDLGNBQWUsTUFBTyxNQUFNLENBQUMsRUFFbkUsR0FBcUIsRUFBSyxDQUU5QixFQUFVLEdBQ1JBLEVBQWUsRUFBUSxDQUNyQixHQUFHLE9BQU8sS0FBSyxDQUFNLENBQUMsQ0FDbkIsT0FBUSxHQUFRLElBQVEsV0FBVyxDQUFDLENBQ3BDLEtBQUssRUFDUixXQUNGLENBQUMsQ0FDSCxFQUVBLEVBQ0UsWUFFQSxFQUFTLEdBQ1AsRUFBVSxJQUNSLEVBQUssQ0FFSCxFQUVBLEVBQWEsVUFBVyxDQUFVLENBQ3BDLENBQUMsQ0FDSCxDQUNGLENBQ0YsQ0FDRixDQUFDLEVBRUssR0FBWSxFQUFhLENBQUMsT0FBUSxNQUFPLE1BQU0sQ0FBQyxFQUloRCxHQUFtQixFQUFLLENBQzVCLEVBQWEsQ0FGaUIsVUFBVyxlQUFnQixRQUFTLFFBRWhDLENBQUMsRUFDbkMsRUFDRSxlQUNBLEVBQVMsR0FBUyxFQUFLLElBQUksRUFBYSxDQUFDLFNBQVUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUNqRSxFQUNBLEVBQ0UsTUFDQSxFQUFVLEdBQ1JBLEVBQ0UsT0FBTyxZQUNMLE9BQU8sUUFBUSxDQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBSyxLQUFXLENBQ3hDLEVBQ0EsRUFBYSxDQUFDLFdBQVksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFLLENBQzdDLENBQUMsQ0FDSCxDQUNGLENBQ0YsQ0FDRixFQUNBLEVBQ0UsVUFDQSxFQUFLLENBQUMsRUFBYSxDQUFDLFdBQVcsQ0FBQyxFQUFHLEVBQWEsWUFBYSxDQUFVLENBQUMsQ0FBQyxDQUMzRSxDQUNGLENBQUMsRUFDSyxHQUFhLEVBQVUsR0FDM0JBLEVBQ0UsT0FBTyxZQUNMLE9BQU8sUUFBUSxDQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBTSxLQUFZLENBQzdDLEVBQ0EsR0FBaUIsQ0FBTSxDQUN6QixDQUFDLENBQ0gsQ0FDRixDQUNGLEVBQ00sR0FBaUIsRUFDckIsaUJBQ0EsRUFBYSxDQUFDLE9BQVEsVUFBVyxRQUFRLENBQUMsQ0FDNUMsRUFrQk0sR0FBaUIsRUFBSyxDQUMxQixFQUFhLENBaEJiLHNCQUNBLHlCQUNBLHdCQUNBLDRCQUNBLDRCQUNBLHlCQUNBLGVBQ0EsY0FDQSxrQkFDQSx5QkFDQSxZQUNBLHNCQUNBLG1CQUlvQyxFQUFHLEVBQUksRUFDM0MsRUFBYSxZQUFhLEVBQWtCLENBQzlDLENBQUMsRUFHSyxHQUFvQixJQUFJLElBQUksQ0FDaEMsVUFDQSxPQUNBLFVBQ0EsVUFDQSxVQUNBLGFBQ0EsUUFDQSxPQUNBLE9BQ0EsWUFDQSxTQUNGLENBQUMsRUFFSyxJQUFvQixFQUFZLElBRWxDLE9BQU8sT0FBTyxFQUFhLGlCQUFpQixHQUM1QyxPQUFPLE9BQU8sRUFBWSxnQkFBaUIsQ0FBVSxFQUluRCxHQUNKLDBGQUVJLEdBQXNCLEdBQzFCLEVBQVEsU0FBUyxHQUFHLEdBQUssR0FBVyxLQUFLLENBQU8sRUFFNUMsR0FBdUIsR0FFekIsQ0FBQyxHQUFpQixjQUFlLENBQVcsR0FDNUMsQ0FBQyxHQUFpQixlQUFnQixDQUFXLEVBRXRDLEdBRU8sQ0FBQyxVQUFXLGVBQWUsQ0FBQyxDQUFDLFFBQVMsR0FDcEQsRUFBWSxHQUFTLE9BQU8sT0FBTyxFQUFZLEVBQU0sRUFBSSxDQUFDLENBRS9DLENBQUMsQ0FBQyxLQUFNLEdBQVcsR0FBbUIsQ0FBTSxDQUFDLEVBRzVELFNBQVMsR0FBZ0IsRUFBTSxFQUFTLEdBQUksQ0FDMUMsSUFBTSxFQUFXLElBQUksSUFDckIsSUFBSyxJQUFNLEtBQU8sRUFBTSxDQUV0QixJQUFNLEdBRE8sRUFBUyxFQUFJLE1BQU0sRUFBTyxPQUFTLENBQUMsRUFBSSxFQUFBLENBQ3BDLFFBQVEsR0FBRyxFQUM1QixHQUFJLEVBQU0sRUFBRyxDQUNYLElBQU0sRUFBTyxFQUFJLE1BQU0sR0FBSSxFQUFTLEVBQU8sT0FBUyxFQUFJLEdBQUssQ0FBRyxFQUMzRCxFQUFTLElBQUksQ0FBSSxHQUFHLEVBQVMsSUFBSSxFQUFNLENBQUMsQ0FBQyxFQUM5QyxFQUFTLElBQUksQ0FBSSxDQUFDLENBQUMsS0FBSyxDQUFHLENBQzdCLE1BQ08sRUFBUyxJQUFJLENBQUcsR0FBRyxFQUFTLElBQUksRUFBSyxDQUFDLENBQUMsRUFDNUMsRUFBUyxJQUFJLENBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBRyxDQUU5QixDQUNBLE9BQU8sTUFBTSxLQUFLLEVBQVMsS0FBSyxDQUFDLENBQUMsQ0FDL0IsS0FBSyxDQUFDLENBQ04sUUFBUyxHQUFhLENBQ3JCLElBQU0sRUFBVyxFQUFTLElBQUksQ0FBUSxFQUN0QyxHQUNFLEVBQVMsT0FBUyxHQUNsQixFQUFTLEtBQU0sR0FBTSxJQUFNLEdBQVksRUFBRSxXQUFXLEVBQVcsR0FBRyxDQUFDLEVBQ25FLENBQ0EsSUFBTSxFQUFTLEVBQ1osT0FBUSxHQUFNLElBQU0sR0FBWSxDQUFDLEVBQUUsV0FBVyxFQUFXLEdBQUcsQ0FBQyxDQUFDLENBQzlELEtBQUssRUFDRixFQUFTLEVBQVMsT0FBUSxHQUFNLEVBQUUsV0FBVyxFQUFXLEdBQUcsQ0FBQyxFQUNsRSxNQUFPLENBQUMsR0FBRyxFQUFRLEdBQUcsR0FBZ0IsRUFBUSxDQUFRLENBQUMsQ0FDekQsQ0FDQSxPQUFPLEVBQVMsS0FBSyxDQUN2QixDQUFDLENBQ0wsQ0FFQSxNQUFNLEdBQWMsR0FBVSxFQUFTLElBQWdCLENBQ3JELElBQUksRUFBUSxPQUFPLEtBQUssQ0FBTyxFQUN6QixFQUFhLElBQUksSUFpQnZCLE1BZkEsR0FBUSxFQUFNLElBQUssR0FBUyxDQUMxQixJQUFNLEVBQVUsRUFBSyxRQUFRLGdCQUFpQixFQUFFLEVBS2hELE9BSkksR0FBa0IsSUFBSSxDQUFPLEdBQUssRUFBTSxTQUFTLENBQU8sR0FDMUQsRUFBVyxJQUFJLENBQU8sRUFDZixHQUVGLENBQ1QsQ0FBQyxFQUVJLEdBQW9CLENBQVcsSUFDbEMsRUFBUSxHQUFnQixDQUFLLEdBRS9CLEVBQVEsRUFBTSxRQUFTLEdBQ3JCLEVBQVcsSUFBSSxDQUFHLEVBQUksQ0FBQyxNQUFNLElBQU8sRUFBSyxPQUFPLEdBQUssRUFBSSxDQUFDLENBQUcsQ0FDL0QsRUFDT0EsRUFBZSxFQUFTLENBQUssQ0FDdEMsQ0FBQyxFQUtLLEdBQWtCLEdBQWUsQ0FDckMsR0FBTSxDQUFFLG9CQUFvQixDQUFDLEVBQUcsaUJBQWlCLENBQUMsR0FBTSxPQUFPLFFBQzdELEVBQ0MsR0FDSyxJQUFjLFVBQ1Qsb0JBR0YsZ0JBRVgsRUFFQSxNQUFPLENBQUMsR0FBRyxFQUFnQixHQUFHLENBQWlCLENBQ2pELEVBRU0sR0FBYyxFQUFVLEdBQVksQ0FDeEMsR0FBTSxDQUFFLFFBQVEsQ0FBQyxFQUFHLGFBQWEsQ0FBQyxHQUFNLE9BQU8sUUFDN0MsT0FBTyxLQUFLLENBQU8sRUFDbEIsR0FBUyxFQUFJLFdBQVcsR0FBRyxFQUFJLFFBQVUsWUFDNUMsRUFFQSxPQUFPLE9BQU8sWUFDWixDQUFDLEdBQUcsRUFBTyxHQUFHLEdBQWUsQ0FBVSxDQUFDLENBQUMsQ0FBQyxJQUFLLEdBQVEsQ0FDckQsRUFDQSxHQUFZLEVBQVEsRUFBSSxDQUMxQixDQUFDLENBQ0gsQ0FDRixDQUFDLEVBV0ssR0FBUyxDQUNiLENBQUUsSUFBSyxTQUFVLEVBQ2pCLENBQUUsSUFBSyxNQUFPLEVBQ0QsQ0FBRSxJQUFLLGFBQWMsRUFDbEMsQ0FBRSxJQUFLLFNBQVUsRUFDTixDQUFFLElBQUssZUFBZ0IsRUFDbEMsQ0FBRSxJQUFLLFNBQVUsRUFDakIsQ0FBRSxJQUFLLGFBQWMsRUFDUixDQUFFLElBQUssYUFBYyxLQUFNLEVBQUssRUFDN0MsQ0FBRSxJQUFLLFdBQVksS0FBTSxFQUFLLEVBQzlCLENBQUUsSUFBSyxVQUFXLEVBQ2xCLENBQUUsSUFBSyxPQUFRLEtBQU0sRUFBYSxDQUFDLE1BQU8sT0FBTyxDQUFDLENBQUUsRUFDcEQsQ0FBRSxJQUFLLGFBQWMsS0FBTSxFQUFjLEVBQ3pDLENBQUUsSUFBSyxVQUFXLEtBQU0sRUFBYyxFQUN0QyxDQUFFLElBQUssVUFBVyxLQUFNLEVBQWMsRUFDekIsQ0FBRSxJQUFLLEtBQU0sRUFDMUIsQ0FBRSxJQUFLLFNBQVUsS0FBTSxFQUFpQixFQUN4QyxDQUNFLElBQUssY0FDTCxLQUFNLEVBQVMsR0FBZ0IsRUFBWSxJQUFJLEVBQWdCLENBQUMsQ0FDbEUsRUFDQSxDQUNFLElBQUssZUFDTCxLQUFNLEVBQVMsR0FBaUIsRUFBYSxJQUFJLEVBQWdCLENBQUMsQ0FDcEUsRUFDYSxDQUFFLElBQUssV0FBWSxFQUNoQyxDQUFFLElBQUssYUFBYyxFQUNyQixDQUFFLElBQUssTUFBTyxFQUNkLENBQUUsSUFBSyxTQUFVLEVBQ2pCLENBQUUsSUFBSyxVQUFXLEtBQU0sRUFBWSxFQUNwQyxDQUFFLElBQUssTUFBTyxFQUNkLENBQUUsSUFBSyxRQUFTLEVBQ2hCLENBQUUsSUFBSyxVQUFXLEVBQ2xCLENBQUUsSUFBSyxVQUFXLEVBQ2xCLENBQUUsSUFBSyxPQUFRLEVBQ2YsQ0FBRSxJQUFLLFFBQVMsRUFDaEIsQ0FBRSxJQUFLLFFBQVMsRUFDaEIsQ0FBRSxJQUFLLGFBQWMsRUFDckIsQ0FBRSxJQUFLLFNBQVUsRUFDakIsQ0FBRSxJQUFLLGNBQWUsRUFDdEIsQ0FBRSxJQUFLLE9BQVEsRUFDZixDQUFFLElBQUssZUFBZ0IsRUFDdkIsQ0FBRSxJQUFLLFNBQVUsRUFDakIsQ0FBRSxJQUFLLE9BQVEsRUFDZixDQUFFLElBQUssU0FBVSxFQUNqQixDQUFFLElBQUssY0FBZSxFQUN0QixDQUFFLElBQUssUUFBUyxFQUNoQixDQUFFLElBQUssTUFBTyxLQUFNLENBQVcsRUFDL0IsQ0FBRSxJQUFLLEtBQU0sRUFDYixDQUFFLElBQUssY0FBZSxLQUFNLEVBQWdCLEVBQzVDLENBQUUsSUFBSyxRQUFTLEtBQU0sRUFBSyxFQUMzQixDQUFFLElBQUssYUFBYyxLQUFNLEVBQWUsRUFFMUMsQ0FDRSxJQUFLLFNBQ0wsS0FBTSxFQUFhLENBQ2pCLGNBQ0EsY0FDQSxjQUNBLGVBQ0EsTUFDRixDQUFDLENBQ0gsRUFDQSxDQUFFLElBQUssVUFBVyxLQUFNLEVBQVksRUFDcEMsQ0FBRSxJQUFLLGdCQUFpQixLQUFNLEVBQVksRUFDMUMsQ0FBRSxJQUFLLFNBQVUsS0FBTSxFQUFXLEVBQ3JCLENBQUUsSUFBSyxNQUFPLEVBQ2QsQ0FBRSxJQUFLLGNBQWUsS0FBTSxDQUFXLEVBQ3ZDLENBQUUsSUFBSyxtQkFBb0IsS0FBTSxFQUFLLEVBQ25ELENBQUUsSUFBSyxRQUFTLEtBQU0sRUFBYSxRQUFTLEVBQVksQ0FBRSxFQUMxRCxDQUFFLElBQUssbUJBQW9CLEtBQU0sRUFBYSxFQUM5QyxDQUFFLElBQUssWUFBYSxFQUNwQixDQUFFLElBQUssYUFBYyxLQUFNLENBQVcsRUFDdEMsQ0FBRSxJQUFLLGFBQWMsRUFDckIsQ0FBRSxJQUFLLGFBQWMsRUFDckIsQ0FBRSxJQUFLLFNBQVUsS0FBTSxDQUFXLEVBQ2xDLENBQUUsSUFBSyxnQkFBaUIsS0FBTSxDQUFXLEVBQ3pDLENBQUUsSUFBSyxhQUFjLEtBQU0sQ0FBVyxFQUN0QyxDQUFFLElBQUssUUFBUyxLQUFNLENBQVcsRUFDakMsQ0FBRSxJQUFLLGNBQWUsRUFDdEIsQ0FBRSxJQUFLLEtBQU0sS0FBTSxDQUFXLEVBQzlCLENBQUUsSUFBSyxXQUFZLEtBQU0sRUFBbUIsRUFDNUMsQ0FBRSxJQUFLLGVBQWdCLEtBQU0sRUFBaUIsRUFDOUMsQ0FBRSxJQUFLLGNBQWUsRUFDdEIsQ0FBRSxJQUFLLGlCQUFrQixLQUFNLENBQVcsRUFDMUMsQ0FBRSxJQUFLLDJCQUE0QixLQUFNLENBQVcsRUFDcEQsQ0FBRSxJQUFLLHFCQUFzQixLQUFNLENBQVcsRUFDOUMsQ0FBRSxJQUFLLFVBQVcsS0FBTSxDQUFXLEVBQ25DLENBQUUsSUFBSyxlQUFnQixLQUFNLENBQVcsRUFDeEMsQ0FBRSxJQUFLLFdBQVksRUFDbkIsQ0FBRSxJQUFLLE1BQU8sS0FBTSxDQUFXLEVBQy9CLENBQUUsSUFBSyxPQUFRLEtBQU0sQ0FBVyxFQUNoQyxDQUFFLElBQUssYUFBYyxLQUFNLENBQVcsRUFDdEMsQ0FBRSxJQUFLLGFBQWMsS0FBTSxDQUFXLEVBQ3RDLENBQUUsSUFBSyxRQUFTLEtBQU0sQ0FBVyxFQUNqQyxDQUFFLElBQUssTUFBTyxLQUFNLENBQVcsRUFDL0IsQ0FBRSxJQUFLLEtBQU0sS0FBTSxDQUFXLEVBQzlCLENBQUUsSUFBSyxNQUFPLEtBQU0sQ0FBVyxFQUMvQixDQUFFLElBQUssUUFBUyxLQUFNLEVBQWEsSUFBQSxHQUFXLEVBQUksQ0FBRSxFQUNwRCxDQUFFLElBQUssY0FBZSxLQUFNLENBQVcsRUFDdkMsQ0FBRSxJQUFLLFlBQWEsS0FBTSxDQUFpQixFQUMzQyxDQUFFLElBQUssZUFBZ0IsS0FBTSxDQUFpQixFQUM5QyxDQUFFLElBQUssa0JBQW1CLEtBQU0sQ0FBaUIsRUFDakQsQ0FBRSxJQUFLLG1CQUFvQixLQUFNLEVBQWEsR0FBbUIsRUFBSSxDQUFFLEVBQ3ZFLENBQUUsSUFBSyxtQkFBb0IsS0FBTSxDQUFpQixFQUVsRCxDQUFFLElBQUssdUJBQXdCLEtBQU0sRUFBYSxJQUFBLEdBQVcsRUFBSSxDQUFFLEVBQ25FLENBQUUsSUFBSyx1QkFBd0IsS0FBTSxDQUFpQixFQUN0RCxDQUFFLElBQUssc0JBQXVCLEtBQU0sRUFBaUIsRUFDckQsQ0FBRSxJQUFLLHFCQUFzQixLQUFNLEVBQWlCLEVBQ3ZDLENBQUUsSUFBSyxnQkFBaUIsS0FBTSxFQUFpQixFQUMvQyxDQUFFLElBQUssd0JBQXlCLEtBQU0sRUFBaUIsRUFDcEUsQ0FBRSxJQUFLLE1BQU8sRUFDZCxDQUFFLElBQUssZ0JBQWlCLEVBQ3hCLENBQUUsSUFBSyxVQUFXLEtBQU0sQ0FBVyxFQUNuQyxDQUFFLElBQUssZUFBZ0IsS0FBTSxDQUFXLEVBQ3hDLENBQUUsSUFBSyxhQUFjLEtBQU0sRUFBZSxFQUMxQyxDQUFFLElBQUssUUFBUyxLQUFNLEVBQVUsRUFDaEMsQ0FBRSxJQUFLLGNBQWUsRUFDdEIsQ0FBRSxJQUFLLElBQUssRUFDWixDQUFFLElBQUssS0FBTSxFQUNiLENBQUUsSUFBSyxlQUFnQixLQUFNLENBQVcsRUFDeEMsQ0FBRSxJQUFLLGdCQUFpQixLQUFNLENBQVcsRUFDNUIsQ0FBRSxJQUFLLE1BQU8sRUFDZCxDQUNYLElBQUssU0FDTCxLQUFNLEVBQVMsR0FBVSxFQUFNLElBQUksRUFBcUIsQ0FBQyxDQUMzRCxFQUNhLENBQUUsSUFBSyxnQkFBaUIsS0FBTSxDQUFXLEVBQ3pDLENBQUUsSUFBSyxTQUFVLEVBQ2pCLENBQUUsSUFBSyxVQUFXLEVBQy9CLENBQUUsSUFBSyxPQUFRLEtBQU0sRUFBZSxDQUN0QyxFQUVNLEdBQW1CLEdBQU8sS0FBSyxDQUFFLFNBQVUsQ0FBRyxFQUM5QyxHQUFhLEVBQ2pCLEdBQ0csS0FBSyxDQUFFLE1BQUssVUFBWSxFQUFPLEVBQWEsRUFBSyxDQUFJLEVBQUksSUFBQSxFQUFVLENBQUMsQ0FDcEUsT0FBTyxPQUFPLENBQ25CLEVBRUEsU0FBUyxHQUFlLEVBQU0sRUFBTSxDQUNsQyxHQUFJLE9BQU8sR0FBUyxTQUFVLENBQzVCLEdBQU0sQ0FBRSxTQUFRLFFBQVMsR0FBYSxDQUFJLEVBQ3BDLEVBQWdCLEVBQUssTUFBTSxFQUFFLElBQU07RUFBTztFQUFPLEdBQ2pELEVBQVVFLEdBQWMsQ0FBSSxFQUNsQyxFQUFPLEtBQUssTUFBTSxDQUFJLEVBRXRCLElBQUksRUFDRixLQUFLLFVBQVUsRUFBSyxDQUFJLEVBQUcsS0FBTSxJQUFTLE1BQVEsSUFBTyxDQUFNLEVBQy9ELEVBSUYsT0FISSxJQUFZO0lBQ2QsRUFBUyxFQUFPLFFBQVEsTUFBTyxDQUFPLEdBRWpDLENBQ1QsQ0FFQSxPQUFPLEVBQUssQ0FBSSxDQUNsQixDQUVBLFNBQVMsR0FBZ0IsRUFBUyxFQUFVLENBQUMsRUFBRyxDQUM5QyxPQUFPLEdBQ0wsRUFDQSxFQUFVLEdBQVMsQ0FDakIsSUFBSSxFQUFZLEVBQVEsV0FBYSxHQUVyQyxHQUFJLE1BQU0sUUFBUSxDQUFTLEVBQUcsQ0FDNUIsSUFBTSxFQUFPLE9BQU8sS0FBSyxDQUFJLEVBQ3ZCLENBQUUsY0FBYyxDQUFDLEVBQUcsYUFBYSxDQUFDLEdBQU0sT0FBTyxRQUNuRCxFQUNDLEdBQVMsRUFBSSxLQUFPLElBQU0sY0FBZ0IsWUFDN0MsRUFDQSxFQUFZLENBQ1YsR0FBRyxFQUNILEdBQUcsR0FDSCxHQUFHLEVBQVcsS0FBSyxFQUNuQixHQUFHLEVBQVksS0FBSyxDQUN0QixDQUNGLENBRUEsT0FBTyxHQUFXRixFQUFlLEVBQU0sQ0FBUyxFQUFHLENBQUksQ0FDekQsQ0FBQyxDQUNILENBQ0YsQ0NwbkJBLGVBQXNCLEdBQXNDLEVBQTBDLENBQ3BHLE9BQU8sRUFBTywwQkFBMEIsd0NBQXlDLFNBQVksQ0FDM0YsTUFBTSxRQUFRLElBQ1osRUFBZ0IsSUFBSSxLQUFPLElBQW1CLENBQzVDLElBQU0sRUFBa0IsRUFBSyxLQUFLLEVBQWdCLGNBQWMsRUFDaEUsR0FBSSxDQUFDLEVBQUcsV0FBVyxDQUFlLEVBQUcsT0FFckMsSUFBTSxFQUFpQixFQUFLLEtBQUssRUFBZ0IsTUFBTSxFQUN2RCxJQUFLLElBQU0sSUFBa0IsQ0FBQyxZQUFhLE9BQU8sRUFBRyxDQUNuRCxJQUFNLEVBQWlCLEVBQUssS0FBSyxFQUFnQixDQUFjLEVBQy9ELEdBQUksQ0FDRixNQUFNLEdBQWtCLEVBQWdCLENBQWMsRUFDdEQsSUFBTSxFQUFjLEtBQUssTUFBTSxNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQWlCLE1BQU0sQ0FBQyxFQUc5RSxFQUFrQixHQUNoQixFQUFVLEVBQVksU0FBVyxDQUFDLEVBQ3hDLElBQUssR0FBTSxDQUFDLEVBQVksS0FBVyxPQUFPLFFBQVEsQ0FBTyxFQUFHLENBQzFELElBQU0sRUFBWSxFQUFPLFdBQVcsRUFBZ0IsTUFBTSxFQUN0RCxJQUFXLElBQ2IsRUFBUSxHQUFjLEVBQ3RCLEVBQWtCLEdBRXRCLENBRUEsR0FEQSxFQUFZLFFBQVUsRUFDbEIsQ0FBQyxFQUFpQixPQUV0QixNQUFNLEVBQU8sYUFBYSxFQUFpQixLQUFLLFVBQVUsR0FBZ0IsQ0FBVyxFQUFHLElBQUEsR0FBVyxDQUFDLENBQUMsQ0FDdkcsTUFBUSxDQUVSLENBQ0YsQ0FDRixDQUFDLENBQ0gsQ0FDRixDQUFDLENBQ0gsQ0FFQSxlQUFlLEdBQWtCLEVBQXdCLEVBQXVDLENBQzlGLEdBQUksQ0FBQyxFQUFHLFdBQVcsQ0FBYyxFQUFHLENBQ2xDLE1BQU0sRUFBRyxTQUFTLE9BQU8sRUFBZ0IsQ0FBYyxFQUN2RCxNQUNGLENBRUEsSUFBTSxFQUFVLE1BQU0sRUFBRyxTQUFTLFFBQVEsRUFBZ0IsQ0FBRSxjQUFlLEVBQUssQ0FBQyxFQUNqRixNQUFNLFFBQVEsSUFDWixFQUFRLElBQUksS0FBTyxJQUFXLENBQzVCLElBQU0sRUFBVSxFQUFLLEtBQUssRUFBZ0IsRUFBTyxJQUFJLEVBQy9DLEVBQVUsRUFBSyxLQUFLLEVBQWdCLEVBQU8sSUFBSSxFQUMvQyxFQUFjLEVBQUcsV0FBVyxDQUFPLEVBQUksTUFBTSxFQUFHLFNBQVMsS0FBSyxDQUFPLEVBQUksSUFBQSxHQUMvRSxHQUFJLEVBQU8sWUFBWSxHQUFLLEdBQWEsWUFBWSxFQUFHLENBQ3RELE1BQU0sR0FBa0IsRUFBUyxDQUFPLEVBQ3hDLE1BQ0YsQ0FDQSxNQUFNLEVBQUcsU0FBUyxPQUFPLEVBQVMsQ0FBTyxDQUMzQyxDQUFDLENBQ0gsRUFDQSxNQUFNLEVBQUcsU0FBUyxHQUFHLEVBQWdCLENBQUUsVUFBVyxFQUFLLENBQUMsQ0FDMUQsQ0N4REEsZUFBc0IsR0FDcEIsRUFDQSxFQUNlLENBQ2YsT0FBTyxFQUFPLDBCQUEwQixxQkFBc0IsU0FBWSxDQUN4RSxJQUFNLEVBQWlCLEVBQUssUUFBUSxFQUFPLFFBQVMsUUFBUSxFQUN0RCxFQUNKLEVBQU8sUUFBVSxFQUFPLDJCQUE2QixJQUFBLEdBQVksRUFBSyxRQUFRLEVBQU8sUUFBUyxNQUFPLE9BQU8sRUFFeEcsRUFBVSxNQUFNLE9BQXdCRyxFQUFHLFFBQVEsRUFBZ0IsQ0FBRSxjQUFlLEVBQUssQ0FBQyxDQUFDLEVBQzVGLEtBRUwsSUFBSyxJQUFNLEtBQVUsRUFBUyxDQUM1QixJQUFNLEVBQVUsRUFBTyxLQUFLLE1BQU0sRUFBRyxFQUFFLEVBQ2pDLEVBQThCLEVBQU8sS0FBSyxTQUFTLE9BQU8sRUFDNUQsRUFBYyxFQUE4QixFQUFVLEVBQU8sS0FDN0QsRUFBWSxTQUFTLElBQUksSUFDM0IsRUFBYyxJQUFJLEVBQVksUUFBUSxLQUFNLEdBQUcsS0FFakQsSUFBTSxFQUFhLEVBQXlCLEtBQ3pDLEdBQ0MsRUFBTyxhQUFhLGVBQWUsSUFBZ0IsRUFBTyxhQUFhLGtCQUFrQixFQUM3RixFQUVJLEVBQU8sT0FBTyxHQUFLLEVBQ2pCLEdBRUYsTUFBTUEsRUFBRyxNQUFNLEVBQUssS0FBSyxFQUFnQixDQUFPLEVBQUcsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUN0RSxNQUFNLEVBQVksUUFDaEJBLEVBQUcsT0FBTyxFQUFLLEtBQUssRUFBZ0IsRUFBTyxJQUFJLEVBQUcsRUFBSyxLQUFLLEVBQWdCLEVBQVMsWUFBWSxDQUFDLENBQ3BHLEdBQ1MsSUFFVCxNQUFNQSxFQUFHLE1BQU0sRUFBZ0IsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUNsRCxNQUFNLEVBQVksUUFDaEJBLEVBQUcsT0FBTyxFQUFLLEtBQUssRUFBZ0IsRUFBTyxJQUFJLEVBQUcsRUFBSyxLQUFLLEVBQWdCLEVBQU8sSUFBSSxDQUFDLENBQzFGLEdBRU8sRUFBTyxZQUFZLEdBQUssR0FBa0IsQ0FBQyxJQUVwRCxNQUFNQSxFQUFHLE1BQU0sRUFBZ0IsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUNsRCxNQUFNLEVBQVksUUFDaEIsT0FDRUEsRUFBRyxPQUNELEVBQUssS0FBSyxFQUFnQixFQUFPLEtBQU0sWUFBWSxFQUNuRCxFQUFLLEtBQUssRUFBZ0IsR0FBRyxFQUFPLEtBQUssTUFBTSxDQUNqRCxDQUNGLENBQ0YsRUFFSixDQUNGLENBQUMsQ0FDSCxDQzNEQSxTQUFnQixFQUFrQixFQUF1QixFQUF1QixDQUM5RSxPQUFPLENBQ1QsQ0FFQSxTQUFnQixHQUFhLEVBQW1CLEVBQW1CLEVBQTZDLENBQzlHLElBQU0sRUFBYyxDQUFDLEdBQUcsQ0FBTSxFQUU5QixJQUFLLEdBQU0sQ0FBQyxFQUFPLEtBQVMsRUFBTyxRQUFRLEVBQ3JDLEVBQVksS0FBVyxJQUFBLEdBQ3pCLEVBQVksR0FBUyxHQUE4QixFQUFNLENBQU8sRUFDdkQsR0FBa0IsRUFBTyxHQUFRLENBQU8sR0FBSyxHQUFrQixFQUFNLENBQU8sRUFDckYsRUFBWSxHQUFTLEVBQU0sRUFBTyxHQUFRLEVBQU0sQ0FBTyxFQUM3QyxFQUFPLFNBQVMsQ0FBSSxHQUM5QixFQUFZLEtBQUssQ0FBSSxFQUd6QixPQUFPLENBQ1QsQ0FFQSxTQUFTLEdBQThCLEVBQWdCLEVBQTJDLENBQ2hHLE9BQU8sR0FBa0IsRUFBTyxDQUFPLEVBQUksRUFBUSw4QkFBOEIsRUFBTyxDQUFPLEVBQUksQ0FDckcsQ0FFQSxTQUFTLEdBQWtCLEVBQWdCLEVBQW1ELENBQzVGLE1BQU8sQ0FBQyxDQUFDLEdBQVMsT0FBTyxHQUFVLFVBQVksRUFBUSxrQkFBa0IsQ0FBSyxDQUNoRixDQzNCQSxTQUFnQixHQUNkLEVBQ0EsRUFDTSxDQUNOLElBQU0sRUFBUSxFQUFJLEdBSWxCLE9BRkEsT0FBTyxFQUFJLEdBQ1gsRUFBK0IsR0FBTyxFQUMvQixDQUNULENBRUEsU0FBZ0IsRUFBNEMsRUFBVyxDQUNyRSxJQUFNLEVBQWUsT0FBTyxRQUFRLENBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFPLENBQUMsS0FBVSxFQUFLLGNBQWMsQ0FBSSxDQUFDLEVBQzlGLElBQUssR0FBTSxDQUFDLEVBQUssS0FBVSxFQUd6QixPQUFPLEVBQUksR0FDWCxFQUFpQyxHQUFPLEVBR3BDLEdBQVMsT0FBTyxHQUFVLFVBQVksQ0FBQyxNQUFNLFFBQVEsQ0FBSyxHQUM1RCxFQUFTLENBQWdDLEVBRzdDLE9BQU8sQ0FDVCxDQ2lEQSxNQUFNLEdBQXNDLENBQzFDLEtBQU0sYUFDTixHQUFJLENBQ0YsYUFBYyxLQUNkLEtBQU0sQ0FDSixTQUFVLENBQUMsTUFBTSxDQUNuQixDQUNGLEVBQ0EsWUFBYSxDQUNYLFNBQVUsTUFDWixFQUNBLFlBQWEsQ0FDWCxNQUFPLGlDQUNQLHFCQUFzQixFQUN4QixFQUNBLEtBQU0sQ0FDSixRQUFTLENBQUUsVUFBVyxlQUFnQixDQUN4QyxDQUNGLEVBRU0sR0FBWSxDQUNoQixLQUFNLENBQ0osS0FBTSxPQUNOLEdBQUksQ0FDRixhQUFjLEtBQ2QsS0FBTSxDQUNKLFNBQVUsQ0FBQyxPQUFRLE1BQU0sQ0FDM0IsQ0FDRixFQUVBLFlBQWEsQ0FDWCxNQUFPLDJDQUNQLHFCQUFzQixFQUN4QixFQUNBLFlBQWEsQ0FFWCxTQUFVLFFBRVYsZ0JBQWlCLE1BQ25CLEVBQ0EsS0FBTSxDQUNKLEtBQU0sQ0FDSixLQUFNLGdFQUNSLENBQ0YsQ0FDRixFQUNBLFlBQWEsQ0FDWCxLQUFNLFlBQ04sR0FBSSxDQUNGLGFBQWMsS0FDZCxLQUFNLENBQ0osU0FBVSxDQUFDLE9BQVEsTUFBTSxDQUMzQixDQUNGLEVBQ0EsWUFBYSxDQUNYLE1BQU8sMkNBQ1AscUJBQXNCLEVBQ3hCLEVBQ0EsS0FBTSxDQUNKLFlBQWEsQ0FDWCxLQUFNLHFFQUNSLENBQ0YsQ0FDRixFQUNBLFFBQVMsQ0FDUCxLQUFNLFVBQ04sR0FBSSxDQUNGLEtBQU0sQ0FDSixTQUFVLENBQUMsQ0FDYixDQUNGLEVBQ0EsWUFBYSxDQUNYLE1BQU8seUJBQ1AscUJBQXNCLEVBQ3hCLEVBQ0EsWUFBYSxDQUVYLFdBQVksUUFFWixTQUFVLE9BQ1osRUFDQSxLQUFNLENBQ0osUUFBUyxDQUNQLEtBQU0sbUVBQ1IsQ0FDRixDQUNGLEVBQ0EsY0FBZSxDQUNiLEtBQU0sZ0JBQ04sR0FBSSxDQUNGLG9CQUFxQixDQUNuQixNQUFPLENBQUMsU0FBVSxTQUFVLGFBQWEsQ0FDM0MsQ0FDRixFQUNBLEtBQU0sQ0FDSixjQUFlLENBQ2IsS0FBTSx1RUFDUixDQUNGLENBQ0YsRUFDQSxLQUFNLENBQ0osS0FBTSxPQUNOLEdBQUksQ0FBQyxFQUNMLFlBQWEsQ0FFWCxTQUFVLE9BQ1osRUFDQSxLQUFNLENBQ0osS0FBTSxDQUFFLEtBQU0sZ0VBQWlFLENBQ2pGLENBQ0YsRUFDQSxnQkFBaUIsQ0FDZixLQUFNLG9CQUNOLEdBQUksQ0FDRixhQUFjLENBQ1osTUFBTyxDQUFDLFFBQVEsQ0FDbEIsQ0FDRixFQUNBLEtBQU0sQ0FDSixnQkFBaUIsQ0FDZixLQUFNLHlFQUNSLENBQ0YsQ0FDRixDQUNGLEVBSUEsZUFBc0IsR0FBa0IsRUFBMEMsQ0FDaEYsT0FBTyxFQUFPLDBCQUEwQixtQkFBb0IsU0FBWSxDQUN0RSxHQUFJLEdBQXdCLEVBQVcsVUFBVSxFQUUvQyxPQUdGLElBQU0sRUFBZ0IsRUFBSyxRQUFRLEVBQVcsUUFBUyxVQUFXLFdBQVcsRUFDN0UsTUFBTSxFQUFHLFNBQVMsTUFBTSxFQUFlLENBQUUsVUFBVyxFQUFLLENBQUMsRUFHMUQsSUFBTSxFQUFrQixFQUFLLFFBQVEsRUFBVyxRQUFTLFVBQVcsY0FBYyxFQUNsRixNQUFNLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFpQixDQUFFLE1BQU8sR0FBTSxVQUFXLEVBQUssQ0FBQyxDQUFDLEVBRTdGLElBQU0sRUFBVSxNQUFNLEVBQUcsU0FBUyxRQUFRLEVBQWUsQ0FBRSxjQUFlLEVBQUssQ0FBQyxFQUNoRixJQUFLLElBQU0sS0FBUyxFQUNkLENBQUMsRUFBTSxPQUFPLEdBQUssQ0FBQyxHQUFnQyxFQUFNLElBQUksR0FDbEUsTUFBTSxFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsRUFBSyxLQUFLLEVBQWUsRUFBTSxJQUFJLEVBQUcsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLEVBRW5HLElBQU0sRUFBYyxJQUFJLElBQUksQ0FDMUIsV0FDQSxjQUNBLGtCQUNBLG9CQUNBLEdBQUcsRUFDQSxPQUNFLEdBQVcsRUFBTyxPQUFPLEdBQUssRUFBTyxLQUFLLFNBQVMsTUFBTSxHQUFLLENBQUMsR0FBZ0MsRUFBTyxJQUFJLENBQzdHLENBQUMsQ0FDQSxJQUFLLEdBQVcsRUFBTyxJQUFJLENBQ2hDLENBQUMsRUFDRyxFQUFXLFVBQVUsaUJBQ3ZCLEVBQVksSUFBSSxhQUFhLEVBRTNCLEVBQVcsa0JBQWtCLE9BQVMsR0FDeEMsRUFBWSxJQUFJLGVBQWUsRUFFNUIsRUFBVyxlQUdkLEVBQVksT0FBTyxhQUFhLEVBQ2hDLE1BQU0sRUFBWSxRQUFVLEVBQUcsU0FBUyxHQUFHLEVBQUssS0FBSyxFQUFlLGFBQWEsRUFBRyxDQUFFLE1BQU8sRUFBSyxDQUFDLENBQUMsR0FHdEcsSUFBSyxJQUFNLEtBQVksRUFBYSxDQUVsQyxJQUFNLEVBQU8sRUFBSyxTQUFTLEVBQVUsTUFBTSxFQUMzQyxNQUFNLEVBQVksUUFBVSxHQUFrQixFQUFZLEVBQWUsQ0FBSSxDQUFDLENBQ2hGLENBQ0YsQ0FBQyxDQUNILENBRUEsU0FBZ0IsR0FBd0IsRUFBOEIsQ0FDcEUsT0FBTyxHQUFZLFNBQVMscUJBQXFCLEdBQUssRUFDeEQsQ0FFQSxTQUFTLEdBQWdDLEVBQTJCLENBQ2xFLE1BQU8sMkJBQTJCLEtBQUssQ0FBUSxDQUNqRCxDQUVBLGVBQWUsR0FBa0IsRUFBdUIsRUFBdUIsRUFBZ0MsQ0FDN0csSUFBTSxFQUFXLEVBQUssS0FBSyxFQUFlLEdBQUcsRUFBSyxLQUFLLEVBQ2pELEVBQWlDLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBZSx1QkFBdUIsQ0FBQyxFQUV0RyxHQUFJLElBQVMsVUFBVyxDQUN0QixNQUFNLEdBQVUsR0FBd0IsQ0FBTSxFQUFHLENBQVEsRUFDekQsTUFDRixDQUdBLEdBQUksSUFBUyxhQUFlLEVBQU8sa0JBQWtCLFNBQVcsRUFBRyxPQUVuRSxJQUFJLEVBQWMsZ0JBQWdCLEtBQVEsR0FBWSxHQUFVLEdBQWtDLENBQUMsQ0FBQyxFQUVwRyxHQUFJLENBQ0YsSUFBTSxFQUFhLE1BQU0sRUFBRyxTQUFTLFNBQVMsRUFBVSxNQUFNLEVBQ3hELEVBQWMsRUFBSyxLQUFLLENBQVUsRUFDeEMsRUFBYyxFQUFNLElBQUksQ0FBQyxFQUFhLEVBQWEsQ0FBVyxFQUFHLENBQUUsV0FBWSxFQUFhLENBQUMsQ0FDL0YsTUFBUSxDQUVSLENBR0EsR0FBSSxFQUFFLFNBQVUsR0FBYyxPQUU5QixHQUFJLElBQVMsWUFBYSxDQUV4QixJQUFLLEdBQU0sQ0FBQyxFQUFTLEtBQVEsT0FBTyxRQUFRLEVBQVksSUFBSSxFQUNyRCxFQUFJLE1BQU0sU0FBUyxzQkFBc0IsR0FDNUMsT0FBTyxFQUFZLEtBQUssR0FHNUIsR0FBYSxFQUFhLE1BQU0sQ0FDbEMsQ0FFSSxFQUFLLFdBQVcsUUFBUSxJQUMxQixFQUFjLENBQ1osR0FBRyxFQUNILFlBQWEsQ0FDWCxNQUFPLHlCQUNQLHFCQUFzQixFQUN4QixDQUNGLEVBRUEsR0FBYSxFQUFhLE1BQU0sRUFDNUIsRUFBWSxJQUFJLE9BQ2xCLEVBQVksR0FBRyxLQUFLLGdCQUFrQixDQUNwQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVMsYUFBYyxHQUFJLEVBQVksR0FBRyxLQUFLLGlCQUFtQixDQUFDLENBQUUsQ0FBQyxDQUNwRixJQUlBLElBQVMsV0FBYSxFQUFZLEtBQUssU0FBVyxJQUNwRCxFQUFZLGNBQWdCLENBQUMsRUFDN0IsRUFBWSxZQUFZLFFBQVUsUUFDbEMsRUFBWSxLQUFLLFFBQVEsT0FBUyxDQUFDLEVBQ25DLEVBQVksS0FBSyxRQUFRLEtBQUssd0JBQTBCLHlCQUcxRCxJQUFJLEVBQXFCLEdBQ3pCLElBQUssSUFBTSxLQUFPLE9BQU8sT0FBTyxFQUFZLElBQUksRUFFekMsRUFBSSxNQUFNLFNBQVMsc0JBQXNCLElBRTlDLEdBQWEsRUFBUSxFQUFLLENBQUksRUFDOUIsRUFBcUIsSUFFbEIsS0FFTCxRQUFRLEVBQVIsQ0FDRSxJQUFLLFVBQ0gsR0FBSSxFQUFZLElBQUksU0FDbEIsT0FBTyxFQUFZLEdBQUcsVUFDakIsR0FBSSxFQUFZLElBQUksTUFBUSxFQUFPLFFBQVEsU0FBUyxPQUFTLEVBQ2xFLEVBQVksR0FBRyxLQUFLLFNBQVcsRUFBTyxRQUFRLGFBQ3pDLENBRUwsTUFBTSxFQUFHLFNBQVMsR0FBRyxFQUFLLEtBQUssRUFBZSxhQUFhLEVBQUcsQ0FBRSxNQUFPLEVBQUssQ0FBQyxFQUM3RSxNQUNGLENBQ0ksRUFBTyxjQUNULEVBQVksY0FBZ0IsQ0FBQyxFQUM3QixFQUFZLFlBQVksWUFBYyxTQUV0QyxPQUFPLEVBQVksY0FBYyxZQUVuQyxNQUVGLElBQUssT0FDTCxJQUFLLFlBR0gsT0FBTyxFQUFZLGFBQWEsUUFDNUIsRUFBWSxJQUFJLGNBQ2xCLE9BQU8sRUFBWSxHQUFHLGFBQWEsZ0JBRWpDLEVBQVksSUFBSSxPQUNsQixPQUFPLEVBQVksR0FBRyxLQUFLLGdCQUMzQixFQUFZLEdBQUcsS0FBSyxTQUFXLEVBQVksR0FBRyxLQUFLLFNBQVMsT0FBUSxHQUFXLElBQVcsYUFBYSxHQUV6RyxLQUdKLENBR0EsR0FGQSxNQUFNLEdBQVUsRUFBYSxDQUFRLEVBRWpDLElBQVMsT0FBUSxDQUVuQixHQURBLE1BQU0sRUFBRyxTQUFTLEdBQUcsRUFBSyxLQUFLLEVBQWUsZUFBZSxFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsRUFDM0UsQ0FBQyxFQUFZLEtBQUssTUFBTSxLQUFNLE9BR2xDLEVBQVksS0FBSyxjQUFnQixFQUFZLEtBQUssS0FDbEQsSUFBTSxFQUFTLEVBQVksS0FBSyxLQUFLLEtBQUsseUJBQzFDLEdBQUksT0FBTyxHQUFXLFNBQVUsT0FFaEMsRUFBWSxLQUFLLEtBQUssS0FBSyx5QkFBMkIsV0FBVyxJQUNqRSxFQUFZLEtBQU8sZ0JBQ25CLEVBQVksR0FBSyxDQUFFLGtCQUFtQixJQUFLLEVBQzNDLE9BQU8sRUFBWSxLQUFLLEtBQ3hCLE1BQU0sR0FBVSxFQUFhLEVBQUssS0FBSyxFQUFlLGdCQUFnQixDQUFDLENBQ3pFLENBakJBLENBa0JGLENBRUEsU0FBUyxHQUFhLEVBQXVCLEVBQVUsRUFBdUIsQ0FtQjVFLEdBbEJBLEVBQUksT0FBUyxDQUFDLEVBQ2QsRUFBSSxVQUFZLENBQUMsR0FFYixJQUFTLFFBQVUsSUFBUyxhQUM5QixFQUFJLFFBQVEsU0FBVywrQkFHckIsRUFBSSxRQUFRLGlCQUNkLEVBQUksUUFBUSw2QkFBK0IsOENBQzNDLE9BQU8sRUFBSSxRQUFRLGlCQUdsQixFQUFJLFFBQVEsc0JBQXdCLElBQVMsV0FBYSxFQUFLLFdBQVcsUUFBUSxJQUNsRixFQUFJLEtBQUssWUFBYyxFQUFLLFdBQVcsUUFBUSxLQUVoRCxFQUFJLFFBQVEsb0JBQXNCLGtEQUdoQyxJQUFTLE9BQVEsQ0FDbkIsSUFBTSxFQUFTLEVBQUksS0FBSyx5QkFDcEIsT0FBTyxHQUFXLFdBQ3BCLEVBQUksS0FBSyx5QkFBMkIsRUFBTyxRQUFRLFFBQVMsRUFBRSxFQUVsRSxDQUVBLEdBQUksSUFBUyxZQUFhLENBQ3hCLEdBQU0sQ0FBQyxHQUFlLEVBQU8sa0JBQ3pCLEdBQWUsSUFBZ0IsSUFDakMsRUFBSSxLQUFLLGtCQUFvQixFQUU3QixPQUFPLEVBQUksS0FBSyxpQkFFcEIsQ0FrQ0EsR0FoQ0ksRUFBTyxZQUFZLFdBQVcscUJBQXFCLEVBQ3JELEVBQUksS0FBTyxFQUFJLE1BQU0sUUFBUSxrQkFBbUIsY0FBYyxFQUNyRCxFQUFPLFlBQVksV0FBVyx3QkFBd0IsSUFDL0QsRUFBSSxLQUFPLEVBQUksTUFBTSxRQUFRLGVBQWdCLGlCQUFpQixHQUk1RCxFQUFJLEtBQUssZUFBaUIsUUFDNUIsT0FBTyxFQUFJLEtBQUssYUFJZCxFQUFLLFdBQVcsUUFBUSxHQUFLLEVBQUksUUFBUSxlQUFpQixPQUFPLEVBQUksS0FBSyxnQkFBbUIsV0FDL0YsRUFBSSxLQUFLLGVBQWlCLEVBQUksS0FBSyxlQUFlLFFBQVEsWUFBYSxFQUFFLEdBRXZFLEVBQU8sdUJBQXlCLENBQUMsRUFBSSxLQUFLLFVBQVksRUFBSyxXQUFXLE1BQU0sSUFDOUUsRUFBSSxLQUFLLFNBQVcsU0FHbEIsSUFBUyxXQUFhLEVBQUssV0FBVyxNQUFNLEdBQUssRUFBSyxXQUFXLFFBQVEsRUFDdkUsRUFBTyxlQUNULEVBQUksS0FBSyxxQkFBdUIsSUFHbEMsT0FBTyxFQUFJLEtBQUsscUJBR2QsT0FBTyxLQUFLLEVBQUksSUFBSSxDQUFDLENBQUMsT0FBUyxFQUNqQyxFQUFTLEVBQUksSUFBSSxFQUVqQixPQUFPLEVBQUksS0FFVCxPQUFPLEtBQUssRUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFTLEVBQUcsQ0FFdkMsSUFBTSxFQUFhLEVBQVMsRUFBSSxPQUFPLEVBQ3ZDLE9BQU8sRUFBSSxRQUNYLEVBQUksUUFBVSxDQUNoQixNQUNFLE9BQU8sRUFBSSxPQUVmLENBRUEsU0FBUyxHQUF3QixFQUFpQyxDQUNoRSxJQUFNLEVBQWlCLEVBQU8sTUFBUSxNQUFRLE9BQ3hDLEVBQWdCLENBQ3BCLENBQUUsS0FBTSxxQkFBc0IsRUFDOUIsQ0FBRSxLQUFNLHdCQUF5QixLQUFNLENBQUUsZUFBZ0IsR0FBTSxlQUFnQixPQUFRLENBQUUsRUFDekYsR0FBSSxFQUFPLE1BQVEsQ0FBQyxDQUFFLEtBQU0sdUJBQXdCLEtBQU0sQ0FBRSxjQUFlLFFBQVMsQ0FBRSxDQUFDLEVBQUksQ0FBQyxFQUM1RixDQUFFLElBQUssR0FBRyxFQUFlLFNBQVUsRUFDbkMsQ0FBRSxJQUFLLEdBQUcsRUFBZSxhQUFjLENBQ3pDLEVBQ0ksRUFBTyxhQUFhLFNBQVMsT0FDL0IsRUFBTSxLQUFLLENBQUUsSUFBSyxHQUFHLEVBQWUsV0FBWSxDQUFDLEVBRW5ELEVBQU0sS0FBSyxDQUFFLEtBQU0sNERBQTZELENBQUMsRUFFakYsSUFBTSxFQUFrQixnQkFBZ0IsRUFBeUIsRUFDM0QsRUFBYSxFQUFnQixLQUFLLFNBQVcsQ0FBRSxVQUFXLGVBQWdCLEVBRWhGLE1BREEsR0FBZ0IsS0FBSyxRQUFVLENBQUUsR0FBRyxFQUFZLE9BQU0sRUFDL0MsQ0FDVCxDQUVBLGVBQWUsR0FBVSxFQUF1QixFQUFpQyxDQUMvRSxJQUFNLEVBQVcsR0FDZixFQUFLLEtBQUssRUFBYSxDQUFFLFVBQVcsR0FBSSxhQUFjLEdBQU0sT0FBUSxDQUFFLFNBQVUsT0FBUSxDQUFFLENBQUMsQ0FDN0YsRUFDQSxNQUFNLEVBQUcsU0FBUyxVQUFVLEVBQVUsQ0FBUSxDQUNoRCxDQUVBLFNBQVMsR0FBcUIsRUFBc0IsQ0FFbEQsT0FBTyxFQUFLLFdBQVcsWUFBYSxFQUFFLENBQ3hDLENDL2RBLGVBQXNCLEdBQVMsRUFBNkMsQ0FDMUUsT0FBTyxFQUFPLDBCQUEwQixXQUFZLFNBQVksQ0FDOUQsR0FBSSxHQUF3QixFQUFjLFVBQVUsRUFBRyxPQUV2RCxJQUFNLEVBQVUsRUFBYyxRQUN4QixFQUFXLE1BQU0sRUFBRyxLQUFLLFVBQVcsQ0FBRSxJQUFLLEdBQU0sSUFBSyxFQUFTLE9BQVEsQ0FBVyxDQUFDLEVBQ3JGLEVBQVEsV0FDVixRQUFRLEtBQUssU0FBUyxFQUFTLE9BQU8scUJBQXFCLEdBQVMsRUFFdEUsSUFBSyxJQUFNLEtBQVUsRUFBVSxDQUM3QixJQUFNLEVBQVcsRUFBSyxLQUFLLEVBQVMsQ0FBTSxFQUMxQyxFQUFpQixJQUFJLFNBQVksQ0FDL0IsSUFBTSxFQUFVLE1BQU0sRUFBTyxzQkFBc0IsQ0FBUSxFQUMzRCxHQUFJLElBQVksSUFBQSxHQUFXLE9BQzNCLElBQUksRUFBYSxHQUFlLENBQU8sRUFDdkMsRUFBYSxHQUFrQixFQUFZLEVBQWUsS0FBSyxFQUMzRCxJQUFZLEdBQ2QsTUFBTSxFQUFPLGFBQWEsRUFBVSxDQUFVLENBRWxELENBQUMsQ0FDSCxDQUVBLElBQU0sRUFBVSxNQUFNLEVBQUcsS0FDdkIsQ0FDRSw4REFDQSx5RUFDRixFQUNBLENBQUUsSUFBSyxHQUFNLElBQUssRUFBUyxPQUFRLENBQVcsQ0FDaEQsRUFDSSxFQUFRLFdBQ1YsUUFBUSxLQUFLLFNBQVMsRUFBUSxPQUFPLHVCQUF1QixHQUFTLEVBRXZFLElBQUssSUFBTSxLQUFVLEVBQVMsQ0FDNUIsSUFBTSxFQUFXLEVBQUssS0FBSyxFQUFTLENBQU0sRUFDMUMsRUFBaUIsSUFBSSxTQUFZLENBQy9CLElBQU0sRUFBYSxNQUFNLEVBQU8sc0JBQXNCLENBQVEsRUFDOUQsR0FBSSxJQUFlLElBQUEsR0FBVyxPQUM5QixJQUFJLEVBQWEsR0FBZSxDQUFVLEVBQzFDLEVBQWEsR0FBa0IsRUFBWSxFQUFlLElBQUksRUFFMUQsSUFBZSxHQUNqQixNQUFNLEVBQU8sYUFBYSxFQUFVLENBQVUsQ0FFbEQsQ0FBQyxDQUNILENBRUEsSUFBTSxFQUFpQixNQUFNLEVBQUcsS0FBSyx1Q0FBd0MsQ0FDM0UsSUFBSyxHQUNMLElBQUssRUFDTCxPQUFRLENBQ1YsQ0FBQyxFQUNHLEVBQVEsV0FDVixRQUFRLEtBQUssU0FBUyxFQUFlLE9BQU8sdUJBQXVCLEdBQVMsRUFFOUUsSUFBSyxJQUFNLEtBQVEsRUFBZ0IsQ0FDakMsSUFBTSxFQUFXLEVBQUssS0FBSyxFQUFTLENBQUksRUFDeEMsRUFBaUIsSUFBSSxTQUFZLENBQy9CLElBQU0sRUFBYSxNQUFNLEVBQU8sc0JBQXNCLENBQVEsRUFDOUQsR0FBSSxJQUFlLElBQUEsR0FBVyxPQUM5QixJQUFJLEVBQWEsR0FBZSxDQUFVLEVBQzFDLEVBQWEsR0FBa0IsRUFBWSxFQUFlLE1BQU0sRUFFNUQsSUFBZSxHQUNqQixNQUFNLEVBQU8sYUFBYSxFQUFVLENBQVUsQ0FFbEQsQ0FBQyxDQUNILENBRUEsTUFBTSxFQUFZLFdBQVcsQ0FDL0IsQ0FBQyxDQUNILENBRUEsU0FBZ0IsR0FBZSxFQUF5QixDQUN0RCxPQUFPLEVBQ0osV0FBVyxvQkFBcUIsS0FBSyxDQUFDLENBQ3RDLFdBQVcsa0JBQW1CLE1BQU0sQ0FBQyxDQUNyQyxXQUFXLGdCQUFpQixNQUFNLENBQ3ZDLENBRUEsU0FBUyxHQUFlLEVBQXlCLENBQy9DLE9BQU8sRUFDSixXQUFXLG9CQUFzQixHQUFZLEdBQWUsQ0FBTyxDQUFDLENBQUMsQ0FDckUsV0FBVyx5QkFBMEIsV0FBVyxDQUFDLENBQ2pELFdBQVcsdUJBQXdCLFlBQVksQ0FBQyxDQUNoRCxXQUFXLHVCQUF3QixZQUFZLENBQ3BELENBRUEsU0FBUyxHQUFrQixFQUFvQixFQUE4QixFQUF5QyxDQUNwSCxJQUFLLEdBQU0sQ0FBQyxFQUFRLEtBQVUsT0FBTyxRQUFRLEVBQWMsVUFBVSxPQUFPLEtBQU8sQ0FBQyxDQUFDLEVBQ25GLEVBQWEsRUFBVyxXQUFXLEVBQVEsQ0FBSyxFQUVsRCxJQUFLLEdBQU0sQ0FBQyxFQUFRLEtBQVUsT0FBTyxRQUFRLEVBQWMsVUFBVSxRQUFRLElBQWEsQ0FBQyxDQUFDLEVBQzFGLEVBQWEsRUFBVyxXQUFXLEVBQVEsQ0FBSyxFQUVsRCxPQUFPLENBQ1QsQ0NsR0EsTUFBTSxHQUF5QiwyQkFFekIsR0FBbUIsQ0FDdkIsd0VBQ0EsVUFDQSxZQUNBLHlCQUNBLGdCQUNBLG1CQUNBLGdCQUNBLGtCQUNBLGNBQ0EsZUFDQSxnQkFDQSxrQkFDQSxpQkFDRixFQUVBLGVBQXNCLEdBQWUsRUFBMkIsRUFBaUIsQ0FBQyxDQUFVLEVBQWtCLENBQzVHLEdBQUksRUFBVyxhQUFlLGVBQWlCLEVBQVcsV0FBYSxTQUFVLE9BRWpGLElBQU0sRUFBYyxJQUFJLEVBR2xCLEVBQXVDLENBQUMsRUFDOUMsSUFBSyxJQUFNLEtBQVUsRUFBZ0IsQ0FDbkMsSUFBTSxFQUFVLEdBQXdCLENBQU0sRUFDOUMsR0FBSSxDQUFDLEVBQVMsU0FFZCxJQUFNLEVBQVksTUFBTSxFQUFHLEdBQWtCLENBQzNDLFNBQVUsR0FDVixJQUFLLEVBQU8sUUFDWixJQUFLLEdBQ0wsT0FBUSxDQUFDLGFBQWMsR0FBSSxFQUFPLE9BQVMsQ0FBQyxhQUFhLEVBQUksQ0FBQyxFQUFJLEdBQUcsQ0FBVSxFQUMvRSxVQUFXLEVBQ2IsQ0FBQyxFQUNELElBQUssSUFBTSxLQUFZLEVBQ3JCLEVBQW9CLEtBQUssRUFBWSxRQUFVLEdBQXlCLEVBQVUsQ0FBTyxDQUFDLENBQUMsQ0FFL0YsQ0FDQSxNQUFNLFFBQVEsSUFBSSxDQUFtQixFQUNyQyxNQUFNLEVBQVksV0FBVyxDQUMvQixDQUVBLFNBQVMsR0FBd0IsRUFBMEQsQ0FDekYsR0FBSSxFQUFPLFVBQVUsT0FBUSxNQUFPLFlBQ3BDLEdBQUksRUFBTyxVQUFVLFFBQVMsTUFBTyxPQUN2QyxDQUVBLGVBQWUsR0FBeUIsRUFBa0IsRUFBK0MsQ0FDdkcsSUFBTSxFQUFVLE1BQU0sR0FBYSxDQUFRLEVBQzNDLEdBQUksQ0FBQyxFQUFTLE9BSWQsSUFBTSxFQUFhLEVBQVEsV0FBVyxHQUF3QixDQUFPLEVBQ2pFLElBQWUsR0FFbkIsTUFBTSxFQUFPLGFBQWEsRUFBVSxDQUFVLENBQ2hELENBRUEsZUFBZSxHQUFhLEVBQStDLENBRXpFLElBQUksTUFEZ0JDLEVBQUcsS0FBSyxDQUFRLEVBQUEsQ0FDMUIsS0FBTyxRQUFrQixPQUVuQyxJQUFNLEVBQVMsTUFBTUEsRUFBRyxTQUFTLENBQVEsRUFDckMsTUFBTyxTQUFTLENBQUMsRUFFckIsT0FBTyxFQUFPLFNBQVMsTUFBTSxDQUMvQixDQzNFQSxTQUFnQixFQUFVLEVBQWlCLEVBQWdCLEVBQWEsRUFBUSxFQUFTLENBQ3ZGLEdBQXlCLEVBQVMsRUFBTSxFQUFLLENBQUssQ0FDcEQsQ0FFQSxTQUFnQixHQUF5QixFQUFpQixFQUFnQixFQUFhLEVBQVEsRUFBVyxDQUN4RyxFQUFHLENBQ0QsR0FBTSxDQUFDLEVBQVEsRUFBUyxHQUFXLEdBQWlCLEVBQVMsRUFBTSxDQUFHLEVBR2hFLEVBRE0sRUFBYyxVQUFVLEVBQVEsRUFBUyxDQUNwQyxDQUFDLENBQUMsUUFBVSxFQUM3QixHQUFJLElBQVcsRUFBRyxNQUNsQixHQUFJLEdBQVMsRUFBRyxPQUFPLENBQ3pCLE9BQVMsRUFBRSxHQUFTLEdBQ3BCLE1BQU8sRUFDVCxDQUVBLFNBQWdCLEVBQXlCLEVBQWlCLEVBQWdCLEVBQXFCLENBQzdGLEdBQU0sQ0FBQyxFQUFRLEVBQVMsR0FBVyxHQUFpQixFQUFTLEVBQU0sQ0FBRyxFQUN0RSxFQUFRLE1BQVEsT0FDaEIsSUFBTSxFQUFPLEVBQWMsVUFBVSxFQUFRLEVBQVMsQ0FBTyxFQUV2RCxFQUFTLEVBQUssUUFBVSxHQUN4QixFQUFRLE9BQU8sR0FBVyxTQUFXLEVBQU8sS0FBSyxFQUFJLEVBQU8sU0FBUyxDQUFDLENBQUMsS0FBSyxFQUM5RSxFQUFLLE1BQ1AsUUFBUSxNQUFNLEdBQUcsRUFBTyxJQUFJLEVBQVEsSUFBSyxHQUFNLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxpQkFBaUIsRUFBSyxNQUFNLFNBQVMsRUFDaEcsR0FDVCxRQUFRLE1BQ04sR0FBRyxFQUFPLElBQUksRUFBUSxJQUFLLEdBQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLDhDQUE4QyxHQUN0RyxFQUdGLElBQU0sRUFBUyxFQUFLLFFBQVUsR0FDOUIsT0FBTyxPQUFPLEdBQVcsU0FBVyxFQUFPLEtBQUssRUFBSSxFQUFPLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FDN0UsQ0FFQSxTQUFnQixHQUFpQixFQUFpQixFQUFnQixFQUFtRCxDQUNuSCxJQUFNLEVBQU0sQ0FBRSxHQUFHLFFBQVEsR0FBSSxFQVE3QixPQU5JLEVBQUksTUFBUSxFQUFJLG1CQUNsQixFQUFJLEtBQU8sRUFBSSxLQUFLLE1BQU0sR0FBRyxDQUFBLENBQzFCLE9BQVEsR0FBTSxJQUFNLEVBQUksZ0JBQWdCLENBQUEsQ0FDeEMsS0FBSyxHQUFHLEdBR04sQ0FDTCxFQUNBLEVBQ0EsQ0FDRSxNQUNBLE1BQ0EsU0FBVSxPQUNWLE1BQU8sR0FDUCxNQUFPLFNBQ1QsQ0FDRixDQUNGLENDNUNBLE1BQU0sR0FBdUIsSUFBSSxJQUFJLENBQUMsT0FBUSxNQUFPLE1BQU8sT0FBUSxPQUFRLEtBQUssQ0FBQyxFQUM1RSxHQUE4QixJQUFJLElBQUksQ0FBQyxPQUFRLE1BQU8sTUFBTyxNQUFNLENBQUMsRUFHcEUsR0FBMEIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFXM0QsU0FBZ0IsR0FBb0MsRUFHbEQsQ0FDQSxJQUFNLEVBQWUsT0FBTyxPQUFPLENBQU8sQ0FBQyxDQUFDLE9BQVEsR0FBNkIsT0FBTyxHQUFXLFFBQVEsRUFHckcsRUFBYyxFQUFhLEtBQzlCLEdBQ0MsR0FBMkIsQ0FBTSxDQUFDLENBQUMsS0FBTSxHQUFZLENBQ25ELElBQU0sRUFBaUIsRUFBNkIsQ0FBTyxFQUUzRCxPQURJLEVBQXVCLEVBQWdDLENBQWMsSUFBTSx3QkFDeEUsR0FBZ0MsRUFBUyxDQUFPLENBQ3pELENBQUMsR0FBSyxHQUFzQyxFQUFRLENBQU8sQ0FDL0QsRUFDTSxFQUFzQixDQUMxQixHQUFpQyxFQUFRLFlBQWEsQ0FBTyxFQUM3RCxHQUFpQyxFQUFRLFlBQWEsQ0FBTyxFQUM3RCxFQUFhLFFBQVMsR0FBVyxHQUFpQyxFQUFRLENBQU8sQ0FBQyxDQUNwRixDQUFDLENBQUMsS0FBTSxHQUFlLEVBQVcsT0FBUyxDQUFDLEVBR3RDLEVBQW1CLElBQUksSUFDN0IsSUFBSyxJQUFNLEtBQVcsR0FBdUIsQ0FBQyxFQUFHLENBQy9DLElBQU0sRUFBTSxFQUF1QixDQUFPLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFDL0MsRUFBaUIsSUFBSSxDQUFHLEdBQUcsRUFBaUIsSUFBSSxFQUFLLENBQU8sQ0FDbkUsQ0FDQSxNQUFPLENBQ0wsWUFBYSxHQUFlLEVBQWlCLEtBQU8sRUFDcEQsUUFBUyxFQUFpQixPQUFTLEVBQUksQ0FBQyxHQUFHLEVBQWlCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBSyxJQUFBLEVBQzdFLENBQ0YsQ0FPQSxTQUFTLEdBQXNDLEVBQWdCLEVBQXVDLENBQ3BHLElBQU0sRUFBVyxHQUEyQixDQUFNLEVBZ0JsRCxPQVY2QixFQUFTLEtBQ25DLEdBQ0MsQ0FBQyxHQUF3QixFQUFTLENBQU8sR0FDekMsRUFDRSxFQUNBLEVBQ0MsR0FBbUIsRUFBZ0MsQ0FBYyxJQUFNLG1CQUMxRSxDQUVvQixFQUNqQixFQUFTLEtBQ2IsR0FDQyxJQUFZLElBQ1osQ0FBQyxHQUF3QixFQUFTLENBQU8sR0FDekMsQ0FBQyxFQUE2QixDQUFPLEdBQ3JDLENBQUMsRUFBcUIsRUFBUyxNQUFlLEVBQUksQ0FDdEQsRUFQa0MsRUFRcEMsQ0FHQSxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQXFCLElBQUksSUFDZixDQUNWLElBQU0sRUFBcUIsQ0FBQyxFQWM1QixPQWJLLEdBQ0wsRUFDRSxFQUNBLEdBQ0MsRUFBZ0IsS0FDWCxFQUFlLE9BQVMsR0FBSyxFQUFnQyxDQUFjLElBQU0scUJBRW5GLEVBQVMsS0FBSyxHQUFxQixDQUFPLENBQUMsRUFFdEMsSUFFVCxDQUNGLEVBWm9CLENBY3RCLENBTUEsU0FBZ0IsR0FBZ0MsRUFBdUMsQ0FDckYsT0FBTyxFQUNMLEVBQVEsWUFDUixFQUNDLEdBQW1CLEVBQWdDLENBQWMsSUFBTSxtQkFDMUUsQ0FDRixDQU9BLFNBQWdCLEVBQ2QsRUFDQSxFQUNBLEVBQ0EsRUFBcUIsSUFBSSxJQUNoQixDQUNULEdBQUksQ0FBQyxFQUFRLE1BQU8sR0FDcEIsSUFBSyxJQUFNLEtBQVcsR0FBMkIsQ0FBTSxFQUFHLENBQ3hELElBQU0sRUFBaUIsRUFBNkIsQ0FBTyxFQUMzRCxHQUFJLEdBQWtCLEVBQVUsRUFBZ0IsQ0FBTyxFQUFHLE1BQU8sR0FDakUsSUFBTSxFQUFTLEVBQXVCLENBQU8sRUFDekMsRUFBUSxFQUEyQixDQUFNLEVBQ3pDLEVBQ0osR0FBSSxHQUE0QixJQUFJLEVBQU8sSUFBVSxFQUFFLEVBQUcsQ0FDeEQsSUFDQSxJQUFJLEVBQWMsRUFBbUIsRUFBUSxDQUFLLEVBQzlDLENBQUMsTUFBTyxZQUFZLENBQUMsQ0FBQyxTQUFTLEVBQU8sRUFBWSxRQUFVLEVBQUUsSUFDaEUsRUFBYyxFQUFtQixFQUFRLEVBQVksTUFBUSxFQUFHLEVBQVksYUFBYSxHQUszRixFQUNFLEVBQVksZUFBaUIsRUFBTyxPQUFTLEVBQVksTUFBUSxFQUFJLElBQUEsR0FBWSxFQUFPLEVBQVksTUFDeEcsQ0FDQSxHQUFJLENBQUMsR0FBcUIsRUFBbUIsSUFBSSxDQUFpQixFQUFHLFNBQ3JFLEVBQW1CLElBQUksQ0FBaUIsRUFDeEMsSUFBTSxFQUFnQixFQUFRLEdBQzlCLEdBQ0UsT0FBTyxHQUFrQixVQUN6QixFQUFxQixFQUFlLEVBQVMsRUFBVyxDQUFrQixFQUUxRSxNQUFPLEVBRVgsQ0FDQSxNQUFPLEVBQ1QsQ0FPQSxTQUFnQixHQUEyQixFQUEwQixDQUNuRSxJQUFNLEVBQXFCLENBQUMsRUFDNUIsSUFBSyxJQUFNLEtBQVcsR0FBcUIsQ0FBTSxFQUFHLENBQ2xELEdBQUksR0FBa0IsQ0FBTyxFQUFHLENBQzlCLEdBQUksR0FBc0IsQ0FBTyxFQUFHLFNBQ3BDLEtBQ0YsQ0FDQSxFQUFTLEtBQUssQ0FBTyxDQUN2QixDQUNBLE9BQU8sQ0FDVCxDQUdBLFNBQWdCLEdBQThCLEVBQXlCLENBQ3JFLE9BQU8sR0FBcUIsQ0FBTSxDQUFDLENBQUMsS0FBTSxHQUFZLEdBQWtCLENBQU8sR0FBSyxDQUFDLEdBQXNCLENBQU8sQ0FBQyxDQUNySCxDQU1BLFNBQWdCLEdBQXFCLEVBQTBCLENBQzdELElBQU0sRUFBcUIsQ0FBQyxFQUN4QixFQUFVLEdBQ1YsRUFDSixJQUFLLElBQUksRUFBUSxFQUFHLEVBQVEsRUFBTyxPQUFRLElBQVMsQ0FDbEQsSUFBTSxFQUFZLEVBQU8sSUFBVSxHQUNuQyxHQUFJLEVBQU8sQ0FDVCxHQUFJLElBQWMsTUFBUSxJQUFVLElBQUssQ0FDdkMsR0FBVyxHQUFhLEVBQU8sRUFBRSxJQUFVLElBQzNDLFFBQ0YsQ0FDSSxJQUFjLElBQU8sRUFBUSxJQUFBLElBQ2pDLEdBQVcsRUFDWCxRQUNGLENBQ0EsR0FBSSxJQUFjLEtBQU8sSUFBYyxJQUFLLENBQzFDLEVBQVEsRUFDUixHQUFXLEVBQ1gsUUFDRixDQUNBLEdBQUksSUFBYyxLQUFPLEVBQU8sRUFBUSxLQUFPLElBQUssQ0FDbEQsRUFBUyxLQUFLLEVBQVEsS0FBSyxDQUFDLEVBQzVCLEVBQVUsR0FDVixJQUNBLFFBQ0YsQ0FDQSxHQUFXLENBQ2IsQ0FFQSxPQURBLEVBQVMsS0FBSyxFQUFRLEtBQUssQ0FBQyxFQUNyQixDQUNULENBRUEsU0FBUyxHQUFrQixFQUEwQixDQUNuRCxJQUFNLEVBQVMsRUFBdUIsQ0FBTyxFQUM3QyxPQUFPLEVBQU8sRUFBMkIsQ0FBTSxLQUFPLElBQ3hELENBRUEsU0FBUyxHQUFzQixFQUEwQixDQUN2RCxJQUFNLEVBQVMsRUFBdUIsQ0FBTyxFQUN6QyxFQUFjLEVBQTJCLENBQU0sRUFBSSxFQUNuRCxFQUFPLEtBQWlCLE1BQU0sSUFHbEMsSUFBSSxFQUFTLEVBQWtCLEVBQU8sSUFBZ0IsRUFBRSxFQUN4RCxLQUFPLEVBQU8sV0FBVyxJQUFJLEdBQUcsRUFBUyxFQUFPLE1BQU0sQ0FBQyxFQUV2RCxPQURJLEVBQU8sU0FBUyxHQUFHLElBQUcsRUFBUyxFQUFPLE1BQU0sRUFBRyxFQUFFLEdBQzlDLElBQVcsS0FBTyxFQUFjLElBQU0sRUFBTyxNQUN0RCxDQUdBLFNBQWdCLEdBQXdCLEVBQWlCLEVBQXVDLENBQzlGLElBQU0sRUFBUyxFQUF1QixDQUFPLEVBQ3pDLEVBQVEsRUFBMkIsQ0FBTSxFQUN6QyxFQUFrQixHQUN0QixHQUFJLEdBQXFCLElBQUksRUFBTyxJQUFVLEVBQUUsRUFBRyxDQUNqRCxJQUNBLElBQUksRUFBYyxFQUFtQixFQUFRLENBQUssRUFLbEQsR0FKSSxDQUFDLE1BQU8sYUFBYyxPQUFRLE1BQU8sR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFPLEVBQVksUUFBVSxFQUFFLElBQ3BGLEVBQWtCLENBQUMsTUFBTyxZQUFZLENBQUMsQ0FBQyxTQUFTLEVBQU8sRUFBWSxRQUFVLEVBQUUsRUFDaEYsRUFBYyxFQUFtQixFQUFRLEVBQVksTUFBUSxFQUFHLEVBQVksYUFBYSxHQUV2RixFQUFZLGNBQWUsTUFBTyxHQUN0QyxFQUFRLEVBQVksS0FDdEIsQ0FJQSxHQUFJLENBQUMsR0FBbUIsRUFBTyxLQUFXLE1BQVEsRUFBTyxFQUFRLEtBQU8sV0FDdEUsT0FBTyxFQUFRLElBQU0sRUFBTyxPQUU5QixHQUFJLEVBQU8sS0FBVyxZQUFjLEVBQVEsSUFBTSxFQUFPLE9BQVEsTUFBTyxHQUt4RSxJQUFNLEVBQWdCLEVBQVEsWUFDOUIsT0FDRSxPQUFPLEdBQWtCLFVBQ3pCLEdBQTJCLENBQWEsQ0FBQyxDQUFDLE1BQU8sR0FBbUIsQ0FDbEUsR0FBSSxJQUFtQixHQUFJLE1BQU8sR0FDbEMsSUFBTSxFQUFnQixFQUF1QixDQUFjLEVBQ3ZELEVBQWUsRUFBMkIsQ0FBYSxFQUUzRCxHQURJLEdBQXFCLElBQUksRUFBYyxJQUFpQixFQUFFLEdBQUcsSUFDN0QsRUFBYyxLQUFrQixNQUFRLEVBQWMsRUFBZSxLQUFPLFdBQVksTUFBTyxHQUNuRyxJQUFNLEVBQWlCLEVBQTZCLENBQWMsRUFDbEUsTUFBTyxDQUFDLENBQUMsR0FBa0IsRUFBZ0MsQ0FBYyxJQUFNLG1CQUNqRixDQUFDLENBRUwsQ0FHQSxTQUFnQixHQUFzQixFQUF5QixDQUM3RCxNQUFPLHdCQUF3QixLQUFLLEdBQWlCLENBQU0sQ0FBQyxDQUM5RCxDQVVBLFNBQWdCLEdBQ2QsRUFDQSxFQUNBLEVBQXFCLElBQUksSUFDaEIsQ0FDVCxHQUFJLEVBQTZCLENBQU8sRUFBRyxNQUFPLEdBSWxELEdBSEksR0FBc0IsQ0FBTyxHQUM3Qix5REFBeUQsS0FBSyxDQUFPLEdBRXJFLFVBQVUsS0FBSyxHQUF1QixDQUFPLENBQUMsR0FBSyx3QkFBd0IsS0FBSyxDQUFPLEVBQUcsTUFBTyxHQUdyRyxJQUFNLEVBQWlCLElBQUksSUFBSSxFQUF1QixDQUFPLENBQUMsQ0FBQyxJQUFLLEdBQVUsRUFBa0IsQ0FBSyxDQUFDLENBQUMsRUFDdkcsR0FBSSxFQUFlLElBQUksVUFBVSxHQUFLLEVBQWUsSUFBSSxPQUFPLEVBQUcsTUFBTyxHQUMxRSxJQUFNLEVBQVMsRUFBdUIsQ0FBTyxFQUN6QyxFQUFRLEVBQTJCLENBQU0sRUFDN0MsR0FBSSxDQUFDLEdBQTRCLElBQUksRUFBTyxJQUFVLEVBQUUsRUFBRyxNQUFPLEdBQ2xFLElBQ0EsSUFBSSxFQUFjLEVBQW1CLEVBQVEsQ0FBSyxFQUM5QyxDQUFDLE1BQU8sWUFBWSxDQUFDLENBQUMsU0FBUyxFQUFPLEVBQVksUUFBVSxFQUFFLElBQ2hFLEVBQWMsRUFBbUIsRUFBUSxFQUFZLE1BQVEsRUFBRyxFQUFZLGFBQWEsR0FFM0YsSUFBTSxFQUFvQixFQUFPLEVBQVksT0FDdkMsRUFBb0IsRUFBTyxPQUFTLEVBQVksTUFBUSxFQUU5RCxHQURJLEVBQVksZUFBaUIsQ0FBQyxHQUM5QixFQUFtQixJQUFJLENBQWlCLEVBQUcsTUFBTyxHQUN0RCxFQUFtQixJQUFJLENBQWlCLEVBQ3hDLElBQU0sRUFBZ0IsRUFBUSxHQUk5QixPQUhJLE9BQU8sR0FBa0IsU0FJM0IsR0FBcUIsQ0FBYSxDQUFDLENBQUMsS0FBTSxHQUN4QyxHQUFnQyxFQUFnQixFQUFTLENBQWtCLENBQzdFLEdBQ0MsR0FBcUIsRUFBcUIsRUFBZSxNQUFlLEdBQU0sSUFBSSxJQUFJLENBQWtCLENBQUMsRUFQOUQsRUFTaEQsQ0FHQSxTQUFTLEVBQXVCLEVBQTJCLENBQ3pELElBQU0sRUFBbUIsQ0FBQyxFQUN0QixFQUFVLEdBQ1YsRUFDSixJQUFLLElBQUksRUFBUSxFQUFHLEVBQVEsRUFBUSxPQUFRLElBQVMsQ0FDbkQsSUFBTSxFQUFZLEVBQVEsSUFBVSxHQUNwQyxHQUFJLEVBQU8sQ0FDVCxHQUFJLElBQWMsTUFBUSxJQUFVLElBQUssQ0FDdkMsR0FBVyxHQUFhLEVBQVEsRUFBRSxJQUFVLElBQzVDLFFBQ0YsQ0FDSSxJQUFjLElBQU8sRUFBUSxJQUFBLElBQ2pDLEdBQVcsRUFDWCxRQUNGLENBQ0EsR0FBSSxJQUFjLEtBQU8sSUFBYyxJQUFLLENBQzFDLEVBQVEsRUFDUixHQUFXLEVBQ1gsUUFDRixDQUNBLEdBQUksTUFBTSxLQUFLLENBQVMsRUFBRyxDQUNyQixHQUFTLEVBQU8sS0FBSyxDQUFPLEVBQ2hDLEVBQVUsR0FDVixRQUNGLENBQ0EsR0FBVyxDQUNiLENBRUEsT0FESSxHQUFTLEVBQU8sS0FBSyxDQUFPLEVBQ3pCLENBQ1QsQ0FHQSxTQUFTLEdBQWlCLEVBQXdCLENBQ2hELElBQUksRUFBUyxHQUNULEVBQ0osSUFBSyxJQUFJLEVBQVEsRUFBRyxFQUFRLEVBQU8sT0FBUSxJQUFTLENBQ2xELElBQU0sRUFBWSxFQUFPLElBQVUsR0FDbkMsR0FBSSxFQUFPLENBQ0wsSUFBYyxNQUFRLElBQVUsSUFBSyxJQUNoQyxJQUFjLElBQU8sRUFBUSxJQUFBLElBQ3RDLFFBQ0YsQ0FDQSxHQUFJLElBQWMsS0FBTyxJQUFjLElBQUssQ0FDMUMsRUFBUSxFQUNSLFFBQ0YsQ0FDQSxHQUFVLENBQ1osQ0FDQSxPQUFPLENBQ1QsQ0FHQSxTQUFTLEdBQXVCLEVBQXdCLENBQ3RELElBQUksRUFBUyxHQUNULEVBQWdCLEdBQ3BCLElBQUssSUFBTSxLQUFhLEVBQVEsQ0FDOUIsR0FBSSxFQUFlLENBQ2IsSUFBYyxNQUFLLEVBQWdCLElBQ3ZDLFFBQ0YsQ0FDQSxHQUFJLElBQWMsSUFBSyxDQUNyQixFQUFnQixHQUNoQixRQUNGLENBQ0EsR0FBVSxDQUNaLENBQ0EsT0FBTyxDQUNULENBR0EsU0FBUyxFQUFrQixFQUF1QixDQUNoRCxJQUFJLEVBQVMsR0FDVCxFQUNKLElBQUssSUFBSSxFQUFRLEVBQUcsRUFBUSxFQUFNLE9BQVEsSUFBUyxDQUNqRCxJQUFNLEVBQVksRUFBTSxJQUFVLEdBQ2xDLEdBQUksRUFBTyxDQUNULEdBQUksSUFBYyxNQUFRLElBQVUsSUFBSyxDQUN2QyxHQUFVLEVBQU0sRUFBRSxJQUFVLEdBQzVCLFFBQ0YsQ0FDSSxJQUFjLEVBQU8sRUFBUSxJQUFBLEdBQzVCLEdBQVUsRUFDZixRQUNGLENBQ0EsR0FBSSxJQUFjLEtBQU8sSUFBYyxJQUFLLENBQzFDLEVBQVEsRUFDUixRQUNGLENBQ0EsR0FBVSxDQUNaLENBQ0EsT0FBTyxDQUNULENBR0EsU0FBUyxHQUFxQixFQUF5QixDQUNyRCxJQUFJLEVBQ0osSUFBSyxJQUFJLEVBQVEsRUFBRyxFQUFRLEVBQVEsT0FBUSxJQUFTLENBQ25ELElBQU0sRUFBWSxFQUFRLElBQVUsR0FDcEMsR0FBSSxFQUFPLENBQ0wsSUFBYyxNQUFRLElBQVUsSUFBSyxJQUNoQyxJQUFjLElBQU8sRUFBUSxJQUFBLElBQ3RDLFFBQ0YsQ0FDQSxHQUFJLElBQWMsS0FBTyxJQUFjLElBQUssQ0FDMUMsRUFBUSxFQUNSLFFBQ0YsQ0FDQSxHQUFJLElBQWMsTUFBUSxJQUFVLEdBQUssTUFBTSxLQUFLLEVBQVEsRUFBUSxJQUFNLEVBQUUsR0FDMUUsT0FBTyxFQUFRLE1BQU0sRUFBRyxDQUFLLENBQUMsQ0FBQyxLQUFLLENBRXhDLENBQ0EsT0FBTyxDQUNULENBUUEsU0FBZ0IsRUFBNkIsRUFBdUMsQ0FFbEYsR0FBSSxHQUFpQixDQUFPLENBQUMsQ0FBQyxTQUFTO0NBQUksRUFBRyxPQUM5QyxJQUFNLEVBQVMsRUFBdUIsQ0FBTyxFQUN6QyxFQUFRLEVBQTJCLENBQU0sRUFDN0MsR0FBSSxHQUFxQixJQUFJLEVBQU8sSUFBVSxFQUFFLEVBQUcsQ0FDakQsSUFDQSxJQUFJLEVBQWMsRUFBbUIsRUFBUSxDQUFLLEVBUWxELEdBTEksQ0FBQyxNQUFPLFlBQVksQ0FBQyxDQUFDLFNBQVMsRUFBTyxFQUFZLFFBQVUsRUFBRSxJQUM5RCxDQUFDLE9BQVEsTUFBTyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQU8sRUFBWSxRQUFVLEVBQUUsSUFDL0QsRUFBYyxFQUFtQixFQUFRLEVBQVksTUFBUSxFQUFHLEVBQVksYUFBYSxHQUd2RixFQUFZLGVBQWUsT0FDL0IsRUFBUSxFQUFZLEtBQ3RCLENBQ0EsR0FBSSxFQUFPLEtBQVcsWUFBYyxFQUFPLEVBQVEsS0FBTyxRQUFTLE9BRW5FLElBQU0sRUFBMkIsQ0FBQyxFQUNsQyxJQUFLLElBQUksRUFBVyxFQUFRLEVBQUcsRUFBVyxFQUFPLE9BQVEsSUFBWSxDQUNuRSxJQUFNLEVBQVEsRUFBTyxJQUFhLEdBRWxDLEdBQUksRUFBTSxXQUFXLEdBQUcsRUFBRyxNQUczQixJQUFNLEVBQXNCLHdCQUF3QixLQUFLLENBQUssQ0FBQyxHQUFHLEdBQ2xFLEdBQUksRUFBcUIsQ0FDbkIsSUFBd0IsR0FBTyxJQUNuQyxRQUNGLENBQ0EsRUFBZSxLQUFLLENBQUssQ0FDM0IsQ0FDQSxPQUFPLENBQ1QsQ0FHQSxTQUFnQixFQUFnQyxFQUF1RCxDQUNyRyxJQUFJLEVBQWtCLEdBQ2xCLEVBQWdCLEdBQ3BCLElBQUssSUFBSSxFQUFRLEVBQUcsRUFBUSxFQUFlLE9BQVEsSUFBUyxDQUMxRCxJQUFNLEVBQVMsRUFBZSxJQUFVLEdBSXhDLEdBQUksaUJBQWlCLEtBQUssR0FBaUIsQ0FBTSxDQUFDLEdBQUssVUFBVSxLQUFLLEdBQXVCLENBQU0sQ0FBQyxFQUNsRyxNQUFPLHdCQUdULElBQU0sRUFBTSxFQUFrQixDQUFNLEVBQzlCLEVBQVUsRUFBa0IsRUFBZSxFQUFRLElBQU0sRUFBRSxFQUlqRSxHQURJLDBDQUEwQyxLQUFLLENBQUcsR0FBSyxJQUFZLFNBQ25FLHVCQUF1QixLQUFLLENBQUcsR0FBSyxJQUFZLFFBQVMsTUFBTyxXQUNwRSxHQUFJLGlEQUFpRCxLQUFLLENBQUcsRUFBRyxDQUM5RCxFQUFnQixHQUNYLEVBQUksU0FBUyxHQUFHLEdBQUcsSUFDeEIsUUFDRixDQUNBLEdBQUksbUJBQW1CLEtBQUssQ0FBRyxFQUFHLENBRWhDLElBQU0sRUFBVyxFQUFJLFNBQVMsR0FBRyxFQUM3QixFQUFJLE1BQU0sQ0FBZSxFQUN6QixFQUFrQixFQUFlLEVBQUUsSUFBVSxFQUFFLEVBQy9DLElBQWEsS0FBTyxJQUFhLE9BQU0sRUFBa0IsSUFDN0QsUUFDRixDQUNBLEdBQUksR0FBd0IsSUFBSSxDQUFHLEVBQUcsQ0FDcEMsSUFDQSxRQUNGLENBQ0EsR0FBSSxFQUFJLFdBQVcsR0FBRyxFQUFHLEVBR25CLElBQVksUUFBVSxJQUFZLFVBQVMsSUFDL0MsUUFDRixDQUNBLElBQUksRUFBYSxFQUNqQixLQUFPLEVBQVcsV0FBVyxJQUFJLEdBQUcsRUFBYSxFQUFXLE1BQU0sQ0FBQyxFQUMvRCxJQUFlLDhCQUE2QixFQUFrQixHQUNwRSxDQUdBLE9BRkksRUFBd0IsV0FDeEIsRUFBc0Isd0JBQ25CLG1CQUNULENBRUEsU0FBUyxFQUEyQixFQUEwQixDQUM1RCxJQUFJLEVBQVEsRUFDWixLQUFPLEVBQVEsRUFBTyxRQUFVLDRCQUE0QixLQUFLLEVBQU8sSUFBVSxFQUFFLEdBQUcsSUFDdkYsT0FBTyxDQUNULENBS0EsTUFBTSxHQUE0QixJQUFJLElBQUksQ0FBQyxRQUFTLEtBQU0sV0FBWSxPQUFPLENBQUMsRUFDeEUsR0FBNEIsSUFBSSxJQUFJLENBQUMsS0FBTSxjQUFlLEtBQU0sVUFBVSxDQUFDLEVBRTNFLEdBQTJCLElBQUksSUFBSSxDQUFDLGVBQWdCLE1BQU8sY0FBZSxJQUFJLENBQUMsRUFFckYsU0FBUyxFQUNQLEVBQ0EsRUFDQSxFQUFnQixHQUMyQixDQUMzQyxNQUFRLEVBQU8sSUFBVSxHQUFBLENBQUksV0FBVyxHQUFHLEdBQUcsQ0FDNUMsSUFBTSxFQUFPLEVBQU8sSUFBVSxHQUM5QixJQUNBLElBQUksRUFDQSxHQUEwQixJQUFJLENBQUksR0FDcEMsRUFBaUIsRUFBTyxHQUN4QixLQUNTLDhCQUE4QixLQUFLLENBQUksRUFDaEQsRUFBaUIsRUFBSyxNQUFNLEVBQUssUUFBUSxHQUFHLEVBQUksQ0FBQyxFQUN4QyxHQUEwQixJQUFJLENBQUksR0FDM0MsSUFDQSxFQUFnQixLQUNQLG9DQUFvQyxLQUFLLENBQUksR0FBSyxHQUF5QixJQUFJLENBQUksS0FDNUYsRUFBZ0IsSUFFZCxJQUFtQixJQUFBLElBQWEsSUFBbUIsS0FBTyxJQUFtQixPQUFNLEVBQWdCLEdBQ3pHLENBQ0EsTUFBTyxDQUFFLFFBQU8sZUFBYyxDQUNoQyxDQy9qQkEsTUFBTSxHQUFzQiw0QkFLNUIsZUFBc0IsR0FBbUIsRUFBc0MsQ0FDN0UsT0FBTyxFQUFPLDBCQUEwQixxQkFBc0IsU0FBWSxDQVl4RSxHQVJJLENBRFksRUFBeUIsTUFBTyxDQUFDLFdBQVksS0FBTSxFQUFtQixFQUFHLEVBQU8sT0FDckYsR0FRUCxDQUFDLEdBSGUsS0FBSyxNQUN2QixFQUFHLGFBQWEsRUFBSyxRQUFRLEVBQU8sUUFBUyxjQUFjLEVBQUcsTUFBTSxDQUV2QixDQUFDLENBQUMsU0FBVyxDQUFDLENBQUMsRUFBRyxPQU1qRSxJQUFNLEVBQWdCLEVBQUssUUFBUSxFQUFPLFFBQVMsWUFBWSxFQUU3RCxFQUFHLFdBQVcsQ0FBYSxHQUMzQixFQUNHLGFBQWEsRUFBZSxNQUFNLENBQUMsQ0FDbkMsTUFBTTtDQUFJLENBQUMsQ0FDWCxLQUFNLEdBQVMsRUFBSyxLQUFLLElBQU0sSUFBSSxJQUFxQixHQUkzRCxHQUNFLE1BQ0EsQ0FBQyxlQUFnQixVQUFXLGFBQWMsS0FBTSxFQUFtQixFQUNuRSxFQUFPLE9BQ1QsSUFBTSxHQUlSLEdBQXlCLE1BQU8sQ0FBQyxLQUFNLFdBQVksVUFBVyxLQUFNLEVBQW1CLEVBQUcsRUFBTyxPQUFPLENBQzFHLENBQUMsQ0FDSCxDQzlDQSxlQUFzQixHQUEwQixFQUEyQixFQUE0QyxDQUNySCxPQUFPLEVBQU8sMEJBQTBCLDRCQUE2QixTQUFZLENBQy9FLEdBQUksQ0FBQyxFQUFXLE9BQVEsT0FHeEIsSUFBTSxFQUFrQixFQUFLLFFBQVEsRUFBVyxRQUFTLGlCQUFpQixFQUNwRSxFQUFlLE1BQU0sRUFBTyxzQkFBc0IsQ0FBZSxFQUV2RSxJQUFLLEdBQU0sQ0FBQyxFQUFVLElBQWEsQ0FDakMsQ0FBQyxZQUFhLFdBQVcsRUFDekIsQ0FBQyxZQUFhLGFBQWEsRUFDM0IsQ0FBQyxZQUFhLFlBQVksQ0FDNUIsRUFBWSxDQUNWLElBQU0sRUFBVSxHQUF5QixFQUFZLEVBQVksRUFBVSxDQUFZLEVBQ2pGLEVBQVcsRUFBSyxRQUFRLEVBQVcsUUFBUyxDQUFRLEVBQzFELE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVLENBQU8sQ0FBQyxDQUNwRSxDQUVBLElBQU0sRUFBa0IsRUFBSyxRQUFRLEVBQVcsUUFBUywyQkFBMkIsRUFDOUUsRUFBcUIsR0FBZ0MsRUFBWSxFQUFZLENBQVksRUFDL0YsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQWlCLENBQWtCLENBQUMsQ0FDdEYsQ0FBQyxDQUNILENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNRLENBR1IsTUFBTzs7OztTQURNLEdBQXlCLEVBQVEsRUFBWSxTQUFVLENBQ3JDLEdBQ2pDLENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNBLEVBQ1EsQ0FDUixJQUFNLEVBQWlCLEdBQXlCLENBQVUsRUFDcEQsRUFBYyxFQUFXLGFBQWEsWUFFdEMsRUFBcUIsRUFBVyxVQUNsQyx3RkFDQSxHQUNFLEVBQWtDLEdBQXdCLENBQVUsRUFDdEUsYUFBYSxFQUFlLDBFQUM1QixHQUNFLEVBQXNCLEVBQVcsa0JBQ25DLDhGQUE4RixFQUFTLDhCQUN2RyxHQUNFLEVBQWM7OztZQUdWLEVBQVcsYUFBYSxNQUFRLFVBQVUsSUFBSSxFQUFjLG9CQUFvQixJQUFnQixHQUFHO3FCQUMxRixFQUFlOzs7Ozs7Ozs7Ozs7O2dDQWFKLEVBQWUsc0VBQXNFLEVBQWU7O3lFQUUzRCxFQUFvQjs7O2lHQUdJLElBQXFCLEVBQWdDOztFQUVwSixHQUF5QixDQUFVLEVBQUU7RUFFbEMsV0FBVyxZQUFhO0VBQU0sQ0FBQyxDQUMvQixXQUFXLFVBQVc7O0NBQU0sQ0FBQyxDQUM3QixLQUFLLEVBRUYsRUFBZ0IsR0FBYyxLQUFLLENBQUMsQ0FBQyxXQUFXLEdBQUcsRUFNekQsT0FBTyxHQUx3QixFQUMzQixFQUNFOztFQUFTLEVBQWEsS0FBSyxFQUMzQjtFQUFPLEVBQ1QsR0FFTixDQUVBLFNBQWdCLEdBQXlCLEVBQXFDLENBRTVFLE1BQU87Ozs7Ozs7Ozs7OztFQWFQLEVBQVcsS0FBTSxHQUFNLEVBQUUsVUFBVSxTQUFTLEVBQ3hDLDRQQUNBLEdBQ0w7O0VBR0MsRUFBVyxLQUFNLEdBQU0sRUFBRSxVQUFVLE9BQVMsRUFBRSxVQUFVLElBQUksRUFDeEQsZ05BR0EsR0FDTDtFQUVDLEVBQVcsS0FBTSxHQUFNLEVBQUUsVUFBVSxJQUFJLEVBQ25DLGtKQUlBLEdBQ0w7RUFFSSxXQUFXLFlBQWE7RUFBTSxDQUFDLENBQy9CLFdBQVcsVUFBVzs7Q0FBTSxDQUFDLENBQzdCLEtBQUssQ0FDVixDQUVBLFNBQVMsR0FBd0IsRUFBbUMsQ0FDbEUsT0FBTyxFQUFRLEtBQU0sR0FBVyxFQUFPLFVBQVUsY0FBYyxDQUNqRSxDQzlIQSxNQUFhLEdBQThCLE1BTXJDLEdBQXNCLENBQzFCLFlBQ0EsZUFDQSxhQUNBLGdCQUNBLGNBQ0EsWUFDQSxjQUNBLGdCQUNBLGlCQUNBLGNBQ0EsZ0JBQ0EsY0FDQSxZQUNBLGVBQ0EsYUFDQSxnQkFDQSxjQUNBLFlBQ0EsY0FDQSxXQUNGLEVBQ00sR0FBc0IsQ0FDMUIsbUJBQ0EsZ0JBQ0EsZUFDQSxhQUNBLGNBQ0Esc0JBQ0EsdUJBQ0Esa0JBQ0EsbUJBQ0Esa0JBQ0Esb0JBQ0EscUJBQ0Esa0JBQ0EsZ0JBQ0EsaUJBQ0Esb0JBQ0EsbUJBQ0Esa0JBQ0EsZ0JBQ0YsRUFDTSxHQUFvQixDQUFDLGVBQWdCLGFBQWMsY0FBZSxZQUFhLGNBQWUsV0FBVyxFQUN6RyxHQUFzQixDQUMxQixtQkFDQSxnQkFDQSxlQUNBLGFBQ0Esc0JBQ0Esa0JBQ0EsbUJBQ0EsZ0JBQ0EsaUJBQ0EsbUJBQ0Esa0JBQ0EsZ0JBQ0YsRUFDTSxHQUFtQixDQUN2QixtQkFDQSxnQkFDQSxlQUNBLGFBQ0EsY0FDQSxzQkFDQSxrQkFDQSxtQkFDQSxnQkFDQSxpQkFDQSxjQUNBLFdBQ0EsbUJBQ0Esa0JBQ0EsZ0JBQ0YsRUFFYSxHQUErQixDQUUxQywwQkFDQSx5Q0FDQSw0QkFDQSw2QkFDQSw2QkFDQSw0QkFDQSw0QkFDQSw2QkFDQSwrQkFDQSwrQkFDQSwwQkFDQSxxQ0FDQSwrQkFDQSwrQkFDQSxnQ0FDQSxrQkFDQSxvQkFDQSxnQkFDQSxXQUNBLGNBQ0EsbUJBS0EsYUFDQSxHQUFHLEdBQW9CLElBQUssR0FBYSwwQkFBMEIsR0FBVSxFQUc3RSxhQUNBLFlBQ0EsUUFDQSxHQUFHLEdBQW9CLElBQUssR0FBYSxrQkFBa0IsR0FBVSxFQUNyRSxTQUNBLEdBQUcsR0FBb0IsSUFBSyxHQUFhLG1CQUFtQixHQUFVLEVBQ3RFLGtCQUNBLEdBQUcsR0FBa0IsSUFBSyxHQUFhLG9CQUFvQixHQUFVLEVBQ3JFLFlBQ0EsYUFDQSx1QkFDQSxHQUFHLEdBQW9CLElBQUssR0FBYSx3QkFBd0IsR0FBVSxFQUMzRSxHQUFHLEdBQWlCLElBQUssR0FBYSxhQUFhLEdBQVUsRUFDN0Qsc0JBQ0EsT0FDQSxRQUNBLFdBQ0YsRUFFQSxlQUFzQixHQUFtQixFQUFzQyxDQUM3RSxPQUFPLEVBQU8sMEJBQTBCLHFCQUFzQixTQUFZLENBQ3hFLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLGFBQWEsRUFDckQsRUFBa0IsRUFBRyxXQUFXLENBQVEsRUFBSSxFQUFHLGFBQWEsRUFBVSxNQUFNLEVBQUksSUFBQSxHQUNoRixFQUFVQyxHQUFXLENBQWUsRUFDMUMsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBTyxDQUFDLENBQ3BFLENBQUMsQ0FDSCxDQUVBLE1BQU1BLEdBQWMsR0FBZ0QsQ0FDbEUsSUFBTSxFQUFhLEdBQWdCLENBQWUsRUFHbEQsTUFBTzs7O0VBR1AsR0FBdUIsQ0FBZSxFQUFFO1VBQ2hDLEdBQVksU0FBUyxRQUFVLEdBQVEsUUFBVSxPQUFPOztzQkFFNUMsR0FBNEI7O0VBRWhELEdBQTZCLElBQUssR0FBZ0IsUUFBUSxFQUFZLEdBQUcsQ0FBQyxDQUFDLEtBQUs7Q0FBSSxFQUFFOztDQUd4RixFQU1BLFNBQWdCLEdBQXVCLEVBQXFDLENBQzFFLEdBQUksQ0FBQyxFQUFTLE1BQU8sR0FFckIsSUFBTSxFQUEyQixDQUFDLEVBQzlCLEVBQWdCLEdBQ3BCLElBQUssSUFBTSxLQUFRLEVBQVEsTUFBTTtDQUFJLEVBQUcsQ0FDdEMsSUFBTSxFQUFlLG1CQUFtQixLQUFLLENBQUksRUFDN0MsSUFDRixFQUFnQixFQUFhLEtBQU8sUUFBVyxFQUFhLEVBQUUsQ0FBWSxXQUFXLE9BQU8sR0FFMUYsR0FBaUIsRUFBSyxLQUFLLEdBQzdCLEVBQWUsS0FBSyxDQUFJLENBRTVCLENBQ0EsT0FBTyxFQUFlLE9BQVMsRUFBSSxHQUFHLEVBQWUsS0FBSztDQUFJLEVBQUUsTUFBUSxFQUMxRSxDQUVBLFNBQVMsR0FBZ0IsRUFBcUQsQ0FDdkUsS0FHTCxHQUFJLENBQ0YsT0FBTyxFQUFNLENBQU8sQ0FDdEIsTUFBUSxDQUNOLE1BQ0YsQ0FDRixDQzFNQSxNQUFNLEdBQW9CLDhCQUNwQixHQUF5Qix3Q0FDekIsR0FBWSxzQkFFWixHQUF5QixHQUFHLEdBQWtCOzs7RUFHbEQsR0FBVTtFQUVOLEdBQXlCO0VBQzdCLEdBQWtCO0VBR1AsRUFBaUIsQ0FDNUIsYUFDQSxrQ0FDQSwwQkFDQSwwQkFDQSxNQUFNLCtCQUErQixFQUErQyxDQUNsRixHQUFJLENBQ0YsSUFBSSxFQUFVLE1BQU0sRUFBRyxTQUFTLFNBQVMsRUFBVSxNQUFNLEVBQ25ELEVBQWtCLEdBQWdDLENBQU8sRUFJL0QsT0FISSxFQUFrQixJQUNwQixFQUFVLEVBQVEsTUFBTSxFQUFHLEVBQWtCLENBQUMsR0FHOUMsRUFDRyxXQUFXLEdBQXdCLEVBQUUsQ0FBQyxDQUN0QyxXQUFXLDRCQUE2QixFQUFFLENBQUMsQ0FDM0MsV0FBVyx1QkFBd0I7O0NBQU0sQ0FBQyxDQUMxQyxLQUFLLEVBQUk7Q0FFaEIsTUFBUSxDQUVSLENBQ0YsRUFDQSxtQkFBbUIsRUFBeUIsQ0FDMUMsSUFBTSxFQUFRLEVBQVEsUUFBUSxLQUFLLGVBQWUsRUFNbEQsT0FMSSxJQUFVLEdBS1AsR0FKRSxFQUNKLE1BQU0sRUFBRyxFQUFRLFFBQVE7RUFBTSxDQUFLLEVBQUksQ0FBQyxDQUFDLENBQzFDLFdBQVcsR0FBd0IsR0FBRyxHQUFrQixVQUFVLENBR3pFLEVBQ0EsbUJBQW1CLEVBQXlCLENBQzFDLElBQU0sRUFBa0IsR0FBZ0MsQ0FBTyxFQUkvRCxPQUhJLEVBQWtCLEVBQ2IsRUFBUSxNQUFNLEVBQWtCLENBQUMsRUFFbkMsRUFDVCxFQUNBLE1BQU0sMEJBQTBCLEVBQW9DLENBQ2xFLEdBQUksQ0FFRixPQUFPLE1BRGUsRUFBRyxTQUFTLFNBQVMsRUFBVSxNQUFNLEVBQUEsQ0FDNUMsU0FBUzthQUFnQixDQUMxQyxNQUFRLENBQ04sTUFBTyxFQUNULENBQ0YsQ0FDRixFQUVBLFNBQVMsR0FBZ0MsRUFBeUIsQ0FDaEUsSUFBTSxFQUFRLEVBQVEsUUFBUSxFQUFpQixFQUN6QyxFQUFZLEVBQVEsWUFBWSxFQUFpQixFQUN2RCxPQUFPLEVBQVksRUFBUSxFQUFZLEVBQ3pDLENDeERBLE1BQU1DLEdBQWdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBcUNwQixDQXZDbUMsY0F1Q1QsQ0FBQyxDQUMxQixJQUNFLEdBQVksb0JBQW9CLEVBQVE7bUJBQzFCLEVBQVEsSUFDekIsQ0FBQyxDQUNBLEtBQUs7Q0FBSSxFQUFFOzs7Ozs7RUFRZCxlQUFzQixHQUFxQixFQUFzQyxDQUMvRSxPQUFPLEVBQU8sMEJBQTBCLHVCQUF3QixTQUFZLENBQzFFLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLGVBQWUsRUFDN0QsR0FBSSxFQUFPLHNCQUF1QixDQUNoQyxJQUFNLEVBQVcsTUFBTSxFQUFPLHNCQUFzQixDQUFRLEdBQU0sR0FDNUQsRUFBa0IsRUFBZSxtQkFBbUIsQ0FBTyxFQUMzRCxFQUFrQixFQUFlLG1CQUFtQixDQUFPLEVBRTNELEVBQWEsRUFBa0JBLEdBQWdCLEVBQ3JELE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVLENBQVUsQ0FBQyxDQUN2RSxNQUNFLE1BQU0sRUFBRyxTQUFTLEdBQUcsRUFBVSxDQUFFLE1BQU8sRUFBSyxDQUFDLENBRWxELENBQUMsQ0FDSCxDQzVFQSxNQUFhLEVBQWEsQ0FDeEIsb0JBQXFCLENBQ25CLE1BQ0EsTUFDQSxLQUNBLE1BQ0EsTUFDQSxNQUNBLEtBQ0EsTUFDQSxPQUNBLFFBQ0EsUUFDQSxNQUNBLE9BQ0EsTUFDQSxPQUNBLEtBQ0EsT0FDQSxLQUNBLE1BQ0EsTUFDQSxPQUNBLE1BQ0EsSUFDRixDQUFDLENBQUMsU0FBUyxFQUNYLG9CQUFxQixDQUFDLEtBQU0sU0FBVSxPQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFDN0QsYUFBYyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFDOUIsT0FBUSxDQUFDLFFBQVMsTUFBTyxNQUFPLEtBQU0sTUFBTyxNQUFPLE1BQU8sU0FBVSxLQUFNLE1BQU8sS0FBSyxDQUFDLENBQUMsU0FBUyxFQUNsRyxNQUFPLHVJQTRCUCxDQUFDLENBQUMsU0FBUyxFQUNYLGFBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQ2xDLEVDbkRNQyxHQUFhOzs7Ozs7OztFQVFqQixHQUFtQixFQUFXLG1CQUFtQixFQUFFOzs7O0VBSW5ELEdBQW1CLEVBQVcsbUJBQW1CLEVBQUU7Ozs7RUFJbkQsR0FBbUIsRUFBVyxZQUFZLEVBQUU7Ozs7OztFQVE5QyxlQUFzQixHQUFxQixFQUFzQyxDQUMvRSxPQUFPLEVBQU8sMEJBQTBCLHVCQUF3QixTQUFZLENBQzFFLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLGVBQWUsRUFDN0QsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVVBLEVBQVUsQ0FBQyxDQUN2RSxDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQW1CLEVBQThCLENBQ3hELE9BQU8sRUFBVyxPQUFTLEVBQUksT0FBTyxFQUFXLEtBQUssR0FBRyxFQUFFLElBQU0sTUFBTSxFQUFXLEdBQUcsRUFDdkYsQ0MxQkEsTUFBTSxHQUFnQixDQUNwQixTQUFVLEdBQ1YsWUFBYSxDQUNYLFFBQVMsR0FDVCwyQkFBNEIsU0FDNUIsb0JBQXFCLEdBQ3JCLG9CQUFxQixDQUNuQixLQUFNLEdBQ04sUUFBUyxHQUNULFlBQWEsRUFDZixDQUNGLEVBQ0EsZ0JBQWlCLENBQUMsa0JBQWtCLENBQ3RDLEVBRUEsZUFBc0IsR0FBcUIsRUFBdUIsRUFBNEMsQ0FDNUcsT0FBTyxFQUFPLDBCQUEwQix1QkFBd0IsU0FBWSxDQUMxRSxHQUFJLENBQUMsRUFBTyxPQUFRLE9BRXBCLElBQU0sRUFBVSxFQUFLLFFBQVEsRUFBTyxRQUFTLFNBQVMsRUFDaEQsRUFBaUIsRUFBSyxRQUFRLEVBQVMsWUFBWSxFQUNuRCxFQUFxQixFQUFLLFFBQVEsRUFBUyxlQUFlLEVBQzFELEVBQWtCLEVBQUssUUFBUSxFQUFPLFFBQVMsaUJBQWlCLEVBRWxFLEVBQW9CLGdCQUFnQixFQUFhLEVBQ3JELEdBQUksQ0FDRixJQUFNLEVBQWEsTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFnQixNQUFNLEVBQzlELEVBQVksRUFBSyxLQUFLLENBQVUsRUFDdEMsRUFBWSxFQUFNLElBQUksQ0FBQyxFQUFXLEVBQVcsQ0FBUyxFQUFHLENBQUUsV0FBWSxDQUFlLENBQUMsQ0FDekYsTUFBUSxDQUVSLENBRUEsSUFBTSxFQUFjLEVBQUssS0FBSyxFQUFXLENBQ3ZDLFVBQVcsR0FDWCxhQUFjLEdBQ2QsT0FBUSxDQUNOLFNBQVUsT0FDWixDQUNGLENBQUMsRUFFSyxFQUFlLE1BQU0sRUFBTyxzQkFBc0IsQ0FBZSxFQUNqRSxFQUF5QixHQUFjLFVBQVUsQ0FBQyxDQUFDLFdBQVcsR0FBRyxFQUFJLElBQUEsR0FBWSxFQUlqRixFQUFvQixHQUhRLEVBQU8sYUFDckMsNkRBQ0EsbUNBQ21ELE1BQU0sR0FBeUIsQ0FBVSxJQUM5RixFQUF5QixLQUFLLEVBQXVCLFFBQVEsSUFBTSxLQUcvRCxHQUFXLENBQ2YsRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFnQixDQUFXLENBQUMsRUFDdEUsRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFvQixDQUFpQixDQUFDLENBQ2xGLEVBQ0EsTUFBTSxRQUFRLElBQUksRUFBUSxDQUM1QixDQUFDLENBQ0gsQ0NqRUEsZUFBc0IsR0FBcUIsRUFBc0MsQ0FDL0UsT0FBTyxFQUFPLDBCQUEwQix5QkFBMEIsU0FBWSxDQUM1RSxHQUFJLENBQUMsRUFBTyxPQUFRLE9BRXBCLElBQU0sRUFBVSxFQUFLLFFBQVEsRUFBTyxRQUFTLFNBQVMsRUFDaEQsRUFBVyxFQUFLLFFBQVEsRUFBUyxlQUFlLEVBQ3RELE1BQU0sRUFBRyxTQUFTLEdBQUcsRUFBVSxDQUFFLE1BQU8sRUFBSyxDQUFDLENBQ2hELENBQUMsQ0FDSCxDQ0xBLE1BQU0sR0FBYTs7Ozs7RUFLakIsQ0FBQyxHQUFHLEVBQVcsb0JBQXFCLEdBQUcsRUFBVyxvQkFBcUIsR0FBRyxFQUFXLFlBQVksQ0FBQyxDQUNqRyxJQUFLLEdBQVEsS0FBSyxFQUFJLGFBQWEsQ0FBQyxDQUNwQyxLQUFLO0NBQUksRUFBRTs7O0VBS2QsZUFBc0IsR0FBc0IsRUFBc0MsQ0FDaEYsT0FBTyxFQUFPLDBCQUEwQix3QkFBeUIsU0FBWSxDQUMzRSxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxnQkFBZ0IsRUFDOUQsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsRUFBVSxDQUFDLENBQ3ZFLENBQUMsQ0FDSCxDQ2JBLE1BQWEsRUFBYSxJQUFJLEtBVGIsQ0FDZixjQUFjLEVBQXlDLENBRXJELElBQU0sRUFEcUIsRUFBYyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFDeEIsQ0FBQyxFQUFFLE1BQU0sR0FBRyxFQUczQyxNQUFPLENBRkssR0FBTyxHQUFHLEVBQUUsR0FBSyxHQUNoQixHQUFPLEdBQUcsRUFBRSxDQUFDLEVBQUUsUUFBUSxRQUFTLEVBQUUsR0FBSyxFQUNuQyxDQUNuQixDQUNGLEVBR00sR0FBZSxJQUFJLElBRXpCLFNBQWdCLEdBQVcsRUFBeUIsQ0FDbEQsSUFBTSxFQUFNLEdBQVMsR0FDZixFQUFTLEdBQWEsSUFBSSxDQUFHLEVBQ25DLEdBQUksRUFBUSxPQUFPLEVBRW5CLElBQU0sRUFBVSxJQUFJLEdBQVEsQ0FDMUIsS0FBTSxHQUFlLENBQUssR0FBSyxJQUFBLEVBQ2pDLENBQUMsRUFFRCxPQURBLEdBQWEsSUFBSSxFQUFLLENBQU8sRUFDdEIsQ0FDVCxDQUVBLFNBQWdCLEdBQWUsRUFBd0IsQ0FDckQsTUFBTyxDQUFDLENBQUMsR0FBZSxDQUFLLENBQy9CLENBRUEsU0FBUyxHQUFlLEVBQW9DLENBTzFELE9BTkksSUFBVSxjQUNMLFFBQVEsSUFBSSw0QkFBOEIsR0FBa0IsRUFFakUsSUFBVSxpQkFDTCxRQUFRLElBQUksK0JBQWlDLEdBQWtCLEVBR3RFLFFBQVEsSUFBSSw0QkFDWixRQUFRLElBQUksK0JBQ1osUUFBUSxJQUFJLFVBQ1osUUFBUSxJQUFJLGNBQ1osR0FBa0IsQ0FFdEIsQ0FFQSxJQUFJLEdBRUosU0FBUyxJQUF3QyxDQUMvQyxHQUFJLEtBQW1CLElBQUEsR0FBVyxPQUFPLElBQWtCLElBQUEsR0FFM0QsR0FBSSxDQUVGLEdBQ0VDLEVBQ0csYUFBYSxLQUFNLENBQUMsT0FBUSxPQUFPLEVBQUcsQ0FDckMsU0FBVSxPQUNWLE1BQU8sQ0FBQyxTQUFVLE9BQVEsUUFBUSxDQUNwQyxDQUFDLENBQUMsQ0FDRCxLQUFLLEdBQUssRUFDakIsTUFBUSxDQUNOLEdBQWlCLEVBQ25CLENBQ0EsT0FBTyxJQUFrQixJQUFBLEVBQzNCLENDMkJBLE1BQU0sR0FBaUIsRUFBRSxPQUFPLENBQzlCLE1BQU8sRUFDSixPQUFPLENBQ04sSUFBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDL0MsSUFBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDL0MsR0FBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDOUMsS0FBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDbEQsQ0FBQyxDQUFDLENBQ0QsU0FBUyxDQUNkLENBQUMsRUFFRCxlQUFzQixHQUNwQixFQUNBLEVBQ29DLENBQ3BDLElBQU0sRUFBa0IsRUFBSyxRQUFRLEVBQVMsY0FBYyxFQUM1RCxHQUFJLENBQ0YsSUFBTSxFQUF5QixFQUFHLFdBQVcsQ0FBZSxFQUN4RCxFQUE0QyxDQUFDLEVBQzdDLEVBQWtELENBQUMsRUFDbkQsRUFBMkIsQ0FBQyxFQUM1QixFQUFhLEdBQ2pCLEdBQUksRUFBd0IsQ0FDMUIsSUFBTSxFQUFrQixFQUFHLGFBQWEsRUFBaUIsTUFBTSxFQUMvRCxFQUFjLEtBQUssTUFBTSxDQUFlLEVBQ3hDLEVBQWUsRUFBWSxjQUFnQixDQUFDLEVBQzVDLEVBQWtCLEVBQVksaUJBQW1CLENBQUMsRUFDbEQsRUFBYSxFQUFZLE9BQVMsUUFDcEMsQ0FFQSxJQUFJLEVBQTRCLENBQUMsRUFDN0IsRUFBMkIsQ0FBQyxFQUNoQyxHQUFJLENBQ0YsSUFBTSxFQUFvQixFQUFLLFFBQVEsRUFBUyxpQkFBaUIsRUFDM0QsRUFBTyxLQUFLLE1BQU0sTUFBTUMsRUFBSSxTQUFTLEVBQW1CLE1BQU0sQ0FBQyxFQU1yRSxFQUFrQixHQUFNLFVBQVksQ0FBQyxFQUNyQyxFQUFpQixHQUFNLFNBQVMsS0FBSyxHQUFLLENBQUMsQ0FDN0MsTUFBUSxDQUVSLENBRUEsSUFBTSxFQUNKLEVBQUssU0FBUyxFQUFLLFFBQVEsRUFBUyxJQUFJLENBQUMsSUFBTSxZQUMvQyxDQUFDLEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBUyxLQUFNLEtBQU0sY0FBYyxDQUFDLEVBRTlELEVBQ0EsSUFDRixFQUFXLE1BQU0sR0FBYyxFQUFTLENBQVcsR0FHckQsSUFBSSxHQUFxQixHQUF1QixDQUFPLEVBQ3ZELElBQUssSUFBTSxJQUFVLENBQUMsT0FBUSxPQUFRLFFBQVEsRUFDNUMsR0FBSSxFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVMsSUFBSSxFQUFPLFNBQVMsQ0FBQyxFQUFHLENBQzlELEdBQXFCLEdBQ3JCLEtBQ0YsQ0FHRixJQUFJLEVBQWEsR0FDakIsR0FBSSxDQUNGLEVBQWEsTUFBTUEsRUFBSSxTQUFTLEVBQUssUUFBUSxFQUFTLFlBQVksRUFBRyxNQUFNLENBQzdFLE1BQVEsQ0FFUixDQUdBLElBQU0sR0FBZSxFQUFLLFFBQVEsRUFBUyxXQUFXLEVBQ2xELEVBQ0osR0FBSSxDQUNGLElBQU0sRUFBZSxNQUFNQSxFQUFJLFNBQVMsR0FBYyxNQUFNLEVBQzVELEVBQVcsR0FBZSxNQUFNLEtBQUssTUFBTSxDQUFZLENBQUMsQ0FDMUQsTUFBUSxDQUVSLENBRUEsSUFBTSxHQUFlLE9BQU8sR0FBVSxXQUFjLFNBQVcsRUFBUyxVQUFZLElBQUEsR0FDaEYsR0FDQSxHQUNKLEdBQUksR0FBYyxDQUNoQixJQUFNLEVBQVksR0FBYSxNQUFNLEdBQUcsRUFDcEMsRUFBVSxRQUFVLElBQ3RCLEdBQWEsRUFBVSxHQUN2QixHQUFXLEVBQVUsR0FFekIsQ0FDQSxJQUFNLEdBQWEsR0FBZSxVQUFVLEtBQWlCLElBQUEsR0FFdkQsR0FBeUIsQ0FBQyxrQkFBbUIsbUJBQW9CLFlBQVksQ0FBQyxDQUFDLEtBQU0sR0FDekYsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLFlBQWEsQ0FBUSxDQUFDLENBQzVELEVBQ00sRUFBd0IsQ0FDNUIsVUFDQSxhQUNBLFNBQ0EsYUFBYyxHQUFVLFVBQVksR0FDcEMsc0JBQXVCLENBQUMsQ0FBQyxFQUFZLE1BQ3JDLGNBQ0EsY0FDQSxZQUNBLGtCQUFtQixHQUNqQixJQUFZLFdBQVcscUJBQXFCLEdBQUssSUFBWSxXQUFXLHdCQUF3QixHQUVsRyxhQUFjLEdBQWlCLEVBQVMsQ0FBVyxFQUNuRCwwQkFBMkIsR0FBcUIsQ0FBTyxFQUN2RCxVQUFXLEdBQWMsRUFBUyxDQUFXLEVBQzdDLE1BQ0UsR0FBWSxPQUNaLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBUyxXQUFXLENBQUMsR0FDN0MsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFTLFVBQVUsQ0FBQyxHQUc1QyxFQUFHLFdBQVcsRUFBSyxLQUFLLEVBQVMsYUFBYSxDQUFDLEVBQ2pELGFBQWMsRUFDZCxxQkFBc0IsRUFBZ0IsU0FBUyxzQkFBc0IsRUFDckUsa0JBQW1CLEdBQXNCLENBQU8sRUFDaEQsMkJBQTRCLEVBQVksMkJBQTRCLENBQU8sRUFDM0Usc0JBQXVCLENBQUMsQ0FBQyxHQUFjLEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBUyxvQkFBb0IsQ0FBQyxFQUNoRyxtQkFBb0IsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLFNBQVMsQ0FBQyxFQUNsRSxpQkFBa0IsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLFFBQVEsQ0FBQyxFQUMvRCx1QkFBd0IsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLGNBQWMsQ0FBQyxFQUMzRSxzQkFBdUIsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLGFBQWEsQ0FBQyxFQUN6RSxrQkFBbUIsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLFNBQVMsQ0FBQyxFQUNqRSxrQkFBbUIsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLFNBQVMsQ0FBQyxFQUNqRSx1QkFBd0IsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLGNBQWMsQ0FBQyxFQUMzRSwwQkFDQSxpQ0FBa0MsRUFDaEMsc0VBQ0EsQ0FDRixFQUNBLHdCQUF5QixFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVMsZUFBZSxDQUFDLEVBQzdFLDhCQUErQixFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVMsVUFBVyxlQUFlLENBQUMsRUFDOUYsc0JBQXVCLEVBQVksK0NBQWdELENBQU8sRUFDMUYsc0JBQXVCLEVBQVksK0NBQWdELENBQU8sRUFDMUYsb0JBQXFCLEVBQVksOEJBQStCLENBQU8sRUFDdkUsZ0JBQWlCLEVBQVksWUFBYSxDQUFPLEVBQ2pELGdDQUFpQyxFQUFZLDJEQUE0RCxDQUFPLEVBQ2hILGdDQUFpQyxFQUFZLDJEQUE0RCxDQUFPLEVBQ2hILDhCQUErQixFQUFZLDBDQUEyQyxDQUFPLEVBQzdGLDBCQUEyQixFQUFZLHFCQUFzQixDQUFPLEVBQ3BFLFVBQVcsQ0FDVCxNQUFPLENBQUMsQ0FBQyxFQUFhLE1BQ3RCLE9BQVEsQ0FBQyxDQUFDLEVBQWdCLGtCQUMxQixRQUFTLENBQUMsQ0FBQyxFQUFhLGdCQUFrQixDQUFDLENBQUMsRUFBZ0IsZUFDNUQsU0FBVSxDQUFDLENBQUMsRUFBZ0Isa0JBQzVCLFVBQVcsQ0FBQyxDQUFDLEVBQWEsZ0JBQWtCLENBQUMsQ0FBQyxFQUFnQixlQUM5RCxXQUFZLEVBQVcsU0FBUyx1QkFBdUIsRUFDdkQsTUFBTyxDQUFDLENBQUMsRUFBYSxNQUN0QixLQUFNLENBQUMsQ0FBQyxFQUFhLEtBQ3JCLGVBQ0UsQ0FBQyxDQUFDLEVBQWEscUJBQXVCLENBQUMsQ0FBQyxFQUFnQixxQkFBdUIsQ0FBQyxDQUFDLEVBQWdCLFdBQ25HLGtCQUFtQixHQUE4QixDQUFPLEVBQ3hELE9BQVEsQ0FBQyxDQUFDLEVBQWEsbUJBQXFCLENBQUMsQ0FBQyxFQUFnQixPQUM5RCxRQUFTLENBQUMsQ0FBQyxFQUFnQixRQUMzQixZQUFhLENBQUMsQ0FBQyxFQUFhLGdCQUM1QixnQkFBaUIsQ0FBQyxFQUNoQixFQUFnQixxQkFDaEIsRUFBZ0IsT0FBUyxHQUN6QixFQUFlLE9BQVMsR0FFMUIsVUFBVyxDQUFDLENBQUMsRUFBZ0Isb0JBQzdCLE1BQ0UsQ0FBQyxDQUFDLEVBQWEsb0JBQ2YsQ0FBQyxDQUFDLEVBQWdCLG9CQUNsQixDQUFDLENBQUMsRUFBYSxvQkFDZixDQUFDLENBQUMsRUFBZ0Isb0JBQ2xCLEdBQ0YsT0FBUSxDQUFDLENBQUMsRUFBYSxRQUFVLENBQUMsQ0FBQyxFQUFnQixPQUNuRCxLQUFNLENBQUMsQ0FBQyxFQUFhLE1BQVEsQ0FBQyxDQUFDLEVBQWdCLEtBQy9DLEdBQUksQ0FBQyxDQUFDLEVBQWEsb0JBQXNCLENBQUMsQ0FBQyxFQUFnQixrQkFDN0QsRUFDQSxRQUFTLENBQ1AsU0FBVSxFQUNWLE9BQVEsRUFBZSxTQUFTLDBCQUEwQixFQUMxRCxJQUFLLEVBQWUsU0FBUyx1QkFBdUIsQ0FDdEQsRUFDQSxzQkFDQSxVQUFXLE1BQU0sR0FBYyxDQUFPLEVBQ3RDLGNBQ0EsVUFDRixFQUNBLEdBQ0UsRUFBTyxvQkFDUCxFQUFPLGtCQUNQLEVBQU8sd0JBQ1AsRUFBTyx1QkFDUCxFQUFPLG1CQUNQLEVBQU8sbUJBQ1AsRUFBTyx3QkFDUCxFQUFPLHdCQUNQLEVBQU8sd0JBRVAsT0FBTyxDQUVYLE1BQVEsQ0FFUixDQUNGLENBRUEsU0FBUyxHQUF1QixFQUEwQixDQUN4RCxJQUFNLEVBQVUsRUFBSyxRQUFRLENBQU8sRUFDcEMsT0FDRSxFQUFHLFdBQVcsRUFBSyxLQUFLLEVBQVMsV0FBVyxDQUFDLEdBQzdDLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBUyxZQUFZLENBQUMsR0FDOUMsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFTLGdCQUFnQixDQUFDLENBRXRELENBU0EsU0FBZ0IsR0FBcUIsRUFBZ0MsQ0FDbkUsSUFBTSxFQUFjLEVBQU8sWUFDM0IsT0FDRSxFQUFPLDJCQUNQLEdBQVEsR0FBYSxjQUFlLFVBQWUsR0FBYSxpQkFBa0IsV0FLbEYsQ0FBQyxHQUFvQyxHQUFhLFNBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUNqRSxHQUFvQyxDQUFNLENBRTlDLENBU0EsU0FBUyxHQUFvQyxFQUFnQyxDQUMzRSxJQUFNLEVBQVUsRUFBTyxRQVd2QixPQVZJLEdBQWlDLENBQU0sRUFBVSxHQU1oRCxHQUE0QixFQUhULENBQUMsaUJBQWtCLGdCQUFpQixlQUFlLENBQUMsQ0FBQyxPQUFRLEdBQ25GLEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBUyxDQUFRLENBQUMsQ0FFUyxDQUFDLEVBSWxELEdBQTRCLEVBSE4sRUFDMUIsWUFBWSxDQUFPLENBQUMsQ0FDcEIsT0FBUSxHQUFhLGtDQUFrQyxLQUFLLENBQVEsQ0FDUixDQUFDLEVBSkcsRUFLckUsQ0FTQSxTQUFTLEdBQTRCLEVBQWlCLEVBQThCLENBQ2xGLEdBQUksRUFBVSxTQUFXLEVBQUcsTUFBTyxHQUNuQyxHQUFJLEVBQVUsS0FBTSxHQUFhLEVBQUcsVUFBVSxFQUFLLFFBQVEsRUFBUyxDQUFRLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxFQUFHLE1BQU8sR0FDekcsSUFBTSxFQUFnQixFQUF5QixNQUFPLENBQUMsV0FBWSxLQUFNLEdBQUcsQ0FBUyxFQUFHLENBQU8sRUFFL0YsT0FEcUIsSUFBa0IsR0FBSyxFQUFJLEVBQWMsTUFBTTtDQUFJLENBQUMsQ0FBQyxVQUV2RCxFQUFVLFFBQzNCLEVBQXlCLE1BQU8sQ0FBQyxTQUFVLGNBQWUsS0FBTSxHQUFHLENBQVMsRUFBRyxDQUFPLElBQU0sRUFFaEcsQ0FNQSxTQUFTLEdBQWlDLEVBQWdDLENBQ3hFLElBQU0sRUFDSixFQUFPLGFBQWEsY0FBZSxVQUFlLEVBQU8sYUFBYSxpQkFBa0IsU0FDMUYsR0FBSSxDQUFDLEVBQXNCLE1BQU8sR0FDbEMsR0FBSSxDQUNGLElBQU0sRUFBaUIsRUFBTyxXQUFXLENBQW9CLEVBQzdELEdBQUksQ0FBQyxHQUFrQixFQUFPLEdBQUcsRUFBZ0IsUUFBd0MsRUFBRyxNQUFPLEVBQ3JHLE1BQVEsQ0FDTixNQUFPLEVBQ1QsQ0FDQSxPQUFPLEdBQXNDLEVBQU8sT0FBTyxDQUM3RCxDQU9BLFNBQVMsR0FBc0MsRUFBMEIsQ0FDdkUsR0FBSSxDQUNGLElBQUssSUFBTSxJQUFZLENBQUMsaUJBQWtCLGVBQWUsRUFBRyxDQUMxRCxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQVMsQ0FBUSxFQUMvQyxHQUFJLENBQUMsRUFBRyxXQUFXLENBQVEsRUFBRyxTQUc5QixJQUFNLEVBQTRCLENBQUMsRUFDN0IsRUFBU0MsR0FBVyxFQUFHLGFBQWEsRUFBVSxNQUFNLEVBQUcsRUFBYSxDQUFFLG1CQUFvQixFQUFLLENBQUMsRUFHdEcsT0FBTyxFQUFZLFNBQVcsR0FBSyxDQUFDLENBQUMsR0FBVSxHQUFnQyxDQUFNLENBQ3ZGLENBQ0EsSUFBTSxFQUFXLEVBQUssUUFBUSxFQUFTLGVBQWUsRUFDdEQsR0FBSSxFQUFHLFdBQVcsQ0FBUSxFQUV4QixPQUFPLEdBRFFDLEVBQVUsRUFBRyxhQUFhLEVBQVUsTUFBTSxDQUNiLENBQUMsQ0FFakQsTUFBUSxDQUVSLENBQ0EsTUFBTyxFQUNULENBSUEsU0FBUyxHQUFnQyxFQUErQyxDQUV0RixPQURLLEVBQU8sU0FBUyxVQUFVLFFBQVUsR0FBSyxFQUFVLEdBQ2pELE9BQU8sT0FBTyxFQUFPLEtBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFNLElBQWUsR0FBVyxTQUFTLFVBQVUsUUFBVSxHQUFLLENBQUMsQ0FDNUcsQ0FNQSxTQUFnQixHQUFxQixFQUEwQixDQUM3RCxNQUFPLENBQUMsaUJBQWtCLGdCQUFpQixlQUFlLENBQUMsQ0FBQyxLQUFNLEdBQ2hFLEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBUyxDQUFRLENBQUMsQ0FDL0MsQ0FDRixDQUVBLFNBQVMsR0FBaUIsRUFBaUIsRUFBbUMsQ0FDNUUsSUFBTSxFQUFVLEVBQVksUUFTNUIsT0FSSSxHQUFXLE9BQU8sT0FBTyxDQUFPLENBQUMsQ0FBQyxLQUFNLEdBQVcsT0FBTyxHQUFXLFVBQVksRUFBTyxTQUFTLFVBQVUsQ0FBQyxHQUk1RyxHQUFxQixDQUFPLEVBQ3ZCLEdBR0YsR0FBbUIsRUFBUyx1QkFBdUIsQ0FDNUQsQ0FFQSxTQUFTLEdBQWMsRUFBaUIsRUFBbUMsQ0FDekUsSUFBTSxFQUFVLEVBQVksUUFTNUIsT0FSSSxHQUFXLE9BQU8sT0FBTyxDQUFPLENBQUMsQ0FBQyxLQUFNLEdBQVcsT0FBTyxHQUFXLFVBQVksRUFBTyxTQUFTLFNBQVMsQ0FBQyxHQUkzRyxFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVMsZ0JBQWdCLENBQUMsR0FBSyxFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVMsY0FBYyxDQUFDLEVBQ3hHLEdBR0YsR0FBbUIsRUFBUyxXQUFXLENBQ2hELENBRUEsU0FBUyxHQUFtQixFQUFpQixFQUF3QixDQUNuRSxJQUFNLEVBQWdCLEVBQUssUUFBUSxFQUFTLFVBQVcsV0FBVyxFQUNsRSxHQUFJLENBQ0YsT0FBTyxFQUNKLFlBQVksQ0FBYSxDQUFDLENBQzFCLEtBQU0sR0FBYSxhQUFhLEtBQUssQ0FBUSxHQUFLLEdBQW9CLEVBQWUsRUFBVSxDQUFLLENBQUMsQ0FDMUcsTUFBUSxDQUNOLE1BQU8sRUFDVCxDQUNGLENBRUEsU0FBUyxHQUFvQixFQUF1QixFQUFrQixFQUF3QixDQUM1RixHQUFJLENBQ0YsT0FBTyxFQUFNLEtBQUssRUFBRyxhQUFhLEVBQUssS0FBSyxFQUFlLENBQVEsRUFBRyxNQUFNLENBQUMsQ0FDL0UsTUFBUSxDQUNOLE1BQU8sRUFDVCxDQUNGLENBRUEsZUFBZSxHQUFjLEVBQWtELENBQzdFLElBQU0sRUFBZ0MsQ0FBQyxFQUN2QyxJQUFLLElBQU0sSUFBWSxDQUFDLFlBQWEsWUFBWSxFQUFHLENBQ2xELElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBUyxDQUFRLEVBQy9DLEdBQUksQ0FDRixJQUFNLEVBQVdBLEVBQVUsTUFBTUYsRUFBSSxTQUFTLEVBQVUsTUFBTSxDQUFDLEVBQy9ELElBQUssR0FBTSxDQUFDLEVBQU0sS0FBVSxPQUFPLFFBQVEsRUFBUyxPQUFTLENBQUMsQ0FBQyxFQUM3RCxFQUFNLEdBQVEsR0FBb0IsQ0FBSyxDQUUzQyxNQUFRLENBRVIsQ0FDRixDQUNBLE9BQU8sQ0FDVCxDQUVBLFNBQVMsR0FBb0IsRUFBd0IsQ0FLbkQsT0FKSSxPQUFPLEdBQVUsU0FBaUIsRUFFbEMsTUFBTSxRQUFRLENBQUssRUFBVSxFQUFNLE9BQVEsR0FBK0IsT0FBTyxHQUFZLFFBQVEsQ0FBQyxDQUFDLEtBQUs7Q0FBSSxFQUNoSCxHQUFTLE9BQU8sR0FBVSxTQUFpQixHQUFxQixFQUE0QixHQUFHLEVBQzVGLEVBQ1QsQ0FFQSxTQUFTLEVBQVksRUFBaUIsRUFBMEIsQ0FDOUQsT0FBTyxFQUFHLFNBQVMsRUFBUyxDQUFFLElBQUssR0FBTSxJQUFLLEVBQVMsT0FBUSxDQUFXLENBQUMsQ0FBQyxDQUFDLE9BQVMsQ0FDeEYsQ0FFQSxTQUFTLEdBQXNCLEVBQTJCLENBQ3hELE9BQU8sRUFDSixTQUFTLGdCQUFpQixDQUFFLElBQUssR0FBTSxJQUFLLEVBQVMsT0FBUSxDQUFXLENBQUMsQ0FBQyxDQUMxRSxJQUFLLEdBQWEsRUFBSyxRQUFRLENBQVEsQ0FBQyxDQUFDLENBQ3pDLFVBQVUsRUFBRyxJQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxPQUFTLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxRQUFVLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FDdkYsQ0FFQSxTQUFTLEdBQThCLEVBQTBCLENBTS9ELE9BTGMsRUFBRyxTQUFTLGlEQUFrRCxDQUMxRSxJQUFLLEdBQ0wsSUFBSyxFQUNMLE9BQVEsQ0FBQyxHQUFHLEVBQVksa0JBQW1CLGNBQWUsY0FBZSx3QkFBd0IsQ0FDbkcsQ0FDVyxDQUFDLENBQUMsS0FBTSxHQUFTLENBQzFCLElBQU0sRUFBVSxFQUFHLGFBQWEsRUFBSyxRQUFRLEVBQVMsQ0FBSSxFQUFHLE1BQU0sRUFDbkUsTUFBTyxnSEFBZ0gsS0FDckgsQ0FDRixDQUNGLENBQUMsQ0FDSCxDQUVBLGVBQWUsR0FBYyxFQUFpQixFQUF3RSxDQUdwSCxJQUFNLEdBQVMsTUFGSCxHQUFVLENBQ0UsQ0FBQyxDQUFDLFdBQVcsRUFBSSxFQUFBLENBQ2xCLEtBQU0sR0FBTSxFQUFFLE9BQVMsUUFBUSxFQUNoRCxFQUFZLEdBQVEsS0FBSyxPQUFTLEdBQVEsS0FBSyxLQUNyRCxHQUFJLE9BQU8sR0FBYyxTQUFVLENBQ2pDLElBQU0sRUFBTyxNQUFNLEdBQWdCLENBQVMsRUFDNUMsR0FBSSxFQUFNLE9BQU8sQ0FDbkIsQ0FFQSxJQUFNLEVBQU0sT0FBTyxFQUFZLFlBQWUsU0FBVyxFQUFZLFdBQWEsRUFBWSxZQUFZLElBQzFHLEdBQUksRUFBSyxDQUNQLElBQU0sRUFBTyxNQUFNLEdBQWdCLENBQUcsRUFDdEMsR0FBSSxHQUFRLEVBQUssVUFBWSxZQUFhLE9BQU8sQ0FDbkQsQ0FDRixDQUVBLGVBQWUsR0FBZ0IsRUFBcUUsQ0FDbEcsR0FBTSxDQUFDLEVBQUssR0FBUSxFQUFXLGNBQWMsQ0FBYSxFQUN0RCxNQUFDLEdBQU8sQ0FBQyxHQUViLEdBQUksQ0FNRixPQUFPLE1BSmdCLEdBQVcsQ0FBQyxDQUFDLFFBQVEsNEJBQTZCLENBQ3ZFLE1BQU8sRUFDUCxLQUFNLENBQ1IsQ0FBQyxFQUFBLENBQ2UsSUFDbEIsT0FBUyxFQUFPLENBQ2QsSUFBTSxFQUFxQixHQUEwQixDQUFLLEVBQzFELEdBQUksRUFDRixNQUFPLENBQUUsVUFBVyxDQUFtQixDQUUzQyxDQUNGLENBRUEsU0FBUyxHQUEwQixFQUFvQyxDQUNyRSxHQUFJLENBQUMsR0FBUyxPQUFPLEdBQVUsU0FBVSxPQUV6QyxJQUFNLEVBQ0osYUFBYyxFQUNULEVBQTJGLFNBQzVGLElBQUEsR0FDQSxFQUFTLEdBQVUsUUFBVyxFQUE4QixPQUNsRSxHQUFJLElBQVcsS0FBTyxJQUFXLElBQUssT0FFdEMsSUFBTSxFQUFXLEdBQVUsU0FBUyxTQUNwQyxHQUFJLE9BQU8sR0FBYSxTQUFVLE9BRWxDLEdBQU0sQ0FBQyxFQUFLLEdBQVEsRUFBVyxjQUFjLENBQVEsRUFDakQsTUFBQyxHQUFPLENBQUMsR0FFYixNQUFPLEdBQUcsRUFBSSxHQUFHLEdBQ25CLENDcmpCQSxNQUFNLEdBQWUsQ0FBQyxVQUFXLFFBQVMsUUFBUyxZQUFhLG1CQUFvQixRQUFTLE1BQU8sTUFBTSxFQTZCMUcsZUFBc0IsR0FBa0IsRUFBdUIsRUFBMEMsQ0FDdkcsT0FBTyxFQUFPLDBCQUEwQixvQkFBcUIsU0FBWSxDQUN2RSxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxZQUFZLEVBQ3BELEVBQVcsTUFBTSxFQUFPLHNCQUFzQixDQUFRLEdBQU0sR0FDOUQsRUFBa0IsRUFBZSxtQkFBbUIsQ0FBTyxFQUFJRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUM3RCxFQUFrQixFQUFlLG1CQUFtQixDQUFPLEVBRTNELEVBQVEsQ0FBQyxHQUFHLEVBQVksRUFDMUIsRUFBTyxvQkFDVCxFQUFNLEtBQUssTUFBTSxFQUVmLEVBQU8sbUJBQ1QsRUFBTSxLQUFLLElBQUksRUFDZixHQUFtQixHQUFHLEVBQUssU0FBUyxFQUFPLE9BQU8sRUFBRTtHQUdsRCxFQUFPLHdCQUNULEVBQU0sS0FBSyxNQUFNLEVBRWYsRUFBTyxvQkFDVCxFQUFNLEtBQUssT0FBTyxFQUNsQixHQUFtQjtHQUdqQixFQUFPLHlCQUNULEVBQU0sS0FBSyxVQUFXLGdCQUFpQixNQUFNLEVBQzdDLEdBQW1COzs7O0dBTWpCLEVBQU8sMEJBQ1QsR0FBbUI7O0lBS2pCLEVBQU8sdUJBQXlCLEVBQU8scUJBQ3pDLEVBQU0sS0FBSyxRQUFRLEVBQ25CLEdBQW1CO0dBSWpCLEVBQU8sVUFBVSxRQUNuQixHQUFtQjs7R0FJakIsRUFBTyxVQUFVLE1BQ25CLEVBQU0sS0FBSyxRQUFRLEdBRWpCLEVBQVcsVUFBVSxVQUFZLEVBQU8sVUFBVSxXQUNwRCxFQUFNLEtBQUssVUFBVSxHQUVuQixFQUFPLFVBQVUsUUFBVSxFQUFPLFVBQVUsV0FDOUMsR0FBbUI7R0FHakIsRUFBTyxVQUFVLGlCQUNuQixHQUFtQjs7SUFJakIsRUFBVyxVQUFVLGFBQWUsRUFBTyxVQUFVLGVBQ3ZELEVBQU0sS0FBSyxhQUFhLEVBQ3hCLEdBQW1COztHQUlqQixFQUFPLFVBQVUsV0FDbkIsRUFBTSxLQUFLLGFBQWEsRUFFdEIsRUFBTyxVQUFVLE9BQ25CLEVBQU0sS0FBSyxNQUFNLEVBRWYsRUFBTyx5QkFHVCxHQUFtQjs7R0FJakIsRUFBTyxVQUFVLGFBQ25CLEdBQW1CO0lBR2pCLEVBQU8sY0FBZ0IsRUFBVyxnQkFHcEMsR0FBbUI7O0dBT2pCLEdBQXFCLENBQU0sSUFDN0IsR0FBbUI7SUFHakIsRUFBVyxVQUFVLFFBQVUsRUFBTyxVQUFVLFVBQ2xELEdBQW1CO0dBSXJCLElBQUksRUFBWSxHQUNoQixJQUFLLElBQU0sS0FBUSxFQUFPLENBQ3hCLElBQUksRUFBVyxNQUFNLEdBQVUsQ0FBSSxHQUFNLEdBQ3pDLEdBQUksQ0FBQyxFQUFTLENBQ1osSUFBTSxFQUFNLG1EQUFtRCxJQUN6RCxFQUFXLE1BQU0sTUFBTSxDQUFHLEVBQzFCLEVBQWUsTUFBTSxFQUFTLEtBQUssRUFDekMsR0FBSSxDQUFDLEVBQVMsSUFBTSxFQUFhLFNBQVMscUJBQXFCLEdBQUssRUFBYSxTQUFTLFNBQVMsRUFBRyxDQUNwRyxRQUFRLE1BQU0sbUJBQW1CLEdBQUssRUFDdEMsTUFDRixDQUNBLEVBQVUsRUFBYSxLQUFLLEVBQzVCLE1BQU0sRUFBWSxRQUFVLEdBQVcsRUFBTSxDQUFPLENBQUMsRUFDakQsRUFBUSxXQUNWLFFBQVEsS0FBSyxXQUFXLEdBQUssQ0FFakMsQ0FDSSxJQUFXLEdBQWE7R0FDNUIsR0FBYSxFQUFVO0NBQ3pCLENBQ00sTUFBTSxFQUFlLDBCQUEwQixDQUFRLElBQzNELEVBQVksRUFBVSxRQUFRLGVBQWdCLGdCQUFnQixDQUFDLENBQUMsUUFBUSxXQUFZLFFBQVEsSUFFMUYsRUFBTyxtQkFBcUIsRUFBTywwQkFDckMsRUFBWSxFQUNULFdBQVcseUJBQTBCLGlCQUFpQixDQUFDLENBQ3ZELFdBQVcsNEJBQTZCLG9CQUFvQixDQUFDLENBQzdELFdBQVcsbUNBQW9DLDJCQUEyQixDQUFDLENBQzNFLFdBQVcsMkJBQTRCLG1CQUFtQixDQUFDLENBQzNELFdBQVcscUJBQXNCLGFBQWEsQ0FBQyxDQUMvQyxXQUFXLHVCQUF3QixlQUFlLENBQUMsQ0FDbkQsV0FBVyxjQUFlLE9BQU8sQ0FBQyxDQUNsQyxXQUFXLGNBQWUsT0FBTyxFQUNoQyxFQUFPLHlCQUNULEVBQVksRUFBVSxXQUFXLHlCQUEwQixxQkFBcUIsSUFHcEYsRUFBWSxFQUFVLFdBQVcsZUFBZ0IsU0FBUyxFQUN0RCxFQUFPLFVBQVUsUUFHbkIsRUFBWSxFQUFVLFdBQVcsY0FBZSxVQUFVLElBRXhELEVBQU8sd0JBQTBCLEVBQU8sb0NBTzFDLEVBQVksRUFBVSxXQUFXLGtCQUFtQixjQUFjLElBRWhFLEVBQVcsVUFBVSxhQUFlLEVBQU8sVUFBVSxhQUFlLEVBQU8sMEJBQzdFLEVBQVksRUFBVSxXQUFXLGtCQUFtQjtXQUFnQixHQUV0RSxJQUFNLEVBQWEsRUFBa0I7RUFBTyxFQUFZLEVBQ3hELE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVLENBQVUsQ0FBQyxDQUN2RSxDQUFDLENBQ0gsQ0FFQSxNQUFNLEdBQVUsRUFBSyxLQUFLLEVBQUcsUUFBUSxFQUFHLFNBQVUsT0FBUSxXQUFXLEVBRXJFLGVBQWUsR0FBVyxFQUFjLEVBQWdDLENBQ3RFLE1BQU0sRUFBRyxTQUFTLE1BQU0sR0FBUyxDQUFFLFVBQVcsRUFBSyxDQUFDLEVBQ3BELE1BQU0sRUFBRyxTQUFTLFVBQVUsRUFBSyxLQUFLLEdBQVMsQ0FBSSxFQUFHLENBQU8sQ0FDL0QsQ0FFQSxlQUFlLEdBQVUsRUFBMkMsQ0FDbEUsR0FBSSxDQUNGLElBQU0sRUFBTyxNQUFNLEVBQUcsU0FBUyxLQUFLLEVBQUssS0FBSyxHQUFTLENBQUksQ0FBQyxFQUk1RCxPQUhJLEtBQUssSUFBSSxFQUFJLEVBQUssUUFBVSxJQUFTLEdBQUssSUFDNUMsT0FFSyxNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQUssS0FBSyxHQUFTLENBQUksRUFBRyxNQUFNLENBQ3BFLE1BQVEsQ0FFUixDQUNGLENDak5BLGVBQXNCLEdBQXFCLEVBQXNDLENBQy9FLE9BQU8sRUFBTywwQkFBMEIsdUJBQXdCLFNBQVksQ0FDMUUsSUFBTSxFQUFVLEVBQUssUUFBUSxFQUFPLFFBQVMsT0FBTyxFQUNwRCxHQUFJLEVBQUcsV0FBVyxDQUFPLEVBQUcsQ0FDMUIsSUFBTSxFQUFXLEVBQUssUUFBUSxFQUFTLGtCQUFrQixFQUN6RCxNQUFPLEVBQWtCLENBQU0sR0FBSyxFQUFnQixDQUFNLEVBQ3RELEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxHQUF1QixDQUFNLENBQUMsQ0FBQyxFQUNuRixFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsRUFBVSxDQUFFLE1BQU8sRUFBSyxDQUFDLENBQUMsRUFDckUsQ0FDRixDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQXVCLEVBQStCLENBb0I3RCxNQUFPOzs7TUFuQmEsQ0FDbEIsQ0FDRSxLQUFNLDJEQUNOLFVBQVcsRUFBa0IsQ0FBTSxFQUNuQyxXQUFZLEVBQVcsTUFDdkIsS0FBTSxRQUNOLFFBQVMsMENBQ1gsRUFDQSxDQUNFLEtBQU0sa0JBQ04sVUFBVyxFQUFnQixDQUFNLEVBQ2pDLFdBQVksRUFBVyxhQUN2QixLQUFNLFdBQ04sUUFBUyw2Q0FDWCxDQUNGLENBQUMsQ0FDRSxPQUFRLEdBQVMsRUFBSyxTQUFTLENBQUMsQ0FDaEMsUUFBUyxHQUFTLEVBQUssV0FBVyxJQUFLLEdBQVEsR0FBa0IsRUFBSyxRQUFTLEVBQUssS0FBTSxFQUFLLEtBQU0sQ0FBRyxDQUFDLENBSzlGLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTs7O0NBSTNCLENBRUEsU0FBUyxHQUFrQixFQUFnQixFQUFjLEVBQWMsRUFBMkIsQ0FDaEcsTUFBTzt3Q0FDK0IsRUFBSzs7Ozs0Q0FJRCxFQUFVOzttQ0FFbkIsRUFBSyxLQUFLLEVBQVU7Ozs7OztzQ0FNakIsRUFBTzs7Ozs7OztDQVE3QyxDQzFFQSxTQUFnQixHQUNkLEVBQ0EsRUFDb0IsQ0FDaEIsTUFBQyxFQUFPLFVBQVUsV0FBYSxDQUFDLElBQVUsZ0JBQzlDLE1BQU8sR0FBRyxFQUFPLE1BQVEsTUFBUSxPQUFPLDZCQUMxQyxDQ1JBLFNBQWdCLEdBQW9CLEVBQXNCLEVBQStCLENBQ3ZGLEdBQUksQ0FHRixJQUFNLEVBRFMsRUFBeUIsTUFBTyxDQUFDLFlBQWEsa0JBRDNCLEVBQWEsR0FBRyxFQUFLLE1BQ2UsTUFBTSxFQUFHLFFBQVEsSUFBSSxDQUNuRSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxHQUN2QyxHQUFJLENBQUMsRUFDSCxNQUFVLE1BQU0sd0JBQXdCLEVBQWEsR0FBRyxHQUFNLEVBRWhFLE9BQU8sUUFBUSxRQUFRLENBQVUsQ0FDbkMsT0FBUyxFQUFPLENBQ2QsT0FBTyxRQUFRLE9BQVcsTUFBTSwrQkFBK0IsRUFBYSxHQUFHLEVBQUssSUFBSSxPQUFPLENBQUssR0FBRyxDQUFDLENBQzFHLENBQ0YsQ0NaQSxNQUFhLEdBQWtDLENBQzdDLGdCQUNBLHFCQUNBLG9CQUNBLHdCQUNGLEVBRUEsU0FBZ0IsR0FBbUIsRUFBMEMsQ0FPM0UsT0FOSSxFQUFPLE1BQ0YsOEJBRUwsRUFBTyxVQUFVLFlBQ1osdUNBRUYsQ0FBQyxtQ0FBb0MsaUNBQWlDLENBQy9FLENBRUEsU0FBZ0IsR0FBNEIsRUFBaUMsQ0FVM0UsT0FUSSxFQUFPLFVBQVUsT0FBUyxFQUFPLFVBQVUsS0FDdEMsQ0FBQyxFQUVOLEVBQU8sTUFDRixDQUFDLGVBQWUsRUFFckIsRUFBTyxVQUFVLFlBQ1osQ0FBQyx3QkFBd0IsRUFFM0IsQ0FBQyxxQkFBc0IsbUJBQW1CLENBQ25ELENDNUJBLFNBQWdCLEdBQXFDLEVBQWdDLENBQ25GLE9BQ0UsRUFBTyxzQkFDUCxDQUFDLEVBQU8sUUFDUixFQUFPLGFBQWEsVUFBWSxJQUNoQyxNQUFNLFFBQVEsRUFBTyxhQUFhLEtBQUssR0FDdkMsRUFBTyxZQUFZLE1BQU0sT0FBUyxDQUV0QyxDQ3FCQSxNQUFhLEdBQTZCLENBRXhDLGNBQ0EsaUJBQ0Esb0JBQ0EsZ0JBQ0EsV0FDQSxjQUNBLG1CQUlBLE9BQ0EsVUFDQSxXQUVBLGFBQ0EsZ0JBQ0EsV0FDQSxZQUNBLHFCQUNBLFFBQ0EsU0FDQSxrQkFDQSxRQUNBLFdBQ0YsRUFFQSxlQUFzQixHQUFrQixFQUFzQyxDQUM1RSxPQUFPLEVBQU8sMEJBQTBCLG9CQUFxQixTQUFZLENBQ3ZFLElBQU0sRUFBZ0IsRUFBSyxRQUFRLEVBQU8sUUFBUyxhQUFhLEVBQ2hFLEdBQUksRUFBTyxNQUFPLENBQ2hCLE1BQU0sRUFBWSxRQUFVLEVBQUcsU0FBUyxHQUFHLEVBQWUsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLEVBQzFFLE1BQU0sRUFBWSxRQUNoQixFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLE9BQU8sRUFBRyxDQUFFLE1BQU8sR0FBTSxVQUFXLEVBQUssQ0FBQyxDQUN4RixFQUNBLE1BQU0sRUFBWSxRQUNoQixFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLFdBQVcsRUFBRyxDQUFFLE1BQU8sR0FBTSxVQUFXLEVBQUssQ0FBQyxDQUM1RixFQUNBLE1BQ0YsQ0FFQSxJQUFNLEVBQWlCLEVBQXlCLE9BQVEsQ0FBQyxXQUFXLEVBQUcsRUFBTyxPQUFPLEVBQy9FLEVBQWdCLEdBQWlCLGVBQWdCLEVBQU8sT0FBTyxFQUNqRSxHQUFlLEVBQWUsQ0FBYyxHQUM5QyxFQUFVLE9BQVEsQ0FBQyxNQUFPLFVBQVcsQ0FBYSxFQUFHLEVBQU8sUUFBUyxDQUFDLEVBR3hFLElBQU0sRUFBZSxFQUFLLEtBQUssRUFBTyxRQUFTLFFBQVMsVUFBVSxFQUNsRSxNQUFNLEVBQUcsU0FBUyxNQUFNLEVBQWMsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUN6RCxJQUFLLElBQU0sS0FBUSxNQUFNLEVBQUcsU0FBUyxRQUFRLENBQVksRUFDbkQsRUFBSyxXQUFXLE9BQU8sR0FBSyxDQUFDLEVBQUssV0FBVyxRQUFRLEVBQWMsRUFBRSxHQUN2RSxNQUFNLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFLLEtBQUssRUFBYyxDQUFJLENBQUMsQ0FBQyxFQUs3RSxJQUFNLEVBQWEsRUFBSyxRQUFRLEVBQU8sUUFBUyxTQUFTLEVBQ3pELE1BQU0sRUFBWSxRQUFVLEVBQUcsU0FBUyxHQUFHLEVBQVksQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLEVBRXZFLElBQUksRUFBVyxDQUFDLEVBQ2hCLEdBQUksQ0FDRixFQUFZLEVBQUssS0FBSyxNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQWUsTUFBTSxDQUFDLEdBQThCLENBQ3ZHLE1BQVEsQ0FFUixDQUNBLEVBQVMseUJBQTJCLEdBR3BDLEVBQVMsY0FBZ0IsR0FDekIsRUFBUyxXQUFhLGVBQ3RCLEVBQVMsT0FBUyxtQkFDbEIsRUFBUyxrQkFBQSxLQUNULEVBQVMsd0JBQTBCLENBRWpDLHVDQUNBLHlDQUNBLDBDQUNBLDJDQUNGLEVBQ0EsRUFBUyx1QkFBeUIsR0FDbEMsT0FBTyxFQUFTLGlCQUNaLEVBQVMsd0JBQXdCLFNBQVcsR0FDOUMsT0FBTyxFQUFTLHVCQUdsQixFQUFTLGtCQUFvQixHQUM3QixJQUFNLEVBQWlCLEVBQVMsU0FBUyxRQUFVLEVBRW5ELEdBREEsRUFBUyxRQUFVLEVBQVMsU0FBUyxPQUFRLEdBQU0sRUFBRSxPQUFTLDZCQUE2QixHQUFLLENBQUMsRUFDN0YsRUFBUyxRQUFRLFNBQVcsRUFBZ0IsQ0FDOUMsSUFBTSxFQUFhLEVBQUssUUFBUSxFQUFPLFFBQVMsUUFBUyxVQUFXLGVBQWUsRUFDbkYsTUFBTSxFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsRUFBWSxDQUFFLE1BQU8sRUFBSyxDQUFDLENBQUMsQ0FDekUsQ0FDSSxFQUFTLFFBQVEsU0FBVyxHQUM5QixPQUFPLEVBQVMsUUFFbEIsTUFBTSxFQUFHLFNBQVMsVUFBVSxFQUFlLEVBQUssS0FBSyxFQUFVLENBQUUsVUFBVyxFQUFHLENBQUMsQ0FBQyxFQUVqRixFQUFVLE9BQVEsQ0FBQyxNQUFPLDBCQUEwQixFQUFHLEVBQU8sT0FBTyxFQUVyRSxFQUFVLE9BQVEsR0FBc0IsRUFBTyxRQUFTLENBQWEsRUFBRyxFQUFPLE9BQU8sQ0FDeEYsQ0FBQyxDQUNILENBRUEsU0FBZ0IsR0FBc0IsRUFBaUIsRUFBaUMsQ0FDdEYsTUFBTyxDQUFDLE1BQU8sV0FBWSxjQUFlLFVBQVcsRUFBSyxTQUFTLEVBQVMsQ0FBYSxDQUFDLENBQzVGLENBRUEsU0FBZ0IsR0FBaUIsRUFBcUIsRUFBeUIsQ0FDN0UsT0FBTyxFQUF5QixNQUFPLENBQUMsT0FBUSxFQUFhLFNBQVMsRUFBRyxDQUFPLEdBQUssT0FDdkYsQ0FFQSxTQUFTLEdBQWUsRUFBb0IsRUFBNkIsQ0FDdkUsSUFBTSxFQUFrQixFQUFPLE1BQU0sQ0FBVSxFQUcvQyxPQUZLLEVBRUUsRUFBTyxHQUFHLEVBQWlCLEVBQU8sTUFBTSxDQUFVLEdBQUssT0FBTyxFQUZ4QyxFQUcvQixDQzdHQSxNQUFNLEdBQWEsQ0FBQyw0QkFBNkIsNkJBQThCLFFBQVMsU0FBVSxpQkFBaUIsRUFDN0csR0FBdUIsYUFPdkIsR0FBeUIsNkJBQ3pCLEVBQWUsa0JBQ2YsRUFBb0IsV0FDcEIsR0FBcUIsV0FFckIsR0FBeUIsSUFBSSxJQUFJLENBQ3JDLEVBQ0EsRUFDQSxHQUNBLEdBQ0EsR0FDQSxvQkFDQSxHQUFHLEVBQ0wsQ0FBQyxFQUNLLEdBQXdDLENBQzVDLCtCQUNBLEdBQUcsR0FBVyxPQUFRLEdBQWUsRUFBVyxXQUFXLGVBQWUsQ0FBQyxDQUM3RSxFQUNNLEdBQTJCLHM4QkF3Q2pDLEVBQ00sR0FBeUIsSUFBSSxJQUFJLENBQUMsYUFBYyxtQkFBbUIsQ0FBQyxFQUNwRSxHQUNKLDBHQUVJLEdBQStCLElBQUksSUFDbkMsR0FBdUIsSUFBSSxJQUMzQkMsR0FBd0IsQ0FBQyxlQUFnQixrQkFBbUIsdUJBQXdCLGtCQUFrQixFQWE1RyxlQUFzQixHQUNwQixFQUNBLEVBQ0EsRUFDZSxDQUNmLE9BQU8sRUFBTywwQkFBMEIsc0JBQXVCLFNBQVksQ0FDekUsTUFBTUMsR0FBSyxFQUFRLEVBQVksQ0FBYyxDQUMvQyxDQUFDLENBQ0gsQ0FFQSxlQUFlQSxHQUFLLEVBQXVCLEVBQTJCLEVBQXdDLENBQzVHLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLGNBQWMsRUFDdEQsRUFBVSxNQUFNLEdBQWdCLENBQVEsRUFDeEMsRUFBaUIsRUFBTyxNQUFRLE1BQVEsT0FFOUMsTUFBTSxHQUFzQixFQUFRLENBQU8sRUFDM0MsTUFBTSxHQUFjLEVBQVEsQ0FBTyxFQUNuQyxHQUE2QyxDQUFPLEVBQ3BELElBQU0sRUFBb0IsTUFBTSxHQUE0QixFQUFRLEVBQVksQ0FBTyxFQUN2RixNQUFNLEdBQXlCLEVBQVEsRUFBWSxFQUFTLENBQWlCLEVBQzdFLEdBQW1DLEVBQVEsRUFBUyxFQUFtQixDQUFjLEVBQ3JGLE1BQU0sR0FBc0IsQ0FBTyxFQUNuQyxHQUE4QixDQUFPLEVBRWpDLEVBQU8sT0FBTyxPQUFPLEVBQVEsZUFNakMsTUFBTSxFQUFPLGFBQWEsRUFBVSxHQUFxQixDQUFPLENBQUMsRUFFNUQsSUFDSCxHQUF5QixFQUFRLEVBQVMsRUFBbUIsQ0FBYyxFQUMzRSxHQUFzQyxFQUFRLEVBQWdCLENBQVEsRUFFMUUsQ0FFQSxTQUFTLEdBQXFCLEVBQXNDLENBR2xFLE9BQU8sS0FBSyxVQUFVLEdBQWdCLENBQU8sRUFBRyxJQUFBLEdBQVcsQ0FBQyxDQUM5RCxDQUVBLGVBQWUsR0FBZ0IsRUFBZ0QsQ0FDN0UsSUFBTSxFQUFXLE1BQU0sRUFBRyxTQUFTLFNBQVMsRUFBVSxNQUFNLEVBQ3RELEVBQVUsS0FBSyxNQUFNLENBQVEsRUFLbkMsTUFKQSxHQUFRLFFBQVUsRUFBUSxTQUFXLENBQUMsRUFDdEMsRUFBUSxhQUFlLEVBQVEsY0FBZ0IsQ0FBQyxFQUNoRCxFQUFRLGdCQUFrQixFQUFRLGlCQUFtQixDQUFDLEVBQ3RELEVBQVEsaUJBQW1CLEVBQVEsa0JBQW9CLENBQUMsRUFDakQsQ0FDVCxDQUVBLGVBQWUsR0FBYyxFQUF1QixFQUE2QyxDQUMvRixHQUE0QixFQUFRLE9BQU8sRUFFM0MsRUFBUSxRQUFVLENBQUUsR0FBRyxFQUFRLFFBQVMsR0FBRyxHQUFnQixFQUFRLEVBQVEsT0FBTyxDQUFFLEVBQ3BGLE9BQU8sRUFBUSxRQUFRLHFCQUV2QixJQUFNLEVBQVUsRUFBUSxRQUNwQixFQUFPLE9BQVMsQ0FBQyxFQUFnQixDQUFNLEVBQ3pDLE9BQU8sRUFBUSxTQUVmLEVBQVEsVUFBWSxFQUFRLFVBQVksSUFBTyxNQUFNLEdBQXVCLEVBQU8sT0FBTyxFQUU1RixHQUFxQyxDQUFPLEVBQzVDLEdBQTBCLEVBQVEsQ0FBTyxDQUMzQyxDQUVBLFNBQVMsR0FBNEIsRUFBb0MsQ0FDdkUsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLE9BQU8sUUFBUSxDQUFPLEVBQzNDLE9BQU8sR0FBVSxXQUVoQixFQUFNLFNBQVMsV0FBVyxJQUM3QixFQUFRLEdBQU8sRUFBTSxXQUFXLGdDQUFpQyxFQUFFLEdBR3pFLENBRUEsU0FBUyxHQUF3QixFQUE4QixFQUF5QyxDQUN0RyxHQUFJLEVBQVEsWUFBYSxDQU12QixJQUFNLEVBQXNCLEVBQVEsWUFBYyxHQUFxQixFQUFRLFdBQVcsRUFBSSxDQUFDLEVBYS9GLEVBQVEsWUFBYyxDQUFDLGNBQWUsR0FYcEMsRUFBcUIsRUFBUSxZQUFhLE1BQWUsRUFBSSxHQUs3RCxFQUFvQixLQUFNLEdBQVksR0FBZ0MsRUFBUyxDQUFPLENBQUMsR0FDdEYsR0FBOEIsRUFBUSxhQUFlLEVBQUUsR0FDdEQsRUFBb0IsS0FBTSxHQUFZLENBQUMsQ0FBQyxFQUE2QixDQUFPLENBQUMsRUFFN0UsRUFBb0IsT0FBUSxHQUFZLElBQVksSUFBTSxDQUFDLEdBQXdCLEVBQVMsQ0FBTyxDQUFDLEVBQ3BHLENBQUMsQ0FDcUQsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUN6RSxNQUFXLEVBQVEsYUFBYSxTQUFTLGFBQWEsR0FDcEQsT0FBTyxFQUFRLFlBT2pCLEdBTEksQ0FBQyxHQUtELEdBQWdDLENBQU8sRUFBRyxPQU05QyxJQUFNLEVBQWlCLEVBQVEsWUFDL0IsRUFBUSxZQUNOLElBQ0MsRUFBcUIsRUFBZ0IsTUFBZSxFQUFJLEdBQUssR0FBOEIsQ0FBYyxHQUN0RyxHQUFHLEVBQWMsTUFBTSxJQUN2QixHQUFvQixHQUFrQixHQUFJLENBQWEsQ0FBQyxDQUFDLFFBQVEsU0FBVSxFQUFFLENBQ3JGLENBYUEsU0FBUyxHQUE0QixFQUF1QixFQUFrRCxDQUM1RyxHQUFJLENBQUMsR0FBcUIsQ0FBTSxFQUFHLE9BR25DLEdBQU0sQ0FBRSxXQUFZLEdBQW9DLENBQU8sRUFDL0QsT0FBTyxHQUFXLEdBQUcsRUFBTyxNQUFRLFFBQVUsR0FBRyxlQUNuRCxDQU9BLFNBQVMsR0FBb0IsRUFBZ0IsRUFBMkMsQ0FFdEYsT0FESyxFQUNFLEdBQUcsRUFBTyxNQUFNLElBREksQ0FFN0IsQ0FFQSxTQUFTLEdBQXFDLEVBQW9DLENBRWhGLElBQUssR0FBTSxDQUFDLEVBQUssS0FBVSxPQUFPLFFBQVEsQ0FBTyxFQUMxQyxHQUFPLFNBQVMseUJBQXlCLElBQzlDLEVBQVEsR0FBTyxFQUFNLFdBQ25CLG1IQUNBLCtCQUNGLEVBRUosQ0FFQSxTQUFTLEdBQTBCLEVBQXVCLEVBQW9DLENBQ3hGLEVBQU8sT0FBUyxDQUFDLEVBQVEsU0FBUyxTQUFTLGNBQWMsSUFFN0QsRUFBUSxRQUFVLGlEQUNwQixDQUVBLGVBQWUsR0FDYixFQUNBLEVBQ0EsRUFDNEIsQ0FDNUIsSUFBTSxFQUF5QixDQUFDLEVBQzFCLEVBQWtCLENBQUMsbUJBQW1CLEVBQ3RDLEVBQWtDLENBQUMsRUFDbkMsRUFBVSxFQUFnQixDQUFNLEVBR3BDLEdBQ0EsQ0FBQyxFQUFHLFdBQVcsRUFBSyxLQUFLLEVBQVcsUUFBUyxrQkFBa0IsQ0FBQyxHQUNoRSxDQUFDLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBTyxRQUFTLGtCQUFrQixDQUFDLElBRTVELEVBQVEsU0FBVywrQkFDbkIsRUFBZ0IsS0FBSyx1QkFBd0IsOEJBQThCLEdBRXpFLEVBQ0YsRUFBZ0IsS0FBSyxVQUFVLEVBRS9CLEdBQXdCLENBQU8sRUFHakMsT0FBTyxFQUFRLGdCQUFnQixlQUMvQixPQUFRLEVBQXNELGVBRTFELEVBQU8sU0FDVCxPQUFPLEVBQVEsZ0JBQWdCLE1BQy9CLE9BQU8sRUFBUSxRQUFRLFlBQ3ZCLE9BQU8sRUFBUSxRQUFRLGVBQ3ZCLE9BQU8sRUFBUSxRQUFRLFFBQ3ZCLE9BQU8sRUFBUSxRQUFRLFNBQ3ZCLEVBQVEsUUFBUSxRQUFVLDJCQUMxQixFQUFnQixLQUFLLEVBQWtCLEVBRW5DLEVBQU8sVUFBVSxrQkFDZixHQUF3QyxFQUFRLFFBQVEsT0FBTyxFQUNqRSxPQUFPLEVBQVEsZ0JBQWdCLG9CQUUvQixDQUFDLEVBQVEsZ0JBQWdCLHFCQUN6QixDQUFDLEVBQVEsZ0JBQWdCLDJCQUN6QixDQUFDLEVBQVEsZ0JBQWdCLGlDQUV6QixFQUFnQixLQUFLLGtCQUFrQixFQUV6QyxFQUFRLFFBQVUsK0JBR2hCLEVBQU8sVUFBVSxpQkFJZixFQUZpQixFQUFRLGFBQWEsV0FBYSxFQUFRLGdCQUFnQixZQUUxRCxDQUFDLEVBQVEsYUFBYSxxQkFDekMsRUFBZ0IsS0FBSyxrQkFBa0IsRUFFckMsRUFBTyxVQUFVLG1CQUVuQixFQUFRLGFBQWEsYUFDbkIsRUFBUSxnQkFBZ0IsWUFDeEIsRUFBUSxhQUFhLHFCQUNyQixFQUFRLGdCQUFnQixvQkFDMUIsRUFBYSxLQUFLLFlBQVksRUFDOUIsT0FBTyxFQUFRLGdCQUFnQixhQUUvQixPQUFPLEVBQVEsYUFBYSxXQUM1QixPQUFPLEVBQVEsZ0JBQWdCLGFBSS9CLEVBQU8sMkJBRVQsRUFBUSxXQUFhLE1BQU0sUUFBUSxFQUFRLFVBQVUsRUFDakQsRUFBTSxJQUFJLENBQUMsRUFBUSxXQUFZLENBQUMsWUFBWSxDQUFDLEVBQUcsQ0FDOUMsV0FBWSxFQUNkLENBQUMsRUFDRCxDQUFDLFlBQVksRUFDUixNQUFNLFFBQVEsRUFBUSxVQUFVLElBQ3pDLEVBQVEsV0FBYSxFQUFRLFdBQVcsT0FDckMsR0FDQyxFQUFHLFNBQVMsRUFBVyxDQUNyQixJQUFLLEdBQ0wsSUFBSyxFQUFPLFFBQ1osT0FBUSxDQUNWLENBQUMsQ0FBQyxDQUFDLE9BQVMsQ0FDaEIsRUFDSSxFQUFRLFdBQVcsU0FBVyxHQUNoQyxPQUFPLEVBQVEsYUFRakIsRUFBTyxVQUFVLE1BQ25CLEVBQWdCLEtBQUssNkJBQTZCLEVBRy9DLEdBQVksQ0FBTyxJQUNsQixHQUFnQyxDQUFPLEVBQ3pDLEVBQWEsS0FBSyxDQUFZLEVBRTlCLEVBQWdCLEtBQUssQ0FBWSxJQU9uQyxFQUFRLGFBQWEsSUFDckIsRUFBUSxnQkFBZ0IsSUFDeEIsT0FBTyxPQUFPLEVBQVEsT0FBTyxDQUFDLENBQUMsS0FBTSxHQUFXLEdBQVEsU0FBUyxDQUFpQixDQUFDLEtBRS9FLEdBQXFDLENBQU8sRUFDOUMsRUFBYSxLQUFLLENBQWlCLEVBRW5DLEVBQWdCLEtBQUssQ0FBaUIsR0FHdEMsRUFBa0IsQ0FBTSxHQUMxQixFQUFnQixLQUFLLEdBQUcsRUFBVSxFQUdwQyxJQUFNLEVBQTJCLEVBQWtCLENBQU0sRUFBSSxHQUE0QixDQUFNLEVBQUksQ0FBQyxFQXVDcEcsT0F0Q0EsTUFBTSxHQUFxQyxFQUFRLEVBQVMsQ0FBd0IsRUFDcEYsRUFBZ0IsS0FBSyxHQUFHLENBQXdCLEdBRTVDLEVBQU8sdUJBQXlCLEVBQU8sbUNBR3pDLEVBQWdCLEtBQUssRUFBb0IsR0FJckMsRUFBTyxVQUFVLE1BQVEsRUFBTyxVQUFVLE9BQVMsRUFBTyxVQUFVLFNBQ3RFLEVBQWdCLEtBQUssRUFBc0IsRUFFekMsRUFBTyxNQUNULEVBQWdCLEtBQUssWUFBWSxFQUN2QixFQUFPLFVBQVUsYUFDM0IsRUFBZ0IsS0FBSyxhQUFhLEdBR2xDLEVBQVEsYUFBYSxNQUNyQixFQUFRLGdCQUFnQixNQUN4QixFQUFRLGFBQWEsa0JBQ3JCLEVBQVEsZ0JBQWdCLGtCQUN4QixFQUFRLGFBQWEsWUFDckIsRUFBUSxnQkFBZ0IsYUFFeEIsRUFBZ0IsS0FBSyxhQUFhLEdBSWxDLEVBQU8scUJBQ0YsQ0FDTCxhQUFjLEVBQWEsT0FBUSxHQUFRLENBQUMsRUFBSSxTQUFTLGVBQWUsQ0FBQyxFQUN6RSxnQkFBaUIsRUFBZ0IsT0FBUSxHQUFRLENBQUMsRUFBSSxTQUFTLGVBQWUsQ0FBQyxFQUMvRSx1QkFDRixFQUdLLENBQUUsZUFBYyxrQkFBaUIsdUJBQXNCLENBQ2hFLENBRUEsU0FBUyxHQUF3QyxFQUEwQixDQUV6RSxPQURJLE9BQU8sR0FBVyxTQUNmLHNFQUFzRSxLQUFLLENBQU0sRUFEakQsRUFFekMsQ0FFQSxTQUFTLEdBQTZDLEVBQW9DLENBQ3hGLElBQUssR0FBTSxDQUFDLEVBQVksSUFBa0IsQ0FDeEMsQ0FBQyxFQUFjLEdBQWdDLENBQU8sQ0FBQyxFQUN2RCxDQUFDLEVBQW1CLEdBQXFDLENBQU8sQ0FBQyxDQUNuRSxFQUNFLEdBQUksRUFBZSxDQUNqQixJQUFNLEVBQWEsRUFBUSxnQkFBZ0IsR0FDM0MsR0FBSSxDQUFDLEVBQVksU0FDakIsSUFBTSxFQUFpQixFQUFRLGFBQWEsSUFDeEMsQ0FBQyxHQUFrQixHQUFzQixFQUFZLENBQWMsS0FDckUsRUFBUSxhQUFhLEdBQWMsR0FFckMsT0FBTyxFQUFRLGdCQUFnQixFQUNqQyxNQUFXLEVBQVEsYUFBYSxLQUM5QixFQUFRLGdCQUFnQixLQUFnQixFQUFRLGFBQWEsR0FDN0QsT0FBTyxFQUFRLGFBQWEsR0FHbEMsQ0FFQSxTQUFTLEdBQWdDLEVBQStCLENBQ3RFLElBQU0sRUFBb0IsRUFBUSxTQUFTLFlBQzNDLE9BQU8sT0FBTyxHQUFzQixVQUFZLFVBQVUsS0FBSyxDQUFpQixDQUNsRixDQUVBLFNBQVMsR0FBcUMsRUFBK0IsQ0FDM0UsSUFBTSxFQUFTLEVBQVEsT0FDdkIsT0FBTyxHQUEwQixHQUFRLElBQUksR0FBSyxHQUEwQixFQUFRLFNBQVMsSUFBSSxDQUNuRyxDQUVBLFNBQVMsR0FBMEIsRUFBK0IsQ0FHaEUsT0FBTyxPQUFPLEdBQWdCLFVBQVksK0JBQStCLEtBQUssQ0FBVyxDQUMzRixDQUVBLGVBQWUsR0FDYixFQUNBLEVBQ0EsRUFDQSxFQUNlLENBQ2YsQUFDRSxFQUFRLE9BQU8sRUFBSyxTQUFTLEVBQU8sT0FBTyxFQUd6QyxFQUFPLDZCQUNULEVBQVEsUUFBVSxJQUVwQixBQUNFLEVBQVEsVUFBVSxhQUVoQixDQUFDLEVBQVEsU0FBVyxFQUFRLFVBQVksY0FBZ0IsRUFBVyxlQUNyRSxFQUFRLGdCQUFrQixDQUFDLEVBQzNCLEVBQVEsY0FBYyxTQUFXLFVBRW5DLEdBQU0sQ0FBQyxHQUFTLEVBQVcsY0FBYyxFQUFPLFlBQWMsRUFBRSxFQWFoRSxJQVpJLElBQVUsZUFBaUIsSUFBVSxvQkFDdkMsRUFBUSxPQUFTLG9CQUVuQixNQUFNLEdBQXdDLEVBQVEsQ0FBTyxFQUN6RCxDQUFDLEVBQU8sUUFBVSxFQUFRLFNBQVcsQ0FBQyxFQUFRLE9BRWhELEVBQVEsS0FBTyxTQUlqQixPQUFPLEVBQVEsY0FBYyxhQUV6QixDQUFDLEVBQU8sMkJBQTRCLENBQ3RDLEdBQUksQ0FBQyxFQUFPLE1BQ1YsR0FBSSxDQUFDLEVBQU8sdUJBQXlCLENBQUMsRUFBTyxzQkFBdUIsQ0FDbEUsT0FBTyxFQUFRLFFBQVEsS0FDdkIsT0FBTyxFQUFRLFFBQVEsWUFDdkIsSUFBSyxJQUFNLElBQWMsQ0FBQyxTQUFTLEVBQUcsQ0FDcEMsSUFBTSxFQUFTLEVBQVEsUUFBUSxHQUMxQixJQUNMLEVBQVEsUUFBUSxHQUFjLEVBQU8sUUFBUSxtQ0FBb0MsRUFBRSxFQUNyRixDQUNGLEtBQ0UsR0FBUSxRQUFRLFlBQWMsRUFBUSxRQUFRLGFBQWUsa0JBSWpFLEdBQUksRUFBTyx1QkFBd0IsQ0FDakMsRUFBUSxRQUFRLEtBQU8sa0JBQ3ZCLEVBQVEsUUFBUSxZQUFjLFlBQzlCLElBQU0sRUFBTyxDQUFDLE1BQU8sT0FBUSxhQUFhLENBQUMsQ0FBQyxPQUFRLEdBQVEsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsQ0FBRyxDQUFDLENBQUMsRUFDeEcsRUFBSyxPQUFTLElBQ2hCLEVBQVEsUUFBUSxlQUFpQixzQkFBc0IsRUFBSyxLQUMxRCxHQUNGLEVBQUUsK0dBQ0YsRUFBUSxRQUFRLE9BQVMsR0FBd0IsRUFBUSxRQUFRLE9BQVEsQ0FBTSxFQUVuRixDQUVBLElBQU0sRUFBdUIsR0FBd0IsQ0FBTSxFQUMzRCxHQUFJLEVBQXNCLENBQ3BCLEVBQVEsUUFBUSxjQUFnQixrQkFDbEMsT0FBTyxFQUFRLFFBQVEsWUFFekIsSUFBTSxFQUFlLEVBQU8sTUFBUSxVQUFZLE9BQ2hELEVBQVEsUUFBUSxtQkFBcUIsR0FBRyxFQUFhLFNBQVMsSUFDOUQsT0FBTyxFQUFRLFFBQVEsU0FBUyxJQUF5QixTQUFXLEtBQU8sWUFDM0UsT0FBTyxFQUFRLFFBQVEscUJBQ3ZCLEVBQVEsUUFBUSxTQUFTLEtBQTBCLEdBQXNCLENBQW9CLEVBQzdGLElBQU0sRUFBYyxNQUFNLEVBQUcsS0FBSyxVQUFXLENBQzNDLElBQUssRUFBTyxRQUNaLElBQUssR0FDTCxPQUFRLENBQ1YsQ0FBQyxFQUNLLEVBQWEsSUFBSSxJQUN2QixJQUFLLElBQU0sS0FBYyxFQUFhLENBQ3BDLEdBQU0sQ0FBQyxFQUFPLEdBQVUsRUFBVyxNQUFNLEdBQUcsRUFDeEMsR0FBUyxHQUNYLEVBQVcsSUFBSSxDQUFLLENBRXhCLENBQ0EsR0FBSSxFQUFXLEtBQU8sRUFBRyxDQUN2QixJQUFNLEVBQWMsQ0FBQyxHQUFHLENBQVUsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUN0QyxFQUFlLEdBQUcsRUFBcUIsTUFDN0MsRUFBUSxRQUFRLGVBQ2QsR0FBRyxFQUFhLHlCQUF5QixFQUFZLE1BQU0sRUFBYSxTQUFTLElBQy9FLEVBQVEsUUFBUSxLQUNsQixFQUFRLFFBQVEsS0FBTyxHQUFHLEVBQWEsVUFBVSxFQUFZLE1BQU0sRUFBUSxRQUFRLFFBRW5GLEVBQVEsUUFBUSxLQUFPLEdBQUcsRUFBYSxVQUFVLElBQ2pELEVBQVEsUUFBUSxZQUFjLEdBQUcsRUFBYSxRQUVoRCxFQUFRLFFBQVEsT0FBUyxHQUF3QixFQUFRLFFBQVEsT0FBUSxDQUFNLEVBQy9FLEVBQWtCLHNCQUFzQixLQUFLLFFBQVMsUUFBUyxRQUFRLENBQ3pFLENBQ0YsQ0FDRixFQUVJLEVBQU8sWUFBYyxFQUFRLGNBQy9CLEVBQVEsV0FBYSxHQUErQixFQUFPLFlBQWMsRUFBUSxXQUFZLEVBQVEsVUFBVSxHQUlqSCxJQUFNLEVBQWdCLEdBQTRCLEVBQVEsRUFBUSxPQUFPLEVBQ25FLEVBQWdCLEVBQVEsUUFBUSxZQUNsQyxHQUFlLFNBQVMsMkJBQTJCLEVBQ3JELE9BQU8sRUFBUSxRQUFRLFlBQ2QsR0FBOEIsRUFBUSxDQUFhLEVBQzVELEVBQVEsUUFBUSxZQUFjLEdBQW9CLEdBQUcsRUFBTyxNQUFRLE9BQVMsR0FBRyxhQUFjLENBQWEsRUFFM0csR0FDQSxHQUNBLENBQUMsRUFDQyxFQUNBLEVBQVEsUUFDUCxHQUFtQixFQUFnQyxDQUFjLElBQU0sbUJBQzFFLElBTUEsRUFBUSxRQUFRLFlBQ2QsRUFBcUIsRUFBZSxFQUFRLFlBQWUsRUFBSSxHQUFLLEdBQThCLENBQWEsRUFDM0csR0FBRyxFQUFjLE1BQU0sSUFDdkIsR0FBb0IsRUFBZSxDQUFhLEdBRXhELEdBQXlCLEVBQVEsQ0FBTyxFQUN4QyxHQUF3QixFQUFRLFFBQVMsQ0FBYSxFQUVqRCxFQUFRLGFBQWEsVUFFeEIsT0FBTyxFQUFRLGdCQUFnQixrQkFFbkMsQ0FFQSxTQUFTLEdBQThCLEVBQXVCLEVBQStDLENBQzNHLE9BQ0UsRUFBTyxVQUFVLE9BQ2pCLEVBQU8sVUFBVSxRQUNqQixFQUFPLFVBQVUsV0FDakIsRUFBTyxVQUFVLFFBQ2hCLEVBQU8sVUFBVSxTQUFXLENBQUMsQ0FBQyxHQUFrQixTQUFTLG1CQUFtQixDQUVqRixDQUVBLFNBQVMsR0FBd0IsRUFBa0MsRUFBK0IsQ0FHaEcsSUFBTSxFQUFlLEVBQU8sTUFBUSxVQUFZLE9BQ2hELE9BQU8sRUFBZSxHQUFHLEVBQWEsTUFBTSxFQUFhLGNBQWdCLEdBQUcsRUFBYSxhQUMzRixDQUVBLFNBQVMsR0FBeUIsRUFBdUIsRUFBb0MsQ0FDdEYsR0FBc0IsQ0FBTSxHQUU3QixFQUFRLFFBQVEsaUJBQW1CLDZEQUNyQyxPQUFPLEVBQVEsUUFBUSxjQUUzQixDQUVBLGVBQWUsR0FDYixFQUNBLEVBQ2UsQ0FDZixHQUFJLENBQUMsR0FBcUMsQ0FBTSxFQUFHLE9BRW5ELElBQU0sRUFBZ0IsRUFBSyxRQUFRLEVBQU8sUUFBUyxZQUFZLEVBQy9ELEdBQUksQ0FBQyxFQUFHLFdBQVcsQ0FBYSxFQUFHLE9BRW5DLEVBQVEsS0FBTyxTQUVmLElBQU0sRUFBZ0IsRUFBSyxRQUFRLEVBQU8sUUFBUyxhQUFhLEVBQzNELEVBQUcsV0FBVyxDQUFhLElBRWhDLEVBQVEsTUFBUSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBSSxFQUFRLE9BQVMsQ0FBQyxFQUFJLGNBQWMsQ0FBQyxDQUFDLEVBSXZFLE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFLLFFBQVEsRUFBTyxRQUFTLGNBQWMsRUFBRyxFQUFpQixDQUFDLEVBQ2xILENBRUEsTUFBTSxHQUFvQjtFQUcxQixTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ0EsRUFDTSxDQUNOLElBQU0sRUFBMEIsRUFBUSxhQUNsQyxFQUE2QixFQUFRLGdCQUMzQyxFQUFrQixhQUFlLEdBQy9CLEVBQ0EsRUFDQSxFQUNBLENBQUMsR0FBRyxFQUFrQixhQUFjLEdBQUcsR0FBK0IsQ0FBdUIsQ0FBQyxFQUM5RixDQUNGLEVBQ0EsRUFBa0IsZ0JBQWtCLEVBQWtCLGdCQUFnQixPQUFRLEdBQVEsQ0FBQyxFQUF3QixFQUFJLEVBQ25ILEVBQWtCLGdCQUFrQixHQUNsQyxFQUNBLEVBQ0EsRUFDQSxDQUFDLEdBQUcsRUFBa0IsZ0JBQWlCLEdBQUcsR0FBK0IsQ0FBMEIsQ0FBQyxFQUNwRyxDQUNGLENBQ0YsQ0FFQSxTQUFTLEdBQStCLEVBQW9FLENBQzFHLE9BQU8sT0FBTyxLQUFLLENBQXVCLENBQUMsQ0FBQyxPQUFRLEdBQWUsR0FBdUIsSUFBSSxDQUFVLENBQUMsQ0FDM0csQ0FFQSxTQUFTLEdBQThCLEVBQTRCLENBQ2pFLElBQUssSUFBTSxLQUFPRCxHQUF1QixDQUN2QyxJQUFNLEVBQVUsRUFBUSxHQUNwQixHQUFXLE9BQU8sS0FBSyxDQUFPLENBQUMsQ0FBQyxTQUFXLEdBQzdDLFFBQVEsZUFBZSxFQUFTLENBQUcsQ0FFdkMsQ0FDRixDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDQSxFQUNNLENBRU4sR0FBdUIsRUFBUSxFQURWLEVBQWtCLGFBQWEsT0FBUSxHQUFRLENBQUMsRUFBUSxrQkFBa0IsRUFDckMsRUFBRyxFQUFLLEVBR2xFLEdBQXVCLEVBQVEsRUFEUCxFQUFrQixnQkFBZ0IsT0FBUSxHQUFRLENBQUMsRUFBUSxlQUFlLEVBQ3JDLEVBQUcsRUFBSSxFQUVwRSxJQUFNLEVBQXVCLEdBQXdCLENBQU0sRUFDM0QsR0FBSSxHQUF3QixFQUFrQixzQkFBc0IsT0FBUyxFQUFHLENBQzlFLElBQU0sRUFBZSxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQWtCLHFCQUFxQixDQUFDLEVBQ3JFLElBQXlCLFNBQzNCLEVBQVUsU0FBVSxDQUFDLE1BQU8sVUFBVyxNQUFPLEdBQUcsQ0FBWSxFQUFHLEVBQU8sT0FBTyxFQUU5RSxFQUFVLEtBQU0sQ0FBQyxNQUFPLFFBQVMsR0FBRyxDQUFZLEVBQUcsRUFBTyxPQUFPLENBRXJFLENBQ0YsQ0FFQSxTQUFTLEdBQXdCLEVBQW9ELENBQ25GLEdBQUksRUFBTyxrQkFBbUIsTUFBTyxLQUNyQyxHQUFJLEVBQU8sc0JBQXVCLE1BQU8sUUFDM0MsQ0FFQSxTQUFTLEdBQXNCLEVBQXlDLENBRXRFLE9BREksSUFBbUIsS0FBYSxtQkFDN0IsOElBQ1QsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ0EsRUFDTSxDQUNOLEdBQUksRUFBYSxTQUFXLEVBQUcsT0FFL0IsSUFBTSxFQUF1QixDQUMzQixHQUFHLElBQUksSUFBSSxFQUFhLElBQUssR0FBZSxHQUE4QixFQUFRLENBQVUsQ0FBQyxDQUFDLENBQ2hHLEVBQ0EsRUFDRSxFQUNBLENBQUMsTUFBTyxHQUFJLEVBQU0sQ0FBQyxJQUFJLEVBQUksQ0FBQyxFQUFJLEdBQUksRUFBTyxNQUFRLENBQUMsU0FBUyxFQUFJLENBQUMsRUFBSSxHQUFHLENBQW9CLEVBQzdGLEVBQU8sT0FDVCxDQUNGLENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDVSxDQUNWLElBQU0sRUFBa0MsQ0FBQyxFQUN6QyxJQUFLLElBQU0sS0FBYyxJQUFJLElBQUksQ0FBWSxFQUFHLENBQzlDLElBQU0sRUFBaUMsR0FDckMsRUFDQSxFQUNBLEVBQXdCLEVBQzFCLEVBS0EsR0FKSSxJQUNGLEVBQXNCLEtBQUssQ0FBVSxFQUNqQyxDQUFDLElBR0wsRUFBd0IsSUFDeEIsQ0FBQyxHQUNELEVBQXdCLEtBQWdCLElBRXhDLFNBQ0YsSUFBTSxFQUFnQixHQUEyQixFQUFRLENBQVUsRUFDL0QsSUFBa0IsS0FBTyxFQUF3QixLQUNyRCxFQUF3QixHQUFjLEVBQ3hDLENBQ0EsT0FBTyxDQUNULENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNNLENBQ04sSUFBTSxFQUFtQixFQUFLLFNBQVMsRUFBTyxRQUFTLENBQVEsRUFDMUQsR0FPSCxFQURFLElBQW1CLE1BQ1gsT0FFQSxFQUZRLENBQUMsb0JBQXFCLENBQWdCLEVBQUcsRUFBTyxPQUVlLENBRXJGLENBR0EsZUFBZSxHQUNiLEVBQ0EsRUFDZSxDQUNYLEVBQVEsU0FBVyxvQkFDckIsRUFBUSxPQUFTLG9CQUVuQixHQUFxQixFQUFRLENBQU8sRUFDcEMsR0FBbUQsRUFBUSxDQUFPLEVBQ2xFLE9BQU8sRUFBUSxRQUFRLHFCQUN2QixPQUFPLEVBQVEsUUFBUSx5QkFDdkIsT0FBTyxFQUFRLFFBQVEsb0JBQ3ZCLE9BQU8sRUFBUSxRQUFRLGdCQUN2QixPQUFPLEVBQVEsUUFBUSxrQkFDdkIsT0FBTyxFQUFRLFFBQVEsc0JBQ3ZCLE9BQU8sRUFBUSxRQUFRLHFCQUN2QixPQUFPLEVBQVEsYUFBYSxNQUM1QixPQUFPLEVBQVEsZ0JBQWdCLGdDQUMvQixPQUFPLEVBQVEsZ0JBQWdCLHlCQUkvQixPQUFPLEVBQVEsYUFBYSxJQUM1QixPQUFPLEVBQVEsZ0JBQWdCLElBRTNCLENBQUMsRUFBTyx1QkFBeUIsQ0FBQyxFQUFPLGtDQUMzQyxPQUFPLEVBQVEsYUFBYSxJQUM1QixPQUFPLEVBQVEsZ0JBQWdCLEtBRWpDLE9BQU8sRUFBUSxnQkFBZ0IsTUFFL0IsT0FBTyxFQUFRLGdCQUFnQixNQUMvQixPQUFPLEVBQVEsUUFBUSxrQkFDdkIsT0FBTyxFQUFRLFFBQVEsa0JBQ3ZCLE9BQU8sRUFBUSxRQUFRLGlCQUN2QixPQUFPLEVBQVEsUUFBUSxpQkFDdkIsT0FBTyxFQUFRLFFBQVEsU0FDdkIsT0FBTyxFQUFRLFFBQVEsYUFDdkIsT0FBTyxFQUFRLFFBQVEsZUFDdkIsT0FBTyxFQUFRLFFBQVEsMEJBQ3ZCLE1BQU0sRUFBWSxRQUFVLEVBQUcsU0FBUyxHQUFHLEVBQUssUUFBUSxFQUFPLFFBQVMsWUFBWSxFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUV2RyxHQUE0QyxFQUFRLENBQU8sRUFDM0QsR0FBK0IsRUFBUyxDQUFNLENBQ2hELENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDTSxDQUNOLElBQU0sRUFBYyxFQUFRLE1BQVEsRUFBSyxTQUFTLEVBQU8sT0FBTyxFQUloRSxJQUFLLElBQU0sS0FBVyxHQUFzQixDQUFPLEVBQ2pELFFBQVEsZUFBZSxFQUFTLENBQVcsQ0FFL0MsQ0FFQSxTQUFTLEdBQW1ELEVBQXVCLEVBQTRCLENBQ3hHLEtBQU8scUJBRVosSUFBSyxJQUFNLEtBQVcsR0FBc0IsQ0FBTyxFQUNqRCxJQUFLLEdBQU0sQ0FBQyxFQUFZLEtBQVksT0FBTyxRQUFRLENBQU8sRUFDbkQsR0FDQSxHQUF5QixDQUFPLElBTXJDLEVBQVEsR0FBYyxHQUEyQixFQUFRLENBQVUsRUFHekUsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUNNLENBQ04sR0FBSSxDQUFDLEVBQU8scUJBQXNCLE9BRWxDLElBQU0sRUFBVyxHQUFzQixDQUFPLEVBQzlDLElBQUssSUFBTSxLQUFjLEdBSXZCLElBQUssSUFBTSxLQUFXLEVBQ3BCLFFBQVEsZUFBZSxFQUFTLENBQVUsQ0FHaEQsQ0FFQSxlQUFlLEdBQ2IsRUFDQSxFQUNBLEVBQ2UsQ0FDZixJQUFNLEVBQW9CLElBQUksSUFBSSxDQUFnQixFQUM1QyxFQUFtQyxNQUFNLEdBQW9DLENBQU0sRUFDekYsSUFBSyxJQUFNLEtBQWMsR0FDbkIsT0FBa0IsSUFBSSxDQUFVLEdBQUssRUFBaUMsSUFBSSxDQUFVLEdBR3hGLElBQUssSUFBTSxLQUFXLEdBQXNCLENBQU8sRUFDakQsUUFBUSxlQUFlLEVBQVMsQ0FBVSxDQUdoRCxDQUVBLGVBQWUsR0FBb0MsRUFBNkMsQ0FDOUYsSUFBTSxFQUFtQyxJQUFJLElBQ3ZDLEVBQVksTUFBTSxFQUFHLEtBQUssb0JBQXFCLENBQ25ELElBQUssRUFBTyxRQUNaLElBQUssR0FDTCxPQUFRLENBQ1YsQ0FBQyxFQUVELElBQUssSUFBTSxLQUFZLEVBQVcsQ0FDaEMsSUFBTSxFQUFtQixFQUFLLFFBQVEsRUFBTyxRQUFTLENBQVEsRUFHeEQsRUFBUyxHQUFnQixDQUFnQixFQUMvQyxHQUFJLENBQUMsRUFFSCxPQURBLFFBQVEsS0FBSyxtREFBbUQsRUFBaUIsc0JBQXNCLEVBQ2hHLElBQUksSUFBSSxFQUErQixFQUVoRCxJQUFLLElBQU0sS0FBUyxHQUFvQixDQUFNLEVBQzVDLElBQUssSUFBTSxLQUFjLElBQ25CLElBQVUsR0FBYyxFQUFNLFdBQVcsR0FBRyxFQUFXLEVBQUUsSUFDM0QsRUFBaUMsSUFBSSxDQUFVLENBSXZELENBRUEsT0FBTyxDQUNULENBR0EsU0FBUyxHQUFvQixFQUFrQyxDQUM3RCxJQUFNLEVBQW1CLENBQUMsRUFDMUIsSUFBSyxJQUFNLEtBQVksR0FBMEIsQ0FBTSxFQUNqRCxFQUFJLHFCQUFxQixDQUFRLEdBQUssRUFBSSxnQkFBZ0IsRUFBUyxJQUFJLEdBQUssRUFBUyxLQUFLLE9BQVMsV0FDckcsR0FBMkIsRUFBUyxZQUFhLENBQU0sRUFHM0QsT0FBTyxDQUNULENBRUEsU0FBUyxHQUEwQixFQUFpRSxDQUNsRyxJQUFLLElBQU0sS0FBYSxFQUFPLFdBQzdCLEdBQUksRUFBSSxzQkFBc0IsQ0FBUyxHQUFLLEVBQUksMEJBQTBCLEVBQVUsVUFBVSxFQUM1RixPQUFPLEVBQVUsV0FBVyxXQUdoQyxNQUFPLENBQUMsQ0FDVixDQUVBLFNBQVMsR0FBMkIsRUFBc0IsRUFBd0IsQ0FDaEYsR0FBSSxFQUFJLGdCQUFnQixDQUFJLEVBQzFCLEVBQU8sS0FBSyxFQUFLLElBQUksT0FDaEIsR0FBSSxFQUFJLHlCQUF5QixDQUFJLEVBQzFDLElBQUssSUFBTSxLQUFXLEVBQUssU0FDekIsR0FBMkIsRUFBUyxDQUFNLENBR2hELENBRUEsU0FBUyxHQUFzQixFQUF5RCxDQUN0RixPQUFPQSxHQUNKLElBQUssR0FBUSxFQUFRLEVBQUksQ0FBQyxDQUMxQixPQUFRLEdBQXdELENBQUMsQ0FBQyxDQUFPLENBQzlFLENBRUEsU0FBUyxHQUEyQixFQUF1QixFQUE0QixDQUNyRixJQUFNLEVBQVcsR0FBRyxFQUFPLE1BQVEsTUFBUSxPQUFPLEdBQUcsSUFDL0MsRUFBZ0IsR0FBNkIsSUFBSSxDQUFRLEVBQy9ELEdBQUksRUFBZSxPQUFPLEVBRTFCLElBQU0sRUFBVSxHQUE0QixFQUFRLENBQVUsRUFFOUQsT0FEQSxHQUE2QixJQUFJLEVBQVUsQ0FBTyxFQUMzQyxDQUNULENBRUEsU0FBUyxHQUE0QixFQUF1QixFQUE0QixDQU90RixPQUpLLEdBQTBCLEVBQVEsQ0FBVSxFQUkxQyxHQUFtQyxFQUFZLEdBQW9CLENBQU0sQ0FBQyxFQUh4RSxHQUErQixDQUFVLENBSXBELENBRUEsU0FBUyxHQUFtQyxFQUFvQixFQUFrQyxDQUNoRyxJQUFNLEVBQVEsR0FBbUIsQ0FBVSxFQUNyQyxFQUFnQixHQUErQixDQUFVLEVBQy9ELEdBQUksSUFBa0IsS0FBTyxHQUF5QixFQUFNLEdBQWdCLENBQWdCLEVBQzFGLE9BQU8sRUFHVCxJQUFNLEVBQU0sS0FBSyxJQUFJLEVBUXJCLE9BUGlCLE9BQU8sUUFBUSxDQUFLLENBQUMsQ0FDbkMsUUFBUSxDQUFDLEtBQWEsRUFBTyxNQUFNLENBQU8sQ0FBQyxDQUFDLENBQzVDLFFBQVEsQ0FBQyxNQUFjLEVBQU8sV0FBVyxDQUFPLENBQUMsRUFBRSxRQUFVLEtBQU8sQ0FBQyxDQUFDLENBQ3RFLFFBQVEsRUFBRyxLQUFpQixPQUFPLFNBQVMsS0FBSyxNQUFNLENBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDckUsUUFBUSxFQUFHLEtBQWlCLEVBQU0sS0FBSyxNQUFNLENBQVcsR0FBSyxDQUFnQixDQUFDLENBQzlFLFVBQVUsQ0FBQyxHQUFXLENBQUMsS0FBYyxFQUFPLFNBQVMsRUFBVSxDQUFRLENBRTVELENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBTSxHQUM3QixDQUVBLFNBQVMsR0FBeUIsRUFBaUMsRUFBbUMsQ0FDcEcsR0FBSSxDQUFDLEVBQWEsTUFBTyxHQUN6QixJQUFNLEVBQWdCLEtBQUssTUFBTSxDQUFXLEVBQzVDLE9BQU8sT0FBTyxTQUFTLENBQWEsR0FBSyxLQUFLLElBQUksRUFBSSxHQUFpQixDQUN6RSxDQUVBLFNBQVMsR0FBbUIsRUFBNEMsQ0FDdEUsSUFBTSxFQUFjLEVBQVcsUUFBUSxZQUFhLEVBQUUsRUFDaEQsRUFBYyxHQUFxQixJQUFJLENBQVcsRUFDeEQsR0FBSSxFQUFhLE9BQU8sRUFFeEIsSUFBTSxFQUFTLEVBQ2IsTUFDQSxDQUFDLE9BQVEsRUFBYSxPQUFRLFNBQVUsb0JBQW9CLEVBQzVELFFBQVEsSUFBSSxDQUNkLEVBQ0EsR0FBSSxDQUFDLEVBQVEsTUFBTyxDQUFDLEVBRXJCLEdBQUksQ0FDRixJQUFNLEVBQVMsS0FBSyxNQUFNLENBQU0sRUFFaEMsT0FEQSxHQUFxQixJQUFJLEVBQWEsQ0FBTSxFQUNyQyxDQUNULE1BQVEsQ0FDTixNQUFPLENBQUMsQ0FDVixDQUNGLENBRUEsU0FBUyxHQUEwQixFQUF1QixFQUE2QixDQUVyRixNQUFPLEVBRHFCLEVBQU8sTUFBUSxHQUErQixHQUFBLENBQzlDLEtBQU0sR0FBWSxHQUF3QixFQUFTLENBQVUsQ0FBQyxDQUM1RixDQUVBLFNBQVMsR0FBb0IsRUFBK0IsQ0FDMUQsR0FBSSxFQUFPLE1BQU8sT0FBTyxHQUE4QixJQUV2RCxJQUFNLEVBQVUsbUJBQW1CLEtBQUEsSUFBMEIsRUFDN0QsT0FBTyxPQUFPLEdBQVMsUUFBUSxNQUFRLENBQUMsRUFBSSxHQUFLLEdBQUssR0FBSyxHQUM3RCxDQUVBLFNBQVMsR0FBd0IsRUFBaUIsRUFBNkIsQ0FDN0UsR0FBSSxJQUFZLEVBQVksTUFBTyxHQUNuQyxHQUFJLENBQUMsRUFBUSxTQUFTLEdBQUcsRUFBRyxNQUFPLEdBRW5DLElBQU0sRUFBaUIsRUFBUSxXQUFXLHNCQUF1QixPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsV0FBVyxJQUFLLElBQUksRUFDdEcsT0FBVyxPQUFPLElBQUksRUFBZSxHQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBVSxDQUMvRCxDQUVBLFNBQVMsR0FBK0IsRUFBNEIsQ0FDbEUsT0FBTyxFQUF5QixNQUFPLENBQUMsT0FBUSxFQUFZLFVBQVcsb0JBQW9CLEVBQUcsUUFBUSxJQUFJLENBQUMsR0FBSyxHQUNsSCxDQUVBLFNBQVMsR0FBOEIsRUFBdUIsRUFBNEIsQ0FFeEYsT0FESSxJQUFlLEVBQXFCLEdBQUcsRUFBVyxHQUFHLEdBQTJCLEVBQVEsQ0FBVSxJQUMvRixDQUNULENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDTSxDQUNOLElBQU0sRUFBcUIsR0FBeUIsQ0FBTSxFQUMxRCxJQUFLLElBQU0sS0FBYyxHQUNuQixHQUFzQixHQUF1QixJQUFJLENBQVUsR0FDM0QsR0FBMEMsRUFBUyxFQUFRLENBQVUsSUFDekUsT0FBTyxFQUFRLGFBQWEsR0FDNUIsT0FBTyxFQUFRLGdCQUFnQixHQUMvQixPQUFPLEVBQVEsaUJBQWlCLEdBRXBDLENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNTLENBTVQsT0FMSyxHQUFxQyxDQUFNLEVBQzVDLEVBQVEsaUJBQWlCLEdBQW9CLEdBSTFDLElBQWUsaUJBQW1CLENBQUMsQ0FBQyxFQUFRLGlCQUFpQixPQUxWLEVBTTVELENBRUEsU0FBUyxHQUF5QixFQUFnQyxDQUtoRSxPQUFRLEVBQU8sc0JBQXdCLENBQUMsRUFBTyxRQUFXLEdBQWdDLEVBQU8sT0FBTyxDQUMxRyxDQUVBLFNBQVMsR0FBZ0MsRUFBMEIsQ0FNakUsT0FMa0IsRUFBRyxTQUFTLDJDQUE0QyxDQUN4RSxJQUFLLEVBQ0wsSUFBSyxHQUNMLE9BQVEsQ0FDVixDQUNlLENBQUMsQ0FBQyxLQUFNLEdBQWEsQ0FDbEMsR0FBSSxDQUNGLE9BQU8sR0FBd0IsS0FBSyxFQUFHLGFBQWEsRUFBSyxRQUFRLEVBQVMsQ0FBUSxFQUFHLE1BQU0sQ0FBQyxDQUM5RixNQUFRLENBQ04sTUFBTyxFQUNULENBQ0YsQ0FBQyxDQUNILENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNTLENBTVQsTUFMSSxDQUFDLEdBQ0QsSUFBbUIsS0FDbkIsR0FBeUIsQ0FBYyxFQUFVLEdBRzlDLEdBQXVCLElBQUksQ0FBVSxHQUFLLEdBQWdDLEVBQVEsRUFBWSxDQUFjLENBQ3JILENBRUEsU0FBUyxHQUFnQyxFQUF1QixFQUFvQixFQUFpQyxDQUVuSCxPQUFPLEdBRGUsR0FBMkIsRUFBUSxDQUNoQixFQUFHLENBQWMsQ0FDNUQsQ0FFQSxTQUFTLEdBQXNCLEVBQTBCLEVBQWlDLENBQ3hGLElBQU0sRUFBcUIsRUFBTyxNQUFNLENBQWdCLEVBQ2xELEVBQXNCLEVBQU8sTUFBTSxDQUFjLEVBQ3ZELE1BQU8sQ0FBQyxHQUFzQixDQUFDLEdBQXVCLEVBQU8sR0FBRyxFQUFvQixDQUFtQixDQUN6RyxDQUVBLFNBQVMsR0FBeUIsRUFBMEIsQ0FDMUQsT0FBTyxFQUFRLFdBQVcsWUFBWSxDQUN4QyxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQzJCLENBQzNCLElBQU0sRUFBdUIsR0FBcUMsQ0FBVSxFQUM1RSxHQUFJLEVBQ0YsT0FBTyxHQUF3QyxFQUFzQixFQUFZLENBQWtCLEVBR3JHLElBQU0sRUFBK0IsR0FBcUMsQ0FBa0IsRUFLNUYsT0FKSSxFQUNLLEdBQXdDLEVBQThCLENBQWtCLEVBRzFGLENBQ1QsQ0FFQSxTQUFTLEdBQXFDLEVBQTJELENBQ3ZHLEdBQUksT0FBTyxHQUFlLFNBQVUsQ0FDbEMsR0FBSSxDQUFDLEVBQVcsV0FBVyxTQUFTLEVBQUcsT0FFdkMsR0FBTSxDQUFDLEVBQU8sR0FBUSxFQUFXLGNBQWMsQ0FBVSxFQUV6RCxNQURJLENBQUMsR0FBUyxDQUFDLEVBQU0sT0FDZCwwQkFBMEIsRUFBTSxHQUFHLEVBQUssS0FDakQsQ0FFQSxJQUFNLEVBQWdCLEdBQVksSUFDbEMsR0FBSSxPQUFPLEdBQWtCLFNBQVUsT0FFdkMsSUFBTSxFQUFVLGtFQUFrRSxLQUFLLENBQWEsRUFDcEcsR0FBSSxDQUFDLEVBQVMsT0FFZCxHQUFNLEVBQUcsRUFBTyxHQUFRLEVBQ3hCLE1BQU8sMEJBQTBCLEVBQU0sR0FBRyxFQUFLLEtBQ2pELENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUMyQixDQVEzQixNQUFPLENBQ0wsR0FQQSxPQUFPLEdBQWUsU0FDbEIsRUFDQSxPQUFPLEdBQXVCLFNBQzVCLEVBQ0EsSUFBQSxHQUlOLEtBQU0sTUFDTixJQUFLLENBQ1AsQ0FDRixDQUVBLFNBQWdCLEdBQWdCLEVBQXVCLEVBQXlELENBQzlHLEdBQUksRUFBTyxNQUFPLENBQ2hCLElBQU0sRUFBZSxFQUFPLHVCQUF5QixFQUFPLGdDQUN0RCxFQUFrQyxDQUd0QyxRQUFTLDZCQUNULE9BQVEsdUJBQ1IsS0FBTSxjQUNOLFdBQVksb0JBQ1osS0FBTSxjQUNOLFVBQVcsbUJBQ1gsT0FBUSxnQkFDUixjQUFlLHNCQUNqQixFQVFBLE9BUEEsR0FBcUIsRUFBUSxFQUFTLEVBQVksT0FBTyxHQUFxQixDQUFNLEdBQUcsRUFDdkYsR0FBcUIsRUFBUSxFQUFTLEVBQVksQ0FBQyxRQUFTLE1BQU8sUUFBUyxPQUFRLFdBQVcsQ0FBQyxFQUMzRixFQUVNLEVBQU8sVUFBVSxVQUMxQixFQUFRLFdBQWEsZUFGckIsT0FBTyxFQUFRLFVBSVYsQ0FDVCxLQUFPLENBQ0wsSUFBTSxFQUFlLEVBQU8sdUJBQXlCLEVBQU8sZ0NBQ3RELEVBQVksRUFBa0IsQ0FBTSxFQUNwQyxFQUFVLEVBQWdCLENBQU0sRUFDaEMsRUFBVSxFQUFXLEtBQ3ZCLEVBQWtDLENBQ3BDLFFBQVMsK0JBQ1QsT0FBUSxHQUFxQixFQUFXLENBQU8sRUFHL0MsS0FBTSxTQUFTLEVBQWUsNkJBQStCLEdBQUcsb0NBQ2hFLFdBQVksa0JBQ1osY0FBZSxxRUFDZixVQUFXLGNBQ2IsRUErQ0EsT0E5Q0ksSUFDRixFQUFRLFNBQVcseUVBQXlFLEVBQVcsYUFBYSxLQUFLLEdBQUcsRUFBRSxnQ0FFNUgsRUFBTyw0QkFDVCxFQUFVLEVBQ1IsQ0FBRSxHQUFHLENBQVEsRUFDYixDQUNFLE9BQVEsR0FBRyxFQUFRLE9BQU8sbUVBQzFCLEtBQU0sOERBQ04sV0FBWSxrRUFFWixLQUFNLHdEQUNOLFVBQVcsa0VBQ2IsQ0FDRixFQUNJLElBQ0YsRUFBUSxTQUFXLHlFQUF5RSxFQUFXLGFBQWEsS0FDbEgsR0FDRixFQUFFLG1EQUVLLEVBQU8sVUFBVSxVQUMxQixFQUFRLFVBQVksRUFBUSxVQUFZLEdBQUcsRUFBUSxVQUFVLE1BQVEsR0FDckUsRUFBUSxXQUFhLFdBRW5CLEdBQVMsU0FBUyxTQUFTLElBQzdCLEVBQVEsS0FBTyxHQUVaLElBQ0gsT0FBTyxFQUFRLGVBQ2YsT0FBTyxFQUFRLEtBQ2YsT0FBTyxFQUFRLGFBRVosRUFFTSxFQUFPLFVBQVUsS0FDMUIsRUFBUSxVQUFZLGdCQUZwQixPQUFPLEVBQVEsVUFJYixHQUFZLEVBQU8sV0FBVyxHQUNoQyxFQUFRLE9BQVMsRUFBVyxRQUFVLHdFQUN0QyxFQUFRLGVBQWlCLEVBQVcsZ0JBQWtCLHVCQUV0RCxFQUFRLE9BQVMsWUFDakIsRUFBUSxlQUFpQixvQkFFM0IsR0FBcUIsRUFBUSxFQUFTLEVBQVksR0FBcUIsQ0FBTSxDQUFDLEVBQzlFLEdBQXFCLEVBQVEsRUFBUyxFQUFZLENBQUMsUUFBUyxNQUFPLFFBQVMsT0FBUSxXQUFXLENBQUMsRUFDekYsQ0FDVCxDQUNGLENBRUEsU0FBUyxHQUFzQixFQUFnQyxDQUM3RCxPQUFPLEVBQU8sVUFBVSxXQUFhLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBTyxRQUFTLE1BQU0sQ0FBQyxDQUN0RixDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDQSxFQUNNLENBQ0YsQ0FBQyxFQUFPLFVBQVUsUUFBVSxDQUFDLEVBQU8sVUFBVSxVQUVsRCxHQUFvQixFQUFTLEVBQVksc0JBQXVCLEdBQUcsRUFBWSxhQUFhLEVBQzVGLEdBQW9CLEVBQVMsRUFBWSxhQUFjLEdBQUcsRUFBWSw2QkFBNkIsRUFDbkcsR0FBb0IsRUFBUyxFQUFZLFVBQVcsR0FBRyxFQUFZLFFBQVEsRUFDN0UsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ0EsRUFDTSxDQUNOLElBQU0sRUFBWSxFQUFXLEdBRzdCLEVBQVEsR0FBUSxHQUFhLENBQUMsR0FBMEIsQ0FBUyxFQUFJLEVBQVksQ0FDbkYsQ0FFQSxTQUFTLEdBQTBCLEVBQXlCLENBQzFELE1BQU8sMEJBQTBCLEtBQUssQ0FBTSxDQUM5QyxDQUVBLFNBQVMsR0FBcUIsRUFBOEMsQ0FFMUUsT0FESSxFQUFPLFVBQVUsT0FBZSxZQUM3QixPQUNULENBRUEsU0FBUyxHQUFZLEVBQStDLENBQ2xFLE9BQU8sR0FBYSxPQUFTLENBQy9CLENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNBLEVBQ00sQ0FDTixJQUFLLElBQU0sS0FBUSxFQUFPLENBRXhCLEdBREksQ0FBQyxHQUFZLEVBQVEsQ0FBSSxHQUN6QixHQUE4QixFQUFRLENBQUksRUFBRyxTQUtqRCxJQUFNLEVBQVksR0FBMkIsRUFBVyxHQUFPLENBQUksRUFDL0QsSUFBYyxJQUFBLElBQWEsRUFBVyxJQUFTLEVBQUUsS0FBUSxLQUM3RCxFQUFRLEdBQVEsR0FBRyxHQUFhLEdBQUcsV0FBVyxJQUNoRCxDQUNGLENBT0EsU0FBUyxHQUEyQixFQUFpQixFQUFrQyxDQUNqRixVQUFPLEdBQVcsU0FNdEIsT0FIYyxJQUFJLE9BQU8sT0FBTyxHQUFHLGtEQUFrREUsR0FBYSxDQUFJLEVBQUUsR0FBSSxHQUFHLENBQUMsQ0FBQyxLQUMvRyxFQUFPLEtBQUssQ0FFSCxDQUFDLEdBQUcsRUFDakIsQ0FFQSxTQUFTLEdBQVksRUFBdUIsRUFBdUIsQ0FDakUsT0FBTyxPQUFPLE9BQU8sRUFBTyxVQUFXLENBQUksQ0FDN0MsQ0FFQSxTQUFTLEdBQThCLEVBQXVCLEVBQXVCLENBQ25GLElBQU0sRUFBTyxFQUFPLFVBQVUsR0FHOUIsT0FGSyxFQUVFLENBRGtCLE1BQU8sT0FBUSxNQUFPLE1BQzFCLENBQUMsQ0FBQyxLQUFNLEdBQzNCLElBQUksT0FBTyxPQUFPLEdBQUcsS0FBSyxFQUFlLGdCQUFnQkEsR0FBYSxDQUFJLEVBQUUsc0JBQXVCLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBSSxDQUNuSCxFQUprQixFQUtwQixDQUVBLFNBQVNBLEdBQWEsRUFBdUIsQ0FDM0MsT0FBTyxFQUFNLFdBQVcsc0JBQXVCLE9BQU8sR0FBRyxLQUFLLENBQ2hFLENBRUEsU0FBUyxHQUFxQixFQUFvQixFQUEwQixDQUMxRSxJQUFNLEVBQVcsQ0FBQyxtQkFBbUIsRUFPckMsT0FOSSxHQUNGLEVBQVMsS0FBSyxrQkFBa0IsRUFFOUIsR0FDRixFQUFTLEtBQUssZUFBZSxFQUV4QixFQUFTLEtBQUssTUFBTSxDQUM3QixDQUVBLGVBQWUsR0FBdUIsRUFBa0MsQ0FDdEUsSUFBTSxFQUFXLEVBQUssUUFBUSxFQUFTLGlCQUFpQixFQUNsRCxFQUFrQixNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQVUsTUFBTSxDQUFDLENBQUMsVUFBWSxFQUFFLEVBQzdFLEVBQVEsRUFBZ0IsUUFBUSxFQUFlLGVBQWUsRUFZcEUsT0FYSSxJQUFVLEdBQVcsR0FXbEIsR0FUaUIsRUFBZ0IsTUFBTSxFQUFHLENBQ3JCLENBQUMsQ0FDMUIsTUFBTTtDQUFJLENBQUMsQ0FDWCxJQUFLLEdBQVMsQ0FDYixJQUFNLEVBQVUsRUFBSyxLQUFLLEVBQzFCLE9BQU8sRUFBUSxTQUFTLEdBQUcsRUFBSSxFQUFRLE1BQU0sRUFBRyxFQUFFLEVBQUksQ0FDeEQsQ0FBQyxDQUFDLENBQ0QsT0FBUSxHQUFNLEdBQUssQ0FBQyxFQUFFLFdBQVcsR0FBRyxHQUFLLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FFN0MsQ0FBQyxDQUFDLElBQUssR0FBUyxTQUFTLEVBQUssS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FDOUQsQ0FFQSxTQUFTLEdBQXdCLEVBQW9DLENBQ25FLE9BQU8sRUFBUSxTQUNmLElBQU0sRUFBeUUsQ0FDN0UsRUFBUSxhQUNSLEVBQVEsZ0JBQ1IsRUFBUSxnQkFDVixFQUNBLElBQUssSUFBTSxLQUFXLEVBQ2YsSUFDTCxPQUFPLEVBQVEsU0FDZixPQUFPLEVBQVEsd0JBQ2YsT0FBTyxFQUFRLDBCQUNmLE9BQU8sRUFBUSxnQ0FDZixPQUFPLEVBQVEsbUJBRW5CLENBRUEsZUFBZSxHQUFzQixFQUE2QyxDQUNoRixJQUFNLEVBQWUsSUFBSSxJQUFJLENBQUMsR0FBRyxPQUFPLEtBQUssRUFBUSxZQUFZLEVBQUcsR0FBRyxPQUFPLEtBQUssRUFBUSxlQUFlLENBQUMsQ0FBQyxFQWE1RyxNQUFNLFFBQVEsSUFDWixDQVJBLENBQUUsWUFBYSxvQkFBcUIsS0FBTSxPQUFRLE9BQVEsY0FBZSxFQUN6RSxDQUFFLFlBQWEsc0JBQXVCLEtBQU0sY0FBZSxPQUFRLGNBQWUsRUFDbEYsQ0FBRSxZQUFhLDZCQUE4QixLQUFNLGdCQUFpQixPQUFRLGlCQUFrQixFQUM5RixDQUFFLFlBQWEscUJBQXNCLEtBQU0sUUFBUyxPQUFRLGNBQWUsRUFDM0UsQ0FBRSxZQUFhLHlCQUEwQixLQUFNLFlBQWEsT0FBUSxjQUFlLENBSXJFLENBQUMsQ0FBQyxJQUFJLE1BQU8sQ0FBRSxjQUFhLE9BQU0sWUFBYSxDQUN2RCxDQUFDLEVBQWEsSUFBSSxDQUFXLEdBQUssR0FBbUIsRUFBUyxDQUFXLElBSTdFLFFBQVEsZUFBZSxFQUZILElBQVcsZUFBaUIsa0JBQW9CLGdCQUV2QixDQUFXLEVBQ3hELEVBQVEsRUFBTyxDQUFDLEdBQWUsTUFBTSxHQUFpQyxDQUFJLEVBQzVFLENBQUMsQ0FDSCxDQUNGLENBRUEsZUFBZSxHQUFpQyxFQUErQixDQUU3RSxNQUFPLGlDQUFpQyxFQUFLLE9BQU8sTUFEM0IsR0FBb0IsaUJBQWtCLENBQUksR0FFckUsQ0FFQSxTQUFTLEdBQW1CLEVBQXNCLEVBQThCLENBQzlFLE9BQVEsRUFBUSxrQkFBa0IsSUFBZ0IsRUFBUSxlQUFlLElBQWdCLEdBQUEsQ0FBSSxTQUFTLFdBQVcsQ0FDbkgsQ0M1NkNBLE1BQU0sR0FBcUQsQ0FDekQsYUFBYyxhQUNkLGFBQWMsQ0FDWixLQUFNLENBQ0osQ0FDRSxLQUFNLFVBQ04sT0FBUSxhQUNSLE9BQVEsTUFDVixDQUNGLENBQ0YsRUFDQSxXQUFZLENBQ1YsS0FBTSxDQUNKLENBQ0UsS0FBTSxRQUNOLE9BQVEsV0FDUixPQUFRLE1BQ1YsQ0FDRixDQUNGLENBQ0YsRUFFTSxHQUFvRCxDQUN4RCxLQUFNLENBQ0osQ0FDRSxLQUFNLFVBQ04sS0FBTSxHQUNOLElBQUssR0FDTCxZQUFhLEVBQ2YsRUFDQSxDQUNFLEtBQU0sbUJBQ04sS0FBTSxtQkFDTixJQUFLOzs7Ozs7OztlQVdQLENBQ0YsQ0FDRixFQUVNLEdBQVUsQ0FDZCxVQUFXOzs7Ozs7OztFQVdiLEVBRUEsZUFBc0IsR0FBb0MsRUFBc0MsQ0FDOUYsT0FBTyxFQUFPLDBCQUEwQixzQ0FBdUMsU0FBWSxDQUN6RixNQUFNLEdBQUssQ0FBTSxDQUNuQixDQUFDLENBQ0gsQ0FFQSxlQUFlLEdBQUssRUFBc0MsQ0FDeEQsSUFBTSxFQUFVLEVBQUssUUFBUSxFQUFPLFFBQVMsV0FBVyxFQUNsRCxFQUFlLEVBQUssUUFBUSxFQUFPLFFBQVMsUUFBUSxFQUNwRCxFQUFjLEVBQUcsV0FBVyxDQUFZLEVBQ3hDLENBQUUsUUFBUyxHQUFnQixFQUFRLENBQUMsQ0FBQyxFQUNyQyxFQUFzQyxDQUMxQyxHQUFHLEdBQ0gsYUFBYyxDQUNaLEtBQU0sR0FBaUIsQ0FBTSxDQUMvQixDQUNGLEVBeUJBLEdBeEJLLEdBQ0gsT0FBTyxFQUFTLFlBRWxCLE1BQU0sUUFBUSxJQUFJLENBQ2hCLEVBQUcsU0FBUyxVQUNWLEVBQUssS0FBSyxFQUFPLFFBQVMsY0FBYyxFQUN4QyxFQUFLLEtBQUssRUFBVSxDQUNsQixVQUFXLEdBQ1gsYUFBYyxHQUNkLE9BQVEsQ0FDTixTQUFVLE9BQ1osQ0FDRixDQUFDLENBQ0gsRUFDQSxFQUFHLFNBQVMsR0FBRyxFQUFTLENBQUUsTUFBTyxHQUFNLFVBQVcsRUFBSyxDQUFDLENBQzFELENBQUMsRUFDRyxJQUNGLE1BQU0sUUFBUSxJQUFJLENBQ2hCLEVBQUcsU0FBUyxHQUFHLEVBQWMsQ0FBRSxNQUFPLEdBQU0sVUFBVyxFQUFLLENBQUMsRUFDN0QsRUFBRyxTQUFTLEdBQUcsRUFBSyxRQUFRLEVBQU8sUUFBUyxlQUFlLEVBQUcsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUMvRSxDQUFDLEVBQ0QsRUFBVSxNQUFPLENBQUMsU0FBVSxVQUFXLGdCQUFnQixFQUFHLEVBQU8sT0FBTyxHQUd0RSxFQUFNLENBQ1IsSUFBTSxFQUFVLEdBQWlCLENBQU0sRUFDdkMsRUFBRyxVQUFVLEVBQUssS0FBSyxFQUFTLFVBQVUsRUFBRyxDQUFFLFVBQVcsRUFBSyxDQUFDLEVBQ2hFLE1BQU0sRUFBRyxTQUFTLFVBQVUsRUFBSyxLQUFLLEVBQVMsV0FBWSxVQUFVLEVBQUcsRUFBVTtFQUFNLENBQ3RGLEtBQU0sR0FDUixDQUFDLENBQ0gsQ0FDQSxJQUFNLEVBQW1CLEdBQUcsR0FBUSxVQUFVLE1BQU0sR0FBMEIsQ0FBTSxDQUFDLENBQUMsS0FBSztDQUFJLEVBQUUsSUFDakcsRUFBRyxVQUFVLEVBQUssS0FBSyxFQUFTLFlBQVksRUFBRyxDQUFFLFVBQVcsRUFBSyxDQUFDLEVBQ2xFLE1BQU0sRUFBRyxTQUFTLFVBQVUsRUFBSyxRQUFRLEVBQVMsYUFBYyxZQUFZLEVBQUcsRUFBa0IsQ0FDL0YsS0FBTSxHQUNSLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBaUIsRUFBK0IsQ0FDdkQsSUFBSSxFQUNKLEFBS0UsRUFMRSxFQUFPLE1BR0ssY0FFQSxFQUFPLFVBQVUsR0FBSyxlQUFpQixnQkFFdkQsSUFBTSxFQUFtQixHQUFHLEVBQVksVUFnQnhDLE9BZEksRUFBTyxZQUFZLFdBQVcsd0JBQXdCLEVBQ2pEOzs7Ozs7Ozs7O0VBVVQsRUFBaUI7RUFDakIsS0FBSyxFQUVFLENBQ1QsQ0FFQSxTQUFTLEdBQWlCLEVBQXNDLENBQzlELE9BQU8sR0FBa0IsS0FBSyxJQUFLLEdBQ2pDLEVBQUksT0FBUyxVQUNULENBQ0UsR0FBRyxFQUNILEtBQU0sR0FBZ0IsQ0FBTSxFQUM1QixJQUFLLEdBQWtCLENBQU0sQ0FDL0IsRUFDQSxDQUNOLENBQ0YsQ0FFQSxTQUFTLEdBQWdCLEVBQStCLENBR3RELElBQU0sRUFDSixFQUFPLE9BQVMsRUFBTyxVQUFVLElBQU0sRUFBZ0IsQ0FBTSxFQUFJLENBQUMsR0FBRyxFQUFXLFlBQVksRUFBSSxDQUFDLEVBV25HLE9BVkksRUFBa0IsQ0FBTSxHQUMxQixFQUFvQixLQUFLLEdBQUcsRUFBVyxNQUFPLEdBQUcsRUFBVyxNQUFNLEdBRWhFLEVBQU8sdUJBQXlCLEVBQU8sb0JBQ3pDLEVBQW9CLEtBQUssSUFBSSxFQUUzQixFQUFPLHdCQUNULEVBQW9CLEtBQUssTUFBTSxFQUcxQixTQURvQixDQUFDLEdBQUcsSUFBSSxJQUFJLENBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQzVCLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxFQUMvQyxDQUVBLFNBQVMsR0FBa0IsRUFBK0IsQ0FDeEQsR0FBSSxHQUFvQixDQUFNLEVBQzVCLE1BQU8sUUFBTyxHQUFHOzs7RUFHbkIsS0FBSyxFQUlMLElBQU0sRUFBeUIsRUFBa0IsQ0FBTSxHQUFLLEVBQWdCLENBQU0sRUFDbEYsSUFBSyxFQUFPLE9BQVMsRUFBTyxVQUFVLEtBQU8sRUFDM0MsTUFBTzs7RUFFVCxFQUFPLE1BQVEsU0FBVyxVQUFVO0VBQ3BDLEtBQUssRUFHTCxJQUFNLEVBQWdCLEVBQVcsT0FBTyxJQUFLLEdBQWMsT0FBTyxHQUFHLEtBQUssRUFBVSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFDMUYsRUFBZSxFQUFXLE1BQU0sSUFBSyxHQUFjLE9BQU8sR0FBRyxLQUFLLEVBQVUsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQ3hGLEVBQWtCLEVBQVcsYUFBYSxJQUFLLEdBQWMsT0FBTyxHQUFHLEtBQUssRUFBVSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFDbEcsRUFBWSxFQUFrQixDQUFNLEVBQ3BDLEVBQVUsRUFBZ0IsQ0FBTSxFQUV0QyxNQUFPLFFBQU8sR0FBRzs7RUFFakIsRUFBWSxPQUFPLEdBQUcsNERBQTRELEVBQWMsY0FBZ0IsR0FBRztFQUNuSCxFQUFZLE9BQU8sR0FBRywyREFBMkQsRUFBYSxpREFBbUQsR0FBRztFQUNwSixFQUFVLE9BQU8sR0FBRyw4REFBOEQsRUFBZ0IsY0FBZ0IsR0FBRzs7RUFFckgsR0FBd0IsQ0FBTSxFQUFJLE9BQU8sR0FBRywyRUFBNkUsR0FBRztFQUM1SCxFQUFPLHVCQUF5QixPQUFPLEdBQUcscUpBQXVKLEdBQUc7O0VBR3BNLEVBQ0ksT0FBTyxHQUFHOzs7O0VBS1YsR0FDTDtFQUVDLEVBQ0ksT0FBTyxHQUFHOztJQUdWLEdBQ0w7RUFFQyxFQUNJLE9BQU8sR0FBRzs7OztFQUtWLEdBQ0w7Ozs7RUFLQyxHQUF3QixDQUFNLEVBQzFCO0lBQ0YsR0FBZ0IsQ0FBTSxFQUFFO0lBQ3hCLEdBQWdCLENBQU0sRUFBRTtJQUN4QixHQUFnQixDQUFNLEVBQUU7SUFFdEIsR0FDTDtFQUVDLEVBQU8sdUJBQ0g7O0lBR0EsR0FDTDtFQUNDLEtBQUssQ0FDUCxDQUVBLFNBQVMsR0FBb0IsRUFBZ0MsQ0FDM0QsR0FBSSxDQUFDLEVBQU8sT0FBUSxNQUFPLEdBRTNCLElBQU0sRUFBeUIsRUFBSyxRQUFRLEVBQU8sUUFBUyxXQUFZLEtBQU0sY0FBYyxFQUM1RixHQUFJLENBQUMsRUFBRyxXQUFXLENBQXNCLEVBQUcsTUFBTyxHQUVuRCxHQUFJLENBRUYsT0FEb0IsS0FBSyxNQUFNLEVBQUcsYUFBYSxFQUF3QixNQUFNLENBQzVELENBQUMsQ0FBQyxPQUFTLGlCQUM5QixNQUFRLENBQ04sTUFBTyxFQUNULENBQ0YsQ0FFQSxTQUFTLEdBQTBCLEVBQWlDLENBQ2xFLElBQU0sRUFBOEIsQ0FBQyxFQUNyQyxHQUFJLEVBQU8sbUJBQW9CLENBQzdCLElBQU0sRUFBc0IsT0FBTyxHQUFHLHlEQUN0QyxFQUFrQixLQUFLLE9BQU8sR0FBRyxtQkFBbUIsRUFBb0IsaUJBQWlCLENBQzNGLENBQ0EsSUFBTSxFQUFpQixFQUFPLE1BQVEsY0FBZ0IsT0FDaEQsRUFBa0IsRUFBTyxVQUFVLE9BQVMsRUFBTyxVQUFVLEtBQU8sbUJBQXFCLEdBQy9GLEVBQWtCLEtBQUssT0FBTyxHQUFHLG1DQUFtQyxJQUFpQixFQUFnQixFQUFFLEVBQ25HLEVBQU8sdUJBQ1QsRUFBa0IsS0FBSyxPQUFPLEdBQUcsZ0RBQWdELEVBRS9FLEVBQU8sbUJBQ1QsRUFBa0IsS0FBSyxPQUFPLEdBQUcsOENBQThDLEVBRTdFLEVBQU8sVUFBVSxNQUNuQixFQUFrQixLQUNoQixPQUFPLEdBQUcsbUZBQ1YsT0FBTyxHQUFHLDZFQUNWLE9BQU8sR0FBRyxvRUFDWixFQUNTLEVBQU8sVUFBVSxRQUMxQixFQUFrQixLQUNoQixPQUFPLEdBQUcsd0VBQ1YsT0FBTyxHQUFHLHlFQUNaLEVBRUYsSUFBTSxFQUFtQixHQUFvQixFQUFRLEVBQU8sYUFBYSxPQUFPLEVBS2hGLE9BSkksR0FFRixFQUFrQixLQUFLLE9BQU8sR0FBRyx5Q0FBeUMsRUFBaUIsRUFBRSxFQUV4RixDQUNULENBRUEsU0FBUyxHQUF3QixFQUFnQyxDQUMvRCxPQUFPLEVBQU8sdUJBQXlCLEVBQU8saUJBQ2hELENBRUEsU0FBUyxHQUFnQixFQUFnRCxDQUN2RSxPQUFPLEVBQU8sa0JBQW9CLFNBQVcsWUFDL0MsQ0NwVkEsZUFBc0IsR0FBcUIsRUFBc0MsQ0FDL0UsT0FBTyxFQUFPLDBCQUEwQix1QkFBd0IsU0FBWSxDQUMxRSxNQUFNLFFBQVEsSUFBSSxDQUNoQixFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsR0FBRyxFQUFPLFFBQVEsb0JBQXFCLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUM1RixFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsR0FBRyxFQUFPLFFBQVEsbUJBQW9CLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUMzRixFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsR0FBRyxFQUFPLFFBQVEscUJBQXNCLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxDQUMvRixDQUFDLENBQ0gsQ0FBQyxDQUNILENDZEEsU0FBZ0IsR0FBdUIsRUFBaUQsQ0FDdEYsT0FBTyxHQUFTLEtBQUssQ0FDdkIsQ0NZQSxJQUFhLEdBQWIsS0FBaUMsQ0FDL0IsV0FFQSxhQUVBLFNBRUEsWUFBWSxFQUFxQyxDQUMvQyxLQUFLLFdBQWEsRUFBUSxXQUMxQixLQUFLLGFBQWUsRUFBUSxhQUM1QixLQUFLLFNBQVcsRUFBUSxRQUMxQixDQUVBLGlCQUFpQixFQUEwQyxDQUt6RCxPQUpLLEVBQVEsaUJBQ1QsS0FBSyxpQkFBaUIsRUFBUSxlQUFlLEVBQ3hDLEtBQUsscUJBQXFCLEVBQVEsZ0JBQWlCLEVBQVEsZUFBZ0IsRUFBUSxRQUFRLEVBRTdGLEVBQVEsY0FDakIsQ0FFQSxTQUFTLEVBQTRCLEVBQXlCLENBQzVELE1BQU8sR0FBRyxLQUFLLGVBQWUsQ0FBUyxFQUFFO0VBQzNDLEVBQVE7RUFDUixLQUFLLGFBQWEsQ0FBUyxHQUMzQixDQUVBLGlCQUFpQixFQUEwQixDQUN6QyxPQUFPLEtBQUssV0FBVyxLQUFNLEdBQWMsRUFBUSxTQUFTLEtBQUssZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUM3RixDQUVBLHFCQUE2QixFQUF5QixFQUF3QixFQUEwQixDQUN0RyxJQUFJLEVBQVUsRUFDZCxJQUFLLElBQU0sS0FBYSxLQUFLLFdBQVksQ0FDdkMsSUFBTSxFQUFjLEtBQUssb0JBQW9CLEVBQWdCLENBQVMsRUFDdEUsR0FBSSxDQUFDLEVBQWEsU0FFbEIsSUFBTSxFQUFjLEtBQUssb0JBQW9CLEVBQVMsRUFBVyxDQUFXLEVBQzVFLEdBQUksQ0FBQyxFQUVILE9BREEsUUFBUSxLQUFLLCtCQUErQixFQUFVLFlBQVksS0FBSyxTQUFTLFdBQVcsR0FBVSxFQUM5RixFQUVULEVBQVUsQ0FDWixDQUNBLE9BQU8sQ0FDVCxDQUVBLG9CQUE0QixFQUFpQixFQUFnRCxDQUMzRixPQUFPLEtBQUssc0JBQXNCLENBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBTyxDQUFDLEdBQUcsRUFDL0QsQ0FFQSxvQkFBNEIsRUFBaUIsRUFBNEIsRUFBeUMsQ0FDaEgsSUFBTSxFQUFVLEtBQUssc0JBQXNCLENBQVMsRUFDL0MsS0FBUSxLQUFLLENBQU8sRUFDekIsT0FBTyxFQUFRLFFBQVEsRUFBUyxDQUFXLENBQzdDLENBRUEsc0JBQThCLEVBQW9DLENBQ2hFLE9BQVcsT0FDVCxHQUFHQyxHQUFhLEtBQUssZUFBZSxDQUFTLENBQUMsRUFBRSxZQUFZQSxHQUFhLEtBQUssYUFBYSxDQUFTLENBQUMsR0FDdkcsQ0FDRixDQUVBLGVBQXVCLEVBQW9DLENBQ3pELE1BQU8saUJBQWlCLEtBQUssYUFBYSxHQUFHLEdBQy9DLENBRUEsYUFBcUIsRUFBb0MsQ0FDdkQsTUFBTyxlQUFlLEtBQUssYUFBYSxHQUFHLEdBQzdDLENBQ0YsRUFFQSxTQUFTQSxHQUFhLEVBQXVCLENBQzNDLE9BQU8sRUFBTSxXQUFXLHNCQUF1QixPQUFPLEdBQUcsS0FBSyxDQUNoRSxDQzdFQSxNQUFNQyxHQUFzQixJQUFJLEdBQW9CLENBQ2xELFdBQVksQ0FBQyxPQUFRLFFBQVEsRUFDN0IsYUFBYyxRQUNkLFNBQVUsT0FDWixDQUFDLEVBRUQsZUFBc0IsR0FBb0IsRUFBc0MsQ0FDOUUsT0FBTyxFQUFPLDBCQUEwQixzQkFBdUIsU0FBWSxDQUN6RSxJQUFNLEVBQXVCLEVBQUssUUFBUSxFQUFPLFFBQVMsZUFBZSxFQUNuRSxFQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsaUJBQWlCLEVBQ3pELEVBQWtCLE1BQU0sRUFBTyxzQkFBc0IsQ0FBUSxFQUM3RCxFQUFpQkEsR0FBb0IsaUJBQWlCLENBQzFELGVBQWdCQyxHQUFpQixDQUFNLEVBQ3ZDLGtCQUNBLFVBQ0YsQ0FBQyxFQUNLLEVBQVcsQ0FBQyxFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsRUFBc0IsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLENBQUMsRUFDMUYsR0FBdUIsQ0FBZSxJQUFNLEdBQXVCLENBQWMsR0FDbkYsRUFBUyxLQUFLLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxDQUFjLENBQUMsQ0FBQyxFQUVwRixNQUFNLFFBQVEsSUFBSSxDQUFRLENBQzVCLENBQUMsQ0FDSCxDQUVBLFNBQVNBLEdBQWlCLEVBQStCLENBbUJ2RCxPQWhCSyxFQUFPLGFBZ0JMLEdBQUdELEdBQW9CLFNBQzVCLE9BQ0E7Ozs7aURBS0YsRUFBRTs7RUFFRkEsR0FBb0IsU0FBUyxTQUFVLHFDQUFxQyxFQUFFO0VBeEJyRSxHQUFHQSxHQUFvQixTQUM1QixPQUNBOzs7Ozs7NkVBT0YsRUFBRTs7RUFFSkEsR0FBb0IsU0FBUyxTQUFVLHVDQUF1QyxFQUFFO0NBZWxGLENDckRBLE1BQU0sRUFBc0IsSUFBSSxHQUFvQixDQUNsRCxXQUFZLENBQUMsT0FBUSxRQUFRLEVBQzdCLGFBQWMsU0FDZCxTQUFVLFFBQ1osQ0FBQyxFQUVELGVBQXNCLEdBQXFCLEVBQXVCLEVBQTJDLENBQzNHLE9BQU8sRUFBTywwQkFBMEIsdUJBQXdCLFNBQVksQ0FJMUUsSUFBTSxFQUFzQyxHQUFxQyxDQUFNLEVBQ2pGLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxrQkFBa0IsRUFDMUQsRUFBa0IsTUFBTSxFQUFPLHNCQUFzQixDQUFRLEVBRzdELEVBREosR0FBdUMsR0FBbUIsQ0FBQyxFQUFvQixpQkFBaUIsQ0FBZSxFQUU3RyxFQUNBLEdBQ0UsRUFBb0IsaUJBQWlCLENBQ25DLGVBQWdCLEdBQWlCLENBQU0sRUFDdkMsa0JBQ0EsVUFDRixDQUFDLENBQ0gsRUFFRSxFQUE0QixDQUFDLEVBQzlCLEdBQ0gsRUFBUyxLQUNQLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLGdCQUFnQixFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUNyRyxFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsRUFBSyxRQUFRLEVBQU8sUUFBUyxZQUFZLEVBQUcsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLEVBQ2pHLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLGFBQWEsRUFBRyxDQUFFLE1BQU8sRUFBSyxDQUFDLENBQUMsRUFDbEcsRUFBWSxRQUFVLEVBQUcsU0FBUyxHQUFHLEVBQUssUUFBUSxFQUFPLFFBQVMsV0FBVyxFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUNoRyxFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsRUFBSyxRQUFRLEVBQU8sUUFBUyxlQUFlLEVBQUcsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLEVBQ3BHLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLGNBQWMsRUFBRyxDQUFFLE1BQU8sRUFBSyxDQUFDLENBQUMsRUFDbkcsRUFBWSxRQUFVLEVBQUcsU0FBUyxHQUFHLEVBQUssUUFBUSxFQUFPLFFBQVMsZ0JBQWdCLEVBQUcsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLEVBQ3JHLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLGdCQUFnQixFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUNyRyxFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsRUFBSyxRQUFRLEVBQU8sUUFBUyxlQUFlLEVBQUcsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLEVBQ3BHLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLG1CQUFtQixFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUN4RyxFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsRUFBSyxRQUFRLEVBQU8sUUFBUyxrQkFBa0IsRUFBRyxDQUFFLE1BQU8sRUFBSyxDQUFDLENBQUMsRUFDdkcsRUFBWSxRQUFVLEVBQUcsU0FBUyxHQUFHLEVBQUssUUFBUSxFQUFPLFFBQVMsbUJBQW1CLEVBQUcsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLEVBQ3hHLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLGtCQUFrQixFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxDQUN6RyxFQUVFLEdBQXVCLENBQWUsSUFBTSxHQUF1QixDQUFjLEdBQ25GLEVBQVMsS0FBSyxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBYyxDQUFDLENBQUMsRUFFcEYsTUFBTSxRQUFRLElBQUksQ0FBUSxDQUM1QixDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQThCLEVBQXlCLENBQzlELE9BQU8sRUFBUSxXQUFXLHdCQUF5Qix1QkFBdUIsQ0FDNUUsQ0FFQSxTQUFTLEdBQWlCLEVBQStCLENBQ3ZELElBQU0sRUFBZSxFQUFPLE9BQ3RCLEVBQXlCLEdBQTBCLENBQU0sRUFzQi9ELE9BaEJLLEVBQU8sYUFnQkwsR0FBRyxFQUFvQixTQUM1QixPQUNBOztnQ0FFNEIsRUFBdUI7O0VBRXJELEdBQXlCLG1CQUFvQixDQUFZLEdBQ3pELEVBQUU7O0VBRUYsRUFBb0IsU0FBUyxTQUFVLHNDQUFzQyxFQUFFO0VBeEJ0RSxHQUFHLEVBQW9CLFNBQzVCLE9BQ0E7Ozs7OztFQU1KLEdBQXlCLCtDQUFnRCxDQUFZLEdBQ25GLEVBQUU7O0VBRUosRUFBb0IsU0FBUyxTQUFVLHdDQUF3QyxFQUFFO0NBZW5GLENBRUEsU0FBUyxHQUEwQixFQUErQixDQUNoRSxPQUFPLEVBQU8sYUFBYSxPQUFTLDZCQUErQixlQUFpQiw0QkFDdEYsQ0FFQSxTQUFTLEdBQXlCLEVBQXdCLEVBQStCLENBVXZGLE9BVEksRUFDSzs7NkRBRWtELEVBQWU7Ozt1R0FNbkU7Ozs2REFHb0QsRUFBZTtxQ0FFNUUsQ0NwR0EsZUFBc0IsR0FBdUIsRUFBc0MsQ0FDakYsT0FBTyxFQUFPLDBCQUEwQix5QkFBMEIsU0FBWSxDQUM1RSxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxpQkFBaUIsRUFDL0QsR0FBSSxDQUFDLEVBQWdCLENBQU0sRUFBRyxDQUM1QixNQUFNLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFVLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUNyRSxNQUNGLENBQ0EsSUFBTSxFQUFXLE1BQU0sRUFBTyxzQkFBc0IsQ0FBUSxHQUFNLEdBQzVELEVBQWtCLEVBQWUsbUJBQW1CLENBQU8sRUFDM0QsRUFBa0IsRUFBZSxtQkFBbUIsQ0FBTyxFQUUzRCxFQUFvQixFQUFLLFFBQVEsRUFBTyxRQUFTLFlBQVksRUFDN0QsRUFBb0IsTUFBTSxFQUFlLCtCQUErQixDQUFpQixHQUFNLEdBRWpHLEVBQW9CLEdBQ3BCLEVBQU8seUJBQ1QsRUFBb0I7Ozs7R0FPdEIsSUFBTSxFQUFhLEVBQWtCOzs7Ozs7Ozs7OztFQUFnQixFQUFvQixFQUFtQixFQUM1RixNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxDQUFVLENBQUMsQ0FDdkUsQ0FBQyxDQUNILENDdENBLE1BQU1FLEdBQVUsQ0FDZCxTQUFVLElBQ1YsS0FBTSxPQUNSLEVBRUEsZUFBc0IsR0FBMEIsRUFBc0MsQ0FDcEYsT0FBTyxFQUFPLDBCQUEwQiw0QkFBNkIsU0FBWSxDQUMvRSxJQUFJLEVBQXNCLGdCQUFnQkEsRUFBTyxFQUMzQyxFQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsb0JBQW9CLEVBQ2xFLEdBQUksQ0FDRixJQUFNLEVBQWEsTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFVLE1BQU0sRUFDeEQsRUFBYyxLQUFLLE1BQU0sQ0FBVSxFQUN6QyxFQUFjLEVBQU0sSUFBSSxDQUFDLEVBQWEsRUFBYSxDQUFXLEVBQUcsQ0FBRSxXQUFZLENBQWUsQ0FBQyxDQUNqRyxNQUFRLENBRVIsQ0FDQSxJQUFNLEVBQWEsS0FBSyxVQUFVLEVBQWEsSUFBQSxHQUFXLENBQUMsRUFDM0QsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBVSxDQUFDLENBQ3ZFLENBQUMsQ0FDSCxDQ25CQSxlQUFzQixHQUFpQixFQUFzQyxDQUMzRSxPQUFPLEVBQU8sMEJBQTBCLG1CQUFvQixTQUFZLENBQ3RFLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLGdCQUFnQixFQUN4RCxFQUFVLE1BQU0sRUFBTyxzQkFBc0IsQ0FBUSxFQUMzRCxHQUFJLENBQUMsRUFBUyxPQUVkLElBQU0sRUFBYSxFQUFRLFFBQVEsZUFBZ0I7O2NBQW1CLEVBQ2xFLElBQWUsR0FFbkIsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBVSxDQUFDLENBQ3ZFLENBQUMsQ0FDSCxDQ1hBLGVBQXNCLEdBQWUsRUFBc0MsQ0FDekUsT0FBTyxFQUFPLDBCQUEwQixpQkFBa0IsU0FBWSxDQUNwRSxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxXQUFXLEVBQ3JELEVBQWEsTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFVLE1BQU0sRUFFeEQsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsaUJBQWlCLENBQUMsSUFDL0QsRUFBYSxHQUFZLEVBQVksdUtBQW9CLEdBRzNELElBQU0sRUFBYSxFQUFPLFlBQVksTUFBTSxFQUFPLFdBQVcsUUFBUSxHQUFHLEVBQUksQ0FBQyxFQUN4RSxFQUFnQixFQUFLLFFBQVEsRUFBTyxRQUFTLFVBQVcsV0FBVyxFQUNuRSxFQUFZLEVBQUcsV0FBVyxDQUFhLEVBQUksRUFBRyxZQUFZLENBQWEsRUFBSSxDQUFDLEVBQ2xGLElBQUssSUFBTSxLQUFZLEVBQVcsQ0FDaEMsR0FBSSxDQUFDLEVBQVMsV0FBVyxNQUFNLEdBQUssQ0FBQyxFQUFTLFdBQVcsUUFBUSxFQUFHLFNBRXBFLElBQUksRUFBWSxFQUdoQixHQUZBLEdBQWEsRUFBVSxJQUFNLEdBQUEsQ0FBSSxZQUFZLEVBQUksRUFBVSxNQUFNLEVBQUcsRUFBVSxRQUFRLEdBQUcsQ0FBQyxFQUMxRixFQUFZLEVBQVUsUUFBUSxJQUFLLEdBQUcsRUFDbEMsQ0FBQyxFQUFZLFNBQ2pCLElBQU0sRUFBUSxNQUFNLEVBQVUsdUJBQXVCLEVBQVcscUJBQXFCLEVBQVMsa0NBQWtDLEVBQVcscUJBQXFCLEVBQVMsR0FDckssRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMscUJBQXFCLEdBQVUsQ0FBQyxJQUM3RSxFQUFhLEdBQXlCLEVBQVksRUFBVyxDQUFRLEVBQ3JFLEVBQWEsR0FBWSxFQUFZLENBQUssRUFFOUMsQ0FFQSxNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxDQUFVLENBQUMsQ0FDdkUsQ0FBQyxDQUNILENBRUEsU0FBZ0IsR0FBWSxFQUFnQixFQUF1QixDQUVqRSxFQUFTLEVBQU8sUUFBUSxFQUFPLEVBQUUsQ0FBQyxDQUFDLFdBQVcsV0FBWTs7Q0FBTSxFQUVoRSxJQUFLLElBQUksRUFBSSxFQUFHLEVBQUksRUFBTyxPQUFRLElBQ2pDLEdBQUksRUFBTyxFQUFJLEtBQU87R0FBUSxFQUFPLEtBQU87RUFBTSxDQUNoRCxJQUFNLEVBQVMsRUFBTyxNQUFNLEVBQUcsRUFBSSxDQUFDLEVBQ2hDLEVBQVEsRUFBTyxNQUFNLEVBQUksQ0FBQyxFQUk5QixNQUhJLENBQUMsRUFBTSxXQUFXLEdBQUcsR0FBSyxDQUFDLEVBQU0sV0FBVyxHQUFHLElBQ2pELEVBQVEsS0FBSyxLQUVSLEdBQUcsSUFBUyxFQUFNLElBQUksR0FDL0IsQ0FFRixNQUFPLEdBQUcsRUFBTyxJQUFJLEVBQU0sR0FDN0IsQ0FFQSxTQUFnQixHQUF5QixFQUFnQixFQUFtQixFQUEwQixDQUNwRyxJQUFNLEVBQW1CLEdBQWEsQ0FBUyxFQUN6QyxFQUFrQixHQUFhLENBQVEsRUFDN0MsT0FBTyxFQUNKLFdBQ0MsSUFBSSxPQUNGLE9BQU8sR0FBRyxRQUFRLEVBQWlCLDhEQUE4RCxFQUFnQiwyRUFBMkUsRUFBZ0IsT0FDNU0sSUFDRixFQUNBLEVBQ0YsQ0FBQyxDQUNBLFdBQVcsV0FBWTs7Q0FBTSxDQUNsQyxDQUVBLFNBQVMsR0FBYSxFQUF1QixDQUMzQyxPQUFPLEVBQU0sV0FBVyxzQkFBdUIsT0FBTyxHQUFHLEtBQUssQ0FDaEUsQ0MvREEsZUFBc0IsR0FBa0IsRUFBMEMsQ0FDaEYsT0FBTyxFQUFPLDBCQUEwQixvQkFBcUIsU0FBWSxDQUN2RSxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQVcsUUFBUyxpQkFBaUIsRUFDbkUsR0FBSSxDQUFDLEVBQUcsV0FBVyxDQUFRLEVBQUcsT0FFOUIsSUFBTSxFQUFXLEtBQUssTUFBTSxNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQVUsTUFBTSxDQUFDLEVBR2xFLEVBQVUsRUFBUyxTQUFXLENBQUMsRUFDckMsSUFBSyxJQUFJLEVBQUksRUFBRyxFQUFJLEVBQVEsT0FBUSxJQUFLLENBQ3ZDLElBQU0sRUFBYyxFQUFRLEdBQ3RCLEVBQVUsTUFBTSxRQUFRLENBQVcsRUFDbkMsRUFBUyxFQUFVLEVBQVksR0FBSyxFQUNwQyxFQUFhLEdBQVcsRUFBWSxJQUFPLENBQUMsRUFDOUMsSUFBVyxvQ0FDYixFQUFRLEdBQUssQ0FDWCxvQ0FDQSxFQUFNLElBQ0osQ0FDRSxFQUNBLENBQ0UsT0FBUSxxQkFDVixDQUNGLEVBQ0EsQ0FBRSxXQUFZLENBQWUsQ0FDL0IsQ0FDRixFQUNTLElBQVcsNkJBQ3BCLEVBQVEsR0FBSyxDQUNYLDJCQUNBLEVBQU0sSUFDSixDQUNFLEVBQ0EsQ0FFRSx3QkFBeUIsR0FDekIscUJBQXNCLEdBQ3RCLE9BQVEsQ0FBQyxxQkFBcUIsRUFDOUIsZUFBZ0IsQ0FBQyxxQkFBcUIsQ0FDeEMsQ0FDRixFQUNBLENBQUUsV0FBWSxDQUFlLENBQy9CLENBQ0YsRUFFSixDQUNBLElBQU0sRUFBYSxLQUFLLFVBQVUsRUFBVSxJQUFBLEdBQVcsQ0FBQyxFQUN4RCxNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxDQUFVLENBQUMsQ0FDdkUsQ0FBQyxDQUNILENDakRBLE1BQU0sR0FBVSxDQUNkLFFBQVMsb0RBQ1QsUUFBUyxDQUFDLHVEQUF1RCxDQUNuRSxFQU9BLGVBQXNCLEdBQXFCLEVBQXNDLENBQy9FLE9BQU8sRUFBTywwQkFBMEIsdUJBQXdCLFNBQVksQ0FDMUUsSUFBSSxFQUFjLGdCQUFnQixFQUFPLEVBQ25DLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxlQUFlLEVBQzdELEdBQUksRUFBRyxXQUFXLEdBQUcsRUFBUyxFQUFFLEVBRTlCLE9BRUYsR0FBSSxDQUNGLElBQU0sRUFBYSxNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQVUsTUFBTSxFQUN4RCxFQUFjLEtBQUssTUFBTSxDQUFVLEVBQ3pDLEVBQWMsRUFBTSxJQUFJLENBQUMsRUFBYSxFQUFhLENBQVcsRUFBRyxDQUMvRCxXQUFZLENBQ2QsQ0FBQyxFQUNELEVBQVksUUFBVSxHQUFxQixHQUFRLFFBQVMsRUFBWSxTQUFXLENBQUMsQ0FBQyxDQUN2RixNQUFRLENBRVIsQ0FHSSxFQUFPLFVBQVUsUUFDbkIsRUFBWSxlQUFpQixDQUFDLEVBRTNCLEVBQVksYUFBYSxLQUFNLEdBQzlCLEVBQUssbUJBQW1CLFNBQVMsTUFBTSxDQUN6QyxHQUVBLEVBQVksYUFBYSxLQUFLLENBQUUsa0JBQW1CLENBQUMsTUFBTSxFQUFHLFFBQVMsRUFBTSxDQUFDLEdBSWpGLE1BQU0sRUFBWSxRQUFVLEVBQUcsU0FBUyxHQUFHLEVBQUssUUFBUSxFQUFPLFFBQVMsYUFBYSxFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUN4RyxNQUFNLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLGtCQUFrQixFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUM3RyxJQUFNLEVBQWEsS0FBSyxVQUFVLEVBQWEsSUFBQSxHQUFXLENBQUMsRUFDM0QsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBVSxDQUFDLENBQ3ZFLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBcUIsRUFBNEIsRUFBcUMsQ0FDN0YsTUFBTyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFrQixHQUFHLENBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFRLEdBQVMsSUFBUyxjQUFjLENBQ3pHLENDMURBLGVBQXNCLEdBQW1CLEVBQTJDLENBQ2xGLE9BQU8sRUFBTywwQkFBMEIscUJBQXNCLFNBQVksQ0FHMUUsQ0FBQyxDQUNILENDTUEsTUFBTSxHQUFjLENBQ2xCLGdCQUFpQixDQUNmLGFBQWMsR0FDZCx5QkFBMEIsR0FDMUIsNkJBQThCLEdBQzlCLGdCQUFpQixHQUNqQixrQkFBbUIsR0FDbkIsY0FBZSxHQUNmLE9BQVEsRUFDVixFQUNBLFFBQVMsQ0FBQywyQkFBNEIsZUFBZSxFQUNyRCxRQUFTLENBQ1AsY0FDQSx5QkFDQSwwQkFDQSxzQkFDQSx1QkFDQSxlQUNBLFdBQ0EsV0FDRixDQUNGLEVBRU0sR0FBYSxDQUNqQixnQkFBaUIsQ0FDZixhQUFjLEdBQ2QseUJBQTBCLEdBQzFCLDZCQUE4QixHQUM5QixnQkFBaUIsR0FDakIsa0JBQW1CLEdBQ25CLGNBQWUsR0FDZixPQUFRLEVBQ1YsRUFDQSxRQUFTLENBQUMsZUFBZSxFQUd6QixRQUFTLENBQUMsY0FBZSxlQUFnQixXQUFZLFdBQVcsQ0FDbEUsRUFFQSxlQUFzQixHQUFpQixFQUFzQyxDQUMzRSxPQUFPLEVBQU8sMEJBQTBCLG1CQUFvQixTQUFZLENBQ3RFLEdBQUksRUFBTyxVQUFVLE9BQVMsRUFBTyxVQUFVLEtBQU0sQ0FDbkQsTUFBTSxHQUFvQyxDQUFNLEVBQ2hELE1BQ0YsQ0FFQSxJQUFJLEVBQWMsZ0JBQWdCLEVBQU8sT0FBUyxHQUFjLEVBQVUsRUFDcEUsRUFBaUIsR0FBa0IsQ0FBTSxFQUMvQyxFQUFZLFFBQVUsR0FBbUIsQ0FBTSxFQUMvQyxFQUFZLGtCQUFvQixDQUFDLEVBQ2pDLEVBQVksZ0JBQWdCLFFBQVUsR0FBVyxDQUFNLEVBQ25ELEVBQWUsT0FBUyxJQUMxQixFQUFZLGdCQUFrQixDQUFFLEdBQUcsRUFBWSxnQkFBaUIsTUFBTyxDQUFlLEdBRXBGLENBQUMsRUFBTyxxQkFBdUIsQ0FBQyxFQUFPLDhCQUN6QyxPQUFPLEVBQVksaUJBQWlCLElBQzNCLENBQUMsRUFBTyxPQUFTLENBQUMsRUFBTyxVQUFVLGNBQzVDLEVBQVksZ0JBQWtCLENBQUUsR0FBRyxFQUFZLGdCQUFpQixJQUFLLFdBQVksR0FFL0UsRUFBTyxRQUFVLENBQUMsRUFBTyw2QkFDM0IsRUFBWSxRQUFVLEVBQVksU0FBUyxPQUFRLEdBQW9CLENBQUMsRUFBUSxXQUFXLGFBQWEsQ0FBQyxFQUN6RyxFQUFZLFFBQVUsRUFBWSxTQUFTLE9BQVEsR0FBb0IsQ0FBQyxFQUFRLFdBQVcsYUFBYSxDQUFDLEdBRXZHLEVBQU8sVUFBVSxRQUduQixHQUFlLEVBQWEsYUFBYSxFQUczQyxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxlQUFlLEVBQzdELEdBQUksQ0FDRixJQUFNLEVBQWtCLE1BQU0sRUFBRyxTQUFTLFNBQVMsRUFBVSxNQUFNLEVBQzdELEVBQWMsS0FBSyxNQUFNLENBQWUsRUFDeEMsRUFBZ0IsR0FBcUIsRUFBWSxpQkFBaUIsS0FBSyxFQUN2RSxFQUF1QixHQUF5QixFQUFZLGVBQWUsRUFDakYsRUFBWSxRQUFVLEdBQXFCLEVBQVksUUFBUyxFQUFZLE9BQU8sRUFDbkYsT0FBTyxFQUFZLFFBQ25CLE9BQU8sRUFBWSxpQkFBaUIsSUFDcEMsRUFBYyxFQUFNLElBQUksQ0FBQyxFQUFhLEVBQWEsQ0FBVyxFQUFHLENBQUUsV0FBWSxFQUFhLENBQUMsRUFDN0YsRUFBWSxRQUFVLEVBQVksU0FBUyxPQUN4QyxHQUNDLENBQUMsRUFBUSxTQUFTLFFBQVEsR0FBSyxDQUFDLEVBQVEsU0FBUyxZQUFZLEdBQUssQ0FBQyxFQUFRLFNBQVMsUUFBUSxDQUNoRyxFQUNBLEVBQVksa0JBQW9CLENBQUMsRUFPakMsRUFBWSxnQkFBa0IsQ0FBRSxHQUFHLEVBQVksZ0JBQWlCLEdBQUcsQ0FBcUIsRUFDeEYsR0FBbUMsRUFBWSxlQUFlLEVBRTlELElBQU0sRUFBYyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFvQixFQUFlLENBQWMsRUFBRyxHQUFHLENBQWMsQ0FBQyxDQUFDLEVBQ3ZHLEVBQVksT0FBUyxFQUN2QixFQUFZLGdCQUFnQixNQUFRLEVBRXBDLE9BQU8sRUFBWSxnQkFBZ0IsTUFFakMsR0FBc0IsQ0FBYyxHQUN0QyxPQUFPLEVBQVksZ0JBQWdCLFNBRXZDLE1BQVEsQ0FFUixDQUNBLEVBQVMsQ0FBVyxFQUNwQixFQUFZLFNBQVMsS0FBSyxFQUUxQixPQUFPLEVBQVksaUJBQWlCLHVCQUlwQyxPQUFPLEVBQVksaUJBQWlCLFFBQ3BDLEdBQTJCLEVBQVksZ0JBQWlCLENBQU0sRUFDOUQsR0FBa0MsRUFBWSxnQkFBaUIsQ0FBTSxFQUNqRSxFQUFPLFVBQVUsYUFDbkIsT0FBTyxFQUFZLGlCQUFpQixxQkFFdEMsSUFBTSxFQUFhLEtBQUssVUFBVSxFQUFhLElBQUEsR0FBVyxDQUFDLEVBQzNELE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVLENBQVUsQ0FBQyxDQUN2RSxDQUFDLENBQ0gsQ0FFQSxlQUFlLEdBQW9DLEVBQXNDLENBQ3ZGLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLGVBQWUsRUFDN0QsR0FBSSxDQUNGLElBQU0sRUFBVyxLQUFLLE1BQU0sTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFVLE1BQU0sQ0FBQyxFQUN4RSxHQUFvQyxDQUFRLEVBQzVDLEdBQWlDLEVBQVMsZUFBZSxFQUN6RCxHQUFxQyxDQUFRLEVBQzdDLE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVLEtBQUssVUFBVSxFQUFVLElBQUEsR0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNuRyxNQUFRLENBR1IsQ0FDRixDQUVBLFNBQVMsR0FBcUMsRUFBOEIsQ0FHckUsRUFBUyxVQUNWLEVBQVMsUUFBUSxTQUFTLGNBQWMsSUFFNUMsRUFBUyxRQUFRLEtBQUssY0FBYyxFQUNwQyxFQUFTLFFBQVEsS0FBSyxHQUN4QixDQUVBLFNBQVMsR0FBb0MsRUFBOEIsQ0FDekUsSUFBTSxFQUFrQixFQUFTLGdCQUNqQyxHQUFJLENBQUMsRUFBaUIsT0FDdEIsSUFBTSxFQUFtQixHQUFpQixFQUFnQixnQkFBZ0IsR0FDdEUsSUFBcUIsUUFBVSxJQUFxQixVQUFZLElBQXFCLElBQUEsTUFDbkYsRUFBUyxRQUdYLE9BQU8sRUFBZ0IsaUJBSXZCLEVBQWdCLGlCQUFtQixVQUd6QyxDQUVBLFNBQVMsR0FBaUMsRUFBaUUsQ0FDcEcsT0FLTCxPQUFPLEVBQWdCLFFBQ2xCLEVBQWdCLE9BRXJCLElBQUssR0FBTSxDQUFDLEVBQU8sS0FBWSxPQUFPLFFBQVEsRUFBZ0IsS0FBSyxFQUNqRSxFQUFnQixNQUFNLEdBQVMsR0FBMEIsQ0FBTyxDQUVwRSxDQUVBLFNBQVMsR0FBMEIsRUFBNkIsQ0FDOUQsT0FBTyxFQUFRLElBQUssR0FDZCxFQUFPLFdBQVcsSUFBSSxHQUFLLEVBQU8sV0FBVyxLQUFLLEdBQUssRUFBSyxXQUFXLENBQU0sRUFBVSxFQUNwRixLQUFLLEdBQ2IsQ0FDSCxDQUVBLFNBQVMsR0FBVyxFQUErQixDQUVqRCxPQURJLEVBQU8sT0FBZSxJQUNuQixFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxLQUFNLEtBQU0sY0FBYyxDQUFDLEVBQUksUUFBVSxHQUM3RixDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ3lCLENBQ3pCLElBQU0sRUFBZ0IsQ0FBQyxHQUFHLEdBQWlCLENBQWdCLEVBQUcsR0FBRyxHQUFpQixDQUFlLENBQUMsRUFDNUYsRUFBZ0IsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFhLENBQUMsRUFDNUMsS0FBYyxTQUFXLEVBRTdCLE9BREksRUFBYyxTQUFXLEVBQVUsRUFBYyxHQUM5QyxDQUNULENBRUEsU0FBUyxHQUFlLEVBQXdCLEVBQXVCLENBQ3JFLEVBQVMsVUFBWSxDQUFDLEVBQ2pCLEVBQVMsUUFBUSxTQUFTLENBQU8sR0FDcEMsRUFBUyxRQUFRLEtBQUssQ0FBTyxDQUVqQyxDQUVBLFNBQVMsR0FBaUIsRUFBMEMsQ0FFbEUsT0FESyxFQUNFLE1BQU0sUUFBUSxDQUFLLEVBQUksRUFBUSxDQUFDLENBQUssRUFEekIsQ0FBQyxDQUV0QixDQUVBLFNBQVMsR0FBcUIsRUFBMEIsQ0FHdEQsT0FGSSxPQUFPLEdBQVUsU0FBaUIsQ0FBQyxDQUFLLEVBQ3ZDLE1BQU0sUUFBUSxDQUFLLEVBQ2pCLEVBQU0sT0FBUSxHQUF5QixPQUFPLEdBQVMsUUFBUSxFQURwQyxDQUFDLENBRXJDLENBRUEsU0FBUyxHQUFzQixFQUE4QixDQUczRCxPQUFPLEVBQVUsS0FBTSxHQUFhLElBQWEsV0FBYSxFQUFTLFNBQVMsR0FBRyxDQUFDLENBQ3RGLENBRUEsU0FBUyxHQUFvQixFQUF5QixFQUFvQyxDQUN4RixJQUFNLEVBQW1CLElBQUksSUFBSSxDQUFjLEVBQy9DLE9BQU8sRUFBYyxPQUFRLEdBSTNCLEVBQUksR0FBMEIsQ0FBUSxHQUFLLENBQUMsRUFBaUIsSUFBSSxDQUFRLEVBRTFFLENBQ0gsQ0FFQSxTQUFTLEdBQTBCLEVBQTJCLENBQzVELE9BQU8sSUFBYSxXQUFhLElBQWEsUUFBVSxJQUFhLFNBQVcsSUFBYSxnQkFDL0YsQ0FFQSxTQUFTLEdBQW1DLEVBQWlFLENBQ3RHLElBQ0QsRUFBZ0IsU0FBVyxJQUFTLEVBQWdCLHNCQUF3QixLQUloRixFQUFnQixnQ0FBa0MsSUFDcEQsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUNNLENBQ04sR0FBSSxDQUFDLEVBQWlCLE9BR3RCLElBQU0sRUFBbUIsR0FBaUIsRUFBZ0IsZ0JBQWdCLEVBTTFFLElBSEksSUFBcUIsUUFBVSxJQUFxQixXQUN0RCxPQUFPLEVBQWdCLGlCQUVyQixFQUFPLE9BQVMsRUFBTyxVQUFVLFlBQWEsT0FFbEQsR0FBSSxFQUFPLFVBQVUsTUFBUSxFQUFPLFVBQVUsTUFBTyxDQUsvQyxJQUFxQixZQUN2QixFQUFnQixpQkFBbUIsV0FFckMsSUFBTSxFQUFhLEdBQWlCLEVBQWdCLE1BQU0sR0FJdEQsSUFBZSxJQUFBLElBQWMsSUFBZSxZQUFjLENBQUMsRUFBVyxXQUFXLElBQUksS0FDdkYsRUFBZ0IsT0FBUyxVQUUzQixNQUNGLENBRUksSUFBcUIsV0FHdkIsT0FBTyxFQUFnQixpQkFHekIsSUFBTSxFQUFhLEdBQWlCLEVBQWdCLE1BQU0sR0FDdEQsSUFBZSxZQUFjLEdBQVksV0FBVyxJQUFJLElBRzFELE9BQU8sRUFBZ0IsTUFFM0IsQ0FFQSxTQUFTLEdBQWlCLEVBQW9DLENBQzVELE9BQU8sT0FBTyxHQUFVLFNBQVcsRUFBTSxZQUFZLEVBQUksSUFBQSxFQUMzRCxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ00sQ0FDRixDQUFDLEdBQW1CLEVBQU8sT0FBUyxFQUFPLFVBQVUsYUFBZSxFQUFPLGVBRTNFLEVBQWdCLFFBQVEsWUFBWSxJQUFNLGFBSTVDLEVBQWdCLE9BQVMsVUFFM0IsRUFBZ0IscUJBQXVCLEdBQ3pDLENBRUEsU0FBUyxHQUNQLEVBQ29HLENBQ3BHLElBQU0sRUFBYyxDQUFDLEVBSXJCLElBQUssSUFBTSxJQUFPLENBQUMsY0FBZSxpQkFBa0IsV0FBVyxFQUFZLENBQ3pFLElBQU0sRUFBUSxJQUFrQixHQUM1QixJQUFVLElBQUEsS0FDWixFQUFZLEdBQU8sRUFFdkIsQ0FDQSxPQUFPLENBQ1QsQ0FFQSxTQUFTLEdBQWtCLEVBQWlDLENBQzFELElBQU0sRUFBWSxJQUFJLElBQ2hCLEVBQWUsQ0FDbkIsR0FBRyxFQUFPLGFBQWEsYUFDdkIsR0FBRyxFQUFPLGFBQWEsZUFDekIsRUF5QkEsT0F2QkksRUFBTyxNQUNULEVBQVUsSUFBSSxLQUFLLEVBQ1QsRUFBTyxVQUFVLGFBQzNCLEVBQVUsSUFBSSxNQUFNLEdBR3BCLEVBQWEsTUFDYixFQUFhLGtCQUNiLEVBQWEsMkJBQ2IsRUFBYSxhQUViLEVBQVUsSUFBSSxNQUFNLEVBRWxCLEVBQWEsUUFDZixFQUFVLElBQUksZ0JBQWdCLEVBRTVCLEVBQWEsT0FDZixFQUFVLElBQUksT0FBTyxFQUVuQixFQUFhLFNBQ2YsRUFBVSxJQUFJLFNBQVMsRUFHbEIsQ0FBQyxHQUFHLENBQVMsQ0FDdEIsQ0M3V0EsTUFBTSxHQUFzQixDQUMxQixxQkFDQSwyQkFDQSxxQkFDQSxZQUNBLGFBQ0EsWUFDRixFQUVBLGVBQXNCLEdBQXVCLEVBQXNDLENBQ2pGLE9BQU8sRUFBTywwQkFBMEIseUJBQTBCLFNBQVksQ0FDNUUsR0FBSSxDQUNGLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLFVBQVcsZUFBZSxFQUNsRSxFQUFrQixNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQVUsTUFBTSxFQUMvRCxFQUFXLEtBQUssTUFBTSxDQUFlLEVBQ3pDLElBQUssSUFBTSxLQUFzQixHQUMvQixFQUFXLEVBQU0sSUFBSSxDQUFDLEVBQVUsR0FBZSxDQUFrQixDQUFDLENBQUMsR0FFakUsRUFBTyx1QkFBeUIsRUFBTyxxQkFDekMsRUFBVyxFQUFNLElBQUksQ0FBQyxFQUFVLEdBQWUsYUFBYSxDQUFDLENBQUMsR0FFNUQsRUFBTyxVQUFVLE9BQ25CLEVBQVcsRUFBTSxJQUFJLENBQUMsRUFBVSxHQUFlLGFBQWEsQ0FBQyxDQUFDLEdBSTVELDZCQUE4QixHQUNoQyxPQUFPLEVBQVMsNEJBRWQsd0JBQXlCLEdBQzNCLE9BQU8sRUFBUyx1QkFFbEIsRUFBUyxDQUFtQyxFQUM1QyxJQUFNLEVBQWEsS0FBSyxVQUFVLEVBQVUsSUFBQSxHQUFXLENBQUMsRUFDeEQsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBVSxDQUFDLENBQ3ZFLE1BQVEsQ0FFUixDQUNGLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBZSxFQUFvQyxDQUMxRCxNQUFPLENBQ0wsdUJBQXdCLEVBQ3JCLEdBQXFCLEVBQ3hCLENBQ0YsQ0FDRixDQ3BEQSxlQUFzQixHQUFZLEVBQXNDLENBQ3RFLE9BQU8sRUFBTywwQkFBMEIsY0FBZSxTQUFZLENBQ2pFLEdBQU0sQ0FBQyxFQUFPLEdBQVEsRUFBVyxjQUFjLEVBQU8sWUFBYyxFQUFFLEVBR3RFLEdBRkksQ0FBQyxHQUFTLENBQUMsR0FDWCxJQUFVLGVBQWlCLElBQVUsa0JBQ3JDLENBQUMsR0FBZSxDQUFLLEVBQUcsT0FFNUIsSUFBTSxFQUFVLEdBQVcsQ0FBSyxFQUVoQyxHQUFJLENBQ0YsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLHdCQUF5QixRQUFRLEVBQ3hFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxxQkFBc0IsUUFBUSxFQUNyRSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sa0JBQW1CLFFBQVEsRUFDbEUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLG1CQUFvQixRQUFRLEVBQ25FLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxzQkFBdUIsUUFBUSxFQUN0RSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sa0NBQW1DLFFBQVEsRUFDbEYsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLDBCQUEyQixRQUFRLEVBQzFFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSx1QkFBd0IsUUFBUSxFQUN2RSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sNkJBQThCLFFBQVEsRUFDN0UsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLFdBQVksUUFBUSxFQUMzRCxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sY0FBZSxRQUFRLEVBQzlELE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxZQUFhLFFBQVEsRUFDNUQsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLFdBQVksUUFBUSxFQUMzRCxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sWUFBYSxRQUFRLEVBQzVELE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxzQkFBdUIsUUFBUSxFQUN0RSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0saUJBQWtCLFFBQVEsRUFDakUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLHlCQUEwQixRQUFRLEVBQ3pFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxzQkFBdUIsUUFBUSxFQUN0RSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sc0JBQXVCLFFBQVEsRUFDdEUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLGlCQUFrQixRQUFRLEVBQ2pFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxpQkFBa0IsUUFBUSxFQUNqRSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0saUJBQWtCLFFBQVEsRUFDakUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLGlCQUFrQixRQUFRLEVBQ2pFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxpQkFBa0IsUUFBUSxFQUNqRSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sa0JBQW1CLFFBQVEsRUFDbEUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLG9CQUFxQixRQUFRLEVBQ3BFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxtQkFBb0IsUUFBUSxFQUNuRSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sOEJBQStCLFFBQVEsRUFDOUUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLGlCQUFrQixRQUFRLEVBQ2pFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxxQkFBc0IsUUFBUSxFQUNyRSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sZUFBZ0IsUUFBUSxFQUMvRCxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sZ0JBQWlCLFFBQVEsRUFDaEUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLHdCQUF5QixRQUFRLEVBQ3hFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxzQkFBdUIsUUFBUSxFQUN0RSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sc0JBQXVCLFFBQVEsRUFDdEUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLFVBQVcsUUFBUSxFQUMxRCxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0saUJBQWtCLFFBQVEsRUFFakUsTUFBTSxFQUFZLEVBQVMsRUFBTyxFQUFNLEtBQUssRUFDN0MsTUFBTSxFQUFZLEVBQVMsRUFBTyxFQUFNLGVBQWUsRUFDdkQsTUFBTSxFQUFZLEVBQVMsRUFBTyxFQUFNLFdBQVcsRUFDbkQsTUFBTSxFQUFZLEVBQVMsRUFBTyxFQUFNLGFBQWEsRUFDckQsTUFBTSxFQUFZLEVBQVMsRUFBTyxFQUFNLGtCQUFrQixFQUMxRCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sYUFBYSxFQUNyRCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sU0FBUyxFQUNqRCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sVUFBVSxFQUNsRCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sU0FBUyxFQUVqRCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sT0FBTyxFQUMvQyxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sa0JBQWtCLEVBQzFELE1BQU0sRUFBWSxFQUFTLEVBQU8sRUFBTSxVQUFVLEVBQ2xELE1BQU0sRUFBWSxFQUFTLEVBQU8sRUFBTSxrQkFBa0IsRUFDMUQsTUFBTSxFQUFZLEVBQVMsRUFBTyxFQUFNLGdCQUFnQixFQUN4RCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sZUFBZSxFQUN2RCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sb0JBQW9CLEVBQzVELE1BQU0sRUFBWSxFQUFTLEVBQU8sRUFBTSx1QkFBdUIsRUFDL0QsTUFBTSxFQUFZLEVBQVMsRUFBTyxFQUFNLHNCQUFzQixFQUM5RCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sdUJBQXVCLENBQ2pFLE9BQVMsRUFBTyxDQUNkLFFBQVEsS0FBSywyQkFBNkIsR0FBNkIsT0FBUyxDQUFLLENBQ3ZGLENBQ0YsQ0FBQyxDQUNILENBRUEsZUFBZSxFQUFXLEVBQWtCLEVBQWUsRUFBYyxFQUFjLEVBQThCLENBQ25ILEdBQUksQ0FFRixNQUFNLEVBQVEsUUFBUSxvQ0FBcUMsQ0FDekQsUUFDQSxPQUNBLE9BQ0EsT0FDRixDQUFDLENBQ0gsTUFBUSxDQUVOLE1BQU0sRUFBUSxRQUFRLDRDQUE2QyxDQUNqRSxRQUNBLE9BQ0EsT0FDQSxPQUNGLENBQUMsQ0FDSCxDQUNGLENBRUEsZUFBZSxFQUFZLEVBQWtCLEVBQWUsRUFBYyxFQUE2QixDQUNyRyxHQUFJLENBRUYsTUFBTSxFQUFRLFFBQVEsNkNBQThDLENBQ2xFLFFBQ0EsT0FDQSxNQUNGLENBQUMsQ0FDSCxNQUFRLENBRVIsQ0FDRixDQ3BEQSxNQUFNLEdBQTRCLENBQ2hDLHVCQUF3QixZQUMxQixFQUVNLEdBQWdDLE1BRWhDLEdBQWlELENBQ3JELEtBQU0sZUFDTixPQUFRLFNBQ1IsWUFBYSxTQUNiLFdBQVksQ0FDVixTQUFVLENBQ1IsUUFBUyxDQUFDLEVBQ1YsUUFBUyxDQUFDLGlCQUFpQixDQUM3QixDQUNGLEVBQ0EsTUFBTyxDQUNMLENBQ0UsS0FBTSxVQUNSLEVBQ0EsQ0FDRSxLQUFNLHlCQUNOLFdBQVksQ0FDVixxQ0FBc0MsR0FDdEMseUJBQTBCLEdBQzFCLHVCQUF3QixDQUN0QixDQUNFLFFBQVMsY0FDVCxlQUFnQixFQUNsQixFQUNBLENBQ0UsUUFBUyw0QkFDVCxlQUFnQixFQUNsQixDQUNGLENBQ0YsQ0FDRixFQUNBLENBQ0UsS0FBTSxrQkFDUixFQUNBLENBQ0UsS0FBTSxlQUNOLFdBQVksQ0FDVixnQ0FBaUMsRUFDakMsOEJBQStCLEdBQy9CLG1CQUFvQixDQUFDLEVBQ3JCLDBCQUEyQixHQUMzQiwyQkFBNEIsR0FDNUIsa0NBQW1DLEdBQ25DLHNCQUF1QixDQUFDLFFBQVEsQ0FDbEMsQ0FDRixDQUNGLEVBQ0EsY0FBZSxDQUNiLENBQ0UsU0FBVSxTQUNWLFdBQVksT0FDWixZQUFhLGNBQ2YsQ0FDRixDQUNGLEVBRUEsZUFBc0IsR0FBd0IsRUFBc0MsQ0FDbEYsT0FBTyxFQUFPLDBCQUEwQiwwQkFBMkIsU0FBWSxDQUM3RSxHQUFNLENBQUMsRUFBTyxHQUFRLEVBQVcsY0FBYyxFQUFPLFlBQWMsRUFBRSxFQU10RSxHQUxJLENBQUMsR0FBUyxDQUFDLEdBQ1gsSUFBVSxlQUdWLEdBQXdCLEVBQU8sVUFBVSxHQUN6QyxDQUFDLEdBQWUsQ0FBSyxFQUFHLE9BRTVCLElBQU0sRUFBVSxHQUFXLENBQUssRUFFaEMsR0FBSSxDQUNGLE1BQU0sR0FBeUIsRUFBUyxFQUFPLEVBQU0sR0FBd0IsQ0FBTSxDQUFDLENBQ3RGLE9BQVMsRUFBTyxDQUNkLEdBQUksQ0FBQ0MsR0FBb0MsQ0FBSyxFQUFHLE1BQU0sRUFJdkQsUUFBUSxLQUFLLHVDQUF5QyxHQUE2QixPQUFTLENBQUssQ0FDbkcsQ0FDRixDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQXdCLEVBQWlELENBQ2hGLElBQU0sRUFBVSxnQkFBZ0IsRUFBb0IsRUFDcEQsR0FBSSxFQUFPLGtCQUFrQixPQUFTLEVBQ3BDLElBQUssSUFBTSxLQUFRLEVBQVEsTUFDckIsRUFBSyxPQUFTLDBCQUVsQixFQUFLLFdBQVcsdUJBQXVCLEtBQUssQ0FDMUMsUUFBUyx3QkFDVCxlQUFnQixFQUNsQixDQUFDLEVBR0wsT0FBTyxDQUNULENBRUEsZUFBZSxHQUNiLEVBQ0EsRUFDQSxFQUNBLEVBQ2UsQ0FFZixJQUFNLEdBQW9CLE1BREksR0FBc0IsRUFBUyxFQUFPLEVBQU0sRUFBUSxJQUFJLEVBQUEsRUFDM0MsR0FFM0MsTUFBTSxHQUNKLFNBQVksQ0FDVixHQUFJLEVBQW1CLENBQ3JCLE1BQU0sRUFBUSxRQUFRLGtEQUFtRCxDQUN2RSxRQUNBLE9BQ0EsV0FBWSxFQUNaLEdBQUcsRUFDSCxRQUFTLEVBQ1gsQ0FBQyxFQUNELE1BQ0YsQ0FFQSxNQUFNLEVBQVEsUUFBUSxzQ0FBdUMsQ0FDM0QsUUFDQSxPQUNBLEdBQUcsRUFDSCxRQUFTLEVBQ1gsQ0FBQyxDQUNILEVBQ0EsQ0FDRSxZQUFjLEdBQVUsQ0FBQ0EsR0FBb0MsQ0FBSyxDQUNwRSxDQUNGLENBQ0YsQ0FFQSxlQUFlLEdBQ2IsRUFDQSxFQUNBLEVBQ0EsRUFDK0MsQ0FjL0MsSUFBTSxHQUFXLE1BYk0sT0FFbkIsRUFBUSxRQUFRLHFDQUFzQyxDQUNwRCxRQUNBLE9BQ0EsaUJBQWtCLEdBQ2xCLFFBQVMsU0FDVCxRQUFTLEVBQ1gsQ0FBQyxFQUNILENBQ0UsWUFBYyxHQUFVLENBQUNBLEdBQW9DLENBQUssQ0FDcEUsQ0FDRixFQUFBLENBQzBCLEtBQ3JCLFNBQU0sUUFBUSxDQUFRLEVBQzNCLE9BQU8sRUFBUyxLQUFNLEdBQVksRUFBUSxPQUFTLEdBQWUsRUFBUSxjQUFnQixZQUFZLENBQ3hHLENBRUEsU0FBU0EsR0FBb0MsRUFBeUIsQ0FDcEUsR0FBSSxDQUFDLEdBQVMsT0FBTyxHQUFVLFNBQVUsTUFBTyxHQUNoRCxJQUFNLEVBQVUsRUFBOEIsT0FDOUMsT0FBTyxJQUFXLEtBQU8sSUFBVyxLQUFPLElBQVcsR0FDeEQsQ0NwTkEsTUFBTSxHQUEwQixDQUFDLDRCQUE2QixhQUFjLG1CQUFtQixFQUN6RixHQUFVLEdBQWMsT0FBTyxLQUFLLEdBQUcsRUFFN0MsZUFBc0IsR0FBYSxFQUFzQyxDQUN2RSxPQUFPLEVBQU8sMEJBQTBCLGVBQWdCLFNBQVksQ0FDbEUsR0FBTSxDQUFDLEVBQU8sR0FBUSxFQUFXLGNBQWMsRUFBTyxZQUFjLEVBQUUsRUFFdEUsR0FESSxDQUFDLEdBQVMsQ0FBQyxHQUFRLElBQVUsa0JBQzdCLENBQUMsR0FBZSxDQUFLLEdBQUssQ0FBQyxFQUFRLGtCQUFtQixPQUUxRCxJQUFNLEVBQVMsR0FBTyxPQUFPLENBQUUsS0FBTSxFQUFLLFFBQVEsRUFBTyxRQUFTLE1BQU0sRUFBRyxNQUFPLEVBQUssQ0FBQyxDQUFDLENBQUMsUUFBVSxDQUFDLEVBQ3JHLEdBQUksT0FBTyxLQUFLLENBQU0sQ0FBQyxDQUFDLFNBQVcsRUFBRyxPQUV0QyxJQUFNLEVBQVUsR0FBVyxDQUFLLEVBRWhDLEdBQUksQ0FDRixJQUFLLElBQU0sS0FBYyxHQUN2QixHQUFJLENBRUYsTUFBTSxFQUFRLFFBQVEsNkRBQThELENBQ2xGLFFBQ0EsT0FDQSxZQUFhLENBQ2YsQ0FBQyxDQUNILE1BQVEsQ0FFUixDQVFGLEdBQU0sQ0FBRSxNQUFLLE9BQVEsSUFBVSxNQUpSLEVBQVEsUUFBUSx1REFBd0QsQ0FDN0YsUUFDQSxNQUNGLENBQUMsRUFBQSxDQUN1QyxLQUVsQyxFQUFTLEdBQVUsRUFDekIsTUFBTSxFQUFPLE1BRWIsSUFBSyxHQUFNLENBQUMsRUFBTSxLQUFXLE9BQU8sUUFBUSxDQUFNLEVBQUcsQ0FDbkQsR0FDRSxJQUFTLGNBQ1QsSUFBUyw4QkFDVCxJQUFTLGdDQUVULFNBSUYsSUFBTSxFQUFTLEVBQU8sWUFBWSxFQUFLLEVBQU8sZ0JBQWdCLFFBQVEsRUFDaEUsRUFBUyxFQUFPLFlBQVksQ0FBTSxFQUdsQyxFQUFXLEVBQU8sZ0JBQWdCLEVBQVEsQ0FBTSxFQUdoRCxFQUFZLEVBQU8sVUFBVSxFQUFVLEVBQU8sZ0JBQWdCLFFBQVEsRUFHNUUsTUFBTSxFQUFRLFFBQVEsMERBQTJELENBQy9FLFFBQ0EsT0FDQSxZQUFhLEVBQ2IsZ0JBQWlCLEVBQ2pCLE9BQVEsQ0FDVixDQUFDLENBQ0gsQ0FDRixPQUFTLEVBQU8sQ0FDZCxRQUFRLEtBQUssNEJBQThCLEdBQTZCLE9BQVMsQ0FBSyxDQUN4RixDQUNGLENBQUMsQ0FDSCxDQUVBLFNBQVMsSUFBaUMsQ0FHeEMsT0FBTyxHQUFRLG9CQUFvQixDQUNyQyxDQ2pGQSxlQUFzQixHQUFvQixFQUFzQyxDQUM5RSxPQUFPLEVBQU8sMEJBQTBCLHNCQUF1QixTQUFZLENBQ3pFLEdBQU0sQ0FBQyxFQUFPLEdBQVEsRUFBVyxjQUFjLEVBQU8sWUFBYyxFQUFFLEVBR3RFLEdBRkksQ0FBQyxHQUFTLENBQUMsR0FDWCxJQUFVLGVBQWlCLElBQVUsa0JBQ3JDLENBQUMsR0FBZSxDQUFLLEVBQUcsT0FFNUIsSUFBTSxFQUFVLEdBQVcsQ0FBSyxFQUVoQyxHQUFJLENBRUYsTUFBTSxPQUVGLEVBQVEsUUFBUSw4QkFBK0IsQ0FDN0MsUUFDQSxPQUNBLGlCQUFrQixHQUNsQixtQkFBb0IsR0FDcEIsbUJBQW9CLEdBQ3BCLG1CQUFvQixHQUNwQixvQkFBcUIsR0FDckIsdUJBQXdCLEdBQ3hCLDBCQUEyQixXQUMzQiw0QkFBNkIsUUFDN0IsUUFBUyxDQUNQLHVCQUF3QixZQUMxQixFQUNBLEdBQUksRUFBTyxZQUFZLFdBQVcscUJBQXFCLEVBQUksQ0FBRSxpQkFBa0IsRUFBSyxFQUFJLENBQUMsQ0FDM0YsQ0FBQyxFQUNILENBQ0UsWUFBYyxHQUFVLENBQUMsR0FBb0MsQ0FBSyxDQUNwRSxDQUNGLENBQ0YsT0FBUyxFQUFPLENBQ2QsR0FBSSxDQUFDLEdBQW9DLENBQUssRUFBRyxNQUFNLEVBR3ZELFFBQVEsS0FBSyxtQ0FBcUMsR0FBNkIsT0FBUyxDQUFLLENBQy9GLENBQ0YsQ0FBQyxDQUNILENBRUEsU0FBUyxHQUFvQyxFQUF5QixDQUVwRSxNQURJLENBQUMsR0FBUyxPQUFPLEdBQVUsVUFBWSxFQUFFLFdBQVksR0FBZSxHQUNqRSxFQUFNLFNBQVcsS0FBTyxFQUFNLFNBQVcsS0FBTyxFQUFNLFNBQVcsR0FDMUUsQ0N6Q0EsTUFBTSxHQUErQixhQUUvQixHQUFZLENBQ2hCLDJCQUE0Qjs7Ozs7Ozs7Z0NBUUUsR0FBNkI7Z0NBQzdCLEdBQTZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFpQzNELEtBQUssQ0FDUCxFQUVBLGVBQXNCLEdBQXdCLEVBQXNDLENBQ2xGLE9BQU8sRUFBTywwQkFBMEIsMEJBQTJCLFNBQVksQ0FDeEUsS0FBTyxrQkFJWixJQUFLLEdBQU0sQ0FBQyxFQUFVLEtBQWUsT0FBTyxRQUFRLEVBQVMsRUFBRyxDQUM5RCxJQUFNLEVBQVUsR0FBNEIsRUFBWSxDQUFNLEVBQ3hELEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxVQUFXLENBQVEsRUFDN0QsRUFBRyxXQUFXLENBQVEsR0FFcEIsR0FBUyxNQURZLEVBQUcsU0FBUyxTQUFTLEVBQVUsTUFBTSxFQUNyQyxDQUFPLEVBQUksRUFBUSxPQUFTLElBS3ZELE1BQU0sRUFBRyxTQUFTLE1BQU0sRUFBSyxRQUFRLEVBQU8sUUFBUyxTQUFTLEVBQUcsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUNwRixNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxDQUFPLENBQUMsRUFDcEUsQ0FDRixDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQTRCLEVBQWtCLEVBQStCLENBQ3BGLElBQU0sRUFBd0IsRUFBTyxNQUFRLFVBQVksT0FDekQsT0FBTyxFQUFTLFdBQVcsR0FBOEIsQ0FBcUIsQ0FDaEYsQ0MvRUEsTUFBTSxHQUF3QixDQUFDLGVBQWdCLGtCQUFtQix1QkFBd0Isa0JBQWtCLEVBQ3RHLEdBQW1DLE9BQU8sR0FBRyxpQ0FDN0MsR0FBK0IsQ0FDL0IsT0FBTyxJQUFJLEdBQWlDLHNCQUF1QixHQUFHLEVBQ3RFLE9BQU8sV0FBVyxHQUFpQyxzQkFBdUIsR0FBRyxFQUM3RSxPQUNGLG9DQUFvQyxHQUFpQyxpQ0FDckUsR0FDRixFQUNJLE9BQ0YseUNBQXlDLEdBQWlDLGlDQUMxRSxHQUNGLEVBQ0ksT0FBTyxnQ0FBZ0MsR0FBaUMsaUNBQWtDLEdBQUcsQ0FDbkgsRUFTQSxTQUFnQixHQUE0QixFQUFnQyxDQUMxRSxJQUFNLEVBQW9CLEVBQVEsUUFBUSxFQUE4QixFQUN4RSxHQUFJLEVBQWtCLFNBQVcsRUFBRyxPQUVwQyxJQUFNLEVBQVUsRUFDYixLQUNFLENBQUUsaUJBQWdCLFVBQVMsY0FBYSxlQUN2QyxLQUFLLEVBQUssS0FBSyxFQUFTLGNBQWMsRUFBRSxJQUFJLEVBQVksR0FBRyxFQUFlLFFBQVEsR0FDdEYsQ0FBQyxDQUNBLEtBQUs7Q0FBSSxFQUVaLE1BQVUsTUFDUixtSEFBbUgsR0FDckgsQ0FDRixDQUVBLFNBQVMsR0FBK0IsRUFBcUQsQ0FDM0YsSUFBTSxFQUFjLEVBQU8sWUFDM0IsR0FBSSxDQUFDLEVBQWEsTUFBTyxDQUFDLEVBRTFCLElBQU0sRUFBa0QsQ0FBQyxFQUN6RCxJQUFLLElBQU0sS0FBZSxHQUF1QixDQUMvQyxJQUFNLEVBQVUsRUFBWSxHQUN2QixLQUVMLElBQUssR0FBTSxDQUFDLEVBQWdCLEtBQWMsT0FBTyxRQUFRLENBQU8sRUFDekQsR0FDQSxHQUF5QixDQUFTLElBQ25DLEdBQWdDLENBQVMsR0FFN0MsRUFBa0IsS0FBSyxDQUNyQixpQkFDQSxRQUFTLEVBQU8sUUFDaEIsY0FDQSxXQUNGLENBQUMsRUFFTCxDQUNBLE9BQU8sQ0FDVCxDQUVBLFNBQVMsR0FBeUIsRUFBNEIsQ0FDNUQsT0FDRSxHQUEyQixDQUFTLEdBQ3BDLHNDQUFzQyxLQUFLLENBQVMsR0FDcEQsNERBQTRELEtBQUssQ0FBUyxHQUMxRSwwQ0FBMEMsS0FBSyxDQUFTLEdBQ3hELGtDQUFrQyxLQUFLLENBQVMsR0FDaEQsRUFBVSxXQUFXLE1BQU0sR0FDM0IsRUFBVSxXQUFXLE1BQU0sR0FDM0IsRUFBVSxXQUFXLFlBQVksQ0FFckMsQ0FFQSxTQUFTLEdBQTJCLEVBQTRCLENBQzlELE1BQU8sMENBQTBDLEtBQUssQ0FBUyxDQUNqRSxDQUVBLFNBQVMsR0FBZ0MsRUFBNEIsQ0FDbkUsT0FBTyxHQUE2QixLQUFNLEdBQVksRUFBUSxLQUFLLENBQVMsQ0FBQyxDQUMvRSxDQ2xDQSxlQUFlLElBQXNCLENBQ25DLElBQU0sRUFBTyxNQUFNLEVBQU0sUUFBUSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUEsQ0FDM0MsUUFBUSxlQUFnQix1REFBeUQsR0FBVSxDQUMxRixFQUFNLFdBQVcsUUFBUyxDQUN4QixTQUFVLDZCQUNWLE1BQU8sR0FDUCxLQUFNLFNBQ04sUUFBUyxDQUFDLEdBQUcsQ0FDZixDQUFDLENBQ0gsQ0FBQyxDQUFBLENBQ0EsUUFBUSxDQUNQLElBQUssQ0FDSCxZQUFhLG9EQUNiLEtBQU0sVUFDTixRQUFTLEdBQ1QsTUFBTyxHQUNULEVBQ0EsU0FBVSxDQUNSLFlBQWEsK0JBQ2IsS0FBTSxVQUNOLFFBQVMsR0FDVCxNQUFPLEdBQ1QsRUFDQSxRQUFTLENBQ1AsWUFBYSx3Q0FDYixLQUFNLFVBQ04sUUFBUyxHQUNULE1BQU8sR0FDVCxDQUNGLENBQUMsQ0FBQSxDQUNBLFFBQVEsR0FBVyxDQUFDLENBQUEsQ0FDcEIsT0FBTyxDQUFDLENBQUMsS0FDWixFQUFRLFVBQVksRUFBSyxRQUN6QixFQUFRLGtCQUFvQixFQUFLLElBRWpDLElBQUksRUFBMEIsR0FDOUIsR0FBSSxDQUNGLEVBQTBCLE1BQU0sR0FBb0IsRUFBSyxNQUFtQixFQUFLLFFBQVEsQ0FDM0YsUUFBVSxDQUdSLEdBQXFCLENBQ3ZCLENBQ0ksSUFDRixRQUFRLFNBQVcsRUFFdkIsQ0FFQSxlQUFlLEdBQW9CLEVBQWlCLEVBQXFDLENBQ3ZGLElBQUksRUFBMEIsR0FDOUIsSUFBSyxJQUFNLEtBQWUsRUFBTyxDQUMvQixJQUFNLEVBQWtCLEVBQUssS0FBSyxFQUFhLFVBQVUsRUFFbkQsR0FEVyxNQUFNLE1BQXVCLEVBQUcsU0FBUyxRQUFRLEVBQWlCLENBQUUsY0FBZSxFQUFLLENBQUMsQ0FBQyxHQUFNLENBQUMsRUFBQSxDQUN0RixPQUFRLEdBQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUssR0FBTSxFQUFLLEtBQUssRUFBaUIsRUFBRSxJQUFJLENBQUMsRUFFeEcsTUFBTSxHQUFzQyxDQUFDLEVBQWEsR0FBRyxDQUFXLENBQUMsRUFFekUsSUFBTSxFQUFhLE1BQU0sR0FBaUIsQ0FBVyxFQUlyRCxHQUhJLEVBQVEsVUFHUixDQUFDLEVBQVksQ0FDZixRQUFRLE1BQU0scUNBQXFDLEdBQWEsRUFDaEUsRUFBMEIsR0FDMUIsUUFDRixDQUNBLElBQU0sRUFBc0IsR0FBUyxDQUFVLEVBTXpDLEVBQW9CLENBQUMsRUFBWSxJQURiLE1BSGMsUUFBUSxJQUM5QyxFQUFZLElBQUssR0FBZSxHQUFpQixFQUFZLENBQVUsQ0FBQyxDQUMxRSxFQUFBLENBQ29ELE9BQVEsR0FBVyxDQUFDLENBQUMsQ0FDZixDQUFDLEVBRTNELEdBQUksRUFBUSxVQUNWLElBQUssSUFBTSxLQUFVLEVBQ25CLFFBQVEsS0FBSyxDQUFNLEVBR3ZCLEdBQTRCLENBQWlCLEVBRzdDLE1BQU0sR0FBa0IsQ0FBVSxFQUM5QixFQUFXLE9BQ2IsTUFBTSxHQUFtQixDQUFVLEVBR3JDLElBQU0sRUFDSixDQUFDLEdBQXdCLEVBQVcsVUFBVSxJQUM3QyxFQUFXLFlBQVksV0FBVyxxQkFBcUIsR0FDdEQsRUFBVyxZQUFZLFdBQVcsd0JBQXdCLEdBQzlELE1BQU0sUUFBUSxJQUFJLENBQ2hCLEdBQWtCLENBQVUsRUFDNUIsRUFBb0IsU0FBVyxHQUFlLENBQVUsQ0FBQyxFQUN6RCxHQUEwQixFQUFZLENBQWlCLEVBQ3ZELEdBQXFCLENBQVUsRUFDL0IsR0FBcUIsQ0FBVSxFQUMvQixHQUFxQixFQUFZLENBQWlCLEVBQ2xELEdBQXFCLENBQVUsRUFDL0IsR0FBc0IsQ0FBVSxFQUNoQyxHQUF3QixDQUFVLEVBQ2xDLEdBQXFCLENBQVUsRUFDL0IsR0FBaUIsQ0FBVSxFQUMzQixHQUFxQixDQUFVLEVBQy9CLEdBQWtCLENBQVUsRUFDNUIsR0FBSSxFQUFxQixDQUFDLEdBQWtCLENBQVUsQ0FBQyxFQUFJLENBQUMsRUFDNUQsR0FBWSxDQUFVLEVBQ3RCLEdBQXdCLENBQVUsRUFDbEMsR0FBYSxDQUFVLEVBQ3ZCLEdBQW9CLENBQVUsRUFDOUIsR0FBb0MsQ0FBVSxFQUM5QyxHQUFxQixDQUFVLENBQ2pDLENBQUMsRUFDRCxNQUFNLEVBQVksV0FBVyxFQUU3QixJQUFNLEVBQTRCLENBQUMsRUFDbkMsSUFBSyxJQUFNLEtBQVUsR0FDZixFQUFPLHVCQUF5QixFQUFPLGtDQUN6QyxFQUFTLEtBQUssR0FBbUIsRUFBUSxFQUFPLE9BQVMsRUFBb0IsQ0FBQyxDQUFNLENBQUMsQ0FBQyxFQUVwRixFQUFPLFVBQVUsZ0JBQ25CLEVBQVMsS0FBSyxHQUFvQixDQUFNLENBQUMsRUFFdkMsRUFBTyxVQUFVLE1BQ25CLEVBQVMsS0FBSyxHQUFrQixDQUFNLENBQUMsRUFFekMsTUFBTSxHQUFrQixFQUFRLENBQVUsRUFDMUMsTUFBTSxFQUFZLFdBQVcsRUFDekIsR0FBQyxFQUFPLFFBQVUsQ0FBQyxFQUFPLDBCQUc5QixNQUFNLEdBQXVCLENBQU0sRUFDbkMsTUFBTSxHQUFvQixFQUFRLEVBQVksQ0FBUSxFQUtsRCxHQUFxQixDQUFNLEdBQzdCLE1BQU0sR0FBbUIsQ0FBTSxFQUdqQyxFQUFTLEtBQUssR0FBcUIsQ0FBTSxDQUFDLEVBQ3RDLEVBQU8sK0JBQWlDLEVBQU8sd0JBQ2pELEVBQVMsS0FBSyxHQUF1QixDQUFNLENBQUMsR0FFMUMsRUFBTyx1QkFBeUIsRUFBTyxrQ0FDekMsRUFBUyxLQUFLLEdBQWlCLENBQU0sQ0FBQyxFQUVwQyxFQUFrQixDQUFNLEdBQzFCLEVBQVMsS0FBSyxHQUFvQixDQUFNLENBQUMsRUFDekMsRUFBUyxLQUFLLEdBQXFCLEVBQVEsQ0FBVSxDQUFDLEdBQzdDLENBQUMsRUFBTyxRQUFVLEVBQU8sd0JBQTBCLEVBQWtCLENBQVUsR0FJeEYsRUFBUyxLQUFLLEdBQXFCLEVBQVEsQ0FBVSxDQUFDLEVBRXBELEVBQU8sVUFBVSxTQUNuQixFQUFTLEtBQUssR0FBMEIsQ0FBTSxDQUFDLEdBR25ELE1BQU0sUUFBUSxJQUFJLENBQVEsRUFDMUIsTUFBTSxFQUFZLFdBQVcsRUFDN0IsTUFBTSxHQUFlLEVBQVksQ0FBaUIsRUFFbEQsSUFBTSxFQUFpQixFQUFXLE1BQVEsTUFBUSxPQUU5QyxFQUFXLE1BQ2IsTUFBTSxFQUFPLDBCQUEwQixpQkFBa0IsU0FBWSxDQUNuRSxNQUFNLFFBQVEsUUFBUSxFQUN0QixHQUFlLENBQVcsQ0FDNUIsQ0FBQyxFQUVELEVBQVUsRUFBZ0IsQ0FBQyxVQUFXLGdCQUFnQixFQUFHLENBQVcsRUFFdEUsRUFBVSxFQUFnQixDQUFDLFNBQVMsRUFBRyxDQUFXLEVBRWxELE1BQU0sR0FBbUIsQ0FBVSxDQUNyQyxDQUNBLE9BQU8sQ0FDVCxDQUVBLFNBQVMsR0FBZSxFQUEyQixDQUlqRCxJQUFNLEVBQVMsR0FBeUIsTUFBTyxDQUFDLFNBQVMsRUFBRyxDQUFXLEVBQ3ZFLEdBQUksSUFBVyxFQUNiLE1BQVUsTUFBTSxrRUFBa0UsR0FBUSxDQUU5RixDQUVBLFNBQVMsSUFBcUIsQ0FDNUIsSUFBSSxFQUFpQixFQUFLLFFBQVEsSUFBSSxJQUFJLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQ25FLEtBQU8sQ0FBQyxFQUFHLFdBQVcsRUFBSyxLQUFLLEVBQWdCLGNBQWMsQ0FBQyxHQUM3RCxFQUFpQixFQUFLLFFBQVEsQ0FBYyxFQUs5QyxPQUhvQixLQUFLLE1BQU0sRUFBRyxhQUFhLEVBQUssS0FBSyxFQUFnQixjQUFjLEVBQUcsTUFBTSxDQUcvRSxDQUFDLENBQUMsT0FDckIsQ0FFQSxNQUFNLEdBQUsifQ==
442
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsInNvcnRPYmplY3RLZXlzIiwiZ2l0SG9va3MiLCJkZXRlY3ROZXdsaW5lIiwiZnMiLCJmcyIsIm5ld0NvbnRlbnQiLCJjb21tb25Db250ZW50IiwibmV3Q29udGVudCIsImNoaWxkUHJvY2VzcyIsImZzcCIsInBhcnNlSnNvbmMiLCJwYXJzZVRvbWwiLCJjb21tb25Db250ZW50IiwiZGVwZW5kZW5jeVNlY3Rpb25LZXlzIiwiY29yZSIsImVzY2FwZVJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsIm1hbmFnZWRDb25maWdCbG9ja3MiLCJnZXRDb25maWdDb250ZW50IiwianNvbk9iaiIsImlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yIl0sInNvdXJjZXMiOlsiLi4vLi4vc2hhcmVkLWxpYi9zcmMvc2xlZXAudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvdXRpbHMvdHlwZXNjcmlwdEFwaS50cyIsIi4uL3NyYy9maXhlcnMvbmV4dENvbmZpZy50cyIsIi4uL3NyYy91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2dsb2JVdGlsLnRzIiwiLi4vc3JjL2ZpeGVycy9wcmlzbWEudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kZXRlY3QtaW5kZW50L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1uZXdsaW5lL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2dpdC1ob29rcy1saXN0L2luZGV4Lmpzb24iLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9tZXJnZVV0aWwudHMiLCIuLi9zcmMvdXRpbHMvb2JqZWN0VXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBvcy50cyIsIi4uL3NyYy9maXhlcnMvd2JEYkNvbW1hbmQudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3dyYW5nbGVyVHlwZXNDb21tYW5kLnRzIiwiLi4vc3JjL2ZpeGVycy93b3JrZXJUeXBlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2lkZWEudHMiLCIuLi9zcmMvdXRpbHMvZ2VuSTE4blRzLnRzIiwiLi4vc3JjL2dpdGh1Yi9jb21taXQudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy95YXJucmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvY29uZmlnQ29udGVudC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21hbmFnZWRDb25maWdCbG9jay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294Zm10Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3NraWxscy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3RzY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9ydWxlc2V0LnRzIiwiLi4vc3JjL2dpdGh1Yi9zZWNyZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy91dGlscy9kZXBlbmRlbmN5U291cmNlUG9saWN5LnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICAgKiBGb3IgZXhhbXBsZSwgYHJldHJ5Q291bnQ6IDNgIHJ1bnMgdGhlIGZ1bmN0aW9uIGF0IG1vc3QgMyB0aW1lczogMSBpbml0aWFsIGF0dGVtcHQgYW5kIHVwIHRvIDIgcmV0cmllcy5cbiAgICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xuICBkb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuZXhwb3J0IGNvbnN0IGZzVXRpbCA9IHtcbiAgYXN5bmMgcmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBhc3luYyBnZW5lcmF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgbGV0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCArPSAnXFxuJztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgQVBJIH0gZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9zeW5jJztcbmltcG9ydCB0eXBlIHsgU291cmNlRmlsZSB9IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgKEdvKSBjb21waWxlciBhcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UgYW5kIG5vXG4vLyBsb25nZXIgZXhwb3NlcyBhbiBpbi1wcm9jZXNzIHBhcnNlciBzdWNoIGFzIGB0cy5jcmVhdGVTb3VyY2VGaWxlYC4gUGFyc2luZyBub3dcbi8vIGhhcHBlbnMgaW4gYSBzcGF3bmVkIGNvbXBpbGVyIHNlcnZlciByZWFjaGVkIHRocm91Z2ggdGhlIHN5bmNocm9ub3VzIEFQSSwgc28gd2Vcbi8vIGtlZXAgYSBzaW5nbGUgbGF6aWx5LWNyZWF0ZWQgaW5zdGFuY2UgYW5kIHJldXNlIGl0IGFjcm9zcyBldmVyeSBmaXhlciB0byBhdm9pZFxuLy8gcGF5aW5nIHRoZSBwcm9jZXNzLXNwYXduIGNvc3QgcGVyIGZpbGUuXG5sZXQgYXBpOiBBUEkgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGdldEFwaSgpOiBBUEkge1xuICByZXR1cm4gKGFwaSA/Pz0gbmV3IEFQSSh7IGN3ZDogcHJvY2Vzcy5jd2QoKSB9KSk7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgc291cmNlIGZpbGUgaW50byBhIFR5cGVTY3JpcHQgQVNUIHVzaW5nIHRoZSBidW5kbGVkIG5hdGl2ZSBjb21waWxlci5cbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgY29tcGlsZXIgY2Fubm90IGxvYWQgdGhlIGZpbGUgKGUuZy4gaXQgaXMgbWlzc2luZ1xuICogb3IgdW5wYXJzYWJsZSkgc28gY2FsbGVycyBjYW4gZmFsbCBiYWNrIHRvIGNvbnNlcnZhdGl2ZSBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nKTogU291cmNlRmlsZSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBnZXRBcGkoKS51cGRhdGVTbmFwc2hvdCh7IG9wZW5GaWxlczogW2ZpbGVQYXRoXSB9KTtcbiAgICByZXR1cm4gc25hcHNob3QuZ2V0RGVmYXVsdFByb2plY3RGb3JGaWxlKGZpbGVQYXRoKT8ucHJvZ3JhbS5nZXRTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNodXRzIGRvd24gdGhlIHNwYXduZWQgY29tcGlsZXIgc2VydmVyLiBUaGUgc2VydmVyIGtlZXBzIGFuIG9wZW4gSVBDIGNoYW5uZWxcbiAqIHRoYXQgd291bGQgb3RoZXJ3aXNlIGtlZXAgdGhlIE5vZGUuanMgZXZlbnQgbG9vcCBhbGl2ZSwgc28gd2JmeSBtdXN0IGNhbGwgdGhpc1xuICogb25jZSBpdHMgcnVuIGZpbmlzaGVzIGZvciB0aGUgcHJvY2VzcyB0byBleGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZVR5cGVTY3JpcHRBcGkoKTogdm9pZCB7XG4gIGFwaT8uY2xvc2UoKTtcbiAgYXBpID0gdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5cbi8vIFNldHRpbmdzIGV2ZXJ5IFdpbGxCb29zdGVyIE5leHQuanMgcHJvamVjdCBzaG91bGQgY2FycnkuIGBuYW1lYCBpcyB0aGUgdG9wLWxldmVsXG4vLyBwcm9wZXJ0eSBrZXkgdXNlZCB0byBkZXRlY3Qgd2hldGhlciB0aGUgc2V0dGluZyBhbHJlYWR5IGV4aXN0czsgYHRleHRgIGlzIGluc2VydGVkXG4vLyB2ZXJiYXRpbSAoYSB3aG9sZSBga2V5OiB2YWx1ZWAgcGFpcikgd2hlbiB0aGUga2V5IGlzIG1pc3NpbmcuXG5jb25zdCBtYW5hZ2VkUHJvcGVydGllczogcmVhZG9ubHkgeyBuYW1lOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9W10gPSBbXG4gIHsgbmFtZTogJ3JlYWN0Q29tcGlsZXInLCB0ZXh0OiAncmVhY3RDb21waWxlcjogdHJ1ZScgfSxcbiAgeyBuYW1lOiAncmVhY3RTdHJpY3RNb2RlJywgdGV4dDogJ3JlYWN0U3RyaWN0TW9kZTogdHJ1ZScgfSxcbiAgeyBuYW1lOiAndHlwZXNjcmlwdCcsIHRleHQ6ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0nIH0sXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ3RzJywgJ210cycsICdjdHMnLCAnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IGV4dHJhY3RlZCA9IGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoKTtcbiAgICBpZiAoIWV4dHJhY3RlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgc291cmNlLCBvYmplY3RMaXRlcmFsIH0gPSBleHRyYWN0ZWQ7XG5cbiAgICAvLyBgcHJvcGVydGllc2AgaW5jbHVkZXMgc3ByZWFkIGFzc2lnbm1lbnRzIChgLi4ucmVzdGApIHRoYXQgY2Fycnkgbm8gbmFtZSwgc28gZ3VhcmQgYmVmb3JlIHJlYWRpbmcgaXQuXG4gICAgY29uc3QgZXhpc3RpbmdQcm9wZXJ0aWVzID0gbmV3IFNldChcbiAgICAgIG9iamVjdExpdGVyYWwucHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PlxuICAgICAgICAnbmFtZScgaW4gcHJvcGVydHkgJiYgcHJvcGVydHkubmFtZSA/IGdldFByb3BlcnR5S2V5KHByb3BlcnR5Lm5hbWUsIHNvdXJjZSkgOiB1bmRlZmluZWRcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHByb3BlcnR5VGV4dHMgPSBtYW5hZ2VkUHJvcGVydGllc1xuICAgICAgLmZpbHRlcigocHJvcGVydHkpID0+ICFleGlzdGluZ1Byb3BlcnRpZXMuaGFzKHByb3BlcnR5Lm5hbWUpKVxuICAgICAgLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LnRleHQpO1xuICAgIGlmIChwcm9wZXJ0eVRleHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IHNvdXJjZS50ZXh0O1xuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gb2JqZWN0TGl0ZXJhbC5nZXRFbmQoKSAtIDE7XG4gICAgLy8gVGhlIG5hdGl2ZSBUUyBBU1QgZG9lcyBub3QgcmVsaWFibHkgZXhwb3NlIGBwcm9wZXJ0aWVzLmhhc1RyYWlsaW5nQ29tbWFgLCBzbyBzY2FuIHRoZSBzb3VyY2VcbiAgICAvLyBiZXR3ZWVuIHRoZSBsYXN0IHByb3BlcnR5IGFuZCB0aGUgY2xvc2luZyBicmFjZS4gU3RyaXAgY29tbWVudHMgZmlyc3Qgc28gYSBjb21tYSBpbnNpZGUgYVxuICAgIC8vIHRyYWlsaW5nIGNvbW1lbnQgKGUuZy4gYGZvbzogMSAvLyBhLCBiYCkgaXMgbm90IG1pc3Rha2VuIGZvciBhIHJlYWwgdHJhaWxpbmcgY29tbWEuXG4gICAgY29uc3QgbGFzdFByb3BlcnR5ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmF0KC0xKTtcbiAgICBjb25zdCBoYXNUcmFpbGluZ0NvbW1hID0gbGFzdFByb3BlcnR5XG4gICAgICA/IHN0cmlwQ29tbWVudHMob2xkQ29udGVudC5zbGljZShsYXN0UHJvcGVydHkuZ2V0RW5kKCksIGluc2VydGlvblBvaW50KSkuaW5jbHVkZXMoJywnKVxuICAgICAgOiBmYWxzZTtcbiAgICBjb25zdCBwcmVmaXggPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubGVuZ3RoID4gMCAmJiAhaGFzVHJhaWxpbmdDb21tYSA/ICcsICcgOiAnJztcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBpbnNlcnRpb25Qb2ludCl9JHtwcmVmaXh9JHtwcm9wZXJ0eVRleHRzLmpvaW4oJywgJyl9JHtvbGRDb250ZW50LnNsaWNlKFxuICAgICAgaW5zZXJ0aW9uUG9pbnRcbiAgICApfWA7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiB7IHNvdXJjZTogYXN0LlNvdXJjZUZpbGU7IG9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkIGRlY2xhcmVzIHRoZSBjb25maWcgYXMgYGNvbnN0IG5leHRDb25maWc6IE5leHRDb25maWcgPSB7IC4uLiB9YCBhbmRcbiAgLy8gZXhwb3J0cyBpdCAocG9zc2libHkgd3JhcHBlZCwgZS5nLiBgd2l0aFNlbnRyeUNvbmZpZyguLi4pYCksIHNvIHRoZSBvYmplY3QgbGl0ZXJhbCBpcyByYXJlbHlcbiAgLy8gdGhlIGRpcmVjdCBvcGVyYW5kIG9mIGBleHBvcnQgZGVmYXVsdGAvYG1vZHVsZS5leHBvcnRzYC4gQ29sbGVjdCBldmVyeSBjYW5kaWRhdGUgYW5kIHBpY2sgdGhlXG4gIC8vIG1vc3QgYXV0aG9yaXRhdGl2ZSBvbmUgYmVsb3cuXG4gIGxldCBkaXJlY3RPYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGxldCBleHBvcnRlZElkZW50aWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmFyaWFibGVPYmplY3RMaXRlcmFscyA9IG5ldyBNYXA8c3RyaW5nLCBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24+KCk7XG4gIGNvbnN0IHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHM6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbltdID0gW107XG5cbiAgY29uc3QgdmlzaXQgPSAobm9kZTogYXN0Lk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoYXN0LmlzRXhwb3J0QXNzaWdubWVudChub2RlKSkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5leHByZXNzaW9uKTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz89IG9iamVjdExpdGVyYWw7XG4gICAgICB9IGVsc2UgaWYgKGFzdC5pc0lkZW50aWZpZXIobm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgICBleHBvcnRlZElkZW50aWZpZXIgPz89IG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGFzdC5pc0JpbmFyeUV4cHJlc3Npb24obm9kZSkgJiZcbiAgICAgIG5vZGUub3BlcmF0b3JUb2tlbi5raW5kID09PSBhc3QuU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgbm9kZS5sZWZ0LmdldFRleHQoc291cmNlKSA9PT0gJ21vZHVsZS5leHBvcnRzJ1xuICAgICkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5yaWdodCk7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/PSBvYmplY3RMaXRlcmFsO1xuICAgICAgfSBlbHNlIGlmIChhc3QuaXNJZGVudGlmaWVyKG5vZGUucmlnaHQpKSB7XG4gICAgICAgIGV4cG9ydGVkSWRlbnRpZmllciA/Pz0gbm9kZS5yaWdodC5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhc3QuaXNWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpICYmIG5vZGUuaW5pdGlhbGl6ZXIpIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUuaW5pdGlhbGl6ZXIpO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwgJiYgYXN0LmlzSWRlbnRpZmllcihub2RlLm5hbWUpKSB7XG4gICAgICAgIHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuc2V0KG5vZGUubmFtZS5nZXRUZXh0KHNvdXJjZSksIG9iamVjdExpdGVyYWwpO1xuICAgICAgICAvLyBBIGA6IE5leHRDb25maWdgIGFubm90YXRpb24gb3IgYSBgc2F0aXNmaWVzYC9gYXMgTmV4dENvbmZpZ2AgYXNzZXJ0aW9uIG1hcmtzIHRoZSBjYW5vbmljYWxcbiAgICAgICAgLy8gY29uZmlnIG9iamVjdCAoYWNjZXB0aW5nIHF1YWxpZmllZCBuYW1lcyBzdWNoIGFzIGBpbXBvcnQoJ25leHQnKS5OZXh0Q29uZmlnYCkuXG4gICAgICAgIGNvbnN0IGFubm90YXRpb25UeXBlID0gbm9kZS50eXBlPy5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IGFzc2VydGVkVHlwZSA9IGdldEFzc2VydGVkVHlwZShub2RlLmluaXRpYWxpemVyKT8uZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgICBjb25zdCBpc1R5cGVkQXNOZXh0Q29uZmlnID1cbiAgICAgICAgICAoYW5ub3RhdGlvblR5cGUgIT09IHVuZGVmaW5lZCAmJiBpc05leHRDb25maWdUeXBlKGFubm90YXRpb25UeXBlKSkgfHxcbiAgICAgICAgICAoYXNzZXJ0ZWRUeXBlICE9PSB1bmRlZmluZWQgJiYgaXNOZXh0Q29uZmlnVHlwZShhc3NlcnRlZFR5cGUpKTtcbiAgICAgICAgaWYgKGlzVHlwZWRBc05leHRDb25maWcpIHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHMucHVzaChvYmplY3RMaXRlcmFsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9O1xuICBzb3VyY2UuZm9yRWFjaENoaWxkKHZpc2l0KTtcblxuICBjb25zdCBvYmplY3RMaXRlcmFsID1cbiAgICB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzWzBdID8/XG4gICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/P1xuICAgIChleHBvcnRlZElkZW50aWZpZXIgPyB2YXJpYWJsZU9iamVjdExpdGVyYWxzLmdldChleHBvcnRlZElkZW50aWZpZXIpIDogdW5kZWZpbmVkKSA/P1xuICAgIHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuZ2V0KCduZXh0Q29uZmlnJyk7XG4gIHJldHVybiBvYmplY3RMaXRlcmFsID8geyBzb3VyY2UsIG9iamVjdExpdGVyYWwgfSA6IHVuZGVmaW5lZDtcbn1cblxuLy8gVW53cmFwIGAoeyAuLi4gfSlgIC8gYHsgLi4uIH0gYXMgTmV4dENvbmZpZ2AgLyBgeyAuLi4gfSBzYXRpc2ZpZXMgTmV4dENvbmZpZ2AgdG8gdGhlIG9iamVjdCBsaXRlcmFsLlxuZnVuY3Rpb24gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGN1cnJlbnQgPSB1bndyYXBFeHByZXNzaW9uKG5vZGUpO1xuICByZXR1cm4gYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oY3VycmVudCkgPyBjdXJyZW50IDogdW5kZWZpbmVkO1xufVxuXG4vLyBSZXR1cm4gdGhlIGFzc2VydGVkIHR5cGUgb2YgYSBgc2F0aXNmaWVzYC9gYXNgIGV4cHJlc3Npb24sIGlmIGFueSAoaWdub3Jpbmcgd3JhcHBpbmcgcGFyZW50aGVzZXMpLlxuZnVuY3Rpb24gZ2V0QXNzZXJ0ZWRUeXBlKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0LlR5cGVOb2RlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY3VycmVudCA9IHVud3JhcFBhcmVudGhlc2VzKG5vZGUpO1xuICByZXR1cm4gYXN0LmlzQXNFeHByZXNzaW9uKGN1cnJlbnQpIHx8IGFzdC5pc1NhdGlzZmllc0V4cHJlc3Npb24oY3VycmVudCkgPyBjdXJyZW50LnR5cGUgOiB1bmRlZmluZWQ7XG59XG5cbi8vIFBlZWwgcGFyZW50aGVzZXMgYW5kIGBhc2AvYHNhdGlzZmllc2AgYXNzZXJ0aW9ucyBvZmYgYW4gZXhwcmVzc2lvbi5cbmZ1bmN0aW9uIHVud3JhcEV4cHJlc3Npb24obm9kZTogYXN0LkV4cHJlc3Npb24pOiBhc3QuTm9kZSB7XG4gIGxldCBjdXJyZW50OiBhc3QuTm9kZSA9IHVud3JhcFBhcmVudGhlc2VzKG5vZGUpO1xuICB3aGlsZSAoYXN0LmlzQXNFeHByZXNzaW9uKGN1cnJlbnQpIHx8IGFzdC5pc1NhdGlzZmllc0V4cHJlc3Npb24oY3VycmVudCkpIHtcbiAgICBjdXJyZW50ID0gdW53cmFwUGFyZW50aGVzZXMoY3VycmVudC5leHByZXNzaW9uKTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLy8gUGVlbCB3cmFwcGluZyBwYXJlbnRoZXNlcyBvZmYgYW4gZXhwcmVzc2lvbi5cbmZ1bmN0aW9uIHVud3JhcFBhcmVudGhlc2VzKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0LkV4cHJlc3Npb24ge1xuICBsZXQgY3VycmVudCA9IG5vZGU7XG4gIHdoaWxlIChhc3QuaXNQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihjdXJyZW50KSkge1xuICAgIGN1cnJlbnQgPSBjdXJyZW50LmV4cHJlc3Npb247XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8vIE1hdGNoIGJvdGggdGhlIGJhcmUgYE5leHRDb25maWdgIGFuZCBxdWFsaWZpZWQgZm9ybXMgbGlrZSBgaW1wb3J0KCduZXh0JykuTmV4dENvbmZpZ2AuXG5mdW5jdGlvbiBpc05leHRDb25maWdUeXBlKHR5cGVUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVUZXh0ID09PSAnTmV4dENvbmZpZycgfHwgdHlwZVRleHQuZW5kc1dpdGgoJy5OZXh0Q29uZmlnJyk7XG59XG5cbi8vIFJldHVybiBhIHByb3BlcnR5IGtleSB3aXRob3V0IHN1cnJvdW5kaW5nIHF1b3Rlcywgc28gYCdyZWFjdENvbXBpbGVyJ2AgbWF0Y2hlcyBgcmVhY3RDb21waWxlcmAuXG4vLyBJZGVudGlmaWVyLCBzdHJpbmctbGl0ZXJhbCBhbmQgbnVtZXJpYy1saXRlcmFsIG5hbWVzIGFsbCBleHBvc2UgdGhlIHVucXVvdGVkIHZhbHVlIHZpYSBgLnRleHRgLlxuZnVuY3Rpb24gZ2V0UHJvcGVydHlLZXkobmFtZTogYXN0LlByb3BlcnR5TmFtZSwgc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHN0cmluZyB7XG4gIHJldHVybiAndGV4dCcgaW4gbmFtZSAmJiB0eXBlb2YgbmFtZS50ZXh0ID09PSAnc3RyaW5nJyA/IG5hbWUudGV4dCA6IG5hbWUuZ2V0VGV4dChzb3VyY2UpO1xufVxuXG4vLyBSZW1vdmUgbGluZSBhbmQgYmxvY2sgY29tbWVudHMgZnJvbSBhIHNvdXJjZSBzbmlwcGV0LlxuZnVuY3Rpb24gc3RyaXBDb21tZW50cyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9cXC9cXC9bXlxcbl0qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgJycpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkpzT3JUcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvZXNDb250YWluSmF2YShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkphdmEgfHwgY29uZmlnLmRvZXNDb250YWluSmF2YUluUGFja2FnZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQoY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdpc0J1bic+KTogJ2J1bicgfCAneWFybicge1xuICByZXR1cm4gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZU1hbmFnZXJDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG50eXBlIFBhcnNlZFZhbHVlID1cbiAgfCB7IGtpbmQ6ICdhcnJheSc7IHZhbHVlOiBQYXJzZWRWYWx1ZVtdIH1cbiAgfCB7IGtpbmQ6ICdsaXRlcmFsJzsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnb2JqZWN0JzsgdmFsdWU6IFBhcnNlZE9iamVjdCB9O1xudHlwZSBPYmplY3RNZW1iZXIgPSB7IGtpbmQ6ICdleHRyYSc7IGluZGV4OiBudW1iZXIgfSB8IHsga2luZDogJ3Byb3BlcnR5Jzsga2V5OiBzdHJpbmcgfTtcbmludGVyZmFjZSBQYXJzZWRPYmplY3Qge1xuICBleHRyYU1lbWJlcnM6IHN0cmluZ1tdO1xuICBtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW107XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcbn1cbmludGVyZmFjZSBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHtcbiAgc291cmNlOiBhc3QuU291cmNlRmlsZTtcbiAgbm9kZTogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uO1xufVxuXG5jb25zdCBsaXRlcmFsID0gKHZhbHVlOiBzdHJpbmcpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnbGl0ZXJhbCcsIHZhbHVlIH0pO1xuY29uc3QgYXNBcnJheSA9ICh2YWx1ZTogUGFyc2VkVmFsdWVbXSk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdhcnJheScsIHZhbHVlIH0pO1xuY29uc3QgYXNPYmplY3QgPSAocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRWYWx1ZSA9PiAoe1xuICBraW5kOiAnb2JqZWN0JyxcbiAgdmFsdWU6IHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXMsIGV4dHJhTWVtYmVycyksXG59KTtcblxuZnVuY3Rpb24gY3JlYXRlRGVmYXVsdENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzOiBib29sZWFuKTogUGFyc2VkT2JqZWN0IHtcbiAgY29uc3QgdXNlID0gdG9QYXJzZWRPYmplY3Qoe1xuICAgIHRyYWNlOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgICBzY3JlZW5zaG90OiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb25seS1vbi1mYWlsdXJlJyA6ICdvbidcIiksXG4gICAgdmlkZW86IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICB9KTtcblxuICBpZiAoc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMpIHtcbiAgICB1c2UucHJvcGVydGllcy5iYXNlVVJMID0gbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKTtcbiAgICB1c2UubWVtYmVyT3JkZXIudW5zaGlmdCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleTogJ2Jhc2VVUkwnIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRvUGFyc2VkT2JqZWN0KHtcbiAgICBmb3JiaWRPbmx5OiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgcmV0cmllczogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuUFdERUJVRyA/IDAgOiBwcm9jZXNzLmVudi5DSSA/IDUgOiAxJyksXG4gICAgdXNlOiB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogdXNlIH0sXG4gICAgLi4uKHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzXG4gICAgICA/IHtcbiAgICAgICAgICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IGxpdGVyYWwoZ2V0V2JTdGFydFRlc3RDb21tYW5kKGNvbmZpZykpLFxuICAgICAgICAgICAgdXJsOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgICAgICAgICAgcmV1c2VFeGlzdGluZ1NlcnZlcjogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgICAgICAgICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgICAgICAgICAgc3Rkb3V0OiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgICAgICAgICAgc3RkZXJyOiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgICAgICAgICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgICAgICAgICBncmFjZWZ1bFNodXRkb3duOiBsaXRlcmFsKGB7XG4gIHNpZ25hbDogJ1NJR1RFUk0nLFxuICB0aW1lb3V0OiA1MDAsXG59YCksXG4gICAgICAgICAgfSksXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gdG9QYXJzZWRPYmplY3QocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRPYmplY3Qge1xuICByZXR1cm4ge1xuICAgIGV4dHJhTWVtYmVycyxcbiAgICBtZW1iZXJPcmRlcjogW1xuICAgICAgLi4uT2JqZWN0LmtleXMocHJvcGVydGllcykubWFwKChrZXkpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pKSxcbiAgICAgIC4uLmV4dHJhTWVtYmVycy5tYXAoKF8sIGluZGV4KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pKSxcbiAgICBdLFxuICAgIHByb3BlcnRpZXMsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYHBsYXl3cmlnaHQuY29uZmlnLnRzYCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCA9IGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoKTtcbiAgICBpZiAoIWV4dHJhY3RlZE9iamVjdExpdGVyYWwpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgaWYgKCFwYXJzZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzID1cbiAgICAgIChhd2FpdCBkb2VzRGVmaW5lTmV4dFB1YmxpY0Jhc2VVcmwoY29uZmlnLmRpclBhdGgpKSAmJiBzaG91bGRNYW5hZ2VBcHBTZXJ2ZXJEZWZhdWx0cyhjb25maWcsIHBhcnNlZCk7XG4gICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IGNyZWF0ZURlZmF1bHRDb25maWcoY29uZmlnLCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cyk7XG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VQYXJzZWRPYmplY3RzKGRlZmF1bHRDb25maWcsIHBhcnNlZCk7XG4gICAgYXBwbHlNYW5hZ2VkVXNlRGVmYXVsdHMobWVyZ2VkLCBkZWZhdWx0Q29uZmlnKTtcbiAgICBzZXRXZWJTZXJ2ZXJDb21tYW5kKG1lcmdlZCwgY29uZmlnKTtcblxuICAgIGNvbnN0IG5ld09iamVjdExpdGVyYWwgPSBzdHJpbmdpZnlWYWx1ZSh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VkIH0sIDApO1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZS50ZXh0O1xuICAgIGNvbnN0IHN0YXJ0ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldFN0YXJ0KGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBjb25zdCBlbmQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0RW5kKCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgc3RhcnQpfSR7bmV3T2JqZWN0TGl0ZXJhbH0ke29sZENvbnRlbnQuc2xpY2UoZW5kKX1gO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlOiBQYXJzZWRPYmplY3QsIG92ZXJyaWRlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRPYmplY3Qge1xuICBjb25zdCBvdmVycmlkZVByb3BlcnR5S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMob3ZlcnJpZGUucHJvcGVydGllcykpO1xuICBjb25zdCBleHRyYU1lbWJlcnMgPSBbLi4uYmFzZS5leHRyYU1lbWJlcnMsIC4uLm92ZXJyaWRlLmV4dHJhTWVtYmVyc107XG4gIC8vIEtlZXAgZGVmYXVsdC1vbmx5IG1lbWJlcnMgYmVmb3JlIHBhcnNlZCBtZW1iZXJzIHNvIHNwcmVhZHMgYW5kIGV4cGxpY2l0IGxvY2FsIHByb3BlcnRpZXMgcmV0YWluIHByZWNlZGVuY2UuXG4gIGNvbnN0IG1lbWJlck9yZGVyID0gW1xuICAgIC4uLmJhc2UubWVtYmVyT3JkZXIuZmlsdGVyKChtZW1iZXIpID0+IG1lbWJlci5raW5kICE9PSAncHJvcGVydHknIHx8ICFvdmVycmlkZVByb3BlcnR5S2V5cy5oYXMobWVtYmVyLmtleSkpLFxuICAgIC4uLm92ZXJyaWRlLm1lbWJlck9yZGVyLm1hcCgobWVtYmVyKTogT2JqZWN0TWVtYmVyID0+IHtcbiAgICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5JykgcmV0dXJuIG1lbWJlcjtcbiAgICAgIHJldHVybiB7IGtpbmQ6ICdleHRyYScsIGluZGV4OiBiYXNlLmV4dHJhTWVtYmVycy5sZW5ndGggKyBtZW1iZXIuaW5kZXggfTtcbiAgICB9KSxcbiAgXTtcbiAgY29uc3QgcHJvcGVydGllcyA9IHsgLi4uYmFzZS5wcm9wZXJ0aWVzIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG92ZXJyaWRlLnByb3BlcnRpZXMpKSB7XG4gICAgcHJvcGVydGllc1trZXldID0gbWVyZ2VQYXJzZWRWYWx1ZShwcm9wZXJ0aWVzW2tleV0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4geyBleHRyYU1lbWJlcnMsIG1lbWJlck9yZGVyLCBwcm9wZXJ0aWVzIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkVmFsdWUoYmFzZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQsIG92ZXJyaWRlOiBQYXJzZWRWYWx1ZSk6IFBhcnNlZFZhbHVlIHtcbiAgaWYgKGJhc2U/LmtpbmQgPT09ICdvYmplY3QnICYmIG92ZXJyaWRlLmtpbmQgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZS52YWx1ZSwgb3ZlcnJpZGUudmFsdWUpIH07XG4gIH1cbiAgcmV0dXJuIG92ZXJyaWRlO1xufVxuXG5mdW5jdGlvbiBhcHBseU1hbmFnZWRVc2VEZWZhdWx0cyhjb25maWc6IFBhcnNlZE9iamVjdCwgZGVmYXVsdENvbmZpZzogUGFyc2VkT2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IHVzZSA9IGNvbmZpZy5wcm9wZXJ0aWVzLnVzZTtcbiAgY29uc3QgZGVmYXVsdFVzZSA9IGRlZmF1bHRDb25maWcucHJvcGVydGllcy51c2U7XG4gIGlmICh1c2U/LmtpbmQgIT09ICdvYmplY3QnIHx8IGRlZmF1bHRVc2U/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgWyd0cmFjZScsICdzY3JlZW5zaG90JywgJ3ZpZGVvJ10pIHtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VXNlLnZhbHVlLnByb3BlcnRpZXNba2V5XTtcbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICB1c2UudmFsdWUucHJvcGVydGllc1trZXldID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRNYW5hZ2VBcHBTZXJ2ZXJEZWZhdWx0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIHBhcnNlZDogUGFyc2VkT2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8XG4gICAgcGFyc2VkLnByb3BlcnRpZXMud2ViU2VydmVyICE9PSB1bmRlZmluZWQgfHxcbiAgICBkb2VzT2JqZWN0SGF2ZUJhc2VVcmwocGFyc2VkLnByb3BlcnRpZXMudXNlKSB8fFxuICAgIGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBwYXJzZWQgfSwgJ05FWFRfUFVCTElDX0JBU0VfVVJMJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gZG9lc09iamVjdEhhdmVCYXNlVXJsKHZhbHVlOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWU/LmtpbmQgPT09ICdvYmplY3QnICYmIHZhbHVlLnZhbHVlLnByb3BlcnRpZXMuYmFzZVVSTCAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbCh2YWx1ZTogUGFyc2VkVmFsdWUsIGxpdGVyYWxUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlLmluY2x1ZGVzKGxpdGVyYWxUZXh0KTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHJldHVybiB2YWx1ZS52YWx1ZS5zb21lKChjaGlsZCkgPT4gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoY2hpbGQsIGxpdGVyYWxUZXh0KSk7XG4gIHJldHVybiAoXG4gICAgdmFsdWUudmFsdWUuZXh0cmFNZW1iZXJzLnNvbWUoKG1lbWJlcikgPT4gbWVtYmVyLmluY2x1ZGVzKGxpdGVyYWxUZXh0KSkgfHxcbiAgICBPYmplY3QudmFsdWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpLnNvbWUoKGNoaWxkKSA9PiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbChjaGlsZCwgbGl0ZXJhbFRleHQpKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb2VzRGVmaW5lTmV4dFB1YmxpY0Jhc2VVcmwoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGZvciAoY29uc3QgZW52RmlsZVBhdGggb2YgZ2V0RW52RmlsZVBhdGhzKGRpclBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICgvTkVYVF9QVUJMSUNfQkFTRV9VUkxcXHMqPS9tLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIGVudiBmaWxlcyBhcmUgZXhwZWN0ZWQgaW4gc29tZSByZXBvcy5cbiAgICB9XG4gIH1cblxuICAvLyBTb21lIFBsYXl3cmlnaHQgY29uZmlncyBvbmx5IGRlZmluZSBicm93c2VyIHByb2plY3RzIG9yIGZpeHR1cmVzIGFuZCBkbyBub3RcbiAgLy8gc3RhcnQgYSB3ZWIgYXBwLiBBdm9pZCBmb3JjaW5nIGFuIGFwcC1zZXJ2ZXIgVVJMIGludG8gdGhvc2UgcGFja2FnZXMuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RW52RmlsZVBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZW52RmlsZU5hbWVzID0gWycuZW52JywgJy5lbnYudGVzdCcsICcuZW52LmV4YW1wbGUnLCAnbWlzZS50b21sJywgJ21pc2UudGVzdC50b21sJ107XG4gIGNvbnN0IGVudkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTsgOyBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCkpIHtcbiAgICBlbnZGaWxlUGF0aHMucHVzaCguLi5lbnZGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gcGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCBmaWxlTmFtZSkpKTtcblxuICAgIC8vIFBsYXl3cmlnaHQgY29uZmlncyBvZnRlbiBsaXZlIGluIHBhY2thZ2VzLyogd2hpbGUgc2hhcmVkIGVudiBmaWxlcyBsaXZlIGF0IHRoZVxuICAgIC8vIHJlcG9zaXRvcnkgcm9vdCwgc28gd2FsayB1cHdhcmQgdW50aWwgdGhlIHRhcmdldCByZXBvIGJvdW5kYXJ5LlxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgJy5naXQnKSkpIGJyZWFrO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBlbnZGaWxlUGF0aHM7XG59XG5cbmZ1bmN0aW9uIHNldFdlYlNlcnZlckNvbW1hbmQob2JqZWN0OiBQYXJzZWRPYmplY3QsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHZvaWQge1xuICBjb25zdCB3ZWJTZXJ2ZXIgPSBvYmplY3QucHJvcGVydGllcy53ZWJTZXJ2ZXI7XG4gIGlmICh3ZWJTZXJ2ZXI/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgLy8gd2Igb3ducyB0aGUgY2Fub25pY2FsIHRlc3Qtc2VydmVyIHN0YXJ0dXAgcGF0aDsga2VlcCBjdXN0b20gUGxheXdyaWdodFxuICAvLyBzZXJ2ZXIgc2V0dGluZ3Mgd2hpbGUgbm9ybWFsaXppbmcgdGhlIGNvbW1hbmQgaXRzZWxmLiBJbnZva2Ugd2IgdGhyb3VnaCB0aGVcbiAgLy8gcGFja2FnZSBtYW5hZ2VyIGJlY2F1c2UgdGFyZ2V0IHJlcG9zIGluc3RhbGwgd2IgYXMgYSBwYWNrYWdlIGRlcGVuZGVuY3kuXG4gIHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQgPSBsaXRlcmFsKGdldFdiU3RhcnRUZXN0Q29tbWFuZChjb25maWcpKTtcbn1cblxuZnVuY3Rpb24gZ2V0V2JTdGFydFRlc3RDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJyR7Z2V0UGFja2FnZU1hbmFnZXJDb21tYW5kKGNvbmZpZyl9IHdiIHN0YXJ0IC0tbW9kZSB0ZXN0J2A7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoOiBzdHJpbmcpOiBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVHlwZVNjcmlwdCBhbHJlYWR5IHVuZGVyc3RhbmRzIG5lc3RlZCBvYmplY3QgbGl0ZXJhbHMgYW5kIHRlbXBsYXRlIHN0cmluZ3MsIHNvIHVzZVxuICAvLyBpdHMgQVNUIHJhbmdlcyBpbnN0ZWFkIG9mIGEgcmVnZXggdGhhdCBjYW4gc3RvcCBhdCB0aGUgZmlyc3QgaW5uZXIgY2xvc2luZyBicmFjZS5cbiAgbGV0IGZvdW5kOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IGFzdC5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgaWYgKGFzdC5pc0NhbGxFeHByZXNzaW9uKG5vZGUpICYmIG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkgPT09ICdkZWZpbmVDb25maWcnKSB7XG4gICAgICBjb25zdCBmaXJzdEFyZ3VtZW50ID0gbm9kZS5hcmd1bWVudHNbMF07XG4gICAgICBpZiAoZmlyc3RBcmd1bWVudCAmJiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZ3VtZW50KSkge1xuICAgICAgICBmb3VuZCA9IGZpcnN0QXJndW1lbnQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9O1xuICBzb3VyY2UuZm9yRWFjaENoaWxkKHZpc2l0KTtcblxuICByZXR1cm4gZm91bmQgPyB7IHNvdXJjZSwgbm9kZTogZm91bmQgfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb246IGFzdC5FeHByZXNzaW9uLCBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAoYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBwYXJzZWRPYmplY3QgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24sIHNvdXJjZSk7XG4gICAgcmV0dXJuIHBhcnNlZE9iamVjdCA/IHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBwYXJzZWRPYmplY3QgfSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmIChhc3QuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBleHByZXNzaW9uLmVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gcGFyc2VFeHByZXNzaW9uKGVsZW1lbnQsIHNvdXJjZSkpO1xuICAgIGlmIChlbGVtZW50cy5zb21lKChlbGVtZW50KTogZWxlbWVudCBpcyB1bmRlZmluZWQgPT4gZWxlbWVudCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYXNBcnJheShlbGVtZW50cyBhcyBQYXJzZWRWYWx1ZVtdKTtcbiAgfVxuICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oXG4gIG9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgc291cmNlOiBhc3QuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7IGV4dHJhTWVtYmVyczogW10sIG1lbWJlck9yZGVyOiBbXSwgcHJvcGVydGllczoge30gfTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoYXN0LmlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSkge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gbGl0ZXJhbChrZXkpO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIWFzdC5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgfHxcbiAgICAgICghYXN0LmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhYXN0LmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSlcbiAgICApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VkLmV4dHJhTWVtYmVycy5wdXNoKHByb3BlcnR5LmdldFRleHQoc291cmNlKSkgLSAxO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlWYWx1ZSh2YWx1ZTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgIGlmICh2YWx1ZS52YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICAgIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gICAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICAgIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbMF19YDtcbiAgICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYFtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH1dYDtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG5cbiAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgY29uc3QgZW1pdHRlZFByb3BlcnRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkodmFsdWUudmFsdWUubWVtYmVyT3JkZXIpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyLmZsYXRNYXAoKG1lbWJlciwgaW5kZXgpID0+IHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdleHRyYScpIHtcbiAgICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0TWVtYmVyKHZhbHVlLnZhbHVlLmV4dHJhTWVtYmVyc1ttZW1iZXIuaW5kZXhdID8/ICcnLCBpbmRlbnQpXTtcbiAgICB9XG5cbiAgICBpZiAobGFzdFByb3BlcnR5SW5kZXhCeUtleS5nZXQobWVtYmVyLmtleSkgIT09IGluZGV4KSByZXR1cm4gW107XG4gICAgY29uc3QgaXRlbSA9IHZhbHVlLnZhbHVlLnByb3BlcnRpZXNbbWVtYmVyLmtleV07XG4gICAgaWYgKCFpdGVtIHx8IGVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhtZW1iZXIua2V5KSkgcmV0dXJuIFtdO1xuICAgIGVtaXR0ZWRQcm9wZXJ0aWVzLmFkZChtZW1iZXIua2V5KTtcbiAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdFByb3BlcnR5KG1lbWJlci5rZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpXTtcbiAgfSk7XG4gIGxpbmVzLnB1c2goXG4gICAgLi4uT2JqZWN0LmVudHJpZXModmFsdWUudmFsdWUucHJvcGVydGllcylcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhZW1pdHRlZFByb3BlcnRpZXMuaGFzKGtleSkpXG4gICAgICAubWFwKChba2V5LCBpdGVtXSkgPT4gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KSlcbiAgKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGB7XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xuICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH19YDtcbn1cblxuZnVuY3Rpb24gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleShtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW10pOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBtZW1iZXJdIG9mIG1lbWJlck9yZGVyLmVudHJpZXMoKSkge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgbGFzdFByb3BlcnR5SW5kZXhCeUtleS5zZXQobWVtYmVyLmtleSwgaW5kZXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGFzdFByb3BlcnR5SW5kZXhCeUtleTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5OiBzdHJpbmcsIGl0ZW06IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICB9XG4gIH1cbiAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtrZXl9OiAke3N0cmluZ2lmaWVkWzBdfWA7XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0TWVtYmVyKG1lbWJlcjogc3RyaW5nLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gbWVtYmVyLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBzdHJpbmdpZmllZC5lbnRyaWVzKCkpIHtcbiAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtsaW5lfWA7XG4gIH1cbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLmFudGlncmF2aXR5Y2xpLyoqJyxcbiAgJyoqLy52ZW52LyoqJyxcbiAgJyoqL3Rlc3QtZml4dHVyZXMvKionLFxuICAnKiovdGVzdC9maXh0dXJlcy8qKicsXG4gICcqKi9kaXN0LyoqJyxcbiAgJyoqL2J1aWxkLyoqJyxcbiAgJyoqL3RhcmdldC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL3RtcC8qKicsXG5dO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQcmlzbWFFbnZGaWxlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQcmlzbWFFbnZGaWxlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzaG91bGRBZGRDb25uZWN0aW9uTGltaXQgPSBzaG91bGRBZGRTcWxpdGVDb25uZWN0aW9uTGltaXQoY29uZmlnKTtcbiAgICBjb25zdCBlbnZGaWxlcyA9IGF3YWl0IGZnLmdsb2IoWycqLmVudicsICcqLmVudi4qJ10sIHsgZG90OiB0cnVlLCBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgZm9yIChjb25zdCBlbnZGaWxlIG9mIGVudkZpbGVzKSB7XG4gICAgICBjb25zdCBlbnZGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZW52RmlsZSk7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKFxuICAgICAgICAvREFUQUJBU0VfVVJMXFxzKj1cXHMqXCI/KFteXCIjXFxuXSs/XFwuc3FsaXRlM1teXCIjXFxuXSopXCI/L2csXG4gICAgICAgIChtYXRjaCwgdXJsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXR1cm4gYERBVEFCQVNFX1VSTD1cIiR7bm9ybWFsaXplU3FsaXRlRGF0YWJhc2VVcmwodXJsLCBzaG91bGRBZGRDb25uZWN0aW9uTGltaXQpfVwiYDtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShlbnZGaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQWRkU3FsaXRlQ29ubmVjdGlvbkxpbWl0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIC8vIGBjb25uZWN0aW9uX2xpbWl0PTFgIG9ubHkgYXBwbGllcyB0byBQcmlzbWEncyBTUUxpdGUgZGF0YXNvdXJjZSBoYW5kbGluZy5cbiAgLy8gUmVwb3MgdGhhdCBvcHQgaW50byBub24tcHVyZSBTUUxpdGUgYWRhcHRlcnMgc2hvdWxkIGtlZXAgdGhlaXIgVVJMIGFzLWlzLlxuICByZXR1cm4gIWRlcGVuZGVuY2llc1snQHByaXNtYS9hZGFwdGVyLWJldHRlci1zcWxpdGUzJ10gJiYgIWRlcGVuZGVuY2llc1snQHByaXNtYS9hZGFwdGVyLWxpYnNxbCddO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTcWxpdGVEYXRhYmFzZVVybCh1cmw6IHN0cmluZywgc2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcXVlcnlTdGFydCA9IHVybC5pbmRleE9mKCc/Jyk7XG4gIGNvbnN0IHBhdGhQYXJ0ID0gcXVlcnlTdGFydCAhPT0gLTEgPyB1cmwuc2xpY2UoMCwgcXVlcnlTdGFydCkgOiB1cmw7XG4gIGNvbnN0IHF1ZXJ5UGFydCA9IHF1ZXJ5U3RhcnQgIT09IC0xID8gdXJsLnNsaWNlKHF1ZXJ5U3RhcnQgKyAxKSA6ICcnO1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5UGFydCk7XG5cbiAgcGFyYW1zLmRlbGV0ZSgnY29ubmVjdGlvbl9saW1pdCcpO1xuICBpZiAoc2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0KSB7XG4gICAgcGFyYW1zLnNldCgnY29ubmVjdGlvbl9saW1pdCcsICcxJyk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRRdWVyeSA/IGAke3BhdGhQYXJ0fT8ke25vcm1hbGl6ZWRRdWVyeX1gIDogcGF0aFBhcnQ7XG59XG4iLCJjb25zdCBoYXMgPSAob2JqZWN0LCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydE9iamVjdEJ5S2V5TmFtZUxpc3Qob2JqZWN0LCBzb3J0V2l0aCkge1xuICBsZXQga2V5cywgc29ydEZuLCBrZXlcblxuICBpZiAodHlwZW9mIHNvcnRXaXRoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc29ydEZuID0gc29ydFdpdGhcbiAgfSBlbHNlIHtcbiAgICBrZXlzID0gc29ydFdpdGhcbiAgfVxuXG4gIGNvbnN0IHRvdGFsID0ge31cbiAgY29uc3Qgb2JqZWN0S2V5cyA9IFsuLi4oa2V5cyA/PyBbXSksIC4uLk9iamVjdC5rZXlzKG9iamVjdCkuc29ydChzb3J0Rm4pXVxuXG4gIGZvciAoa2V5IG9mIG9iamVjdEtleXMpIHtcbiAgICBpZiAoaGFzKG9iamVjdCwga2V5KSkge1xuICAgICAgdG90YWxba2V5XSA9IG9iamVjdFtrZXldXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdGFsXG59XG4iLCIvLyBEZXRlY3QgZWl0aGVyIHNwYWNlcyBvciB0YWJzIGJ1dCBub3QgYm90aCB0byBwcm9wZXJseSBoYW5kbGUgdGFicyBmb3IgaW5kZW50YXRpb24gYW5kIHNwYWNlcyBmb3IgYWxpZ25tZW50XG5jb25zdCBJTkRFTlRfUkVHRVggPSAvXig/OiggKSt8XFx0KykvO1xuXG5jb25zdCBJTkRFTlRfVFlQRV9TUEFDRSA9ICdzcGFjZSc7XG5jb25zdCBJTkRFTlRfVFlQRV9UQUIgPSAndGFiJztcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHdlIHNob3VsZCBpZ25vcmUgc2luZ2xlIHNwYWNlIHBhdHRlcm5zXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIHZhbHVlKSB7XG5cdHJldHVybiBpZ25vcmVTaW5nbGVTcGFjZXMgJiYgaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgJiYgdmFsdWUgPT09IDE7XG59XG5cbi8qKlxuTWFrZSBhIE1hcCB0aGF0IGNvdW50cyBob3cgbWFueSBpbmRlbnRzL3VuaW5kZW50cyBoYXZlIG9jY3VycmVkIGZvciBhIGdpdmVuIHNpemUgYW5kIGhvdyBtYW55IGxpbmVzIGZvbGxvdyBhIGdpdmVuIGluZGVudGF0aW9uLlxuXG5UaGUga2V5IGlzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgaW5kZW50YXRpb24gdHlwZSAocyA9IHNwYWNlIGFuZCB0ID0gdGFiKSBhbmQgdGhlIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzLlxuXG5gYGBcbmluZGVudHMgPSB7XG5cdHQzOiBbMSwgMF0sXG5cdHQ0OiBbMSwgNV0sXG5cdHM1OiBbMSwgMF0sXG5cdHMxMjogWzEsIDBdLFxufVxuYGBgXG4qL1xuZnVuY3Rpb24gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBpZ25vcmVTaW5nbGVTcGFjZXMpIHtcblx0Y29uc3QgaW5kZW50cyA9IG5ldyBNYXAoKTtcblxuXHQvLyBSZW1lbWJlciB0aGUgc2l6ZSBvZiBwcmV2aW91cyBsaW5lJ3MgaW5kZW50YXRpb25cblx0bGV0IHByZXZpb3VzU2l6ZSA9IDA7XG5cdGxldCBwcmV2aW91c0luZGVudFR5cGU7XG5cblx0Ly8gSW5kZW50cyBrZXkgKGlkZW50IHR5cGUgKyBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cylcblx0bGV0IGtleTtcblxuXHRmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyaW5nLnNwbGl0KC9cXG4vZykpIHtcblx0XHRpZiAoIWxpbmUpIHtcblx0XHRcdC8vIElnbm9yZSBlbXB0eSBsaW5lc1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWF0Y2hlcyA9IGxpbmUubWF0Y2goSU5ERU5UX1JFR0VYKTtcblxuXHRcdGlmIChtYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGluZGVudCA9IG1hdGNoZXNbMF0ubGVuZ3RoO1xuXHRcdFx0Y29uc3QgaW5kZW50VHlwZSA9IG1hdGNoZXNbMV0gPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSB1bmxlc3MgaXQncyB0aGUgb25seSBpbmRlbnQgZGV0ZWN0ZWQgdG8gcHJldmVudCBjb21tb24gZmFsc2UgcG9zaXRpdmVzXG5cdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBpbmRlbnQpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaW5kZW50VHlwZSAhPT0gcHJldmlvdXNJbmRlbnRUeXBlKSB7XG5cdFx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9IGluZGVudFR5cGU7XG5cblx0XHRcdGxldCB1c2UgPSAxO1xuXHRcdFx0bGV0IHdlaWdodCA9IDA7XG5cblx0XHRcdGNvbnN0IGluZGVudERpZmZlcmVuY2UgPSBpbmRlbnQgLSBwcmV2aW91c1NpemU7XG5cdFx0XHRwcmV2aW91c1NpemUgPSBpbmRlbnQ7XG5cblx0XHRcdC8vIFByZXZpb3VzIGxpbmUgaGF2ZSBzYW1lIGluZGVudD9cblx0XHRcdGlmIChpbmRlbnREaWZmZXJlbmNlID09PSAwKSB7XG5cdFx0XHRcdC8vIE5vdCBhIG5ldyBcInVzZVwiIG9mIHRoZSBjdXJyZW50IGluZGVudDpcblx0XHRcdFx0dXNlID0gMDtcblx0XHRcdFx0Ly8gQnV0IGRvIGFkZCBhIGJpdCB0byBpdCBmb3IgYnJlYWtpbmcgdGllczpcblx0XHRcdFx0d2VpZ2h0ID0gMTtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBrZXkgZnJvbSBwcmV2aW91cyBsb29wXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UgPSBNYXRoLmFicyhpbmRlbnREaWZmZXJlbmNlKTtcblxuXHRcdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIGNoYW5nZXMgd2hlbiBpZ25vcmVTaW5nbGVTcGFjZXMgaXMgdHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIHByZXZlbnRzIGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXMgZnJvbSB0aGluZ3MgbGlrZSBhbGlnbmVkIGNvbW1lbnRzXG5cdFx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBzdGF0c1xuXHRcdFx0Y29uc3QgZW50cnkgPSBpbmRlbnRzLmdldChrZXkpO1xuXHRcdFx0aW5kZW50cy5zZXQoa2V5LCBlbnRyeSA9PT0gdW5kZWZpbmVkID8gWzEsIDBdIDogW2VudHJ5WzBdICsgdXNlLCBlbnRyeVsxXSArIHdlaWdodF0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBpbmRlbnRzO1xufVxuXG4vLyBFbmNvZGUgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgYXMgYSBzdHJpbmcgKGUuZy4gJ3M0JykgZm9yIHVzZSBhcyBhIGNvbXBvdW5kIGtleSBpbiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGluZGVudEFtb3VudCkge1xuXHRjb25zdCB0eXBlQ2hhcmFjdGVyID0gaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAncycgOiAndCc7XG5cdHJldHVybiB0eXBlQ2hhcmFjdGVyICsgU3RyaW5nKGluZGVudEFtb3VudCk7XG59XG5cbi8vIEV4dHJhY3QgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgZnJvbSBhIGtleSBvZiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBkZWNvZGVJbmRlbnRzS2V5KGluZGVudHNLZXkpIHtcblx0Y29uc3Qga2V5SGFzVHlwZVNwYWNlID0gaW5kZW50c0tleVswXSA9PT0gJ3MnO1xuXHRjb25zdCB0eXBlID0ga2V5SGFzVHlwZVNwYWNlID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0Y29uc3QgYW1vdW50ID0gTnVtYmVyKGluZGVudHNLZXkuc2xpY2UoMSkpO1xuXG5cdHJldHVybiB7dHlwZSwgYW1vdW50fTtcbn1cblxuLy8gUmV0dXJuIHRoZSBrZXkgKGUuZy4gJ3M0JykgZnJvbSB0aGUgaW5kZW50cyBNYXAgdGhhdCByZXByZXNlbnRzIHRoZSBtb3N0IGNvbW1vbiBpbmRlbnQsXG4vLyBvciByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBpbmRlbnRzLlxuZnVuY3Rpb24gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cykge1xuXHRsZXQgcmVzdWx0O1xuXHRsZXQgbWF4VXNlZCA9IDA7XG5cdGxldCBtYXhXZWlnaHQgPSAwO1xuXG5cdGZvciAoY29uc3QgW2tleSwgW3VzZWRDb3VudCwgd2VpZ2h0XV0gb2YgaW5kZW50cykge1xuXHRcdGlmICh1c2VkQ291bnQgPiBtYXhVc2VkIHx8ICh1c2VkQ291bnQgPT09IG1heFVzZWQgJiYgd2VpZ2h0ID4gbWF4V2VpZ2h0KSkge1xuXHRcdFx0bWF4VXNlZCA9IHVzZWRDb3VudDtcblx0XHRcdG1heFdlaWdodCA9IHdlaWdodDtcblx0XHRcdHJlc3VsdCA9IGtleTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCkge1xuXHRjb25zdCBpbmRlbnRDaGFyYWN0ZXIgPSB0eXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICcgJyA6ICdcXHQnO1xuXHRyZXR1cm4gaW5kZW50Q2hhcmFjdGVyLnJlcGVhdChhbW91bnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RJbmRlbnQoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHQvLyBJZGVudGlmeSBpbmRlbnRzIHdoaWxlIHNraXBwaW5nIHNpbmdsZSBzcGFjZSBpbmRlbnRzIHRvIGF2b2lkIGNvbW1vbiBlZGdlIGNhc2VzIChlLmcuIGNvZGUgY29tbWVudHMpXG5cdC8vIElmIG5vIGluZGVudHMgYXJlIGlkZW50aWZpZWQsIHJ1biBhZ2FpbiBhbmQgaW5jbHVkZSBhbGwgaW5kZW50cyBmb3IgY29tcHJlaGVuc2l2ZSBkZXRlY3Rpb25cblx0bGV0IGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIHRydWUpO1xuXHRpZiAoaW5kZW50cy5zaXplID09PSAwKSB7XG5cdFx0aW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgZmFsc2UpO1xuXHR9XG5cblx0Y29uc3Qga2V5T2ZNb3N0VXNlZEluZGVudCA9IGdldE1vc3RVc2VkS2V5KGluZGVudHMpO1xuXG5cdGxldCB0eXBlO1xuXHRsZXQgYW1vdW50ID0gMDtcblx0bGV0IGluZGVudCA9ICcnO1xuXG5cdGlmIChrZXlPZk1vc3RVc2VkSW5kZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHQoe3R5cGUsIGFtb3VudH0gPSBkZWNvZGVJbmRlbnRzS2V5KGtleU9mTW9zdFVzZWRJbmRlbnQpKTtcblx0XHRpbmRlbnQgPSBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGFtb3VudCxcblx0XHR0eXBlLFxuXHRcdGluZGVudCxcblx0fTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lKHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Y29uc3QgbmV3bGluZXMgPSBzdHJpbmcubWF0Y2goLyg/Olxccj9cXG4pL2cpIHx8IFtdO1xuXG5cdGlmIChuZXdsaW5lcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjcmxmID0gbmV3bGluZXMuZmlsdGVyKG5ld2xpbmUgPT4gbmV3bGluZSA9PT0gJ1xcclxcbicpLmxlbmd0aDtcblx0Y29uc3QgbGYgPSBuZXdsaW5lcy5sZW5ndGggLSBjcmxmO1xuXG5cdHJldHVybiBjcmxmID4gbGYgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZUdyYWNlZnVsKHN0cmluZykge1xuXHRyZXR1cm4gKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnICYmIGRldGVjdE5ld2xpbmUoc3RyaW5nKSkgfHwgJ1xcbic7XG59XG4iLCIiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Y29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcblx0cmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkgJiYgIShTeW1ib2wuaXRlcmF0b3IgaW4gdmFsdWUpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgc29ydE9iamVjdEtleXMgZnJvbSAnc29ydC1vYmplY3Qta2V5cydcbmltcG9ydCBkZXRlY3RJbmRlbnQgZnJvbSAnZGV0ZWN0LWluZGVudCdcbmltcG9ydCB7IGRldGVjdE5ld2xpbmVHcmFjZWZ1bCBhcyBkZXRlY3ROZXdsaW5lIH0gZnJvbSAnZGV0ZWN0LW5ld2xpbmUnXG5pbXBvcnQgZ2l0SG9va3MgZnJvbSAnZ2l0LWhvb2tzLWxpc3QnXG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICdpcy1wbGFpbi1vYmonXG5pbXBvcnQgc2VtdmVyQ29tcGFyZSBmcm9tICdzZW12ZXIvZnVuY3Rpb25zL2NvbXBhcmUuanMnXG5pbXBvcnQgc2VtdmVyTWluVmVyc2lvbiBmcm9tICdzZW12ZXIvcmFuZ2VzL21pbi12ZXJzaW9uLmpzJ1xuXG5jb25zdCBwaXBlID1cbiAgKGZucykgPT5cbiAgKHgsIC4uLmFyZ3MpID0+XG4gICAgZm5zLnJlZHVjZSgocmVzdWx0LCBmbikgPT4gZm4ocmVzdWx0LCAuLi5hcmdzKSwgeClcbmNvbnN0IG9uQXJyYXkgPSAoZm4pID0+ICh4KSA9PiAoQXJyYXkuaXNBcnJheSh4KSA/IGZuKHgpIDogeClcbmNvbnN0IG9uU3RyaW5nQXJyYXkgPSAoZm4pID0+ICh4KSA9PlxuICBBcnJheS5pc0FycmF5KHgpICYmIHguZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykgPyBmbih4KSA6IHhcbmNvbnN0IHVuaXEgPSBvblN0cmluZ0FycmF5KCh4cykgPT4gWy4uLm5ldyBTZXQoeHMpXSlcbmNvbnN0IHNvcnRBcnJheSA9IG9uU3RyaW5nQXJyYXkoKGFycmF5KSA9PiBhcnJheS50b1NvcnRlZCgpKVxuY29uc3QgdW5pcUFuZFNvcnRBcnJheSA9IHBpcGUoW3VuaXEsIHNvcnRBcnJheV0pXG5jb25zdCBvbk9iamVjdCA9XG4gIChmbikgPT5cbiAgKHgsIC4uLmFyZ3MpID0+XG4gICAgaXNQbGFpbk9iamVjdCh4KSA/IGZuKHgsIC4uLmFyZ3MpIDogeFxuY29uc3Qgc29ydE9iamVjdEJ5ID0gKGNvbXBhcmF0b3IsIGRlZXApID0+IHtcbiAgY29uc3Qgb3ZlciA9IG9uT2JqZWN0KChvYmplY3QpID0+IHtcbiAgICBpZiAoZGVlcCkge1xuICAgICAgb2JqZWN0ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhvYmplY3QpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBvdmVyKHZhbHVlKV0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBzb3J0T2JqZWN0S2V5cyhvYmplY3QsIGNvbXBhcmF0b3IpXG4gIH0pXG5cbiAgcmV0dXJuIG92ZXJcbn1cbmNvbnN0IHNvcnRPYmplY3QgPSBzb3J0T2JqZWN0QnkoKVxuY29uc3Qgc29ydFVSTE9iamVjdCA9IHNvcnRPYmplY3RCeShbJ3R5cGUnLCAndXJsJ10pXG5jb25zdCBzb3J0UGVvcGxlT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsnbmFtZScsICdlbWFpbCcsICd1cmwnXSlcbmNvbnN0IHNvcnREaXJlY3RvcmllcyA9IHNvcnRPYmplY3RCeShbXG4gICdsaWInLFxuICAnYmluJyxcbiAgJ21hbicsXG4gICdkb2MnLFxuICAnZXhhbXBsZScsXG4gICd0ZXN0Jyxcbl0pXG5jb25zdCBvdmVyUHJvcGVydHkgPSAocHJvcGVydHksIG92ZXIpID0+XG4gIG9uT2JqZWN0KChvYmplY3QsIC4uLmFyZ3MpID0+XG4gICAgT2JqZWN0Lmhhc093bihvYmplY3QsIHByb3BlcnR5KVxuICAgICAgPyB7IC4uLm9iamVjdCwgW3Byb3BlcnR5XTogb3ZlcihvYmplY3RbcHJvcGVydHldLCAuLi5hcmdzKSB9XG4gICAgICA6IG9iamVjdCxcbiAgKVxuY29uc3Qgc29ydEdpdEhvb2tzID0gc29ydE9iamVjdEJ5KGdpdEhvb2tzKVxuXG5jb25zdCBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UgPSAoc3BlY2lmaWVyKSA9PiB7XG4gIC8vIElnbm9yZSBhbnl0aGluZyBhZnRlciA+ICYgcmVseSBvbiBmYWxsYmFjayBhbHBoYW51bWVyaWMgc29ydGluZyBmb3IgdGhhdFxuICBjb25zdCBbbmFtZUFuZFZlcnNpb25dID0gc3BlY2lmaWVyLnNwbGl0KCc+JylcbiAgY29uc3QgYXRNYXRjaGVzID0gWy4uLm5hbWVBbmRWZXJzaW9uLm1hdGNoQWxsKCdAJyldXG4gIGlmIChcbiAgICAhYXRNYXRjaGVzLmxlbmd0aCB8fFxuICAgIChhdE1hdGNoZXMubGVuZ3RoID09PSAxICYmIGF0TWF0Y2hlc1swXS5pbmRleCA9PT0gMClcbiAgKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogc3BlY2lmaWVyIH1cbiAgfVxuICBjb25zdCBzcGxpdEluZGV4ID0gYXRNYXRjaGVzLnBvcCgpLmluZGV4XG4gIHJldHVybiB7XG4gICAgbmFtZTogbmFtZUFuZFZlcnNpb24uc3Vic3RyaW5nKDAsIHNwbGl0SW5kZXgpLFxuICAgIHJhbmdlOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoc3BsaXRJbmRleCArIDEpLFxuICB9XG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeVNlbXZlciA9IHNvcnRPYmplY3RCeSgoYSwgYikgPT4ge1xuICBjb25zdCB7IG5hbWU6IGFOYW1lLCByYW5nZTogYVJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYSlcbiAgY29uc3QgeyBuYW1lOiBiTmFtZSwgcmFuZ2U6IGJSYW5nZSB9ID0gcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlKGIpXG5cbiAgaWYgKGFOYW1lICE9PSBiTmFtZSkge1xuICAgIHJldHVybiBhTmFtZS5sb2NhbGVDb21wYXJlKGJOYW1lLCAnZW4nKVxuICB9XG4gIGlmICghYVJhbmdlKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKCFiUmFuZ2UpIHtcbiAgICByZXR1cm4gMVxuICB9XG4gIHJldHVybiBzZW12ZXJDb21wYXJlKHNlbXZlck1pblZlcnNpb24oYVJhbmdlKSwgc2VtdmVyTWluVmVyc2lvbihiUmFuZ2UpKVxufSlcblxuY29uc3QgZ2V0UGFja2FnZU5hbWUgPSAoaWRlbnQpID0+IHtcbiAgY29uc3QgaW5kZXggPSBpZGVudC5pbmRleE9mKCdAJywgaWRlbnQuc3RhcnRzV2l0aCgnQCcpID8gMSA6IDApXG4gIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHVubGVzcyB1c2VyIG1hbnVhbGx5IGVkaXQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gIHJldHVybiBpbmRleCA9PT0gLTEgPyBpZGVudCA6IGlkZW50LnNsaWNlKDAsIGluZGV4KVxufVxuXG5jb25zdCBzb3J0T2JqZWN0QnlJZGVudCA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lQSA9IGdldFBhY2thZ2VOYW1lKGEpXG4gIGNvbnN0IHBhY2thZ2VOYW1lQiA9IGdldFBhY2thZ2VOYW1lKGIpXG5cbiAgaWYgKHBhY2thZ2VOYW1lQSA8IHBhY2thZ2VOYW1lQikgcmV0dXJuIC0xXG4gIGlmIChwYWNrYWdlTmFtZUEgPiBwYWNrYWdlTmFtZUIpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIENhY2hlIGJ5IGBwcm9jZXNzLmN3ZCgpYCBpbnN0ZWFkIG9mIGEgdmFyaWFibGUgdG8gYWxsb3cgdXNlciBjYWxsIGBwcm9jZXNzLmNoZGlyKClgXG5jb25zdCBjYWNoZSA9IG5ldyBNYXAoKVxuY29uc3QgaGFzWWFybk9yUG5wbUZpbGVzID0gKCkgPT4ge1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpXG4gIGlmICghY2FjaGUuaGFzKGN3ZCkpIHtcbiAgICBjYWNoZS5zZXQoXG4gICAgICBjd2QsXG4gICAgICBmcy5leGlzdHNTeW5jKCd5YXJuLmxvY2snKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCcueWFybi8nKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCcueWFybnJjLnltbCcpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJ3BucG0tbG9jay55YW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS13b3Jrc3BhY2UueWFtbCcpLFxuICAgIClcbiAgfVxuICByZXR1cm4gY2FjaGUuZ2V0KGN3ZClcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBwYWNrYWdlIG1hbmFnZXIgZnJvbSBwYWNrYWdlLmpzb24gYW5kIGxvY2sgZmlsZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYWNrYWdlSnNvbiAtIFRoZSBwYXJzZWQgcGFja2FnZS5qc29uIG9iamVjdFxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVGhlIGRldGVjdGVkIHBhY2thZ2UgbWFuYWdlci4gRGVmYXVsdCB0byBucG0gaWYgbm90IGRldGVjdGVkLlxuICovXG5mdW5jdGlvbiBzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbShwYWNrYWdlSnNvbikge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL2NvcmVwYWNrXG4gIGlmICh0eXBlb2YgcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyLnN0YXJ0c1dpdGgoJ25wbUAnKVxuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLmRldkVuZ2luZXM/LnBhY2thZ2VNYW5hZ2VyPy5uYW1lKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLmRldkVuZ2luZXMucGFja2FnZU1hbmFnZXIubmFtZSA9PT0gJ25wbSdcbiAgfVxuXG4gIGlmIChwYWNrYWdlSnNvbi5wbnBtKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBPcHRpbWlzYXRpb246IENoZWNrIGlmIG5wbSBpcyBleHBsaWNpdCBiZWZvcmUgcmVhZGluZyBGUy5cbiAgaWYgKHBhY2thZ2VKc29uLmVuZ2luZXM/Lm5wbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoaGFzWWFybk9yUG5wbUZpbGVzKCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogU29ydCBkZXBlbmRlbmNpZXMgYWxwaGFiZXRpY2FsbHksIGRldGVjdGluZyBwYWNrYWdlIG1hbmFnZXIgdG8gdXNlIHRoZVxuICogYXBwcm9wcmlhdGUgY29tcGFyaXNvbi4gbnBtIHVzZXMgbG9jYWxlLWF3YXJlIGNvbXBhcmlzb24sIHlhcm4gYW5kIHBucG0gdXNlXG4gKiBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb25cbiAqL1xuY29uc3Qgc29ydERlcGVuZGVuY2llcyA9IG9uT2JqZWN0KChkZXBlbmRlbmNpZXMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIC8vIEF2b2lkIGZpbGUgYWNjZXNzXG4gIGlmIChPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMpLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gZGVwZW5kZW5jaWVzXG4gIH1cblxuICAvLyBzb3J0IGRlcHMgbGlrZSB0aGUgbnBtIENMSSBkb2VzICh2aWEgdGhlIHBhY2thZ2UgQG5wbWNsaS9wYWNrYWdlLWpzb24pXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vcGFja2FnZS1qc29uL2Jsb2IvYjY0NjVmNDRjNzI3ZDY1MTNkYjY4OThjN2NiZTQxZGQzNTVjZWJlOC9saWIvdXBkYXRlLWRlcGVuZGVuY2llcy5qcyNMOC1MMjFcbiAgaWYgKHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSkge1xuICAgIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMsIChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYiwgJ2VuJykpXG4gIH1cblxuICByZXR1cm4gc29ydE9iamVjdEtleXMoZGVwZW5kZW5jaWVzKVxufSlcblxuLyoqXG4gKiBcIndvcmtzcGFjZXNcIiBjYW4gYmUgYW4gYXJyYXkgKG5wbSBvciB5YXJuIGNsYXNzaWMpIG9yIGFuIG9iamVjdCAocG5wbS9idW4pLlxuICogSW4gdGhlIGNhc2Ugb2YgYW4gYXJyYXksIHdlIGRvIG5vdCB3YW50IHRvIGFscGhhYmV0aWNhbGx5IHNvcnQgaXQgaW4gY2FzZVxuICogc2NyaXB0cyBuZWVkIHRvIHJ1biBpbiBhIHNwZWNpZmljIG9yZGVyLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9jbGkvdjcvdXNpbmctbnBtL3dvcmtzcGFjZXM/dj10cnVlI3J1bm5pbmctY29tbWFuZHMtaW4tdGhlLWNvbnRleHQtb2Ytd29ya3NwYWNlc1xuICovXG5jb25zdCBzb3J0V29ya3NwYWNlcyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoWydwYWNrYWdlcycsICdjYXRhbG9nJ10pLFxuICBvdmVyUHJvcGVydHkoJ3BhY2thZ2VzJywgdW5pcUFuZFNvcnRBcnJheSksXG4gIG92ZXJQcm9wZXJ0eSgnY2F0YWxvZycsIHNvcnREZXBlbmRlbmNpZXMpLFxuXSlcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvYmxvYi9hY2MwZTQ3NTcyYTkzOTAyOTJiNGUzMTNiNGE0YmYzNjBkMjM2MzU4L2NvbmYvY29uZmlnLXNjaGVtYS5qc1xuY29uc3QgZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gIC8vIGBmaWxlc2AgYW5kIGBleGNsdWRlZEZpbGVzYCBhcmUgb25seSBvbiBgb3ZlcnJpZGVzW11gXG4gIC8vIGZvciBlYXNpZXIgc29ydCBgb3ZlcnJpZGVzW11gLFxuICAvLyBhZGQgdGhlbSB0byBoZXJlLCBzbyB3ZSBkb24ndCBuZWVkIHNvcnQgYG92ZXJyaWRlc1tdYCB0d2ljZVxuICAnZmlsZXMnLFxuICAnZXhjbHVkZWRGaWxlcycsXG4gIC8vIGJhc2VDb25maWdcbiAgJ2VudicsXG4gICdwYXJzZXInLFxuICAncGFyc2VyT3B0aW9ucycsXG4gICdzZXR0aW5ncycsXG4gICdwbHVnaW5zJyxcbiAgJ2V4dGVuZHMnLFxuICAncnVsZXMnLFxuICAnb3ZlcnJpZGVzJyxcbiAgJ2dsb2JhbHMnLFxuICAncHJvY2Vzc29yJyxcbiAgJ25vSW5saW5lQ29uZmlnJyxcbiAgJ3JlcG9ydFVudXNlZERpc2FibGVEaXJlY3RpdmVzJyxcbl1cbmNvbnN0IHNvcnRFc2xpbnRDb25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KGVzbGludEJhc2VDb25maWdQcm9wZXJ0aWVzKSxcbiAgb3ZlclByb3BlcnR5KCdlbnYnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KCdnbG9iYWxzJywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnb3ZlcnJpZGVzJyxcbiAgICBvbkFycmF5KChvdmVycmlkZXMpID0+IG92ZXJyaWRlcy5tYXAoc29ydEVzbGludENvbmZpZykpLFxuICApLFxuICBvdmVyUHJvcGVydHkoJ3BhcnNlck9wdGlvbnMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdydWxlcycsXG4gICAgc29ydE9iamVjdEJ5KFxuICAgICAgKHJ1bGUxLCBydWxlMikgPT5cbiAgICAgICAgcnVsZTEuc3BsaXQoJy8nKS5sZW5ndGggLSBydWxlMi5zcGxpdCgnLycpLmxlbmd0aCB8fFxuICAgICAgICBydWxlMS5sb2NhbGVDb21wYXJlKHJ1bGUyKSxcbiAgICApLFxuICApLFxuICBvdmVyUHJvcGVydHkoJ3NldHRpbmdzJywgc29ydE9iamVjdCksXG5dKVxuY29uc3Qgc29ydFZTQ29kZUJhZGdlT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsnZGVzY3JpcHRpb24nLCAndXJsJywgJ2hyZWYnXSlcblxuY29uc3Qgc29ydFByZXR0aWVyQ29uZmlnID0gcGlwZShbXG4gIC8vIHNvcnQga2V5cyBhbHBoYWJldGljYWxseSwgYnV0IHB1dCBgb3ZlcnJpZGVzYCBhdCBib3R0b21cbiAgb25PYmplY3QoKGNvbmZpZykgPT5cbiAgICBzb3J0T2JqZWN0S2V5cyhjb25maWcsIFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKGNvbmZpZylcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdvdmVycmlkZXMnKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgJ292ZXJyaWRlcycsXG4gICAgXSksXG4gICksXG4gIC8vIGlmIGBjb25maWcub3ZlcnJpZGVzYCBleGlzdHNcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIC8vIGFuZCBgY29uZmlnLm92ZXJyaWRlc2AgaXMgYW4gYXJyYXlcbiAgICBvbkFycmF5KChvdmVycmlkZXMpID0+XG4gICAgICBvdmVycmlkZXMubWFwKFxuICAgICAgICBwaXBlKFtcbiAgICAgICAgICAvLyBzb3J0IGBjb25maWcub3ZlcnJpZGVzW11gIGFscGhhYmV0aWNhbGx5XG4gICAgICAgICAgc29ydE9iamVjdCxcbiAgICAgICAgICAvLyBzb3J0IGBjb25maWcub3ZlcnJpZGVzW10ub3B0aW9uc2AgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBvdmVyUHJvcGVydHkoJ29wdGlvbnMnLCBzb3J0T2JqZWN0KSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICksXG4gICksXG5dKVxuXG5jb25zdCBzb3J0Vm9sdGEgPSBzb3J0T2JqZWN0QnkoWydub2RlJywgJ25wbScsICd5YXJuJ10pXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvd2lyZWl0XG5jb25zdCB3aXJlaXRTY3JpcHRQcm9wZXJ0aWVzID0gWydjb21tYW5kJywgJ2RlcGVuZGVuY2llcycsICdmaWxlcycsICdvdXRwdXQnXVxuY29uc3Qgc29ydFdpcmVpdFNjcmlwdCA9IHBpcGUoW1xuICBzb3J0T2JqZWN0Qnkod2lyZWl0U2NyaXB0UHJvcGVydGllcyksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnZGVwZW5kZW5jaWVzJyxcbiAgICBvbkFycmF5KChkZXBzKSA9PiBkZXBzLm1hcChzb3J0T2JqZWN0QnkoWydzY3JpcHQnLCAnY2FzY2FkZSddKSkpLFxuICApLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ2VudicsXG4gICAgb25PYmplY3QoKGVudikgPT5cbiAgICAgIHNvcnRPYmplY3RLZXlzKFxuICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoZW52KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgc29ydE9iamVjdEJ5KFsnZXh0ZXJuYWwnLCAnZGVmYXVsdCddKSh2YWx1ZSksXG4gICAgICAgICAgXSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnc2VydmljZScsXG4gICAgcGlwZShbc29ydE9iamVjdEJ5KFsncmVhZHlXaGVuJ10pLCBvdmVyUHJvcGVydHkoJ3JlYWR5V2hlbicsIHNvcnRPYmplY3QpXSksXG4gICksXG5dKVxuY29uc3Qgc29ydFdpcmVpdCA9IG9uT2JqZWN0KCh3aXJlaXQpID0+XG4gIHNvcnRPYmplY3RLZXlzKFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHdpcmVpdCkubWFwKChbbmFtZSwgY29uZmlnXSkgPT4gW1xuICAgICAgICBuYW1lLFxuICAgICAgICBzb3J0V2lyZWl0U2NyaXB0KGNvbmZpZyksXG4gICAgICBdKSxcbiAgICApLFxuICApLFxuKVxuY29uc3Qgc29ydERldkVuZ2luZXMgPSBvdmVyUHJvcGVydHkoXG4gICdwYWNrYWdlTWFuYWdlcicsXG4gIHNvcnRPYmplY3RCeShbJ25hbWUnLCAndmVyc2lvbicsICdvbkZhaWwnXSksXG4pXG5cbmNvbnN0IHBucG1CYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgJ3BlZXJEZXBlbmRlbmN5UnVsZXMnLFxuICAnbmV2ZXJCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzRmlsZScsXG4gICdhbGxvd2VkRGVwcmVjYXRlZFZlcnNpb25zJyxcbiAgJ2FsbG93Tm9uQXBwbGllZFBhdGNoZXMnLFxuICAndXBkYXRlQ29uZmlnJyxcbiAgJ2F1ZGl0Q29uZmlnJyxcbiAgJ3JlcXVpcmVkU2NyaXB0cycsXG4gICdzdXBwb3J0ZWRBcmNoaXRlY3R1cmVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdwYXRjaGVkRGVwZW5kZW5jaWVzJyxcbiAgJ3BhY2thZ2VFeHRlbnNpb25zJyxcbl1cblxuY29uc3Qgc29ydFBucG1Db25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KHBucG1CYXNlQ29uZmlnUHJvcGVydGllcywgdHJ1ZSksXG4gIG92ZXJQcm9wZXJ0eSgnb3ZlcnJpZGVzJywgc29ydE9iamVjdEJ5U2VtdmVyKSxcbl0pXG5cbi8vIFNlZSBodHRwczovL2RvY3MubnBtanMuY29tL21pc2Mvc2NyaXB0c1xuY29uc3QgZGVmYXVsdE5wbVNjcmlwdHMgPSBuZXcgU2V0KFtcbiAgJ2luc3RhbGwnLFxuICAncGFjaycsXG4gICdwcmVwYXJlJyxcbiAgJ3B1Ymxpc2gnLFxuICAncmVzdGFydCcsXG4gICdzaHJpbmt3cmFwJyxcbiAgJ3N0YXJ0JyxcbiAgJ3N0b3AnLFxuICAndGVzdCcsXG4gICd1bmluc3RhbGwnLFxuICAndmVyc2lvbicsXG5dKVxuXG5jb25zdCBoYXNEZXZEZXBlbmRlbmN5ID0gKGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uKSA9PiB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbiwgJ2RldkRlcGVuZGVuY2llcycpICYmXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3kpXG4gIClcbn1cblxuY29uc3QgcnVuU1JlZ0V4cCA9XG4gIC8oPzw9XnxbXFxzJjs8PnwoXSkoPzpydW4tc3xucG0tcnVuLWFsbDI/IC4qKD86LS1zZXF1ZW50aWFsfC0tc2VyaWFsfC1zKSkoPz0kfFtcXHMmOzw+fCldKS9cblxuY29uc3QgaXNTZXF1ZW50aWFsU2NyaXB0ID0gKGNvbW1hbmQpID0+XG4gIGNvbW1hbmQuaW5jbHVkZXMoJyonKSAmJiBydW5TUmVnRXhwLnRlc3QoY29tbWFuZClcblxuY29uc3QgaGFzU2VxdWVudGlhbFNjcmlwdCA9IChwYWNrYWdlSnNvbikgPT4ge1xuICBpZiAoXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsJywgcGFja2FnZUpzb24pICYmXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsMicsIHBhY2thZ2VKc29uKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBzY3JpcHRzID0gWydzY3JpcHRzJywgJ2JldHRlclNjcmlwdHMnXS5mbGF0TWFwKChmaWVsZCkgPT5cbiAgICBwYWNrYWdlSnNvbltmaWVsZF0gPyBPYmplY3QudmFsdWVzKHBhY2thZ2VKc29uW2ZpZWxkXSkgOiBbXSxcbiAgKVxuICByZXR1cm4gc2NyaXB0cy5zb21lKChzY3JpcHQpID0+IGlzU2VxdWVudGlhbFNjcmlwdChzY3JpcHQpKVxufVxuXG5mdW5jdGlvbiBzb3J0U2NyaXB0TmFtZXMoa2V5cywgcHJlZml4ID0gJycpIHtcbiAgY29uc3QgZ3JvdXBNYXAgPSBuZXcgTWFwKClcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHJlc3QgPSBwcmVmaXggPyBrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCArIDEpIDoga2V5XG4gICAgY29uc3QgaWR4ID0gcmVzdC5pbmRleE9mKCc6JylcbiAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgY29uc3QgYmFzZSA9IGtleS5zbGljZSgwLCAocHJlZml4ID8gcHJlZml4Lmxlbmd0aCArIDEgOiAwKSArIGlkeClcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGJhc2UpKSBncm91cE1hcC5zZXQoYmFzZSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoYmFzZSkucHVzaChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGtleSkpIGdyb3VwTWFwLnNldChrZXksIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGtleSkucHVzaChrZXkpXG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKGdyb3VwTWFwLmtleXMoKSlcbiAgICAuc29ydCgpXG4gICAgLmZsYXRNYXAoKGdyb3VwS2V5KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGdyb3VwTWFwLmdldChncm91cEtleSlcbiAgICAgIGlmIChcbiAgICAgICAgY2hpbGRyZW4ubGVuZ3RoID4gMSAmJlxuICAgICAgICBjaGlsZHJlbi5zb21lKChrKSA9PiBrICE9PSBncm91cEtleSAmJiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdCA9IGNoaWxkcmVuXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gayA9PT0gZ3JvdXBLZXkgfHwgIWsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICBjb25zdCBuZXN0ZWQgPSBjaGlsZHJlbi5maWx0ZXIoKGspID0+IGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgIHJldHVybiBbLi4uZGlyZWN0LCAuLi5zb3J0U2NyaXB0TmFtZXMobmVzdGVkLCBncm91cEtleSldXG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGRyZW4uc29ydCgpXG4gICAgfSlcbn1cblxuY29uc3Qgc29ydFNjcmlwdHMgPSBvbk9iamVjdCgoc2NyaXB0cywgcGFja2FnZUpzb24pID0+IHtcbiAgbGV0IG5hbWVzID0gT2JqZWN0LmtleXMoc2NyaXB0cylcbiAgY29uc3QgcHJlZml4YWJsZSA9IG5ldyBTZXQoKVxuXG4gIG5hbWVzID0gbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgY29uc3Qgb21pdHRlZCA9IG5hbWUucmVwbGFjZSgvXig/OnByZXxwb3N0KS8sICcnKVxuICAgIGlmIChkZWZhdWx0TnBtU2NyaXB0cy5oYXMob21pdHRlZCkgfHwgbmFtZXMuaW5jbHVkZXMob21pdHRlZCkpIHtcbiAgICAgIHByZWZpeGFibGUuYWRkKG9taXR0ZWQpXG4gICAgICByZXR1cm4gb21pdHRlZFxuICAgIH1cbiAgICByZXR1cm4gbmFtZVxuICB9KVxuXG4gIGlmICghaGFzU2VxdWVudGlhbFNjcmlwdChwYWNrYWdlSnNvbikpIHtcbiAgICBuYW1lcyA9IHNvcnRTY3JpcHROYW1lcyhuYW1lcylcbiAgfVxuICBuYW1lcyA9IG5hbWVzLmZsYXRNYXAoKGtleSkgPT5cbiAgICBwcmVmaXhhYmxlLmhhcyhrZXkpID8gW2BwcmUke2tleX1gLCBrZXksIGBwb3N0JHtrZXl9YF0gOiBba2V5XSxcbiAgKVxuICByZXR1cm4gc29ydE9iamVjdEtleXMoc2NyaXB0cywgbmFtZXMpXG59KVxuXG4vKlxuLSBNb3ZlIGBkZWZhdWx0YCBjb25kaXRpb24gdG8gYm90dG9tXG4qL1xuY29uc3Qgc29ydENvbmRpdGlvbnMgPSAoY29uZGl0aW9ucykgPT4ge1xuICBjb25zdCB7IGRlZmF1bHRDb25kaXRpb25zID0gW10sIHJlc3RDb25kaXRpb25zID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgIGNvbmRpdGlvbnMsXG4gICAgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgIHJldHVybiAnZGVmYXVsdENvbmRpdGlvbnMnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAncmVzdENvbmRpdGlvbnMnXG4gICAgfSxcbiAgKVxuXG4gIHJldHVybiBbLi4ucmVzdENvbmRpdGlvbnMsIC4uLmRlZmF1bHRDb25kaXRpb25zXVxufVxuXG5jb25zdCBzb3J0RXhwb3J0cyA9IG9uT2JqZWN0KChleHBvcnRzKSA9PiB7XG4gIGNvbnN0IHsgcGF0aHMgPSBbXSwgY29uZGl0aW9ucyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICBPYmplY3Qua2V5cyhleHBvcnRzKSxcbiAgICAoa2V5KSA9PiAoa2V5LnN0YXJ0c1dpdGgoJy4nKSA/ICdwYXRocycgOiAnY29uZGl0aW9ucycpLFxuICApXG5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBbLi4ucGF0aHMsIC4uLnNvcnRDb25kaXRpb25zKGNvbmRpdGlvbnMpXS5tYXAoKGtleSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgc29ydEV4cG9ydHMoZXhwb3J0c1trZXldKSxcbiAgICBdKSxcbiAgKVxufSlcblxuLy8gZmllbGRzIG1hcmtlZCBgdnNjb2RlYCBhcmUgZm9yIGBWaXN1YWwgU3R1ZGlvIENvZGUgZXh0ZW5zaW9uIG1hbmlmZXN0YCBvbmx5XG4vLyBodHRwczovL2NvZGUudmlzdWFsc3R1ZGlvLmNvbS9hcGkvcmVmZXJlbmNlcy9leHRlbnNpb24tbWFuaWZlc3Rcbi8vIFN1cHBvcnRlZCBmaWVsZHM6XG4vLyBwdWJsaXNoZXIsIGRpc3BsYXlOYW1lLCBjYXRlZ29yaWVzLCBnYWxsZXJ5QmFubmVyLCBwcmV2aWV3LCBjb250cmlidXRlcyxcbi8vIGFjdGl2YXRpb25FdmVudHMsIGJhZGdlcywgbWFya2Rvd24sIHFuYSwgZXh0ZW5zaW9uUGFjayxcbi8vIGV4dGVuc2lvbkRlcGVuZGVuY2llcywgaWNvblxuXG4vLyBmaWVsZC5rZXl7c3RyaW5nfTogZmllbGQgbmFtZVxuLy8gZmllbGQub3ZlcntmdW5jdGlvbn06IHNvcnQgZmllbGQgc3ViS2V5XG5jb25zdCBmaWVsZHMgPSBbXG4gIHsga2V5OiAnJHNjaGVtYScgfSxcbiAgeyBrZXk6ICduYW1lJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdkaXNwbGF5TmFtZScgfSxcbiAgeyBrZXk6ICd2ZXJzaW9uJyB9LFxuICAvKiB5YXJuICovIHsga2V5OiAnc3RhYmxlVmVyc2lvbicgfSxcbiAgeyBrZXk6ICdwcml2YXRlJyB9LFxuICB7IGtleTogJ2Rlc2NyaXB0aW9uJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdjYXRlZ29yaWVzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2tleXdvcmRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2hvbWVwYWdlJyB9LFxuICB7IGtleTogJ2J1Z3MnLCBvdmVyOiBzb3J0T2JqZWN0QnkoWyd1cmwnLCAnZW1haWwnXSkgfSxcbiAgeyBrZXk6ICdyZXBvc2l0b3J5Jywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICB7IGtleTogJ2Z1bmRpbmcnLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnbGljZW5zZScsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncW5hJyB9LFxuICB7IGtleTogJ2F1dGhvcicsIG92ZXI6IHNvcnRQZW9wbGVPYmplY3QgfSxcbiAge1xuICAgIGtleTogJ21haW50YWluZXJzJyxcbiAgICBvdmVyOiBvbkFycmF5KChtYWludGFpbmVycykgPT4gbWFpbnRhaW5lcnMubWFwKHNvcnRQZW9wbGVPYmplY3QpKSxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbnRyaWJ1dG9ycycsXG4gICAgb3Zlcjogb25BcnJheSgoY29udHJpYnV0b3JzKSA9PiBjb250cmlidXRvcnMubWFwKHNvcnRQZW9wbGVPYmplY3QpKSxcbiAgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncHVibGlzaGVyJyB9LFxuICB7IGtleTogJ3NpZGVFZmZlY3RzJyB9LFxuICB7IGtleTogJ3R5cGUnIH0sXG4gIHsga2V5OiAnaW1wb3J0cycgfSxcbiAgeyBrZXk6ICdleHBvcnRzJywgb3Zlcjogc29ydEV4cG9ydHMgfSxcbiAgeyBrZXk6ICdtYWluJyB9LFxuICB7IGtleTogJ3N2ZWx0ZScgfSxcbiAgeyBrZXk6ICd1bWQ6bWFpbicgfSxcbiAgeyBrZXk6ICdqc2RlbGl2cicgfSxcbiAgeyBrZXk6ICd1bnBrZycgfSxcbiAgeyBrZXk6ICdtb2R1bGUnIH0sXG4gIHsga2V5OiAnc291cmNlJyB9LFxuICB7IGtleTogJ2pzbmV4dDptYWluJyB9LFxuICB7IGtleTogJ2Jyb3dzZXInIH0sXG4gIHsga2V5OiAncmVhY3QtbmF0aXZlJyB9LFxuICB7IGtleTogJ3R5cGVzJyB9LFxuICB7IGtleTogJ3R5cGVzVmVyc2lvbnMnIH0sXG4gIHsga2V5OiAndHlwaW5ncycgfSxcbiAgeyBrZXk6ICdzdHlsZScgfSxcbiAgeyBrZXk6ICdleGFtcGxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGVzdHlsZScgfSxcbiAgeyBrZXk6ICdhc3NldHMnIH0sXG4gIHsga2V5OiAnYmluJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ21hbicgfSxcbiAgeyBrZXk6ICdkaXJlY3RvcmllcycsIG92ZXI6IHNvcnREaXJlY3RvcmllcyB9LFxuICB7IGtleTogJ2ZpbGVzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ3dvcmtzcGFjZXMnLCBvdmVyOiBzb3J0V29ya3NwYWNlcyB9LFxuICAvLyBub2RlLXByZS1neXAgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvbm9kZS1wcmUtZ3lwIzEtYWRkLW5ldy1lbnRyaWVzLXRvLXlvdXItcGFja2FnZWpzb25cbiAge1xuICAgIGtleTogJ2JpbmFyeScsXG4gICAgb3Zlcjogc29ydE9iamVjdEJ5KFtcbiAgICAgICdtb2R1bGVfbmFtZScsXG4gICAgICAnbW9kdWxlX3BhdGgnLFxuICAgICAgJ3JlbW90ZV9wYXRoJyxcbiAgICAgICdwYWNrYWdlX25hbWUnLFxuICAgICAgJ2hvc3QnLFxuICAgIF0pLFxuICB9LFxuICB7IGtleTogJ3NjcmlwdHMnLCBvdmVyOiBzb3J0U2NyaXB0cyB9LFxuICB7IGtleTogJ2JldHRlclNjcmlwdHMnLCBvdmVyOiBzb3J0U2NyaXB0cyB9LFxuICB7IGtleTogJ3dpcmVpdCcsIG92ZXI6IHNvcnRXaXJlaXQgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbDEwbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY29udHJpYnV0ZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2FjdGl2YXRpb25FdmVudHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaHVza3knLCBvdmVyOiBvdmVyUHJvcGVydHkoJ2hvb2tzJywgc29ydEdpdEhvb2tzKSB9LFxuICB7IGtleTogJ3NpbXBsZS1naXQtaG9va3MnLCBvdmVyOiBzb3J0R2l0SG9va3MgfSxcbiAgeyBrZXk6ICdwcmUtY29tbWl0JyB9LFxuICB7IGtleTogJ2NvbW1pdGxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbGludC1zdGFnZWQnIH0sXG4gIHsga2V5OiAnbmFuby1zdGFnZWQnIH0sXG4gIHsga2V5OiAnY29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25vZGVtb25Db25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcmlmeScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdiYWJlbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2Vyc2xpc3QnIH0sXG4gIHsga2V5OiAneG8nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHJldHRpZXInLCBvdmVyOiBzb3J0UHJldHRpZXJDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRDb25maWcnLCBvdmVyOiBzb3J0RXNsaW50Q29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50SWdub3JlJyB9LFxuICB7IGtleTogJ25wbXBrZ2pzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbVBhY2thZ2VKc29uTGludENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1wYWNrYWdlanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVsZWFzZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZW1hcmtDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnc3R5bGVsaW50JyB9LFxuICB7IGtleTogJ2F2YScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QtanVuaXQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1zdGFyZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtb2NoYScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdueWMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYzgnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAndGFwJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ29jbGlmJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdyZXNvbHV0aW9ucycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvdmVycmlkZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RldkRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHNvcnRPYmplY3RCeUlkZW50LCB0cnVlKSB9LFxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIC8vIFRPRE86IG9ubHkgc29ydCBkZXB0aCA9IDJcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnYnVuZGxlZERlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdidW5kbGVEZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvblBhY2snLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvbkRlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdmbGF0JyB9LFxuICB7IGtleTogJ3BhY2thZ2VNYW5hZ2VyJyB9LFxuICB7IGtleTogJ2VuZ2luZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZW5naW5lU3RyaWN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2RldkVuZ2luZXMnLCBvdmVyOiBzb3J0RGV2RW5naW5lcyB9LFxuICB7IGtleTogJ3ZvbHRhJywgb3Zlcjogc29ydFZvbHRhIH0sXG4gIHsga2V5OiAnbGFuZ3VhZ2VOYW1lJyB9LFxuICB7IGtleTogJ29zJyB9LFxuICB7IGtleTogJ2NwdScgfSxcbiAgeyBrZXk6ICdwcmVmZXJHbG9iYWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHVibGlzaENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnaWNvbicgfSxcbiAgLyogdnNjb2RlICovIHtcbiAgICBrZXk6ICdiYWRnZXMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGJhZGdlKSA9PiBiYWRnZS5tYXAoc29ydFZTQ29kZUJhZGdlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2dhbGxlcnlCYW5uZXInLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3ByZXZpZXcnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ21hcmtkb3duJyB9LFxuICB7IGtleTogJ3BucG0nLCBvdmVyOiBzb3J0UG5wbUNvbmZpZyB9LFxuXVxuXG5jb25zdCBkZWZhdWx0U29ydE9yZGVyID0gZmllbGRzLm1hcCgoeyBrZXkgfSkgPT4ga2V5KVxuY29uc3Qgb3ZlckZpZWxkcyA9IHBpcGUoXG4gIGZpZWxkc1xuICAgIC5tYXAoKHsga2V5LCBvdmVyIH0pID0+IChvdmVyID8gb3ZlclByb3BlcnR5KGtleSwgb3ZlcikgOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoQm9vbGVhbiksXG4pXG5cbmZ1bmN0aW9uIGVkaXRTdHJpbmdKU09OKGpzb24sIG92ZXIpIHtcbiAgaWYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHsgaW5kZW50LCB0eXBlIH0gPSBkZXRlY3RJbmRlbnQoanNvbilcbiAgICBjb25zdCBlbmRDaGFyYWN0ZXJzID0ganNvbi5zbGljZSgtMSkgPT09ICdcXG4nID8gJ1xcbicgOiAnJ1xuICAgIGNvbnN0IG5ld2xpbmUgPSBkZXRlY3ROZXdsaW5lKGpzb24pXG4gICAganNvbiA9IEpTT04ucGFyc2UoanNvbilcblxuICAgIGxldCByZXN1bHQgPVxuICAgICAgSlNPTi5zdHJpbmdpZnkob3Zlcihqc29uKSwgbnVsbCwgdHlwZSA9PT0gJ3RhYicgPyAnXFx0JyA6IGluZGVudCkgK1xuICAgICAgZW5kQ2hhcmFjdGVyc1xuICAgIGlmIChuZXdsaW5lID09PSAnXFxyXFxuJykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1xcbi9nLCBuZXdsaW5lKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByZXR1cm4gb3Zlcihqc29uKVxufVxuXG5mdW5jdGlvbiBzb3J0UGFja2FnZUpzb24oanNvbklzaCwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBlZGl0U3RyaW5nSlNPTihcbiAgICBqc29uSXNoLFxuICAgIG9uT2JqZWN0KChqc29uKSA9PiB7XG4gICAgICBsZXQgc29ydE9yZGVyID0gb3B0aW9ucy5zb3J0T3JkZXIgfHwgZGVmYXVsdFNvcnRPcmRlclxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3J0T3JkZXIpKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhqc29uKVxuICAgICAgICBjb25zdCB7IHByaXZhdGVLZXlzID0gW10sIHB1YmxpY0tleXMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgICAgICAga2V5cyxcbiAgICAgICAgICAoa2V5KSA9PiAoa2V5WzBdID09PSAnXycgPyAncHJpdmF0ZUtleXMnIDogJ3B1YmxpY0tleXMnKSxcbiAgICAgICAgKVxuICAgICAgICBzb3J0T3JkZXIgPSBbXG4gICAgICAgICAgLi4uc29ydE9yZGVyLFxuICAgICAgICAgIC4uLmRlZmF1bHRTb3J0T3JkZXIsXG4gICAgICAgICAgLi4ucHVibGljS2V5cy5zb3J0KCksXG4gICAgICAgICAgLi4ucHJpdmF0ZUtleXMuc29ydCgpLFxuICAgICAgICBdXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdmVyRmllbGRzKHNvcnRPYmplY3RLZXlzKGpzb24sIHNvcnRPcmRlciksIGpzb24pXG4gICAgfSksXG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgc29ydFBhY2thZ2VKc29uXG5leHBvcnQgeyBzb3J0UGFja2FnZUpzb24sIGRlZmF1bHRTb3J0T3JkZXIgYXMgc29ydE9yZGVyIH1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+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/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICBuYW1lOiAnYXV0b2ZpeC5jaScsXG4gIG9uOiB7XG4gICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgIHB1c2g6IHtcbiAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICB9LFxuICB9LFxuICBwZXJtaXNzaW9uczoge1xuICAgIGNvbnRlbnRzOiAncmVhZCcsXG4gIH0sXG4gIGNvbmN1cnJlbmN5OiB7XG4gICAgZ3JvdXA6ICdhdXRvZml4LSR7eyBnaXRodWIuaGVhZF9yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDogeyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9LFxuICB9LFxufTtcblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgbGludGVyIGZpeFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgcGtnLXByZWZsaWdodCBQUiBmaWxlIGxpc3RpbmdcbiAgICAgICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAndGVzdC1ydXN0Jzoge1xuICAgIG5hbWU6ICdUZXN0IFJ1c3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAndGVzdC1ydXN0Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QtcnVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knIHwgJ2F1dG9maXgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZpZyBvZiBzZW1hbnRpYyBwdWxsIHJlcXVlc3RcbiAgICBjb25zdCBzZW1hbnRpY1ltbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICdzZW1hbnRpYy55bWwnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oc2VtYW50aWNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhaXNPYnNvbGV0ZUdlblByV29ya2Zsb3dGaWxlTmFtZShlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGVudHJ5Lm5hbWUpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWVTZXQgPSBuZXcgU2V0KFtcbiAgICAgICd0ZXN0LnltbCcsXG4gICAgICAnYXV0b2ZpeC55bWwnLFxuICAgICAgJ3NlbWFudGljLXByLnltbCcsXG4gICAgICAnY2xvc2UtY29tbWVudC55bWwnLFxuICAgICAgLi4uZW50cmllc1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpICYmICFpc09ic29sZXRlR2VuUHJXb3JrZmxvd0ZpbGVOYW1lKGRpcmVudC5uYW1lKVxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCd0ZXN0LXJ1c3QueW1sJyk7XG4gICAgfVxuICAgIGlmICghcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIC8vIFRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93IGFscmVhZHkgZml4ZXMgYW5kIHB1c2hlcyBjb2RlIG9uIHByaXZhdGUgcmVwb3MsXG4gICAgICAvLyBzbyBhIHNlcGFyYXRlIGF1dG9maXggd29ya2Zsb3cgb25seSBkdXBsaWNhdGVzIHRoZSBzYW1lIHByb2Nlc3MuXG4gICAgICBmaWxlTmFtZVNldC5kZWxldGUoJ2F1dG9maXgueW1sJyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdhdXRvZml4LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lU2V0KSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGNvbnN0IGtpbmQgPSBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lLCAnLnltbCcpIGFzIEtub3duS2luZDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9zaXRvcnk/LmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzT2Jzb2xldGVHZW5QcldvcmtmbG93RmlsZU5hbWUoZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15nZW4tcHIoPzotLispP1xcLnlhP21sJC91LnRlc3QoZmlsZU5hbWUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChjb25maWc6IFBhY2thZ2VDb25maWcsIHdvcmtmbG93c1BhdGg6IHN0cmluZywga2luZDogS25vd25LaW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGAke2tpbmR9LnltbGApO1xuICBjb25zdCBkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJykpO1xuXG4gIGlmIChraW5kID09PSAnYXV0b2ZpeCcpIHtcbiAgICBhd2FpdCB3cml0ZVlhbWwoZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnKSwgZmlsZVBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEEgdGVzdC1ydXN0LnltbCBpbiBhIHJlcG8gd2l0aG91dCBSdXN0IGNvZGUgaXMgYSBjdXN0b20gd29ya2Zsb3cgdGhhdCBtZXJlbHkgc2hhcmVzIHRoZSBuYW1lOyBsZWF2ZSBpdCBhbG9uZS5cbiAgaWYgKGtpbmQgPT09ICd0ZXN0LXJ1c3QnICYmIGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoa2luZCBpbiB3b3JrZmxvd3MgPyB3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA6IHt9KSBhcyBXb3JrZmxvdztcblxuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICAvLyBTa2lwIGEgYnJva2VuIHdvcmtmbG93XG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBpZiAoa2luZCA9PT0gJ3Rlc3QtcnVzdCcpIHtcbiAgICAvLyBNaWdyYXRlIGhhbmQtd3JpdHRlbiBSdXN0IHdvcmtmbG93cyAoZS5nLiBhbiBpbmxpbmUgY2FyZ28tY2hlY2sgam9iKSB0byB0aGUgcmV1c2FibGUgd29ya2Zsb3cuXG4gICAgZm9yIChjb25zdCBbam9iTmFtZSwgam9iXSBvZiBPYmplY3QuZW50cmllcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgICAgaWYgKCFqb2IudXNlcz8uaW5jbHVkZXMoJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnNbam9iTmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgfVxuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9ICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnO1xuICB9XG5cbiAgbGV0IGlzUmV1c2FibGVXb3JrZmxvdyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcygnL3JldXNhYmxlLXdvcmtmbG93cy8nKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCB1c2UgcmVsZWFzZS55bWwgaWYgcmVsZWFzZSBicmFuY2ggaXMgbm90IHNwZWNpZmllZFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3JlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6XG4gICAgY2FzZSAndGVzdC1ydXN0Jzoge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBwYXRocy1pZ25vcmVgIGZvciB0ZXN0IGJlY2F1c2UgR2l0SHViJ3MgQnJhbmNoIFByb3RlY3Rpb24gYW5kIFJ1bGVzZXRzIHJlcXVpcmUgam9iIHJ1bm5pbmcuXG4gICAgICAvLyBUaGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdyBubyBsb25nZXIgbmVlZHMgQWN0aW9ucyB3cml0ZSBhY2Nlc3MuXG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MucGVybWlzc2lvbnM/LmFjdGlvbnM7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1bGxfcmVxdWVzdCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVsbF9yZXF1ZXN0WydwYXRocy1pZ25vcmUnXTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ107XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzLmZpbHRlcigoYnJhbmNoKSA9PiBicmFuY2ggIT09ICdyZW5vdmF0ZS8qKicpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE5vIGRlZmF1bHRcbiAgfVxuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWluaXQueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgaWYgKCFuZXdTZXR0aW5ncy5qb2JzLnN5bmM/LndpdGgpIHJldHVybjtcblxuICAgIC8vIEdlbmVyYXRlIHN5bmMtZm9yY2UueW1sIGJhc2VkIG9uIHN5bmMueW1sIGlmIGl0IGV4aXN0cy5cbiAgICBuZXdTZXR0aW5ncy5qb2JzWydzeW5jLWZvcmNlJ10gPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gYC0tZm9yY2UgJHtwYXJhbXN9YDtcbiAgICBuZXdTZXR0aW5ncy5uYW1lID0gJ0ZvcmNlIHRvIFN5bmMnO1xuICAgIG5ld1NldHRpbmdzLm9uID0geyB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCB9O1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtZm9yY2UueW1sJykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUpvYihjb25maWc6IFBhY2thZ2VDb25maWcsIGpvYjogSm9iLCBraW5kOiBLbm93bktpbmQpOiB2b2lkIHtcbiAgam9iLndpdGggPz89IHt9O1xuICBqb2Iuc2VjcmV0cyA/Pz0ge307XG5cbiAgaWYgKGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kID09PSAncmVsZWFzZScpIHtcbiAgICBqb2Iuc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgaWYgKGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOKSB7XG4gICAgam9iLnNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSA9ICcke3sgc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIH19JztcbiAgICBkZWxldGUgam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU47XG4gIH1cbiAgaWYgKFxuICAgIChqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkpIHx8XG4gICAgKGpvYi53aXRoLnNlcnZlcl91cmwgJiYga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSlcbiAgKSB7XG4gICAgam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCA9ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUxFQVNFIH19JztcbiAgfVxuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBwYXJhbXMucmVwbGFjZSgnc3luYyAnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICd0ZXN0LXJ1c3QnKSB7XG4gICAgY29uc3QgW3J1c3REaXJQYXRoXSA9IGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocztcbiAgICBpZiAocnVzdERpclBhdGggJiYgcnVzdERpclBhdGggIT09ICcuJykge1xuICAgICAgam9iLndpdGgud29ya2luZ19kaXJlY3RvcnkgPSBydXN0RGlyUGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGpvYi53aXRoLndvcmtpbmdfZGlyZWN0b3J5O1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoLmRvdF9lbnZfcGF0aCA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmRvdF9lbnZfcGF0aDtcbiAgfVxuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0cy5GTFlfQVBJX1RPS0VOICYmIHR5cGVvZiBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9IGpvYi53aXRoLmRlcGxveV9jb21tYW5kLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCd0ZXN0JykgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lcjtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi5zZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gTW92ZSBzZWNyZXRzIHByb3AgYWZ0ZXIgd2l0aCBwcm9wXG4gICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKGpvYi5zZWNyZXRzKTtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBXb3JrZmxvdyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NicgfSxcbiAgICB7IHVzZXM6ICdhY3Rpb25zL3NldHVwLW5vZGVAdjYnLCB3aXRoOiB7ICdjaGVjay1sYXRlc3QnOiB0cnVlLCAnbm9kZS12ZXJzaW9uJzogJ2x0cy8qJyB9IH0sXG4gICAgLi4uKGNvbmZpZy5pc0J1biA/IFt7IHVzZXM6ICdvdmVuLXNoL3NldHVwLWJ1bkB2MicsIHdpdGg6IHsgJ2J1bi12ZXJzaW9uJzogJ2xhdGVzdCcgfSB9XSA6IFtdKSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgIH0sXG4gICAgeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gY2xlYW51cGAgfSxcbiAgXTtcbiAgaWYgKGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uYnVpbGQpIHtcbiAgICBzdGVwcy5wdXNoKHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGJ1aWxkYCB9KTtcbiAgfVxuICBzdGVwcy5wdXNoKHsgdXNlczogJ2F1dG9maXgtY2kvYWN0aW9uQGM1YjJkNjdhYTIyNzRlN2I1YTE4MjI0ZTgxNzE1NTA4NzFmYzdlNGEnIH0pO1xuXG4gIGNvbnN0IGF1dG9maXhXb3JrZmxvdyA9IHN0cnVjdHVyZWRDbG9uZShwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgY29uc3QgYXV0b2ZpeEpvYiA9IGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPz8geyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9O1xuICBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID0geyAuLi5hdXRvZml4Sm9iLCBzdGVwcyB9O1xuICByZXR1cm4gYXV0b2ZpeFdvcmtmbG93O1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0gcmVtb3ZlVHJhaWxpbmdTcGFjZXMoXG4gICAgeWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEsIG5vQ29tcGF0TW9kZTogdHJ1ZSwgc3R5bGVzOiB7ICchIW51bGwnOiAnZW1wdHknIH0gfSlcbiAgKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCB5YW1sVGV4dCk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVRyYWlsaW5nU3BhY2VzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGpzLXlhbWwgZW1pdHMgdmFsdWVsZXNzIEdpdEh1YiBBY3Rpb25zIGV2ZW50cyBhcyBgZXZlbnQ6IGAgd2hlbiB1c2luZyB0aGUgZW1wdHkgbnVsbCBzdHlsZS5cbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvWyBcXHRdKyQvZ20sICcnKTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBvcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocGFja2FnZUNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChvbGRDb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKD89XFxzfCQpL2csICdjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLig/PVxcc3wkKS9nLCAnZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKD89XFxzKS9nLCAnaS5lLicpO1xufVxuXG5mdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csIChjb21tZW50KSA9PiBmaXhUeXBvc0luVGV4dChjb21tZW50KSlcbiAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pY1xcLmZcXC4vZywgJyQxLy8kMmNmLicpXG4gICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KWVnXFwuL2csICckMS8vJDJlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8paWVcXC4vZywgJyQxLy8kMmkuZS4nKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmNvbnN0IHdiRGF0YWJhc2VDb21tYW5kUmVnZXggPSAvXFxid2JcXHMrKD86ZGJ8cHJpc21hKVxcYi9ndTtcbmNvbnN0IG1heFRleHRGaWxlQnl0ZXMgPSAxMDI0ICogMTAyNDtcbmNvbnN0IG1pZ3JhdGlvblRhcmdldHMgPSBbXG4gICcqKi8qLntjanMsY3RzLGpzLGpzb24sanN4LG1kLG1kYyxtanMsbXRzLHNoLHRzeCx0cyx0b21sLHR4dCx5YW1sLHltbH0nLFxuICAnKiovLmVudicsXG4gICcqKi8uZW52LionLFxuICAnKiovLmdpdGh1Yi93b3JrZmxvd3MvKicsXG4gICcqKi8uZ2l0aWdub3JlJyxcbiAgJyoqLy5kb2NrZXJpZ25vcmUnLFxuICAnKiovRG9ja2VyZmlsZScsXG4gICcqKi9Eb2NrZXJmaWxlLionLFxuICAnKiovTWFrZWZpbGUnLFxuICAnKiovbWlzZS50b21sJyxcbiAgJyoqLy5taXNlLnRvbWwnLFxuICAnKiovbGVmdGhvb2sueW1sJyxcbiAgJyoqL3BhY2thZ2UuanNvbicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4V2JEYkNvbW1hbmQocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgcGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZ10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHJvb3RDb25maWcucmVwb0F1dGhvciA9PT0gJ1dpbGxCb29zdGVyJyAmJiByb290Q29uZmlnLnJlcG9OYW1lID09PSAnc2hhcmVkJykgcmV0dXJuO1xuXG4gIGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sPHZvaWQ+KCk7XG4gIC8vIGBydW4oKWAgcmVzb2x2ZXMgYWZ0ZXIgYSB0YXNrIGVudGVycyB0aGUgcG9vbCwgd2hpbGUgYHByb21pc2VBbGwoKWAgd2FpdHNcbiAgLy8gZm9yIGFkbWl0dGVkIHRhc2tzIHRvIGZpbmlzaC4gQm90aCB3YWl0cyBhcmUgbmVlZGVkIHRvIGNvdmVyIHF1ZXVlZCB3b3JrLlxuICBjb25zdCByZXBsYWNlbWVudFByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgZm9yIChjb25zdCBjb25maWcgb2YgcGFja2FnZUNvbmZpZ3MpIHtcbiAgICBjb25zdCBjb21tYW5kID0gc2VsZWN0V2JEYXRhYmFzZUNvbW1hbmQoY29uZmlnKTtcbiAgICBpZiAoIWNvbW1hbmQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcobWlncmF0aW9uVGFyZ2V0cywge1xuICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgZG90OiB0cnVlLFxuICAgICAgaWdub3JlOiBbJyoqLy5naXQvKionLCAuLi4oY29uZmlnLmlzUm9vdCA/IFsncGFja2FnZXMvKionXSA6IFtdKSwgLi4uZ2xvYklnbm9yZV0sXG4gICAgICBvbmx5RmlsZXM6IHRydWUsXG4gICAgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICAgIHJlcGxhY2VtZW50UHJvbWlzZXMucHVzaChwcm9taXNlUG9vbC5ydW4oKCkgPT4gcmVwbGFjZVdiRGF0YWJhc2VDb21tYW5kKGZpbGVQYXRoLCBjb21tYW5kKSkpO1xuICAgIH1cbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChyZXBsYWNlbWVudFByb21pc2VzKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RXYkRhdGFiYXNlQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiAnd2IgZGInIHwgJ3diIHByaXNtYScgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHJldHVybiAnd2IgcHJpc21hJztcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuZHJpenpsZSkgcmV0dXJuICd3YiBkYic7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VXYkRhdGFiYXNlQ29tbWFuZChmaWxlUGF0aDogc3RyaW5nLCBjb21tYW5kOiAnd2IgZGInIHwgJ3diIHByaXNtYScpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRUZXh0RmlsZShmaWxlUGF0aCk7XG4gIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gIC8vIFRlbXBvcmFyeSBtaWdyYXRpb246IG5vcm1hbGl6ZSBjb21tYW5kIHNwZWxsaW5nIGJ5IE9STSBzbyBQcmlzbWEga2VlcHMgdGhlXG4gIC8vIG5hdGl2ZSBjb21tYW5kIG5hbWUgd2hpbGUgRHJpenpsZSB1c2VzIHRoZSBnZW5lcmljIGRhdGFiYXNlIGNvbW1hbmQuXG4gIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwod2JEYXRhYmFzZUNvbW1hbmRSZWdleCwgY29tbWFuZCk7XG4gIGlmIChuZXdDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRUZXh0RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgaWYgKHN0YXRzLnNpemUgPiBtYXhUZXh0RmlsZUJ5dGVzKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKGJ1ZmZlci5pbmNsdWRlcygwKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCd1dGY4Jyk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kLCBhcmdzLCBjd2QsIHJldHJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogbnVtYmVyIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke2N3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICBpZiAoc3RhdHVzID09PSAwKSBicmVhaztcbiAgICBpZiAocmV0cnkgPD0gMCkgcmV0dXJuIHN0YXR1cztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3RkZXJyIG9uIEVOT0VOVC5cbiAgY29uc3Qgc3RkZXJyID0gcHJvYy5zdGRlcnIgPz8gJyc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycgPyBzdGRlcnIudHJpbSgpIDogc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAocHJvYy5lcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIGZhaWxlZCB3aXRoOiAke3Byb2MuZXJyb3IubWVzc2FnZX1gKTtcbiAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gb3V0cHV0cyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdG8gc3RkZXJyOlxcbiR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRvdXQgb24gRU5PRU5ULlxuICBjb25zdCBzdGRvdXQgPSBwcm9jLnN0ZG91dCA/PyAnJztcbiAgcmV0dXJuIHR5cGVvZiBzdGRvdXQgPT09ICdzdHJpbmcnID8gc3Rkb3V0LnRyaW0oKSA6IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5zcGxpdCgnOicpXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBlbnYuQkVSUllfQklOX0ZPTERFUilcbiAgICAgIC5qb2luKCc6Jyk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbi8qKlxuICogSG93IGEgYHdyYW5nbGVyIHR5cGVzYCBpbnZvY2F0aW9uIHJlbGF0ZXMgdG8gdGhlIGRlZmF1bHQgLi93b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIHRoYXQgd2JmeSBtYW5hZ2VzOlxuICogLSBgcmV1c2FibGVHZW5lcmF0b3JgOiByZWdlbmVyYXRlcyB0aGUgbWFuYWdlZCBmaWxlIGZyb20gdGhlIGlucHV0cyB0aGUgbWFuYWdlbWVudCBnYXRlIHZhbGlkYXRlZCwgc28gaXQgY2FuIHNlcnZlXG4gKiAgIGFzIHRoZSBzaGFyZWQgZ2VuZXJhdG9yIGNvbW1hbmQuXG4gKiAtIGBkZWZhdWx0T3V0cHV0Q29uZmxpY3RgOiB3cml0ZXMgdGhlIG1hbmFnZWQgZmlsZSBmcm9tIGlucHV0cyB0aGUgZ2F0ZSBjYW5ub3QgdmFsaWRhdGUgKGAtLWNvbmZpZ2AsIGAtLWVudmAsXG4gKiAgIGAtLWVudi1maWxlYCksIHNvIGEgbWFuYWdlZCBmYWxsYmFjayBnZW5lcmF0b3Igd291bGQgZmlnaHQgaXQgb3ZlciB0aGUgc2FtZSBmaWxlIOKAlCB3YmZ5IG11c3Qgbm90IG1hbmFnZSB0aGVcbiAqICAgcGFja2FnZSBhdCBhbGwuXG4gKiAtIGBoYXJtbGVzc2A6IGdlbmVyYXRlcyBub3RoaW5nIChgLS1jaGVja2AsIGAtLWhlbHBgLCBgLS12ZXJzaW9uYCkgb3Igd3JpdGVzIGFub3RoZXIgZmlsZSAoYC0tY3dkYCwgYSBjdXN0b21cbiAqICAgcG9zaXRpb25hbCBvdXRwdXQgcGF0aCksIHNvIGl0IGNhbiBjb2V4aXN0IHdpdGggdGhlIG1hbmFnZWQgZ2VuZXJhdG9yLlxuICovXG5leHBvcnQgdHlwZSBXcmFuZ2xlclR5cGVzSW52b2NhdGlvbktpbmQgPSAncmV1c2FibGVHZW5lcmF0b3InIHwgJ2RlZmF1bHRPdXRwdXRDb25mbGljdCcgfCAnaGFybWxlc3MnO1xuXG5jb25zdCBzY3JpcHRSdW5uZXJDb21tYW5kcyA9IG5ldyBTZXQoWyd5YXJuJywgJ2J1bicsICducG0nLCAncG5wbScsICdidW54JywgJ25weCddKTtcbmNvbnN0IHNjcmlwdFdyYXBwZXJSdW5uZXJDb21tYW5kcyA9IG5ldyBTZXQoWyd5YXJuJywgJ2J1bicsICducG0nLCAncG5wbSddKTtcbi8vIEZsYWdzIG9mIGB3cmFuZ2xlciB0eXBlc2AgdGhhdCBjb25zdW1lIHRoZSBmb2xsb3dpbmcgdG9rZW4gYXMgdGhlaXIgdmFsdWU7IHVua25vd24gc2VwYXJhdGUtdmFsdWUgZmxhZ3MgbWFrZVxuLy8gdGhlaXIgdmFsdWUgbG9vayBwb3NpdGlvbmFsLCB3aGljaCBzYWZlbHkgZGlzcXVhbGlmaWVzIHRoZSBpbnZvY2F0aW9uIGluc3RlYWQgb2YgbWlzcmVhZGluZyBpdHMgb3V0cHV0IHBhdGguXG5jb25zdCB3cmFuZ2xlclR5cGVzVmFsdWVGbGFncyA9IG5ldyBTZXQoWyctLWVudi1pbnRlcmZhY2UnXSk7XG5cbi8qKlxuICogV2hldGhlciB3YmZ5IGNhbiBtYW5hZ2Ugd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBmb3IgdGhlc2Ugc2NyaXB0cywgYW5kIHdpdGggd2hpY2ggcHJvamVjdC1zcGVjaWZpYyBnZW5lcmF0b3JcbiAqIGNvbW1hbmQuIGBjb25mbGljdGluZ2AgaXMgdHJ1ZSB3aGVuIGEgc2NyaXB0IHdyaXRlcyB0aGUgbWFuYWdlZCBkZWZhdWx0IGZpbGUgZnJvbSBpbnB1dHMgdGhlIG1hbmFnZW1lbnQgZ2F0ZVxuICogY2Fubm90IHZhbGlkYXRlIChlLmcuIGB3cmFuZ2xlciB0eXBlcyAtYyB3cmFuZ2xlci5qc29uYyAtYyAuLi9ib3VuZC13b3JrZXIvd3JhbmdsZXIuanNvbmNgIGZvciBSUEMgdHlwZXMg4oCUIGFcbiAqIG1hbmFnZWQgZmFsbGJhY2sgZ2VuZXJhdG9yIHdvdWxkIG92ZXJ3cml0ZSB0aGF0IHJpY2hlciBvdXRwdXQpLCBvciB3aGVuIHNldmVyYWwgZGlzdGluY3QgZmxhZ2dlZCBnZW5lcmF0b3JzXG4gKiBleGlzdCBpbiB0aGUgcHJlZmVycmVkIHNjcmlwdCB3aXRoIG5vIHdheSB0byBjaG9vc2Ugb25lIGRldGVybWluaXN0aWNhbGx5LiBgY29tbWFuZGAgaXMgdGhlIHNpbmdsZSBmbGFnZ2VkXG4gKiBnZW5lcmF0b3IgdG8gcmV1c2UsIHByZWZlcnJpbmcgd2hhdCBwb3N0aW5zdGFsbCBhbHJlYWR5IHJ1bnMgKHRoYXQgaXMgd2hhdCBzaGFwZXMgdGhlIGZpbGUgYWZ0ZXIgZXZlcnlcbiAqIGluc3RhbGwpLCB0aGVuIGdlbi1jb2RlLCB0aGVuIGFueSBvdGhlciBzY3JpcHQ7IHVuZGVmaW5lZCBtZWFucyB0aGUgbWFuYWdlZCBkZWZhdWx0IGNvbW1hbmQgYXBwbGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFByb2plY3RXcmFuZ2xlclR5cGVzR2VuZXJhdG9yKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB7XG4gIGNvbmZsaWN0aW5nOiBib29sZWFuO1xuICBjb21tYW5kOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59IHtcbiAgY29uc3Qgc2NyaXB0VmFsdWVzID0gT2JqZWN0LnZhbHVlcyhzY3JpcHRzKS5maWx0ZXIoKHNjcmlwdCk6IHNjcmlwdCBpcyBzdHJpbmcgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycpO1xuICAvLyBTY2FubmVkIG92ZXIgdGhlIGNvbnRleHQtZnJlZSBzZWdtZW50czogYW4gaW52b2NhdGlvbiBhZnRlciBhIHJlYWwgYGNkYCB3cml0ZXMgYW5vdGhlciBkaXJlY3RvcnkncyBmaWxlXG4gIC8vIGFuZCBtdXN0IG5vdCBkaXNhYmxlIG1hbmFnZW1lbnQgb2YgdGhpcyBwYWNrYWdlLlxuICBjb25zdCBjb25mbGljdGluZyA9IHNjcmlwdFZhbHVlcy5zb21lKFxuICAgIChzY3JpcHQpID0+XG4gICAgICBjb250ZXh0RnJlZUNvbW1hbmRTZWdtZW50cyhzY3JpcHQpLnNvbWUoKHNlZ21lbnQpID0+IHtcbiAgICAgICAgY29uc3QgaW52b2NhdGlvbkFyZ3MgPSBwYXJzZVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKHNlZ21lbnQpO1xuICAgICAgICBpZiAoaW52b2NhdGlvbkFyZ3MpIHJldHVybiBjbGFzc2lmeVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKGludm9jYXRpb25BcmdzKSA9PT0gJ2RlZmF1bHRPdXRwdXRDb25mbGljdCc7XG4gICAgICAgIHJldHVybiBpc1VubW9kZWxlZFdyYW5nbGVyVHlwZXNTZWdtZW50KHNlZ21lbnQsIHNjcmlwdHMpO1xuICAgICAgfSkgfHwgaGFzTm9uVHJhbnNwbGFudGFibGVHZW5lcmF0b3JQaXBlbGluZShzY3JpcHQsIHNjcmlwdHMpXG4gICk7XG4gIGNvbnN0IHByZWZlcnJlZENhbmRpZGF0ZXMgPSBbXG4gICAgY29sbGVjdFJldXNhYmxlR2VuZXJhdG9yU2VnbWVudHMoc2NyaXB0cy5wb3N0aW5zdGFsbCwgc2NyaXB0cyksXG4gICAgY29sbGVjdFJldXNhYmxlR2VuZXJhdG9yU2VnbWVudHMoc2NyaXB0c1snZ2VuLWNvZGUnXSwgc2NyaXB0cyksXG4gICAgc2NyaXB0VmFsdWVzLmZsYXRNYXAoKHNjcmlwdCkgPT4gY29sbGVjdFJldXNhYmxlR2VuZXJhdG9yU2VnbWVudHMoc2NyaXB0LCBzY3JpcHRzKSksXG4gIF0uZmluZCgoY2FuZGlkYXRlcykgPT4gY2FuZGlkYXRlcy5sZW5ndGggPiAwKTtcbiAgLy8gTm9ybWFsaXplZCBvbmx5IGFzIHRoZSBkZWR1cGxpY2F0aW9uIGtleTogcmV3cml0aW5nIHdoaXRlc3BhY2UgaW4gdGhlIGNvbW1hbmQgaXRzZWxmIHdvdWxkIGNoYW5nZSBxdW90ZWRcbiAgLy8gdmFsdWVzIChlLmcuIGEgcmVkaXJlY3Rpb24gdGFyZ2V0IHdpdGggZG91YmxlZCBzcGFjZXMpLlxuICBjb25zdCBkaXN0aW5jdENvbW1hbmRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHByZWZlcnJlZENhbmRpZGF0ZXMgPz8gW10pIHtcbiAgICBjb25zdCBrZXkgPSB0b2tlbml6ZUNvbW1hbmRTZWdtZW50KHNlZ21lbnQpLmpvaW4oJyAnKTtcbiAgICBpZiAoIWRpc3RpbmN0Q29tbWFuZHMuaGFzKGtleSkpIGRpc3RpbmN0Q29tbWFuZHMuc2V0KGtleSwgc2VnbWVudCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb25mbGljdGluZzogY29uZmxpY3RpbmcgfHwgZGlzdGluY3RDb21tYW5kcy5zaXplID4gMSxcbiAgICBjb21tYW5kOiBkaXN0aW5jdENvbW1hbmRzLnNpemUgPT09IDEgPyBbLi4uZGlzdGluY3RDb21tYW5kcy52YWx1ZXMoKV1bMF0gOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgc2NyaXB0IHBhaXJzIGEgcmV1c2FibGUgZ2VuZXJhdG9yIHdpdGggcHJlcmVxdWlzaXRlIHNlZ21lbnRzIHRoZSBtYW5hZ2VkIHNjcmlwdHMgY291bGQgbm90XG4gKiB0cmFuc3BsYW50IChlLmcuIGBub2RlIHNjcmlwdHMvcHJlcGFyZS5qcyAmJiB3cmFuZ2xlciB0eXBlcyAtLXN0cmljdC12YXJzPWZhbHNlYCk6IHJldXNpbmcgb25seSB0aGUgZ2VuZXJhdG9yXG4gKiBzZWdtZW50IHdvdWxkIGJ5cGFzcyB0aGUgcHJlcmVxdWlzaXRlcyBpbiBnZW4tY29kZSBhbmQgb24gZnJlc2ggaW5zdGFsbHMsIHNvIHN1Y2ggcGFja2FnZXMgc3RheSB1bm1hbmFnZWQuXG4gKi9cbmZ1bmN0aW9uIGhhc05vblRyYW5zcGxhbnRhYmxlR2VuZXJhdG9yUGlwZWxpbmUoc2NyaXB0OiBzdHJpbmcsIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBib29sZWFuIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBjb250ZXh0RnJlZUNvbW1hbmRTZWdtZW50cyhzY3JpcHQpO1xuICAvLyBCYXJlIGdlbmVyYXRvcnMgYW5kIHdyYXBwZXItcmVhY2hlZCBnZW5lcmF0b3JzIGZvcm0gcGlwZWxpbmVzIHRvbzogYSBwcmVwYXJhdGlvbiBzdGVwIHRoYXQgY3JlYXRlc1xuICAvLyAuZGV2LnZhcnMgYmVmb3JlIGB3cmFuZ2xlciB0eXBlc2AgbXVzdCBub3QgYmUgYnlwYXNzZWQgZWl0aGVyLiBBIGdlbmVyYXRvciByZWFjaGVkIG9ubHkgdGhyb3VnaCBhXG4gIC8vIG1hbmFnZWQgZ2VuLWNvZGUgc2VnbWVudCBkb2VzIG5vdCBjb3VudDogaXRzIHBpcGVsaW5lIGlzIGV4YWN0bHkgd2hhdCB0aGUgbWFuYWdlZCBzY3JpcHRzIHJ1biwgc28gYVxuICAvLyBjb21wb3NpdGlvbiBsaWtlIGB5YXJuIHJ1biBnZW4tY29kZSAmJiB2aXRlIGJ1aWxkYCBieXBhc3NlcyBub3RoaW5nIOKAlCB0cmVhdGluZyBpdCBhcyBhIHBpcGVsaW5lIHdvdWxkXG4gIC8vIChpZGVtcG90ZW5jeS1icmVha2luZ2x5KSBkaXNhYmxlIG1hbmFnZW1lbnQgcmlnaHQgYWZ0ZXIgd2JmeSBpdHNlbGYgYXBwZW5kZWQgdGhlIGdlbmVyYXRvciB0byBnZW4tY29kZS5cbiAgY29uc3QgaGFzUmV1c2FibGVHZW5lcmF0b3IgPSBzZWdtZW50cy5zb21lKFxuICAgIChzZWdtZW50KSA9PlxuICAgICAgIWlzTWFuYWdlZEdlbkNvZGVTZWdtZW50KHNlZ21lbnQsIHNjcmlwdHMpICYmXG4gICAgICByZWFjaGVzV3JhbmdsZXJUeXBlcyhcbiAgICAgICAgc2VnbWVudCxcbiAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgKGludm9jYXRpb25BcmdzKSA9PiBjbGFzc2lmeVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKGludm9jYXRpb25BcmdzKSA9PT0gJ3JldXNhYmxlR2VuZXJhdG9yJ1xuICAgICAgKVxuICApO1xuICBpZiAoIWhhc1JldXNhYmxlR2VuZXJhdG9yKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBzZWdtZW50cy5zb21lKFxuICAgIChzZWdtZW50KSA9PlxuICAgICAgc2VnbWVudCAhPT0gJycgJiZcbiAgICAgICFpc01hbmFnZWRHZW5Db2RlU2VnbWVudChzZWdtZW50LCBzY3JpcHRzKSAmJlxuICAgICAgIXBhcnNlV3JhbmdsZXJUeXBlc0ludm9jYXRpb24oc2VnbWVudCkgJiZcbiAgICAgICFyZWFjaGVzV3JhbmdsZXJUeXBlcyhzZWdtZW50LCBzY3JpcHRzLCAoKSA9PiB0cnVlKVxuICApO1xufVxuXG4vKiogVGhlIGZsYWdnZWQgcmV1c2FibGUtZ2VuZXJhdG9yIHNlZ21lbnRzIHRoZSBzY3JpcHQgcmVhY2hlcywgZGlyZWN0bHkgb3IgdGhyb3VnaCB3cmFwcGVyIHNjcmlwdHMuICovXG5mdW5jdGlvbiBjb2xsZWN0UmV1c2FibGVHZW5lcmF0b3JTZWdtZW50cyhcbiAgc2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIHZpc2l0ZWRTY3JpcHROYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoIXNjcmlwdCkgcmV0dXJuIHNlZ21lbnRzO1xuICByZWFjaGVzV3JhbmdsZXJUeXBlcyhcbiAgICBzY3JpcHQsXG4gICAgc2NyaXB0cyxcbiAgICAoaW52b2NhdGlvbkFyZ3MsIHNlZ21lbnQpID0+IHtcbiAgICAgIGlmIChpbnZvY2F0aW9uQXJncy5sZW5ndGggPiAwICYmIGNsYXNzaWZ5V3JhbmdsZXJUeXBlc0ludm9jYXRpb24oaW52b2NhdGlvbkFyZ3MpID09PSAncmV1c2FibGVHZW5lcmF0b3InKSB7XG4gICAgICAgIC8vIFdpdGhvdXQgdGhlIHRyYWlsaW5nIGNvbW1lbnQ6IGEgcmV1c2VkIGAuLi4gIyBub3RlYCB3b3VsZCBzd2FsbG93IGFueXRoaW5nIGNvbXBvc2VkIGFmdGVyIGl0LlxuICAgICAgICBzZWdtZW50cy5wdXNoKHN0cmlwVHJhaWxpbmdDb21tZW50KHNlZ21lbnQpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTsgLy8ga2VlcCBjb2xsZWN0aW5nIGluc3RlYWQgb2Ygc3RvcHBpbmcgYXQgdGhlIGZpcnN0IG1hdGNoXG4gICAgfSxcbiAgICB2aXNpdGVkU2NyaXB0TmFtZXNcbiAgKTtcbiAgcmV0dXJuIHNlZ21lbnRzO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHBhY2thZ2UncyBpbnN0YWxsIHBpcGVsaW5lIHJlZ2VuZXJhdGVzIHRoZSBtYW5hZ2VkIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMsIGRpcmVjdGx5IG9yIHRocm91Z2hcbiAqIHdyYXBwZXIgc2NyaXB0cy4gVW50cmFja2luZyB0aGUgZmlsZSBpcyBzYWZlIG9ubHkgd2hlbiB0aGlzIGhvbGRzIGZvciB0aGUgZmluYWwgZ2VuZXJhdGVkIHNjcmlwdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3N0aW5zdGFsbEdlbmVyYXRlc1dvcmtlclR5cGVzKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlYWNoZXNXcmFuZ2xlclR5cGVzKFxuICAgIHNjcmlwdHMucG9zdGluc3RhbGwsXG4gICAgc2NyaXB0cyxcbiAgICAoaW52b2NhdGlvbkFyZ3MpID0+IGNsYXNzaWZ5V3JhbmdsZXJUeXBlc0ludm9jYXRpb24oaW52b2NhdGlvbkFyZ3MpID09PSAncmV1c2FibGVHZW5lcmF0b3InXG4gICk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgc2NyaXB0IHJlYWNoZXMgYSBgd3JhbmdsZXIgdHlwZXNgIGludm9jYXRpb24gc2F0aXNmeWluZyB0aGUgcHJlZGljYXRlLCBkaXJlY3RseSBvciB0aHJvdWdoIHRoZVxuICogcGFja2FnZSBzY3JpcHRzIGl0IGludm9rZXMgKGUuZy4gYFwicG9zdGluc3RhbGxcIjogXCJ5YXJuIGdlbjp0eXBlc1wiYCwgd2l0aCBydW5uZXIgZmxhZ3MgYW5kIGVudmlyb25tZW50XG4gKiBhc3NpZ25tZW50cyBhbGxvd2VkIGFyb3VuZCB0aGUgc2NyaXB0IG5hbWUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhY2hlc1dyYW5nbGVyVHlwZXMoXG4gIHNjcmlwdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBwcmVkaWNhdGU6IChpbnZvY2F0aW9uQXJnczogc3RyaW5nW10sIHNlZ21lbnQ6IHN0cmluZykgPT4gYm9vbGVhbixcbiAgdmlzaXRlZFNjcmlwdE5hbWVzID0gbmV3IFNldDxzdHJpbmc+KClcbik6IGJvb2xlYW4ge1xuICBpZiAoIXNjcmlwdCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgY29udGV4dEZyZWVDb21tYW5kU2VnbWVudHMoc2NyaXB0KSkge1xuICAgIGNvbnN0IGludm9jYXRpb25BcmdzID0gcGFyc2VXcmFuZ2xlclR5cGVzSW52b2NhdGlvbihzZWdtZW50KTtcbiAgICBpZiAoaW52b2NhdGlvbkFyZ3MgJiYgcHJlZGljYXRlKGludm9jYXRpb25BcmdzLCBzZWdtZW50KSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVDb21tYW5kU2VnbWVudChzZWdtZW50KTtcbiAgICBsZXQgaW5kZXggPSBza2lwRW52aXJvbm1lbnRBc3NpZ25tZW50cyh0b2tlbnMpO1xuICAgIGxldCBpbnZva2VkU2NyaXB0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChzY3JpcHRXcmFwcGVyUnVubmVyQ29tbWFuZHMuaGFzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgbGV0IHJ1bm5lckZsYWdzID0gY29uc3VtZVJ1bm5lckZsYWdzKHRva2VucywgaW5kZXgpO1xuICAgICAgaWYgKFsncnVuJywgJ3J1bi1zY3JpcHQnXS5pbmNsdWRlcyh0b2tlbnNbcnVubmVyRmxhZ3MuaW5kZXhdID8/ICcnKSkge1xuICAgICAgICBydW5uZXJGbGFncyA9IGNvbnN1bWVSdW5uZXJGbGFncyh0b2tlbnMsIHJ1bm5lckZsYWdzLmluZGV4ICsgMSwgcnVubmVyRmxhZ3MubGVhdmVzUGFja2FnZSk7XG4gICAgICB9XG4gICAgICAvLyBBIHJ1bm5lciBkaXJlY3RlZCBhdCBhbm90aGVyIGRpcmVjdG9yeSAoZS5nLiBgeWFybiAtLWN3ZCAuLi9vdGhlciBnZW4tdHlwZXNgKSBydW5zIHRoYXQgcGFja2FnZSdzXG4gICAgICAvLyBzY3JpcHQsIG5vdCBvbmUgb2YgdGhlc2U7IGZvcndhcmRlZCBhcmd1bWVudHMgKGBucG0gcnVuIGdlbi10eXBlcyAtLSAtLWNoZWNrYCkgY2hhbmdlIHRoZSBlZmZlY3RpdmVcbiAgICAgIC8vIGludm9jYXRpb24sIHNvIHRoZSB3cmFwcGVyIGNhbm5vdCBzdGFuZCBmb3IgdGhlIHBsYWluIHNjcmlwdCBlaXRoZXIuXG4gICAgICBpbnZva2VkU2NyaXB0TmFtZSA9XG4gICAgICAgIHJ1bm5lckZsYWdzLmxlYXZlc1BhY2thZ2UgfHwgdG9rZW5zLmxlbmd0aCA+IHJ1bm5lckZsYWdzLmluZGV4ICsgMSA/IHVuZGVmaW5lZCA6IHRva2Vuc1tydW5uZXJGbGFncy5pbmRleF07XG4gICAgfVxuICAgIGlmICghaW52b2tlZFNjcmlwdE5hbWUgfHwgdmlzaXRlZFNjcmlwdE5hbWVzLmhhcyhpbnZva2VkU2NyaXB0TmFtZSkpIGNvbnRpbnVlO1xuICAgIHZpc2l0ZWRTY3JpcHROYW1lcy5hZGQoaW52b2tlZFNjcmlwdE5hbWUpO1xuICAgIGNvbnN0IGludm9rZWRTY3JpcHQgPSBzY3JpcHRzW2ludm9rZWRTY3JpcHROYW1lXTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgaW52b2tlZFNjcmlwdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIHJlYWNoZXNXcmFuZ2xlclR5cGVzKGludm9rZWRTY3JpcHQsIHNjcmlwdHMsIHByZWRpY2F0ZSwgdmlzaXRlZFNjcmlwdE5hbWVzKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUaGUgY29tbWFuZCBzZWdtZW50cyBvZiBhIHNjcmlwdCB0aGF0IHJ1biBpbiB0aGUgcGFja2FnZSBkaXJlY3Rvcnk6IHNlZ21lbnRzIGFmdGVyIGEgYGNkYCAoZXhjZXB0IGxpdGVyYWxcbiAqIG5vLW9wcyBsaWtlIGBjZCAuYCkgZXhlY3V0ZSBzb21ld2hlcmUgZWxzZSwgc28gYSBgd3JhbmdsZXIgdHlwZXNgIHRoZXJlIGdlbmVyYXRlcyBhbm90aGVyIHBhY2thZ2UncyBmaWxlLCBub3RcbiAqIHRoaXMgb25lJ3MsIGFuZCBtdXN0IGJlIGludmlzaWJsZSB0byBldmVyeSBkZWNpc2lvbiBhYm91dCB0aGUgbWFuYWdlZCBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGV4dEZyZWVDb21tYW5kU2VnbWVudHMoc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc3BsaXRDb21tYW5kU2VnbWVudHMoc2NyaXB0KSkge1xuICAgIGlmIChpc0RpcmVjdG9yeUNoYW5nZShzZWdtZW50KSkge1xuICAgICAgaWYgKGlzTm9PcERpcmVjdG9yeUNoYW5nZShzZWdtZW50KSkgY29udGludWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2VnbWVudHMucHVzaChzZWdtZW50KTtcbiAgfVxuICByZXR1cm4gc2VnbWVudHM7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBzY3JpcHQgbGVhdmVzIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSBhdCBzb21lIHBvaW50IChhbiBhcHBlbmRlZCBjb21tYW5kIHdvdWxkIHRoZW4gcnVuIGVsc2V3aGVyZSkuICovXG5leHBvcnQgZnVuY3Rpb24gc2NyaXB0Q2hhbmdlc1dvcmtpbmdEaXJlY3Rvcnkoc2NyaXB0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNwbGl0Q29tbWFuZFNlZ21lbnRzKHNjcmlwdCkuc29tZSgoc2VnbWVudCkgPT4gaXNEaXJlY3RvcnlDaGFuZ2Uoc2VnbWVudCkgJiYgIWlzTm9PcERpcmVjdG9yeUNoYW5nZShzZWdtZW50KSk7XG59XG5cbi8qKlxuICogU3BsaXQgYSBzaGVsbCBjb21tYW5kIGxpbmUgb24gYCYmYCBvdXRzaWRlIHF1b3RlczogYSBxdW90ZWQgYCYmYCAoZS5nLiBgZWNobyBcInNldHVwICYmIHdyYW5nbGVyIHR5cGVzIC4uLlwiYClcbiAqIGlzIGFyZ3VtZW50IHRleHQsIGFuZCBzcGxpdHRpbmcgaW5zaWRlIGl0IHdvdWxkIGZhYnJpY2F0ZSBhIGNvbW1hbmQgdGhhdCB3YXMgbmV2ZXIgcnVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRDb21tYW5kU2VnbWVudHMoc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudCA9ICcnO1xuICBsZXQgcXVvdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNjcmlwdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBzY3JpcHRbaW5kZXhdID8/ICcnO1xuICAgIGlmIChxdW90ZSkge1xuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnICYmIHF1b3RlID09PSAnXCInKSB7XG4gICAgICAgIGN1cnJlbnQgKz0gY2hhcmFjdGVyICsgKHNjcmlwdFsrK2luZGV4XSA/PyAnJyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gcXVvdGUpIHF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgY3VycmVudCArPSBjaGFyYWN0ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gXCInXCIgfHwgY2hhcmFjdGVyID09PSAnXCInKSB7XG4gICAgICBxdW90ZSA9IGNoYXJhY3RlcjtcbiAgICAgIGN1cnJlbnQgKz0gY2hhcmFjdGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICcmJyAmJiBzY3JpcHRbaW5kZXggKyAxXSA9PT0gJyYnKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgICAgIGN1cnJlbnQgPSAnJztcbiAgICAgIGluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY3VycmVudCArPSBjaGFyYWN0ZXI7XG4gIH1cbiAgc2VnbWVudHMucHVzaChjdXJyZW50LnRyaW0oKSk7XG4gIHJldHVybiBzZWdtZW50cztcbn1cblxuZnVuY3Rpb24gaXNEaXJlY3RvcnlDaGFuZ2Uoc2VnbWVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRva2VucyA9IHRva2VuaXplQ29tbWFuZFNlZ21lbnQoc2VnbWVudCk7XG4gIHJldHVybiB0b2tlbnNbc2tpcEVudmlyb25tZW50QXNzaWdubWVudHModG9rZW5zKV0gPT09ICdjZCc7XG59XG5cbmZ1bmN0aW9uIGlzTm9PcERpcmVjdG9yeUNoYW5nZShzZWdtZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVDb21tYW5kU2VnbWVudChzZWdtZW50KTtcbiAgbGV0IHRhcmdldEluZGV4ID0gc2tpcEVudmlyb25tZW50QXNzaWdubWVudHModG9rZW5zKSArIDE7XG4gIGlmICh0b2tlbnNbdGFyZ2V0SW5kZXhdID09PSAnLS0nKSB0YXJnZXRJbmRleCsrO1xuICAvLyBOb3JtYWxpemUgc3RhdGljIHNwZWxsaW5ncyBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkgKGAuYCwgYC4vYCwgYC4vLmAsIGAuLy4vYCwgLi4uKTsgYW55dGhpbmcgZWxzZVxuICAvLyAoaW5jbHVkaW5nIGEgYmFyZSBgY2RgLCB3aGljaCBnb2VzIHRvICRIT01FKSBjb3VudHMgYXMgYSByZWFsIGRpcmVjdG9yeSBjaGFuZ2UuXG4gIGxldCB0YXJnZXQgPSB1bnF1b3RlU2hlbGxUb2tlbih0b2tlbnNbdGFyZ2V0SW5kZXhdID8/ICcnKTtcbiAgd2hpbGUgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpKSB0YXJnZXQgPSB0YXJnZXQuc2xpY2UoMik7XG4gIGlmICh0YXJnZXQuZW5kc1dpdGgoJy8nKSkgdGFyZ2V0ID0gdGFyZ2V0LnNsaWNlKDAsIC0xKTtcbiAgcmV0dXJuIHRhcmdldCA9PT0gJy4nICYmIHRhcmdldEluZGV4ICsgMSA9PT0gdG9rZW5zLmxlbmd0aDtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHNlZ21lbnQganVzdCBydW5zIHRoZSBtYW5hZ2VkIGNvZGUgZ2VuZXJhdGlvbiAoYHdiIGdlbi1jb2RlYCwgb3IgYSBydW5uZXIgd3JhcHBlciBvZiBnZW4tY29kZSkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNYW5hZ2VkR2VuQ29kZVNlZ21lbnQoc2VnbWVudDogc3RyaW5nLCBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRva2VucyA9IHRva2VuaXplQ29tbWFuZFNlZ21lbnQoc2VnbWVudCk7XG4gIGxldCBpbmRleCA9IHNraXBFbnZpcm9ubWVudEFzc2lnbm1lbnRzKHRva2Vucyk7XG4gIGxldCBpc1J1blN1YmNvbW1hbmQgPSBmYWxzZTtcbiAgaWYgKHNjcmlwdFJ1bm5lckNvbW1hbmRzLmhhcyh0b2tlbnNbaW5kZXhdID8/ICcnKSkge1xuICAgIGluZGV4Kys7XG4gICAgbGV0IHJ1bm5lckZsYWdzID0gY29uc3VtZVJ1bm5lckZsYWdzKHRva2VucywgaW5kZXgpO1xuICAgIGlmIChbJ3J1bicsICdydW4tc2NyaXB0JywgJ2V4ZWMnLCAnZGx4JywgJ3gnXS5pbmNsdWRlcyh0b2tlbnNbcnVubmVyRmxhZ3MuaW5kZXhdID8/ICcnKSkge1xuICAgICAgaXNSdW5TdWJjb21tYW5kID0gWydydW4nLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKHRva2Vuc1tydW5uZXJGbGFncy5pbmRleF0gPz8gJycpO1xuICAgICAgcnVubmVyRmxhZ3MgPSBjb25zdW1lUnVubmVyRmxhZ3ModG9rZW5zLCBydW5uZXJGbGFncy5pbmRleCArIDEsIHJ1bm5lckZsYWdzLmxlYXZlc1BhY2thZ2UpO1xuICAgIH1cbiAgICBpZiAocnVubmVyRmxhZ3MubGVhdmVzUGFja2FnZSkgcmV0dXJuIGZhbHNlO1xuICAgIGluZGV4ID0gcnVubmVyRmxhZ3MuaW5kZXg7XG4gIH1cbiAgLy8gRXhhY3QgbWF0Y2ggb25seTogYHdiIGdlbi1jb2RlIDsgd3JhbmdsZXIgdHlwZXMgLS1jb25maWcgLi4uYCBvciBgd2IgZ2VuLWNvZGUgLS1mbGFnYCBpcyBub3QgdGhlIHBsYWluXG4gIC8vIG1hbmFnZWQgaW52b2NhdGlvbiBhbmQgbXVzdCBub3QgYmUgZGlzY2FyZGVkIGFzIG9uZS4gQWZ0ZXIgYHJ1bmAvYHJ1bi1zY3JpcHRgIG9ubHkgYSBwYWNrYWdlLXNjcmlwdCBuYW1lXG4gIC8vIGZvbGxvd3MsIHNvIGBucG0gcnVuIHdiIGdlbi1jb2RlYCBpbnZva2VzIHRoZSBzY3JpcHQgY2FsbGVkIGB3YmAsIG5vdCB0aGUgd2IgYmluYXJ5LlxuICBpZiAoIWlzUnVuU3ViY29tbWFuZCAmJiB0b2tlbnNbaW5kZXhdID09PSAnd2InICYmIHRva2Vuc1tpbmRleCArIDFdID09PSAnZ2VuLWNvZGUnKSB7XG4gICAgcmV0dXJuIGluZGV4ICsgMiA9PT0gdG9rZW5zLmxlbmd0aDtcbiAgfVxuICBpZiAodG9rZW5zW2luZGV4XSAhPT0gJ2dlbi1jb2RlJyB8fCBpbmRleCArIDEgIT09IHRva2Vucy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgLy8gQSBnZW4tY29kZSB3cmFwcGVyIGlzIGludGVyY2hhbmdlYWJsZSB3aXRoIGB3YiBnZW4tY29kZWAgb25seSB3aGVuIHRoZSBnZW4tY29kZSBzY3JpcHQgaXRzZWxmIGlzIHRoZVxuICAvLyBtYW5hZ2VkIHBpcGVsaW5lIChgd2IgZ2VuLWNvZGVgIHBsdXMgcmV1c2FibGUgbWFuYWdlZCBnZW5lcmF0aW9uKTsgYSBjdXN0b20gcGlwZWxpbmUgYmVoaW5kIGl0IChlLmcuXG4gIC8vIGBub2RlIHNjcmlwdHMvcHJlcGFyZVR5cGVzLmpzICYmIHdyYW5nbGVyIHR5cGVzIC4uLmAgb3IgYSBjdXN0b20tY29uZmlnIGludm9jYXRpb24pIG11c3QgYmUgcHJlc2VydmVkXG4gIC8vIGluc3RlYWQgb2YgYmVpbmcgcmVwbGFjZWQgYnkgdGhlIGJhcmUgd2IgY29tbWFuZC5cbiAgY29uc3QgZ2VuQ29kZVNjcmlwdCA9IHNjcmlwdHNbJ2dlbi1jb2RlJ107XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIGdlbkNvZGVTY3JpcHQgPT09ICdzdHJpbmcnICYmXG4gICAgY29udGV4dEZyZWVDb21tYW5kU2VnbWVudHMoZ2VuQ29kZVNjcmlwdCkuZXZlcnkoKGdlbkNvZGVTZWdtZW50KSA9PiB7XG4gICAgICBpZiAoZ2VuQ29kZVNlZ21lbnQgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGNvbnN0IGdlbkNvZGVUb2tlbnMgPSB0b2tlbml6ZUNvbW1hbmRTZWdtZW50KGdlbkNvZGVTZWdtZW50KTtcbiAgICAgIGxldCBnZW5Db2RlSW5kZXggPSBza2lwRW52aXJvbm1lbnRBc3NpZ25tZW50cyhnZW5Db2RlVG9rZW5zKTtcbiAgICAgIGlmIChzY3JpcHRSdW5uZXJDb21tYW5kcy5oYXMoZ2VuQ29kZVRva2Vuc1tnZW5Db2RlSW5kZXhdID8/ICcnKSkgZ2VuQ29kZUluZGV4Kys7XG4gICAgICBpZiAoZ2VuQ29kZVRva2Vuc1tnZW5Db2RlSW5kZXhdID09PSAnd2InICYmIGdlbkNvZGVUb2tlbnNbZ2VuQ29kZUluZGV4ICsgMV0gPT09ICdnZW4tY29kZScpIHJldHVybiB0cnVlO1xuICAgICAgY29uc3QgaW52b2NhdGlvbkFyZ3MgPSBwYXJzZVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKGdlbkNvZGVTZWdtZW50KTtcbiAgICAgIHJldHVybiAhIWludm9jYXRpb25BcmdzICYmIGNsYXNzaWZ5V3JhbmdsZXJUeXBlc0ludm9jYXRpb24oaW52b2NhdGlvbkFyZ3MpID09PSAncmV1c2FibGVHZW5lcmF0b3InO1xuICAgIH0pXG4gICk7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBzY3JpcHQgdGV4dHVhbGx5IG1lbnRpb25zIGB3cmFuZ2xlciB0eXBlc2Agb3V0c2lkZSBxdW90ZXMsIHdoYXRldmVyIGl0cyBzaGVsbCBmb3JtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbnRpb25zV3JhbmdsZXJUeXBlcyhzY3JpcHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL1xcYndyYW5nbGVyXFxzK3R5cGVzXFxiL3UudGVzdChzdHJpcFF1b3RlZFNwYW5zKHNjcmlwdCkpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHNlZ21lbnQgaW52b2x2ZXMgYHdyYW5nbGVyIHR5cGVzYCBpbiBhIHNoZWxsIGZvcm0gdGhlIHBhcnNlciBjYW5ub3QgZmFpdGhmdWxseSBtb2RlbDogYW4gdW5xdW90ZWRcbiAqIG1lbnRpb24gdGhhdCBkb2VzIG5vdCBwYXJzZSBhcyBhbiBpbnZvY2F0aW9uIChhIHN1YnNoZWxsLCBhIG5vbi1sb2NhbCBydW5uZXIsIGFyYml0cmFyeSBzaGVsbCBzeW50YXgpLCBhXG4gKiBzeW50YWN0aWNhbGx5IHF1b3RlZCBjb21tYW5kIHdvcmQgKGBcIndyYW5nbGVyXCIgdHlwZXNgIGV4ZWN1dGVzIHdyYW5nbGVyIGJ1dCBldmFkZXMgdG9rZW5pemF0aW9uKSwgb3IgYSB3cmFwcGVyXG4gKiBmb3J3YXJkaW5nIGV4dHJhIGFyZ3VtZW50cyAoYG5wbSBydW4gZ2VuLXR5cGVzIC0tIC0tY2hlY2tgKSB3aG9zZSB0YXJnZXQgaW52b2x2ZXMgYHdyYW5nbGVyIHR5cGVzYCDigJQgdGhlXG4gKiBmb3J3YXJkZWQgYXJndW1lbnRzIGNoYW5nZSB0aGUgZWZmZWN0aXZlIGludm9jYXRpb24uIFN1Y2ggc2VnbWVudHMgbWFrZSB0aGUgcGFja2FnZSB1bm1hbmFnZWFibGUgYW5kIG11c3QgYmVcbiAqIHByZXNlcnZlZCB2ZXJiYXRpbSB3aGVyZXZlciB3YmZ5IHJld3JpdGVzIHNjcmlwdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1VubW9kZWxlZFdyYW5nbGVyVHlwZXNTZWdtZW50KFxuICBzZWdtZW50OiBzdHJpbmcsXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIHZpc2l0ZWRTY3JpcHROYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4pOiBib29sZWFuIHtcbiAgaWYgKHBhcnNlV3JhbmdsZXJUeXBlc0ludm9jYXRpb24oc2VnbWVudCkpIHJldHVybiBmYWxzZTtcbiAgaWYgKG1lbnRpb25zV3JhbmdsZXJUeXBlcyhzZWdtZW50KSkgcmV0dXJuIHRydWU7XG4gIGlmICgvW1wiJ113cmFuZ2xlcltcIiddXFxzK3R5cGVzXFxifFxcYndyYW5nbGVyXFxzK1tcIidddHlwZXNbXCInXS91LnRlc3Qoc2VnbWVudCkpIHJldHVybiB0cnVlO1xuICAvLyBEb3VibGUgcXVvdGVzIGRvIG5vdCBzdXBwcmVzcyBjb21tYW5kIHN1YnN0aXR1dGlvbjogYGVjaG8gXCIkKHdyYW5nbGVyIHR5cGVzIC4uLilcImAgZXhlY3V0ZXMgd3JhbmdsZXIuXG4gIGlmICgvXFwkXFwofGAvdS50ZXN0KHN0cmlwU2luZ2xlUXVvdGVkU3BhbnMoc2VnbWVudCkpICYmIC9cXGJ3cmFuZ2xlclxccyt0eXBlc1xcYi91LnRlc3Qoc2VnbWVudCkpIHJldHVybiB0cnVlO1xuICAvLyBHbG9iYWwgb3B0aW9ucyBtYXkgcHJlY2VkZSB0aGUgc3ViY29tbWFuZCAoYHdyYW5nbGVyIC0tY29uZmlnIGFsdGVybmF0ZS5qc29uYyB0eXBlc2ApOyBhbnkgdW5wYXJzZWRcbiAgLy8gc2VnbWVudCBjYXJyeWluZyBib3RoIHdvcmRzIGNhbm5vdCBiZSBjbGFzc2lmaWVkLlxuICBjb25zdCB1bnF1b3RlZFRva2VucyA9IG5ldyBTZXQodG9rZW5pemVDb21tYW5kU2VnbWVudChzZWdtZW50KS5tYXAoKHRva2VuKSA9PiB1bnF1b3RlU2hlbGxUb2tlbih0b2tlbikpKTtcbiAgaWYgKHVucXVvdGVkVG9rZW5zLmhhcygnd3JhbmdsZXInKSAmJiB1bnF1b3RlZFRva2Vucy5oYXMoJ3R5cGVzJykpIHJldHVybiB0cnVlO1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZUNvbW1hbmRTZWdtZW50KHNlZ21lbnQpO1xuICBsZXQgaW5kZXggPSBza2lwRW52aXJvbm1lbnRBc3NpZ25tZW50cyh0b2tlbnMpO1xuICBpZiAoIXNjcmlwdFdyYXBwZXJSdW5uZXJDb21tYW5kcy5oYXModG9rZW5zW2luZGV4XSA/PyAnJykpIHJldHVybiBmYWxzZTtcbiAgaW5kZXgrKztcbiAgbGV0IHJ1bm5lckZsYWdzID0gY29uc3VtZVJ1bm5lckZsYWdzKHRva2VucywgaW5kZXgpO1xuICBpZiAoWydydW4nLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKHRva2Vuc1tydW5uZXJGbGFncy5pbmRleF0gPz8gJycpKSB7XG4gICAgcnVubmVyRmxhZ3MgPSBjb25zdW1lUnVubmVyRmxhZ3ModG9rZW5zLCBydW5uZXJGbGFncy5pbmRleCArIDEsIHJ1bm5lckZsYWdzLmxlYXZlc1BhY2thZ2UpO1xuICB9XG4gIGNvbnN0IGludm9rZWRTY3JpcHROYW1lID0gdG9rZW5zW3J1bm5lckZsYWdzLmluZGV4XTtcbiAgY29uc3QgZm9yd2FyZHNBcmd1bWVudHMgPSB0b2tlbnMubGVuZ3RoID4gcnVubmVyRmxhZ3MuaW5kZXggKyAxO1xuICBpZiAocnVubmVyRmxhZ3MubGVhdmVzUGFja2FnZSB8fCAhaW52b2tlZFNjcmlwdE5hbWUpIHJldHVybiBmYWxzZTtcbiAgaWYgKHZpc2l0ZWRTY3JpcHROYW1lcy5oYXMoaW52b2tlZFNjcmlwdE5hbWUpKSByZXR1cm4gZmFsc2U7XG4gIHZpc2l0ZWRTY3JpcHROYW1lcy5hZGQoaW52b2tlZFNjcmlwdE5hbWUpO1xuICBjb25zdCBpbnZva2VkU2NyaXB0ID0gc2NyaXB0c1tpbnZva2VkU2NyaXB0TmFtZV07XG4gIGlmICh0eXBlb2YgaW52b2tlZFNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgLy8gQSBwbGFpbiB3cmFwcGVyIG9mIGFuIHVubW9kZWxlZCB0YXJnZXQgaXMgaXRzZWxmIHVubW9kZWxlZDsgYSB3cmFwcGVyIGZvcndhcmRpbmcgYXJndW1lbnRzIGFkZGl0aW9uYWxseVxuICAvLyBjaGFuZ2VzIGFueSBtb2RlbGVkIHRhcmdldCdzIGVmZmVjdGl2ZSBpbnZvY2F0aW9uLCBzbyByZWFjaGluZyBvbmUgdGFpbnRzIGl0IHRvby5cbiAgcmV0dXJuIChcbiAgICBzcGxpdENvbW1hbmRTZWdtZW50cyhpbnZva2VkU2NyaXB0KS5zb21lKChpbnZva2VkU2VnbWVudCkgPT5cbiAgICAgIGlzVW5tb2RlbGVkV3JhbmdsZXJUeXBlc1NlZ21lbnQoaW52b2tlZFNlZ21lbnQsIHNjcmlwdHMsIHZpc2l0ZWRTY3JpcHROYW1lcylcbiAgICApIHx8XG4gICAgKGZvcndhcmRzQXJndW1lbnRzICYmIHJlYWNoZXNXcmFuZ2xlclR5cGVzKGludm9rZWRTY3JpcHQsIHNjcmlwdHMsICgpID0+IHRydWUsIG5ldyBTZXQodmlzaXRlZFNjcmlwdE5hbWVzKSkpXG4gICk7XG59XG5cbi8qKiBUb2tlbml6ZSBhIGNvbW1hbmQgc2VnbWVudCBvbiB3aGl0ZXNwYWNlIG91dHNpZGUgcXVvdGVzLCBzbyBxdW90ZWQgdmFsdWVzIChlLmcuIGBYPVwiYSBiXCJgKSBzdGF5IG9uZSB0b2tlbi4gKi9cbmZ1bmN0aW9uIHRva2VuaXplQ29tbWFuZFNlZ21lbnQoc2VnbWVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB0b2tlbnM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXJyZW50ID0gJyc7XG4gIGxldCBxdW90ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2VnbWVudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBzZWdtZW50W2luZGV4XSA/PyAnJztcbiAgICBpZiAocXVvdGUpIHtcbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXFxcJyAmJiBxdW90ZSA9PT0gJ1wiJykge1xuICAgICAgICBjdXJyZW50ICs9IGNoYXJhY3RlciArIChzZWdtZW50WysraW5kZXhdID8/ICcnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBxdW90ZSkgcXVvdGUgPSB1bmRlZmluZWQ7XG4gICAgICBjdXJyZW50ICs9IGNoYXJhY3RlcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSBcIidcIiB8fCBjaGFyYWN0ZXIgPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2hhcmFjdGVyO1xuICAgICAgY3VycmVudCArPSBjaGFyYWN0ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKC9cXHMvdS50ZXN0KGNoYXJhY3RlcikpIHtcbiAgICAgIGlmIChjdXJyZW50KSB0b2tlbnMucHVzaChjdXJyZW50KTtcbiAgICAgIGN1cnJlbnQgPSAnJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjdXJyZW50ICs9IGNoYXJhY3RlcjtcbiAgfVxuICBpZiAoY3VycmVudCkgdG9rZW5zLnB1c2goY3VycmVudCk7XG4gIHJldHVybiB0b2tlbnM7XG59XG5cbi8qKiBSZW1vdmUgcXVvdGVkIHNwYW5zIHNvIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIGluc2lkZSBhcmd1bWVudCB0ZXh0IGFyZSBub3QgbWlzdGFrZW4gZm9yIHN5bnRheC4gKi9cbmZ1bmN0aW9uIHN0cmlwUXVvdGVkU3BhbnMoc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGxldCBxdW90ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2NyaXB0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXJhY3RlciA9IHNjcmlwdFtpbmRleF0gPz8gJyc7XG4gICAgaWYgKHF1b3RlKSB7XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcgJiYgcXVvdGUgPT09ICdcIicpIGluZGV4Kys7XG4gICAgICBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IHF1b3RlKSBxdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSBcIidcIiB8fCBjaGFyYWN0ZXIgPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2hhcmFjdGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJlc3VsdCArPSBjaGFyYWN0ZXI7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIFJlbW92ZSBvbmx5IHNpbmdsZS1xdW90ZWQgc3BhbnM6IGRvdWJsZSBxdW90ZXMgZG8gbm90IHN1cHByZXNzIGNvbW1hbmQgc3Vic3RpdHV0aW9uIChgJCgpYCwgYmFja3RpY2tzKS4gKi9cbmZ1bmN0aW9uIHN0cmlwU2luZ2xlUXVvdGVkU3BhbnMoc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGxldCBpblNpbmdsZVF1b3RlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgY2hhcmFjdGVyIG9mIHNjcmlwdCkge1xuICAgIGlmIChpblNpbmdsZVF1b3RlKSB7XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBcIidcIikgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09IFwiJ1wiKSB7XG4gICAgICBpblNpbmdsZVF1b3RlID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXN1bHQgKz0gY2hhcmFjdGVyO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBSZW1vdmUgc2hlbGwgcXVvdGUgZGVsaW1pdGVycywga2VlcGluZyB0aGVpciBjb250ZW50OiBgJy0tY29uZmlnJ2AgaGFzIHRoZSBhcmd1bWVudCB2YWx1ZSAtLWNvbmZpZy4gKi9cbmZ1bmN0aW9uIHVucXVvdGVTaGVsbFRva2VuKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGxldCBxdW90ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG9rZW4ubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gdG9rZW5baW5kZXhdID8/ICcnO1xuICAgIGlmIChxdW90ZSkge1xuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnICYmIHF1b3RlID09PSAnXCInKSB7XG4gICAgICAgIHJlc3VsdCArPSB0b2tlblsrK2luZGV4XSA/PyAnJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBxdW90ZSkgcXVvdGUgPSB1bmRlZmluZWQ7XG4gICAgICBlbHNlIHJlc3VsdCArPSBjaGFyYWN0ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gXCInXCIgfHwgY2hhcmFjdGVyID09PSAnXCInKSB7XG4gICAgICBxdW90ZSA9IGNoYXJhY3RlcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXN1bHQgKz0gY2hhcmFjdGVyO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBDdXQgYSB0cmFpbGluZyB1bnF1b3RlZCBzaGVsbCBjb21tZW50IHNvIGNvbXBvc2luZyBmdXJ0aGVyIGNvbW1hbmRzIGFmdGVyIHRoZSBzZWdtZW50IHN0YXlzIGV4ZWN1dGFibGUuICovXG5mdW5jdGlvbiBzdHJpcFRyYWlsaW5nQ29tbWVudChzZWdtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcXVvdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNlZ21lbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gc2VnbWVudFtpbmRleF0gPz8gJyc7XG4gICAgaWYgKHF1b3RlKSB7XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcgJiYgcXVvdGUgPT09ICdcIicpIGluZGV4Kys7XG4gICAgICBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IHF1b3RlKSBxdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSBcIidcIiB8fCBjaGFyYWN0ZXIgPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2hhcmFjdGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICcjJyAmJiAoaW5kZXggPT09IDAgfHwgL1xccy91LnRlc3Qoc2VnbWVudFtpbmRleCAtIDFdID8/ICcnKSkpIHtcbiAgICAgIHJldHVybiBzZWdtZW50LnNsaWNlKDAsIGluZGV4KS50cmltKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzZWdtZW50O1xufVxuXG4vKipcbiAqIFBhcnNlIGEgY29tbWFuZCBzZWdtZW50IGFzIGEgYHdyYW5nbGVyIHR5cGVzYCBpbnZvY2F0aW9uIGFuZCByZXR1cm4gaXRzIGFyZ3VtZW50cyAod2l0aCBzaGVsbCByZWRpcmVjdGlvbnNcbiAqIHN0cmlwcGVkKSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHNlZ21lbnQgcnVucyBzb21ldGhpbmcgZWxzZS4gUmVxdWlyaW5nIGNvbW1hbmQgcG9zaXRpb24gKGFmdGVyIGVudmlyb25tZW50XG4gKiBhc3NpZ25tZW50cyBhbmQgYSBydW5uZXIgcHJlZml4IHdpdGggaXRzIGZsYWdzLCBlLmcuIGBucHggLS15ZXNgKSBrZWVwcyBzaGVsbCB0ZXh0IHRoYXQgbWVyZWx5IG1lbnRpb25zIHRoZVxuICogd29yZHMgKGUuZy4gYGVjaG8gd3JhbmdsZXIgdHlwZXNgKSBmcm9tIGJlaW5nIHRyZWF0ZWQgYXMgYSBnZW5lcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKHNlZ21lbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgLy8gQW4gdW5xdW90ZWQgbmV3bGluZSBzZXBhcmF0ZXMgY29tbWFuZHMgdGhlIHNlZ21lbnQgc3BsaXR0ZXIgZG9lcyBub3QgbW9kZWwuXG4gIGlmIChzdHJpcFF1b3RlZFNwYW5zKHNlZ21lbnQpLmluY2x1ZGVzKCdcXG4nKSkgcmV0dXJuO1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZUNvbW1hbmRTZWdtZW50KHNlZ21lbnQpO1xuICBsZXQgaW5kZXggPSBza2lwRW52aXJvbm1lbnRBc3NpZ25tZW50cyh0b2tlbnMpO1xuICBpZiAoc2NyaXB0UnVubmVyQ29tbWFuZHMuaGFzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgaW5kZXgrKztcbiAgICBsZXQgcnVubmVyRmxhZ3MgPSBjb25zdW1lUnVubmVyRmxhZ3ModG9rZW5zLCBpbmRleCk7XG4gICAgLy8gYHJ1bmAvYHJ1bi1zY3JpcHRgIG5hbWUgYSBwYWNrYWdlIHNjcmlwdCwgbmV2ZXIgYSBiaW5hcnk6IGBucG0gcnVuIHdyYW5nbGVyIHR5cGVzYCBpbnZva2VzIHRoZSBzY3JpcHRcbiAgICAvLyBjYWxsZWQgYHdyYW5nbGVyYCB3aXRoIGB0eXBlc2AgYXMgYW4gYXJndW1lbnQsIHNvIGl0IG11c3QgZ28gdGhyb3VnaCB3cmFwcGVyIHJlc29sdXRpb24gaW5zdGVhZC5cbiAgICBpZiAoWydydW4nLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKHRva2Vuc1tydW5uZXJGbGFncy5pbmRleF0gPz8gJycpKSByZXR1cm47XG4gICAgaWYgKFsnZXhlYycsICdkbHgnLCAneCddLmluY2x1ZGVzKHRva2Vuc1tydW5uZXJGbGFncy5pbmRleF0gPz8gJycpKSB7XG4gICAgICBydW5uZXJGbGFncyA9IGNvbnN1bWVSdW5uZXJGbGFncyh0b2tlbnMsIHJ1bm5lckZsYWdzLmluZGV4ICsgMSwgcnVubmVyRmxhZ3MubGVhdmVzUGFja2FnZSk7XG4gICAgfVxuICAgIC8vIEEgcnVubmVyIGRpcmVjdGVkIGF0IGFub3RoZXIgZGlyZWN0b3J5IHJ1bnMgdGhhdCBwYWNrYWdlJ3Mgd3JhbmdsZXIsIG5vdCB0aGlzIG9uZSdzLlxuICAgIGlmIChydW5uZXJGbGFncy5sZWF2ZXNQYWNrYWdlKSByZXR1cm47XG4gICAgaW5kZXggPSBydW5uZXJGbGFncy5pbmRleDtcbiAgfVxuICBpZiAodG9rZW5zW2luZGV4XSAhPT0gJ3dyYW5nbGVyJyB8fCB0b2tlbnNbaW5kZXggKyAxXSAhPT0gJ3R5cGVzJykgcmV0dXJuO1xuXG4gIGNvbnN0IGludm9jYXRpb25BcmdzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBhcmdJbmRleCA9IGluZGV4ICsgMjsgYXJnSW5kZXggPCB0b2tlbnMubGVuZ3RoOyBhcmdJbmRleCsrKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbYXJnSW5kZXhdID8/ICcnO1xuICAgIC8vIEEgdG9rZW4taW5pdGlhbCB1bnF1b3RlZCBgI2Agc3RhcnRzIGEgc2hlbGwgY29tbWVudDogZXZlcnl0aGluZyBhZnRlciBpdCBpcyBub3QgYW4gYXJndW1lbnQuXG4gICAgaWYgKHRva2VuLnN0YXJ0c1dpdGgoJyMnKSkgYnJlYWs7XG4gICAgLy8gU2hlbGwgcmVkaXJlY3Rpb25zIChgPiAvZGV2L251bGxgLCBgMj4mMWAsIGA+PmxvZ2ApIGFyZSBub3Qgd3JhbmdsZXIgYXJndW1lbnRzOyBhIGJhcmUgb3BlcmF0b3IgYWxzb1xuICAgIC8vIGNvbnN1bWVzIHRoZSBmb2xsb3dpbmcgdG9rZW4gYXMgaXRzIHRhcmdldC5cbiAgICBjb25zdCByZWRpcmVjdGlvbk9wZXJhdG9yID0gL14oPzpcXGQrfCYpPyg/Oj4+P3w8KS91LmV4ZWModG9rZW4pPy5bMF07XG4gICAgaWYgKHJlZGlyZWN0aW9uT3BlcmF0b3IpIHtcbiAgICAgIGlmIChyZWRpcmVjdGlvbk9wZXJhdG9yID09PSB0b2tlbikgYXJnSW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpbnZvY2F0aW9uQXJncy5wdXNoKHRva2VuKTtcbiAgfVxuICByZXR1cm4gaW52b2NhdGlvbkFyZ3M7XG59XG5cbi8qKiBDbGFzc2lmeSB3aGF0IHRoZSBpbnZvY2F0aW9uIHdyaXRlczsgc2VlIFdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uS2luZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKGludm9jYXRpb25BcmdzOiBzdHJpbmdbXSk6IFdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uS2luZCB7XG4gIGxldCB3cml0ZXNFbHNld2hlcmUgPSBmYWxzZTtcbiAgbGV0IGNoYW5nZXNJbnB1dHMgPSBmYWxzZTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGludm9jYXRpb25BcmdzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHJhd0FyZyA9IGludm9jYXRpb25BcmdzW2luZGV4XSA/PyAnJztcbiAgICAvLyBVbnF1b3RlZCBzaGVsbCBtZXRhY2hhcmFjdGVycyAocGlwZXMsIHN1YnNoZWxscywgYDtgLCBhIGJhY2tncm91bmRpbmcgYCZgKSBhcmUgbm90IG1vZGVsZWQgYnkgdGhlXG4gICAgLy8gcGFyc2VyLCBhbmQgY29tbWFuZCBzdWJzdGl0dXRpb24gZXhlY3V0ZXMgZXZlbiBpbnNpZGUgZG91YmxlIHF1b3RlczsgY29uc2VydmF0aXZlbHkgdHJlYXQgc3VjaFxuICAgIC8vIGludm9jYXRpb25zIGFzIGNvbmZsaWN0aW5nLlxuICAgIGlmICgvWygpO3xgJl18XFwkXFwoL3UudGVzdChzdHJpcFF1b3RlZFNwYW5zKHJhd0FyZykpIHx8IC9cXCRcXCh8YC91LnRlc3Qoc3RyaXBTaW5nbGVRdW90ZWRTcGFucyhyYXdBcmcpKSkge1xuICAgICAgcmV0dXJuICdkZWZhdWx0T3V0cHV0Q29uZmxpY3QnO1xuICAgIH1cbiAgICAvLyBTaGVsbCBxdW90aW5nIGRvZXMgbm90IGNoYW5nZSBhbiBhcmd1bWVudCdzIHZhbHVlOiBgJy0tY29uZmlnJ2AgaXMgc3RpbGwgLS1jb25maWcuXG4gICAgY29uc3QgYXJnID0gdW5xdW90ZVNoZWxsVG9rZW4ocmF3QXJnKTtcbiAgICBjb25zdCBuZXh0QXJnID0gdW5xdW90ZVNoZWxsVG9rZW4oaW52b2NhdGlvbkFyZ3NbaW5kZXggKyAxXSA/PyAnJyk7XG4gICAgLy8gTm9uLWdlbmVyYXRpbmcgbW9kZXMgd3JpdGUgbm8gZmlsZSBhdCBhbGwsIHdoYXRldmVyIG90aGVyIGZsYWdzIHNheS4gVGhleSBhcmUgYm9vbGVhbiBvcHRpb25zOiBvbmx5XG4gICAgLy8gdGhlaXIgZW5hYmxlZCBmb3JtcyBzdXBwcmVzcyBnZW5lcmF0aW9uLCB3aGlsZSBgLS1jaGVjaz1mYWxzZWAgKG9yIGAtLWNoZWNrICdmYWxzZSdgKSBzdGlsbCB3cml0ZXMuXG4gICAgaWYgKC9eKD86LS1oZWxwfC1ofC0tdmVyc2lvbnwtdikoPzo9dHJ1ZSk/JC91LnRlc3QoYXJnKSAmJiBuZXh0QXJnICE9PSAnZmFsc2UnKSByZXR1cm4gJ2hhcm1sZXNzJztcbiAgICBpZiAoL14tLWNoZWNrKD86PXRydWUpPyQvdS50ZXN0KGFyZykgJiYgbmV4dEFyZyAhPT0gJ2ZhbHNlJykgcmV0dXJuICdoYXJtbGVzcyc7XG4gICAgaWYgKC9eKD86LS1jb25maWd8LWN8LS1lbnZ8LWV8LS1lbnYtZmlsZSkoPzo9LiopPyQvdS50ZXN0KGFyZykpIHtcbiAgICAgIGNoYW5nZXNJbnB1dHMgPSB0cnVlO1xuICAgICAgaWYgKCFhcmcuaW5jbHVkZXMoJz0nKSkgaW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoL14tLWN3ZCg/Oj0uKik/JC91LnRlc3QoYXJnKSkge1xuICAgICAgLy8gYC0tY3dkIC5gIHN0aWxsIHJ1bnMgaW4gdGhpcyBwYWNrYWdlJ3MgZGlyZWN0b3J5LCBzbyBpdCBzdGF5cyBhbiBvcmRpbmFyeSBsb2NhbCBpbnZvY2F0aW9uLlxuICAgICAgY29uc3QgY3dkVmFsdWUgPSBhcmcuaW5jbHVkZXMoJz0nKVxuICAgICAgICA/IGFyZy5zbGljZSgnLS1jd2Q9Jy5sZW5ndGgpXG4gICAgICAgIDogdW5xdW90ZVNoZWxsVG9rZW4oaW52b2NhdGlvbkFyZ3NbKytpbmRleF0gPz8gJycpO1xuICAgICAgaWYgKGN3ZFZhbHVlICE9PSAnLicgJiYgY3dkVmFsdWUgIT09ICcuLycpIHdyaXRlc0Vsc2V3aGVyZSA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHdyYW5nbGVyVHlwZXNWYWx1ZUZsYWdzLmhhcyhhcmcpKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAvLyBCb29sZWFuIG9wdGlvbnMgYWNjZXB0IGEgc3BhY2Utc2VwYXJhdGVkIGxpdGVyYWwgKGUuZy4gYC0tc3RyaWN0LXZhcnMgZmFsc2VgKSwgd2hpY2ggbXVzdCBub3QgYmVcbiAgICAgIC8vIG1pc3JlYWQgYXMgYSBwb3NpdGlvbmFsIG91dHB1dCBwYXRoLlxuICAgICAgaWYgKG5leHRBcmcgPT09ICd0cnVlJyB8fCBuZXh0QXJnID09PSAnZmFsc2UnKSBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGxldCBvdXRwdXRQYXRoID0gYXJnO1xuICAgIHdoaWxlIChvdXRwdXRQYXRoLnN0YXJ0c1dpdGgoJy4vJykpIG91dHB1dFBhdGggPSBvdXRwdXRQYXRoLnNsaWNlKDIpO1xuICAgIGlmIChvdXRwdXRQYXRoICE9PSAnd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cycpIHdyaXRlc0Vsc2V3aGVyZSA9IHRydWU7XG4gIH1cbiAgaWYgKHdyaXRlc0Vsc2V3aGVyZSkgcmV0dXJuICdoYXJtbGVzcyc7XG4gIGlmIChjaGFuZ2VzSW5wdXRzKSByZXR1cm4gJ2RlZmF1bHRPdXRwdXRDb25mbGljdCc7XG4gIHJldHVybiAncmV1c2FibGVHZW5lcmF0b3InO1xufVxuXG5mdW5jdGlvbiBza2lwRW52aXJvbm1lbnRBc3NpZ25tZW50cyh0b2tlbnM6IHN0cmluZ1tdKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCAmJiAvXltBLVphLXpfXVtBLVphLXowLTlfXSo9L3UudGVzdCh0b2tlbnNbaW5kZXhdID8/ICcnKSkgaW5kZXgrKztcbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vLyBSdW5uZXIgb3B0aW9ucyB0aGF0IGNvbnN1bWUgdGhlIGZvbGxvd2luZyB0b2tlbiBhcyB0aGVpciB2YWx1ZTsgdGhlIGRpcmVjdG9yeS1jaGFuZ2luZyBvbmVzIG1ha2UgdGhlIHJ1bm5lclxuLy8gb3BlcmF0ZSBvbiBhbm90aGVyIHBhY2thZ2Ugd2hlbiB0aGUgdmFsdWUgaXMgbm90IHRoZSBwYWNrYWdlIGl0c2VsZiwgYW5kIHdvcmtzcGFjZS9maWx0ZXIgc2VsZWN0b3JzIGFsd2F5c1xuLy8gbWF5IChucG0gcnVucyBgLS13b3Jrc3BhY2U9b3RoZXJgIGNvbW1hbmRzIGluc2lkZSB0aGF0IHdvcmtzcGFjZSkuXG5jb25zdCBydW5uZXJEaXJlY3RvcnlWYWx1ZUZsYWdzID0gbmV3IFNldChbJy0tY3dkJywgJy1DJywgJy0tcHJlZml4JywgJy0tZGlyJ10pO1xuY29uc3QgcnVubmVyV29ya3NwYWNlVmFsdWVGbGFncyA9IG5ldyBTZXQoWyctdycsICctLXdvcmtzcGFjZScsICctRicsICctLWZpbHRlciddKTtcbi8vIEJhcmUgc2VsZWN0b3JzIHRoYXQgcnVuIHRoZSBjb21tYW5kIGluIGV2ZXJ5IHdvcmtzcGFjZSBpbnN0ZWFkIG9mIChvbmx5KSB0aGlzIHBhY2thZ2UuXG5jb25zdCBydW5uZXJBbGxXb3Jrc3BhY2VzRmxhZ3MgPSBuZXcgU2V0KFsnLS13b3Jrc3BhY2VzJywgJy13cycsICctLXJlY3Vyc2l2ZScsICctciddKTtcblxuZnVuY3Rpb24gY29uc3VtZVJ1bm5lckZsYWdzKFxuICB0b2tlbnM6IHN0cmluZ1tdLFxuICBpbmRleDogbnVtYmVyLFxuICBsZWF2ZXNQYWNrYWdlID0gZmFsc2Vcbik6IHsgaW5kZXg6IG51bWJlcjsgbGVhdmVzUGFja2FnZTogYm9vbGVhbiB9IHtcbiAgd2hpbGUgKCh0b2tlbnNbaW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICBjb25zdCBmbGFnID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICBpbmRleCsrO1xuICAgIGxldCBkaXJlY3RvcnlWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChydW5uZXJEaXJlY3RvcnlWYWx1ZUZsYWdzLmhhcyhmbGFnKSkge1xuICAgICAgZGlyZWN0b3J5VmFsdWUgPSB0b2tlbnNbaW5kZXhdO1xuICAgICAgaW5kZXgrKztcbiAgICB9IGVsc2UgaWYgKC9eKD86LS1jd2R8LS1wcmVmaXh8LS1kaXIpPS91LnRlc3QoZmxhZykpIHtcbiAgICAgIGRpcmVjdG9yeVZhbHVlID0gZmxhZy5zbGljZShmbGFnLmluZGV4T2YoJz0nKSArIDEpO1xuICAgIH0gZWxzZSBpZiAocnVubmVyV29ya3NwYWNlVmFsdWVGbGFncy5oYXMoZmxhZykpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgICBsZWF2ZXNQYWNrYWdlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKC9eKD86LXd8LS13b3Jrc3BhY2V8LUZ8LS1maWx0ZXIpPS91LnRlc3QoZmxhZykgfHwgcnVubmVyQWxsV29ya3NwYWNlc0ZsYWdzLmhhcyhmbGFnKSkge1xuICAgICAgbGVhdmVzUGFja2FnZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChkaXJlY3RvcnlWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGRpcmVjdG9yeVZhbHVlICE9PSAnLicgJiYgZGlyZWN0b3J5VmFsdWUgIT09ICcuLycpIGxlYXZlc1BhY2thZ2UgPSB0cnVlO1xuICB9XG4gIHJldHVybiB7IGluZGV4LCBsZWF2ZXNQYWNrYWdlIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgcG9zdGluc3RhbGxHZW5lcmF0ZXNXb3JrZXJUeXBlcyB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyVHlwZXNDb21tYW5kLmpzJztcblxuY29uc3Qgd29ya2VyVHlwZXNGaWxlTmFtZSA9ICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJztcblxuLyoqXG4gKiBTdG9wcyB0cmFja2luZyB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGluIENsb3VkZmxhcmUgcHJvamVjdHMgdGhhdCBjb21taXR0ZWQgaXQgYmVmb3JlIC5naXRpZ25vcmUgY292ZXJlZCBpdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVudHJhY2tXb3JrZXJUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCd1bnRyYWNrV29ya2VyVHlwZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gLmdpdGlnbm9yZSBpcyBpZ25vcmVkIGZvciBhbHJlYWR5LXRyYWNrZWQgZmlsZXMsIHNvIGEgY29tbWl0dGVkIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgd291bGQga2VlcFxuICAgIC8vIHByb2R1Y2luZyBhIGh1Z2UgZGlmZiBvbiBldmVyeSB3cmFuZ2xlciBidW1wIGRlc3BpdGUgYmVpbmcgcmVnZW5lcmF0ZWQgYnkgYHdyYW5nbGVyIHR5cGVzYCBvbiBpbnN0YWxsLlxuICAgIGNvbnN0IHRyYWNrZWQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtZmlsZXMnLCAnLS0nLCB3b3JrZXJUeXBlc0ZpbGVOYW1lXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmICghdHJhY2tlZCkgcmV0dXJuO1xuXG4gICAgLy8gVW50cmFjayBvbmx5IHdoZW4gdGhlIChyZSlnZW5lcmF0ZWQgcGFja2FnZS5qc29uJ3MgaW5zdGFsbCBwaXBlbGluZSByZWFsbHkgcmVnZW5lcmF0ZXMgdGhlIGZpbGU6XG4gICAgLy8gZ2VuZXJhdGVQYWNrYWdlSnNvbiBzd2FsbG93cyBpdHMgb3duIGV4Y2VwdGlvbnMsIHNvIGEgcGFydGlhbCBydW4gbXVzdCBub3QgbGVhdmUgdGhlIGRlY2xhcmF0aW9uIGRlbGV0ZWRcbiAgICAvLyB3aXRoIG5vdGhpbmcgcmVjcmVhdGluZyBpdCBvbiBmcmVzaCBjaGVja291dHMuXG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgKSBhcyBQYWNrYWdlSnNvbjtcbiAgICBpZiAoIXBvc3RpbnN0YWxsR2VuZXJhdGVzV29ya2VyVHlwZXMocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkpIHJldHVybjtcblxuICAgIC8vIFVudHJhY2tpbmcgYSBmaWxlIHRoZSBnZW5lcmF0ZWQgLmdpdGlnbm9yZSBkb2VzIG5vdCBhY3R1YWxseSBjb3ZlciAoZS5nLiB0aGUgZ2l0aWdub3JlLmlvIGZldGNoIGZhaWxlZCwgc28gdGhlXG4gICAgLy8gZmlsZSB3YXMgbmV2ZXIgd3JpdHRlbikgd291bGQgbGVhdmUgaXQgdW50cmFja2VkIGFuZCBkaXJ0eSBpbiB0aGUgcmVwb3NpdG9yeSwgc28gY29uZmlybSB0aGUgcnVsZSBhcHBsaWVzIGZpcnN0LlxuICAgIC8vIGBnaXQgY2hlY2staWdub3JlYCBhbHNvIGhvbm9ycyAuZ2l0L2luZm8vZXhjbHVkZSBhbmQgZ2xvYmFsIGV4Y2x1ZGVzLCB3aGljaCBhIGZyZXNoIGNsb25lIGxhY2tzLCBzbyB0aGVcbiAgICAvLyBjb21taXR0ZWQgcGFja2FnZSAuZ2l0aWdub3JlIG11c3QgY2FycnkgdGhlIG1hbmFnZWQgcnVsZSBpdHNlbGYuXG4gICAgY29uc3QgZ2l0aWdub3JlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBoYXNNYW5hZ2VkUnVsZSA9XG4gICAgICBmcy5leGlzdHNTeW5jKGdpdGlnbm9yZVBhdGgpICYmXG4gICAgICBmc1xuICAgICAgICAucmVhZEZpbGVTeW5jKGdpdGlnbm9yZVBhdGgsICd1dGY4JylcbiAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAuc29tZSgobGluZSkgPT4gbGluZS50cmltKCkgPT09IGAvJHt3b3JrZXJUeXBlc0ZpbGVOYW1lfWApO1xuICAgIGlmICghaGFzTWFuYWdlZFJ1bGUpIHJldHVybjtcbiAgICAvLyAtLW5vLWluZGV4IG1ha2VzIGdpdCByZXBvcnQgdGhlIHJ1bGUgdGhhdCB3b3VsZCBhcHBseSwgaW5zdGVhZCBvZiByZXBvcnRpbmcgbm90aGluZyBiZWNhdXNlIHRoZSBmaWxlIGlzIHRyYWNrZWQuXG4gICAgY29uc3QgaXNJZ25vcmVkID1cbiAgICAgIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhcbiAgICAgICAgJ2dpdCcsXG4gICAgICAgIFsnY2hlY2staWdub3JlJywgJy0tcXVpZXQnLCAnLS1uby1pbmRleCcsICctLScsIHdvcmtlclR5cGVzRmlsZU5hbWVdLFxuICAgICAgICBjb25maWcuZGlyUGF0aFxuICAgICAgKSA9PT0gMDtcbiAgICBpZiAoIWlzSWdub3JlZCkgcmV0dXJuO1xuXG4gICAgLy8gLS1jYWNoZWQga2VlcHMgdGhlIGZpbGUgb24gZGlzayBiZWNhdXNlIHR5cGUgY2hlY2tpbmcgbmVlZHMgaXQgYmVmb3JlIHRoZSBuZXh0IGluc3RhbGwgcmVnZW5lcmF0ZXMgaXQuXG4gICAgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdnaXQnLCBbJ3JtJywgJy0tY2FjaGVkJywgJy0tcXVpZXQnLCAnLS0nLCB3b3JrZXJUeXBlc0ZpbGVOYW1lXSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIEFHRU5UU19FWFRSQS5tZCBleGlzdHMgYW5kIHJlYWQgaXRzIGNvbnRlbnRcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBgLS0tXFxuZGVzY3JpcHRpb246IEdlbmVyYWwgQ29kaW5nIFJ1bGVzXFxuZ2xvYnM6XFxuYWx3YXlzQXBwbHk6IHRydWVcXG4tLS1gO1xuICBjb25zdCBib2R5ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKGNvbmZpZywgYWxsQ29uZmlncywgJ0N1cnNvcicsIGV4dHJhQ29udGVudCk7XG4gIHJldHVybiBgJHtmcm9udG1hdHRlcn1cXG5cXG4ke2JvZHl9YDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQocm9vdENvbmZpZyk7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb247XG4gIC8vIFdpbGxCb29zdGVyIFJhaWx3YXkgcHJvamVjdCBpZGVudGlmaWVycyBhcmUgbWFuYWdlZCBpbiBkZXBsb3kgd29ya2Zsb3cgc2V0dGluZ3MuXG4gIGNvbnN0IHJhaWx3YXlJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNSYWlsd2F5XG4gICAgPyAnXFxuLSBSYWlsd2F5IHByb2plY3QgaW5mb3JtYXRpb24gaXMgaW4gdGhlIGRlcGxveSB3b3JrZmxvd3MgdW5kZXIgYC5naXRodWIvd29ya2Zsb3dzYC4nXG4gICAgOiAnJztcbiAgY29uc3QgcGxheXdyaWdodFRlc3RTZXJ2ZXJJbnN0cnVjdGlvbiA9IGhhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGFsbENvbmZpZ3MpXG4gICAgPyBgXFxuLSBVc2UgXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2Igc3RhcnQgLS1tb2RlIHRlc3RcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYFxuICAgIDogJyc7XG4gIGNvbnN0IGNvQXV0aG9ySW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBgXFxuICAtIEVuZCB5b3VyIGNvbW1pdCBtZXNzYWdlIHdpdGggYSBibGFuayBsaW5lIGZvbGxvd2VkIGJ5IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgLmBcbiAgICA6ICcnO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiBcXGAke3Jvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgJ3Vua25vd24nfVxcYCR7ZGVzY3JpcHRpb24gPyBgXFxuLSBEZXNjcmlwdGlvbjogJHtkZXNjcmlwdGlvbn1gIDogJyd9XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn1cblxuIyMgR2VuZXJhbCBJbnN0cnVjdGlvbnNcblxuLSBJZiBvbiBcXGBtYWluXFxgLCBjcmVhdGUgYSBuZXcgYnJhbmNoOyBvdGhlcndpc2Ugd29yayBvbiB0aGUgY3VycmVudCBicmFuY2guXG4tIFJ1biBcXGBnaXRcXGAgY29tbWFuZHMgb25lIGF0IGEgdGltZSB0byBhdm9pZCBcXGBpbmRleC5sb2NrXFxgIGNvbmZsaWN0cy5cbi0gV3JpdGUgYSB0ZXN0IG9ubHkgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZCwgb3Igd2hlbiBhIGJlaGF2aW9yIGlzIGJvdGggbGlrZWx5IHRvIHJlZ3Jlc3MgQU5EIGhhcyBubyBvdGhlciBhdXRvbWF0aWMgc2FmZWd1YXJkICh0eXBlIGNoZWNraW5nLCBsaW50aW5nLCBvciBhbiBleGlzdGluZyB0ZXN0L0NJIGNoZWNrIHdvdWxkIG5vdCBjYXRjaCB0aGUgYnJlYWthZ2UpLiBTa2lwIHRoZSB0ZXN0IHdoZW4gYW4gZXhpc3Rpbmcgc2lnbmFsIGFscmVhZHkgY2F0Y2hlcyB0aGUgcmVncmVzc2lvbiwgb3Igd2hlbiB5b3UgYXJlIG9ubHkgY29uZmlybWluZyBhbiBleHRlcm5hbCBmYWN0IChhIGxpYnJhcnkncyBiZWhhdmlvciwgd2hldGhlciBhIHZlcnNpb24gZml4ZXMgYW4gaXNzdWUp4oCUdmVyaWZ5IHRob3NlIG9uY2UgbWFudWFsbHkgaW5zdGVhZCBvZiBhZGRpbmcgYSBwZXJtYW5lbnQgdGVzdC5cbi0gV2hlbiB3cml0aW5nIHRlc3RzLCBmb2xsb3cgdGhlc2UgcnVsZXM6XG4gIC0gQ29udGludWUgbW9kaWZ5aW5nIHRlc3RzIGFuZC9vciBjb2RlIHVudGlsIGFsbCB0ZXN0cyBwYXNzLlxuICAtIEVuc3VyZSB0ZXN0cyBhcmUgaWRlbXBvdGVudCBhbmQgaW5kZXBlbmRlbnQgKGUuZy4sIHJlc2V0IHBlcnNpc3RlbnQgZGF0YSkgc28gdGhleSBjYW4gcnVuIHJlcGVhdGVkbHkgb3IgaW4gcGFyYWxsZWwuXG4gIC0gUHJlZmVyIGFjdHVhbCBBUEkgY2FsbHMgb3ZlciBtb2NrcywgdW5sZXNzIGFjdHVhbCBjYWxscyBhcmUgaW1wcmFjdGljYWwsIGhhdmUgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMsIG9yIG1vY2tzIGFyZSBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAgLSBBdm9pZCBmaXhlZCB3YWl0cyBpbiBFMkUgdGVzdHM7IHdhaXQgZm9yIGNvbmRpdGlvbnMgaW5zdGVhZC5cbi0gV2hlbiBmaXhpbmcgaXNzdWVzIChpbmNsdWRpbmcgdGVzdCBmYWlsdXJlcyksIGludmVzdGlnYXRlIHRoZSByb290IGNhdXNlIGZpcnN0IChlLmcuLCB2aWEgZGVidWcgbG9ncyBvciBzY3JlZW5zaG90cykgYW5kIGZpeCBpdCBpbnN0ZWFkIG9mIGFwcGx5aW5nIHdvcmthcm91bmRzLlxuLSBBZnRlciBtYWtpbmcgY2hhbmdlcywgcnVuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHZlcmlmeVxcYCAodHlwZSBjaGVja2luZyBhbmQgbGludGluZzsgdGFrZXMgdXAgdG8gMTAgbWludXRlcyksIG9yIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHZlcmlmeS1mdWxsXFxgIChhbGwgdGVzdHM7IHRha2VzIHVwIHRvIDEgaG91cikgaWYgeW91IGNoYW5nZWQgcnVudGltZSBiZWhhdmlvciBvciB0ZXN0cy4gRml4IGVycm9ycyBhbmQgcmUtcnVuIHVudGlsIGl0IHBhc3Nlcy5cbi0gT25jZSB2ZXJpZmllZCwgY29tbWl0IGFuZCBwdXNoIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoLCBhbmQgY3JlYXRlIGEgUFIgdmlhIFxcYGdoXFxgIGlmIG5vbmUgZXhpc3RzIGZvciB0aGUgYnJhbmNoLlxuICAtIEZvbGxvdyB0aGUgQ29udmVudGlvbmFsIENvbW1pdHMgZm9ybWF0IChlLmcuLCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCkuJHtjb0F1dGhvckluc3RydWN0aW9ufVxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHM7IGF2b2lkIFxcYC0tYW1lbmRcXGAuXG4tIFVzZSBoZXJlZG9jIGZvciBtdWx0aS1saW5lIGNvbW1hbmQgaW5wdXQgKGUuZy4sIFxcYGdpdCBjb21taXQgLUYgLVxcYCwgXFxgZ2ggcHIgY3JlYXRlIC0tYm9keS1maWxlIC1cXGApLlxuLSBQdXQgdGVtcG9yYXJ5IGZpbGVzIGluIFxcYC50bXBcXGA7IHVzZSBcXGAvdG1wXFxgIG9ubHkgZm9yIGZpbGVzIHRoYXQgbXVzdCBsaXZlIG91dHNpZGUgdGhlIHJlcG8uJHtyYWlsd2F5SW5zdHJ1Y3Rpb259JHtwbGF5d3JpZ2h0VGVzdFNlcnZlckluc3RydWN0aW9ufVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IGhhc05ld1NlY3Rpb24gPSBleHRyYUNvbnRlbnQ/LnRyaW0oKS5zdGFydHNXaXRoKCcjJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnRcbiAgICA/IGhhc05ld1NlY3Rpb25cbiAgICAgID8gJ1xcblxcbicgKyBleHRyYUNvbnRlbnQudHJpbSgpXG4gICAgICA6ICdcXG4nICsgZXh0cmFDb250ZW50XG4gICAgOiAnJztcbiAgcmV0dXJuIGJhc2VDb250ZW50ICsgbm9ybWFsaXplZEV4dHJhQ29udGVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmcge1xuICAvLyBLZWVwIHRvcC1kb3duIG9yZGVyaW5nIGd1aWRhbmNlIGZ1bmN0aW9uLW9ubHkgYmVjYXVzZSBjbGFzc2VzIGFyZSBub3QgaG9pc3RlZCBhbmQgY2FuIGZhaWwgd2hlbiBpbmhlcml0YW5jZSBvciB0b3AtbGV2ZWwgaW5zdGFudGlhdGlvbiBkZXBlbmRzIG9uIGRlY2xhcmF0aW9uIG9yZGVyLlxuICByZXR1cm4gYFxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gVXNlIGNhbWVsQ2FzZSBmaWxlIG5hbWVzIGZvciBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgKFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMpLlxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBtb2R1bGVzIGFuZCBkaXJlY3RvcmllcyB3aXRoIGhpZ2ggY29oZXNpb24gYW5kIGxvdyBjb3VwbGluZzsgc3BsaXQgbGFyZ2UgbW9kdWxlcyB3aGVuIG5lZWRlZC5cbi0gUGxhY2UgY2FsbGluZyBmdW5jdGlvbnMgYWJvdmUgdGhlIGZ1bmN0aW9ucyB0aGV5IGNhbGwgKHRvcC1kb3duIG9yZGVyKTsgcGxhY2UgdmFyaWFibGUgYW5kIHR5cGUgZGVjbGFyYXRpb25zIGFib3ZlIHRoZWlyIHVzYWdlLlxuLSBXcml0ZSBjb21tZW50cyBhbmQgSlNEb2Mgb25seSBmb3IgaGFyZC10by11bmRlcnN0YW5kIGNvZGU6IGV4cGxhaW4gXCJ3aHlcIiBpbiBjb21tZW50cyBhbmQgXCJ3aGF0XCIgaW4gSlNEb2MuXG4tIElmIGxpbnQgZXJyb3JzIG9yIHdhcm5pbmdzIGNhbm5vdCBiZSBmaXhlZCwgdXNlIGlnbm9yZSBjb21tZW50cyB3aXRoIHJlYXNvbnMgKGUuZy4sIFxcYC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSA8cnVsZT4gLS0gPHJlYXNvbj5cXGApLlxuLSBQcmVmZXIgXFxgdW5kZWZpbmVkXFxgIG92ZXIgXFxgbnVsbFxcYCB1bmxlc3MgcmVxdWlyZWQgYnkgQVBJcyBvciBsaWJyYXJpZXMuXG4tIEJ1aWxkIHByb21wdHMgYXMgYSBzaW5nbGUgdGVtcGxhdGUgbGl0ZXJhbCBpbnN0ZWFkIG9mIFxcYGpvaW4oKVxcYCBvbiBhIHByZS1jb21wdXRhYmxlIGFycmF5IG9mIHN0cmluZ3MuXG4tIEFzc3VtZSBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBkZWZpbmVkOyBpZiB2YWxpZGF0aW9uIGlzIG5lZWRlZCwgXFxgYXNzZXJ0XFxgIGF0IHN0YXJ0dXAgdG8gZmFpbCBmYXN0LlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBXaGVuIGFkZGluZyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgcmVnaXN0ZXIgdGhlbSBpbiB0aGUgXFxgaTE4blxcYCByZXNvdXJjZSBmaWxlcyAoZS5nLiwgXFxgaTE4bi9qYS1KUC5qc29uXFxgKSBhbmQgcmVmZXJlbmNlIHRoZW0gdmlhIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkgKGUuZy4sIFxcYGkxOG4ucGFnZXMuaG9tZS50aXRsZSgpXFxgIGZvciBcXGB7IFwicGFnZXNcIjogeyBcImhvbWVcIjogeyBcInRpdGxlXCI6IFwiTXkgQXBwXCIgfSB9IH1cXGApLmBcbiAgICA6ICcnXG59XG5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcucmVhY3QgfHwgYy5kZXBlbmRpbmcubmV4dClcbiAgICA/IGAtIFByZWZlciBsYW1iZGEgb3ZlciBcXGBmdW5jdGlvblxcYCBmb3IgUmVhY3QgY29tcG9uZW50cywgZS5nLiwgXFxgY29uc3QgQnV0dG9uOiBSZWFjdC5GQyA9ICgpID0+IHtcXGAuXG4tIFByZWZlciBcXGB1c2VJbW1lclxcYCBvdmVyIFxcYHVzZVN0YXRlXFxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMuXG4tIFVzZSBcXGBhdXRvRm9jdXNcXGAgd2hlcmUgaXQgcmVkdWNlcyB1c2VyIGVmZm9ydC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYFxuLSBUaGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHNvIFxcYHVzZUNhbGxiYWNrXFxgIGFuZCBcXGB1c2VNZW1vXFxgIGFyZSB1bm5lY2Vzc2FyeSBmb3IgcGVyZm9ybWFuY2UuXG4tIEFzc3VtZSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UuXG5gXG4gICAgOiAnJ1xufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdzbW9sLXRvbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBCdW5maWdUb21sIHtcbiAgaW5zdGFsbD86IHtcbiAgICBleGFjdD86IGJvb2xlYW47XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgPSA0MzJfMDAwO1xuXG4vLyBQbGF0Zm9ybSBzZXRzIG11c3QgbWF0Y2ggZWFjaCBwYWNrYWdlJ3Mgb3B0aW9uYWxEZXBlbmRlbmNpZXMgb24gbnBtIGJlY2F1c2Vcbi8vIEJ1biBjaGVja3MgYWxsIHBsYXRmb3JtIGJpbmFyaWVzIGluIHRoZSBsb2NrZmlsZSwgbm90IGp1c3QgdGhlIGN1cnJlbnQgb25lLlxuLy8gS2VlcCB3aW4zMiBlbnRyaWVzIGV2ZW4gdGhvdWdoIHdlIGRyb3AgV2luZG93cyBzdXBwb3J0OiBvbWl0dGluZyBhbnlcbi8vIHBsYXRmb3JtIG1ha2VzIGBidW4gYWRkYCBmYWlsIHVudGlsIHRoZSBtaW5pbXVtLXJlbGVhc2UtYWdlIHdpbmRvdyBlbGFwc2VzLlxuY29uc3QgdHlwZXNjcmlwdFBsYXRmb3JtcyA9IFtcbiAgJ2FpeC1wcGM2NCcsXG4gICdkYXJ3aW4tYXJtNjQnLFxuICAnZGFyd2luLXg2NCcsXG4gICdmcmVlYnNkLWFybTY0JyxcbiAgJ2ZyZWVic2QteDY0JyxcbiAgJ2xpbnV4LWFybScsXG4gICdsaW51eC1hcm02NCcsXG4gICdsaW51eC1sb29uZzY0JyxcbiAgJ2xpbnV4LW1pcHM2NGVsJyxcbiAgJ2xpbnV4LXBwYzY0JyxcbiAgJ2xpbnV4LXJpc2N2NjQnLFxuICAnbGludXgtczM5MHgnLFxuICAnbGludXgteDY0JyxcbiAgJ25ldGJzZC1hcm02NCcsXG4gICduZXRic2QteDY0JyxcbiAgJ29wZW5ic2QtYXJtNjQnLFxuICAnb3BlbmJzZC14NjQnLFxuICAnc3Vub3MteDY0JyxcbiAgJ3dpbjMyLWFybTY0JyxcbiAgJ3dpbjMyLXg2NCcsXG5dO1xuY29uc3Qgb3hjQmluZGluZ1BsYXRmb3JtcyA9IFtcbiAgJ2FuZHJvaWQtYXJtLWVhYmknLFxuICAnYW5kcm9pZC1hcm02NCcsXG4gICdkYXJ3aW4tYXJtNjQnLFxuICAnZGFyd2luLXg2NCcsXG4gICdmcmVlYnNkLXg2NCcsXG4gICdsaW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ2xpbnV4LWFybS1tdXNsZWFiaWhmJyxcbiAgJ2xpbnV4LWFybTY0LWdudScsXG4gICdsaW51eC1hcm02NC1tdXNsJyxcbiAgJ2xpbnV4LXBwYzY0LWdudScsXG4gICdsaW51eC1yaXNjdjY0LWdudScsXG4gICdsaW51eC1yaXNjdjY0LW11c2wnLFxuICAnbGludXgtczM5MHgtZ251JyxcbiAgJ2xpbnV4LXg2NC1nbnUnLFxuICAnbGludXgteDY0LW11c2wnLFxuICAnb3Blbmhhcm1vbnktYXJtNjQnLFxuICAnd2luMzItYXJtNjQtbXN2YycsXG4gICd3aW4zMi1pYTMyLW1zdmMnLFxuICAnd2luMzIteDY0LW1zdmMnLFxuXTtcbmNvbnN0IHRzZ29saW50UGxhdGZvcm1zID0gWydkYXJ3aW4tYXJtNjQnLCAnZGFyd2luLXg2NCcsICdsaW51eC1hcm02NCcsICdsaW51eC14NjQnLCAnd2luMzItYXJtNjQnLCAnd2luMzIteDY0J107XG5jb25zdCBuZXh0UnNwYWNrUGxhdGZvcm1zID0gW1xuICAnYW5kcm9pZC1hcm0tZWFiaScsXG4gICdhbmRyb2lkLWFybTY0JyxcbiAgJ2Rhcndpbi1hcm02NCcsXG4gICdkYXJ3aW4teDY0JyxcbiAgJ2xpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnbGludXgtYXJtNjQtZ251JyxcbiAgJ2xpbnV4LWFybTY0LW11c2wnLFxuICAnbGludXgteDY0LWdudScsXG4gICdsaW51eC14NjQtbXVzbCcsXG4gICd3aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ3dpbjMyLWlhMzItbXN2YycsXG4gICd3aW4zMi14NjQtbXN2YycsXG5dO1xuY29uc3QgbmV4dFN3Y1BsYXRmb3JtcyA9IFtcbiAgJ2FuZHJvaWQtYXJtLWVhYmknLFxuICAnYW5kcm9pZC1hcm02NCcsXG4gICdkYXJ3aW4tYXJtNjQnLFxuICAnZGFyd2luLXg2NCcsXG4gICdmcmVlYnNkLXg2NCcsXG4gICdsaW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ2xpbnV4LWFybTY0LWdudScsXG4gICdsaW51eC1hcm02NC1tdXNsJyxcbiAgJ2xpbnV4LXg2NC1nbnUnLFxuICAnbGludXgteDY0LW11c2wnLFxuICAnd2FzbS1ub2RlanMnLFxuICAnd2FzbS13ZWInLFxuICAnd2luMzItYXJtNjQtbXN2YycsXG4gICd3aW4zMi1pYTMyLW1zdmMnLFxuICAnd2luMzIteDY0LW1zdmMnLFxuXTtcblxuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gIC8vIC0tLS0tLS0tLS0gU1RBUlQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cbiAgJ0BleGVyY29kZS9wcm9ibGVtLXV0aWxzJyxcbiAgJ0B3aWxsYm9vc3Rlci1wcml2YXRlL2FnZW50aWMtd29ya2Zsb3dzJyxcbiAgJ0B3aWxsYm9vc3Rlci9hZ2VudC1za2lsbHMnLFxuICAnQHdpbGxib29zdGVyL2JhYmVsLWNvbmZpZ3MnLFxuICAnQHdpbGxib29zdGVyL21vbmFjby1sb2FkZXInLFxuICAnQHdpbGxib29zdGVyL21vbmFjby1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYicsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZScsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvd2InLFxuICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAnYXQtZGVjb3JhdG9ycycsXG4gICdidWlsZC10cycsXG4gICdnZW4taTE4bi10cycsXG4gICdvbmUtd2F5LWdpdC1zeW5jJyxcbiAgLy8gLS0tLS0tLS0tLSBFTkQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cblxuICAvLyB3YmZ5IHBpbnMgdGhlc2UgdG9vbGluZyBwYWNrYWdlcyBhbmQgbWF5IGFwcGx5IHRoZW0gaW1tZWRpYXRlbHkgYWZ0ZXIgYVxuICAvLyByZWxlYXNlLCBiZWZvcmUgdGhlIGdsb2JhbCBtaW5pbXVtLXJlbGVhc2UtYWdlIHdpbmRvdyBoYXMgZWxhcHNlZC5cbiAgJ3R5cGVzY3JpcHQnLFxuICAuLi50eXBlc2NyaXB0UGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAdHlwZXNjcmlwdC90eXBlc2NyaXB0LSR7cGxhdGZvcm19YCksXG4gIC8vIEJ1biBpdHNlbGYgcmVsZWFzZXMgaXRzIGZpcnN0LXBhcnR5IHR5cGUgcGFja2FnZXMgaW4gbG9ja3N0ZXAgd2l0aCB0aGVcbiAgLy8gcnVudGltZSwgc28gZ2VuZXJhdGVkIEJ1biByZXBvcyBtdXN0IGJlIGFibGUgdG8gaW5zdGFsbCB0aGVtIGltbWVkaWF0ZWx5LlxuICAnQHR5cGVzL2J1bicsXG4gICdidW4tdHlwZXMnLFxuICAnb3hmbXQnLFxuICAuLi5veGNCaW5kaW5nUGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAb3hmbXQvYmluZGluZy0ke3BsYXRmb3JtfWApLFxuICAnb3hsaW50JyxcbiAgLi4ub3hjQmluZGluZ1BsYXRmb3Jtcy5tYXAoKHBsYXRmb3JtKSA9PiBgQG94bGludC9iaW5kaW5nLSR7cGxhdGZvcm19YCksXG4gICdveGxpbnQtdHNnb2xpbnQnLFxuICAuLi50c2dvbGludFBsYXRmb3Jtcy5tYXAoKHBsYXRmb3JtKSA9PiBgQG94bGludC10c2dvbGludC8ke3BsYXRmb3JtfWApLFxuICAnQG5leHQvZW52JyxcbiAgJ0BuZXh0L2ZvbnQnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmcnLFxuICAuLi5uZXh0UnNwYWNrUGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAbmV4dC9yc3BhY2stYmluZGluZy0ke3BsYXRmb3JtfWApLFxuICAuLi5uZXh0U3djUGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAbmV4dC9zd2MtJHtwbGF0Zm9ybX1gKSxcbiAgJ0BuZXh0L3RoaXJkLXBhcnRpZXMnLFxuICAnbmV4dCcsXG4gICdyZWFjdCcsXG4gICdyZWFjdC1kb20nLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdDb250ZW50KGV4aXN0aW5nQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSAoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBidW5maWdUb21sID0gcGFyc2VCdW5maWdUb21sKGV4aXN0aW5nQ29udGVudCk7XG4gIC8vIE5vIGBbcnVuXSBidW4gPSB0cnVlYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3NcbiAgLy8gdG9vbHMgcmVxdWlyaW5nIHJlYWwgTm9kZS5qcyAoUGxheXdyaWdodCwgd3JhbmdsZXIsIHZpbmV4dCk7IGFueSBleGlzdGluZyBzZXR0aW5nIGlzIGRyb3BwZWQuXG4gIHJldHVybiBgZW52ID0gZmFsc2VcbnRlbGVtZXRyeSA9IGZhbHNlXG5cbiR7ZXh0cmFjdFJhd1Rlc3RTZWN0aW9ucyhleGlzdGluZ0NvbnRlbnQpfVtpbnN0YWxsXVxuZXhhY3QgPSAke2J1bmZpZ1RvbWw/Lmluc3RhbGw/LmV4YWN0ID09PSBmYWxzZSA/ICdmYWxzZScgOiAndHJ1ZSd9XG5saW5rZXIgPSBcImhvaXN0ZWRcIlxubWluaW11bVJlbGVhc2VBZ2UgPSAke2J1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kc30gIyA1IGRheXNcbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4ke2J1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMubWFwKChwYWNrYWdlTmFtZSkgPT4gYCAgICBcIiR7cGFja2FnZU5hbWV9XCIsYCkuam9pbignXFxuJyl9XG5dXG5gO1xufTtcblxuLyoqXG4gKiBQcmVzZXJ2ZSB0aGUgcHJvamVjdCdzIGBbdGVzdF1gIHNlY3Rpb25zIChlLmcuIHByZWxvYWQgc2NyaXB0cyBzd2FwcGluZyBhIENsb3VkZmxhcmUgRDEgY2xpZW50XG4gKiBmb3IgYSBsb2NhbCBTUUxpdGUgb25lKSB2ZXJiYXRpbSwgY29tbWVudHMgaW5jbHVkZWQ7IHdiZnkgbWFuYWdlcyBvbmx5IHRoZSBvdGhlciBzZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSYXdUZXN0U2VjdGlvbnMoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKCFjb250ZW50KSByZXR1cm4gJyc7XG5cbiAgY29uc3QgcHJlc2VydmVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBpblRlc3RTZWN0aW9uID0gZmFsc2U7XG4gIGZvciAoY29uc3QgbGluZSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IHNlY3Rpb25NYXRjaCA9IC9eXFxzKlxcWyhbXlxcXV0rKVxcXS8uZXhlYyhsaW5lKTtcbiAgICBpZiAoc2VjdGlvbk1hdGNoKSB7XG4gICAgICBpblRlc3RTZWN0aW9uID0gc2VjdGlvbk1hdGNoWzFdID09PSAndGVzdCcgfHwgKHNlY3Rpb25NYXRjaFsxXSBhcyBzdHJpbmcpLnN0YXJ0c1dpdGgoJ3Rlc3QuJyk7XG4gICAgfVxuICAgIGlmIChpblRlc3RTZWN0aW9uICYmIGxpbmUudHJpbSgpKSB7XG4gICAgICBwcmVzZXJ2ZWRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJlc2VydmVkTGluZXMubGVuZ3RoID4gMCA/IGAke3ByZXNlcnZlZExpbmVzLmpvaW4oJ1xcbicpfVxcblxcbmAgOiAnJztcbn1cblxuZnVuY3Rpb24gcGFyc2VCdW5maWdUb21sKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEJ1bmZpZ1RvbWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlKGNvbnRlbnQpIGFzIEJ1bmZpZ1RvbWw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZSBkZXBsb3lzIEdpdC1iYXNlZCBwcml2YXRlIHBhY2thZ2VzIGZyb20gbm9kZV9tb2R1bGVzLCBidXQgdGhlIERvY2tlciBjb250ZXh0IHNob3VsZCBzdGF5IG5hcnJvdy5cbmNvbnN0IGluY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJucyA9IFsnQHdpbGxib29zdGVyJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4qKi8uRFNfU3RvcmVcbioqLy5jYWNoZVxuKiovLmNsYXVkZVxuKiovLmN1cnNvclxuKiovLmVkaXRvcmNvbmZpZ1xuKiovLmVzbGludGNhY2hlXG4qKi8uZ2VtaW5pXG4qKi8uZ2l0XG4qKi8uZ2l0YXR0cmlidXRlc1xuKiovLmdpdGh1YlxuKiovLmdpdGlnbm9yZVxuKiovLmlkZWFcbioqLy5sZWZ0aG9va1xuKiovLm15cHlfY2FjaGVcbioqLy5uZXh0L2NhY2hlXG4qKi8ubnBtXG4qKi8ucGFyY2VsLWNhY2hlXG4qKi8ucG5wbS1zdG9yZVxuKiovLnB5dGVzdF9jYWNoZVxuKiovLnJhaWx3YXlpZ25vcmVcbioqLy5yZWxlYXNlcmMuanNvblxuKiovLnJ1ZmZfY2FjaGVcbioqLy50bXBcbioqLy50dXJib1xuKiovLnRveFxuKiovLnZzY29kZVxuKiovLnlhcm4vY2FjaGVcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG4qKi9fX3B5Y2FjaGVfX1xuKiovKi5sb2dcbioqLyoucHljXG4qKi8qLnRzYnVpbGRpbmZvXG4qKi9jb3ZlcmFnZVxuKiovbm9kZV9tb2R1bGVzLyoqXG4ke2luY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJuc1xuICAubWFwKFxuICAgIChwYXR0ZXJuKSA9PiBgISoqL25vZGVfbW9kdWxlcy8ke3BhdHRlcm59XG4hKiovbm9kZV9tb2R1bGVzLyR7cGF0dGVybn0vKipgXG4gIClcbiAgLmpvaW4oJ1xcbicpfVxuKiovbm9kZV9tb2R1bGVzLy5jYWNoZVxuKiovcGxheXdyaWdodC1yZXBvcnRcbioqL3N0b3J5Ym9vay1zdGF0aWNcbioqL3RhcmdldFxuKiovdGVzdC1yZXN1bHRzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IHtcbiAgY29kZVdpdGgySW5kZW50U2l6ZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjcHAnLFxuICAgICdkYXJ0JyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3B1JyxcbiAgICAncHVtbCcsXG4gICAgJ3JiJyxcbiAgICAndnVlJyxcbiAgICAneG1sJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ3NoJyxcbiAgXS50b1NvcnRlZCgpLFxuICBjb2RlV2l0aDRJbmRlbnRTaXplOiBbJ2dvJywgJ2dyYWRsZScsICdqYXZhJywgJ3B5J10udG9Tb3J0ZWQoKSxcbiAgbWFya2Rvd25MaWtlOiBbJ21kJ10udG9Tb3J0ZWQoKSxcbiAgb3hsaW50OiBbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXS50b1NvcnRlZCgpLFxuICBveGZtdDogW1xuICAgICdhc3RybycsXG4gICAgJ2NqcycsXG4gICAgJ2NzcycsXG4gICAgJ2N0cycsXG4gICAgJ2dxbCcsXG4gICAgJ2dyYXBocWwnLFxuICAgICdoYnMnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnanMnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2pzeCcsXG4gICAgJ2xlc3MnLFxuICAgICdtZCcsXG4gICAgJ21keCcsXG4gICAgJ21qcycsXG4gICAgJ210cycsXG4gICAgJ3Njc3MnLFxuICAgICdzdmVsdGUnLFxuICAgICd0b21sJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICd2dWUnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS50b1NvcnRlZCgpLFxuICBwcmV0dGllck9ubHk6IFsnamF2YSddLnRvU29ydGVkKCksXG59O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYHJvb3QgPSB0cnVlXG5cblsqXVxuY2hhcnNldCA9IHV0Zi04XG5lbmRfb2ZfbGluZSA9IGxmXG5pbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWVcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWVcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gMlxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gNFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2UpfVxubWF4X2xpbmVfbGVuZ3RoID0gb2ZmXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSBmYWxzZVxuXG5be01ha2VmaWxlLCoubWt9XVxuaW5kZW50X3N0eWxlID0gdGFiXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZGl0b3Jjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFZGl0b3Jjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZWRpdG9yY29uZmlnJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgWyoueyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fV1gIDogYFsqLiR7ZXh0ZW5zaW9uc1swXX1dYDtcbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSB9IGZyb20gJy4vYWdlbnRzLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcblxuICAgIGxldCBuZXdDb25maWc6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShkZWZhdWx0Q29uZmlnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGNvbmZpZ0ZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld0NvbmZpZyA9IG1lcmdlLmFsbChbbmV3Q29uZmlnLCBvbGRDb25maWcsIG5ld0NvbmZpZ10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nIC0gZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIHBhcnNlZFxuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0geWFtbC5kdW1wKG5ld0NvbmZpZywge1xuICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG4gICAgY29uc3QgY29kaW5nUnVsZUV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudD8udHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpID8gdW5kZWZpbmVkIDogZXh0cmFDb250ZW50O1xuICAgIGNvbnN0IHJldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb24gPSBjb25maWcuaXNQdWJsaWNSZXBvXG4gICAgICA/ICdSZXZpZXcgaW4gRW5nbGlzaCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNvZGluZyBzdGFuZGFyZHMuJ1xuICAgICAgOiAn5Lul5LiL44Gu44Kz44O844OH44Kj44Oz44Kw6KaP57SE44KS6LiP44G+44GI44Gm44CB5pel5pys6Kqe44Gn44Os44OT44Ol44O844GX44Gm44GP44Gg44GV44GE44CCJztcbiAgICBjb25zdCBzdHlsZWd1aWRlQ29udGVudCA9IGAke3Jldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb259XFxuXFxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9JHtcbiAgICAgIGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPyBgXFxuJHtjb2RpbmdSdWxlRXh0cmFDb250ZW50LnRyaW1FbmQoKX1gIDogJydcbiAgICB9YDtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSksXG4gICAgXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VtaW5pU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIGNvbnN0IGtleSA9IG93bmVyID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gICAgZ2V0R2l0SHViQ2xpVG9rZW4oKVxuICApO1xufVxuXG5sZXQgZ2l0SHViQ2xpVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0R2l0SHViQ2xpVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGdpdEh1YkNsaVRva2VuICE9PSB1bmRlZmluZWQpIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTb21lIGxvY2FsIHJ1bnMgcmVseSBvbiBHaXRIdWIgQ0xJIGF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZXhwb3J0ZWQgZW52IHRva2Vucy5cbiAgICBnaXRIdWJDbGlUb2tlbiA9XG4gICAgICBjaGlsZFByb2Nlc3NcbiAgICAgICAgLmV4ZWNGaWxlU3luYygnZ2gnLCBbJ2F1dGgnLCAndG9rZW4nXSwge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICAgIH0pXG4gICAgICAgIC50cmltKCkgfHwgJyc7XG4gIH0gY2F0Y2gge1xuICAgIGdpdEh1YkNsaVRva2VuID0gJyc7XG4gIH1cbiAgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFyc2VFcnJvciB9IGZyb20gJ2pzb25jLXBhcnNlcic7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZUpzb25jIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IHNpbXBsZUdpdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VUb21sIH0gZnJvbSAnc21vbC10b21sJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgc2VsZWN0UHJvamVjdFdyYW5nbGVyVHlwZXNHZW5lcmF0b3IgfSBmcm9tICcuL3V0aWxzL3dyYW5nbGVyVHlwZXNDb21tYW5kLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIHJlcG9BdXRob3I/OiBzdHJpbmc7XG4gIHJlcG9OYW1lPzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNDbG91ZGZsYXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnOiBib29sZWFuO1xuICBpc1JhaWx3YXk6IGJvb2xlYW47XG4gIGlzQnVuOiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICAvLyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uXG4gIC8qKiBEaXJlY3RvcmllcyBjb250YWluaW5nIENhcmdvLnRvbWwgKHJlbGF0aXZlIHRvIGRpclBhdGgsIHJvb3QtbW9zdCBmaXJzdCkuIEVtcHR5IGlmIHRoZSByZXBvIGhhcyBubyBSdXN0IGNvZGUuICovXG4gIGNhcmdvVG9tbERpclBhdGhzOiBzdHJpbmdbXTtcbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVXZMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZzogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZ0luUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcbiAgLy8gc291cmNlIGNvZGUgZmlsZXNcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YUluUGFja2FnZXM6IGJvb2xlYW47XG5cbiAgZGVwZW5kaW5nOiB7XG4gICAgYmxpdHo6IGJvb2xlYW47XG4gICAgZmlyZWJhc2U6IGJvb2xlYW47XG4gICAgZ2VuSTE4blRzOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0UnVudGltZTogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHRhdXJpOiBib29sZWFuO1xuICAgIHZpbmV4dDogYm9vbGVhbjtcbiAgICB2aXRlOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICAgIGNoYWtyYTogYm9vbGVhbjtcbiAgICBkcml6emxlOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGhhc1ZlcnNpb25TZXR0aW5nczogYm9vbGVhbjtcbiAgbWlzZVRhc2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc/OiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpblBhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgICAgICAgICBwbHVnaW5zPzogc3RyaW5nW11bXTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgPz8gW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSA/PyBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzVmVyc2lvblNldHRpbmdzID0gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXSkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSkpIHtcbiAgICAgICAgaGFzVmVyc2lvblNldHRpbmdzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvRnVsbE5hbWUgPyBgZ2l0aHViOiR7cmVwb0Z1bGxOYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgLy8gVGF1cmkgb2ZmaWNpYWxseSBzdXBwb3J0cyBKU09OLCBKU09ONSwgYW5kIFRPTUwgY29uZmlndXJhdGlvbiBmb3JtYXRzLlxuICAgIGNvbnN0IGRvZXNDb250YWluVGF1cmlDb25maWcgPSBbJ3RhdXJpLmNvbmYuanNvbicsICd0YXVyaS5jb25mLmpzb241JywgJ1RhdXJpLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdzcmMtdGF1cmknLCBmaWxlTmFtZSkpXG4gICAgKTtcbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiAhIXBhY2thZ2VKc29uLmZpbGVzLFxuICAgICAgcmVwb3NpdG9yeSxcbiAgICAgIHJlcG9BdXRob3IsXG4gICAgICByZXBvTmFtZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJSZXBvOiBCb29sZWFuKFxuICAgICAgICByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHwgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpXG4gICAgICApLFxuICAgICAgaXNDbG91ZGZsYXJlOiBkZXRlY3RDbG91ZGZsYXJlKGRpclBhdGgsIHBhY2thZ2VKc29uKSxcbiAgICAgIGRvZXNDb250YWluV3JhbmdsZXJDb25maWc6IGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGgpLFxuICAgICAgaXNSYWlsd2F5OiBkZXRlY3RSYWlsd2F5KGRpclBhdGgsIHBhY2thZ2VKc29uKSxcbiAgICAgIGlzQnVuOlxuICAgICAgICByb290Q29uZmlnPy5pc0J1biB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2tiJykpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdidW4ubG9jaycpKSB8fFxuICAgICAgICAvLyBTb21lIHJlcG9zIGdpdGlnbm9yZSBidW4ubG9jaywgc28gaXQgbWF5IGJlIG1pc3Npbmcgb24gZnJlc2ggY2xvbmVzLlxuICAgICAgICAvLyBidW5maWcudG9tbCBpcyBjb21taXR0ZWQgYW5kIGdlbmVyYXRlZCBvbmx5IGZvciBCdW4gcHJvamVjdHMsIG1ha2luZyBpdCBhIHJlbGlhYmxlIHNpZ25hbC5cbiAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bmZpZy50b21sJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcygnL3dpbGxib29zdGVyLWNvbmZpZ3MnKSxcbiAgICAgIGNhcmdvVG9tbERpclBhdGhzOiBmaW5kQ2FyZ29Ub21sRGlyUGF0aHMoZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbkdvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5VdkxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd1di5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWcsXG4gICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlczogY29udGFpbnNBbnkoXG4gICAgICAgICdwYWNrYWdlcy8qKi9zcmMtdGF1cmkve3RhdXJpLmNvbmYuanNvbix0YXVyaS5jb25mLmpzb241LFRhdXJpLnRvbWx9JyxcbiAgICAgICAgZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmE6IGNvbnRhaW5zQW55KCcqKi8qLmphdmEnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqLyouamF2YScsIGRpclBhdGgpLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgY2hha3JhOiAhIWRldkRlcGVuZGVuY2llc1snQGNoYWtyYS11aS9jbGknXSxcbiAgICAgICAgZHJpenpsZTogISFkZXBlbmRlbmNpZXNbJ2RyaXp6bGUtb3JtJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ2RyaXp6bGUta2l0J10sXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHBsYXl3cmlnaHRSdW50aW1lOiBkb2VzSW1wb3J0UGxheXdyaWdodEF0UnVudGltZShkaXJQYXRoKSxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB0YXVyaTpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnLFxuICAgICAgICB2aW5leHQ6ICEhZGVwZW5kZW5jaWVzLnZpbmV4dCB8fCAhIWRldkRlcGVuZGVuY2llcy52aW5leHQsXG4gICAgICAgIHZpdGU6ICEhZGVwZW5kZW5jaWVzLnZpdGUgfHwgISFkZXZEZXBlbmRlbmNpZXMudml0ZSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgaGFzVmVyc2lvblNldHRpbmdzLFxuICAgICAgbWlzZVRhc2tzOiBhd2FpdCByZWFkTWlzZVRhc2tzKGRpclBhdGgpLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVXZMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHJldHVybiAoXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJ21pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcubWlzZS50b21sJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy50b29sLXZlcnNpb25zJykpXG4gICk7XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB3YmZ5IG1hbmFnZXMgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBmb3IgdGhlIHBhY2thZ2UuIFRoZSBmaWxlIGlzIGdpdGlnbm9yZWQgYW5kIHVudHJhY2tlZCBvbiB0aGVcbiAqIGFzc3VtcHRpb24gdGhhdCBgd3JhbmdsZXIgdHlwZXNgIHJlZ2VuZXJhdGVzIGl0IG9uIGluc3RhbGwsIHNvIGFsbCB0aHJlZSBzdGVwcyBtdXN0IGFncmVlOiB0aGUgcGFja2FnZSBoYXMgdG8gb3duIGFcbiAqIHdyYW5nbGVyIGNvbmZpZyAoYHdyYW5nbGVyIHR5cGVzYCBleGl0cyBub24temVybyB3aXRob3V0IG9uZSksIHRvIGRlcGVuZCBvbiB3cmFuZ2xlciAoYSBwYWNrYWdlIGRlcGxveWluZyB2aWEgYVxuICogQ0kgYWN0aW9uIGNhbm5vdCByZXNvbHZlIHRoZSBjb21tYW5kKSwgYW5kIHRvIHJlZ2VuZXJhdGUgdGhlIHNhbWUgZmlsZSBvbiBldmVyeSBjaGVja291dC4gT3RoZXJ3aXNlIHdiZnkgd291bGRcbiAqIGlnbm9yZSBhbmQgZGVsZXRlIGEgZmlsZSB0aGF0IG5vdGhpbmcgcmVjcmVhdGVzIGlkZW50aWNhbGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnICYmXG4gICAgQm9vbGVhbihwYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5bJ3dyYW5nbGVyJ10gfHwgcGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uWyd3cmFuZ2xlciddKSAmJlxuICAgIC8vIEEgcHJvamVjdCBpbnZvY2F0aW9uIHRoYXQgd3JpdGVzIHRoZSBtYW5hZ2VkIGRlZmF1bHQgZmlsZSBmcm9tIGlucHV0cyB3YmZ5IGNhbm5vdCB2YWxpZGF0ZSAoZS5nLlxuICAgIC8vIGB3cmFuZ2xlciB0eXBlcyAtYyB3cmFuZ2xlci5qc29uYyAtYyAuLi9ib3VuZC13b3JrZXIvd3JhbmdsZXIuanNvbmNgIGZvciBSUEMgdHlwZXMpIHdvdWxkIGZpZ2h0IGEgbWFuYWdlZFxuICAgIC8vIGZhbGxiYWNrIGdlbmVyYXRvciBvdmVyIHRoZSBzYW1lIGZpbGUsIGFuZCBzZXZlcmFsIGRpc3RpbmN0IGZsYWdnZWQgZ2VuZXJhdG9ycyBsZWF2ZSBubyBkZXRlcm1pbmlzdGljXG4gICAgLy8gY2hvaWNlLCBzbyBzdWNoIHBhY2thZ2VzIHN0YXkgdW5tYW5hZ2VkLlxuICAgICFzZWxlY3RQcm9qZWN0V3JhbmdsZXJUeXBlc0dlbmVyYXRvcihwYWNrYWdlSnNvbj8uc2NyaXB0cyA/PyB7fSkuY29uZmxpY3RpbmcgJiZcbiAgICBoYXNSZXByb2R1Y2libGVXb3JrZXJUeXBlc0luZmVyZW5jZShjb25maWcpXG4gICk7XG59XG5cbi8qKlxuICogYHdyYW5nbGVyIHR5cGVzYCBpbmZlcnMgYEVudmAgbWVtYmVycyBmcm9tIHRoZSAuZGV2LnZhcnMvLmVudiBmaWxlcyBiZXNpZGUgdGhlIHdyYW5nbGVyIGNvbmZpZyDigJQgaW5jbHVkaW5nIHRoZVxuICogbGF5ZXJlZCB2YXJpYW50cyB3cmFuZ2xlciByZXNvbHZlcywgc3VjaCBhcyAuZW52LmxvY2FsIGFuZCBlbnZpcm9ubWVudC1zcGVjaWZpYyBmaWxlcyDigJQgdW5sZXNzIHRoZSBjb25maWdcbiAqIGRlY2xhcmVzIGBzZWNyZXRzLnJlcXVpcmVkYC4gVW50cmFja2luZyB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGlzIHNhZmUgb25seSB3aGVuIGV2ZXJ5IHN1Y2ggaW5wdXQgaXNcbiAqIGlkZW50aWNhbCBvbiBldmVyeSBjaGVja291dDogd2l0aCBhIGdpdGlnbm9yZWQgb3IgbG9jYWxseSBtb2RpZmllZCBmaWxlLCBDSSB3b3VsZCByZWdlbmVyYXRlIGFuIGBFbnZgIHdpdGhvdXRcbiAqIHRoZSBzZWNyZXQgbWVtYmVycyB0aGF0IHR5cGUtY2hlY2sgbG9jYWxseS5cbiAqL1xuZnVuY3Rpb24gaGFzUmVwcm9kdWNpYmxlV29ya2VyVHlwZXNJbmZlcmVuY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRpclBhdGggPSBjb25maWcuZGlyUGF0aDtcbiAgaWYgKGRlY2xhcmVzU3VwcG9ydGVkUmVxdWlyZWRTZWNyZXRzKGNvbmZpZykpIHJldHVybiB0cnVlO1xuICAvLyBUaGUgd3JhbmdsZXIgY29uZmlnIGl0c2VsZiBkcml2ZXMgdGhlIGdlbmVyYXRpb24sIHNvIGFuIHVudHJhY2tlZCwgbW9kaWZpZWQsIG9yIHN5bWxpbmtlZCBjb25maWcgbWFrZXMgdGhlXG4gIC8vIGdlbmVyYXRlZCBmaWxlIGlycmVwcm9kdWNpYmxlIHdoYXRldmVyIHRoZSBkb3RlbnYgaW5wdXRzIHNheS5cbiAgY29uc3QgY29uZmlnRmlsZU5hbWVzID0gWyd3cmFuZ2xlci5qc29uYycsICd3cmFuZ2xlci5qc29uJywgJ3dyYW5nbGVyLnRvbWwnXS5maWx0ZXIoKGZpbGVOYW1lKSA9PlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKSlcbiAgKTtcbiAgaWYgKCFhcmVUcmFja2VkQ2xlYW5SZWd1bGFyRmlsZXMoZGlyUGF0aCwgY29uZmlnRmlsZU5hbWVzKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBpbmZlcmVuY2VTb3VyY2VOYW1lcyA9IGZzXG4gICAgLnJlYWRkaXJTeW5jKGRpclBhdGgpXG4gICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IC9eXFwuKD86ZGV2XFwudmFyc3xlbnYpKD86XFwuLispPyQvdS50ZXN0KGZpbGVOYW1lKSk7XG4gIHJldHVybiBhcmVUcmFja2VkQ2xlYW5SZWd1bGFyRmlsZXMoZGlyUGF0aCwgaW5mZXJlbmNlU291cmNlTmFtZXMpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZXZlcnkgbGlzdGVkIGZpbGUgaXMgYSByZWd1bGFyIGZpbGUgKGEgdHJhY2tlZCBzeW1saW5rJ3MgZ2l0IHN0YXRlIHNheXMgbm90aGluZyBhYm91dCBpdHMgdGFyZ2V0J3NcbiAqIGNvbnRlbnQpLCB0cmFja2VkLCBBTkQgdW5tb2RpZmllZDogYGdpdCBscy1maWxlc2AgcHJpbnRzIG5vdGhpbmcgZm9yIGFuIHVudHJhY2tlZCBmaWxlIChhbmQgZmFpbHMgcHJpbnRpbmdcbiAqIG5vdGhpbmcgb3V0c2lkZSBhIHJlcG9zaXRvcnkpLCB3aGlsZSBgZ2l0IHN0YXR1cyAtLXBvcmNlbGFpbmAgcHJpbnRzIG5vdGhpbmcgZm9yIGEgY2xlYW4gZmlsZSDigJQgd3JhbmdsZXIgcmVhZHNcbiAqIHRoZSB3b3JraW5nIHRyZWUsIGJ1dCBDSSByZWFkcyB0aGUgY29tbWl0dGVkIGNvbnRlbnRzLCBzbyBsb2NhbCBlZGl0cyBicmVhayByZXByb2R1Y2liaWxpdHkgdG9vLiAoQW4gaWdub3JlZFxuICogZmlsZSBhbHNvIHByb2R1Y2VzIGVtcHR5IHN0YXR1cyBvdXRwdXQsIHdoaWNoIHRoZSB0cmFja2VkIGNoZWNrIGNhdGNoZXMuKVxuICovXG5mdW5jdGlvbiBhcmVUcmFja2VkQ2xlYW5SZWd1bGFyRmlsZXMoZGlyUGF0aDogc3RyaW5nLCBmaWxlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGlmIChmaWxlTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGZpbGVOYW1lcy5zb21lKChmaWxlTmFtZSkgPT4gZnMubHN0YXRTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSkpLmlzU3ltYm9saWNMaW5rKCkpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHRyYWNrZWRPdXRwdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtZmlsZXMnLCAnLS0nLCAuLi5maWxlTmFtZXNdLCBkaXJQYXRoKTtcbiAgY29uc3QgdHJhY2tlZENvdW50ID0gdHJhY2tlZE91dHB1dCA9PT0gJycgPyAwIDogdHJhY2tlZE91dHB1dC5zcGxpdCgnXFxuJykubGVuZ3RoO1xuICByZXR1cm4gKFxuICAgIHRyYWNrZWRDb3VudCA9PT0gZmlsZU5hbWVzLmxlbmd0aCAmJlxuICAgIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydzdGF0dXMnLCAnLS1wb3JjZWxhaW4nLCAnLS0nLCAuLi5maWxlTmFtZXNdLCBkaXJQYXRoKSA9PT0gJydcbiAgKTtcbn1cblxuLy8gYHdyYW5nbGVyIHR5cGVzYCBnZW5lcmF0ZXMgZnJvbSBgc2VjcmV0cy5yZXF1aXJlZGAgb25seSBzaW5jZSB3cmFuZ2xlciA0Ljc3LjAgKGFubm91bmNlZCAyMDI2LTAzLTI0LCB0aGUgNC43Ny4wXG4vLyByZWxlYXNlIGRhdGUpOyBvbGRlciB3cmFuZ2xlcnMgd2FybiBhYm91dCB0aGUgdW5leHBlY3RlZCBmaWVsZCBhbmQga2VlcCBpbmZlcnJpbmcgZnJvbSAuZGV2LnZhcnMuXG5jb25zdCBtaW5pbXVtV3JhbmdsZXJWZXJzaW9uRm9yUmVxdWlyZWRTZWNyZXRzID0gJzQuNzcuMCc7XG5cbmZ1bmN0aW9uIGRlY2xhcmVzU3VwcG9ydGVkUmVxdWlyZWRTZWNyZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBjb25zdCB3cmFuZ2xlclZlcnNpb25SYW5nZSA9XG4gICAgY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/Llsnd3JhbmdsZXInXSA/PyBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uWyd3cmFuZ2xlciddO1xuICBpZiAoIXdyYW5nbGVyVmVyc2lvblJhbmdlKSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgbWluaW11bVZlcnNpb24gPSBzZW12ZXIubWluVmVyc2lvbih3cmFuZ2xlclZlcnNpb25SYW5nZSk7XG4gICAgaWYgKCFtaW5pbXVtVmVyc2lvbiB8fCBzZW12ZXIubHQobWluaW11bVZlcnNpb24sIG1pbmltdW1XcmFuZ2xlclZlcnNpb25Gb3JSZXF1aXJlZFNlY3JldHMpKSByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gd3JhbmdsZXJDb25maWdEZWNsYXJlc1JlcXVpcmVkU2VjcmV0cyhjb25maWcuZGlyUGF0aCk7XG59XG5cbmludGVyZmFjZSBXcmFuZ2xlckNvbmZpZ1NlY3JldHNTdWJ0cmVlIHtcbiAgc2VjcmV0cz86IHsgcmVxdWlyZWQ/OiBzdHJpbmdbXSB9O1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCB7IHNlY3JldHM/OiB7IHJlcXVpcmVkPzogc3RyaW5nW10gfSB9IHwgdW5kZWZpbmVkPjtcbn1cblxuZnVuY3Rpb24gd3JhbmdsZXJDb25maWdEZWNsYXJlc1JlcXVpcmVkU2VjcmV0cyhkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbiddKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSBjb250aW51ZTtcbiAgICAgIC8vIGpzb25jLXBhcnNlciBpcyBmYXVsdCB0b2xlcmFudCBhbmQgd291bGQgcmV0dXJuIGEgcGFydGlhbCBvYmplY3QgZm9yIG1hbGZvcm1lZCBpbnB1dCxcbiAgICAgIC8vIHdoaWNoIGNhbm5vdCBwcm92ZSBhIGRlY2xhcmF0aW9uOyByZWplY3QgYW55IHBhcnNlIGVycm9yLlxuICAgICAgY29uc3QgcGFyc2VFcnJvcnM6IFBhcnNlRXJyb3JbXSA9IFtdO1xuICAgICAgY29uc3QgY29uZmlnID0gcGFyc2VKc29uYyhmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JyksIHBhcnNlRXJyb3JzLCB7IGFsbG93VHJhaWxpbmdDb21tYTogdHJ1ZSB9KSBhc1xuICAgICAgICB8IFdyYW5nbGVyQ29uZmlnU2VjcmV0c1N1YnRyZWVcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gcGFyc2VFcnJvcnMubGVuZ3RoID09PSAwICYmICEhY29uZmlnICYmIGRlY2xhcmVzUmVxdWlyZWRTZWNyZXRzQW55d2hlcmUoY29uZmlnKTtcbiAgICB9XG4gICAgY29uc3QgdG9tbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dyYW5nbGVyLnRvbWwnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh0b21sUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHBhcnNlVG9tbChmcy5yZWFkRmlsZVN5bmModG9tbFBhdGgsICd1dGY4JykpIGFzIFdyYW5nbGVyQ29uZmlnU2VjcmV0c1N1YnRyZWU7XG4gICAgICByZXR1cm4gZGVjbGFyZXNSZXF1aXJlZFNlY3JldHNBbnl3aGVyZShjb25maWcpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gQSBjb25maWcgdGhhdCBkb2VzIG5vdCBwYXJzZSBjYW5ub3QgcHJvdmUgYSBkZWNsYXJhdGlvbi5cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIEEgZGVjbGFyYXRpb24gYXQgYW55IGNvbmZpZyBsZXZlbCByZXBsYWNlcyB0aGUgLmRldi52YXJzLy5lbnYgaW5mZXJlbmNlOiBgd3JhbmdsZXIgdHlwZXNgIGFnZ3JlZ2F0ZXNcbi8vIHBlci1lbnZpcm9ubWVudCBzZWNyZXRzIGludG8gdGhlIGdlbmVyYXRlZCB0eXBlIChDbG91ZGZsYXJlIGNoYW5nZWxvZyAyMDI2LTAzLTI0KS5cbmZ1bmN0aW9uIGRlY2xhcmVzUmVxdWlyZWRTZWNyZXRzQW55d2hlcmUoY29uZmlnOiBXcmFuZ2xlckNvbmZpZ1NlY3JldHNTdWJ0cmVlKTogYm9vbGVhbiB7XG4gIGlmICgoY29uZmlnLnNlY3JldHM/LnJlcXVpcmVkPy5sZW5ndGggPz8gMCkgPiAwKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoY29uZmlnLmVudiA/PyB7fSkuc29tZSgoZW52Q29uZmlnKSA9PiAoZW52Q29uZmlnPy5zZWNyZXRzPy5yZXF1aXJlZD8ubGVuZ3RoID8/IDApID4gMCk7XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB0aGUgZGlyZWN0b3J5IG93bnMgYSBXb3JrZXIsIHVubGlrZSB0aGUgaXNDbG91ZGZsYXJlIGhldXJpc3RpYywgd2hpY2ggYWxzbyBtYXRjaGVzIGEgcGFja2FnZSB0aGF0XG4gKiBtZXJlbHkgbWVudGlvbnMgd3JhbmdsZXIgaW4gYSBzY3JpcHQgb3Igd29ya2Zsb3cgKGUuZy4gdGhlIHJvb3Qgb2YgYSBtb25vcmVwbyB3aG9zZSBXb3JrZXIgbGl2ZXMgaW4gYSBzdWItcGFja2FnZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RXcmFuZ2xlckNvbmZpZyhkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbicsICd3cmFuZ2xlci50b21sJ10uc29tZSgoZmlsZU5hbWUpID0+XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZU5hbWUpKVxuICApO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RDbG91ZGZsYXJlKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCd3cmFuZ2xlcicpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGgpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gd29ya2Zsb3dGaWxlc01hdGNoKGRpclBhdGgsIC9jbG91ZGZsYXJlfHdyYW5nbGVyL2l1KTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0UmFpbHdheShkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cztcbiAgaWYgKHNjcmlwdHMgJiYgT2JqZWN0LnZhbHVlcyhzY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIHNjcmlwdC5pbmNsdWRlcygncmFpbHdheScpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmFpbHdheWlnbm9yZScpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncmFpbHdheS5qc29uJykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gd29ya2Zsb3dGaWxlc01hdGNoKGRpclBhdGgsIC9yYWlsd2F5L2l1KTtcbn1cblxuZnVuY3Rpb24gd29ya2Zsb3dGaWxlc01hdGNoKGRpclBhdGg6IHN0cmluZywgcmVnZXg6IFJlZ0V4cCk6IGJvb2xlYW4ge1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICB0cnkge1xuICAgIHJldHVybiBmc1xuICAgICAgLnJlYWRkaXJTeW5jKHdvcmtmbG93c1BhdGgpXG4gICAgICAuc29tZSgoZmlsZU5hbWUpID0+IC9cXC55YT9tbCQvaXUudGVzdChmaWxlTmFtZSkgJiYgd29ya2Zsb3dGaWxlTWF0Y2hlcyh3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSwgcmVnZXgpKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdvcmtmbG93RmlsZU1hdGNoZXMod29ya2Zsb3dzUGF0aDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nLCByZWdleDogUmVnRXhwKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4JykpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1pc2VUYXNrcyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgdGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBbJ21pc2UudG9tbCcsICcubWlzZS50b21sJ10pIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNldHRpbmdzID0gcGFyc2VUb21sKGF3YWl0IGZzcC5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgeyB0YXNrcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MudGFza3MgPz8ge30pKSB7XG4gICAgICAgIHRhc2tzW25hbWVdID0gcmVhZE1pc2VUYXNrQ29tbWFuZCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG9yIHRlbXBvcmFyaWx5IGludmFsaWQgbWlzZSBmaWxlcyBzaG91bGQgbm90IGJsb2NrIG90aGVyIHdiZnkgZ2VuZXJhdG9ycy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhc2tzO1xufVxuXG5mdW5jdGlvbiByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgLy8gUHJlc2VydmUgYXJyYXktZm9ybSBtaXNlIGNvbW1hbmRzIHNvIHJlY3Vyc2lvbiBjaGVja3MgY2FuIHN0aWxsIHNlZSBwYWNrYWdlIHNjcmlwdCBjYWxscy5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuZmlsdGVyKChjb21tYW5kKTogY29tbWFuZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGNvbW1hbmQgPT09ICdzdHJpbmcnKS5qb2luKCdcXG4nKTtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHJldHVybiByZWFkTWlzZVRhc2tDb21tYW5kKCh2YWx1ZSBhcyB7IHJ1bj86IHVua25vd24gfSkucnVuKTtcbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmZ1bmN0aW9uIGZpbmRDYXJnb1RvbWxEaXJQYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBmZ1xuICAgIC5nbG9iU3luYygnKiovQ2FyZ28udG9tbCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KVxuICAgIC5tYXAoKGZpbGVQYXRoKSA9PiBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKVxuICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5zcGxpdCgnLycpLmxlbmd0aCAtIGIuc3BsaXQoJy8nKS5sZW5ndGggfHwgYS5sb2NhbGVDb21wYXJlKGIpKTtcbn1cblxuZnVuY3Rpb24gZG9lc0ltcG9ydFBsYXl3cmlnaHRBdFJ1bnRpbWUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGZpbGVzID0gZmcuZ2xvYlN5bmMoJ3thcHAsc3JjfS8qKi8qLntjanMsY3RzLGpzLGpzeCxtanMsbXRzLHRzLHRzeH0nLCB7XG4gICAgZG90OiB0cnVlLFxuICAgIGN3ZDogZGlyUGF0aCxcbiAgICBpZ25vcmU6IFsuLi5nbG9iSWdub3JlLCAnKiovX190ZXN0c19fLyoqJywgJyoqLyouc3BlYy4qJywgJyoqLyoudGVzdC4qJywgJyoqL3BsYXl3cmlnaHQuY29uZmlnLionXSxcbiAgfSk7XG4gIHJldHVybiBmaWxlcy5zb21lKChmaWxlKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZSksICd1dGY4Jyk7XG4gICAgcmV0dXJuIC9cXGJmcm9tXFxzK1snXCJdcGxheXdyaWdodFsnXCJdfFxcYmltcG9ydFxccypcXChcXHMqWydcIl1wbGF5d3JpZ2h0WydcIl1cXHMqXFwpfFxcYnJlcXVpcmVcXHMqXFwoXFxzKlsnXCJdcGxheXdyaWdodFsnXCJdXFxzKlxcKS91LnRlc3QoXG4gICAgICBjb250ZW50XG4gICAgKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGdpdCA9IHNpbXBsZUdpdChkaXJQYXRoKTtcbiAgY29uc3QgcmVtb3RlcyA9IGF3YWl0IGdpdC5nZXRSZW1vdGVzKHRydWUpO1xuICBjb25zdCBvcmlnaW4gPSByZW1vdGVzLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gJ29yaWdpbicpO1xuICBjb25zdCByZW1vdGVVcmwgPSBvcmlnaW4/LnJlZnMuZmV0Y2ggPz8gb3JpZ2luPy5yZWZzLnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgLy8gTWV0YWRhdGEgcGVybWlzc2lvblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdCgpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWRpcmVjdGVkRnVsbE5hbWUgPSBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yKTtcbiAgICBpZiAocmVkaXJlY3RlZEZ1bGxOYW1lKSB7XG4gICAgICByZXR1cm4geyBmdWxsX25hbWU6IHJlZGlyZWN0ZWRGdWxsTmFtZSB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlc1dvcmtlclR5cGVzLCB0eXBlIFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBEbyBub3QgcmVtb3ZlIGB3aW5kb3dzYDogZ2VuZXJhdGVkIC5naXRpZ25vcmUgZmlsZXMgbXVzdCBrZWVwIGlnbm9yaW5nIFdpbmRvd3MtY3JlYXRlZCBsb2NhbCBhcnRpZmFjdHMuXG5jb25zdCBkZWZhdWx0TmFtZXMgPSBbJ3dpbmRvd3MnLCAnbWFjb3MnLCAnbGludXgnLCAnamV0YnJhaW5zJywgJ3Zpc3VhbHN0dWRpb2NvZGUnLCAnZW1hY3MnLCAndmltJywgJ3lhcm4nXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbl9fZ2VuZXJhdGVkX18vXG4hLmtlZXBcbi5haWRlcipcbi5hbnRpZ3Jhdml0eWNsaS9cbi5jbGF1ZGUvKi5sb2NhbC4qXG4uY2xhdWRlL3NjaGVkdWxlZF90YXNrcy5sb2NrXG4uZGV2Y29udGFpbmVyL1xuLmVudi5wcm9kdWN0aW9uXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90Lipcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLnBsYXl3cmlnaHQtY2xpL1xuLnBsYXl3cmlnaHQtbWNwL1xuLnNlcmVuYS9cbi50bXAvXG4udG9rZW5zYXZlL1xuLndiL1xuQHdpbGxib29zdGVyL1xuKi9tb3VudC8qLmhhc2hcbkNMQVVERS5sb2NhbC5tZFxuZGlzdC9cbmRyaXp6bGUvbW91bnQvXG50ZW1wL1xudG1wL1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGxldCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCkgKyBjb21tb25Db250ZW50O1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IG5hbWVzID0gWy4uLmRlZmF1bHROYW1lc107XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1YnknKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kKSB7XG4gICAgICBuYW1lcy5wdXNoKCdnbycpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAke3BhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpfVxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBuYW1lcy5wdXNoKCdub2RlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ21hdmVuJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5pZGVhL2dvb2dsZS1qYXZhLWZvcm1hdC54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgbmFtZXMucHVzaCgnZmx1dHRlcicsICdBbmRyb2lkU3R1ZGlvJywgJ3J1YnknKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmZsdXR0ZXItcGx1Z2lucy1kZXBlbmRlbmNpZXNcbmFuZHJvaWQva2V5LnByb3BlcnRpZXNcbmlvcy8uYnVuZGxlXG4uaWRlYS9ydW5Db25maWd1cmF0aW9ucy54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmF3cy1zYW0vXG5wYWNrYWdlZC55YW1sXG5gO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIC52ZW52IHNob3VsZCBiZSBpZ25vcmVkIG9uIHJvb3QgZGlyZWN0b3J5XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSB8fCBjb25maWcuZGVwZW5kaW5nLmRyaXp6bGUpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcudGF1cmkpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1c3QnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnKSB7XG4gICAgICAvLyAhQ2FyZ28ubG9jayBvdmVycmlkZXMgYW55IHByZS1leGlzdGluZyB1bmFuY2hvcmVkIENhcmdvLmxvY2sgcnVsZSBmcm9tIGFcbiAgICAgIC8vIHBhcmVudCAuZ2l0aWdub3JlLCBzbyB0aGUgYXBwbGljYXRpb24gbG9ja2ZpbGUgc3RheXMgY29tbWl0dGFibGUuXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCFDYXJnby5sb2NrXG5zcmMtdGF1cmkvZ2VuL3NjaGVtYXMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc0Nsb3VkZmxhcmUgfHwgcm9vdENvbmZpZy5pc0Nsb3VkZmxhcmUpIHtcbiAgICAgIC8vIC5kZXYudmFycyogaG9sZCBsb2NhbCBzZWNyZXRzIGZvciB3cmFuZ2xlciBkZXYgYW5kIG11c3QgbmV2ZXIgYmUgY29tbWl0dGVkLFxuICAgICAgLy8gdW5saWtlIHRoZSBjb21taXR0ZWQgLmVudi8uZW52LnN0YWdpbmcgZmlsZXMgb2YgdGhlIFdpbGxCb29zdGVyIGNvbnZlbnRpb24uXG4gICAgICAvLyAuZW52LmNsb3VkZmxhcmUgY2FycmllcyBDTE9VREZMQVJFX0FQSV9UT0tFTjogQ0kgd3JpdGVzIGl0IGZyb20gYSBzZWNyZXQsIGFuZCBhIGxvY2FsXG4gICAgICAvLyBgd2IgZGVwbG95YCBuZWVkcyBhIHJlYWwgdG9rZW4gaW4gaXQsIHNvIGNvbW1pdHRpbmcgaXQgd291bGQgbGVhayBhY2NvdW50IGNyZWRlbnRpYWxzLlxuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZGV2LnZhcnMqXG4uZW52LmNsb3VkZmxhcmVcbi53cmFuZ2xlci9cbmA7XG4gICAgfVxuICAgIC8vIElnbm9yZWQgb25seSB3aGVyZSBwb3N0aW5zdGFsbCByZWdlbmVyYXRlcyBpdCwgc28gd2JmeSBuZXZlciBpZ25vcmVzIGEgZmlsZSB0aGF0IG5vdGhpbmcgcmVjcmVhdGVzLiBUaGlzIGtlZXBzXG4gICAgLy8gaXRzIHRob3VzYW5kcyBvZiBsaW5lcyBvdXQgb2YgZXZlcnkgd3JhbmdsZXIgYnVtcCdzIGRpZmYuIEFuY2hvcmVkIHdpdGggYSBsZWFkaW5nIHNsYXNoIGJlY2F1c2UgYHdyYW5nbGVyIHR5cGVzYFxuICAgIC8vIGFuZCB0aGUgdW50cmFja2luZyBiZWxvdyBvbmx5IGV2ZXIgdG91Y2ggdGhpcyBwYWNrYWdlJ3Mgb3duIGZpbGUsIG5vdCBhIG5lc3RlZCBvbmUgYXQgYW55IGRlcHRoLlxuICAgIGlmIChnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC93b3JrZXItY29uZmlndXJhdGlvbi5kLnRzXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcudmluZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcudmluZXh0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52aW5leHQvXG5gO1xuICAgIH1cblxuICAgIGxldCBnZW5lcmF0ZWQgPSAnJztcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGxldCBjb250ZW50ID0gKGF3YWl0IHJlYWRDYWNoZShuYW1lKSkgPz8gJyc7XG4gICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vd3d3LnRvcHRhbC5jb20vZGV2ZWxvcGVycy9naXRpZ25vcmUvYXBpLyR7bmFtZX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJ0F0dGVudGlvbiBSZXF1aXJlZCEnKSB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJzx0aXRsZT4nKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IHJlc3BvbnNlVGV4dC50cmltKCk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZUNhY2hlKG5hbWUsIGNvbnRlbnQpKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBGZXRjaGVkICR7dXJsfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ2VuZXJhdGVkKSBnZW5lcmF0ZWQgKz0gJ1xcbic7XG4gICAgICBnZW5lcmF0ZWQgKz0gY29udGVudCArICdcXG4nO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBpZ25vcmVGaWxlVXRpbC5pc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoKSkpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlKCchLnlhcm4vY2FjaGUnLCAnIyAhLnlhcm4vY2FjaGUnKS5yZXBsYWNlKCcjIC5wbnAuKicsICcucG5wLionKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2FydGlmYWN0cyQvZ20sICcuaWRlYS9hcnRpZmFjdHMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9jb21waWxlci54bWwkL2dtLCAnLmlkZWEvY29tcGlsZXIueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvamFyUmVwb3NpdG9yaWVzLnhtbCQvZ20sICcuaWRlYS9qYXJSZXBvc2l0b3JpZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnLmlkZWEvbW9kdWxlcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC8qLmltbCQvZ20sICcuaWRlYS8qLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMkL2dtLCAnLmlkZWEvbW9kdWxlcycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmltbCQvZ20sICcqLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmlwciQvZ20sICcqLmlwcicpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcjIC5pZGVhL21vZHVsZXMueG1sJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy50YXVyaSkge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUncyB1bmFuY2hvcmVkIGRlYnVnLyB3b3VsZCBhbHNvIGhpZGUgZnJvbnRlbmQgc291cmNlXG4gICAgICAvLyBkaXJlY3RvcmllcyBzdWNoIGFzIHNyYy9kZWJ1Zy87IGNhcmdvIG91dHB1dCBpcyBhbHJlYWR5IGNvdmVyZWQgYnkgdGFyZ2V0Ly5cbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eZGVidWdcXC8kL2dtLCAnIyBkZWJ1Zy8nKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8IGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcykge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUgaWdub3JlcyBDYXJnby5sb2NrLCBidXQgYSBzcmMtdGF1cmkgY29uZmlndXJhdGlvbiBtYXJrcyBhblxuICAgICAgLy8gYXBwbGljYXRpb24sIHdob3NlIENhcmdvLmxvY2sgbXVzdCBiZSBjb21taXR0ZWQgZm9yIHJlcHJvZHVjaWJsZSBidWlsZHMuIFRoZVxuICAgICAgLy8gcnVsZSBpcyBhbHNvIGRpc2FibGVkIHdoZW4gYSBzdWIgcGFja2FnZSBjb250YWlucyBhIFRhdXJpIGFwcGxpY2F0aW9uLCBiZWNhdXNlXG4gICAgICAvLyBhbiB1bmFuY2hvcmVkIENhcmdvLmxvY2sgcnVsZSBpbiBhIHBhcmVudCAuZ2l0aWdub3JlIHdvdWxkIGhpZGUgdGhlIG5lc3RlZFxuICAgICAgLy8gYXBwbGljYXRpb24ncyBsb2NrZmlsZS4gVGF1cmkgcGx1Z2luIGxpYnJhcmllcyAoZGV0ZWN0ZWQgb25seSB2aWFcbiAgICAgIC8vIEB0YXVyaS1hcHBzLyogZGVwZW5kZW5jaWVzKSBrZWVwIHRoZSB0ZW1wbGF0ZSdzIHBvbGljeSBvZiBpZ25vcmluZyBDYXJnby5sb2NrLlxuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL15DYXJnb1xcLmxvY2skL2dtLCAnIyBDYXJnby5sb2NrJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gS2VlcCBwYWNrYWdlLW1hbmFnZXIgc2hpbXMgaW4gdGhlIEZpbGUgV2F0Y2hlciBwcm9ncmFtIGZpZWxkIHNvIG5vZGUgZG9lcyBub3Rcbi8vIHBhcnNlIHdyYXBwZXIgc2NyaXB0cyBwYXNzZWQgdGhyb3VnaCBhcmd1bWVudHMuXG5jb25zdCBveGZtdFByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9veGZtdCc7XG5jb25zdCBwcmV0dGllclByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllcic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGdldFdhdGNoZXJUYXNrc0NvbnRlbnQoY29uZmlnKSkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCB0YXNrT3B0aW9ucyA9IFtcbiAgICB7XG4gICAgICBhcmdzOiAnLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICEqKi9wYWNrYWdlLmpzb24nLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucy5veGZtdCxcbiAgICAgIG5hbWU6ICdPeGZtdCcsXG4gICAgICBwcm9ncmFtOiBveGZtdFByb2dyYW0sXG4gICAgfSxcbiAgICB7XG4gICAgICBhcmdzOiAnLS1jYWNoZSAtLXdyaXRlJyxcbiAgICAgIGNvbmRpdGlvbjogZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLnByZXR0aWVyT25seSxcbiAgICAgIG5hbWU6ICdQcmV0dGllcicsXG4gICAgICBwcm9ncmFtOiBwcmV0dGllclByb2dyYW0sXG4gICAgfSxcbiAgXVxuICAgIC5maWx0ZXIoKHRhc2spID0+IHRhc2suY29uZGl0aW9uKVxuICAgIC5mbGF0TWFwKCh0YXNrKSA9PiB0YXNrLmV4dGVuc2lvbnMubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKHRhc2sucHJvZ3JhbSwgdGFzay5hcmdzLCB0YXNrLm5hbWUsIGV4dCkpKTtcblxuICByZXR1cm4gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuICAgICR7dGFza09wdGlvbnMuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGFza09wdGlvbnMocnVubmVyOiBzdHJpbmcsIGFyZ3M6IHN0cmluZywgbmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgICAgIDxUYXNrT3B0aW9ucyBpc0VuYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJhcmd1bWVudHNcIiB2YWx1ZT1cIiR7YXJnc30gJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJjaGVja1N5bnRheEVycm9yc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZXhpdENvZGVCZWhhdmlvclwiIHZhbHVlPVwiRVJST1JcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZmlsZUV4dGVuc2lvblwiIHZhbHVlPVwiJHtleHRlbnNpb259XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImltbWVkaWF0ZVN5bmNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm5hbWVcIiB2YWx1ZT1cIiR7bmFtZX0gKC4ke2V4dGVuc2lvbn0pXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dFwiIHZhbHVlPVwiJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGaWx0ZXJzXCI+XG4gICAgICAgIDxhcnJheSAvPlxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGcm9tU3Rkb3V0XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJwcm9ncmFtXCIgdmFsdWU9XCIke3J1bm5lcn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicnVuT25FeHRlcm5hbENoYW5nZXNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInNjb3BlTmFtZVwiIHZhbHVlPVwiUHJvamVjdCBGaWxlc1wiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ0cmFja09ubHlSb290XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ3b3JraW5nRGlyXCIgdmFsdWU9XCIkUHJvamVjdEZpbGVEaXIkXCIgLz5cbiAgICAgIDxlbnZzIC8+XG4gICAgPC9UYXNrT3B0aW9ucz5cbmA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5JMThuVHNDb21tYW5kKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RlcGVuZGluZycgfCAnaXNCdW4nPixcbiAgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLmdlbkkxOG5UcyB8fCAhc2NyaXB0cz8uWydnZW4taTE4bi10cyddKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYCR7Y29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybid9IHJ1biBnZW4taTE4bi10cyA+IC9kZXYvbnVsbGA7XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmdhbml6YXRpb246IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvVXJsID0gYGdpdEBnaXRodWIuY29tOiR7b3JnYW5pemF0aW9ufS8ke3JlcG99LmdpdGA7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdnaXQnLCBbJ2xzLXJlbW90ZScsIHJlcG9VcmwsICdIRUFEJ10sIHByb2Nlc3MuY3dkKCkpO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBvdXRwdXQuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZiAoIWNvbW1pdEhhc2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb21taXRIYXNoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggY29tbWl0cyBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb306ICR7U3RyaW5nKGVycm9yKX1gKSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IFtcbiAgJ0B0c2NvbmZpZy9idW4nLFxuICAnQHRzY29uZmlnL25vZGUtbHRzJyxcbiAgJ0B0c2NvbmZpZy9ub2RlLXRzJyxcbiAgJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnLFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9idW4vdHNjb25maWcuanNvbic7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUvdHNjb25maWcuanNvbic7XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzL3RzY29uZmlnLmpzb24nLCAnQHRzY29uZmlnL25vZGUtdHMvdHNjb25maWcuanNvbiddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzJywgJ0B0c2NvbmZpZy9ub2RlLXRzJ107XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiZcbiAgICAhY29uZmlnLmlzUm9vdCAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8ucHJpdmF0ZSAhPT0gdHJ1ZSAmJlxuICAgIEFycmF5LmlzQXJyYXkoY29uZmlnLnBhY2thZ2VKc29uPy5maWxlcykgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24uZmlsZXMubGVuZ3RoID4gMFxuICApO1xufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBsb2FkL2R1bXAgdXNhZ2UgY2xlYXJlci5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvblZhbHVlTWFwIH0gZnJvbSAnQHlhcm5wa2cvY29yZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbnR5cGUgU2V0dGluZ3MgPSB7XG4gIGFwcHJvdmVkR2l0UmVwb3NpdG9yaWVzPzogc3RyaW5nW107XG4gIGRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeDogc3RyaW5nO1xuICBlbmFibGVTY3JpcHRzPzogYm9vbGVhbjtcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgbnBtTWluaW1hbEFnZUdhdGU/OiBzdHJpbmc7XG4gIG5wbVByZWFwcHJvdmVkUGFja2FnZXM/OiBzdHJpbmdbXTtcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufSAmIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPjtcblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgeWFybk5wbU1pbmltYWxBZ2VHYXRlID0gJzVkJztcbmV4cG9ydCBjb25zdCB5YXJuTnBtUHJlYXBwcm92ZWRQYWNrYWdlcyA9IFtcbiAgLy8gLS0tLS0tLS0tLSBTVEFSVDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuICAnQGV4ZXJjb2RlLyonLFxuICAnQHdpbGxib29zdGVyLyonLFxuICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAnYXQtZGVjb3JhdG9ycycsXG4gICdidWlsZC10cycsXG4gICdnZW4taTE4bi10cycsXG4gICdvbmUtd2F5LWdpdC1zeW5jJyxcbiAgLy8gLS0tLS0tLS0tLSBFTkQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cblxuICAvLyBUbyBkZWFsIHdpdGggQ1ZFIGxpa2UgaHR0cHM6Ly9uZXh0anMub3JnL2Jsb2cvQ1ZFLTIwMjUtNjY0NzhcbiAgJ25leHQnLFxuICAnQG5leHQvKicsXG4gICdAdHlwZXMvKicsXG4gIC8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGFzIGB0eXBlc2NyaXB0YDsgYEB0eXBlc2NyaXB0LypgIGNvdmVycyBpdHMgcGxhdGZvcm0gYmluYXJpZXMuXG4gICd0eXBlc2NyaXB0JyxcbiAgJ0B0eXBlc2NyaXB0LyonLFxuICAnQG94Zm10LyonLFxuICAnQG94bGludC8qJyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvKicsXG4gICdveGZtdCcsXG4gICdveGxpbnQnLFxuICAnb3hsaW50LXRzZ29saW50JyxcbiAgJ3JlYWN0JyxcbiAgJ3JlYWN0LWRvbScsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGlzTmV3ZXJWZXJzaW9uKGxhdGVzdFZlcnNpb24sIGN1cnJlbnRWZXJzaW9uKSkge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGxldCBzZXR0aW5ncyA9IHt9IGFzIFNldHRpbmdzO1xuICAgIHRyeSB7XG4gICAgICBzZXR0aW5ncyA9ICh5YW1sLmxvYWQoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoeWFybnJjWW1sUGF0aCwgJ3V0ZjgnKSkgYXMgU2V0dGluZ3MgfCB1bmRlZmluZWQpID8/IHNldHRpbmdzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzZXR0aW5ncy5kZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXggPSAnJztcbiAgICAvLyBJbnN0YWxsLXRpbWUgc2NyaXB0cyBhcmUgYSBjb21tb24gc3VwcGx5LWNoYWluIGV4ZWN1dGlvbiBwYXRoLiBLZWVwIHRoaXNcbiAgICAvLyBleHBsaWNpdCBzbyBzdGFsZSBwcm9qZWN0IHNldHRpbmdzIGNhbm5vdCByZS1lbmFibGUgdGhlbSBnbG9iYWxseS5cbiAgICBzZXR0aW5ncy5lbmFibGVTY3JpcHRzID0gZmFsc2U7XG4gICAgc2V0dGluZ3Mubm9kZUxpbmtlciA9ICdub2RlLW1vZHVsZXMnO1xuICAgIHNldHRpbmdzLm5tTW9kZSA9ICdoYXJkbGlua3MtZ2xvYmFsJztcbiAgICBzZXR0aW5ncy5ucG1NaW5pbWFsQWdlR2F0ZSA9IHlhcm5OcG1NaW5pbWFsQWdlR2F0ZTtcbiAgICBzZXR0aW5ncy5hcHByb3ZlZEdpdFJlcG9zaXRvcmllcyA9IFtcbiAgICAgIC8vIFlhcm4gNC4xNCBibG9ja3MgZ2l0IGRlcGVuZGVuY2llcyB1bmxlc3MgdGhlIHJlcG9zaXRvcnkgVVJMIGlzIGV4cGxpY2l0bHkgYWxsb3dlZC5cbiAgICAgICdodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvKi5naXQnLFxuICAgICAgJ3NzaDovL2dpdEBnaXRodWIuY29tL1dpbGxCb29zdGVyLyouZ2l0JyxcbiAgICAgICdodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXJMYWIvKi5naXQnLFxuICAgICAgJ3NzaDovL2dpdEBnaXRodWIuY29tL1dpbGxCb29zdGVyTGFiLyouZ2l0JyxcbiAgICBdO1xuICAgIHNldHRpbmdzLm5wbVByZWFwcHJvdmVkUGFja2FnZXMgPSB5YXJuTnBtUHJlYXBwcm92ZWRQYWNrYWdlcztcbiAgICBkZWxldGUgc2V0dGluZ3MuY29tcHJlc3Npb25MZXZlbDtcbiAgICBpZiAoc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcztcbiAgICB9XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L3B1bGwvNDY5OFxuICAgIHNldHRpbmdzLmVuYWJsZUdsb2JhbENhY2hlID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IHNldHRpbmdzLnBsdWdpbnM/Lmxlbmd0aCA/PyAwO1xuICAgIHNldHRpbmdzLnBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zPy5maWx0ZXIoKHApID0+IHAucGF0aCAhPT0gJy55YXJuL3BsdWdpbnMvdW5kZWZpbmVkLmNqcycpID8/IFtdO1xuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCAhPT0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicsICdwbHVnaW5zJywgJ3VuZGVmaW5lZC5janMnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwbHVnaW5QYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MucGx1Z2lucztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHlhcm5yY1ltbFBhdGgsIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKTtcblxuICAgIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ3lhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgLy8gVGhlIHRhcmdldCByZXBvIG1heSBub3QgaGF2ZSBwcmV0dGllciBpbnN0YWxsZWQgeWV0LCBhbmQgeWFybi1wbHVnaW4tYXV0by1pbnN0YWxsIGVkaXRzIHRoaXMgZmlsZSBhZnRlciBqcy15YW1sLlxuICAgIHNwYXduU3luYygneWFybicsIGdldFlhcm5yY1ByZXR0aWVyQXJncyhjb25maWcuZGlyUGF0aCwgeWFybnJjWW1sUGF0aCksIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRZYXJucmNQcmV0dGllckFyZ3MoZGlyUGF0aDogc3RyaW5nLCB5YXJucmNZbWxQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbJ2RseCcsICdwcmV0dGllcicsICctLW5vLWNvbmZpZycsICctLXdyaXRlJywgcGF0aC5yZWxhdGl2ZShkaXJQYXRoLCB5YXJucmNZbWxQYXRoKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndmVyc2lvbiddLCBkaXJQYXRoKSB8fCAnMC4wLjAnO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyVmVyc2lvbihuZXdWZXJzaW9uOiBzdHJpbmcsIG9sZFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB2YWxpZE5ld1ZlcnNpb24gPSBzZW12ZXIudmFsaWQobmV3VmVyc2lvbik7XG4gIGlmICghdmFsaWROZXdWZXJzaW9uKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHNlbXZlci5ndCh2YWxpZE5ld1ZlcnNpb24sIHNlbXZlci52YWxpZChvbGRWZXJzaW9uKSA/PyAnMC4wLjAnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVzV29ya2VyVHlwZXMsIHR5cGUgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHtcbiAgY2xhc3NpZnlXcmFuZ2xlclR5cGVzSW52b2NhdGlvbixcbiAgaXNNYW5hZ2VkR2VuQ29kZVNlZ21lbnQsXG4gIGlzVW5tb2RlbGVkV3JhbmdsZXJUeXBlc1NlZ21lbnQsXG4gIHBhcnNlV3JhbmdsZXJUeXBlc0ludm9jYXRpb24sXG4gIHBvc3RpbnN0YWxsR2VuZXJhdGVzV29ya2VyVHlwZXMsXG4gIHJlYWNoZXNXcmFuZ2xlclR5cGVzLFxuICBzY3JpcHRDaGFuZ2VzV29ya2luZ0RpcmVjdG9yeSxcbiAgc2VsZWN0UHJvamVjdFdyYW5nbGVyVHlwZXNHZW5lcmF0b3IsXG4gIHNwbGl0Q29tbWFuZFNlZ21lbnRzLFxufSBmcm9tICcuLi91dGlscy93cmFuZ2xlclR5cGVzQ29tbWFuZC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuaW1wb3J0IHsgaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5pbXBvcnQgeyBidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgfSBmcm9tICcuL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyB5YXJuTnBtTWluaW1hbEFnZUdhdGUsIHlhcm5OcG1QcmVhcHByb3ZlZFBhY2thZ2VzIH0gZnJvbSAnLi95YXJucmMuanMnO1xuXG5jb25zdCBveGxpbnREZXBzID0gWydAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJywgJ294Zm10JywgJ294bGludCcsICdveGxpbnQtdHNnb2xpbnQnXTtcbmNvbnN0IHR5cGVzY3JpcHREZXBlbmRlbmN5ID0gJ3R5cGVzY3JpcHQnO1xuLy8gVHlwZVNjcmlwdCA3J3MgYHR5cGVzY3JpcHRgIHBhY2thZ2UgaXMgdGhlIHRzZ28gbmF0aXZlIGNvbXBpbGVyIGFuZCBleHBvc2VzIG5vXG4vLyBwcm9ncmFtbWF0aWMgQVBJLiBOZXh0LmpzJ3MgYnVpbGQtdGltZSBgdmVyaWZ5VHlwZVNjcmlwdFNldHVwYCBuZWVkcyB0aGF0IEFQSSwgc29cbi8vIGBuZXh0IGJ1aWxkYCBmYWlscyAoXCJ0cnlpbmcgdG8gdXNlIFR5cGVTY3JpcHQgYnV0IGRvIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBwYWNrYWdlKHMpXCIpXG4vLyB3aXRoIG9ubHkgYHR5cGVzY3JpcHRgIHY3IGluc3RhbGxlZC4gTmV4dC5qcyByZXNvbHZlcyB0aGUgdHNnbyBiaW5hcnkgdGhyb3VnaCB0aGVcbi8vIHNlcGFyYXRlIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgcGFja2FnZSwgc28gTmV4dC5qcy1mYW1pbHkgcmVwb3MgbXVzdCBpbnN0YWxsXG4vLyBib3RoOyBvdGhlciByZXBvcyBvbmx5IG5lZWQgYHR5cGVzY3JpcHRgIGZvciBgdHNjYCB0eXBlY2hlY2tzLlxuY29uc3QgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSA9ICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldyc7XG5jb25zdCB3YkRlcGVuZGVuY3kgPSAnQHdpbGxib29zdGVyL3diJztcbmNvbnN0IGJ1aWxkVHNEZXBlbmRlbmN5ID0gJ2J1aWxkLXRzJztcbmNvbnN0IGxlZnRob29rRGVwZW5kZW5jeSA9ICdsZWZ0aG9vayc7XG5jb25zdCBkZWZhdWx0R2VuSTE4blRzU2NyaXB0ID0gJ2dlbi1pMThuLXRzIC1pIGkxOG4gLW8gc3JjL19fZ2VuZXJhdGVkX18vaTE4bi50cyAtZCBqYS1KUCc7XG5jb25zdCBtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzID0gbmV3IFNldChbXG4gIHdiRGVwZW5kZW5jeSxcbiAgYnVpbGRUc0RlcGVuZGVuY3ksXG4gIGxlZnRob29rRGVwZW5kZW5jeSxcbiAgdHlwZXNjcmlwdERlcGVuZGVuY3ksXG4gIHR5cGVzY3JpcHRHb0RlcGVuZGVuY3ksXG4gICdzb3J0LXBhY2thZ2UtanNvbicsXG4gIC4uLm94bGludERlcHMsXG5dKTtcbmNvbnN0IHdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMgPSBbXG4gICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyxcbiAgLi4ub3hsaW50RGVwcy5maWx0ZXIoKGRlcGVuZGVuY3kpID0+IGRlcGVuZGVuY3kuc3RhcnRzV2l0aCgnQHdpbGxib29zdGVyLycpKSxcbl07XG5jb25zdCBvYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMgPSBbXG4gICdAYmlvbWVqcy9iaW9tZScsXG4gICdAZXNsaW50LXJlYWN0L2VzbGludC1wbHVnaW4nLFxuICAnQGVzbGludC9qcycsXG4gICdAbmV4dC9lc2xpbnQtcGx1Z2luLW5leHQnLFxuICAnQHR5cGVzL2VzbGludCcsXG4gICdAdHlwZXMvbWljcm9tYXRjaCcsXG4gICdAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpbicsXG4gICdAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyJyxcbiAgJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctYmxpdHotbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyxcbiAgJ2Jpb21lJyxcbiAgJ2VzbGludCcsXG4gICdlc2xpbnQtY29uZmlnLWZsYXQtZ2l0aWdub3JlJyxcbiAgJ2VzbGludC1jb25maWctbmV4dCcsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItbm9kZScsXG4gICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLXR5cGVzY3JpcHQnLFxuICAnZXNsaW50LXBsdWdpbi1pbXBvcnQnLFxuICAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsXG4gICdlc2xpbnQtcGx1Z2luLXBlcmZlY3Rpb25pc3QnLFxuICAnZXNsaW50LXBsdWdpbi1wcmV0dGllcicsXG4gICdlc2xpbnQtcGx1Z2luLXJlYWN0JyxcbiAgJ2VzbGludC1wbHVnaW4tcmVhY3QtY29tcGlsZXInLFxuICAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcycsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtY2xhc3MtbWVtYmVycycsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtZGVzdHJ1Y3R1cmUta2V5cycsXG4gICdlc2xpbnQtcGx1Z2luLXN0b3J5Ym9vaycsXG4gICdlc2xpbnQtcGx1Z2luLXVuaWNvcm4nLFxuICAnZXNsaW50LXBsdWdpbi11bnVzZWQtaW1wb3J0cycsXG4gICdnbG9iYWxzJyxcbiAgJ21pY3JvbWF0Y2gnLFxuICAndHlwZXNjcmlwdC1lc2xpbnQnLFxuXTtcbmNvbnN0IG1pY3JvbWF0Y2hQYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsnbWljcm9tYXRjaCcsICdAdHlwZXMvbWljcm9tYXRjaCddKTtcbmNvbnN0IG1pY3JvbWF0Y2hJbXBvcnRQYXR0ZXJuID1cbiAgL1xcYmZyb21cXHMrWydcIl1taWNyb21hdGNoWydcIl18XFxicmVxdWlyZVxcKFxccypbJ1wiXW1pY3JvbWF0Y2hbJ1wiXVxccypcXCl8XFxiaW1wb3J0XFwoXFxzKlsnXCJdbWljcm9tYXRjaFsnXCJdXFxzKlxcKS91O1xuXG5jb25zdCBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbmNvbnN0IG5wbVBhY2thZ2VUaW1lc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG50eXBlIFdyaXRhYmxlUGFja2FnZUpzb24gPSBTZXRSZXF1aXJlZDxcbiAgUGFja2FnZUpzb24sXG4gICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcydcbj47XG5cbmludGVyZmFjZSBEZXBlbmRlbmN5VXBkYXRlcyB7XG4gIGRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIGRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvbk9iaiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG5cbiAgYXdhaXQgcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKGNvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IHVwZGF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqKTtcbiAgbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iaik7XG4gIGNvbnN0IGRlcGVuZGVuY3lVcGRhdGVzID0gYXdhaXQgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihjb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzLCBza2lwQWRkaW5nRGVwcyk7XG4gIGF3YWl0IHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqKTtcbiAgcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaik7XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIC8vIFlhcm4gcmVhZHMgcGFja2FnZS5qc29uIGZyb20gZGlzayBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciBgeWFybiBhZGQgLURgXG4gIC8vIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHJlZ3VsYXIgZGVwZW5kZW5jeSwgc28gdGhpcyB3cml0ZSBtdXN0IGZpbmlzaFxuICAvLyBiZWZvcmUgaW5zdGFsbGluZyB0aGUgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZXMgYmVsb3cuIEtlZXAgdGhpcyBnZW5lcmF0ZWRcbiAgLy8gZmlsZSBzb3J0ZWQgZXZlbiB3aGVuIHdlIGxhdGVyIHJ1biB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBmb3JtYXR0ZXIgc28gYVxuICAvLyBtaWQtcnVuIGludGVycnVwdGlvbiBuZXZlciBsZWF2ZXMgcGFja2FnZS5qc29uIGluIGEgcGFydGlhbGx5IG1hbmFnZWQgb3JkZXIuXG4gIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmopKTtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKGNvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMsIHBhY2thZ2VNYW5hZ2VyKTtcbiAgICBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGZpbGVQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogc3RyaW5nIHtcbiAgLy8gZnNVdGlsLmdlbmVyYXRlRmlsZSgpIG5vcm1hbGl6ZXMgdGhlIHRyYWlsaW5nIG5ld2xpbmUsIHNvIGtlZXAgdGhlIHNlcmlhbGl6ZXJcbiAgLy8gZm9jdXNlZCBvbiB0aGUgSlNPTiBwYXlsb2FkIGl0c2VsZi5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNvcnRQYWNrYWdlSnNvbihqc29uT2JqKSwgdW5kZWZpbmVkLCAyKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFdyaXRhYmxlUGFja2FnZUpzb24+IHtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgcmV0dXJuIGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmVtb3ZlTGVnYWN5SW5zdGFsbENvbW1hbmRzKGpzb25PYmouc2NyaXB0cyk7XG5cbiAganNvbk9iai5zY3JpcHRzID0geyAuLi5qc29uT2JqLnNjcmlwdHMsIC4uLmdlbmVyYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmouc2NyaXB0cykgfTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc3RhcnQtdGVzdC1zZXJ2ZXInXTtcblxuICBjb25zdCBzY3JpcHRzID0ganNvbk9iai5zY3JpcHRzO1xuICBpZiAoY29uZmlnLmlzQnVuIHx8ICFkb2VzQ29udGFpbkphdmEoY29uZmlnKSkge1xuICAgIGRlbGV0ZSBzY3JpcHRzLnByZXR0aWZ5O1xuICB9IGVsc2Uge1xuICAgIHNjcmlwdHMucHJldHRpZnkgPSAoc2NyaXB0cy5wcmV0dGlmeSA/PyAnJykgKyAoYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCkpO1xuICB9XG4gIG5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyhzY3JpcHRzKTtcbiAgbm9ybWFsaXplUmFpbHdheUNsaVNjcmlwdChjb25maWcsIHNjcmlwdHMpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVMZWdhY3lJbnN0YWxsQ29tbWFuZHMoc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAvLyBGcmVzaCByZXBvcyBzdGlsbCByZXF1aXJlIHN0YW5kYWxvbmUgYHlhcm4gaW5zdGFsbGA7IG9ubHkgcmVtb3ZlIGxlZ2FjeSBpbnN0YWxsIHByZWZpeGVzIGJlZm9yZSBhbm90aGVyIGNvbW1hbmQuXG4gICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnZ2l0IGNsb25lJykpIHtcbiAgICAgIHNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoL3lhcm5cXHMqKD86aW5zdGFsbFxccyopPyYmXFxzKi9ndSwgJycpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVQb3N0aW5zdGFsbFNjcmlwdChzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLCB3cmFuZ2xlclR5cGVzOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKHNjcmlwdHNbJ2dlbi1jb2RlJ10pIHtcbiAgICAvLyBLZWVwIHRoZSBwcm9qZWN0J3Mgb3duIHdvcmtlci10eXBlcyBwaXBlbGluZSAocHJlcmVxdWlzaXRlcyBpbmNsdWRlZCDigJQgZS5nLiBgbm9kZSBzY3JpcHRzL3ByZXBhcmVUeXBlcy5qc1xuICAgIC8vICYmIHdyYW5nbGVyIHR5cGVzIC4uLmApIHdoZW4gcmV3cml0aW5nIHBvc3RpbnN0YWxsOiBkcm9wcGluZyBhIHByZXJlcXVpc2l0ZSB3b3VsZCBsZWF2ZSBmcmVzaCBjaGVja291dHNcbiAgICAvLyB1bmFibGUgdG8gcmVnZW5lcmF0ZSB0aGUgZmlsZSwgYW5kIGRyb3BwaW5nIHRoZSBpbnZvY2F0aW9uIGl0c2VsZiAoZS5nLiBgd3JhbmdsZXIgdHlwZXMgLS1jb25maWdcbiAgICAvLyBjb25maWcvd29ya2VyLmpzb25jYCwgd2hpY2ggd2JmeSBkb2VzIG5vdCBtYW5hZ2UsIHBvc3NpYmx5IGJlaGluZCBhIHdyYXBwZXIgc2NyaXB0KSB3b3VsZCBkcm9wIHRoZVxuICAgIC8vIGdlbmVyYXRpb24gZW50aXJlbHkuXG4gICAgY29uc3QgcG9zdGluc3RhbGxTZWdtZW50cyA9IHNjcmlwdHMucG9zdGluc3RhbGwgPyBzcGxpdENvbW1hbmRTZWdtZW50cyhzY3JpcHRzLnBvc3RpbnN0YWxsKSA6IFtdO1xuICAgIGNvbnN0IGludm9sdmVzV3JhbmdsZXJUeXBlcyA9XG4gICAgICByZWFjaGVzV3JhbmdsZXJUeXBlcyhzY3JpcHRzLnBvc3RpbnN0YWxsLCBzY3JpcHRzLCAoKSA9PiB0cnVlKSB8fFxuICAgICAgLy8gU2hlbGwgZm9ybXMgdGhlIHBhcnNlciBjYW5ub3QgbW9kZWwgKGUuZy4gYG5vZGUgc2NyaXB0cy9wcmVwYXJlLmpzOyB3cmFuZ2xlciB0eXBlcyAtLWNvbmZpZyAuLi5gLFxuICAgICAgLy8gYSB3cmFwcGVyIGZvcndhcmRpbmcgYXJndW1lbnRzKSBzdGlsbCBnZW5lcmF0ZSBvbiBpbnN0YWxsIGFuZCBtdXN0IHN1cnZpdmUgdGhlIHJld3JpdGUgdmVyYmF0aW0g4oCUXG4gICAgICAvLyBoZW5jZSBzcGxpdENvbW1hbmRTZWdtZW50cywgd2hpY2ggbmV2ZXIgdHJ1bmNhdGVzIGF0IGEgYGNkYC4gQSBnZW5lcmF0b3IgYmVoaW5kIGEgcmVhbCBgY2RgIHBhcnNlc1xuICAgICAgLy8gaW4gaXNvbGF0aW9uIGJ1dCBydW5zIGVsc2V3aGVyZSwgc28gaXQgY291bnRzIGFzIGludm9sdmVkIHRvby5cbiAgICAgIHBvc3RpbnN0YWxsU2VnbWVudHMuc29tZSgoc2VnbWVudCkgPT4gaXNVbm1vZGVsZWRXcmFuZ2xlclR5cGVzU2VnbWVudChzZWdtZW50LCBzY3JpcHRzKSkgfHxcbiAgICAgIChzY3JpcHRDaGFuZ2VzV29ya2luZ0RpcmVjdG9yeShzY3JpcHRzLnBvc3RpbnN0YWxsID8/ICcnKSAmJlxuICAgICAgICBwb3N0aW5zdGFsbFNlZ21lbnRzLnNvbWUoKHNlZ21lbnQpID0+ICEhcGFyc2VXcmFuZ2xlclR5cGVzSW52b2NhdGlvbihzZWdtZW50KSkpO1xuICAgIGNvbnN0IHByZXNlcnZlZFNlZ21lbnRzID0gaW52b2x2ZXNXcmFuZ2xlclR5cGVzXG4gICAgICA/IHBvc3RpbnN0YWxsU2VnbWVudHMuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50ICE9PSAnJyAmJiAhaXNNYW5hZ2VkR2VuQ29kZVNlZ21lbnQoc2VnbWVudCwgc2NyaXB0cykpXG4gICAgICA6IFtdO1xuICAgIHNjcmlwdHMucG9zdGluc3RhbGwgPSBbJ3diIGdlbi1jb2RlJywgLi4ucHJlc2VydmVkU2VnbWVudHNdLmpvaW4oJyAmJiAnKTtcbiAgfSBlbHNlIGlmIChzY3JpcHRzLnBvc3RpbnN0YWxsPy5pbmNsdWRlcygnZ2VuLWkxOG4tdHMnKSkge1xuICAgIGRlbGV0ZSBzY3JpcHRzLnBvc3RpbnN0YWxsO1xuICB9XG4gIGlmICghd3JhbmdsZXJUeXBlcykgcmV0dXJuO1xuICAvLyBBIFdvcmtlciBwYWNrYWdlIHdpdGhvdXQgYSBnZW4tY29kZSBzY3JpcHQgc3RpbGwgbmVlZHMgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBiZWZvcmUgdHlwZSBjaGVja2luZy5cbiAgLy8gV3JhcHBlciBpbnZvY2F0aW9ucyAoZS5nLiBgXCJwb3N0aW5zdGFsbFwiOiBcInlhcm4gZ2VuOnR5cGVzXCJgKSBhbHJlYWR5IGdlbmVyYXRlIGl0LCBzbyBhZGRpbmcgdGhlIHJlc29sdmVkXG4gIC8vIGNvbW1hbmQgd291bGQgZ2VuZXJhdGUgdGhlIH4xNWstbGluZSBmaWxlIHR3aWNlIHBlciBpbnN0YWxsLiBPbmx5IGEgZ2VuZXJhdGluZyBkZWZhdWx0LW91dHB1dCBpbnZvY2F0aW9uXG4gIC8vIGNvdW50czogYHdyYW5nbGVyIHR5cGVzIC0tY2hlY2tgIG9yIGEgY3VzdG9tIG91dHB1dCBwYXRoIGxlYXZlcyB0aGUgbWFuYWdlZCBmaWxlIGFic2VudCBvbiBhIGZyZXNoIGNsb25lLlxuICBpZiAocG9zdGluc3RhbGxHZW5lcmF0ZXNXb3JrZXJUeXBlcyhzY3JpcHRzKSkgcmV0dXJuO1xuXG4gIC8vIEEgcmVhY2hhYmxlIG5vbi1nZW5lcmF0aW5nIGludm9jYXRpb24gKGUuZy4gYHdyYW5nbGVyIHR5cGVzIC0tY2hlY2tgLCB3aGljaCBmYWlscyB3aGlsZSB0aGUgZ2l0aWdub3JlZCBmaWxlXG4gIC8vIGlzIHN0aWxsIGFic2VudCkgbXVzdCBzZWUgdGhlIGdlbmVyYXRlZCBmaWxlLCBhbmQgYSBkaXJlY3RvcnktY2hhbmdpbmcgcG9zdGluc3RhbGwgKGBjZCAuLi90b29scyAmJiAuLi5gKVxuICAvLyB3b3VsZCBydW4gYW4gYXBwZW5kZWQgZ2VuZXJhdG9yIHNvbWV3aGVyZSBlbHNlIOKAlCBib3RoIG5lZWQgdGhlIGdlbmVyYXRvciBmaXJzdDsgb3RoZXJ3aXNlIGFwcGVuZCB0byBrZWVwXG4gIC8vIHRoZSBwcm9qZWN0J3Mgb3duIG9yZGVyLlxuICBjb25zdCBvbGRQb3N0aW5zdGFsbCA9IHNjcmlwdHMucG9zdGluc3RhbGw7XG4gIHNjcmlwdHMucG9zdGluc3RhbGwgPVxuICAgIG9sZFBvc3RpbnN0YWxsICYmXG4gICAgKHJlYWNoZXNXcmFuZ2xlclR5cGVzKG9sZFBvc3RpbnN0YWxsLCBzY3JpcHRzLCAoKSA9PiB0cnVlKSB8fCBzY3JpcHRDaGFuZ2VzV29ya2luZ0RpcmVjdG9yeShvbGRQb3N0aW5zdGFsbCkpXG4gICAgICA/IGAke3dyYW5nbGVyVHlwZXN9ICYmICR7b2xkUG9zdGluc3RhbGx9YFxuICAgICAgOiBhcHBlbmRXcmFuZ2xlclR5cGVzKG9sZFBvc3RpbnN0YWxsID8/ICcnLCB3cmFuZ2xlclR5cGVzKS5yZXBsYWNlKC9eICYmIC91LCAnJyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHNpbmdsZSBgd3JhbmdsZXIgdHlwZXNgIGNvbW1hbmQgdGhhdCBldmVyeSBtYW5hZ2VkIHNjcmlwdCBtdXN0IHJ1biwgb3IgdW5kZWZpbmVkIHdoZW4gd2JmeSBkb2VzIG5vdFxuICogbWFuYWdlIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgZm9yIHRoZSBwYWNrYWdlLlxuICpcbiAqIFNjYW5uaW5nIGV2ZXJ5IHNjcmlwdCAobm90IGp1c3QgcG9zdGluc3RhbGwpIG1hdHRlcnMgYmVjYXVzZSBwcm9qZWN0cyBrZWVwIHRoZSBmbGFnZ2VkIGludm9jYXRpb24gaW4gYSBzY3JpcHQgb2ZcbiAqIHRoZWlyIG93biwgZS5nLiBgXCJnZW4tdHlwZXNcIjogXCJ3cmFuZ2xlciB0eXBlcyAtLXN0cmljdC12YXJzPWZhbHNlXCJgLiBSZXVzaW5nIGl0IGtlZXBzIHRoZSBkZWNsYXJhdGlvbnMgd2JmeVxuICogcmVnZW5lcmF0ZXMgaWRlbnRpY2FsIHRvIHRoZSBvbmVzIHRoZSBwcm9qZWN0IGludGVuZGVkOiAtLXN0cmljdC12YXJzPWZhbHNlIHdpZGVucyBgdmFyc2AgdG8gc3RyaW5nLCB3aGVyZWFzIHRoZVxuICogZGVmYXVsdCBlbWl0cyBsaXRlcmFsIHVuaW9uIHR5cGVzLiBCb3RoIG1hbmFnZWQgc2NyaXB0cyBnZXQgdGhlIHNhbWUgY29tbWFuZCBzbyB0aGUgZmlsZSBjYW5ub3QgZGVwZW5kIG9uIHdoaWNoIG9mXG4gKiB0aGVtIHJhbiBsYXN0LiBPbmx5IGEgZ2VuZXJhdGluZyBkZWZhdWx0LW91dHB1dCBpbnZvY2F0aW9uIHF1YWxpZmllcyAoc2VlXG4gKiBjbGFzc2lmeVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKTsgYW55dGhpbmcgZWxzZSBmYWxscyBiYWNrIHRvIHRoZSBtYW5hZ2VkIGRlZmF1bHQgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVdyYW5nbGVyVHlwZXNDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZywgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnKSkgcmV0dXJuO1xuXG4gIC8vIE9ubHkgYW4gaW52b2NhdGlvbiBwYXNzaW5nIGZsYWdzIGlzIHdvcnRoIHByZXNlcnZpbmc7IGEgYmFyZSBvbmUgaXMgbm9ybWFsaXplZCB0byB0aGUgbWFuYWdlZCBjb21tYW5kLlxuICBjb25zdCB7IGNvbW1hbmQgfSA9IHNlbGVjdFByb2plY3RXcmFuZ2xlclR5cGVzR2VuZXJhdG9yKHNjcmlwdHMpO1xuICByZXR1cm4gY29tbWFuZCA/PyBgJHtjb25maWcuaXNCdW4gPyAnYnVueCAnIDogJyd9d3JhbmdsZXIgdHlwZXNgO1xufVxuXG4vKipcbiAqIENsb3VkZmxhcmUgV29ya2VycyBwcm9qZWN0cyByZWx5IG9uIGB3cmFuZ2xlciB0eXBlc2AgdG8gKHJlKWdlbmVyYXRlIHRoZSBnaXRpZ25vcmVkIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMuXG4gKiBCZWNhdXNlIGB3YiBnZW4tY29kZWAgZG9lcyBub3QgcHJvZHVjZSBpdCwgYXBwZW5kIHRoZSBjb21tYW5kIHRvIGNvZGUtZ2VuZXJhdGlvbiBzY3JpcHRzOyBvdGhlcndpc2UgYSBmcmVzaFxuICogY2hlY2tvdXQgKGUuZy4gQ0kpIHdvdWxkIGZhaWwgdHlwZSBjaGVja2luZy5cbiAqL1xuZnVuY3Rpb24gYXBwZW5kV3JhbmdsZXJUeXBlcyhzY3JpcHQ6IHN0cmluZywgd3JhbmdsZXJUeXBlczogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKCF3cmFuZ2xlclR5cGVzKSByZXR1cm4gc2NyaXB0O1xuICByZXR1cm4gYCR7c2NyaXB0fSAmJiAke3dyYW5nbGVyVHlwZXN9YDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgLy8gRGVhbCB3aXRoIGJyZWFraW5nIGNoYW5nZXMgaW4geWFybiBiZXJyeSA0LjAuMC1yYy40OVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBzY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKFxuICAgICAgL3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoKD8hXFxzKyg/Oi1BfC1SfC0tKD86YWxsfHJlY3Vyc2l2ZXxzaW5jZXx3b3JrdHJlZXxmcm9tfGluY2x1ZGV8ZXhjbHVkZXxwdWJsaWN8cHJpdmF0ZSkpKS9ndSxcbiAgICAgICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCdcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhaWx3YXlDbGlTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGlmIChjb25maWcuaXNCdW4gfHwgIXNjcmlwdHMucmFpbHdheT8uaW5jbHVkZXMoJ0ByYWlsd2F5L2NsaScpKSByZXR1cm47XG5cbiAgc2NyaXB0cy5yYWlsd2F5ID0gJ1lBUk5fRU5BQkxFX1NDUklQVFM9dHJ1ZSB5YXJuIGRseCBAcmFpbHdheS9jbGknO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTxEZXBlbmRlbmN5VXBkYXRlcz4ge1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG5cbiAgaWYgKFxuICAgIGhhc0phdmEgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyJyk7XG4gIH0gZWxzZSB7XG4gICAgcmVtb3ZlUHJldHRpZXJBcnRpZmFjdHMoanNvbk9iaik7XG4gIH1cblxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIGRlbGV0ZSAoanNvbk9iaiBhcyBQYWNrYWdlSnNvbiAmIHsgJ2xpbnQtc3RhZ2VkJz86IHVua25vd24gfSlbJ2xpbnQtc3RhZ2VkJ107XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuaHVza3k7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcGFjaztcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrO1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2gobGVmdGhvb2tEZXBlbmRlbmN5KTtcblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgaWYgKGRvZXNSZWxlYXNlU2NyaXB0SW5zdGFsbFNlbWFudGljUmVsZWFzZShqc29uT2JqLnNjcmlwdHMucmVsZWFzZSkpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ107XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXVxuICAgICAgKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnZlcnNpb24gPSAnMC4wLjAtc2VtYW50aWNhbGx5LXJlbGVhc2VkJztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgLy8gU2luY2UgYXJ0aWxsZXJ5IHJlcXVpcmVzIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBAcGxheXdyaWdodC90ZXN0XG4gICAgICBjb25zdCBoYXNBcnRpbGxlcnkgPSBqc29uT2JqLmRlcGVuZGVuY2llcy5hcnRpbGxlcnkgfHwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5O1xuICAgICAgLy8gU2luY2UgbGxtLXRvb2xib3ggcmVxdWlyZXMgQHBsYXl3cmlnaHQvdGVzdCBpbiBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICghaGFzQXJ0aWxsZXJ5ICYmICFqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAcGxheXdyaWdodC90ZXN0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0UnVudGltZSkge1xuICAgICAgICAvLyBSdW50aW1lIGltcG9ydHMgbmVlZCB0aGUgc3RhbmRhbG9uZSBwYWNrYWdlIGFmdGVyIERvY2tlciBwcnVuaW5nIHJlbW92ZXMgZGV2RGVwZW5kZW5jaWVzLlxuICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0ID8/PVxuICAgICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz9cbiAgICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddID8/XG4gICAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ3BsYXl3cmlnaHQnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZml4ZXJzL25leHRDb25maWcudHMgZW5hYmxlcyBgcmVhY3RDb21waWxlcjogdHJ1ZWAgZm9yIGV2ZXJ5IE5leHQuanMgcHJvamVjdCwgYW5kIE5leHQuanNcbiAgLy8gcmVzb2x2ZXMgYGJhYmVsLXBsdWdpbi1yZWFjdC1jb21waWxlcmAgYXQgYnVpbGQgdGltZSB3aGVuIFJlYWN0IENvbXBpbGVyIGlzIG9uLiBBZGQgaXQgaGVyZSBzb1xuICAvLyB0aGUgbWFuYWdlZCBuZXh0LmNvbmZpZyBuZXZlciBicmVha3MgYG5leHQgYnVpbGRgIHdpdGggYW4gdW5yZXNvbHZlZC1wYWNrYWdlIGVycm9yLlxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JhYmVsLXBsdWdpbi1yZWFjdC1jb21waWxlcicpO1xuICB9XG5cbiAgaWYgKCFpc1diUGFja2FnZShqc29uT2JqKSkge1xuICAgIGlmIChzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxuICAvLyBidWlsZC10cyBvd25zIFR5cGVTY3JpcHQgZXhlY3V0aW9uIGFuZCBkZWNsYXJhdGlvbiBlbWl0LiB3YmZ5IG11c3QgYWx3YXlzXG4gIC8vIGtlZXAgZXhpc3RpbmcgYnVpbGQtdHMgdXNlcnMgY3VycmVudCBiZWNhdXNlIG9sZGVyIHJlbGVhc2VzIGNhbiBlbWl0IC5kLnRzXG4gIC8vIGZpbGVzIGF0IHBhdGhzIHRoYXQgbm8gbG9uZ2VyIG1hdGNoIHBhY2thZ2UgZXhwb3J0cy5cbiAgaWYgKFxuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIE9iamVjdC52YWx1ZXMoanNvbk9iai5zY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHNjcmlwdD8uaW5jbHVkZXMoYnVpbGRUc0RlcGVuZGVuY3kpKVxuICApIHtcbiAgICBpZiAoc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5veGxpbnREZXBzKTtcbiAgfVxuXG4gIGNvbnN0IHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKSA6IFtdO1xuICBhd2FpdCByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqLCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi50c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlLCBzbyBpdCBpc1xuICAgIC8vIG5vdyB0aGUgbWFuYWdlZCBjb21waWxlciBmb3IgZXZlcnkgVHlwZVNjcmlwdCByZXBvICh0eXBlY2hlY2tpbmcgcnVucyBgdHNjYCkuXG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdERlcGVuZGVuY3kpO1xuICAgIC8vIE5leHQuanMncyBgbmV4dCBidWlsZGAgaW5zcGVjdHMgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCAodHNnbykgdG8gcnVuIGl0cyB0eXBlXG4gICAgLy8gY2hlY2s7IHRoZSBgdHlwZXNjcmlwdGAgdjcgcGFja2FnZSBhbG9uZSBsYWNrcyB0aGUgQVBJIG5leHQgbmVlZHMsIHNvIGtlZXAgYm90aFxuICAgIC8vIGluc3RhbGxlZCBmb3IgTmV4dC5qcy1mYW1pbHkgcmVwb3MuIFNlZSB0aGUgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSBjb21tZW50IGFib3ZlLlxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdEdvRGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9ub2RlJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0cy1qZXN0J10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgICApIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvamVzdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVwZW5kZW5jaWVzOiBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBkZXZEZXBlbmRlbmNpZXM6IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIHB5dGhvbkRldkRlcGVuZGVuY2llcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMsIHB5dGhvbkRldkRlcGVuZGVuY2llcyB9O1xufVxuXG5mdW5jdGlvbiBkb2VzUmVsZWFzZVNjcmlwdEluc3RhbGxTZW1hbnRpY1JlbGVhc2Uoc2NyaXB0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gL1xcYig/OmJ1bnh8bnB4fHBucG1cXHMrZGx4fHlhcm5cXHMrZGx4KVxccytzZW1hbnRpYy1yZWxlYXNlKD86QFxcUyspP1xcYi91LnRlc3Qoc2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5LCBrZWVwQXNSdW50aW1lXSBvZiBbXG4gICAgW3diRGVwZW5kZW5jeSwgc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKV0sXG4gICAgW2J1aWxkVHNEZXBlbmRlbmN5LCBzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iaildLFxuICBdIGFzIGNvbnN0KSB7XG4gICAgaWYgKGtlZXBBc1J1bnRpbWUpIHtcbiAgICAgIGNvbnN0IGRldlZlcnNpb24gPSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghZGV2VmVyc2lvbikgY29udGludWU7XG4gICAgICBjb25zdCBydW50aW1lVmVyc2lvbiA9IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFydW50aW1lVmVyc2lvbiB8fCBpc05ld2VyUGFja2FnZVZlcnNpb24oZGV2VmVyc2lvbiwgcnVudGltZVZlcnNpb24pKSB7XG4gICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gZGV2VmVyc2lvbjtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICB9IGVsc2UgaWYgKGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSB7XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA/Pz0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iajogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgY29uc3QgcG9zdGluc3RhbGxTY3JpcHQgPSBqc29uT2JqLnNjcmlwdHM/LnBvc3RpbnN0YWxsO1xuICByZXR1cm4gdHlwZW9mIHBvc3RpbnN0YWxsU2NyaXB0ID09PSAnc3RyaW5nJyAmJiAvXFxid2JcXGIvdS50ZXN0KHBvc3RpbnN0YWxsU2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmo6IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIGNvbnN0IHByaXNtYSA9IGpzb25PYmoucHJpc21hIGFzIHsgc2VlZD86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMocHJpc21hPy5zZWVkKSB8fCBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKGpzb25PYmouc2NyaXB0cz8uc2VlZCk7XG59XG5cbmZ1bmN0aW9uIGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMoc2VlZENvbW1hbmQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgLy8gUHJvZHVjdGlvbiBEb2NrZXIgaW1hZ2VzIHJ1biBzZWVkIHNjcmlwdHMgYWZ0ZXIgZGV2RGVwZW5kZW5jaWVzIGFyZSBwcnVuZWQsXG4gIC8vIHNvIFR5cGVTY3JpcHQgc2VlZCBydW5uZXJzIG11c3QgcmVtYWluIGF2YWlsYWJsZSBhdCBydW50aW1lLlxuICByZXR1cm4gdHlwZW9mIHNlZWRDb21tYW5kID09PSAnc3RyaW5nJyAmJiAvKD88IVtcXHctXSlidWlsZC10cyg/IVtcXHctXSkvdS50ZXN0KHNlZWRDb21tYW5kKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAganNvbk9iai5wcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWpzb25PYmoubGljZW5zZSkge1xuICAgIGpzb25PYmoubGljZW5zZSA9ICdVTkxJQ0VOU0VEJztcbiAgfVxuICBpZiAoIWpzb25PYmoucHJpdmF0ZSAmJiBqc29uT2JqLmxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJyAmJiByb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZyA/Pz0ge307XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLmFjY2VzcyA/Pz0gJ3B1YmxpYyc7XG4gIH1cbiAgY29uc3QgW293bmVyXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJyB8fCBvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGF3YWl0IG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShjb25maWcsIGpzb25PYmopO1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gWWFybiB0cmVhdHMgdGhlIGxlZ2FjeSBucG0vY2hhbGsgcmVzb2x1dGlvbiBhbGlhcyBhcyBhbiBpbnZhbGlkIHBhY2thZ2UgdG9rZW4uXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBbJ2NsZWFudXAnXSkge1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICAgICAgICBpZiAoIXNjcmlwdCkgY29udGludWU7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdID0gc2NyaXB0LnJlcGxhY2UoLyA/JiYgP3lhcm4gbGludC1maXgoPzogLS1xdWlldCk/LywgJycpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPz8gJ3lhcm4gbGludCAtLWZpeCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCwgY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICBpZiAoanNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID09PSAncG9ldHJ5IGluc3RhbGwnKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHRSdW5uZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2NvbW1vbi9jaS1zZXR1cCddID0gYCR7c2NyaXB0UnVubmVyfSBzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWA7XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5JyA/ICd1dicgOiAncG9ldHJ5J31gXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NldHVwLXBvZXRyeS1hc2RmJ107XG4gICAgICBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YF0gPSBnZXRQeXRob25TZXR1cENvbW1hbmQocHl0aG9uUGFja2FnZU1hbmFnZXIpO1xuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBjb25zdCBweXRob25SdW5uZXIgPSBgJHtweXRob25QYWNrYWdlTWFuYWdlcn0gcnVuYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgJHtweXRob25SdW5uZXJ9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiAke3B5dGhvblJ1bm5lcn0gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSBgJHtzY3JpcHRSdW5uZXJ9IGxpbnRgO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0LCBjb25maWcpO1xuICAgICAgICBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5IHx8IGpzb25PYmoucmVwb3NpdG9yeSkge1xuICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihjb25maWcucmVwb3NpdG9yeSA/PyBqc29uT2JqLnJlcG9zaXRvcnksIGpzb25PYmoucmVwb3NpdG9yeSk7XG4gIH1cblxuICAvLyBSZXNvbHZlZCBiZWZvcmUgdGhlIG1hbmFnZWQgc2NyaXB0cyBhcmUgb3ZlcndyaXR0ZW4sIHNvIGEgcHJvamVjdC1zcGVjaWZpYyBpbnZvY2F0aW9uIGlzIHN0aWxsIHZpc2libGUuXG4gIGNvbnN0IHdyYW5nbGVyVHlwZXMgPSByZXNvbHZlV3JhbmdsZXJUeXBlc0NvbW1hbmQoY29uZmlnLCBqc29uT2JqLnNjcmlwdHMpO1xuICBjb25zdCBnZW5Db2RlU2NyaXB0ID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddO1xuICBpZiAoZ2VuQ29kZVNjcmlwdD8uaW5jbHVkZXMoJ05vIGNvZGUgZ2VuZXJhdGlvbiBuZWVkZWQnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ107XG4gIH0gZWxzZSBpZiAoc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnLCBnZW5Db2RlU2NyaXB0KSkge1xuICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IGFwcGVuZFdyYW5nbGVyVHlwZXMoYCR7Y29uZmlnLmlzQnVuID8gJ2J1biAnIDogJyd9d2IgZ2VuLWNvZGVgLCB3cmFuZ2xlclR5cGVzKTtcbiAgfSBlbHNlIGlmIChcbiAgICBnZW5Db2RlU2NyaXB0ICYmXG4gICAgd3JhbmdsZXJUeXBlcyAmJlxuICAgICFyZWFjaGVzV3JhbmdsZXJUeXBlcyhcbiAgICAgIGdlbkNvZGVTY3JpcHQsXG4gICAgICBqc29uT2JqLnNjcmlwdHMsXG4gICAgICAoaW52b2NhdGlvbkFyZ3MpID0+IGNsYXNzaWZ5V3JhbmdsZXJUeXBlc0ludm9jYXRpb24oaW52b2NhdGlvbkFyZ3MpID09PSAncmV1c2FibGVHZW5lcmF0b3InXG4gICAgKVxuICApIHtcbiAgICAvLyBBIHByb2plY3Qtc3BlY2lmaWMgZ2VuLWNvZGUgbXVzdCBwcm9kdWNlIHRoZSBzYW1lIGRlY2xhcmF0aW9ucyBhcyBwb3N0aW5zdGFsbCwgb3IgcnVubmluZyB0aGUgZG9jdW1lbnRlZFxuICAgIC8vIGNvZGUtZ2VuZXJhdGlvbiBlbnRyeSBwb2ludCB3b3VsZCBsZWF2ZSB0aGUgZ2VuZXJhdGVkIHdvcmtlciB0eXBlcyBzdGFsZS4gTGlrZSB0aGUgcG9zdGluc3RhbGwgcmV3cml0ZSxcbiAgICAvLyBhIHJlYWNoYWJsZSBub24tZ2VuZXJhdGluZyBpbnZvY2F0aW9uIChlLmcuIGB3cmFuZ2xlciB0eXBlcyAtLWNoZWNrYCkgb3IgYSBkaXJlY3RvcnkgY2hhbmdlIG5lZWRzIHRoZVxuICAgIC8vIGdlbmVyYXRvciBmaXJzdC5cbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPVxuICAgICAgcmVhY2hlc1dyYW5nbGVyVHlwZXMoZ2VuQ29kZVNjcmlwdCwganNvbk9iai5zY3JpcHRzLCAoKSA9PiB0cnVlKSB8fCBzY3JpcHRDaGFuZ2VzV29ya2luZ0RpcmVjdG9yeShnZW5Db2RlU2NyaXB0KVxuICAgICAgICA/IGAke3dyYW5nbGVyVHlwZXN9ICYmICR7Z2VuQ29kZVNjcmlwdH1gXG4gICAgICAgIDogYXBwZW5kV3JhbmdsZXJUeXBlcyhnZW5Db2RlU2NyaXB0LCB3cmFuZ2xlclR5cGVzKTtcbiAgfVxuICBub3JtYWxpemVHZW5JMThuVHNTY3JpcHQoY29uZmlnLCBqc29uT2JqKTtcbiAgdXBkYXRlUG9zdGluc3RhbGxTY3JpcHQoanNvbk9iai5zY3JpcHRzLCB3cmFuZ2xlclR5cGVzKTtcblxuICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzLnByZXR0aWVyKSB7XG4gICAgLy8gQmVjYXVzZSBAdHlwZXMvcHJldHRpZXIgYmxvY2tzIHByZXR0aWVyIGV4ZWN1dGlvbi5cbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlcy9wcmV0dGllciddO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2xkR2VuQ29kZVNjcmlwdDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fFxuICAgIGNvbmZpZy5kZXBlbmRpbmcuY2hha3JhIHx8XG4gICAgY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgfHxcbiAgICBjb25maWcuZGVwZW5kaW5nLnByaXNtYSB8fFxuICAgIChjb25maWcuZGVwZW5kaW5nLmRyaXp6bGUgJiYgISFvbGRHZW5Db2RlU2NyaXB0Py5pbmNsdWRlcygnZHJpenpsZS1raXQgY2hlY2snKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoZm9ybWF0U2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIEJ1biBwcm9qZWN0cyBtYXkgbm90IGhhdmUgYSBZYXJuIGxvY2tmaWxlLCBzbyBnZW5lcmF0ZWQgcGFja2FnZSBzY3JpcHRzXG4gIC8vIG11c3QgaW52b2tlIGxvY2FsIHBhY2thZ2Ugc2NyaXB0cyB0aHJvdWdoIHRoZSByZXBvc2l0b3J5J3MgcGFja2FnZSBtYW5hZ2VyLlxuICBjb25zdCBzY3JpcHRSdW5uZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIHJldHVybiBmb3JtYXRTY3JpcHQgPyBgJHtmb3JtYXRTY3JpcHR9ICYmICR7c2NyaXB0UnVubmVyfSBmb3JtYXQtY29kZWAgOiBgJHtzY3JpcHRSdW5uZXJ9IGZvcm1hdC1jb2RlYDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplR2VuSTE4blRzU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIXNob3VsZE1hbmFnZUdlbkkxOG5Ucyhjb25maWcpKSByZXR1cm47XG5cbiAgaWYgKGpzb25PYmouc2NyaXB0c1snZ2VuLWkxOG4tdHMnXSA9PT0gZGVmYXVsdEdlbkkxOG5Uc1NjcmlwdCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1pMThuLXRzJ107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpKSByZXR1cm47XG5cbiAgY29uc3QgY29uZmlnTWpzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5tanMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ01qc1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai50eXBlID0gJ21vZHVsZSc7XG5cbiAgY29uc3QgY29uZmlnRHRzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLnRzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdEdHNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmouZmlsZXMgPSBbLi4ubmV3IFNldChbLi4uKGpzb25PYmouZmlsZXMgPz8gW10pLCAnY29uZmlnLmQubXRzJ10pXTtcbiAgLy8gTm9kZU5leHQgcmVzb2x2ZXMgYSByZWxhdGl2ZSBgLi9jb25maWcubWpzYCBpbXBvcnQgdG8gYGNvbmZpZy5kLm10c2AsIG5vdFxuICAvLyB0aGUgcGFja2FnZS1sZXZlbCBgdHlwZXNgIGZpZWxkLiBLZWVwIHRoZSBwdWJsaXNoZWQgY29uZmlnIGltcG9ydGFibGUgZnJvbVxuICAvLyBwYWNrYWdlLWxvY2FsIFR5cGVTY3JpcHQgbGludGVyIHNldHRpbmdzLlxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC5tdHMnKSwgY29uZmlnRG10c0NvbnRlbnQpKTtcbn1cblxuY29uc3QgY29uZmlnRG10c0NvbnRlbnQgPSBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vY29uZmlnLmpzJztcbmA7XG5cbmZ1bmN0aW9uIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIGNvbmZpZyxcbiAgICBqc29uT2JqLFxuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzLFxuICAgIFsuLi5kZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMsIC4uLmdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyldLFxuICAgIHNraXBBZGRpbmdEZXBzXG4gICk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcF0pO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBjb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMpXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xufVxuXG5mdW5jdGlvbiBnZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcykuZmlsdGVyKChkZXBlbmRlbmN5KSA9PiBtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzLmhhcyhkZXBlbmRlbmN5KSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBqc29uT2JqW2tleV07XG4gICAgaWYgKHNlY3Rpb24gJiYgT2JqZWN0LmtleXMoc2VjdGlvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmosIGtleSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybidcbik6IHZvaWQge1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGRlcGVuZGVuY2llcywgZmFsc2UpO1xuXG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwgZGV2RGVwZW5kZW5jaWVzLCB0cnVlKTtcblxuICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gIGlmIChweXRob25QYWNrYWdlTWFuYWdlciAmJiBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IFsuLi5uZXcgU2V0KGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcyldO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScpIHtcbiAgICAgIHNwYXduU3luYygncG9ldHJ5JywgWydhZGQnLCAnLS1ncm91cCcsICdkZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYygndXYnLCBbJ2FkZCcsICctLWRldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeScgfCAndXYnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykgcmV0dXJuICd1dic7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSByZXR1cm4gJ3BvZXRyeSc7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblNldHVwQ29tbWFuZChwYWNrYWdlTWFuYWdlcjogJ3BvZXRyeScgfCAndXYnKTogc3RyaW5nIHtcbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAndXYnKSByZXR1cm4gJ3V2IHN5bmMgLS1mcm96ZW4nO1xuICByZXR1cm4gJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlICYmIHBvZXRyeSBlbnYgdXNlICQobWlzZSBjdXJyZW50IHB5dGhvbikgJiYgcG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwICYmIHBvZXRyeSBpbnN0YWxsJztcbn1cblxuZnVuY3Rpb24gaW5zdGFsbE5wbURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybicsXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIGRldjogYm9vbGVhblxuKTogdm9pZCB7XG4gIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGVwZW5kZW5jeVNwZWNpZmllcnMgPSBbXG4gICAgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMubWFwKChkZXBlbmRlbmN5KSA9PiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWcsIGRlcGVuZGVuY3kpKSksXG4gIF07XG4gIHNwYXduU3luYyhcbiAgICBwYWNrYWdlTWFuYWdlcixcbiAgICBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksIC4uLihjb25maWcuaXNCdW4gPyBbJy0tZXhhY3QnXSA6IFtdKSwgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLFxuICAgIGNvbmZpZy5kaXJQYXRoXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXBlbmRlbmNpZXNUb0luc3RhbGw6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBuZXcgU2V0KGRlcGVuZGVuY2llcykpIHtcbiAgICBjb25zdCBzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgPSBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICAgICAgY29uZmlnLFxuICAgICAgZGVwZW5kZW5jeSxcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5KSB7XG4gICAgICBkZXBlbmRlbmNpZXNUb0luc3RhbGwucHVzaChkZXBlbmRlbmN5KTtcbiAgICAgIGlmICghc2tpcEFkZGluZ0RlcHMpIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAmJlxuICAgICAgIXNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSAmJlxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gIT09ICcqJ1xuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIGRlcGVuZGVuY3kpO1xuICAgIGlmIChsYXRlc3RWZXJzaW9uID09PSAnKicgJiYgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIGNvbnRpbnVlO1xuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzVG9JbnN0YWxsO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyxcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gIGlmICghcmVsYXRpdmVGaWxlUGF0aCkgcmV0dXJuO1xuXG4gIC8vIFJldXNlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIG93biBmb3JtYXR0ZXIgYWZ0ZXIgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24gc29cbiAgLy8gcGFja2FnZS5qc29uIG1hdGNoZXMgd2hhdGV2ZXIgaXRzIGN1cnJlbnQgc29ydC1wYWNrYWdlLWpzb24gdmVyc2lvbiBleHBlY3RzLlxuICAvLyBUaGlzIGF2b2lkcyBmb2xsb3ctdXAgYXV0b2ZpeCBjb21taXRzIGNhdXNlZCBvbmx5IGJ5IGZvcm1hdHRlciB2ZXJzaW9uIGRyaWZ0XG4gIC8vIGJldHdlZW4gd2JmeSBhbmQgdGhlIHByb2plY3QgYmVpbmcgdXBkYXRlZC5cbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAnYnVuJykge1xuICAgIHNwYXduU3luYygnYnVueCcsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xuICB9IGVsc2Uge1xuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIHJlbW92ZVNlbGZEZXBlbmRlbmN5KGNvbmZpZywganNvbk9iaik7XG4gIHJlcGxhY2VXaWxsQm9vc3RlckNvbmZpZ3NXb3Jrc3BhY2VEZXBlbmRlbmN5UmFuZ2VzKGNvbmZpZywganNvbk9iaik7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwtZm9yLWFpJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnRzbGliO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvdHNjb25maWcnXTtcbiAgLy8gRHJvcCBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgICh0c2dvKSBoZXJlIHNvIG5vbi1OZXh0LmpzIHJlcG9zIG5ldmVyIGNhcnJ5IGl0O1xuICAvLyB0aGlzIHJ1bnMgYmVmb3JlIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucywgd2hpY2ggcmUtYWRkcyBpdCBmb3IgTmV4dC5qcy1mYW1pbHlcbiAgLy8gcmVwb3MgdGhhdCBuZWVkIGl0IGFsb25nc2lkZSB0aGUgYHR5cGVzY3JpcHRgIHY3IHBhY2thZ2UgZm9yIGBuZXh0IGJ1aWxkYC5cbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW3R5cGVzY3JpcHRHb0RlcGVuZGVuY3ldO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbdHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIC8vIE5vbi1UeXBlU2NyaXB0IHJlcG9zIHNob3VsZCBub3Qga2VlcCBhIHN0cmF5IGB0eXBlc2NyaXB0YCBwYWNrYWdlLlxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbdHlwZXNjcmlwdERlcGVuZGVuY3ldO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5sZXJuYTtcbiAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5waW5zdDtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZmx1dHRlci1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWZsdXR0ZXInXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHl0aG9uLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtcHl0aG9uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZXI7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWFsbCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd2ZXJpZnktY29kZSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd2ZXJpZnktY29kZS13aXRoLXRlc3RzJ107XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdsZXJuYS5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gIHJlbW92ZVdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgcmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKGpzb25PYmosIGNvbmZpZyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVNlbGZEZXBlbmRlbmN5KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPlxuKTogdm9pZCB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0ganNvbk9iai5uYW1lIHx8IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuXG4gIC8vIEEgcGFja2FnZSBjYW4gaW1wb3J0IGl0c2VsZiB0aHJvdWdoIE5vZGUncyBwYWNrYWdlIHNlbGYtcmVmZXJlbmNlIHdpdGhvdXRcbiAgLy8gZGVjbGFyaW5nIGl0c2VsZjsga2VlcGluZyB0aGF0IGVkZ2UgYnJlYWtzIG1vbm9yZXBvIHJlbGVhc2UgdG9wb2xvZ2ljYWwgc29ydGluZy5cbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgcGFja2FnZU5hbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaWxsQm9vc3RlckNvbmZpZ3NXb3Jrc3BhY2VEZXBlbmRlbmN5UmFuZ2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeSwgdmVyc2lvbl0gb2YgT2JqZWN0LmVudHJpZXMoc2VjdGlvbikpIHtcbiAgICAgIGlmICghdmVyc2lvbikgY29udGludWU7XG4gICAgICBpZiAoIWlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSh2ZXJzaW9uKSkgY29udGludWU7XG4gICAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyB0aGVzZSBwYWNrYWdlcyBpbmRlcGVuZGVudGx5LCBzbyBnZW5lcmF0ZWRcbiAgICAgIC8vIHBhY2thZ2UgbWV0YWRhdGEgbXVzdCBkZXNjcmliZSBucG0gcmVsZWFzZSBlZGdlcyBpbnN0ZWFkIG9mIGxvY2FsXG4gICAgICAvLyB3b3Jrc3BhY2UgZWRnZXMgdGhhdCByZWxlYXNlIHRvb2xpbmcgdHJlYXRzIGFzIG1vbm9yZXBvIGdyYXBoIGxpbmtzLlxuICAgICAgLy8gVGhlIGZpbmFsIGB5YXJuIGluc3RhbGwgLS1uby1pbW11dGFibGVgIHN5bmNzIHRoZSBsb2NrZmlsZSBhZnRlciB0aGlzXG4gICAgICAvLyBtaWdyYXRpb24sIGV2ZW4gd2hlbiB0aGUgZGVwZW5kZW5jeSBpcyBub3QgcGFydCBvZiB3YmZ5J3MgbWFuYWdlZCBsaXN0LlxuICAgICAgc2VjdGlvbltkZXBlbmRlbmN5XSA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHJldHVybjtcblxuICBjb25zdCBzZWN0aW9ucyA9IGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMpIHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIG93bnMgdGhlc2UgY29uZmlnIHBhY2thZ2VzLiBQYWNrYWdlLWxvY2FsIGZvcm1hdHRlclxuICAgIC8vIGFuZCBsaW50ZXIgY29uZmlnIGZpbGVzIGFyZSByZXBvIHRvb2xpbmcsIG5vdCBwdWJsaXNoZWQgcGFja2FnZSBkYXRhLCBzb1xuICAgIC8vIHRoZSBwYWNrYWdlIG1ldGFkYXRhIG9ubHkgbmVlZHMgdGhlIGZvcm1hdHRlci9saW50ZXIgZXhlY3V0YWJsZXMuXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgdXNlZERlcGVuZGVuY2llczogc3RyaW5nW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1c2VkRGVwZW5kZW5jeVNldCA9IG5ldyBTZXQodXNlZERlcGVuZGVuY2llcyk7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gYXdhaXQgZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAodXNlZERlcGVuZGVuY3lTZXQuaGFzKGRlcGVuZGVuY3kpIHx8IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIGJhc2UtY29uZmlnIHBhY2thZ2VzLiBSZW1vdmUgc3RhbGUgdmFyaWFudHMgd2hlbiByZXBvXG4gICAgLy8gY2FwYWJpbGl0aWVzIGNoYW5nZSwgc3VjaCBhcyBOZXh0LmpzIHRha2luZyBvd25lcnNoaXAgb2YgdHNjb25maWcuanNvbi5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IGZnLmdsb2IoJyoqL3RzY29uZmlnKi5qc29uJywge1xuICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICBjb25zdCBhYnNvbHV0ZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gICAgLy8gVHlwZVNjcmlwdCA3J3MgbmF0aXZlIGNvbXBpbGVyIGRyb3BwZWQgdGhlIGluLXByb2Nlc3MgYHBhcnNlQ29uZmlnRmlsZVRleHRUb0pzb25gXG4gICAgLy8gaGVscGVyLCBzbyBwYXJzZSB0aGUgdHNjb25maWcgaW50byBhbiBBU1QgYW5kIHJlYWQgaXRzIHRvcC1sZXZlbCBgZXh0ZW5kc2AgZGlyZWN0bHkuXG4gICAgY29uc3Qgc291cmNlID0gcGFyc2VTb3VyY2VGaWxlKGFic29sdXRlRmlsZVBhdGgpO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFByZXNlcnZlIG1hbmFnZWQgQHRzY29uZmlnIGRlcGVuZGVuY2llcyBiZWNhdXNlICR7YWJzb2x1dGVGaWxlUGF0aH0gY291bGQgbm90IGJlIHBhcnNlZC5gKTtcbiAgICAgIHJldHVybiBuZXcgU2V0KG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHJlYWRUc2NvbmZpZ0V4dGVuZHMoc291cmNlKSkge1xuICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBkZXBlbmRlbmN5IHx8IHZhbHVlLnN0YXJ0c1dpdGgoYCR7ZGVwZW5kZW5jeX0vYCkpIHtcbiAgICAgICAgICBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXM7XG59XG5cbi8qKiBSZWFkcyB0aGUgdG9wLWxldmVsIGBleHRlbmRzYCBlbnRyaWVzIChhIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzKSBmcm9tIGEgcGFyc2VkIHRzY29uZmlnLiAqL1xuZnVuY3Rpb24gcmVhZFRzY29uZmlnRXh0ZW5kcyhzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogc3RyaW5nW10ge1xuICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgZ2V0VHNjb25maWdSb290UHJvcGVydGllcyhzb3VyY2UpKSB7XG4gICAgaWYgKGFzdC5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgJiYgYXN0LmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSAmJiBwcm9wZXJ0eS5uYW1lLnRleHQgPT09ICdleHRlbmRzJykge1xuICAgICAgY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHZhbHVlcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmZ1bmN0aW9uIGdldFRzY29uZmlnUm9vdFByb3BlcnRpZXMoc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHJlYWRvbmx5IGFzdC5PYmplY3RMaXRlcmFsRWxlbWVudExpa2VbXSB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHNvdXJjZS5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKGFzdC5pc0V4cHJlc3Npb25TdGF0ZW1lbnQoc3RhdGVtZW50KSAmJiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbikpIHtcbiAgICAgIHJldHVybiBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5wcm9wZXJ0aWVzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKG5vZGU6IGFzdC5FeHByZXNzaW9uLCB2YWx1ZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGlmIChhc3QuaXNTdHJpbmdMaXRlcmFsKG5vZGUpKSB7XG4gICAgdmFsdWVzLnB1c2gobm9kZS50ZXh0KTtcbiAgfSBlbHNlIGlmIChhc3QuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG5vZGUuZWxlbWVudHMpIHtcbiAgICAgIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKGVsZW1lbnQsIHZhbHVlcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj5bXSB7XG4gIHJldHVybiBkZXBlbmRlbmN5U2VjdGlvbktleXNcbiAgICAubWFwKChrZXkpID0+IGpzb25PYmpba2V5XSlcbiAgICAuZmlsdGVyKChzZWN0aW9uKTogc2VjdGlvbiBpcyBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+ICEhc2VjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2FjaGVLZXkgPSBgJHtjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJ306JHtkZXBlbmRlbmN5fWA7XG4gIGNvbnN0IGNhY2hlZFZlcnNpb24gPSBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLmdldChjYWNoZUtleSk7XG4gIGlmIChjYWNoZWRWZXJzaW9uKSByZXR1cm4gY2FjaGVkVmVyc2lvbjtcblxuICBjb25zdCB2ZXJzaW9uID0gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGNvbmZpZywgZGVwZW5kZW5jeSk7XG4gIGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuc2V0KGNhY2hlS2V5LCB2ZXJzaW9uKTtcbiAgcmV0dXJuIHZlcnNpb247XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShjb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIHdiZnktbWFuYWdlZCB0b29saW5nIChwcmVhcHByb3ZlZCBwYWNrYWdlcykgYWRvcHRzIHRoZSBsYXRlc3QgcmVsZWFzZSBpbW1lZGlhdGVseSxcbiAgLy8gYnlwYXNzaW5nIHRoZSBtaW5pbXVtLXJlbGVhc2UtYWdlIGdhdGUgYXBwbGllZCB0byB1bnJldmlld2VkIGRlcGVuZGVuY2llcy5cbiAgaWYgKCFzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGNvbmZpZywgZGVwZW5kZW5jeSkpIHtcbiAgICByZXR1cm4gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICB9XG5cbiAgcmV0dXJuIGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSwgZ2V0UGFja2FnZUFnZUdhdGVNcyhjb25maWcpKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcsIHBhY2thZ2VBZ2VHYXRlTXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHRpbWVzID0gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3kpO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBpZiAobGF0ZXN0VmVyc2lvbiAhPT0gJyonICYmIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZSh0aW1lc1tsYXRlc3RWZXJzaW9uXSwgcGFja2FnZUFnZUdhdGVNcykpIHtcbiAgICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHZlcnNpb25zID0gT2JqZWN0LmVudHJpZXModGltZXMpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiBzZW12ZXIudmFsaWQodmVyc2lvbikpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiAoc2VtdmVyLnByZXJlbGVhc2UodmVyc2lvbik/Lmxlbmd0aCA/PyAwKSA9PT0gMClcbiAgICAuZmlsdGVyKChbLCBwdWJsaXNoZWRBdF0pID0+IE51bWJlci5pc0Zpbml0ZShEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSkpXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBub3cgLSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSA+PSBwYWNrYWdlQWdlR2F0ZU1zKVxuICAgIC50b1NvcnRlZCgoW3ZlcnNpb25BXSwgW3ZlcnNpb25CXSkgPT4gc2VtdmVyLnJjb21wYXJlKHZlcnNpb25BLCB2ZXJzaW9uQikpO1xuXG4gIHJldHVybiB2ZXJzaW9uc1swXT8uWzBdID8/ICcqJztcbn1cblxuZnVuY3Rpb24gaXNQdWJsaXNoZWRCZWZvcmVBZ2VHYXRlKHB1Ymxpc2hlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQsIHBhY2thZ2VBZ2VHYXRlTXM6IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAoIXB1Ymxpc2hlZEF0KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHB1Ymxpc2hlZFRpbWUgPSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwdWJsaXNoZWRUaW1lKSAmJiBEYXRlLm5vdygpIC0gcHVibGlzaGVkVGltZSA+PSBwYWNrYWdlQWdlR2F0ZU1zO1xufVxuXG5mdW5jdGlvbiBnZXROcG1QYWNrYWdlVGltZXMoZGVwZW5kZW5jeTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gZGVwZW5kZW5jeS5yZXBsYWNlKC9AW15AL10rJC91LCAnJyk7XG4gIGNvbnN0IGNhY2hlZFRpbWVzID0gbnBtUGFja2FnZVRpbWVzQ2FjaGUuZ2V0KHBhY2thZ2VOYW1lKTtcbiAgaWYgKGNhY2hlZFRpbWVzKSByZXR1cm4gY2FjaGVkVGltZXM7XG5cbiAgY29uc3Qgc3Rkb3V0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICducG0nLFxuICAgIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndGltZScsICctLWpzb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sXG4gICAgcHJvY2Vzcy5jd2QoKVxuICApO1xuICBpZiAoIXN0ZG91dCkgcmV0dXJuIHt9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzdGRvdXQpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgbnBtUGFja2FnZVRpbWVzQ2FjaGUuc2V0KHBhY2thZ2VOYW1lLCBwYXJzZWQpO1xuICAgIHJldHVybiBwYXJzZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHByZWFwcHJvdmVkUGFja2FnZXMgPSBjb25maWcuaXNCdW4gPyBidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzIDogeWFybk5wbVByZWFwcHJvdmVkUGFja2FnZXM7XG4gIHJldHVybiAhcHJlYXBwcm92ZWRQYWNrYWdlcy5zb21lKChwYXR0ZXJuKSA9PiBkb2VzUGFja2FnZVBhdHRlcm5NYXRjaChwYXR0ZXJuLCBkZXBlbmRlbmN5KSk7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2thZ2VBZ2VHYXRlTXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogbnVtYmVyIHtcbiAgaWYgKGNvbmZpZy5pc0J1bikgcmV0dXJuIGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyAqIDEwMDA7XG5cbiAgY29uc3QgbWF0Y2hlZCA9IC9eKD88ZGF5cz5cXGQrKWQkL3UuZXhlYyh5YXJuTnBtTWluaW1hbEFnZUdhdGUpO1xuICByZXR1cm4gTnVtYmVyKG1hdGNoZWQ/Lmdyb3Vwcz8uZGF5cyA/PyAwKSAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG59XG5cbmZ1bmN0aW9uIGRvZXNQYWNrYWdlUGF0dGVybk1hdGNoKHBhdHRlcm46IHN0cmluZywgZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwYXR0ZXJuID09PSBkZXBlbmRlbmN5KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFwYXR0ZXJuLmluY2x1ZGVzKCcqJykpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlc2NhcGVkUGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZUFsbCgvWy4rP14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApLnJlcGxhY2VBbGwoJyonLCAnLionKTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRQYXR0ZXJufSRgLCAndScpLnRlc3QoZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCducG0nLCBbJ3Nob3cnLCBkZXBlbmRlbmN5LCAndmVyc2lvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSwgcHJvY2Vzcy5jd2QoKSkgfHwgJyonO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChkZXBlbmRlbmN5ID09PSB3YkRlcGVuZGVuY3kpIHJldHVybiBgJHtkZXBlbmRlbmN5fUAke2dldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgZGVwZW5kZW5jeSl9YDtcbiAgcmV0dXJuIGRlcGVuZGVuY3k7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU9ic29sZXRlTGludERlcGVuZGVuY2llcyhcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+LFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IHZvaWQge1xuICBjb25zdCBwcmVzZXJ2ZU1pY3JvbWF0Y2ggPSBzaG91bGRQcmVzZXJ2ZU1pY3JvbWF0Y2goY29uZmlnKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG9ic29sZXRlTGludERlcGVuZGVuY2llcykge1xuICAgIGlmIChwcmVzZXJ2ZU1pY3JvbWF0Y2ggJiYgbWljcm9tYXRjaFBhY2thZ2VOYW1lcy5oYXMoZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIGlmIChzaG91bGRQcmVzZXJ2ZUNvbmZpZ1BhY2thZ2VMaW50RGVwZW5kZW5jeShqc29uT2JqLCBjb25maWcsIGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkUHJlc2VydmVDb25maWdQYWNrYWdlTGludERlcGVuZGVuY3koXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPixcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmN5OiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAoIWlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIHJldHVybiB0cnVlO1xuXG4gIC8vIFB1Ymxpc2hlZCBjb25maWcgcGFja2FnZXMgbmVlZCBsb2NhbCB0eXBlLW9ubHkgZGVwcyB0byB2YWxpZGF0ZSB0aGVcbiAgLy8gcGFja2FnZS1wcm92aWRlZCBjb25maWcgZGVjbGFyYXRpb25zIHVuZGVyIFlhcm4gUG5QLlxuICByZXR1cm4gZGVwZW5kZW5jeSA9PT0gJ0B0eXBlcy9lc2xpbnQnICYmICEhanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzLmVzbGludDtcbn1cblxuZnVuY3Rpb24gc2hvdWxkUHJlc2VydmVNaWNyb21hdGNoKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHN1YnBhY2thZ2VzIHB1Ymxpc2ggY29uZmlnIGZpbGVzIGFzIHRoZWlyIHByb2R1Y3QsIHNvXG4gIC8vIG1pY3JvbWF0Y2ggaXMgcGFja2FnZSBkYXRhIHRoZXJlLiBPdGhlciByZXBvcyBrZWVwIG1pY3JvbWF0Y2ggb25seSB3aGVuXG4gIC8vIHByb2R1Y3QgY29kZSBpbXBvcnRzIGl0OyBvdGhlcndpc2UgaXQgaXMgdHJlYXRlZCBhcyBvYnNvbGV0ZSBFU0xpbnQtZXJhXG4gIC8vIHRvb2xpbmcuXG4gIHJldHVybiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmICFjb25maWcuaXNSb290KSB8fCBkb2VzUHJvZHVjdENvZGVJbXBvcnRNaWNyb21hdGNoKGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gZG9lc1Byb2R1Y3RDb2RlSW1wb3J0TWljcm9tYXRjaChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZmlsZVBhdGhzID0gZmcuZ2xvYlN5bmMoJ3NyYy8qKi8qLntqcyxqc3gsbWpzLGNqcyx0cyx0c3gsbXRzLGN0c30nLCB7XG4gICAgY3dkOiBkaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuICByZXR1cm4gZmlsZVBhdGhzLnNvbWUoKGZpbGVQYXRoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtaWNyb21hdGNoSW1wb3J0UGF0dGVybi50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZVBhdGgpLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY3k6IHN0cmluZyxcbiAgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIGlmICghY3VycmVudFZlcnNpb24pIHJldHVybiB0cnVlO1xuICBpZiAoY3VycmVudFZlcnNpb24gPT09ICcqJykgcmV0dXJuIHRydWU7XG4gIGlmIChpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UoY3VycmVudFZlcnNpb24pKSByZXR1cm4gdHJ1ZTtcbiAgLy8gd2JmeSBvd25zIHRoZXNlIHRvb2wgZGVwZW5kZW5jaWVzLCBidXQgYXBwbHlpbmcgd2JmeSBzaG91bGQgbm90IGRvd25ncmFkZSBhXG4gIC8vIHJlcG9zaXRvcnkgdGhhdCBhbHJlYWR5IHBpbnMgYSBuZXdlciByZXZpZXdlZCByZWxlYXNlLlxuICByZXR1cm4gbWFuYWdlZERlcGVuZGVuY3lOYW1lcy5oYXMoZGVwZW5kZW5jeSkgJiYgaXNOZXdlck1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIGRlcGVuZGVuY3ksIGN1cnJlbnRWZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNOZXdlck1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZywgY3VycmVudFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgcmV0dXJuIGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihsYXRlc3RWZXJzaW9uLCBjdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihjYW5kaWRhdGVWZXJzaW9uOiBzdHJpbmcsIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdmFsaWRMYXRlc3RWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGNhbmRpZGF0ZVZlcnNpb24pO1xuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgcmV0dXJuICF2YWxpZExhdGVzdFZlcnNpb24gfHwgIXZhbGlkQ3VycmVudFZlcnNpb24gfHwgc2VtdmVyLmd0KHZhbGlkTGF0ZXN0VmVyc2lvbiwgdmFsaWRDdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSh2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcnNpb24uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/KSg/OlxcLmdpdCk/JC91LmV4ZWMocmVwb3NpdG9yeVVybCk7XG4gIGlmICghbWF0Y2hlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IFssIG93bmVyLCByZXBvXSA9IG1hdGNoZWQ7XG4gIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgbm9ybWFsaXplZFVybDogc3RyaW5nLFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3QgcmVwb3NpdG9yeU9iaiA9XG4gICAgdHlwZW9mIHJlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICA/IHJlcG9zaXRvcnlcbiAgICAgIDogdHlwZW9mIGV4aXN0aW5nUmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBleGlzdGluZ1JlcG9zaXRvcnlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXBvc2l0b3J5T2JqLFxuICAgIHR5cGU6ICdnaXQnLFxuICAgIHVybDogbm9ybWFsaXplZFVybCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIC8vIE5vIGAtLWJ1bmA6IGl0cyBub2RlLT5idW4gUEFUSCBzaGltIGxlYWtzIGludG8gZXZlcnkgY2hpbGQgcHJvY2VzcyBhbmQgYnJlYWtzIHRvb2xzXG4gICAgICAvLyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KS5cbiAgICAgIGNsZWFudXA6ICdidW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gd2IgdHlwZWNoZWNrJyxcbiAgICAgIHZlcmlmeTogJ2J1biB3YiB2ZXJpZnknLFxuICAgICAgJ3ZlcmlmeS1mdWxsJzogJ2J1biB3YiB2ZXJpZnkgLS1mdWxsJyxcbiAgICB9O1xuICAgIGFwcGx5RGF0YWJhc2VTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgYGJ1biAke2dldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZyl9YCk7XG4gICAgYXBwbHlNaXNlVGFza1NjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ2J1aWxkJywgJ2RldicsICdzdGFydCcsICd0ZXN0JywgJ3R5cGVjaGVjayddKTtcbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAnICYmIHB5cmlnaHQnO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG4gICAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuICAgIGNvbnN0IG9sZFRlc3QgPSBvbGRTY3JpcHRzLnRlc3Q7XG4gICAgbGV0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBjbGVhbnVwOiAneWFybiBmb3JtYXQgJiYgeWFybiBsaW50LWZpeCcsXG4gICAgICBmb3JtYXQ6IGdlbmVyYXRlRm9ybWF0U2NyaXB0KGhhc0pzT3JUcywgaGFzSmF2YSksXG4gICAgICAvLyBQYWNrYWdlLWxvY2FsIGNvbmZpZ3MgbXVzdCBkZWxldGUgdGhlIHJvb3Qtb25seSB0eXBlLWF3YXJlIG9wdGlvbnMsIHNvIHBhc3MgdGhlIGZsYWdzXG4gICAgICAvLyBleHBsaWNpdGx5LiBPdGhlcndpc2UgdGhpcyBzY3JpcHQgd291bGQgc2lsZW50bHkgc2tpcCB0eXBlIGNoZWNraW5nIGluIHdvcmtzcGFjZSBwYWNrYWdlcy5cbiAgICAgIGxpbnQ6IGBveGxpbnQke2hhc1R5cGVjaGVjayA/ICcgLS10eXBlLWF3YXJlIC0tdHlwZS1jaGVjaycgOiAnJ30gLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAuYCxcbiAgICAgICdsaW50LWZpeCc6ICd5YXJuIGxpbnQgLS1maXgnLFxuICAgICAgJ2Zvcm1hdC1jb2RlJzogYG94Zm10IC0td3JpdGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAuICchKiovcGFja2FnZS5qc29uJ2AsXG4gICAgICB0eXBlY2hlY2s6ICd0c2MgLS1ub0VtaXQnLFxuICAgIH07XG4gICAgaWYgKGhhc0phdmEpIHtcbiAgICAgIHNjcmlwdHMucHJldHRpZnkgPSBgcHJldHRpZXIgLS1jYWNoZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXJPbmx5LmpvaW4oJywnKX19XCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIHNjcmlwdHMgPSBtZXJnZShcbiAgICAgICAgeyAuLi5zY3JpcHRzIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmb3JtYXQ6IGAke3NjcmlwdHMuZm9ybWF0fSAmJiB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gZm9ybWF0YCxcbiAgICAgICAgICBsaW50OiBgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnRgLFxuICAgICAgICAgICdsaW50LWZpeCc6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludC1maXgnLFxuICAgICAgICAgIC8vIENJPTEgcHJldmVudHMgdml0ZXN0IGZyb20gZW5hYmxpbmcgd2F0Y2guIENvbG9yIHBvbGljeSBiZWxvbmdzIHRvIHdiLCBub3QgZ2VuZXJhdGVkIHBhY2thZ2Ugc2NyaXB0cy5cbiAgICAgICAgICB0ZXN0OiAnQ0k9MSB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXZlcmJvc2UgcnVuIHRlc3QnLFxuICAgICAgICAgIHR5cGVjaGVjazogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biB0eXBlY2hlY2snLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKGhhc0phdmEpIHtcbiAgICAgICAgc2NyaXB0cy5wcmV0dGlmeSA9IGBwcmV0dGllciAtLWNhY2hlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkuam9pbihcbiAgICAgICAgICAnLCdcbiAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgIH1cbiAgICBpZiAoIWhhc0pzT3JUcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ107XG4gICAgICBkZWxldGUgc2NyaXB0cy5saW50O1xuICAgICAgZGVsZXRlIHNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgfVxuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLndiKSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9ICd3YiB0eXBlY2hlY2snO1xuICAgIH1cbiAgICBpZiAoaXNXYlBhY2thZ2UoY29uZmlnLnBhY2thZ2VKc29uKSkge1xuICAgICAgc2NyaXB0cy52ZXJpZnkgPSBvbGRTY3JpcHRzLnZlcmlmeSA/PyAneWFybiB3b3Jrc3BhY2UgQHdpbGxib29zdGVyL3diIHN0YXJ0IC0td29ya2luZy1kaXIgXCIkSU5JVF9DV0RcIiB2ZXJpZnknO1xuICAgICAgc2NyaXB0c1sndmVyaWZ5LWZ1bGwnXSA9IG9sZFNjcmlwdHNbJ3ZlcmlmeS1mdWxsJ10gPz8gJ3lhcm4gdmVyaWZ5IC0tZnVsbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMudmVyaWZ5ID0gJ3diIHZlcmlmeSc7XG4gICAgICBzY3JpcHRzWyd2ZXJpZnktZnVsbCddID0gJ3diIHZlcmlmeSAtLWZ1bGwnO1xuICAgIH1cbiAgICBhcHBseURhdGFiYXNlU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIGdldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZykpO1xuICAgIGFwcGx5TWlzZVRhc2tTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgWydidWlsZCcsICdkZXYnLCAnc3RhcnQnLCAndGVzdCcsICd0eXBlY2hlY2snXSk7XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkTWFuYWdlR2VuSTE4blRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdpMThuJykpO1xufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICB3YkRiQ29tbWFuZDogc3RyaW5nXG4pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSByZXR1cm47XG5cbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItY3JlYXRlLW1pZ3JhdGlvbicsIGAke3diRGJDb21tYW5kfSBtaWdyYXRlLWRldmApO1xuICBhcHBseURhdGFiYXNlU2NyaXB0KHNjcmlwdHMsIG9sZFNjcmlwdHMsICdkYi1taWdyYXRlJywgYCR7d2JEYkNvbW1hbmR9IG1pZ3JhdGUgLS1jaGVjay1pZGVtcG90ZW5jeWApO1xuICBhcHBseURhdGFiYXNlU2NyaXB0KHNjcmlwdHMsIG9sZFNjcmlwdHMsICdkYi12aWV3JywgYCR7d2JEYkNvbW1hbmR9IHN0dWRpb2ApO1xufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0KFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lOiBzdHJpbmcsXG4gIGdlbmVyYXRlZFNjcmlwdDogc3RyaW5nXG4pOiB2b2lkIHtcbiAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1tuYW1lXTtcbiAgLy8gU29tZSByZXBvc2l0b3JpZXMgd3JhcCBtaWdyYXRpb24gY29tbWFuZHMgdG8gcHJlcGFyZSBTUUxpdGUgZGlyZWN0b3JpZXMsXG4gIC8vIGZhbiBvdXQgb3ZlciB0ZW5hbnRzLCBvciBwZXJmb3JtIGNsZWFudXAgdGhhdCB3YiBjYW5ub3QgaW5mZXIgZ2VuZXJpY2FsbHkuXG4gIHNjcmlwdHNbbmFtZV0gPSBvbGRTY3JpcHQgJiYgIWlzR2VuZXJhdGVkRGF0YWJhc2VTY3JpcHQob2xkU2NyaXB0KSA/IG9sZFNjcmlwdCA6IGdlbmVyYXRlZFNjcmlwdDtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWREYXRhYmFzZVNjcmlwdChzY3JpcHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL1xcYndiXFxzKyg/OmRifHByaXNtYSlcXGIvdS50ZXN0KHNjcmlwdCk7XG59XG5cbmZ1bmN0aW9uIGdldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICd3YiBkYicgfCAnd2IgcHJpc21hJyB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkgcmV0dXJuICd3YiBwcmlzbWEnO1xuICByZXR1cm4gJ3diIGRiJztcbn1cblxuZnVuY3Rpb24gaXNXYlBhY2thZ2UocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYWNrYWdlSnNvbj8ubmFtZSA9PT0gd2JEZXBlbmRlbmN5O1xufVxuXG5mdW5jdGlvbiBhcHBseU1pc2VUYXNrU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lczogc3RyaW5nW11cbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAoIWhhc01pc2VUYXNrKGNvbmZpZywgbmFtZSkpIGNvbnRpbnVlO1xuICAgIGlmIChkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICAvLyBQcmVzZXJ2ZSBhIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudiBwcmVmaXggKGUuZy4gYE1JU0VfRU5WPXRlc3RgKSBvbiBhbiBleGlzdGluZyBtaXNlIGJyaWRnZS5cbiAgICAvLyBTdWNoIGEgcHJlZml4IGlzIHJlcXVpcmVkIGZvciBtaXNlIGNvbmZpZyBlbnZpcm9ubWVudHMgKG1pc2UuPE1JU0VfRU5WPi50b21sKSwgd2hpY2ggYXJlXG4gICAgLy8gc2VsZWN0ZWQgZnJvbSBNSVNFX0VOViAqYmVmb3JlKiBtaXNlIHN0YXJ0cyBhbmQgY2Fubm90IGJlIHN3aXRjaGVkIGZyb20gaW5zaWRlIGEgdGFzazsgZHJvcHBpbmdcbiAgICAvLyBpdCB3b3VsZCBzaWxlbnRseSBydW4gdGhlIHRhc2sgaW4gdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQuXG4gICAgY29uc3QgZW52UHJlZml4ID0gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgob2xkU2NyaXB0c1tuYW1lXSwgbmFtZSk7XG4gICAgaWYgKGVudlByZWZpeCA9PT0gdW5kZWZpbmVkICYmIG9sZFNjcmlwdHNbbmFtZV0gJiYgIShuYW1lIGluIHNjcmlwdHMpKSBjb250aW51ZTtcbiAgICBzY3JpcHRzW25hbWVdID0gYCR7ZW52UHJlZml4ID8/ICcnfW1pc2UgcnVuICR7bmFtZX1gO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGVhZGluZyBgS0VZPVZBTFVFIGAgZW52LXZhciBwcmVmaXggb2YgYW4gZXhpc3RpbmcgYG1pc2UgcnVuIDxuYW1lPmAgYnJpZGdlIHNjcmlwdFxuICogKHBvc3NpYmx5IGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBicmlkZ2UgaGFzIG5vIHByZWZpeCksIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHNjcmlwdCBpcyBub3QgYVxuICogbWlzZSBicmlkZ2UgZm9yIHRoZSBnaXZlbiB0YXNrLlxuICovXG5mdW5jdGlvbiBleHRyYWN0TWlzZUJyaWRnZUVudlByZWZpeChzY3JpcHQ6IHVua25vd24sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gRWFjaCBhc3NpZ25tZW50IHZhbHVlIG1heSBiZSBkb3VibGUtcXVvdGVkLCBzaW5nbGUtcXVvdGVkLCBvciBhbiB1bnF1b3RlZCBydW4gb2Ygbm9uLXdoaXRlc3BhY2UsXG4gIC8vIHNvIHByZWZpeGVzIGxpa2UgYE1JU0VfRU5WPVwiYSBiXCJgICh3aG9zZSB2YWx1ZSBjb250YWlucyBzcGFjZXMpIGFyZSBtYXRjaGVkIGluc3RlYWQgb2YgZHJvcHBlZC5cbiAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXigoPzpcXHcrPSg/OlwiW15cIl0qXCJ8J1teJ10qJ3xcXFMrKVxccyspKiltaXNlIHJ1biAke2VzY2FwZVJlZ0V4cChuYW1lKX0kYCwgJ3UnKS5leGVjKFxuICAgIHNjcmlwdC50cmltKClcbiAgKTtcbiAgcmV0dXJuIG1hdGNoPy5bMV07XG59XG5cbmZ1bmN0aW9uIGhhc01pc2VUYXNrKGNvbmZpZzogUGFja2FnZUNvbmZpZywgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QuaGFzT3duKGNvbmZpZy5taXNlVGFza3MsIG5hbWUpO1xufVxuXG5mdW5jdGlvbiBkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0YXNrID0gY29uZmlnLm1pc2VUYXNrc1tuYW1lXTtcbiAgaWYgKCF0YXNrKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VycyA9IFsnYnVuJywgJ3lhcm4nLCAnbnBtJywgJ3BucG0nXTtcbiAgcmV0dXJuIHBhY2thZ2VNYW5hZ2Vycy5zb21lKChwYWNrYWdlTWFuYWdlcikgPT5cbiAgICBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXFxiJHtwYWNrYWdlTWFuYWdlcn1cXHMrKD86cnVuXFxzKyk/JHtlc2NhcGVSZWdFeHAobmFtZSl9KD8hW2EtekEtWjAtOV9cXC06Ll0pYCwgJ3UnKS50ZXN0KHRhc2spXG4gICk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVGb3JtYXRTY3JpcHQoaGFzSnNPclRzOiBib29sZWFuLCBoYXNKYXZhOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgY29tbWFuZHMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGlmIChoYXNKc09yVHMpIHtcbiAgICBjb21tYW5kcy5wdXNoKCd5YXJuIGZvcm1hdC1jb2RlJyk7XG4gIH1cbiAgaWYgKGhhc0phdmEpIHtcbiAgICBjb21tYW5kcy5wdXNoKCd5YXJuIHByZXR0aWZ5Jyk7XG4gIH1cbiAgcmV0dXJuIGNvbW1hbmRzLmpvaW4oJyAmJiAnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpLmNhdGNoKCgpID0+ICcnKTtcbiAgY29uc3QgaW5kZXggPSBleGlzdGluZ0NvbnRlbnQuaW5kZXhPZihpZ25vcmVGaWxlVXRpbC5zZXBhcmF0b3JQcmVmaXgpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZXhpc3RpbmdDb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgY29uc3QgbGluZXMgPSBvcmlnaW5hbENvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgcmV0dXJuIG5ld0xpbmUuZW5kc1dpdGgoJy8nKSA/IG5ld0xpbmUuc2xpY2UoMCwgLTEpIDogbmV3TGluZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGwpID0+IGwgJiYgIWwuc3RhcnRzV2l0aCgnIycpICYmICFsLmluY2x1ZGVzKCcvJykpO1xuXG4gIHJldHVybiBgJHtsaW5lcy5tYXAoKGxpbmUpID0+IGAgXCIhKiovJHtsaW5lfS8qKlwiYCkuam9pbignJyl9IHx8IHRydWVgO1xufVxuXG5mdW5jdGlvbiByZW1vdmVQcmV0dGllckFydGlmYWN0cyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBqc29uT2JqLnByZXR0aWVyO1xuICBjb25zdCBkZXBlbmRlbmN5U2VjdGlvbnM6IEFycmF5PFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gfCB1bmRlZmluZWQ+ID0gW1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLFxuICAgIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyxcbiAgXTtcbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGRlcGVuZGVuY3lTZWN0aW9ucykge1xuICAgIGlmICghc2VjdGlvbikgY29udGludWU7XG4gICAgZGVsZXRlIHNlY3Rpb24ucHJldHRpZXI7XG4gICAgZGVsZXRlIHNlY3Rpb25bJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJ107XG4gICAgZGVsZXRlIHNlY3Rpb25bJ3ByZXR0aWVyLXBsdWdpbi1wcmlzbWEnXTtcbiAgICBkZWxldGUgc2VjdGlvblsnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyddO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2F1dGgnLCByZXBvOiAnYXV0aCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQGRpc2NvcmQtYm90L3NoYXJlZCcsIHJlcG86ICdkaXNjb3JkLWJvdCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCByZXBvOiAnY29kZS1hbmFseXplcicsIHRhcmdldDogJ2RldkRlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2p1ZGdlJywgcmVwbzogJ2p1ZGdlJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IHBhY2thZ2VOYW1lLCByZXBvLCB0YXJnZXQgfSkgPT4ge1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSB8fCBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgcGFja2FnZU5hbWUpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gdGFyZ2V0ID09PSAnZGVwZW5kZW5jaWVzJyA/ICdkZXZEZXBlbmRlbmNpZXMnIDogJ2RlcGVuZGVuY2llcyc7XG4gICAgICAvLyBUaGUgbGludCBydWxlIGRpc2FsbG93cyBgZGVsZXRlYCB3aXRoIGNvbXB1dGVkIHBhY2thZ2UgbmFtZXM7IFJlZmxlY3QgaGFzIHRoZSBzYW1lIGRlbGV0aW9uIHNlbWFudGljcyBoZXJlLlxuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqW290aGVyVGFyZ2V0XSwgcGFja2FnZU5hbWUpO1xuICAgICAganNvbk9ialt0YXJnZXRdW3BhY2thZ2VOYW1lXSA9IGF3YWl0IGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG8pO1xuICAgIH0pXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsIHJlcG8pO1xuICByZXR1cm4gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiLyR7cmVwb30uZ2l0IyR7Y29tbWl0SGFzaH1gO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBkdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2V0R2VuSTE4blRzQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2dlbkkxOG5Ucy5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuaW50ZXJmYWNlIExlZnRob29rU2V0dGluZ3Mge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJztcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG59XG5cbmludGVyZmFjZSBMZWZ0aG9va0pvYiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZ2xvYj86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICBzY3JpcHQ/OiBzdHJpbmc7XG4gIHJ1bm5lcj86ICdiYXNoJztcbiAgc3RhZ2VfZml4ZWQ/OiB0cnVlO1xufVxuXG5jb25zdCBiYXNlU2V0dGluZ3M6IE9taXQ8TGVmdGhvb2tTZXR0aW5ncywgJ3ByZS1jb21taXQnPiA9IHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3RhcicsXG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3ByZXBhcmUnLFxuICAgICAgICBzY3JpcHQ6ICdwcmVwYXJlLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdjaGVjaycsXG4gICAgICAgIHNjcmlwdDogJ2NoZWNrLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG5jb25zdCBwcmVDb21taXRTZXR0aW5nczogTGVmdGhvb2tTZXR0aW5nc1sncHJlLWNvbW1pdCddID0ge1xuICBqb2JzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2NsZWFudXAnLFxuICAgICAgZ2xvYjogJycsXG4gICAgICBydW46ICcnLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnY2hlY2stbWlncmF0aW9ucycsXG4gICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICBydW46IGBcbmZhaWxlZD0wXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbmZvciBmaWxlIGluIHtzdGFnZWRfZmlsZXN9OyBkb1xuICBpZiBncmVwIC1xICdXYXJuaW5nczonIFwiJGZpbGVcIjsgdGhlblxuICAgIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGUgKCRmaWxlKSBjb250YWlucyB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gICAgZmFpbGVkPTFcbiAgZmlcbmRvbmVcbmV4aXQgXCIkZmFpbGVkXCJcbmAudHJpbSgpLFxuICAgIH0sXG4gIF0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwb3N0TWVyZ2U6IGBcbiMhL2Jpbi9iYXNoXG5cbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IGh1c2t5RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreScpO1xuICBjb25zdCBoYXNIdXNreURpciA9IGZzLmV4aXN0c1N5bmMoaHVza3lEaXJQYXRoKTtcbiAgY29uc3QgeyBsaW50IH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCB7fSk7XG4gIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPExlZnRob29rU2V0dGluZ3M+ID0ge1xuICAgIC4uLmJhc2VTZXR0aW5ncyxcbiAgICAncHJlLWNvbW1pdCc6IHtcbiAgICAgIGpvYnM6IGdldFByZUNvbW1pdEpvYnMoY29uZmlnKSxcbiAgICB9LFxuICB9O1xuICBpZiAoIWxpbnQpIHtcbiAgICBkZWxldGUgc2V0dGluZ3NbJ3ByZS1wdXNoJ107XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShcbiAgICAgIHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2xlZnRob29rLnltbCcpLFxuICAgICAgeWFtbC5kdW1wKHNldHRpbmdzLCB7XG4gICAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgICAgc3R5bGVzOiB7XG4gICAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcbiAgaWYgKGhhc0h1c2t5RGlyKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZnMucHJvbWlzZXMucm0oaHVza3lEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSksXG4gICAgXSk7XG4gICAgc3Bhd25TeW5jKCdnaXQnLCBbJ2NvbmZpZycsICctLXVuc2V0JywgJ2NvcmUuaG9va3NQYXRoJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChsaW50KSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBsZXQgbGludENvbW1hbmQ6IHN0cmluZztcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIC8vIEJ1biByZXBvcyByZWNlaXZlIHdiIGFzIHBhcnQgb2Ygd2JmeSdzIG1hbmFnZWQgdG9vbGNoYWluLCBzbyBnZW5lcmF0ZSB0aGVcbiAgICAvLyBmaW5hbCBob29rIGNvbW1hbmQgb24gdGhlIGZpcnN0IHJ1biBpbnN0ZWFkIG9mIGNoYW5naW5nIGl0IG9uIHRoZSBzZWNvbmQuXG4gICAgbGludENvbW1hbmQgPSAnYnVuIHdiIGxpbnQnO1xuICB9IGVsc2Uge1xuICAgIGxpbnRDb21tYW5kID0gY29uZmlnLmRlcGVuZGluZy53YiA/ICd5YXJuIHdiIGxpbnQnIDogJ3lhcm4gcnVuIGxpbnQnO1xuICB9XG4gIGNvbnN0IHF1aWV0TGludENvbW1hbmQgPSBgJHtsaW50Q29tbWFuZH0gLS1xdWlldGA7XG4gIC8vIE5vIHNlcGFyYXRlIHR5cGVjaGVjayBzdGVwIG5lZWRlZCDigJQgdGhlIGxpbnQgY29tbWFuZCBhbHJlYWR5IGluY2x1ZGVzIHR5cGVjaGVja2luZy5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICByZXR1cm4gYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbiR7cXVpZXRMaW50Q29tbWFuZH1cbmAudHJpbSgpO1xuICB9XG4gIHJldHVybiBxdWlldExpbnRDb21tYW5kO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IExlZnRob29rSm9iW10ge1xuICByZXR1cm4gcHJlQ29tbWl0U2V0dGluZ3Muam9icy5tYXAoKGpvYikgPT5cbiAgICBqb2IubmFtZSA9PT0gJ2NsZWFudXAnXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5qb2IsXG4gICAgICAgICAgZ2xvYjogZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZyksXG4gICAgICAgICAgcnVuOiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWcpLFxuICAgICAgICB9XG4gICAgICA6IGpvYlxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gTGV0IGB3YiBsaW50IC0tZm9ybWF0YCBkZWNpZGUgd2hldGhlciBQcmV0dGllciBpcyBhdmFpbGFibGU7IHRoZSBob29rXG4gIC8vIHN0aWxsIG5lZWRzIHRvIHRyaWdnZXIgd2hlbiBhZGRpbmcgdGhlIGZpcnN0IHByZXR0aWVyLW9ubHkgZmlsZS5cbiAgY29uc3Qgc3VwcG9ydGVkRXh0ZW5zaW9ucyA9XG4gICAgY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykgPyBbLi4uZXh0ZW5zaW9ucy5wcmV0dGllck9ubHldIDogW107XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKC4uLmV4dGVuc2lvbnMub3hmbXQsIC4uLmV4dGVuc2lvbnMub3hsaW50KTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ3B5Jyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdkYXJ0Jyk7XG4gIH1cbiAgY29uc3QgZmlsdGVyZWRFeHRlbnNpb25zID0gWy4uLm5ldyBTZXQoc3VwcG9ydGVkRXh0ZW5zaW9ucyldLnRvU29ydGVkKCk7XG4gIHJldHVybiBgKiovKi57JHtmaWx0ZXJlZEV4dGVuc2lvbnMuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWcpKSB7XG4gICAgcmV0dXJuIFN0cmluZy5yYXdgXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbnlhcm4gd29ya3NwYWNlIEB3aWxsYm9vc3Rlci93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbClcIiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuICAvLyBQeXRob24tb25seSBCdW4gcmVwb3MgaW5zdGFsbCB3YiBmb3Igc2hhcmVkIHNjcmlwdHMgYnV0IG5vdCBPeGxpbnQsIHNvXG4gIC8vIHN0YWdlZC1maWxlIGhvb2tzIG11c3QgdXNlIHRoZSBsYW5ndWFnZS1zcGVjaWZpYyBmb3JtYXR0ZXIgcGF0aCBiZWxvdy5cbiAgY29uc3QgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gIGlmICgoY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcud2IpICYmIGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMpIHtcbiAgICByZXR1cm4gYFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG4ke2NvbmZpZy5pc0J1biA/ICdidW4gd2InIDogJ3lhcm4gd2InfSBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuXG4gIGNvbnN0IG94bGludFBhdHRlcm4gPSBleHRlbnNpb25zLm94bGludC5tYXAoKGV4dGVuc2lvbikgPT4gU3RyaW5nLnJhd2BcXC4ke2V4dGVuc2lvbn0kYCkuam9pbignfCcpO1xuICBjb25zdCBveGZtdFBhdHRlcm4gPSBleHRlbnNpb25zLm94Zm10Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IHByZXR0aWVyUGF0dGVybiA9IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG4gIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcblxuICByZXR1cm4gU3RyaW5nLnJhd2BcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxuJHtoYXNKc09yVHMgPyBTdHJpbmcucmF3YG94bGludF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoJHtveGxpbnRQYXR0ZXJufSknIHx8IHRydWUpXCJgIDogJyd9XG4ke2hhc0pzT3JUcyA/IFN0cmluZy5yYXdgb3hmbXRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKCR7b3hmbXRQYXR0ZXJufSknIHwgZ3JlcCAtdiAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2hhc0phdmEgPyBTdHJpbmcucmF3YHByZXR0aWVyX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke3ByZXR0aWVyUGF0dGVybn0pJyB8fCB0cnVlKVwiYCA6ICcnfVxucGFja2FnZV9qc29uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiXG4ke2hhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZykgPyBTdHJpbmcucmF3YHB5dGhvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5weSQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2NvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sID8gU3RyaW5nLnJhd2BkYXJ0X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLmRhcnQkJyB8IGdyZXAgLXYgJ2dlbmVyYXRlZCcgfCBncmVwIC12ICdcXC5mcmVlemVkXFwuZGFydCQnIHwgZ3JlcCAtdiAnXFwuZ1xcLmRhcnQkJyB8fCB0cnVlKVwiYCA6ICcnfVxuXG4ke1xuICBoYXNKc09yVHNcbiAgICA/IFN0cmluZy5yYXdgXG5pZiBbIC1uIFwiJG94Zm10X2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL294Zm10IC0td3JpdGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAnISoqL3BhY2thZ2UuanNvbicgJG94Zm10X2ZpbGVzXG5maVxuYFxuICAgIDogJydcbn1cbiR7XG4gIGhhc0phdmFcbiAgICA/IFN0cmluZy5yYXdgaWYgWyAtbiBcIiRwcmV0dGllcl9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUgLS1pZ25vcmUtdW5rbm93biAtLSAkcHJldHRpZXJfZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGhhc0pzT3JUc1xuICAgID8gU3RyaW5nLnJhd2BcbmlmIFsgLW4gXCIkb3hsaW50X2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL294bGludCAtLWZpeCAkb3hsaW50X2ZpbGVzXG5maVxuYFxuICAgIDogJydcbn1cbmlmIFsgLW4gXCIkcGFja2FnZV9qc29uX2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3NvcnQtcGFja2FnZS1qc29uIC0tICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcyAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGJsYWNrICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5oYXNWZXJzaW9uU2V0dGluZ3MpIHtcbiAgICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWx8XFwudG9vbC12ZXJzaW9uc3xcXC4uKy12ZXJzaW9uKWA7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJ1dlxcLmxvY2tcIiBcInV2IHN5bmMgLS1mcm96ZW5cImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi93YiBwcmlzbWEgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL3diIHByaXNtYSBnZW5lcmF0ZVwiYFxuICAgICk7XG4gIH1cbiAgY29uc3QgZ2VuSTE4blRzQ29tbWFuZCA9IGdldEdlbkkxOG5Uc0NvbW1hbmQoY29uZmlnLCBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMpO1xuICBpZiAoZ2VuSTE4blRzQ29tbWFuZCkge1xuICAgIC8vIGdlbi1pMThuLXRzIG91dHB1dHMgYXJlIGNvbW1vbmx5IGlnbm9yZWQsIHNvIHBvc3QtbWVyZ2UgcmVnZW5lcmF0ZXMgdGhlbSBhZnRlciBwdWxsZWQgcmVzb3VyY2UgY2hhbmdlcy5cbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIoXnwvKWkxOG4vLipcXC5qc29uJFwiIFwiJHtnZW5JMThuVHNDb21tYW5kfVwiYCk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuXG5mdW5jdGlvbiBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25SdW5uZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeSBydW4nIHwgJ3V2IHJ1bicge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluVXZMb2NrID8gJ3V2IHJ1bicgOiAncG9ldHJ5IHJ1bic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMaW50c3RhZ2VkcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmNqc2AsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmpzYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuanNvbmAsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgIF0pO1xuICB9KTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb25maWdDb250ZW50KGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZW50Py50cmltKCk7XG59XG4iLCJleHBvcnQgdHlwZSBDb25maWdCbG9ja05hbWUgPSAnYmFzZScgfCAnZXhwb3J0JztcblxuaW50ZXJmYWNlIE1hbmFnZWRDb25maWdCbG9ja3NPcHRpb25zIHtcbiAgYmxvY2tOYW1lczogcmVhZG9ubHkgQ29uZmlnQmxvY2tOYW1lW107XG4gIG1hcmtlclByZWZpeDogc3RyaW5nO1xuICB0b29sTmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgR2V0Q29uZmlnQ29udGVudE9wdGlvbnMge1xuICBkZXNpcmVkQ29udGVudDogc3RyaW5nO1xuICBleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZmlsZVBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE1hbmFnZWRDb25maWdCbG9ja3Mge1xuICBwcml2YXRlIHJlYWRvbmx5IGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWFya2VyUHJlZml4OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0b29sTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1hbmFnZWRDb25maWdCbG9ja3NPcHRpb25zKSB7XG4gICAgdGhpcy5ibG9ja05hbWVzID0gb3B0aW9ucy5ibG9ja05hbWVzO1xuICAgIHRoaXMubWFya2VyUHJlZml4ID0gb3B0aW9ucy5tYXJrZXJQcmVmaXg7XG4gICAgdGhpcy50b29sTmFtZSA9IG9wdGlvbnMudG9vbE5hbWU7XG4gIH1cblxuICBnZXRDb25maWdDb250ZW50KG9wdGlvbnM6IEdldENvbmZpZ0NvbnRlbnRPcHRpb25zKTogc3RyaW5nIHtcbiAgICBpZiAoIW9wdGlvbnMuZXhpc3RpbmdDb250ZW50KSByZXR1cm4gb3B0aW9ucy5kZXNpcmVkQ29udGVudDtcbiAgICBpZiAodGhpcy5oYXNNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZU1hbmFnZWRCbG9ja3Mob3B0aW9ucy5leGlzdGluZ0NvbnRlbnQsIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQsIG9wdGlvbnMuZmlsZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucy5kZXNpcmVkQ29udGVudDtcbiAgfVxuXG4gIGdldEJsb2NrKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lLCBjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSl9XG4ke2NvbnRlbnR9XG4ke3RoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSl9YDtcbiAgfVxuXG4gIGhhc01hbmFnZWRCbG9ja3MoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2tOYW1lcy5zb21lKChibG9ja05hbWUpID0+IGNvbnRlbnQuaW5jbHVkZXModGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKSk7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudDogc3RyaW5nLCBkZXNpcmVkQ29udGVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgY29udGVudCA9IGV4aXN0aW5nQ29udGVudDtcbiAgICBmb3IgKGNvbnN0IGJsb2NrTmFtZSBvZiB0aGlzLmJsb2NrTmFtZXMpIHtcbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gdGhpcy5leHRyYWN0TWFuYWdlZEJsb2NrKGRlc2lyZWRDb250ZW50LCBibG9ja05hbWUpO1xuICAgICAgaWYgKCFyZXBsYWNlbWVudCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG5leHRDb250ZW50ID0gdGhpcy5yZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQsIGJsb2NrTmFtZSwgcmVwbGFjZW1lbnQpO1xuICAgICAgaWYgKCFuZXh0Q29udGVudCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXBkYXRpbmcgaW5jb21wbGV0ZSAke2Jsb2NrTmFtZX0gYmxvY2sgaW4gJHt0aGlzLnRvb2xOYW1lfSBjb25maWc6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0NvbnRlbnQ7XG4gICAgICB9XG4gICAgICBjb250ZW50ID0gbmV4dENvbnRlbnQ7XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0TWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpLmV4ZWMoY29udGVudCk/LlswXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lLCByZXBsYWNlbWVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKTtcbiAgICBpZiAoIXBhdHRlcm4udGVzdChjb250ZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogUmVnRXhwIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChcbiAgICAgIGAke2VzY2FwZVJlZ0V4cCh0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpfVtcXFxcc1xcXFxTXSo/JHtlc2NhcGVSZWdFeHAodGhpcy5nZXRFbmRNYXJrZXIoYmxvY2tOYW1lKSl9YFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC8vIHdiZnk6c3RhcnQgJHt0aGlzLm1hcmtlclByZWZpeH0tJHtibG9ja05hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW5kTWFya2VyKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC8vIHdiZnk6ZW5kICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hmbXQnLFxuICB0b29sTmFtZTogJ294Zm10Jyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94Zm10Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxlZ2FjeUpzb25Db25maWdQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm94Zm10cmMuanNvbicpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hmbXQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgZGVzaXJlZENvbnRlbnQ6IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKSxcbiAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgIGZpbGVQYXRoLFxuICAgIH0pO1xuICAgIGNvbnN0IHByb21pc2VzID0gW3Byb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShsZWdhY3lKc29uQ29uZmlnUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSldO1xuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCkpKTtcbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBDb21tb25KUyBwYWNrYWdlcyBuZWVkIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMgaGVyZTogb3hmbXQgY29uZmlnIGZpbGVzIGFyZVxuICAvLyBvbmx5IGF1dG8tZGlzY292ZXJlZCBhcyAudHMsIGFuZCB0aGUgc2hhcmVkIGNvbmZpZyBwYWNrYWdlIGlzIEVTTS1vbmx5LlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIm5vZGVcIiAvPlxuaW1wb3J0IHR5cGUgeyBPeGZtdENvbmZpZyB9IGZyb20gJ294Zm10JztcblxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94Zm10IGNvbmZpZyBmaWxlcyBhcmUgb25seSBhdXRvLWRpc2NvdmVyZWQgYXMgLnRzLCBhbmQgQ29tbW9uSlMgYXZvaWRzIEVTTSBwYWNrYWdlIGxvYWRpbmcgaXNzdWVzLlxuY29uc3Qgb3hmbXRDb25maWcgPSByZXF1aXJlKCdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyk7XG5cbmNvbnN0IG94Zm10UmVzb2x2ZWRDb25maWc6IE94Zm10Q29uZmlnID0gb3hmbXRDb25maWcuZGVmYXVsdCA/PyBveGZtdENvbmZpZztgXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICdiYXNlJyxcbiAgICBgaW1wb3J0IHR5cGUgeyBPeGZtdENvbmZpZyB9IGZyb20gJ294Zm10JztcblxuaW1wb3J0IGNvbmZpZyBmcm9tICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJztcblxuY29uc3Qgb3hmbXRSZXNvbHZlZENvbmZpZzogT3hmbXRDb25maWcgPSBjb25maWc7YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hsaW50JyxcbiAgdG9vbE5hbWU6ICdveGxpbnQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIF9yb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGxpbnRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgY29uZmlnIGZpbGVzIGFzIHByb2R1Y3QgY29kZSwgc28gbWlncmF0aW9uXG4gICAgLy8gbXVzdCBub3QgcmVtb3ZlIHBhY2thZ2UtcHJvdmlkZWQgbGludGVyIHNldHRpbmdzLiBHZW5lcmF0ZWQgZmlsZXMgd2l0aFxuICAgIC8vIG1hbmFnZWQgYmxvY2tzIGFyZSBzdGlsbCBzYWZlIHRvIHVwZGF0ZS5cbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyA9IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hsaW50LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50ID1cbiAgICAgIHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnICYmIGV4aXN0aW5nQ29udGVudCAmJiAhbWFuYWdlZENvbmZpZ0Jsb2Nrcy5oYXNNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nQ29udGVudFxuICAgICAgPyBleGlzdGluZ0NvbnRlbnRcbiAgICAgIDogcmVwbGFjZUxlZ2FjeUNvbmZpZ1JlZmVyZW5jZXMoXG4gICAgICAgICAgbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgICAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICAgICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGlmICghc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcpIHtcbiAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcub3hsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5janMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy55YW1sJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy50cycpLCB7IGZvcmNlOiB0cnVlIH0pKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlTGVnYWN5Q29uZmlnUmVmZXJlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlQWxsKC8oPzwhWy4vXSlcXGJjb25maWdcXC4vZ3UsICdveGxpbnRSZXNvbHZlZENvbmZpZy4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBpc1Jvb3RDb25maWcgPSBjb25maWcuaXNSb290O1xuICBjb25zdCBveGxpbnRCYXNlQ29uZmlnTW9kdWxlID0gZ2V0T3hsaW50QmFzZUNvbmZpZ01vZHVsZShjb25maWcpO1xuXG4gIC8vIERvIG5vdCBjb2xsYXBzZSB0aGlzIHRvIGEgc3RhdGljIGltcG9ydCBmb3IgZXZlcnkgcGFja2FnZS4gQ29tbW9uSlMgcGFja2FnZXNcbiAgLy8gdHlwZS1jaGVjayBhdXRvLWRpc2NvdmVyZWQgb3hsaW50LmNvbmZpZy50cyBhcyBDb21tb25KUywgc28gaW1wb3J0aW5nIHRoZSBFU01cbiAgLy8gQHdpbGxib29zdGVyL294bGludC1jb25maWcgcGFja2FnZSB0cmlnZ2VycyBUUzE0NzkuIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGhcbiAgLy8gbGl0ZXJhY3ktdGVzdCdzIGdlbmVyYXRlZCBjb25maWcgcGF0dGVybi5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJub2RlXCIgLz5cbmltcG9ydCB0eXBlIHsgT3hsaW50Q29uZmlnIH0gZnJvbSAnb3hsaW50JztcblxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94bGludCBvbmx5IGF1dG8tZGlzY292ZXJzIC50cyBjb25maWcgZmlsZXMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGxpbnRCYXNlQ29uZmlnID0gcmVxdWlyZSgnQHdpbGxib29zdGVyL294bGludC1jb25maWcnKTtcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcuZGVmYXVsdCA/PyBveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCB0eXBlIHsgT3hsaW50Q29uZmlnIH0gZnJvbSAnb3hsaW50JztcblxuaW1wb3J0IG94bGludEJhc2VDb25maWcgZnJvbSAnJHtveGxpbnRCYXNlQ29uZmlnTW9kdWxlfSc7XG5cbiR7Z2V0UmVzb2x2ZWRDb25maWdDb250ZW50KCdveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ2V4cG9ydCBkZWZhdWx0IG94bGludFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3hsaW50QmFzZUNvbmZpZ01vZHVsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLnBhY2thZ2VKc29uPy5uYW1lID09PSAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnID8gJy4vY29uZmlnLm1qcycgOiAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnO1xufVxuXG5mdW5jdGlvbiBnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoYmFzZUNvbmZpZ05hbWU6IHN0cmluZywgaXNSb290Q29uZmlnOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGlzUm9vdENvbmZpZykge1xuICAgIHJldHVybiBgLy8gS2VlcCBhIHBhY2thZ2UtbG9jYWwgY29weSBzbyByZXBvc2l0b3JpZXMgY2FuIGFkZCBzZXR0aW5ncyBvdXRzaWRlXG4vLyBtYW5hZ2VkIGJsb2NrcyB3aXRob3V0IG11dGF0aW5nIHRoZSBzaGFyZWQgaW1wb3J0ZWQgY29uZmlnIG9iamVjdC5cbmNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBPeGxpbnRDb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUoJHtiYXNlQ29uZmlnTmFtZX0pO1xuLy8gVGhlIHR5cGUtYXdhcmUgb3B0aW9ucyBtYWtlIGxpbnQgcGVyZm9ybSB0eXBlIGNoZWNraW5nLiBBbHdheXMgZm9yY2UgdGhlbSBvbiBoZXJlLFxuLy8gaW5zaWRlIHRoZSBtYW5hZ2VkIGJsb2NrLCBzbyBubyBjdXN0b21pemF0aW9uIGNhbiBzaWxlbnRseSBkaXNhYmxlIHR5cGUgY2hlY2tpbmcuXG5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zID0geyAuLi5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zLCB0eXBlQXdhcmU6IHRydWUsIHR5cGVDaGVjazogdHJ1ZSB9O2A7XG4gIH1cblxuICByZXR1cm4gYC8vIE94bGludCByZWplY3RzIHRoZSByb290LW9ubHkgdHlwZS1hd2FyZSBvcHRpb25zIG91dHNpZGUgdGhlIHJvb3QgY29uZmlnLCBzbyBkZWxldGUgdGhlbVxuLy8gaGVyZS4gVGhpcyBkb2VzIE5PVCBkaXNhYmxlIHR5cGUgY2hlY2tpbmc6IHRoZSBsaW50IGNvbW1hbmRzIHBhc3MgdGhlIC0tdHlwZS1hd2FyZSBhbmRcbi8vIC0tdHlwZS1jaGVjayBmbGFncyBleHBsaWNpdGx5LlxuY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWc6IE94bGludENvbmZpZyA9IHN0cnVjdHVyZWRDbG9uZSgke2Jhc2VDb25maWdOYW1lfSk7XG5kZWxldGUgb3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucztgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGlmICghZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG1hbmFnZWRTY3JpcHRzQmxvY2sgPSBgc2NyaXB0cy8qKlxuIXNjcmlwdHMvXG4hc2NyaXB0cy8qLnNoYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFJhaWx3YXlpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UmFpbHdheWlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXnNjcmlwdHNcXC8kL20sIG1hbmFnZWRTY3JpcHRzQmxvY2spO1xuICAgIGlmIChuZXdDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkge1xuICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLmV4aXN0c1N5bmMod29ya2Zsb3dzUGF0aCkgPyBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NQYXRoKSA6IFtdO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuXG4gICAgICBsZXQgYmFkZ2VOYW1lID0gZmlsZU5hbWU7XG4gICAgICBiYWRnZU5hbWUgPSAoYmFkZ2VOYW1lWzBdIHx8ICcnKS50b1VwcGVyQ2FzZSgpICsgYmFkZ2VOYW1lLnNsaWNlKDEsIGJhZGdlTmFtZS5pbmRleE9mKCcuJykpO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgICAgaWYgKCFyZXBvc2l0b3J5KSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGJhZGdlID0gYFshWyR7YmFkZ2VOYW1lfV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0vYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0pYDtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC5naXRodWIvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZW1vdmVHaXRIdWJBY3Rpb25zQmFkZ2UobmV3Q29udGVudCwgYmFkZ2VOYW1lLCBmaWxlTmFtZSk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBiYWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOaXouOBq2JhZGdl44GM44GC44KL5aC05ZCI44Gv5YmK6ZmkXG4gIHJlYWRtZSA9IHJlYWRtZS5yZXBsYWNlKGJhZGdlLCAnJykucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFkbWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVhZG1lW2kgLSAxXSA9PT0gJ1xcbicgJiYgcmVhZG1lW2ldID09PSAnXFxuJykge1xuICAgICAgY29uc3QgYmVmb3JlID0gcmVhZG1lLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgIGxldCBhZnRlciA9IHJlYWRtZS5zbGljZShpICsgMSk7XG4gICAgICBpZiAoIWFmdGVyLnN0YXJ0c1dpdGgoJ1snKSAmJiAhYWZ0ZXIuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgIGFmdGVyID0gYFxcbiR7YWZ0ZXJ9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtiZWZvcmV9JHtiYWRnZX1cXG4ke2FmdGVyfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHtyZWFkbWV9XFxuJHtiYWRnZX1cXG5gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlR2l0SHViQWN0aW9uc0JhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZU5hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGVzY2FwZWRCYWRnZU5hbWUgPSBlc2NhcGVSZWdFeHAoYmFkZ2VOYW1lKTtcbiAgY29uc3QgZXNjYXBlZEZpbGVOYW1lID0gZXNjYXBlUmVnRXhwKGZpbGVOYW1lKTtcbiAgcmV0dXJuIHJlYWRtZVxuICAgIC5yZXBsYWNlQWxsKFxuICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgU3RyaW5nLnJhd2BcXFshXFxbJHtlc2NhcGVkQmFkZ2VOYW1lfVxcXVxcKGh0dHBzOi8vZ2l0aHViXFwuY29tL1teL1xccyldKy9bXi9cXHMpXSsvYWN0aW9ucy93b3JrZmxvd3MvJHtlc2NhcGVkRmlsZU5hbWV9L2JhZGdlXFwuc3ZnXFwpXFxdXFwoaHR0cHM6Ly9naXRodWJcXC5jb20vW14vXFxzKV0rL1teL1xccyldKy9hY3Rpb25zL3dvcmtmbG93cy8ke2VzY2FwZWRGaWxlTmFtZX1cXClcXG4/YCxcbiAgICAgICAgJ2d1J1xuICAgICAgKSxcbiAgICAgICcnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucyA/PyBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbkVudHJ5ID0gcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IGlzQXJyYXkgPyBwbHVnaW5FbnRyeVswXSA6IHBsdWdpbkVudHJ5O1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKGlzQXJyYXkgJiYgcGx1Z2luRW50cnlbMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFsnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbjUnXSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSBPbWl0PHR5cGVvZiBqc29uT2JqLCAnZXh0ZW5kcyc+ICYge1xuICBleHRlbmRzPzogc3RyaW5nW107XG4gIHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W107XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopIGFzIFNldHRpbmdzO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncmVub3ZhdGUuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2ZpbGVQYXRofTVgKSkge1xuICAgICAgLy8gU2luY2UgaXQgaXMgZGlmZmljdWx0IGZvciBwYXJzaW5nIHJlbm92YXRlLmpzb241LCB3ZSBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVJlbm92YXRlRXh0ZW5kcyhqc29uT2JqLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMgPz8gW10pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMuc29tZSgocnVsZTogeyBtYXRjaFBhY2thZ2VOYW1lcz86IHN0cmluZ1tdIH0pID0+XG4gICAgICAgICAgcnVsZS5tYXRjaFBhY2thZ2VOYW1lcz8uaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUmVub3ZhdGVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHM6IHN0cmluZ1tdLCBleGlzdGluZ0V4dGVuZHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLmdlbmVyYXRlZEV4dGVuZHMsIC4uLmV4aXN0aW5nRXh0ZW5kc10pXS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbn1cbiIsImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBZ2VudFNraWxscyhfcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2luc3RhbGxBZ2VudFNraWxscycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUT0RPOiBXZSBhcmUgdGVtcG9yYXJpbHkgbm90IGluc3RhbGxpbmcgbWFuYWdlZCBhZ2VudCBza2lsbHMgaW50byByZXBvcy5cbiAgICAvLyBhd2FpdCBydW5JbnN0YWxsQWdlbnRTa2lsbHMoX3Jvb3RDb25maWcpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnRXh0ZW5kcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5cbmNvbnN0IHJvb3RKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3BhY2thZ2VzLyovdGVzdC9maXh0dXJlcycsICd0ZXN0L2ZpeHR1cmVzJ10sXG4gIGluY2x1ZGU6IFtcbiAgICAnKi5jb25maWcudHMnLFxuICAgICdwYWNrYWdlcy8qLyouY29uZmlnLnRzJyxcbiAgICAncGFja2FnZXMvKi9zY3JpcHRzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NyYy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi90ZXN0LyoqLyonLFxuICAgICdzY3JpcHRzLyoqLyonLFxuICAgICdzcmMvKiovKicsXG4gICAgJ3Rlc3QvKiovKicsXG4gIF0sXG59O1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgLy8gd2JmeSBnZW5lcmF0ZXMgcm9vdC1sZXZlbCB0b29sIGNvbmZpZ3Mgc3VjaCBhcyBwbGF5d3JpZ2h0LmNvbmZpZy50cywgYW5kXG4gIC8vIHR5cGUtYXdhcmUgbGludGluZyBuZWVkcyB0aG9zZSBmaWxlcyBpbiB0aGUgcHJvamVjdCB0byBzZWUgTm9kZS9CdW4gZ2xvYmFscy5cbiAgaW5jbHVkZTogWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgYXdhaXQgY2xlYW51cExlZ2FjeVRzY29uZmlnTW9kdWxlU2V0dGluZ3MoY29uZmlnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpciA9IGdldFJvb3REaXIoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHR5cGVzOiBnZW5lcmF0ZWRUeXBlcyB9O1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNCdW4gJiYgIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBqc3g6ICdyZWFjdC1qc3gnIH07XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgICBuZXdTZXR0aW5ncy5leGNsdWRlID0gbmV3U2V0dGluZ3MuZXhjbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIC8vIFByaXNtYSBzZWVkcyBhbmQgbWlncmF0aW9uIGhlbHBlciBzY3JpcHRzIG9mdGVuIGxpdmUgb3V0c2lkZSBzcmMsIGJ1dFxuICAgICAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIHN0aWxsIG5lZWRzIHRoZW0gY292ZXJlZCBieSB0aGUgcHJvamVjdCBjb25maWcuXG4gICAgICBhZGRJbmNsdWRlUGF0aChuZXdTZXR0aW5ncywgJ3ByaXNtYS8qKi8qJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgVHNDb25maWdKc29uO1xuICAgICAgY29uc3QgZXhpc3RpbmdUeXBlcyA9IG5vcm1hbGl6ZVN0cmluZ0FycmF5KG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXMpO1xuICAgICAgY29uc3QgZXhpc3RpbmdFbWl0TWV0YWRhdGEgPSBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVRzY29uZmlnRXh0ZW5kcyhuZXdTZXR0aW5ncy5leHRlbmRzLCBvbGRTZXR0aW5ncy5leHRlbmRzKTtcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgIWRpclBhdGguaW5jbHVkZXMoJ0B0eXBlcycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCdfX3Rlc3RzX18vJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ3Rlc3RzLycpXG4gICAgICApO1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICAgIC8vIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnLmpzb24gaXMgYSBsaW50L3R5cGVjaGVjayBwcm9qZWN0LCBub3QgdGhlIGVtaXRcbiAgICAgIC8vIGNvbnRyYWN0LiBJdCBtdXN0IGtlZXAgcm9vdERpciBicm9hZCBlbm91Z2ggZm9yIHJvb3QgY29uZmlnIGZpbGVzLFxuICAgICAgLy8gc2NyaXB0cywgc3JjLCBhbmQgdGVzdHMuIGJ1aWxkLXRzIG93bnMgZW1pdCBhbmQgY3JlYXRlcyBhIHRlbXBvcmFyeVxuICAgICAgLy8gc3JjLW9ubHkgdHNjb25maWcgd2l0aCBub0VtaXQ9ZmFsc2UsIGVtaXREZWNsYXJhdGlvbk9ubHk9dHJ1ZSxcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiwgYW5kIGluY2x1ZGU9W1wic3JjLyoqLypcIl0sIHNvIHByZXNlcnZpbmcgbm9FbWl0PWZhbHNlIG9yXG4gICAgICAvLyByb290RGlyPVwic3JjXCIgaGVyZSB3b3VsZCBvbmx5IGJyZWFrIG5vbi1zcmMgdHlwZS1hd2FyZSBsaW50IGNvdmVyYWdlLlxuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIC4uLmV4aXN0aW5nRW1pdE1ldGFkYXRhIH07XG4gICAgICBlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5KG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG5cbiAgICAgIGNvbnN0IG1lcmdlZFR5cGVzID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlcywgZ2VuZXJhdGVkVHlwZXMpLCAuLi5nZW5lcmF0ZWRUeXBlc10pXTtcbiAgICAgIGlmIChtZXJnZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IG1lcmdlZFR5cGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGREZWxldGVUeXBlUm9vdHMoZ2VuZXJhdGVkVHlwZXMpKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZVJvb3RzO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICAvLyBQYWNrYWdlIGltcG9ydHMgc2hvdWxkIHJlc29sdmUgdGhyb3VnaCBwYWNrYWdlIGV4cG9ydHMgaW5zdGVhZCBvZiBiYXNlVXJsLlxuICAgIC8vIHBhdGhzIGlzIGludGVudGlvbmFsbHkgcHJlc2VydmVkIHNvIHJlcG8tbG9jYWwgdG9vbGluZyBjYW4ga2VlcCBleHBsaWNpdFxuICAgIC8vIGFsaWFzZXMgd2l0aG91dCByZWx5aW5nIG9uIGJhc2VVcmwncyBicm9hZCBmYWxsYmFjayByZXNvbHV0aW9uLlxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmw7XG4gICAgZGVsZXRlTGVnYWN5TW9kdWxlU2V0dGluZ3MobmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBjb25maWcpO1xuICAgIG5vcm1hbGl6ZUNvbW1vbkpzVHNjb25maWdTZXR0aW5ncyhuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGNvbmZpZyk7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICBhZGRTY3JpcHRzSW5jbHVkZUZvckZyYW1ld29ya1Byb2plY3Qoc2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSkpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBOZXh0L0JsaXR6IG93biB0aGVpciB0c2NvbmZpZyBzaGFwZSwgYnV0IFR5cGVTY3JpcHQgNiBubyBsb25nZXIgYWNjZXB0c1xuICAgIC8vIG5vZGUxMCByZXNvbHZlciBzcGVsbGluZ3MgdGhhdCBvbGRlciBwcm9qZWN0cyBjb21tb25seSBpbmhlcml0ZWQuXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzOiBUc0NvbmZpZ0pzb24pOiB2b2lkIHtcbiAgLy8gT21pdHRpbmcgaW5jbHVkZSBsZXRzIGZyYW1ld29yayB0c2NvbmZpZ3Mga2VlcCBUeXBlU2NyaXB0J3MgZGVmYXVsdFxuICAvLyBcImFsbCBUUy9UU1ggZmlsZXNcIiBiZWhhdmlvciwgd2hpY2ggYWxyZWFkeSBjb3ZlcnMgc2NyaXB0cy5cbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlKSByZXR1cm47XG4gIGlmIChzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKCdzY3JpcHRzLyoqLyonKSkgcmV0dXJuO1xuXG4gIHNldHRpbmdzLmluY2x1ZGUucHVzaCgnc2NyaXB0cy8qKi8qJyk7XG4gIHNldHRpbmdzLmluY2x1ZGUuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucztcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgY29uc3QgbW9kdWxlUmVzb2x1dGlvbiA9IGxvd2VyQ2FzZVNldHRpbmcoY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24pO1xuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzZXR0aW5ncy5leHRlbmRzKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBjb25maWcgbWF5IGFscmVhZHkgc3VwcGx5IGEgdmFsaWQgbW9kdWxlL3Jlc29sdmVyIHBhaXIsIHNvIG9ubHlcbiAgICAgIC8vIHJlbW92ZSB0aGUgcmVtb3ZlZC1pbi1UUzYgbm9kZTEwIHNwZWxsaW5ncyBpbnN0ZWFkIG9mIGZvcmNpbmcgYnVuZGxlciBvbiBpdC5cbiAgICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmV4dC5qcyB3cml0ZXMgXCJub2RlXCIgZHVyaW5nIGJ1aWxkIHdoZW4gdGhpcyBvcHRpb24gaXMgbWlzc2luZywgYnV0XG4gICAgICAvLyB0c2dvbGludCB0cmVhdHMgdGhhdCBzcGVsbGluZyBhcyB0aGUgcmVtb3ZlZCBub2RlMTAgcmVzb2x2ZXIuXG4gICAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9ICdidW5kbGVyJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gdHNnb2xpbnQgZm9sbG93cyBUeXBlU2NyaXB0IDYgdmFsaWRhdGlvbiwgd2hlcmUgYmFzZVVybCBpcyByZW1vdmVkIGFuZFxuICAvLyBwYXRoIHRhcmdldHMgbXVzdCBiZSBleHBsaWNpdGx5IHJlbGF0aXZlLiBOZXh0LmpzIHN0aWxsIGFjY2VwdHMgdGhlIGFsaWFzXG4gIC8vIHNoYXBlIGFmdGVyIGVhY2ggdGFyZ2V0IGlzIHdyaXR0ZW4gd2l0aCBhIGxlYWRpbmcgLi8uXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMuYmFzZVVybDtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMucGF0aHMpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZXJPcHRpb25zLnBhdGhzKSkge1xuICAgIGNvbXBpbGVyT3B0aW9ucy5wYXRoc1thbGlhc10gPSBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG4gICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpIHx8IHRhcmdldC5zdGFydHNXaXRoKCcuLi8nKSB8fCBwYXRoLmlzQWJzb2x1dGUodGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgICByZXR1cm4gYC4vJHt0YXJnZXR9YDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHJldHVybiAnLic7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKSA/ICcuLi8uLicgOiAnLic7XG59XG5cbmZ1bmN0aW9uIG1lcmdlVHNjb25maWdFeHRlbmRzKFxuICBnZW5lcmF0ZWRFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSxcbiAgZXhpc3RpbmdFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXVxuKTogVHNDb25maWdKc29uWydleHRlbmRzJ10ge1xuICBjb25zdCBtZXJnZWRFeHRlbmRzID0gWy4uLm5vcm1hbGl6ZUV4dGVuZHMoZ2VuZXJhdGVkRXh0ZW5kcyksIC4uLm5vcm1hbGl6ZUV4dGVuZHMoZXhpc3RpbmdFeHRlbmRzKV07XG4gIGNvbnN0IHVuaXF1ZUV4dGVuZHMgPSBbLi4ubmV3IFNldChtZXJnZWRFeHRlbmRzKV07XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAxKSByZXR1cm4gdW5pcXVlRXh0ZW5kc1swXTtcbiAgcmV0dXJuIHVuaXF1ZUV4dGVuZHM7XG59XG5cbmZ1bmN0aW9uIGFkZEluY2x1ZGVQYXRoKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBzZXR0aW5ncy5pbmNsdWRlID8/PSBbXTtcbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKGRpclBhdGgpKSB7XG4gICAgc2V0dGluZ3MuaW5jbHVkZS5wdXNoKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV4dGVuZHModmFsdWU6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddKTogc3RyaW5nW10ge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gW3ZhbHVlXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVHlwZVJvb3RzKHR5cGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgLy8gT25seSBnZW5lcmF0ZWQgcGFja2FnZS1vd25lZCB0ZXN0IHR5cGVzIHNob3VsZCB0cmlnZ2VyIHRoaXMuIFVzZXItZGVmaW5lZCBzbGFzaC1iYXNlZFxuICAvLyBlbnRyaWVzIG1heSBpbnRlbnRpb25hbGx5IHJlbHkgb24gY3VzdG9tIHR5cGVSb290cyBhbmQgc2hvdWxkIGJlIHByZXNlcnZlZCBhcy1pcy5cbiAgcmV0dXJuIHR5cGVOYW1lcy5zb21lKCh0eXBlTmFtZSkgPT4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZS5pbmNsdWRlcygnLycpKTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzOiBzdHJpbmdbXSwgZ2VuZXJhdGVkVHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBnZW5lcmF0ZWRUeXBlU2V0ID0gbmV3IFNldChnZW5lcmF0ZWRUeXBlcyk7XG4gIHJldHVybiBleGlzdGluZ1R5cGVzLmZpbHRlcigodHlwZU5hbWUpID0+IHtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgcGFja2FnZS1wcm92aWRlZCB0ZXN0IGdsb2JhbHMuIERyb3Agc3RhbGUgZW50cmllcyB3aGVuIHRoZVxuICAgIC8vIGNvcnJlc3BvbmRpbmcgZGVwZW5kZW5jeSBpcyBubyBsb25nZXIgcHJlc2VudCBzbyBUeXBlU2NyaXB0IHdvbid0IHJlcXVpcmVcbiAgICAvLyBtaXNzaW5nIHBhY2thZ2VzIHN1Y2ggYXMgdml0ZXN0LlxuICAgIGlmIChpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lKSAmJiAhZ2VuZXJhdGVkVHlwZVNldC5oYXModHlwZU5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUgPT09ICdqZXN0JyB8fCB0eXBlTmFtZSA9PT0gJ21vY2hhJyB8fCB0eXBlTmFtZSA9PT0gJ3ZpdGVzdC9nbG9iYWxzJztcbn1cblxuZnVuY3Rpb24gZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eShjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgaWYgKGNvbXBpbGVyT3B0aW9ucy5ub0VtaXQgIT09IGZhbHNlIHx8IGNvbXBpbGVyT3B0aW9ucy5lbWl0RGVjbGFyYXRpb25Pbmx5ID09PSB0cnVlKSByZXR1cm47XG5cbiAgLy8gQHRzY29uZmlnL2J1biBlbmFibGVzIGFsbG93SW1wb3J0aW5nVHNFeHRlbnNpb25zLCB3aGljaCBUeXBlU2NyaXB0IHBlcm1pdHNcbiAgLy8gZHVyaW5nIGVtaXQgb25seSB3aGVuIHJlbGF0aXZlIFRTIGV4dGVuc2lvbnMgYXJlIHJld3JpdHRlbi5cbiAgY29tcGlsZXJPcHRpb25zLnJld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbnMgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBkZWxldGVMZWdhY3lNb2R1bGVTZXR0aW5ncyhcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuXG4gIC8vIFR5cGVTY3JpcHQgdHJlYXRzIG9wdGlvbiB2YWx1ZXMgY2FzZS1pbnNlbnNpdGl2ZWx5LCBzbyBub3JtYWxpemUgYmVmb3JlIGNvbXBhcmlzb24uXG4gIGNvbnN0IG1vZHVsZVJlc29sdXRpb24gPSBsb3dlckNhc2VTZXR0aW5nKGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uKTtcbiAgLy8gVHlwZVNjcmlwdCA2IHJlbW92ZWQgdGhlIG9sZCBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmcsIHNvIGluaGVyaXRlZCBiYXNlIGNvbmZpZ3NcbiAgLy8gc2hvdWxkIGNob29zZSB0aGUgcmVzb2x2ZXIgdW5sZXNzIGEgcHJvamVjdCBhbHJlYWR5IG9wdGVkIGludG8gYSBtb2Rlcm4gb25lLlxuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnKSB7XG4gICAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkgcmV0dXJuO1xuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnZpdGUgfHwgY29uZmlnLmRlcGVuZGluZy50YXVyaSkge1xuICAgIC8vIFZpdGUgb3ducyBtb2R1bGUgc2VtYW50aWNzIGZvciB0aGVzZSBwYWNrYWdlcyBhbmQgdGhlaXIgc291cmNlcyByZWx5IG9uXG4gICAgLy8gYnVuZGxlci1tb2RlIHJlc29sdXRpb24gKGUuZy4gZXh0ZW5zaW9ubGVzcyBpbXBvcnRzKSwgc28gcGluIHRoZSBidW5kbGVyIHBhaXJcbiAgICAvLyBldmVuIHdoZW4gYSBsZWdhY3kgY29uZmlnIHVzZWQgdGhlIG5vZGUgcmVzb2x2ZXIsIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvXG4gICAgLy8gdGhlIG5vZGUgYmFzZSBjb25maWdzJyBOb2RlTmV4dC5cbiAgICBpZiAobW9kdWxlUmVzb2x1dGlvbiAhPT0gJ2J1bmRsZXInKSB7XG4gICAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9ICdidW5kbGVyJztcbiAgICB9XG4gICAgY29uc3QgbW9kdWxlS2luZCA9IGxvd2VyQ2FzZVNldHRpbmcoY29tcGlsZXJPcHRpb25zLm1vZHVsZSk7XG4gICAgLy8gVHlwZVNjcmlwdCBwYWlycyB0aGUgYnVuZGxlciByZXNvbHZlciB3aXRoIFByZXNlcnZlIG9yIEVTLW1vZHVsZSBraW5kcy4gS2VlcCBhblxuICAgIC8vIGV4aXN0aW5nIHZhbGlkIGtpbmQgKGUuZy4gUHJlc2VydmUsIHdoaWNoIGhhbmRsZXMgaW1wb3J0IGFuZCByZXF1aXJlIHN5bnRheFxuICAgIC8vIHNlcGFyYXRlbHkpIGFuZCBmaWxsIGluIEVTTmV4dCBvbmx5IHdoZW4gdGhlIHBhaXIgd291bGQgb3RoZXJ3aXNlIGJlIGludmFsaWQuXG4gICAgaWYgKG1vZHVsZUtpbmQgPT09IHVuZGVmaW5lZCB8fCAobW9kdWxlS2luZCAhPT0gJ3ByZXNlcnZlJyAmJiAhbW9kdWxlS2luZC5zdGFydHNXaXRoKCdlcycpKSkge1xuICAgICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZSA9ICdFU05leHQnO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ2J1bmRsZXInKSB7XG4gICAgLy8gVGhlIG5vZGUgYmFzZSBjb25maWdzIHByb3ZpZGUgYSBjb25zaXN0ZW50IG1vZHVsZS9yZXNvbHZlciBwYWlyLCBhbmQgZXZlcnlcbiAgICAvLyBtb2R1bGUga2luZCB0aGV5IG1heSBjaG9vc2UgaXMgaW52YWxpZCB3aXRoIGEgbGVmdG92ZXIgYnVuZGxlciByZXNvbHZlci5cbiAgICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb247XG4gIH1cblxuICBjb25zdCBtb2R1bGVLaW5kID0gbG93ZXJDYXNlU2V0dGluZyhjb21waWxlck9wdGlvbnMubW9kdWxlKTtcbiAgaWYgKG1vZHVsZUtpbmQgPT09ICdwcmVzZXJ2ZScgfHwgbW9kdWxlS2luZD8uc3RhcnRzV2l0aCgnZXMnKSkge1xuICAgIC8vIE5vZGUgYmFzZSBjb25maWdzIHBhaXIgdGhlaXIgcmVzb2x2ZXIgd2l0aCBhIG1hdGNoaW5nIG1vZHVsZSBraW5kOyBsZWZ0b3ZlclxuICAgIC8vIEVTL1ByZXNlcnZlIG92ZXJyaWRlcyBhcmUgaW52YWxpZCB3aXRoIGV2ZXJ5IHBhaXIgdGhleSBtYXkgY2hvb3NlLlxuICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxvd2VyQ2FzZVNldHRpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbW1vbkpzVHNjb25maWdTZXR0aW5ncyhcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucyB8fCBjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuaXNFc21QYWNrYWdlKSByZXR1cm47XG5cbiAgaWYgKGNvbXBpbGVyT3B0aW9ucy5tb2R1bGU/LnRvTG93ZXJDYXNlKCkgPT09ICdjb21tb25qcycpIHtcbiAgICAvLyBAdHNjb25maWcvbm9kZS1sdHMgbm93IHByb3ZpZGVzIG1vZHVsZVJlc29sdXRpb249bm9kZTE2LiBUeXBlU2NyaXB0IHJlcXVpcmVzXG4gICAgLy8gdGhlIG1vZHVsZSBraW5kIHRvIG1vdmUgd2l0aCB0aGF0IHJlc29sdmVyLCB3aGlsZSB2ZXJiYXRpbU1vZHVsZVN5bnRheD1mYWxzZVxuICAgIC8vIHByZXNlcnZlcyB0aGUgbG9uZy1zdGFuZGluZyBDb21tb25KUyBlbWl0IHNoYXBlIGZvciBleGlzdGluZyBwYWNrYWdlcy5cbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlID0gJ05vZGUxNic7XG4gIH1cbiAgY29tcGlsZXJPcHRpb25zLnZlcmJhdGltTW9kdWxlU3ludGF4ID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddXG4pOiBQaWNrPE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LCAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnPiB7XG4gIGNvbnN0IGVtaXRPcHRpb25zID0ge30gYXMgUGljazxcbiAgICBOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPixcbiAgICAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnXG4gID47XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnZGVjbGFyYXRpb24nLCAnZGVjbGFyYXRpb25NYXAnLCAnc291cmNlTWFwJ10gYXMgY29uc3QpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbXBpbGVyT3B0aW9ucz8uW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVtaXRPcHRpb25zW2tleV0gPSB2YWx1ZSBhcyBuZXZlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVtaXRPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2J1bicpO1xuICB9IGVsc2UgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbm9kZScpO1xuICB9XG4gIGlmIChcbiAgICBkZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgIGRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgZGVwZW5kZW5jaWVzWydqZXN0LWVudmlyb25tZW50LWpzZG9tJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICApIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdqZXN0Jyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy52aXRlc3QpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCd2aXRlc3QvZ2xvYmFscycpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMubW9jaGEpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdtb2NoYScpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMuY3lwcmVzcykge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2N5cHJlc3MnKTtcbiAgfVxuXG4gIHJldHVybiBbLi4udHlwZU5hbWVzXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBleGNsdWRlRmlsZVBhdHRlcm5zID0gW1xuICAnKiovLmdpdC9vYmplY3RzLyoqJyxcbiAgJyoqLy5naXQvc3VidHJlZS1jYWNoZS8qKicsXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovdG1wLyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovZGlzdC8qKicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVZzY29kZVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpO1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIC8vIExMTeOBq+OCiOOCi3ZpYmUgY29kaW5n44Gn44Gv44CB6Ieq5YuV44OV44Kp44O844Oe44OD44OI44KE44Kz44O844OJ44Ki44Kv44K344On44Oz44KS54Sh5Yq55YyW44GZ44KL44GT44Go44GnXG4gICAgICAvLyDnlJ/miJDjgZXjgozjgZ/jgrPjg7zjg4njga7lhYPjga7lvaLlvI/jgpLntq3mjIHjgafjgY3jgotcbiAgICAgIGlmICgnZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZSddO1xuICAgICAgfVxuICAgICAgaWYgKCdlZGl0b3IuZm9ybWF0T25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5mb3JtYXRPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc3ZlbHRlJywgJ2ZmM2UwMCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHknKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2xsbS1wciA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2FpLXByIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWFsbCA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jbGF1ZGUgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY29kZXggOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItZ2VtaW5pIDpyb2JvdDonKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmludGVyZmFjZSBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRhcmdldDogJ2JyYW5jaCc7XG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJztcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBpbmNsdWRlOiBzdHJpbmdbXTtcbiAgICAgIGV4Y2x1ZGU6IHN0cmluZ1tdO1xuICAgIH07XG4gIH07XG4gIHJ1bGVzOiAoXG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdkZWxldGlvbicgfCAnbm9uX2Zhc3RfZm9yd2FyZCc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJztcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIHN0cmljdF9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzX3BvbGljeTogYm9vbGVhbjtcbiAgICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfc3RhdHVzX2NoZWNrczoge1xuICAgICAgICAgICAgY29udGV4dDogc3RyaW5nO1xuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IG51bWJlcjtcbiAgICAgICAgICB9W107XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdwdWxsX3JlcXVlc3QnO1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgcmVxdWlyZWRfYXBwcm92aW5nX3Jldmlld19jb3VudDogbnVtYmVyO1xuICAgICAgICAgIGRpc21pc3Nfc3RhbGVfcmV2aWV3c19vbl9wdXNoOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3Jldmlld2VyczogW107XG4gICAgICAgICAgcmVxdWlyZV9jb2RlX293bmVyX3JldmlldzogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlX2xhc3RfcHVzaF9hcHByb3ZhbDogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9yZXZpZXdfdGhyZWFkX3Jlc29sdXRpb246IGJvb2xlYW47XG4gICAgICAgICAgYWxsb3dlZF9tZXJnZV9tZXRob2RzOiBbJ3NxdWFzaCddO1xuICAgICAgICB9O1xuICAgICAgfVxuICApW107XG4gIGJ5cGFzc19hY3RvcnM6IHtcbiAgICBhY3Rvcl9pZDogbnVtYmVyO1xuICAgIGFjdG9yX3R5cGU6ICdUZWFtJztcbiAgICBieXBhc3NfbW9kZTogJ3B1bGxfcmVxdWVzdCc7XG4gIH1bXTtcbn1cblxuaW50ZXJmYWNlIFJlcG9zaXRvcnlSdWxlc2V0U3VtbWFyeSB7XG4gIGlkPzogbnVtYmVyO1xuICBuYW1lPzogc3RyaW5nO1xuICBzb3VyY2VfdHlwZT86IHN0cmluZztcbn1cblxuY29uc3QgR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUiA9IHtcbiAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxufSBhcyBjb25zdDtcblxuY29uc3QgR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQgPSAxNV8zNjg7XG5cbmNvbnN0IFBST1RFQ1RfTUFJTl9SVUxFU0VUOiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQgPSB7XG4gIG5hbWU6ICdQcm90ZWN0IG1haW4nLFxuICB0YXJnZXQ6ICdicmFuY2gnLFxuICBlbmZvcmNlbWVudDogJ2FjdGl2ZScsXG4gIGNvbmRpdGlvbnM6IHtcbiAgICByZWZfbmFtZToge1xuICAgICAgZXhjbHVkZTogW10sXG4gICAgICBpbmNsdWRlOiBbJ35ERUZBVUxUX0JSQU5DSCddLFxuICAgIH0sXG4gIH0sXG4gIHJ1bGVzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2RlbGV0aW9uJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgc3RyaWN0X3JlcXVpcmVkX3N0YXR1c19jaGVja3NfcG9saWN5OiBmYWxzZSxcbiAgICAgICAgZG9fbm90X2VuZm9yY2Vfb25fY3JlYXRlOiB0cnVlLFxuICAgICAgICByZXF1aXJlZF9zdGF0dXNfY2hlY2tzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGV4dDogJ3Rlc3QgLyB0ZXN0JyxcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRleHQ6ICdzZW1hbnRpYy1wciAvIHNlbWFudGljLXByJyxcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdub25fZmFzdF9mb3J3YXJkJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdwdWxsX3JlcXVlc3QnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICByZXF1aXJlZF9hcHByb3ZpbmdfcmV2aWV3X2NvdW50OiAwLFxuICAgICAgICBkaXNtaXNzX3N0YWxlX3Jldmlld3Nfb25fcHVzaDogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVkX3Jldmlld2VyczogW10sXG4gICAgICAgIHJlcXVpcmVfY29kZV9vd25lcl9yZXZpZXc6IGZhbHNlLFxuICAgICAgICByZXF1aXJlX2xhc3RfcHVzaF9hcHByb3ZhbDogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVkX3Jldmlld190aHJlYWRfcmVzb2x1dGlvbjogZmFsc2UsXG4gICAgICAgIGFsbG93ZWRfbWVyZ2VfbWV0aG9kczogWydzcXVhc2gnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgXSxcbiAgYnlwYXNzX2FjdG9yczogW1xuICAgIHtcbiAgICAgIGFjdG9yX2lkOiAxN183NzdfNDk1LFxuICAgICAgYWN0b3JfdHlwZTogJ1RlYW0nLFxuICAgICAgYnlwYXNzX21vZGU6ICdwdWxsX3JlcXVlc3QnLFxuICAgIH0sXG4gIF0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJykgcmV0dXJuO1xuICAgIC8vIFRoZSByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBob3N0cyB3b3JrZmxvd19jYWxsIGRlZmluaXRpb25zLCBzbyB0aGVcbiAgICAvLyBQcm90ZWN0IG1haW4gcnVsZXNldCB3b3VsZCByZXF1aXJlIHRlc3Qvc2VtYW50aWMtcHIgY2hlY2tzIHRoYXQgbmV2ZXIgcnVuIHRoZXJlLlxuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhjb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHVwc2VydFByb3RlY3RNYWluUnVsZXNldChvY3Rva2l0LCBvd25lciwgcmVwbywgYnVpbGRQcm90ZWN0TWFpblJ1bGVzZXQoY29uZmlnKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gUmVwb3NpdG9yeSBydWxlc2V0cyByZXF1aXJlIGFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb24sIHdoaWNoIGxvY2FsIHJ1bnNcbiAgICAgIC8vIG1heSBub3QgaGF2ZSBldmVuIHdoZW4gZmlsZS1nZW5lcmF0aW9uIGFuZCBwdXNoZXMgYXJlIGFsbG93ZWQuXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFByb3RlY3RNYWluUnVsZXNldChjb25maWc6IFBhY2thZ2VDb25maWcpOiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQge1xuICBjb25zdCBydWxlc2V0ID0gc3RydWN0dXJlZENsb25lKFBST1RFQ1RfTUFJTl9SVUxFU0VUKTtcbiAgaWYgKGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzZXQucnVsZXMpIHtcbiAgICAgIGlmIChydWxlLnR5cGUgIT09ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJykgY29udGludWU7XG4gICAgICAvLyBUaGUgY29udGV4dCBpcyBgPGNhbGxlciBqb2IgaWQ+IC8gPHJldXNhYmxlIGpvYiBpZD5gIG9mIHRoZSB3YmZ5LWdlbmVyYXRlZCB0ZXN0LXJ1c3QueW1sLlxuICAgICAgcnVsZS5wYXJhbWV0ZXJzLnJlcXVpcmVkX3N0YXR1c19jaGVja3MucHVzaCh7XG4gICAgICAgIGNvbnRleHQ6ICd0ZXN0LXJ1c3QgLyB0ZXN0LXJ1c3QnLFxuICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ1bGVzZXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwc2VydFByb3RlY3RNYWluUnVsZXNldChcbiAgb2N0b2tpdDogT2N0b2tpdCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nLFxuICBydWxlc2V0OiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBleGlzdGluZ1J1bGVzZXQgPSBhd2FpdCBmaW5kUmVwb3NpdG9yeVJ1bGVzZXQob2N0b2tpdCwgb3duZXIsIHJlcG8sIHJ1bGVzZXQubmFtZSk7XG4gIGNvbnN0IGV4aXN0aW5nUnVsZXNldElkID0gZXhpc3RpbmdSdWxlc2V0Py5pZDtcblxuICBhd2FpdCB3aXRoUmV0cnkoXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGV4aXN0aW5nUnVsZXNldElkKSB7XG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBydWxlc2V0X2lkOiBleGlzdGluZ1J1bGVzZXRJZCxcbiAgICAgICAgICAuLi5ydWxlc2V0LFxuICAgICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMnLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgICAuLi5ydWxlc2V0LFxuICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICB7XG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgIH1cbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSdWxlc2V0KFxuICBvY3Rva2l0OiBPY3Rva2l0LFxuICBvd25lcjogc3RyaW5nLFxuICByZXBvOiBzdHJpbmcsXG4gIHJ1bGVzZXROYW1lOiBzdHJpbmdcbik6IFByb21pc2U8UmVwb3NpdG9yeVJ1bGVzZXRTdW1tYXJ5IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2l0aFJldHJ5KFxuICAgICgpID0+XG4gICAgICBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMnLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgICBpbmNsdWRlc19wYXJlbnRzOiBmYWxzZSxcbiAgICAgICAgdGFyZ2V0czogJ2JyYW5jaCcsXG4gICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICB9KSxcbiAgICB7XG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgIH1cbiAgKTtcbiAgY29uc3QgcnVsZXNldHMgPSByZXNwb25zZS5kYXRhO1xuICBpZiAoIUFycmF5LmlzQXJyYXkocnVsZXNldHMpKSByZXR1cm47XG4gIHJldHVybiBydWxlc2V0cy5maW5kKChydWxlc2V0KSA9PiBydWxlc2V0Lm5hbWUgPT09IHJ1bGVzZXROYW1lICYmIHJ1bGVzZXQuc291cmNlX3R5cGUgPT09ICdSZXBvc2l0b3J5Jyk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICByZXR1cm4gc3RhdHVzID09PSA0MDEgfHwgc3RhdHVzID09PSA0MDMgfHwgc3RhdHVzID09PSA0MDQ7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGRvdGVudiBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgc29kaXVtTW9kdWxlIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IERFUFJFQ0FURURfU0VDUkVUX05BTUVTID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJywgJ0dIX0JPVF9QQVQnLCAnUFVCTElDX0dIX0JPVF9QQVQnXTtcbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlY3JldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBTZWNyZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8gfHwgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSB8fCAhb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycykgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gZG90ZW52LmNvbmZpZyh7IHBhdGg6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lbnYnKSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBjb25zdCBzb2RpdW0gPSBnZXRTb2RpdW0oKTtcbiAgICAgIGF3YWl0IHNvZGl1bS5yZWFkeTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2VjcmV0XSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVCcgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVInIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBzZWNyZXRfbmFtZTogbmFtZSxcbiAgICAgICAgICBlbmNyeXB0ZWRfdmFsdWU6IGVuY0Jhc2U2NCxcbiAgICAgICAgICBrZXlfaWQ6IGtleUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwU2VjcmV0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFNvZGl1bSgpOiB0eXBlb2Ygc29kaXVtTW9kdWxlIHtcbiAgLy8gbGlic29kaXVtLXdyYXBwZXJzJyBFU00gZW50cnkgY2FuIGJpbmQgdG8gbGlic29kaXVtQDAuOC4zLCB3aG9zZSBkZWZhdWx0XG4gIC8vIGV4cG9ydCBubyBsb25nZXIgZXhwb3NlcyByZWFkeS4gVGhlIENvbW1vbkpTIGVudHJ5IGtlZXBzIHRoZSBBUEkgc2hhcGUuXG4gIHJldHVybiByZXF1aXJlKCdsaWJzb2RpdW0td3JhcHBlcnMnKSBhcyB0eXBlb2Ygc29kaXVtTW9kdWxlO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBHaXRIdWJTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXBvc2l0b3J5IHNldHRpbmdzIG5lZWQgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgdW5saWtlIGZpbGUgZ2VuZXJhdGlvbi5cbiAgICAgIGF3YWl0IHdpdGhSZXRyeShcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgICAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIExvY2FsIHdiZnkgcnVucyBvZnRlbiBoYXZlIHB1c2ggcGVybWlzc2lvbiB3aXRob3V0IGFkbWluIHBlcm1pc3Npb24uXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBHaXRIdWJTZXR0aW5ncyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCAhKCdzdGF0dXMnIGluIGVycm9yKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZXJyb3Iuc3RhdHVzID09PSA0MDEgfHwgZXJyb3Iuc3RhdHVzID09PSA0MDMgfHwgZXJyb3Iuc3RhdHVzID09PSA0MDQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIgPSAnX19QTV9SVU5fXyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIFRoZSB0ZXN0IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gdGVzdFxcYCkgcGFzc2VkLlxuICAtIFRoZSBsaW50IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gbGludFxcYCkgcGFzc2VkLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiB0aGUgR2l0SHViIGRpZmYgdmlldy5cbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdCBteSBjaGFuZ2VzLlxuLSBbIF0gSSd2ZSBhZGRlZCBzY3JlZW5zaG90cyAoaWYgdGhlIFVJIGNoYW5nZWQpLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlclJlcG8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgbmV3Q29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZShuZXdDb250ZW50LCBjb25maWcpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlKG9sZENvbnRlbnQsIGNvbnRlbnQpID4gY29udGVudC5sZW5ndGggLyAyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2VBbGwocGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciwgcGFja2FnZU1hbmFnZXJDb21tYW5kKTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuY29uc3QgYWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm4gPSBTdHJpbmcucmF3YCg/OldpbGxCb29zdGVyfFdpbGxCb29zdGVyTGFiKWA7XG5jb25zdCBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zID0gW1xuICBuZXcgUmVnRXhwKGBeJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKGBeZ2l0aHViOiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzojXFxcXFMrKT8kYCwgJ3UnKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9odHRwczovL2dpdGh1YlxcXFwuY29tLyR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsXG4gICAgJ3UnXG4gICksXG4gIG5ldyBSZWdFeHAoXG4gICAgYF4oPzpnaXRcXFxcKyk/c3NoOi8vZ2l0QGdpdGh1YlxcXFwuY29tWzovXSR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsXG4gICAgJ3UnXG4gICksXG4gIG5ldyBSZWdFeHAoYF4oPzpnaXRcXFxcKyk/Z2l0QGdpdGh1YlxcXFwuY29tOiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsICd1JyksXG5dO1xuXG5pbnRlcmZhY2UgRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2Uge1xuICBkZXBlbmRlbmN5TmFtZTogc3RyaW5nO1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIHNlY3Rpb25OYW1lOiAodHlwZW9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cylbbnVtYmVyXTtcbiAgc3BlY2lmaWVyOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzID0gY29uZmlncy5mbGF0TWFwKGdldERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlcyk7XG4gIGlmIChkaXNhbGxvd2VkU291cmNlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXRhaWxzID0gZGlzYWxsb3dlZFNvdXJjZXNcbiAgICAubWFwKFxuICAgICAgKHsgZGVwZW5kZW5jeU5hbWUsIGRpclBhdGgsIHNlY3Rpb25OYW1lLCBzcGVjaWZpZXIgfSkgPT5cbiAgICAgICAgYC0gJHtwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpfTogJHtzZWN0aW9uTmFtZX0uJHtkZXBlbmRlbmN5TmFtZX0gdXNlcyAke3NwZWNpZmllcn1gXG4gICAgKVxuICAgIC5qb2luKCdcXG4nKTtcblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYERpc2FsbG93ZWQgR2l0IGRlcGVuZGVuY3kgc291cmNlcyBmb3VuZC5cXG5Pbmx5IFdpbGxCb29zdGVyIGFuZCBXaWxsQm9vc3RlckxhYiBHaXRIdWIgZGVwZW5kZW5jaWVzIGFyZSBhbGxvd2VkLlxcbiR7ZGV0YWlsc31gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdIHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBjb25maWcucGFja2FnZUpzb247XG4gIGlmICghcGFja2FnZUpzb24pIHJldHVybiBbXTtcblxuICBjb25zdCBkaXNhbGxvd2VkU291cmNlczogRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHNlY3Rpb25OYW1lIG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBwYWNrYWdlSnNvbltzZWN0aW9uTmFtZV07XG4gICAgaWYgKCFzZWN0aW9uKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW2RlcGVuZGVuY3lOYW1lLCBzcGVjaWZpZXJdIG9mIE9iamVjdC5lbnRyaWVzKHNlY3Rpb24pKSB7XG4gICAgICBpZiAoIXNwZWNpZmllcikgY29udGludWU7XG4gICAgICBpZiAoIWlzR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXIpKSBjb250aW51ZTtcbiAgICAgIGlmIChpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuXG4gICAgICBkaXNhbGxvd2VkU291cmNlcy5wdXNoKHtcbiAgICAgICAgZGVwZW5kZW5jeU5hbWUsXG4gICAgICAgIGRpclBhdGg6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBzZWN0aW9uTmFtZSxcbiAgICAgICAgc3BlY2lmaWVyLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkaXNhbGxvd2VkU291cmNlcztcbn1cblxuZnVuY3Rpb24gaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaXNHaXRIdWJTaG9ydGhhbmRTcGVjaWZpZXIoc3BlY2lmaWVyKSB8fFxuICAgIC9eKD86Yml0YnVja2V0fGdpc3R8Z2l0aHVifGdpdGxhYik6L3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL15odHRwcz86XFwvXFwvKD86Yml0YnVja2V0XFwub3JnfGdpdGh1YlxcLmNvbXxnaXRsYWJcXC5jb20pXFwvL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpodHRwcz98c3NoKTpcXC9cXC9cXFMrXFwuZ2l0KD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXlteQFxcc10rQFteOlxcc10rOlxcUysoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQ6JykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZ2l0KycpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ3NzaDovL2dpdEAnKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15bYS16QS1aMC05XVtcXHcuLV0qXFwvW1xcdy4tXSsoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKTtcbn1cblxuZnVuY3Rpb24gaXNBbGxvd2VkR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gYWxsb3dlZEdpdERlcGVuZGVuY3lQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3Qoc3BlY2lmaWVyKSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpeE5leHRDb25maWdKc29uIH0gZnJvbSAnLi9maXhlcnMvbmV4dENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQbGF5d3JpZ2h0Q29uZmlnIH0gZnJvbSAnLi9maXhlcnMvcGxheXdyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQcmlzbWFFbnZGaWxlcyB9IGZyb20gJy4vZml4ZXJzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9maXhlcnMvdGVzdERpcmVjdG9yeS5qcyc7XG5pbXBvcnQgeyBmaXhUeXBlRGVmaW5pdGlvbnMgfSBmcm9tICcuL2ZpeGVycy90eXBlRGVmaW5pdGlvbi5qcyc7XG5pbXBvcnQgeyBmaXhUeXBvcyB9IGZyb20gJy4vZml4ZXJzL3R5cG9zLmpzJztcbmltcG9ydCB7IGZpeFdiRGJDb21tYW5kIH0gZnJvbSAnLi9maXhlcnMvd2JEYkNvbW1hbmQuanMnO1xuaW1wb3J0IHsgdW50cmFja1dvcmtlclR5cGVzIH0gZnJvbSAnLi9maXhlcnMvd29ya2VyVHlwZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZW1vdmVHZW1pbmlTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94Zm10Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294Zm10Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hsaW50Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294bGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhSYWlsd2F5aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JhaWx3YXlpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWFkbWUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVhZG1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVsZWFzZXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlbGVhc2VyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbm92YXRlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb24uanMnO1xuaW1wb3J0IHsgaW5zdGFsbEFnZW50U2tpbGxzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3NraWxscy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRzY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3RzY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MsIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlWWFybnJjWW1sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3lhcm5yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIH0gZnJvbSAnLi9naXRodWIvcnVsZXNldC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZXNXb3JrZXJUeXBlcywgZ2V0UGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMgfSBmcm9tICcuL3V0aWxzL2RlcGVuZGVuY3lTb3VyY2VQb2xpY3kuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzIH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVR5cGVTY3JpcHRBcGkgfSBmcm9tICcuL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKCckMCBbcGF0aHMuLl0nLCAnTWFrZSBhIGdpdmVuIHByb2plY3QgZm9sbG93IHRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCcsICh5YXJncykgPT4ge1xuICAgICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aHMnLCB7XG4gICAgICAgIGRlc2NyaWJlOiAncHJvamVjdCBwYXRocyB0byBiZSB3YmZpZWQnLFxuICAgICAgICBhcnJheTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IFsnLiddLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAub3B0aW9ucyh7XG4gICAgICBlbnY6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdVcGxvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHNlY3JldHMgdG8gR2l0SHViJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdlJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1NraXAgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gICAgLnN0cmljdCgpLmFyZ3Y7XG4gIG9wdGlvbnMuaXNWZXJib3NlID0gYXJndi52ZXJib3NlO1xuICBvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzID0gYXJndi5lbnY7XG5cbiAgbGV0IGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBhd2FpdCB3aWxsYm9vc3RlcmlmeVBhdGhzKGFyZ3YucGF0aHMgYXMgc3RyaW5nW10sIGFyZ3Yuc2tpcERlcHMpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIFRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyIHNlcnZlciBzcGF3bmVkIGZvciBBU1QgcGFyc2luZyBrZWVwcyBhbiBvcGVuIElQQ1xuICAgIC8vIGNoYW5uZWwgdGhhdCB3b3VsZCBvdGhlcndpc2UgcHJldmVudCB0aGUgTm9kZS5qcyBwcm9jZXNzIGZyb20gZXhpdGluZy5cbiAgICBkaXNwb3NlVHlwZVNjcmlwdEFwaSgpO1xuICB9XG4gIGlmIChoYXNJbnZhbGlkUGFja2FnZUNvbmZpZykge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdpbGxib29zdGVyaWZ5UGF0aHMocGF0aHM6IHN0cmluZ1tdLCBza2lwRGVwczogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgZm9yIChjb25zdCByb290RGlyUGF0aCBvZiBwYXRocykge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIH1cbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICByZW1vdmVHZW1pbmlTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBmaXhSYWlsd2F5aWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZW5vdmF0ZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihzaG91bGRSdW5Xb3JrZmxvd3MgPyBbZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyldIDogW10pLFxuICAgICAgc2V0dXBMYWJlbHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwU2VjcmV0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGludHN0YWdlZHJjKHJvb3RDb25maWcpLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcERlcHMpO1xuICAgICAgLy8gT25seSBhZnRlciBib3RoIHRoZSBiYXJyaWVyIGFib3ZlIOKAlCB3aGVyZSB0aGUgcG9vbGVkIC5naXRpZ25vcmUgd3JpdGUgYWN0dWFsbHkgY29tcGxldGVzIOKAlCBhbmQgdGhlXG4gICAgICAvLyBwYWNrYWdlLmpzb24gZ2VuZXJhdGlvbjogdW50cmFja2luZyBhIGZpbGUgdGhhdCBkaWQgbm90IGdldCBpZ25vcmVkIChlLmcuIHRoZSBnaXRpZ25vcmUuaW8gZmV0Y2ggZmFpbGVkKSBvclxuICAgICAgLy8gd2hvc2UgcG9zdGluc3RhbGwgZG9lcyBub3QgYWN0dWFsbHkgcmVnZW5lcmF0ZSBpdCAoZ2VuZXJhdGVQYWNrYWdlSnNvbiBzd2FsbG93cyBpdHMgb3duIGV4Y2VwdGlvbnMsIHNvIGFcbiAgICAgIC8vIHBhcnRpYWwgcnVuIGlzIHBvc3NpYmxlKSB3b3VsZCBkZWxldGUgdGhlIGRlY2xhcmF0aW9uIHdpdGggbm90aGluZyByZWNyZWF0aW5nIGl0IG9uIGZyZXNoIGNoZWNrb3V0cy5cbiAgICAgIGlmIChnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKSB7XG4gICAgICAgIGF3YWl0IHVudHJhY2tXb3JrZXJUeXBlcyhjb25maWcpO1xuICAgICAgfVxuXG4gICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZykpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiAmJiBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnKSk7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmIGRvZXNDb250YWluSnNPclRzKHJvb3RDb25maWcpKSB7XG4gICAgICAgIC8vIE1vbm9yZXBvIHZlcmlmaWNhdGlvbiBjYW4gaW52b2tlIG94bGludCBmcm9tIGV2ZXJ5IHdvcmtzcGFjZS4gR2l2ZVxuICAgICAgICAvLyBub24tY29kZSBwYWNrYWdlcyBhIGxvY2FsIGNvbmZpZyBzbyBveGxpbnQgZG9lcyBub3QgY2xpbWIgdG8gdGhlXG4gICAgICAgIC8vIHJvb3QgY29uZmlnIGFuZCByZWplY3Qgcm9vdC1vbmx5IHR5cGUtYXdhcmUgb3B0aW9ucyBmcm9tIGEgcGFja2FnZSBjd2QuXG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICBhd2FpdCBmaXhXYkRiQ29tbWFuZChyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICAvLyBSZWZyZXNoIGxvY2sgZmlsZXNcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3JlZnJlc2hCdW5Mb2NrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuXG4gICAgYXdhaXQgaW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWcpO1xuICB9XG4gIHJldHVybiBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZztcbn1cblxuZnVuY3Rpb24gcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAvLyB3YmZ5IHNob3VsZCB1cGRhdGUgb25seSB0aGUgcGFja2FnZXMgaXQgZXhwbGljaXRseSBtYW5hZ2VzIHRocm91Z2ggYnVuIGFkZC5cbiAgLy8gUnVubmluZyBidW4gdXBkYXRlIGhlcmUgcmVmcmVzaGVzIHVucmVsYXRlZCBhcHBsaWNhdGlvbiBkZXBlbmRlbmNpZXMgYW5kXG4gIC8vIGNhbiBjaGFuZ2UgcHJvZHVjdCBiZWhhdmlvciwgc28ga2VlcCB0aGUgZXhpc3RpbmcgbG9jayBhbmQgcmVjb25jaWxlIGl0LlxuICBjb25zdCBzdGF0dXMgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoJ2J1bicsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCk7XG4gIGlmIChzdGF0dXMgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIEJ1biBsb2NrZmlsZTogYnVuIGluc3RhbGwgZXhpdGVkIHdpdGggc3RhdHVzICR7c3RhdHVzfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMTIsMTMsMTQsMTUsMTYsMTddLCJtYXBwaW5ncyI6InF3QkFBQSxlQUFzQixHQUFNLEVBQXFDLENBQy9ELE9BQU8sSUFBSSxRQUFTLEdBQVksV0FBVyxFQUFTLENBQVksQ0FBQyxDQUNuRSxDQ2lDQSxlQUFzQixFQUFvQixFQUE4QyxDQUN0RixHQUFJLENBQ0YsT0FBTyxNQUFNLEVBQUcsQ0FDbEIsTUFBUSxDQUVSLENBQ0YsQ0FFQSxlQUFzQixHQUFxQixFQUE4QyxDQUN2RixHQUFJLENBQ0YsT0FBTyxNQUFNLEVBQUcsQ0FDbEIsT0FBUyxFQUFPLENBQ2QsR0FB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