@willbooster/wb 19.5.7 → 19.5.9

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 +4 -4
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -75,8 +75,8 @@ const L=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,`0`)),qe=new In
75
75
  <p>皆様にはご不便をおかけしますが、メンテナンス終了までしばらくお待ちください。</p>
76
76
  </main>
77
77
  </body>
78
- </html>`)})}async function Ta(e,t,n){await new Promise((r,i)=>{let a=t=>{e.off(`listening`,o),i(t)},o=()=>{e.off(`error`,a),e.on(`error`,n),r()};e.once(`error`,a),e.once(`listening`,o),e.listen(t,`0.0.0.0`)})}async function Ea(e){await new Promise(t=>{let n=()=>{process.off(`SIGINT`,n),process.off(`SIGTERM`,n),process.off(`SIGQUIT`,n),(async()=>{try{await Da(e)}catch(e){console.error(p.red(`Failed to close maintenance server: ${e.message}`))}finally{t()}})()};process.once(`SIGINT`,n),process.once(`SIGTERM`,n),process.once(`SIGQUIT`,n)})}async function Da(e){await new Promise((t,n)=>{e.close(e=>{if(e){if(e.code===`ERR_SERVER_NOT_RUNNING`){t();return}n(e);return}t()}),e.closeAllConnections()})}async function Oa(e,n){let r=Ma(e,n);return await C.mkdir(t.dirname(r),{recursive:!0}),await C.writeFile(r,`${process.pid}\n`,`utf8`),r}async function ka(e,t){let n=Ma(e,t),r=await ja(n);if(r!==void 0&&r!==process.pid){try{P(r,`SIGTERM`)}catch{}await ua(r)}await Aa(n,r)}async function Aa(e,t){t!==void 0&&await ja(e)!==t||await C.rm(e,{force:!0})}async function ja(e){try{let t=await C.readFile(e,`utf8`),n=Number(t.trim());return Number.isInteger(n)&&n>0?n:void 0}catch{return}}function Ma(e,t){return Na(e.rootDirPath,t)}function Na(e,n){return t.join(e,`.wb`,`maintenance-${n}.pid`)}const J=`@willbooster-private`;function Pa(e){return e.replace(/^@willbooster(?:-private)?\//,``)}const Fa=[`git:`,`git+`,`git@`,`file:`,`link:`,`workspace:`,`http:`,`https:`,`portal:`,`patch:`],Ia=/^git@github\.com:(?:WillBooster|WillBoosterLab)\/[^/#]+(?:\.git)?(?:#.*)?$/;function La(e){return typeof e==`string`&&Ia.test(e)}function Ra(e,t){return e.startsWith(`@willbooster-private/`)&&typeof t==`string`&&!Fa.some(e=>t.startsWith(e))}function za(n){let r={};for(let i of[t.join(g.homedir(),`.npmrc`),t.join(n,`.npmrc`)])try{Object.assign(r,Ba(e.readFileSync(i,`utf8`)))}catch{}let i=r[`${J}:registry`]?.replace(/\/+$/,``);if(!i)return;let a=`${i.replace(/^https?:/,``).replace(/\/+$/,``)}/`,o,s=-1;for(let[e,t]of Object.entries(r)){if(!e.endsWith(`:_authToken`)||!t)continue;let n=`${e.slice(0,-11).replace(/\/+$/,``)}/`;a.startsWith(n)&&n.length>s&&(s=n.length,o=t)}return{registryUrl:i,authToken:o??process.env.VERDACCIO_TOKEN}}function Ba(e){let t={};for(let n of e.split(`
79
- `)){let e=n.trim();if(!e||e.startsWith(`#`)||e.startsWith(`;`))continue;let r=e.indexOf(`=`);if(r<=0)continue;let i=e.slice(0,r).trim();t[i]=e.slice(r+1).trim().replaceAll(/\$\{([^}]+)\}/g,(e,t)=>process.env[t]??``)}return t}async function Va(n,r,i,a){let s=await Ha(n,r,i),c=(await Wa(n,`${n.registryUrl}/${qa(r)}/${s}`)).dist?.tarball;if(!c)throw Error(`No tarball URL for ${r}@${s} in ${n.registryUrl}.`);let l=await Ga(n,c),u=t.join(await e.promises.mkdtemp(t.join(g.tmpdir(),`wb-private-package-`)),`package.tgz`);try{if(await e.promises.writeFile(u,Buffer.from(await l.arrayBuffer())),await e.promises.rm(a,{force:!0,recursive:!0}),await e.promises.mkdir(a,{recursive:!0}),o.spawnSync(`tar`,[`-xzf`,u,`-C`,a,`--strip-components=1`],{stdio:`inherit`}).status!==0)throw Error(`Failed to extract ${r}@${s} (${c}).`)}finally{await e.promises.rm(t.dirname(u),{force:!0,recursive:!0})}}async function Ha(e,t,n){if(Ya(n))return n;let r=Ua(n,await Wa(e,`${e.registryUrl}/${qa(t)}`));if(!r)throw Error(`Cannot resolve ${t}@${n} against ${e.registryUrl}; use an exact version, a semver range, or a dist-tag.`);return r}function Ua(e,t){return e!==`*`&&k.validRange(e)?k.maxSatisfying(Object.keys(t.versions??{}),e)??void 0:t[`dist-tags`]?.[e===`*`?`latest`:e]}async function Wa(e,t){return await(await Ga(e,t)).json()}async function Ga(e,t){let n=!!e.authToken&&Ka(t,e.registryUrl),r=await fetch(t,{headers:n?{authorization:`Bearer ${e.authToken}`}:{}});if(!r.ok)throw Error(`Failed to fetch ${t}: ${r.status} ${r.statusText}`);return r}function Ka(e,t){try{return new URL(e).origin===new URL(t).origin}catch{return!1}}function qa(e){return e.replace(`/`,`%2F`)}const Ja=/^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(?:\+[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*)?$/;function Ya(e){return!!e&&Ja.test(e)}function Xa(e,t){return e===void 0||t===void 0||e===`*`||t===`*`?!1:Ya(e)&&Ya(t)?e===t:!k.validRange(e)||!k.validRange(t)?!1:k.subset(e,t)}function Za(e,t){return Ya(e)?e===t:!k.validRange(e)||k.satisfies(t,e)}function Qa(e,t){return e===`*`?!1:Ya(e)?e===t:!!k.validRange(e)&&k.satisfies(t,e)}function*$a(e,t){for(let n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const eo=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],to={command:`setup-private-packages`,describe:"Materialize private dependencies for Docker builds: copy git dependencies, reuse installed @willbooster-private/* registry packages whose exact-version or semver-range specifier the installed copy satisfies, and download the rest (auth via .npmrc / ~/.npmrc locally, or VERDACCIO_TOKEN on CI; dist-tag specifiers such as `latest` always download). The Dockerfile must COPY the generated directories (e.g. `COPY @willbooster/ @willbooster/` and `COPY @willbooster-private/ @willbooster-private/`) so the in-image install resolves the rewritten file: paths.",builder:{"out-dir":{description:`Directory to copy private packages into`,type:`string`,default:`@willbooster`}},async handler(e){let t=on(e,!1);t||(console.error(p.red(`No project found.`)),process.exit(1));let n=await K(e,!1,t.root.dirPath);n||(console.error(p.red(`No project found.`)),process.exit(1));try{await ro(n.root.dirPath,no(n),{outDir:e.outDir,dryRun:!!e.dryRun})}catch(e){console.error(p.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function no(e){let t=new Map;for(let n of[e.root,...e.descendants])t.has(n.dirPath)||t.set(n.dirPath,n.packageJson);return[...t.values()]}async function ro(n,r,i={}){let{outDir:a=`@willbooster`,dryRun:o=!1}=i,s=lo(n),c=(e,n)=>{let r=t.resolve(s,e),i=lo(r);if(i!==r)throw Error(`${n} must not contain symlinks (${r} resolves to ${i}).`);return r},l=c(a,`--out-dir`);po(s,l);let u=c(J,`The ${J} output directory`);if(uo(l,u))throw Error(`--out-dir must not overlap the ${J} registry output directory.`);let d=c(t.join(`.tmp`,`wb-private-staging`),`The staging directory`),f=c(t.join(`.tmp`,`wb-private-backup`),`The backup directory`);if(uo(l,lo(t.join(s,`node_modules`))))throw Error(`--out-dir must not overlap node_modules.`);for(let[e,t]of[[`staging`,d],[`backup`,f]])if(uo(l,t)||uo(u,t))throw Error(`Output directories must not overlap the ${e} directory (${t}).`);let m=e=>t.join(d,t.relative(s,e));t.relative(s,l)!==`@willbooster`&&console.warn(p.yellow(`Note: wb optimizeForDockerBuild rewrites git dependencies to <root>/@willbooster; a custom --out-dir requires a matching Dockerfile layout.`));let h=await io(s,r,l,u);if(o){Eo(l,h);return}let g=[...h.values()].filter(e=>e.kind===`registry`&&!e.sourceDirPath),_=g.length>0?za(s):void 0;if(g.length>0&&!_)throw Error(`Cannot download ${g.map(e=>e.name).join(`, `)}: no registry configured for the ${J} scope; add "${J}:registry=..." to .npmrc or ~/.npmrc. Only installed copies satisfying an exact version or semver range are reused without registry access; dist-tag specifiers (e.g. \`latest\`) always require it.`);let v=[...h.values()].filter(e=>e.kind===`git`),y=[...h.values()].filter(e=>e.kind===`registry`);await e.promises.rm(d,{recursive:!0,force:!0});try{await e.promises.mkdir(m(l),{recursive:!0}),await e.promises.mkdir(m(u),{recursive:!0});for(let e of v)await oo(s,e,m(e.targetDirPath));for(let e of y){if(e.sourceDirPath){await oo(s,e,m(e.targetDirPath));continue}await Va(_,e.name,e.versionSpecifier??`latest`,m(e.targetDirPath)),e.resolvedVersion=_o(m(e.targetDirPath),e.name),console.info(`Downloaded ${e.name} to ${t.relative(s,e.targetDirPath)}`),await ao(s,_,e,h,l,u,m)}await xo(d,h,m),await Co([l,u],m,f)}finally{await e.promises.rm(d,{recursive:!0,force:!0})}console.info(`Ensure the Dockerfile COPYs ${t.relative(s,l)}/ and ${J}/ into the image before installing dependencies.`)}async function io(e,t,n,r){let i=new Map,a=[],o=new Map;for(let e of t)for(let t of vo(e,n,r)){let n=o.get(t.name);if(!n){o.set(t.name,t),a.push(t);continue}let r=bo(n,t);r===void 0?co(n,t,e.name??`a workspace manifest`):n.versionSpecifier=r.versionSpecifier}for(let t=0;t<a.length;t++){let s=a[t];if(s&&!i.has(s.name)){if(s.kind===`git`)s.sourceDirPath=mo(e,s.name);else{let t=ho(e,s);s.sourceDirPath=t?.dirPath,s.resolvedVersion=t?.version}if(i.set(s.name,s),s.sourceDirPath)for(let e of await wo(s.sourceDirPath)){let t=await To(e);for(let e of vo(t,n,r)){let t=o.get(e.name);if(!t){o.set(e.name,e),a.push(e);continue}if(i.has(e.name))co(t,e,s.name);else{let n=bo(t,e);n===void 0?co(t,e,s.name):t.versionSpecifier=n.versionSpecifier}}}}}return i}async function ao(e,t,n,r,i,a,o){let s=o(n.targetDirPath);for(let c of await wo(s))for(let s of vo(await To(c),i,a)){let c=r.get(s.name);if(c){if(c.kind===`registry`&&!c.sourceDirPath&&c.resolvedVersion===void 0){let e=bo(c,s);e===void 0?co(c,s,n.name):c.versionSpecifier=e.versionSpecifier}else co(c,s,n.name);continue}if(s.kind===`git`)s.sourceDirPath=mo(e,s.name),await oo(e,s,o(s.targetDirPath));else{let n=ho(e,s);s.sourceDirPath=n?.dirPath,s.resolvedVersion=n?.version,s.sourceDirPath?await oo(e,s,o(s.targetDirPath)):(await Va(t,s.name,s.versionSpecifier??`latest`,o(s.targetDirPath)),s.resolvedVersion=_o(o(s.targetDirPath),s.name),console.info(`Downloaded ${s.name} (nested dependency) to ${s.targetDirPath}`))}r.set(s.name,s),await ao(e,t,s,r,i,a,o)}}async function oo(n,r,i){let a=r.kind===`registry`?so(r.sourceDirPath):[];await e.promises.cp(r.sourceDirPath,i,{recursive:!0,force:!0,dereference:!0,filter:e=>{let n=t.relative(r.sourceDirPath,e).split(t.sep);if(n.includes(`.git`))return!1;let i=n.indexOf(`node_modules`);if(i===-1||a===!0)return!0;if(a.length===0)return!1;let[o,s]=n.slice(i+1);if(o===void 0)return!0;if(o.startsWith(`@`)&&s===void 0)return a.some(e=>e.startsWith(`${o}/`));let c=o.startsWith(`@`)?`${o}/${s}`:o;return a.includes(c)}}),console.info(`Copied ${r.name} to ${t.relative(n,r.targetDirPath)}`)}function so(n){try{let r=JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`)),i=r.bundleDependencies??r.bundledDependencies;return i===!0?!0:Array.isArray(i)?i.filter(e=>typeof e==`string`):[]}catch{return[]}}function co(e,t,n){if(!(e.kind===t.kind&&(e.versionSpecifier===t.versionSpecifier||Xa(e.versionSpecifier,t.versionSpecifier)||e.resolvedVersion!==void 0&&t.versionSpecifier!==void 0&&Qa(t.versionSpecifier,e.resolvedVersion))))throw Error(`Conflicting requirements for ${e.name}: ${e.versionSpecifier??e.kind} is already selected, but ${n} requires ${t.versionSpecifier??t.kind}. Only a single version per private package is supported.`)}function lo(n){let r=t.resolve(n),i=[];for(;!e.existsSync(r);){let e=t.dirname(r);if(e===r)break;i.unshift(t.basename(r)),r=e}try{return t.join(e.realpathSync(r),...i)}catch{return t.resolve(n)}}function uo(e,t){return fo(e,t)||fo(t,e)}function fo(e,n){let r=t.relative(e,n);return r===``||!r.startsWith(`..`)&&!t.isAbsolute(r)}function po(e,n){let r=t.relative(e,n);if(!(r&&!r.startsWith(`..`)&&!t.isAbsolute(r)))throw Error(`Output directory must be a subdirectory of the project root: ${n}`)}function mo(n,r){let i=Pa(r),a=t.join(n,`node_modules`,`@willbooster`,i);if(e.existsSync(t.join(a,`package.json`)))return e.realpathSync(a);let o=t.join(n,`node_modules`,`.bun`),s=new Set;try{for(let n of e.readdirSync(o,{withFileTypes:!0})){let r=t.join(o,n.name,`node_modules`,`@willbooster`,i);e.existsSync(t.join(r,`package.json`))&&s.add(e.realpathSync(r))}}catch{}if(s.size===1)return[...s][0];throw s.size>1?Error(`Multiple installed resolutions found for ${r}: ${[...s].join(`, `)}. Deduplicate the dependency so a single resolution remains.`):Error(`Private package is not installed: ${r} (${a})`)}function ho(n,r){let i=r.versionSpecifier??`latest`,a=t.join(`node_modules`,...r.name.split(`/`)),o=(t,n)=>{let a=_o(n,r.name);a&&Qa(i,a)&&t.set(e.realpathSync(n),a)},s=new Map;if(o(s,t.join(n,a)),s.size===1)return go(s);let c=new Map;try{for(let r of e.readdirSync(t.join(n,`node_modules`,`.bun`),{withFileTypes:!0}))o(c,t.join(n,`node_modules`,`.bun`,r.name,a))}catch{}return go(c)}function go(e){let[t]=e;return e.size===1&&t?{dirPath:t[0],version:t[1]}:void 0}function _o(n,r){try{let i=JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`));return i.name===r&&typeof i.version==`string`?i.version:void 0}catch{return}}function vo(e,n,r){let i=new Map;for(let a of eo){let o=e[a];if(o)for(let[e,a]of Object.entries(o)){let o=La(a);if(!o&&!Ra(e,a))continue;if(o&&!e.startsWith(`@willbooster/`))throw Error(`Private git dependency must be an @willbooster package: ${e}`);let s=Pa(e);if(!/^[\w.-]+$/.test(s)||s.startsWith(`.`))throw Error(`Invalid private package name: ${e}`);let c={name:e,kind:o?`git`:`registry`,sourceDirPath:void 0,resolvedVersion:void 0,targetDirPath:t.join(o?n:r,s),versionSpecifier:a},l=i.get(e);i.set(e,l?yo(l,c):c)}}return[...i.values()]}function yo(e,t){let n=bo(e,t);if(n)return n;throw Error(`Conflicting requirements for ${e.name} within one manifest: ${e.versionSpecifier??e.kind} vs ${t.versionSpecifier??t.kind}.`)}function bo(e,t){if(e.kind===t.kind){if(e.versionSpecifier===t.versionSpecifier||Xa(e.versionSpecifier,t.versionSpecifier))return e;if(Xa(t.versionSpecifier,e.versionSpecifier))return t}}async function xo(n,r,i){for(let a of r.values())for(let o of await wo(i(a.targetDirPath))){let a=await To(o);So(o,a,r,i)&&(await e.promises.writeFile(o,`${JSON.stringify(a,void 0,2)}\n`,`utf8`),console.info(`Rewrote private dependencies in ${t.relative(n,o)}`))}}function So(e,n,r,i){let a=!1;for(let o of eo){let s=n[o];if(s)for(let[n,o]of Object.entries(s)){if(!La(o)&&!Ra(n,o))continue;let c=r.get(n);c&&(s[n]=`file:${t.relative(t.dirname(e),i(c.targetDirPath))}`,a=!0)}}return a}async function Co(n,r,i){await e.promises.mkdir(t.dirname(i),{recursive:!0});let a=await e.promises.mkdtemp(`${i}-`),o=[],s=!1;try{for(let[i,s]of n.entries()){let n=t.join(a,String(i)),c=e.existsSync(s);c&&await e.promises.rename(s,n),o.push({outDirPath:s,backupDirPath:n,hadPreviousTree:c}),await e.promises.mkdir(t.dirname(s),{recursive:!0}),await e.promises.rename(r(s),s)}}catch(t){for(let t of o.toReversed())try{await e.promises.rm(t.outDirPath,{recursive:!0,force:!0}),t.hadPreviousTree&&await e.promises.rename(t.backupDirPath,t.outDirPath)}catch(e){s=!0,console.error(p.red(`Failed to restore ${t.outDirPath}: ${String(e)}\nThe previous materialization is kept at ${t.backupDirPath}; move it back by hand.`))}throw t}finally{if(!s)try{await e.promises.rm(a,{recursive:!0,force:!0})}catch(e){console.warn(p.yellow(`Failed to remove ${a}: ${String(e)}`))}}}async function wo(n){if(!e.existsSync(n))return[];let r=[];for(let i of await e.promises.readdir(n,{withFileTypes:!0})){if(i.name===`node_modules`||i.name===`.git`)continue;let e=t.join(n,i.name);if(i.isDirectory()){r.push(...await wo(e));continue}i.isFile()&&i.name===`package.json`&&r.push(e)}return r}async function To(t){return JSON.parse(await e.promises.readFile(t,`utf8`))}function Eo(e,t){console.info(`[dry-run] Would recreate ${e}`);for(let e of t.values())console.info(e.sourceDirPath?`[dry-run] Would copy ${e.name}: ${e.sourceDirPath}`:e.kind===`git`?`[dry-run] Would copy ${e.name}: (installed under node_modules)`:`[dry-run] Would download ${e.name}@${e.versionSpecifier} to ${e.targetDirPath}`);console.info(`[dry-run] Would rewrite copied private dependencies to file:../<name>`)}const Do=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],Oo=/\.(?:sqlite3?|db)(?:[-.](?:journal|shm|wal))?$/i,ko=[`.cache`,`.mypy_cache`,`.next/cache`,`.parcel-cache`,`.pytest_cache`,`.ruff_cache`,`.tox`,`.turbo`,`.venv`,`.yarn/cache`,`.yarn/install-state.gz`,`__pycache__`,`coverage`,`node_modules/.cache`,`playwright-report`,`storybook-static`,`target`,`test-results`],Ao=[`**/*.pyc`,`**/*.tsbuildinfo`,`**/__pycache__`],jo=[`prisma`,`db`,`drizzle`],Mo=[`/data`],No={command:`optimizeForDockerBuild`,describe:`Optimize configuration when building a Docker image`,builder:{outside:{description:`Whether the optimization is executed outside a docker container or not`,type:`boolean`,alias:`o`}},async handler(n){let r=await K(n);if(r||(console.error(p.red(`No project found.`)),process.exit(1)),n.outside){let e=no(await K(n,!1,r.root.dirPath)??r);if(e.some(Po))try{await ro(r.root.dirPath,e,{dryRun:!!n.dryRun})}catch(e){console.warn(p.yellow(`Could not auto-materialize private packages (${e instanceof Error?e.message:String(e)}); run \`wb setup-private-packages\` if the Docker build needs them. Continuing.`))}}let i=[];for(let a of $a(`optimizeForDockerBuild`,r.descendants)){let r=a.packageJson;Fo(a,r);let o=Vo(n,r);if(Uo(r,{removeWbPostinstall:!n.outside&&o.includes(`@willbooster/wb`)}),Wo(r),n.dryRun)continue;let s=n.outside?t.join(a.dirPath,`dist`):a.dirPath;await e.promises.mkdir(s,{recursive:!0}),await e.promises.writeFile(t.join(s,`package.json`),JSON.stringify(r),`utf8`),n.outside&&await zo(t.join(s,`bash`)),i.push(a)}!n.dryRun&&!n.outside&&(o.spawnSync(r.root.packageManagerCommand,[`install`],{stdio:`inherit`}),console.info(`Installed dependencies.`),await Go(i))}};function Po(e){return Do.some(t=>{let n=e[t];return n!==void 0&&Object.entries(n).some(([e,t])=>La(t)||Ra(e,t))})}function Fo(e,t){return Io(e.rootDirPath,e.dirPath,t)}function Io(e,t,n){let r=[];for(let i of Do){let a=n[i]??{};for(let[n,o]of Object.entries(a))if(La(o))a[n]=Lo(e,t,`@willbooster`,n),r.push(`${i}.${n}`);else if(Ra(n,o)){let s=Ro(e,n);if(s===void 0){console.warn(p.yellow(`${n} is not materialized under ${J}/; run \`wb setup-private-packages\` so the Docker build does not need registry credentials.`));continue}Za(o,s)||(console.error(p.red(`Materialized ${n} is ${s} but package.json requires ${o}; rerun \`wb setup-private-packages\`.`)),process.exit(1)),a[n]=Lo(e,t,J,n),r.push(`${i}.${n}`)}}return console.info(`Rewrote private dependencies:`,r.join(`, `)||`none`),r}function Lo(e,n,r,i){let a=t.join(e,r,Pa(i)),o=t.relative(n,a);return o.startsWith(`.`)?o:`./${o}`}function Ro(n,r){let i=t.join(n,J,Pa(r),`package.json`);try{return JSON.parse(e.readFileSync(i,`utf8`)).version}catch{return}}async function zo(n){let r=Bo();await e.promises.mkdir(n,{recursive:!0});for(let i of await e.promises.readdir(r,{withFileTypes:!0})){if(!i.isFile()||!i.name.endsWith(`.sh`))continue;let a=t.join(n,i.name);await e.promises.copyFile(t.join(r,i.name),a),await e.promises.chmod(a,493)}console.info(`Generated Docker shell scripts: ${t.relative(process.cwd(),n)||n}`)}function Bo(){let n=t.dirname(O(import.meta.url));for(;;){let r=t.join(n,`docker`,`bash`);if(e.existsSync(r))return r;let i=t.dirname(n);if(i===n)throw Error(`Docker shell scripts directory not found.`);n=i}}function Vo(e,t){if(e.outside)return Ho(t);let n=Object.keys(t.devDependencies??{});return delete t.devDependencies,console.info(`Removed all devDependencies.`),n}function Ho(e){let t=e.devDependencies??{},n=[`artillery`,`biome`,`concurrently`,`conventional-changelog-conventionalcommits`,`eslint`,`husky`,`imagemin`,`jest`,`kill-port`,`lint-staged`,`open-cli`,`oxfmt`,`oxlint`,`playwright`,`prettier`,`pinst`,`railway`,`semantic-release`,`sort-package-json`,`wait-on`,`vitest`],r=[];for(let e of Object.keys(t))(n.some(t=>e.includes(t))||e.includes(`willbooster`)&&e.includes(`config`))&&(delete t[e],r.push(e));return console.info(`Removed devDependencies:`,r.join(`, `)||`none`),r}function Uo(e,t){let n=[`check`,`deploy`,`format`,`lint`,`start`,`test`],r=[`pinst `,`husky `],i=e.scripts??{},a=[];for(let[e,o]of Object.entries(i))(t.removeWbPostinstall&&e===`postinstall`&&o.trim()===`wb gen-code`||n.some(t=>e.startsWith(t))||r.some(e=>o.includes(e)||o.trim()===e.trim()))&&(delete i[e],a.push(e));console.info(`Removed scripts:`,a.join(`, `)||`none`)}function Wo(e){delete e.private,delete e.publishConfig,delete e.prettier}async function Go(e){for(let t of e)await Ko(t),await Yo(t),us(t)}async function Ko(e){let t=[...await qo(e),...await Jo(e)];console.info(`Removed Docker build caches:`,t.join(`, `)||`none`)}async function qo(n){let r=[];for(let i of ko){let a=t.join(n.dirPath,i);e.existsSync(a)&&(await e.promises.rm(a,{force:!0,recursive:!0}),r.push(i))}return r}async function Jo(n){let r=await m(Ao,{cwd:n.dirPath,dot:!0,followSymbolicLinks:!1,ignore:[`**/node_modules`,`**/node_modules/**`,`**/.yarn`,`**/.yarn/**`,`**/.git`,`**/.git/**`],onlyFiles:!1});return await Promise.all(r.map(r=>e.promises.rm(t.join(n.dirPath,r),{force:!0,recursive:!0}))),r}async function Yo(e){let t=(await Promise.all([Xo(e),Qo(e)])).flat();console.info(`Removed generated local data:`,t.join(`, `)||`none`)}async function Xo(n){let r=Zo(n),i=[];for(let a of r){let r=t.join(n.dirPath,a);e.existsSync(r)&&(await e.promises.rm(r,{force:!0,recursive:!0}),i.push(a))}return i}function Zo(e){let n=jo.map(e=>t.join(e,`mount`)),r=$t(e);if(!r)return n;let i=t.dirname(r);if(t.basename(i)!==`mount`||!os(e,i))return n;let a=t.relative(e.dirPath,i);return a?[...new Set([...n,a])]:n}async function Qo(e){return(await Promise.all([$o(e),ts(e)])).flat()}async function $o(e){let t=await es(e);return(await Promise.all(t.map(t=>ls(e,t)))).flat()}async function es(e){let n=jo.map(n=>t.join(e.dirPath,n)),r=await Promise.all(n.map(e=>cs(e)));return n.filter((e,t)=>r[t])}async function ts(n){let r=ns(n),i=[];for(let a of r)for(let r of as(a))await ss(r)&&(await e.promises.rm(r,{force:!0}),i.push(t.relative(n.dirPath,r)));return i}function ns(e){let n=Qt(e),r=$t(e);if(!n||!r)return[];let i=t.isAbsolute(n)?[n]:[r,...jo.map(r=>t.resolve(e.dirPath,r,n))];return[...new Set(i)].filter(t=>rs(e,t))}function rs(e,t){return os(e,t)||is(e,t)}function is(e,n){return ut(e)?Mo.some(e=>{let r=t.relative(e,n);return r!==``&&r!==`..`&&!r.startsWith(`../`)}):!1}function as(e){return[e,`${e}-journal`,`${e}-shm`,`${e}-wal`,`${e}.journal`,`${e}.shm`,`${e}.wal`]}function os(e,n){let r=t.relative(e.dirPath,n);return r===``||r!==`..`&&!r.startsWith(`..${t.sep}`)}async function ss(t){try{return(await e.promises.stat(t)).isFile()}catch{return!1}}async function cs(t){try{return(await e.promises.stat(t)).isDirectory()}catch{return!1}}async function ls(n,r){let i=(await e.promises.readdir(r,{withFileTypes:!0})).filter(e=>e.isFile()&&Oo.test(e.name)).map(e=>e.name);await Promise.all(i.map(n=>e.promises.rm(t.join(r,n),{force:!0})));let a=t.relative(n.dirPath,r);return i.map(e=>t.join(a,e))}function us(n){if(!ut(n))return;let r=t.join(n.dirPath,`bash`,`cleanup.sh`);if(e.existsSync(r)&&o.spawnSync(`bash`,[r,`--keep-scripts`],{cwd:n.dirPath,stdio:`inherit`}).status!==0)throw Error(`Failed to run ${t.relative(n.dirPath,r)}`)}const Y={},ds={command:`prisma`,aliases:[`db`],describe:`Run database commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Drizzle projects use drizzle-kit. Example: wb prisma migrate-dev -- --name init`,builder:e=>e.parserConfiguration({"populate--":!0}).command(fs).command(ps).command(ms).command(hs).command(gs).command(vs).command(ys).command(Ss).command(Cs).command(ws).command(Ts).command(Es).command(Ds).demandCommand().strict(!1),handler(){}},fs={command:`cleanup-litestream`,describe:`Clean up temporal Litestream files`,builder:Y,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db cleanup-litestream`,t))await q(Z(n).cleanUpLitestream(r),r,e)}},ps={command:`create-litestream-config`,describe:`Create Litestream configuration file`,builder:{...Y,output:{description:`Output path of the Litestream configuration file.`,type:`string`,default:`/etc/litestream.yml`}},async handler(e){let t=await X(e);if(t.length>1)throw Error(`Creating Litestream configuration for multiple projects at once is not supported because they would overwrite each other.`);for(let{orm:n,project:r}of Q(`db create-litestream-config`,t))ks(r,n,e.output)}},ms={command:`deploy`,describe:`Apply migration to DB without initializing it`,builder:Y,async handler(e){let t=await X(e),n=Ms(e);for(let{orm:r,project:i}of Q(`db deploy`,t))await q(Os(r,i,Z(r).deploy(i,n)),i,e)}},hs={command:`deploy-force`,describe:`Force to apply migration to DB utilizing Litestream's backup without initializing it`,builder:Y,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db deploy-force`,t))await q(Z(n).deployForce(r),r,e)}},gs={command:`generate`,describe:`Generate ORM client code`,builder:Y,async handler(e){let t=await X(e),n=Ms(e);for(let{orm:r,project:i}of Q(`db generate`,t))await q(Z(r).generate(i,n),i,e)}},_s={...Y,config:{description:`Path of the Litestream configuration file.`,type:`string`}},vs={command:`list-backups`,describe:`List Litestream backups`,builder:_s,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db list-backups`,t))await q(Z(n).listBackups(r,e.config),r,e)}},ys={command:`migrate`,describe:`Apply migration to DB with initializing it`,builder:{...Y,"check-idempotency":{description:`Run the migration command twice to confirm it is idempotent.`,type:`boolean`}},async handler(e){let t=await X(e),n=Ms(e,[`check-idempotency`]);for(let{orm:r,project:i}of Q(`db migrate`,t)){let t=Z(r);await q(Os(r,i,t.migrate(i,n)),i,e),bs(i,e.checkIdempotency)&&(xs(i)?console.info(p.yellow(`Skipping idempotency check for ${i.name} in production environment.`)):await q(Os(r,i,t.deploy(i,n)),i,e))}}};function bs(e,t){return t??ut(e)}function xs(e){return an(e,`production`)}const Ss={command:`migrate-dev`,describe:`Create a migration file`,builder:Y,async handler(e){let t=await X(e),n=Ms(e);for(let{orm:r,project:i}of Q(`db migrate-dev`,t))await q(Z(r).migrateDev(i,n),i,e)}},Cs={command:`reset`,describe:`Reset DB`,builder:Y,async handler(e){let t=await X(e),n=Ms(e);for(let{orm:r,project:i}of Q(`db reset`,t))await q(Os(r,i,Z(r).reset(i,n)),i,e);if(process.env.WB_ENV!==`test`){process.env.WB_ENV=`test`;for(let{orm:t,project:r}of Q(`WB_ENV=test db reset`,await X(e)))await q(Os(t,r,Z(t).reset(r,n)),r,e)}}},ws={command:`restore`,describe:`Restore DB from Litestream's backup`,builder:{..._s,output:{description:`Output path of the restored database. Defaults to "<db|drizzle|prisma>/restored.sqlite3".`,type:`string`}},async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db restore`,t)){let t=e.output??As(r,n);await q(Z(n).restore(r,t,e.config),r,e)}}},Ts={command:`seed`,describe:`Populate DB with seed data`,builder:{...Y,file:{alias:`f`,description:`Path of the seed script.`,type:`string`}},async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db seed`,t))await q(Os(n,r,Z(n).seed(r,e.file)),r,e)}},Es={command:`studio [db-url-or-path]`,describe:`Open database studio`,builder:{...Y,"db-url-or-path":{description:`URL or path to the database`,type:`string`},restored:{description:`Whether to open the default restored database (<db|prisma>/restored.sqlite3).`,type:`boolean`}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw Error(`You cannot specify both --restored and --db-url-or-path.`);let n=await X(e),r=Ms(e,[`db-url-or-path`,`restored`]);for(let{orm:i,project:a}of Q(`db studio`,n)){let n=e.restored?t.resolve(a.dirPath,a.prismaDirName,`restored.sqlite3`):e.dbUrlOrPath?.toString();await q(Os(i,a,Z(i).studio(a,n,r)),a,e)}}},Ds={command:`$0 <args..>`,describe:`Pass the command and arguments to the detected ORM as is. Additional Prisma flags can also be forwarded after '--'.`,builder:{args:{type:`array`}},async handler(e){let t=await X(e),n=[(e.args?.join(` `)??``).trimEnd(),Ms(e,[`args`])].filter(Boolean).join(` `);for(let{orm:r,project:i}of Q(`db ${n}`,t))await q(Os(r,i,r===`prisma`?`PRISMA ${n}`:tr(i,n)),i,e)}};function Os(e,t,n){return e===`drizzle`?It(t,n):n}function ks(t,n,r){let i=js(t,n),a={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},o=Object.entries(a).filter(([,e])=>!e).map(([e])=>e);if(o.length>0)throw Error(`Missing environment variables for Litestream: ${o.join(`, `)}`);let s=`snapshot:
78
+ </html>`)})}async function Ta(e,t,n){await new Promise((r,i)=>{let a=t=>{e.off(`listening`,o),i(t)},o=()=>{e.off(`error`,a),e.on(`error`,n),r()};e.once(`error`,a),e.once(`listening`,o),e.listen(t,`0.0.0.0`)})}async function Ea(e){await new Promise(t=>{let n=()=>{process.off(`SIGINT`,n),process.off(`SIGTERM`,n),process.off(`SIGQUIT`,n),(async()=>{try{await Da(e)}catch(e){console.error(p.red(`Failed to close maintenance server: ${e.message}`))}finally{t()}})()};process.once(`SIGINT`,n),process.once(`SIGTERM`,n),process.once(`SIGQUIT`,n)})}async function Da(e){await new Promise((t,n)=>{e.close(e=>{if(e){if(e.code===`ERR_SERVER_NOT_RUNNING`){t();return}n(e);return}t()}),e.closeAllConnections()})}async function Oa(e,n){let r=Ma(e,n);return await C.mkdir(t.dirname(r),{recursive:!0}),await C.writeFile(r,`${process.pid}\n`,`utf8`),r}async function ka(e,t){let n=Ma(e,t),r=await ja(n);if(r!==void 0&&r!==process.pid){try{P(r,`SIGTERM`)}catch{}await ua(r)}await Aa(n,r)}async function Aa(e,t){t!==void 0&&await ja(e)!==t||await C.rm(e,{force:!0})}async function ja(e){try{let t=await C.readFile(e,`utf8`),n=Number(t.trim());return Number.isInteger(n)&&n>0?n:void 0}catch{return}}function Ma(e,t){return Na(e.rootDirPath,t)}function Na(e,n){return t.join(e,`.wb`,`maintenance-${n}.pid`)}const J=`@willbooster-private`;function Pa(e){return e.replace(/^@willbooster(?:-private)?\//,``)}const Fa=[`git:`,`git+`,`git@`,`file:`,`link:`,`workspace:`,`http:`,`https:`,`portal:`,`patch:`],Ia=/^git@github\.com:(?:WillBooster|WillBoosterLab)\/[^/#]+(?:\.git)?(?:#.*)?$/;function La(e){return typeof e==`string`&&Ia.test(e)}function Ra(e,t){return e.startsWith(`@willbooster-private/`)&&typeof t==`string`&&!Fa.some(e=>t.startsWith(e))}function za(n){let r={},i=[t.join(g.homedir(),`.npmrc`)];process.env.CI&&i.push(t.join(n,`.npmrc`));for(let t of i)try{Object.assign(r,Ba(e.readFileSync(t,`utf8`)))}catch{}let a=r[`${J}:registry`]?.replace(/\/+$/,``);if(!a)return;let o=`${a.replace(/^https?:/,``).replace(/\/+$/,``)}/`,s,c=-1;for(let[e,t]of Object.entries(r)){if(!e.endsWith(`:_authToken`)||!t)continue;let n=`${e.slice(0,-11).replace(/\/+$/,``)}/`;o.startsWith(n)&&n.length>c&&(c=n.length,s=t)}return{registryUrl:a,authToken:s??process.env.VERDACCIO_TOKEN}}function Ba(e){let t={};for(let n of e.split(`
79
+ `)){let e=n.trim();if(!e||e.startsWith(`#`)||e.startsWith(`;`))continue;let r=e.indexOf(`=`);if(r<=0)continue;let i=e.slice(0,r).trim();t[i]=e.slice(r+1).trim().replaceAll(/\$\{([^}]+)\}/g,(e,t)=>process.env[t]??``)}return t}async function Va(n,r,i,a){let s=await Ha(n,r,i),c=(await Wa(n,`${n.registryUrl}/${qa(r)}/${s}`)).dist?.tarball;if(!c)throw Error(`No tarball URL for ${r}@${s} in ${n.registryUrl}.`);let l=await Ga(n,c),u=t.join(await e.promises.mkdtemp(t.join(g.tmpdir(),`wb-private-package-`)),`package.tgz`);try{if(await e.promises.writeFile(u,Buffer.from(await l.arrayBuffer())),await e.promises.rm(a,{force:!0,recursive:!0}),await e.promises.mkdir(a,{recursive:!0}),o.spawnSync(`tar`,[`-xzf`,u,`-C`,a,`--strip-components=1`],{stdio:`inherit`}).status!==0)throw Error(`Failed to extract ${r}@${s} (${c}).`)}finally{await e.promises.rm(t.dirname(u),{force:!0,recursive:!0})}}async function Ha(e,t,n){if(Ya(n))return n;let r=Ua(n,await Wa(e,`${e.registryUrl}/${qa(t)}`));if(!r)throw Error(`Cannot resolve ${t}@${n} against ${e.registryUrl}; use an exact version, a semver range, or a dist-tag.`);return r}function Ua(e,t){return e!==`*`&&k.validRange(e)?k.maxSatisfying(Object.keys(t.versions??{}),e)??void 0:t[`dist-tags`]?.[e===`*`?`latest`:e]}async function Wa(e,t){return await(await Ga(e,t)).json()}async function Ga(e,t){let n=!!e.authToken&&Ka(t,e.registryUrl),r=await fetch(t,{headers:n?{authorization:`Bearer ${e.authToken}`}:{}});if(!r.ok)throw Error(`Failed to fetch ${t}: ${r.status} ${r.statusText}`);return r}function Ka(e,t){try{return new URL(e).origin===new URL(t).origin}catch{return!1}}function qa(e){return e.replace(`/`,`%2F`)}const Ja=/^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(?:\+[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*)?$/;function Ya(e){return!!e&&Ja.test(e)}function Xa(e,t){return e===void 0||t===void 0||e===`*`||t===`*`?!1:Ya(e)&&Ya(t)?e===t:!k.validRange(e)||!k.validRange(t)?!1:k.subset(e,t)}function Za(e,t){return Ya(e)?e===t:!k.validRange(e)||k.satisfies(t,e)}function Qa(e,t){return e===`*`?!1:Ya(e)?e===t:!!k.validRange(e)&&k.satisfies(t,e)}function*$a(e,t){for(let n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const eo=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],to={command:`setup-private-packages`,describe:"Materialize private dependencies for Docker builds: copy git dependencies, reuse installed @willbooster-private/* registry packages whose exact-version or semver-range specifier the installed copy satisfies, and download the rest (auth via .npmrc / ~/.npmrc locally, or VERDACCIO_TOKEN on CI; dist-tag specifiers such as `latest` always download). The Dockerfile must COPY the generated directories (e.g. `COPY @willbooster/ @willbooster/` and `COPY @willbooster-private/ @willbooster-private/`) so the in-image install resolves the rewritten file: paths.",builder:{"out-dir":{description:`Directory to copy private packages into`,type:`string`,default:`@willbooster`}},async handler(e){let t=on(e,!1);t||(console.error(p.red(`No project found.`)),process.exit(1));let n=await K(e,!1,t.root.dirPath);n||(console.error(p.red(`No project found.`)),process.exit(1));try{await ro(n.root.dirPath,no(n),{outDir:e.outDir,dryRun:!!e.dryRun})}catch(e){console.error(p.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function no(e){let t=new Map;for(let n of[e.root,...e.descendants])t.has(n.dirPath)||t.set(n.dirPath,n.packageJson);return[...t.values()]}async function ro(n,r,i={}){let{outDir:a=`@willbooster`,dryRun:o=!1}=i,s=lo(n),c=(e,n)=>{let r=t.resolve(s,e),i=lo(r);if(i!==r)throw Error(`${n} must not contain symlinks (${r} resolves to ${i}).`);return r},l=c(a,`--out-dir`);po(s,l);let u=c(J,`The ${J} output directory`);if(uo(l,u))throw Error(`--out-dir must not overlap the ${J} registry output directory.`);let d=c(t.join(`.tmp`,`wb-private-staging`),`The staging directory`),f=c(t.join(`.tmp`,`wb-private-backup`),`The backup directory`);if(uo(l,lo(t.join(s,`node_modules`))))throw Error(`--out-dir must not overlap node_modules.`);for(let[e,t]of[[`staging`,d],[`backup`,f]])if(uo(l,t)||uo(u,t))throw Error(`Output directories must not overlap the ${e} directory (${t}).`);let m=e=>t.join(d,t.relative(s,e));t.relative(s,l)!==`@willbooster`&&console.warn(p.yellow(`Note: wb optimizeForDockerBuild rewrites git dependencies to <root>/@willbooster; a custom --out-dir requires a matching Dockerfile layout.`));let h=await io(s,r,l,u);if(o){Eo(l,h);return}let g=[...h.values()].filter(e=>e.kind===`registry`&&!e.sourceDirPath),_=g.length>0?za(s):void 0;if(g.length>0&&!_)throw Error(`Cannot download ${g.map(e=>e.name).join(`, `)}: no registry configured for the ${J} scope; add "${J}:registry=..." to ~/.npmrc. Only installed copies satisfying an exact version or semver range are reused without registry access; dist-tag specifiers (e.g. \`latest\`) always require it.`);let v=[...h.values()].filter(e=>e.kind===`git`),y=[...h.values()].filter(e=>e.kind===`registry`);await e.promises.rm(d,{recursive:!0,force:!0});try{await e.promises.mkdir(m(l),{recursive:!0}),await e.promises.mkdir(m(u),{recursive:!0});for(let e of v)await oo(s,e,m(e.targetDirPath));for(let e of y){if(e.sourceDirPath){await oo(s,e,m(e.targetDirPath));continue}await Va(_,e.name,e.versionSpecifier??`latest`,m(e.targetDirPath)),e.resolvedVersion=_o(m(e.targetDirPath),e.name),console.info(`Downloaded ${e.name} to ${t.relative(s,e.targetDirPath)}`),await ao(s,_,e,h,l,u,m)}await xo(d,h,m),await Co([l,u],m,f)}finally{await e.promises.rm(d,{recursive:!0,force:!0})}console.info(`Ensure the Dockerfile COPYs ${t.relative(s,l)}/ and ${J}/ into the image before installing dependencies.`)}async function io(e,t,n,r){let i=new Map,a=[],o=new Map;for(let e of t)for(let t of vo(e,n,r)){let n=o.get(t.name);if(!n){o.set(t.name,t),a.push(t);continue}let r=bo(n,t);r===void 0?co(n,t,e.name??`a workspace manifest`):n.versionSpecifier=r.versionSpecifier}for(let t=0;t<a.length;t++){let s=a[t];if(s&&!i.has(s.name)){if(s.kind===`git`)s.sourceDirPath=mo(e,s.name);else{let t=ho(e,s);s.sourceDirPath=t?.dirPath,s.resolvedVersion=t?.version}if(i.set(s.name,s),s.sourceDirPath)for(let e of await wo(s.sourceDirPath)){let t=await To(e);for(let e of vo(t,n,r)){let t=o.get(e.name);if(!t){o.set(e.name,e),a.push(e);continue}if(i.has(e.name))co(t,e,s.name);else{let n=bo(t,e);n===void 0?co(t,e,s.name):t.versionSpecifier=n.versionSpecifier}}}}}return i}async function ao(e,t,n,r,i,a,o){let s=o(n.targetDirPath);for(let c of await wo(s))for(let s of vo(await To(c),i,a)){let c=r.get(s.name);if(c){if(c.kind===`registry`&&!c.sourceDirPath&&c.resolvedVersion===void 0){let e=bo(c,s);e===void 0?co(c,s,n.name):c.versionSpecifier=e.versionSpecifier}else co(c,s,n.name);continue}if(s.kind===`git`)s.sourceDirPath=mo(e,s.name),await oo(e,s,o(s.targetDirPath));else{let n=ho(e,s);s.sourceDirPath=n?.dirPath,s.resolvedVersion=n?.version,s.sourceDirPath?await oo(e,s,o(s.targetDirPath)):(await Va(t,s.name,s.versionSpecifier??`latest`,o(s.targetDirPath)),s.resolvedVersion=_o(o(s.targetDirPath),s.name),console.info(`Downloaded ${s.name} (nested dependency) to ${s.targetDirPath}`))}r.set(s.name,s),await ao(e,t,s,r,i,a,o)}}async function oo(n,r,i){let a=r.kind===`registry`?so(r.sourceDirPath):[];await e.promises.cp(r.sourceDirPath,i,{recursive:!0,force:!0,dereference:!0,filter:e=>{let n=t.relative(r.sourceDirPath,e).split(t.sep);if(n.includes(`.git`))return!1;let i=n.indexOf(`node_modules`);if(i===-1||a===!0)return!0;if(a.length===0)return!1;let[o,s]=n.slice(i+1);if(o===void 0)return!0;if(o.startsWith(`@`)&&s===void 0)return a.some(e=>e.startsWith(`${o}/`));let c=o.startsWith(`@`)?`${o}/${s}`:o;return a.includes(c)}}),console.info(`Copied ${r.name} to ${t.relative(n,r.targetDirPath)}`)}function so(n){try{let r=JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`)),i=r.bundleDependencies??r.bundledDependencies;return i===!0?!0:Array.isArray(i)?i.filter(e=>typeof e==`string`):[]}catch{return[]}}function co(e,t,n){if(!(e.kind===t.kind&&(e.versionSpecifier===t.versionSpecifier||Xa(e.versionSpecifier,t.versionSpecifier)||e.resolvedVersion!==void 0&&t.versionSpecifier!==void 0&&Qa(t.versionSpecifier,e.resolvedVersion))))throw Error(`Conflicting requirements for ${e.name}: ${e.versionSpecifier??e.kind} is already selected, but ${n} requires ${t.versionSpecifier??t.kind}. Only a single version per private package is supported.`)}function lo(n){let r=t.resolve(n),i=[];for(;!e.existsSync(r);){let e=t.dirname(r);if(e===r)break;i.unshift(t.basename(r)),r=e}try{return t.join(e.realpathSync(r),...i)}catch{return t.resolve(n)}}function uo(e,t){return fo(e,t)||fo(t,e)}function fo(e,n){let r=t.relative(e,n);return r===``||!r.startsWith(`..`)&&!t.isAbsolute(r)}function po(e,n){let r=t.relative(e,n);if(!(r&&!r.startsWith(`..`)&&!t.isAbsolute(r)))throw Error(`Output directory must be a subdirectory of the project root: ${n}`)}function mo(n,r){let i=Pa(r),a=t.join(n,`node_modules`,`@willbooster`,i);if(e.existsSync(t.join(a,`package.json`)))return e.realpathSync(a);let o=t.join(n,`node_modules`,`.bun`),s=new Set;try{for(let n of e.readdirSync(o,{withFileTypes:!0})){let r=t.join(o,n.name,`node_modules`,`@willbooster`,i);e.existsSync(t.join(r,`package.json`))&&s.add(e.realpathSync(r))}}catch{}if(s.size===1)return[...s][0];throw s.size>1?Error(`Multiple installed resolutions found for ${r}: ${[...s].join(`, `)}. Deduplicate the dependency so a single resolution remains.`):Error(`Private package is not installed: ${r} (${a})`)}function ho(n,r){let i=r.versionSpecifier??`latest`,a=t.join(`node_modules`,...r.name.split(`/`)),o=(t,n)=>{let a=_o(n,r.name);a&&Qa(i,a)&&t.set(e.realpathSync(n),a)},s=new Map;if(o(s,t.join(n,a)),s.size===1)return go(s);let c=new Map;try{for(let r of e.readdirSync(t.join(n,`node_modules`,`.bun`),{withFileTypes:!0}))o(c,t.join(n,`node_modules`,`.bun`,r.name,a))}catch{}return go(c)}function go(e){let[t]=e;return e.size===1&&t?{dirPath:t[0],version:t[1]}:void 0}function _o(n,r){try{let i=JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`));return i.name===r&&typeof i.version==`string`?i.version:void 0}catch{return}}function vo(e,n,r){let i=new Map;for(let a of eo){let o=e[a];if(o)for(let[e,a]of Object.entries(o)){let o=La(a);if(!o&&!Ra(e,a))continue;if(o&&!e.startsWith(`@willbooster/`))throw Error(`Private git dependency must be an @willbooster package: ${e}`);let s=Pa(e);if(!/^[\w.-]+$/.test(s)||s.startsWith(`.`))throw Error(`Invalid private package name: ${e}`);let c={name:e,kind:o?`git`:`registry`,sourceDirPath:void 0,resolvedVersion:void 0,targetDirPath:t.join(o?n:r,s),versionSpecifier:a},l=i.get(e);i.set(e,l?yo(l,c):c)}}return[...i.values()]}function yo(e,t){let n=bo(e,t);if(n)return n;throw Error(`Conflicting requirements for ${e.name} within one manifest: ${e.versionSpecifier??e.kind} vs ${t.versionSpecifier??t.kind}.`)}function bo(e,t){if(e.kind===t.kind){if(e.versionSpecifier===t.versionSpecifier||Xa(e.versionSpecifier,t.versionSpecifier))return e;if(Xa(t.versionSpecifier,e.versionSpecifier))return t}}async function xo(n,r,i){for(let a of r.values())for(let o of await wo(i(a.targetDirPath))){let a=await To(o);So(o,a,r,i)&&(await e.promises.writeFile(o,`${JSON.stringify(a,void 0,2)}\n`,`utf8`),console.info(`Rewrote private dependencies in ${t.relative(n,o)}`))}}function So(e,n,r,i){let a=!1;for(let o of eo){let s=n[o];if(s)for(let[n,o]of Object.entries(s)){if(!La(o)&&!Ra(n,o))continue;let c=r.get(n);c&&(s[n]=`file:${t.relative(t.dirname(e),i(c.targetDirPath))}`,a=!0)}}return a}async function Co(n,r,i){await e.promises.mkdir(t.dirname(i),{recursive:!0});let a=await e.promises.mkdtemp(`${i}-`),o=[],s=!1;try{for(let[i,s]of n.entries()){let n=t.join(a,String(i)),c=e.existsSync(s);c&&await e.promises.rename(s,n),o.push({outDirPath:s,backupDirPath:n,hadPreviousTree:c}),await e.promises.mkdir(t.dirname(s),{recursive:!0}),await e.promises.rename(r(s),s)}}catch(t){for(let t of o.toReversed())try{await e.promises.rm(t.outDirPath,{recursive:!0,force:!0}),t.hadPreviousTree&&await e.promises.rename(t.backupDirPath,t.outDirPath)}catch(e){s=!0,console.error(p.red(`Failed to restore ${t.outDirPath}: ${String(e)}\nThe previous materialization is kept at ${t.backupDirPath}; move it back by hand.`))}throw t}finally{if(!s)try{await e.promises.rm(a,{recursive:!0,force:!0})}catch(e){console.warn(p.yellow(`Failed to remove ${a}: ${String(e)}`))}}}async function wo(n){if(!e.existsSync(n))return[];let r=[];for(let i of await e.promises.readdir(n,{withFileTypes:!0})){if(i.name===`node_modules`||i.name===`.git`)continue;let e=t.join(n,i.name);if(i.isDirectory()){r.push(...await wo(e));continue}i.isFile()&&i.name===`package.json`&&r.push(e)}return r}async function To(t){return JSON.parse(await e.promises.readFile(t,`utf8`))}function Eo(e,t){console.info(`[dry-run] Would recreate ${e}`);for(let e of t.values())console.info(e.sourceDirPath?`[dry-run] Would copy ${e.name}: ${e.sourceDirPath}`:e.kind===`git`?`[dry-run] Would copy ${e.name}: (installed under node_modules)`:`[dry-run] Would download ${e.name}@${e.versionSpecifier} to ${e.targetDirPath}`);console.info(`[dry-run] Would rewrite copied private dependencies to file:../<name>`)}const Do=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],Oo=/\.(?:sqlite3?|db)(?:[-.](?:journal|shm|wal))?$/i,ko=[`.cache`,`.mypy_cache`,`.next/cache`,`.parcel-cache`,`.pytest_cache`,`.ruff_cache`,`.tox`,`.turbo`,`.venv`,`.yarn/cache`,`.yarn/install-state.gz`,`__pycache__`,`coverage`,`node_modules/.cache`,`playwright-report`,`storybook-static`,`target`,`test-results`],Ao=[`**/*.pyc`,`**/*.tsbuildinfo`,`**/__pycache__`],jo=[`prisma`,`db`,`drizzle`],Mo=[`/data`],No={command:`optimizeForDockerBuild`,describe:`Optimize configuration when building a Docker image`,builder:{outside:{description:`Whether the optimization is executed outside a docker container or not`,type:`boolean`,alias:`o`}},async handler(n){let r=await K(n);if(r||(console.error(p.red(`No project found.`)),process.exit(1)),n.outside){let e=no(await K(n,!1,r.root.dirPath)??r);if(e.some(Po))try{await ro(r.root.dirPath,e,{dryRun:!!n.dryRun})}catch(e){console.warn(p.yellow(`Could not auto-materialize private packages (${e instanceof Error?e.message:String(e)}); run \`wb setup-private-packages\` if the Docker build needs them. Continuing.`))}}let i=[];for(let a of $a(`optimizeForDockerBuild`,r.descendants)){let r=a.packageJson;Fo(a,r);let o=Vo(n,r);if(Uo(r,{removeWbPostinstall:!n.outside&&o.includes(`@willbooster/wb`)}),Wo(r),n.dryRun)continue;let s=n.outside?t.join(a.dirPath,`dist`):a.dirPath;await e.promises.mkdir(s,{recursive:!0}),await e.promises.writeFile(t.join(s,`package.json`),JSON.stringify(r),`utf8`),n.outside&&await zo(t.join(s,`bash`)),i.push(a)}!n.dryRun&&!n.outside&&(o.spawnSync(r.root.packageManagerCommand,[`install`],{stdio:`inherit`}),console.info(`Installed dependencies.`),await Go(i))}};function Po(e){return Do.some(t=>{let n=e[t];return n!==void 0&&Object.entries(n).some(([e,t])=>La(t)||Ra(e,t))})}function Fo(e,t){return Io(e.rootDirPath,e.dirPath,t)}function Io(e,t,n){let r=[];for(let i of Do){let a=n[i]??{};for(let[n,o]of Object.entries(a))if(La(o))a[n]=Lo(e,t,`@willbooster`,n),r.push(`${i}.${n}`);else if(Ra(n,o)){let s=Ro(e,n);if(s===void 0){console.warn(p.yellow(`${n} is not materialized under ${J}/; run \`wb setup-private-packages\` so the Docker build does not need registry credentials.`));continue}Za(o,s)||(console.error(p.red(`Materialized ${n} is ${s} but package.json requires ${o}; rerun \`wb setup-private-packages\`.`)),process.exit(1)),a[n]=Lo(e,t,J,n),r.push(`${i}.${n}`)}}return console.info(`Rewrote private dependencies:`,r.join(`, `)||`none`),r}function Lo(e,n,r,i){let a=t.join(e,r,Pa(i)),o=t.relative(n,a);return o.startsWith(`.`)?o:`./${o}`}function Ro(n,r){let i=t.join(n,J,Pa(r),`package.json`);try{return JSON.parse(e.readFileSync(i,`utf8`)).version}catch{return}}async function zo(n){let r=Bo();await e.promises.mkdir(n,{recursive:!0});for(let i of await e.promises.readdir(r,{withFileTypes:!0})){if(!i.isFile()||!i.name.endsWith(`.sh`))continue;let a=t.join(n,i.name);await e.promises.copyFile(t.join(r,i.name),a),await e.promises.chmod(a,493)}console.info(`Generated Docker shell scripts: ${t.relative(process.cwd(),n)||n}`)}function Bo(){let n=t.dirname(O(import.meta.url));for(;;){let r=t.join(n,`docker`,`bash`);if(e.existsSync(r))return r;let i=t.dirname(n);if(i===n)throw Error(`Docker shell scripts directory not found.`);n=i}}function Vo(e,t){if(e.outside)return Ho(t);let n=Object.keys(t.devDependencies??{});return delete t.devDependencies,console.info(`Removed all devDependencies.`),n}function Ho(e){let t=e.devDependencies??{},n=[`artillery`,`biome`,`concurrently`,`conventional-changelog-conventionalcommits`,`eslint`,`husky`,`imagemin`,`jest`,`kill-port`,`lint-staged`,`open-cli`,`oxfmt`,`oxlint`,`playwright`,`prettier`,`pinst`,`railway`,`semantic-release`,`sort-package-json`,`wait-on`,`vitest`],r=[];for(let e of Object.keys(t))(n.some(t=>e.includes(t))||e.includes(`willbooster`)&&e.includes(`config`))&&(delete t[e],r.push(e));return console.info(`Removed devDependencies:`,r.join(`, `)||`none`),r}function Uo(e,t){let n=[`check`,`deploy`,`format`,`lint`,`start`,`test`],r=[`pinst `,`husky `],i=e.scripts??{},a=[];for(let[e,o]of Object.entries(i))(t.removeWbPostinstall&&e===`postinstall`&&o.trim()===`wb gen-code`||n.some(t=>e.startsWith(t))||r.some(e=>o.includes(e)||o.trim()===e.trim()))&&(delete i[e],a.push(e));console.info(`Removed scripts:`,a.join(`, `)||`none`)}function Wo(e){delete e.private,delete e.publishConfig,delete e.prettier}async function Go(e){for(let t of e)await Ko(t),await Yo(t),us(t)}async function Ko(e){let t=[...await qo(e),...await Jo(e)];console.info(`Removed Docker build caches:`,t.join(`, `)||`none`)}async function qo(n){let r=[];for(let i of ko){let a=t.join(n.dirPath,i);e.existsSync(a)&&(await e.promises.rm(a,{force:!0,recursive:!0}),r.push(i))}return r}async function Jo(n){let r=await m(Ao,{cwd:n.dirPath,dot:!0,followSymbolicLinks:!1,ignore:[`**/node_modules`,`**/node_modules/**`,`**/.yarn`,`**/.yarn/**`,`**/.git`,`**/.git/**`],onlyFiles:!1});return await Promise.all(r.map(r=>e.promises.rm(t.join(n.dirPath,r),{force:!0,recursive:!0}))),r}async function Yo(e){let t=(await Promise.all([Xo(e),Qo(e)])).flat();console.info(`Removed generated local data:`,t.join(`, `)||`none`)}async function Xo(n){let r=Zo(n),i=[];for(let a of r){let r=t.join(n.dirPath,a);e.existsSync(r)&&(await e.promises.rm(r,{force:!0,recursive:!0}),i.push(a))}return i}function Zo(e){let n=jo.map(e=>t.join(e,`mount`)),r=$t(e);if(!r)return n;let i=t.dirname(r);if(t.basename(i)!==`mount`||!os(e,i))return n;let a=t.relative(e.dirPath,i);return a?[...new Set([...n,a])]:n}async function Qo(e){return(await Promise.all([$o(e),ts(e)])).flat()}async function $o(e){let t=await es(e);return(await Promise.all(t.map(t=>ls(e,t)))).flat()}async function es(e){let n=jo.map(n=>t.join(e.dirPath,n)),r=await Promise.all(n.map(e=>cs(e)));return n.filter((e,t)=>r[t])}async function ts(n){let r=ns(n),i=[];for(let a of r)for(let r of as(a))await ss(r)&&(await e.promises.rm(r,{force:!0}),i.push(t.relative(n.dirPath,r)));return i}function ns(e){let n=Qt(e),r=$t(e);if(!n||!r)return[];let i=t.isAbsolute(n)?[n]:[r,...jo.map(r=>t.resolve(e.dirPath,r,n))];return[...new Set(i)].filter(t=>rs(e,t))}function rs(e,t){return os(e,t)||is(e,t)}function is(e,n){return ut(e)?Mo.some(e=>{let r=t.relative(e,n);return r!==``&&r!==`..`&&!r.startsWith(`../`)}):!1}function as(e){return[e,`${e}-journal`,`${e}-shm`,`${e}-wal`,`${e}.journal`,`${e}.shm`,`${e}.wal`]}function os(e,n){let r=t.relative(e.dirPath,n);return r===``||r!==`..`&&!r.startsWith(`..${t.sep}`)}async function ss(t){try{return(await e.promises.stat(t)).isFile()}catch{return!1}}async function cs(t){try{return(await e.promises.stat(t)).isDirectory()}catch{return!1}}async function ls(n,r){let i=(await e.promises.readdir(r,{withFileTypes:!0})).filter(e=>e.isFile()&&Oo.test(e.name)).map(e=>e.name);await Promise.all(i.map(n=>e.promises.rm(t.join(r,n),{force:!0})));let a=t.relative(n.dirPath,r);return i.map(e=>t.join(a,e))}function us(n){if(!ut(n))return;let r=t.join(n.dirPath,`bash`,`cleanup.sh`);if(e.existsSync(r)&&o.spawnSync(`bash`,[r,`--keep-scripts`],{cwd:n.dirPath,stdio:`inherit`}).status!==0)throw Error(`Failed to run ${t.relative(n.dirPath,r)}`)}const Y={},ds={command:`prisma`,aliases:[`db`],describe:`Run database commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Drizzle projects use drizzle-kit. Example: wb prisma migrate-dev -- --name init`,builder:e=>e.parserConfiguration({"populate--":!0}).command(fs).command(ps).command(ms).command(hs).command(gs).command(vs).command(ys).command(Ss).command(Cs).command(ws).command(Ts).command(Es).command(Ds).demandCommand().strict(!1),handler(){}},fs={command:`cleanup-litestream`,describe:`Clean up temporal Litestream files`,builder:Y,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db cleanup-litestream`,t))await q(Z(n).cleanUpLitestream(r),r,e)}},ps={command:`create-litestream-config`,describe:`Create Litestream configuration file`,builder:{...Y,output:{description:`Output path of the Litestream configuration file.`,type:`string`,default:`/etc/litestream.yml`}},async handler(e){let t=await X(e);if(t.length>1)throw Error(`Creating Litestream configuration for multiple projects at once is not supported because they would overwrite each other.`);for(let{orm:n,project:r}of Q(`db create-litestream-config`,t))ks(r,n,e.output)}},ms={command:`deploy`,describe:`Apply migration to DB without initializing it`,builder:Y,async handler(e){let t=await X(e),n=Ms(e);for(let{orm:r,project:i}of Q(`db deploy`,t))await q(Os(r,i,Z(r).deploy(i,n)),i,e)}},hs={command:`deploy-force`,describe:`Force to apply migration to DB utilizing Litestream's backup without initializing it`,builder:Y,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db deploy-force`,t))await q(Z(n).deployForce(r),r,e)}},gs={command:`generate`,describe:`Generate ORM client code`,builder:Y,async handler(e){let t=await X(e),n=Ms(e);for(let{orm:r,project:i}of Q(`db generate`,t))await q(Z(r).generate(i,n),i,e)}},_s={...Y,config:{description:`Path of the Litestream configuration file.`,type:`string`}},vs={command:`list-backups`,describe:`List Litestream backups`,builder:_s,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db list-backups`,t))await q(Z(n).listBackups(r,e.config),r,e)}},ys={command:`migrate`,describe:`Apply migration to DB with initializing it`,builder:{...Y,"check-idempotency":{description:`Run the migration command twice to confirm it is idempotent.`,type:`boolean`}},async handler(e){let t=await X(e),n=Ms(e,[`check-idempotency`]);for(let{orm:r,project:i}of Q(`db migrate`,t)){let t=Z(r);await q(Os(r,i,t.migrate(i,n)),i,e),bs(i,e.checkIdempotency)&&(xs(i)?console.info(p.yellow(`Skipping idempotency check for ${i.name} in production environment.`)):await q(Os(r,i,t.deploy(i,n)),i,e))}}};function bs(e,t){return t??ut(e)}function xs(e){return an(e,`production`)}const Ss={command:`migrate-dev`,describe:`Create a migration file`,builder:Y,async handler(e){let t=await X(e),n=Ms(e);for(let{orm:r,project:i}of Q(`db migrate-dev`,t))await q(Z(r).migrateDev(i,n),i,e)}},Cs={command:`reset`,describe:`Reset DB`,builder:Y,async handler(e){let t=await X(e),n=Ms(e);for(let{orm:r,project:i}of Q(`db reset`,t))await q(Os(r,i,Z(r).reset(i,n)),i,e);if(process.env.WB_ENV!==`test`){process.env.WB_ENV=`test`;for(let{orm:t,project:r}of Q(`WB_ENV=test db reset`,await X(e)))await q(Os(t,r,Z(t).reset(r,n)),r,e)}}},ws={command:`restore`,describe:`Restore DB from Litestream's backup`,builder:{..._s,output:{description:`Output path of the restored database. Defaults to "<db|drizzle|prisma>/restored.sqlite3".`,type:`string`}},async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db restore`,t)){let t=e.output??As(r,n);await q(Z(n).restore(r,t,e.config),r,e)}}},Ts={command:`seed`,describe:`Populate DB with seed data`,builder:{...Y,file:{alias:`f`,description:`Path of the seed script.`,type:`string`}},async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db seed`,t))await q(Os(n,r,Z(n).seed(r,e.file)),r,e)}},Es={command:`studio [db-url-or-path]`,describe:`Open database studio`,builder:{...Y,"db-url-or-path":{description:`URL or path to the database`,type:`string`},restored:{description:`Whether to open the default restored database (<db|prisma>/restored.sqlite3).`,type:`boolean`}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw Error(`You cannot specify both --restored and --db-url-or-path.`);let n=await X(e),r=Ms(e,[`db-url-or-path`,`restored`]);for(let{orm:i,project:a}of Q(`db studio`,n)){let n=e.restored?t.resolve(a.dirPath,a.prismaDirName,`restored.sqlite3`):e.dbUrlOrPath?.toString();await q(Os(i,a,Z(i).studio(a,n,r)),a,e)}}},Ds={command:`$0 <args..>`,describe:`Pass the command and arguments to the detected ORM as is. Additional Prisma flags can also be forwarded after '--'.`,builder:{args:{type:`array`}},async handler(e){let t=await X(e),n=[(e.args?.join(` `)??``).trimEnd(),Ms(e,[`args`])].filter(Boolean).join(` `);for(let{orm:r,project:i}of Q(`db ${n}`,t))await q(Os(r,i,r===`prisma`?`PRISMA ${n}`:tr(i,n)),i,e)}};function Os(e,t,n){return e===`drizzle`?It(t,n):n}function ks(t,n,r){let i=js(t,n),a={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},o=Object.entries(a).filter(([,e])=>!e).map(([e])=>e);if(o.length>0)throw Error(`Missing environment variables for Litestream: ${o.join(`, `)}`);let s=`snapshot:
80
80
  interval: 24h # Create a backup per day
81
81
  retention: 72h # Keep backups for 3 days
82
82
  dbs:
@@ -105,7 +105,7 @@ dbs:
105
105
  || ${$(t,`-t 10000 -i 2000`)} 2> /dev/null
106
106
  || ${$(t,`-t 20000 -i 4000`)} 2> /dev/null
107
107
  || ${$(t,`-t 60000 -i 5000`)} 2> /dev/null
108
- || ${$(t,`-t 90000 -i 10000`)}`}waitAndOpenApp(e){let t=e.env.PORT;return`${this.waitApp(e)} || ${$(t)} && open-cli http://\${HOST:-localhost}:${t}`}};function $(e,t){return`NO_PROXY=localhost no_proxy=localhost wait-on ${t?`${t} `:``}http-get://localhost:${e}`}function vc(e){try{return e.findFile(`scripts/start-production.sh`)}catch{return}}function yc(e){try{return e.findFile(`ecosystem.config.cjs`)}catch{return}}function bc(e,t,n,r=[]){let i=[`BUN`,`playwright`],a=t?.map(String);if(e[0]!==`test`||!a?.length)return xc([...i,...e,...r],n);let o=e.slice(1),s=Sc(o),c=s.length===0?o:o.filter((e,t)=>!s.includes(t));return xc([...i,`test`,...a,...c,...r],n)}function xc(e,t){let n=e.indexOf(`playwright`),r=n!==-1&&e[n+1]===`test`;return!t||!r||e.some(e=>e===`--max-failures`||e.startsWith(`--max-failures=`))?U(e):U([...e,`--max-failures=1`])}function Sc(e){let t,n=[];for(let[r,i]of e.entries()){if(t){if(t===`required`||!i.startsWith(`-`)){t=void 0;continue}t=void 0}if(i===`--`)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(i.startsWith(`--`)){if(i.includes(`=`))continue;Cc.has(i)?t=`required`:wc.has(i)&&(t=`optional`);continue}if(i.startsWith(`-`)&&i!==`-`){let e=i.slice(0,2);i.length===2&&Tc.has(e)&&(t=`required`);continue}n.push(r)}return n}const Cc=new Set([`--browser`,`--config`,`--grep`,`--grep-invert`,`--global-timeout`,`--max-failures`,`--output`,`--project`,`--repeat-each`,`--reporter`,`--retries`,`--shard`,`--test-list`,`--test-list-invert`,`--timeout`,`--trace`,`--tsconfig`,`--ui-host`,`--ui-port`,`--ui-title`,`--workers`]),wc=new Set([`--only-changed`,`--update-snapshots`,`--update-source-method`]),Tc=new Set([`-c`,`-g`,`-j`]);var Ec=class extends _c{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?`--watch`:``} src/index.ts -- ${t.normalizedArgsText??``}`}async testE2EProtected(e,t,n,r={}){if(e.hasPlaywrightConfig)return super.testE2EProtected(e,t,n,r);e.env.PORT||=`3000`;let i=await na(e.env.PORT,e),a=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``,o=t.targets?.map(String),s=o?.length?o:[`test/e2e/`],c=this.testUnit(e,{...t,targets:s});return U([`YARN`,`wb`,`concurrently`,...kt(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`${$(i,`-t 600000 -i 2000`)} && ${c}${a}`])}};const Dc=new Ec,Oc=new class extends _c{constructor(){super(!1)}startDevProtected(e,t){throw Error(`This method should not be called.`)}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?`--watch`:``} src/index.ts -- ${t.normalizedArgsText??``}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${e.isBunAvailable?`bun run`:`node`} dist/index.js ${t.normalizedArgsText??``} | tee server.log`)}startTest(){return Promise.resolve(`echo 'do nothing.'`)}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,`development`)} && ${pc.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`)}testE2EDev(e,t,n){return this.testE2EWithPlaywrightManagedServer(e,t,n)}testE2EProduction(e,t,n){return this.testE2EWithPlaywrightManagedServer(e,t,n)}testE2EDocker(){return Promise.resolve(`echo 'do nothing.'`)}testE2EWithPlaywrightManagedServer(e,t,n){return Promise.resolve(e.hasPlaywrightWebServerConfig?this.buildPlaywrightOnlyCommand(e,t,n):`echo 'do nothing.'`)}testStart(){return Promise.resolve(`echo 'do nothing.'`)}},kc=[`express`,`fastify`,`elysia`,`hono`],Ac=new class extends _c{constructor(){super(!0)}startDevProtected(e,t){let n=`--turbopack `;return e.packageJson.dependencies?.blitz&&(n=jc(e)>=16?`--webpack `:``),`YARN next dev ${n}${t.normalizedArgsText??``}`}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`YARN next start ${t.normalizedArgsText??``}`.trim()]}};function jc(n){try{let r=JSON.parse(e.readFileSync(t.join(n.dirPath,`node_modules`,`next`,`package.json`),`utf8`)),i=k.coerce(r.version)?.major;if(i!==void 0)return i}catch{}return k.coerce(n.packageJson.dependencies?.next)?.major??15}const Mc=new class extends _c{constructor(){super(!0)}startDevProtected(e,t){e.env.PORT||=`3000`;let n=`YARN vinext dev --port ${e.env.PORT} ${t.normalizedArgsText??``}`.trim(),r=[Nt(t,`.dev.vars`)],i=an(e,`test`)?Ft(e):void 0;return i&&r.push(i),[...r,n].join(` && `)}buildDefaultProductionStartCommands(e,t){e.env.PORT||=`3000`;let n=e.env.PORT,r=Ft(e);return[e.buildCommand,Nt(t,`dist/server/.dev.vars`),...r?[r]:[],Pt(`dev --config dist/server/wrangler.json --ip 127.0.0.1 --port ${n} --persist-to "${Ut(e)}" --local-upstream localhost:${n} ${t.normalizedArgsText??``}`.trim())]}},Nc=new class extends _c{constructor(){super(!0)}startDevProtected(e,t){return`YARN vite dev ${t.normalizedArgsText??``}`.trim()}startProductionProtected(e,t){return`${e.buildCommand} && YARN vite preview ${t.normalizedArgsText??``}`.trim()}},Pc=new class extends Ec{startDevProtected(e,t){return this.buildWranglerDevCommands(e,t).join(` && `)}buildDefaultProductionStartCommands(e,t){return this.buildWranglerDevCommands(e,t)}buildWranglerDevCommands(e,t){e.env.PORT||=`8787`;let n=Ut(e),r=[Nt(t,`.dev.vars`)],i=Ft(e);return i&&r.push(i),r.push(Pt(`dev --ip 127.0.0.1 --port ${e.env.PORT} --persist-to "${n}" ${t.normalizedArgsText??``}`.trim())),r}};function Fc(e){return Ic(e)??(Lc(e)?Dc:Oc)}function Ic(e){let t=e.packageJson.dependencies??{},n=e.packageJson.devDependencies??{};if(t.vinext||n.vinext)return Mc;if(t.next)return Ac;if(n.vite)return Nc;if(zt(e))return Pc}function Lc(e){let t=e.packageJson.dependencies??{};return kc.some(e=>t[e])&&!t[`firebase-functions`]}const Rc={...uc,mode:{description:`Start mode: dev[elopment] (default) | staging | docker | docker-debug | test`,type:`string`,alias:`m`}},zc={command:`start [args..]`,describe:`Start app. Use '--' to stop wb option parsing and forward the remaining arguments to the underlying app command. Example: wb start -- --host 0.0.0.0`,builder:e=>e.parserConfiguration({"populate--":!0}).options(Rc),async handler(e){dc(e);let t=await K(e);t||(console.error(p.red(`No project found.`)),process.exit(1));for(let n of t.descendants){let t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{},i=Ic(n);if(!i)if(Lc(n)||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=Dc;else if(t[`build-ts`]||r[`build-ts`])i=Oc;else continue;switch(console.info(`Running "start" for ${n.name} ...`),e.mode??`dev`){case`dev`:case`development`:process.env.WB_ENV||=`development`,await q(await i.startDev(n,e),n,e);break;case`staging`:process.env.WB_ENV||=`staging`,await q(await i.startProduction(n,e),n,e);break;case`docker`:process.env.WB_ENV||=`staging`,await q(await i.startDocker(n,e),n,e);break;case`docker-debug`:process.env.WB_ENV||=`staging`,e.normalizedArgsText=`'/bin/bash'`,await q(await i.startDocker(n,e),n,e);break;case`test`:process.env.WB_ENV||=`test`,await q(await i.startTest(n,e),n,e);break;default:throw Error(`Unknown start mode: ${e.mode}`)}}}},Bc=RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,`g`),Vc=.05,Hc={e2e:{description:`How to run E2E tests`,type:`string`,choices:[`headless`,`headless-dev`,`headed`,`headed-dev`,`docker`,`docker-debug`,`debug`,`generate`,`trace`],default:`headless`},silent:{description:`Reduce redundant outputs`,type:`boolean`},bail:{description:`Stop tests after the first failure`,type:`boolean`},"unit-timeout":{description:`Timeout for unit tests`,type:`number`}},Uc={targets:{array:!0,description:`Unit or E2E test target paths`,type:`string`}},Wc={command:`test [targets...]`,describe:`Test project. If you pass no arguments, it will run all tests. Use '--' to stop wb option parsing and forward the remaining flags to Playwright. Example: wb test -- --grep 'uploaded image asset'`,builder:e=>e.parserConfiguration({"populate--":!0}).options(Hc).positional(`targets`,Uc.targets),async handler(e){process.exit(await Gc(e))}};async function Gc(n,r={}){let i=Kc(n),a=await K(i);if(!a)return console.error(p.red(`No project found.`)),1;let o=i.targets??[],s=i[`--`]??[],{shouldRunE2e:c,shouldRunUnit:l}=al(o,s);for(let n of a.descendants){n.env;let a=n.packageJson.dependencies??{},u=n.packageJson.devDependencies??{},d=Fc(n);console.info(`Running "test" for ${n.name} ...`);let f=St(n);if(f.length>0)return Et(n.name,f),1;let p=qc(n),m=o.filter(e=>!il(e)),h=m.length>0?m:p;if(l&&h!==!1){let e={...i,targets:h},t=await Xc(d.testUnit(n,e),n,i,{exitIfFailed:r.exitIfFailed,timeout:i.unitTimeout});if(t!==0)return t}if(!c||!e.existsSync(t.join(n.dirPath,`test`,`e2e`)))continue;let g=o.filter(e=>il(e)),_={...i,targets:g.length>0?g:void 0};switch(i.e2e){case`headless`:{let e=await Yc(await d.testE2EProduction(n,_,{playwrightArgs:nl(g,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`headless-dev`:{let e=await Yc(await d.testE2EDev(n,_,{playwrightArgs:nl(g,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`docker`:{let e=await Jc(n,_,d,nl(g,s),s,r);if(e!==0)return e;continue}case`docker-debug`:{let e=await Jc(n,_,d,nl(g,s,[`--debug`]),s,r);if(e!==0)return e;continue}}if(a.next||u.vite)switch(i.e2e){case`headed`:{let e=await Yc(await d.testE2EProduction(n,_,{playwrightArgs:nl(g,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`headed-dev`:{let e=await Yc(await d.testE2EDev(n,_,{playwrightArgs:nl(g,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`debug`:{let e=await Yc(await d.testE2EProduction(n,_,{playwrightArgs:nl(g,s,[`--debug`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`generate`:{let e=await Yc(await d.testE2EProduction(n,_,{playwrightArgs:[`codegen`,`http://localhost:${n.env.PORT}`]}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`trace`:{let e=await Yc(`BUN playwright show-trace`,n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}}}return 0}function Kc(e){return e.cascadeEnv||e.cascadeNodeEnv||e.autoCascadeEnv===!1?{...e,commandDefaultWbEnv:`test`}:{...e,cascadeEnv:`test`}}function qc(n){return e.existsSync(t.join(n.dirPath,`test`,`unit`))?[`./test/unit/`]:!1}async function Jc(e,t,n,r,i,a={}){e.env.WB_DOCKER||=`1`;let o=await q(`${n.buildDocker(e,`test`)}${fc(t)}`,e,t,{exitIfFailed:a.exitIfFailed});if(o!==0)return o;let s=await Yc(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:i}),e,t,{exitIfFailed:!1}),c=await q(pc.stop(e),e,t,{exitIfFailed:a.exitIfFailed});return s===0?c:s}function Yc(e,t,n,r={}){return q(e,t,n,{...r,processSilentOutput:Zc})}function Xc(e,t,n,r={}){return q(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:`Unit tests passed.`})}function Zc(e){let t=[],n=new Set,r=[];for(let i of Qc(e)){let e=el(i);n.has(e)||t.some(t=>tl(t,e))||($c(t,n,e),r.push(i))}return r.join(`
108
+ || ${$(t,`-t 90000 -i 10000`)}`}waitAndOpenApp(e){let t=e.env.PORT;return`${this.waitApp(e)} || ${$(t)} && open-cli http://\${HOST:-localhost}:${t}`}};function $(e,t){if(e===void 0||e===``)throw Error(`Port is required for the loopback readiness check.`);return`wait-on ${t?`${t} `:``}tcp:localhost:${e}`}function vc(e){try{return e.findFile(`scripts/start-production.sh`)}catch{return}}function yc(e){try{return e.findFile(`ecosystem.config.cjs`)}catch{return}}function bc(e,t,n,r=[]){let i=[`BUN`,`playwright`],a=t?.map(String);if(e[0]!==`test`||!a?.length)return xc([...i,...e,...r],n);let o=e.slice(1),s=Sc(o),c=s.length===0?o:o.filter((e,t)=>!s.includes(t));return xc([...i,`test`,...a,...c,...r],n)}function xc(e,t){let n=e.indexOf(`playwright`),r=n!==-1&&e[n+1]===`test`;return!t||!r||e.some(e=>e===`--max-failures`||e.startsWith(`--max-failures=`))?U(e):U([...e,`--max-failures=1`])}function Sc(e){let t,n=[];for(let[r,i]of e.entries()){if(t){if(t===`required`||!i.startsWith(`-`)){t=void 0;continue}t=void 0}if(i===`--`)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(i.startsWith(`--`)){if(i.includes(`=`))continue;Cc.has(i)?t=`required`:wc.has(i)&&(t=`optional`);continue}if(i.startsWith(`-`)&&i!==`-`){let e=i.slice(0,2);i.length===2&&Tc.has(e)&&(t=`required`);continue}n.push(r)}return n}const Cc=new Set([`--browser`,`--config`,`--grep`,`--grep-invert`,`--global-timeout`,`--max-failures`,`--output`,`--project`,`--repeat-each`,`--reporter`,`--retries`,`--shard`,`--test-list`,`--test-list-invert`,`--timeout`,`--trace`,`--tsconfig`,`--ui-host`,`--ui-port`,`--ui-title`,`--workers`]),wc=new Set([`--only-changed`,`--update-snapshots`,`--update-source-method`]),Tc=new Set([`-c`,`-g`,`-j`]);var Ec=class extends _c{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?`--watch`:``} src/index.ts -- ${t.normalizedArgsText??``}`}async testE2EProtected(e,t,n,r={}){if(e.hasPlaywrightConfig)return super.testE2EProtected(e,t,n,r);e.env.PORT||=`3000`;let i=await na(e.env.PORT,e),a=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``,o=t.targets?.map(String),s=o?.length?o:[`test/e2e/`],c=this.testUnit(e,{...t,targets:s});return U([`YARN`,`wb`,`concurrently`,...kt(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`${$(i,`-t 600000 -i 2000`)} && ${c}${a}`])}};const Dc=new Ec,Oc=new class extends _c{constructor(){super(!1)}startDevProtected(e,t){throw Error(`This method should not be called.`)}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?`--watch`:``} src/index.ts -- ${t.normalizedArgsText??``}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${e.isBunAvailable?`bun run`:`node`} dist/index.js ${t.normalizedArgsText??``} | tee server.log`)}startTest(){return Promise.resolve(`echo 'do nothing.'`)}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,`development`)} && ${pc.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`)}testE2EDev(e,t,n){return this.testE2EWithPlaywrightManagedServer(e,t,n)}testE2EProduction(e,t,n){return this.testE2EWithPlaywrightManagedServer(e,t,n)}testE2EDocker(){return Promise.resolve(`echo 'do nothing.'`)}testE2EWithPlaywrightManagedServer(e,t,n){return Promise.resolve(e.hasPlaywrightWebServerConfig?this.buildPlaywrightOnlyCommand(e,t,n):`echo 'do nothing.'`)}testStart(){return Promise.resolve(`echo 'do nothing.'`)}},kc=[`express`,`fastify`,`elysia`,`hono`],Ac=new class extends _c{constructor(){super(!0)}startDevProtected(e,t){let n=`--turbopack `;return e.packageJson.dependencies?.blitz&&(n=jc(e)>=16?`--webpack `:``),`YARN next dev ${n}${t.normalizedArgsText??``}`}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`YARN next start ${t.normalizedArgsText??``}`.trim()]}};function jc(n){try{let r=JSON.parse(e.readFileSync(t.join(n.dirPath,`node_modules`,`next`,`package.json`),`utf8`)),i=k.coerce(r.version)?.major;if(i!==void 0)return i}catch{}return k.coerce(n.packageJson.dependencies?.next)?.major??15}const Mc=new class extends _c{constructor(){super(!0)}startDevProtected(e,t){e.env.PORT||=`3000`;let n=`YARN vinext dev --port ${e.env.PORT} ${t.normalizedArgsText??``}`.trim(),r=[Nt(t,`.dev.vars`)],i=an(e,`test`)?Ft(e):void 0;return i&&r.push(i),[...r,n].join(` && `)}buildDefaultProductionStartCommands(e,t){e.env.PORT||=`3000`;let n=e.env.PORT,r=Ft(e);return[e.buildCommand,Nt(t,`dist/server/.dev.vars`),...r?[r]:[],Pt(`dev --config dist/server/wrangler.json --ip 127.0.0.1 --port ${n} --persist-to "${Ut(e)}" --local-upstream localhost:${n} ${t.normalizedArgsText??``}`.trim())]}},Nc=new class extends _c{constructor(){super(!0)}startDevProtected(e,t){return`YARN vite dev ${t.normalizedArgsText??``}`.trim()}startProductionProtected(e,t){return`${e.buildCommand} && YARN vite preview ${t.normalizedArgsText??``}`.trim()}},Pc=new class extends Ec{startDevProtected(e,t){return this.buildWranglerDevCommands(e,t).join(` && `)}buildDefaultProductionStartCommands(e,t){return this.buildWranglerDevCommands(e,t)}buildWranglerDevCommands(e,t){e.env.PORT||=`8787`;let n=Ut(e),r=[Nt(t,`.dev.vars`)],i=Ft(e);return i&&r.push(i),r.push(Pt(`dev --ip 127.0.0.1 --port ${e.env.PORT} --persist-to "${n}" ${t.normalizedArgsText??``}`.trim())),r}};function Fc(e){return Ic(e)??(Lc(e)?Dc:Oc)}function Ic(e){let t=e.packageJson.dependencies??{},n=e.packageJson.devDependencies??{};if(t.vinext||n.vinext)return Mc;if(t.next)return Ac;if(n.vite)return Nc;if(zt(e))return Pc}function Lc(e){let t=e.packageJson.dependencies??{};return kc.some(e=>t[e])&&!t[`firebase-functions`]}const Rc={...uc,mode:{description:`Start mode: dev[elopment] (default) | staging | docker | docker-debug | test`,type:`string`,alias:`m`}},zc={command:`start [args..]`,describe:`Start app. Use '--' to stop wb option parsing and forward the remaining arguments to the underlying app command. Example: wb start -- --host 0.0.0.0`,builder:e=>e.parserConfiguration({"populate--":!0}).options(Rc),async handler(e){dc(e);let t=await K(e);t||(console.error(p.red(`No project found.`)),process.exit(1));for(let n of t.descendants){let t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{},i=Ic(n);if(!i)if(Lc(n)||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=Dc;else if(t[`build-ts`]||r[`build-ts`])i=Oc;else continue;switch(console.info(`Running "start" for ${n.name} ...`),e.mode??`dev`){case`dev`:case`development`:process.env.WB_ENV||=`development`,await q(await i.startDev(n,e),n,e);break;case`staging`:process.env.WB_ENV||=`staging`,await q(await i.startProduction(n,e),n,e);break;case`docker`:process.env.WB_ENV||=`staging`,await q(await i.startDocker(n,e),n,e);break;case`docker-debug`:process.env.WB_ENV||=`staging`,e.normalizedArgsText=`'/bin/bash'`,await q(await i.startDocker(n,e),n,e);break;case`test`:process.env.WB_ENV||=`test`,await q(await i.startTest(n,e),n,e);break;default:throw Error(`Unknown start mode: ${e.mode}`)}}}},Bc=RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,`g`),Vc=.05,Hc={e2e:{description:`How to run E2E tests`,type:`string`,choices:[`headless`,`headless-dev`,`headed`,`headed-dev`,`docker`,`docker-debug`,`debug`,`generate`,`trace`],default:`headless`},silent:{description:`Reduce redundant outputs`,type:`boolean`},bail:{description:`Stop tests after the first failure`,type:`boolean`},"unit-timeout":{description:`Timeout for unit tests`,type:`number`}},Uc={targets:{array:!0,description:`Unit or E2E test target paths`,type:`string`}},Wc={command:`test [targets...]`,describe:`Test project. If you pass no arguments, it will run all tests. Use '--' to stop wb option parsing and forward the remaining flags to Playwright. Example: wb test -- --grep 'uploaded image asset'`,builder:e=>e.parserConfiguration({"populate--":!0}).options(Hc).positional(`targets`,Uc.targets),async handler(e){process.exit(await Gc(e))}};async function Gc(n,r={}){let i=Kc(n),a=await K(i);if(!a)return console.error(p.red(`No project found.`)),1;let o=i.targets??[],s=i[`--`]??[],{shouldRunE2e:c,shouldRunUnit:l}=al(o,s);for(let n of a.descendants){n.env;let a=n.packageJson.dependencies??{},u=n.packageJson.devDependencies??{},d=Fc(n);console.info(`Running "test" for ${n.name} ...`);let f=St(n);if(f.length>0)return Et(n.name,f),1;let p=qc(n),m=o.filter(e=>!il(e)),h=m.length>0?m:p;if(l&&h!==!1){let e={...i,targets:h},t=await Xc(d.testUnit(n,e),n,i,{exitIfFailed:r.exitIfFailed,timeout:i.unitTimeout});if(t!==0)return t}if(!c||!e.existsSync(t.join(n.dirPath,`test`,`e2e`)))continue;let g=o.filter(e=>il(e)),_={...i,targets:g.length>0?g:void 0};switch(i.e2e){case`headless`:{let e=await Yc(await d.testE2EProduction(n,_,{playwrightArgs:nl(g,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`headless-dev`:{let e=await Yc(await d.testE2EDev(n,_,{playwrightArgs:nl(g,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`docker`:{let e=await Jc(n,_,d,nl(g,s),s,r);if(e!==0)return e;continue}case`docker-debug`:{let e=await Jc(n,_,d,nl(g,s,[`--debug`]),s,r);if(e!==0)return e;continue}}if(a.next||u.vite)switch(i.e2e){case`headed`:{let e=await Yc(await d.testE2EProduction(n,_,{playwrightArgs:nl(g,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`headed-dev`:{let e=await Yc(await d.testE2EDev(n,_,{playwrightArgs:nl(g,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`debug`:{let e=await Yc(await d.testE2EProduction(n,_,{playwrightArgs:nl(g,s,[`--debug`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`generate`:{let e=await Yc(await d.testE2EProduction(n,_,{playwrightArgs:[`codegen`,`http://localhost:${n.env.PORT}`]}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`trace`:{let e=await Yc(`BUN playwright show-trace`,n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}}}return 0}function Kc(e){return e.cascadeEnv||e.cascadeNodeEnv||e.autoCascadeEnv===!1?{...e,commandDefaultWbEnv:`test`}:{...e,cascadeEnv:`test`}}function qc(n){return e.existsSync(t.join(n.dirPath,`test`,`unit`))?[`./test/unit/`]:!1}async function Jc(e,t,n,r,i,a={}){e.env.WB_DOCKER||=`1`;let o=await q(`${n.buildDocker(e,`test`)}${fc(t)}`,e,t,{exitIfFailed:a.exitIfFailed});if(o!==0)return o;let s=await Yc(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:i}),e,t,{exitIfFailed:!1}),c=await q(pc.stop(e),e,t,{exitIfFailed:a.exitIfFailed});return s===0?c:s}function Yc(e,t,n,r={}){return q(e,t,n,{...r,processSilentOutput:Zc})}function Xc(e,t,n,r={}){return q(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:`Unit tests passed.`})}function Zc(e){let t=[],n=new Set,r=[];for(let i of Qc(e)){let e=el(i);n.has(e)||t.some(t=>tl(t,e))||($c(t,n,e),r.push(i))}return r.join(`
109
109
  `)}function*Qc(e){let t=0;for(;t<=e.length;){let n=e.indexOf(`
110
110
  `,t);if(n===-1){yield e.slice(t);return}yield e.slice(t,n),t=n+1}}function $c(e,t,n){if(e.push(n),t.add(n),e.length<=200)return;let r=e.shift();r!==void 0&&t.delete(r)}function el(e){return e.replaceAll(Bc,``).trim().replaceAll(/^(?:\[[^\]]+\]\s*)+/g,``).replaceAll(/\(node:\d+\)/g,`(node:<number>)`).replaceAll(/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z?\b/g,`<timestamp>`).replaceAll(/([?&]cache=)\d+/g,`$1<number>`)}function tl(e,t){let n=Math.max(e.length,t.length);return n===0?!0:Math.abs(e.length-t.length)>n*Vc?!1:A(e,t)/n<=Vc}function nl(e,t=[],n=[]){let r=Sc(t).length>0;return[`test`,...e.length>0||r?[]:[`test/e2e/`],...n]}const rl=/(?:^|\/)test\/e2e(?:\/|$)/;function il(e){return rl.test(e)}function al(e,t=[]){let n=e.some(e=>il(e)),r=e.some(e=>!il(e)),i=e.length===0&&t.length===0;return{shouldRunUnit:i||r,shouldRunE2e:i||n||t.length>0}}const ol={command:`test-on-ci`,describe:`Test project on CI with no options.`,builder:{silent:{description:`Reduce redundant outputs`,type:`boolean`}},async handler(e){await sl(e)}};async function sl(n){process.env.WB_ENV||=`test`;let r=await K(n);r||(console.error(p.red(`No project found.`)),process.exit(1));for(let i of r.descendants){i.env.CI||=`1`,i.env.WB_ENV=process.env.WB_ENV;let r=Fc(i);console.info(`Running "test-on-ci" for ${i.name} ...`);let a=St(i);if(a.length>0){Et(i.name,a),process.exitCode=1;continue}let o=i.hasDockerfile;o&&await On(pc.stopAll(),i,n);let s=qc(i);if(s!==!1){let e={...n,targets:s};await On(r.testUnit(i,e).replaceAll(` --allowOnly`,``),i,n)}if(e.existsSync(t.join(i.dirPath,`test`,`e2e`))){await On(await r.testStart(i,n),i,n),await En.promiseAll(),o&&(i.env.WB_DOCKER||=`1`,await q(`${r.buildDocker(i,`test`)}${fc(n)}`,i,n));let e=await q((o?await r.testE2EDocker(i,n,{}):await r.testE2EProduction(i,n,{})).replaceAll(` --allowOnly`,``),i,n,{exitIfFailed:!1});e!==0&&(process.exitCode=e),o&&await q(pc.stop(i),i,n)}}}const cl={command:`tree-kill <pid> [signal]`,describe:`Kill the given process and all descendants`,builder:e=>e.positional(`pid`,{description:`The process ID to kill.`,type:`number`,demandOption:!0}).option(`signal`,{description:`Signal to send to the process tree.`,type:`string`,default:`SIGTERM`}),handler(e){try{let t=e.signal;if(!(t in _.signals))throw Error(`Invalid signal: ${t}`);P(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},ll={command:`typecheck`,describe:`Run type checking. Environment variables are not loaded.`,builder:{},async handler(e){process.exit(await ul(e))}};async function ul(n){let r=await K(n,!1);if(!r)return console.error(p.red(`No project found.`)),1;let i=!1,a=r.descendants.map(async a=>{let o=dl(a);for(;o.length>0;){let s=await On(o.join(` && `),a,n,{ci:r.descendants.length>1,exitIfFailed:!1,preserveColor:!0}),c=t.join(a.dirPath,`.next`);if(s&&e.existsSync(c)){e.rmSync(c,{force:!0,recursive:!0}),console.info(p.yellow("Removed `.next` directory. We will re-try type checking.")),i=!0;continue}return s}}),o=await Promise.all(a),s=0;for(let e of o)e&&(s=e);return s||console.info(p.green(i?`-----
111
111
  No type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.`:`No type errors found.`)),s}function dl(e){let t=[];return e.hasOwnSourceCode&&t.push(...fl(e)),!e.packageJson.workspaces&&e.hasOwnDependency(`pyright`)&&t.push(`YARN pyright`),t}function fl(e){return e.hasOwnDependency(`typescript`)?[`BUN tsc --noEmit`]:[]}const pl={...ll,command:`tc`},ml={command:`verify`,describe:`Verify project code`,builder:{full:{type:`boolean`,default:!1,describe:`Run tests after verifying project code`}},async handler(e){let t=on(e,!1);t||(console.error(p.red(`No project found.`)),process.exit(1));let n=[];e.full?await hl(t.self,e,n):(await gl(t.self,e,n),Cl(n,!!e.dryRun))}};async function hl(e,t,n){let r=Dl(e);try{await gl(e,t,n),await xl(n,{name:`test`},()=>_l(e,t)),Cl(n,!!t.dryRun),r.succeed()}catch(e){throw r.fail(e),e}finally{r.finish()}}async function gl(e,t,n){let r=`${e.packageManagerCommand} install`,i=await xl(n,{detail:r,name:`install`},()=>wl(r,e,t,{allowFailure:!0}));if(t.dryRun||Yr(e.rootDirPath),i!==0&&(console.info(p.red(p.bold(`Failed (exit code ${i}):`),r)),process.exit(i)),e.packageJson.scripts?.[`gen-code`]){let r=`${e.packageManagerCommand} gen-code`;await xl(n,{detail:r,name:`gen-code`},()=>wl(r,e,t))}let a=await yl(t);await xl(n,{detail:a.cleanup,name:`cleanup`},()=>Sl(`cleanup`,()=>ki({...t,_:[`lint`],fix:!0,format:!0,silent:!0}))),await xl(n,{detail:a.typecheck,name:`typecheck`},()=>Sl(`typecheck`,()=>ul({...t,_:[`typecheck`]})))}async function _l(e,t){let n=Kc({...t,_:[`test`],e2e:`headless`,silent:!0}),r=await Gc(n,{exitIfFailed:!1});if(r===0)return;e.packageJson.scripts?.[`db-reset`]||(console.info(p.red(p.bold(`Failed (exit code ${r}):`),`test`)),process.exit(r)),console.info(p.yellow(`Tests failed. This project defines "db-reset", so wb will reset the database once and retry tests.`)),await wl(`${e.packageManagerCommand} db-reset`,vl(e,n),n,{printRawOutput:!0});let i=await Gc(n,{exitIfFailed:!1});i!==0&&(console.info(p.red(p.bold(`Failed (exit code ${i}):`),`test after db-reset retry`)),process.exit(i)),console.info(p.green(`Tests passed after db-reset retry.`))}function vl(e,t){let n=G(t,!0,e.dirPath);if(!n)throw Error(`Project not found: ${e.dirPath}`);return n}async function yl(e){let t=`lint --fix --format`,n=await K(e,!1);if(!n)return{cleanup:t};let r=n.descendants.some(e=>e.hasOwnSourceCode&&Ii(e,{fix:!0,format:!0})?.includes(`--type-aware`)),i=[...new Set(n.descendants.flatMap(e=>dl(e).map(bl)))];return{cleanup:r?`${t} (oxlint --type-aware --type-check)`:t,typecheck:i.length>0?i.join(` + `):void 0}}function bl(e){return e.replace(/^(?:BUN|YARN) /u,``)}async function xl(e,t,n){let r=Date.now(),i=await n();return e.push({...t,durationMs:Date.now()-r}),i}async function Sl(e,t){let n=await t()??0;return n!==0&&(console.info(p.red(p.bold(`Failed (exit code ${n}):`),e)),process.exit(n)),n}function Cl(e,t){if(e.length===0)return;let n=Math.max(...e.map(e=>e.name.length));if(t){console.info(`
@@ -113,4 +113,4 @@ No type errors found. Please ignore the previous type errors, as they were cause
113
113
  `+p.green(p.bold(`Verified in ${kl(a)}:`)));for(let[t,a]of e.entries()){let e=r[t].padStart(i),o=a.detail?` ${a.detail}`:``;console.info(p.green(` ✔ `)+a.name.padEnd(n)+p.gray(` ${e}${o}`))}}async function wl(e,t,n,r={}){if(El(e,t.dirPath),n.dryRun)return 0;let i=await F(e,void 0,{cwd:t.dirPath,env:Nn(t.env,{preserveColor:!1}),shell:!0,stdio:`pipe`,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose}),a=i.status??1;return r.printRawOutput||Tl(e,a,i.stdout),a!==0&&!r.allowFailure&&(console.info(p.red(p.bold(`Failed (exit code ${a}):`),e)),process.exit(a)),a}function Tl(e,t,n){if(t===0&&/^(?:bun|yarn) (?:install|gen-code)$/u.test(e)){console.info(p.green(`Succeeded.`));return}let r=n.trim();r&&(process.stdout.write(r),process.stdout.write(`
114
114
  `))}function El(e,t){console.info(`
115
115
  `+p.cyan(p.bold(`Command:`),e)+p.gray(` at ${t}`))}function Dl(n){let r=Date.now(),i=t.join(n.dirPath,`.wb`);e.mkdirSync(i,{recursive:!0});let a=t.join(i,`verify-full.log`),o=e.openSync(a,`w`),s=process.stdout.write.bind(process.stdout),c=process.stderr.write.bind(process.stderr),l=!1,u=!1;process.stdout.write=Ol(s,o),process.stderr.write=Ol(c,o),console.info(p.cyan(p.bold(`Full log:`),a));let d=()=>{if(u)return;u=!0,process.stdout.write=s,process.stderr.write=c;let t=Al(Date.now()-r),n=`${l?`Succeeded`:`Failed`} in ${t}. Full log: ${a}\n`,i=l?p.green(n):p.red(n);s(i),e.writeSync(o,n),e.closeSync(o)};return process.once(`exit`,d),{fail:e=>{l=!1,e&&console.error(e)},finish:()=>{process.removeListener(`exit`,d),d()},succeed:()=>{l=!0}}}function Ol(t,n){return((r,i,a)=>{let o=typeof r==`string`?Buffer.from(r,typeof i==`string`?i:`utf8`):r;return e.writeSync(n,o),t(o,typeof i==`function`?i:a)})}function kl(e){return e<6e4?`${(e/1e3).toFixed(1)}s`:Al(e)}function Al(e){let t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;return n===0?`${r}s`:`${n}m ${r}s`}Be(process.argv),await d(f(process.argv)).scriptName(`wb`).options(Ot).middleware(e=>{let n=e[`working-dir`];if(n){let e=t.resolve(n);process.chdir(e)}let r=jl();r&&Ml(r)&&console.warn(`Warning: \`node\` on PATH is a Bun shim (${r}); run wb without \`--bun\` and remove \`[run] bun\` from bunfig.toml.`),e._[0]!==`run`&&Se(process.env)}).command(ml).command(dn).command(Fn).command(zn).command(Or).command(Fr).command(ni).command(di).command(pi).command(Oi).command(_a).command(No).command(ds).command(Ls).command(Rs).command(nc).command(rc).command(cc).command(to).command(zc).command(Wc).command(ol).command(cl).command(ll).command(pl).demandCommand().strict().version(Nl()).help().argv;function jl(){for(let n of(process.env.PATH??``).split(t.delimiter)){if(!n)continue;let r=t.join(n,`node`);try{if(e.accessSync(r,e.constants.X_OK),e.statSync(r).isFile())return r}catch{}}}function Ml(n){if(t.basename(t.dirname(n)).startsWith(`bun-node-`))return!0;try{return t.basename(e.realpathSync(n))===`bun`}catch{return!1}}function Nl(){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}let Pl=!1;for(let e of[`SIGINT`,`SIGTERM`,`SIGQUIT`])process.on(e,()=>{if(!Pl){Pl=!0;try{P(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
116
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJub3JtYWxpemVCdW5Mb2NrZmlsZSIsImNvbGxlY3REZXNjZW5kYW50UGlkcyIsImlzTm9TdWNoUHJvY2Vzc0Vycm9yIiwicnVuQ29tbWFuZCIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCIsImUiLCJ0IiwibiIsInIiLCJpIiwiciIsInQiLCJuIiwiciIsIm4iLCJuIiwiZSIsImkiLCJ0IiwiZSIsImJ1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImFyZ3VtZW50c0J1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQiLCJwYXJzZSIsImRlcGxveUNvbW1hbmQiLCJub3JtYWxpemVTaGFyZWRCdW5Mb2NrZmlsZSIsInBhcnNlVG9tbCIsImJ1aWxkZXIiLCJwYXJzZURvdGVudiIsImJ1aWxkZXIiLCJmcyIsInNldFRpbWVvdXQiLCJidWlsZGVyIiwic2V0VGltZW91dCIsImZzIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJidWlsZGVyIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJmcyIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJidWlsZGVyIiwiZGVwbG95Q29tbWFuZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuV29ya3NwYWNlcy50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuTG9ja2ZpbGUudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2Vudi50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZXJybm8udHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy90cmVlS2lsbC50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvc3Bhd24udHMiLCIuLi9iaW4vcnVuQXJncy5qcyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9oYXNoLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9vc29uL2NvbnN0cnVjdG9ycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9zdHJpbmdpZnkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L2dldENhY2hlS2V5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9tZW1vaXplT25lLmpzIiwiLi4vc3JjL3V0aWxzL2JpblBhdGgudHMiLCIuLi9zcmMvdXRpbHMvY2kudHMiLCIuLi9zcmMvdXRpbHMvZW52U291cmNlcy50cyIsIi4uL3NyYy91dGlscy9ydW50aW1lLnRzIiwiLi4vc3JjL3V0aWxzL3Rlc3RTdHJ1Y3R1cmUudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvdXRpbHMvc2hlbGwudHMiLCIuLi9zcmMvdXRpbHMvd3JhbmdsZXIudHMiLCIuLi9zcmMvcHJvamVjdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZElmTmVlZGVkLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NoZWNrRW52LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9zY3JpcHRzL2xpdGVzdHJlYW0udHMiLCIuLi9zcmMvc2NyaXB0cy9kcml6emxlU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy93cmFuZ2xlckNvbmZpZy50cyIsIi4uL3NyYy9jb21tYW5kcy9kZXBsb3kudHMiLCIuLi9zcmMvY29tbWFuZHMvZG90ZW52LnRzIiwiLi4vc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy9idW5Mb2NrZmlsZS50cyIsIi4uL3NyYy91dGlscy93b3JrZXJUeXBlc0Vudi50cyIsIi4uL3NyYy9jb21tYW5kcy9nZW5Db2RlLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2dlbkRldlZhcnMudHMiLCIuLi9zcmMvY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLnRzIiwiLi4vc3JjL3V0aWxzL291dHB1dC50cyIsIi4uL3NyYy9jb21tYW5kcy9saW50LnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvdXRpbHMvcHJvY2Vzcy50cyIsIi4uL3NyYy9jb21tYW5kcy9tYWludGVuYW5jZS50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUmVnaXN0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwUHJpdmF0ZVBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JhaWx3YXlFbnYudHMiLCIuLi9zcmMvY29tbWFuZHMvcmVsZWFzZS50cyIsIi4uL3NyYy9jb21tYW5kcy9yZXRyeS50cyIsIi4uL3NyYy9jb21tYW5kcy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy9sb2cudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi92aW5leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3NlbGVjdFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0T25DaS50cyIsIi4uL3NyYy9jb21tYW5kcy90cmVlS2lsbC50cyIsIi4uL3NyYy9jb21tYW5kcy90eXBlY2hlY2sudHMiLCIuLi9zcmMvY29tbWFuZHMvdmVyaWZ5Q29kZS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuLyoqIFRoZSBgd29ya3NwYWNlc2AgZmllbGQgb2YgYSByb290IHBhY2thZ2UuanNvbjogdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlc0RlY2xhcmF0aW9uID0gc3RyaW5nW10gfCB7IHBhY2thZ2VzPzogc3RyaW5nW10gfSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpIHRoYXQgQnVuIHdvdWxkIGxpbmtcbiAqIGZvciB0aGUgZ2l2ZW4gcm9vdCBwYWNrYWdlLmpzb24gYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uLiBDYW5vbmljYWxpemVzIHRoZSBkZWNsYXJlZCBwYXR0ZXJuc1xuICogKHNlZSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyksIGRyb3BzIHBhdHRlcm5zIGVzY2FwaW5nIHRoZSByZXBvc2l0b3J5IChzZWVcbiAqIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybiksIGFuZCByZXNvbHZlcyB0aGUgcmVzdCB3aXRoIEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKFxuICAgIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKVxuICAgICksXG4gICAgcm9vdERpclBhdGhcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3b3Jrc3BhY2UgcGF0dGVybnMgdG8gcGFja2FnZS5qc29uIHBhdGhzIG1pbWlja2luZyBCdW4ncyBTRVFVRU5USUFMIGV2YWx1YXRpb24sXG4gKiBkZXJpdmVkIGVtcGlyaWNhbGx5IHdpdGggQnVuIDEuMy4xNCAoZml4dHVyZSByZXBvcyBvYnNlcnZlZCB2aWEgYGJ1biBpbnN0YWxsIC0tbG9ja2ZpbGUtb25seWA7XG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNCAvIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1KTpcbiAqIDEuIFBhdHRlcm5zIGFyZSBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIgaW50byBhbiBhY2N1bXVsYXRpbmcgc2V0OiBhIHBvc2l0aXZlIGdsb2JcbiAqICAgIHBhdHRlcm4gYWRkcyBldmVyeSBwYWNrYWdlLmpzb24gaXQgbWF0Y2hlczsgYSBuZWdhdGlvbiBkZWxldGVzIGl0cyBtYXRjaGVzIGZyb20gdGhlIHNldFxuICogICAgYWNjdW11bGF0ZWQgU08gRkFSLCBzbyBhIGxhdGVyIHBvc2l0aXZlIHJlLWFkZHMgdGhlbSAoYFtcIiFhcHBzL2V4Y2x1ZGVkXCIsIFwiYXBwcy8qXCJdYCBsaW5rc1xuICogICAgYXBwcy9leGNsdWRlZCwgd2hpbGUgYFtcImFwcHMvKlwiLCBcIiFhcHBzL2V4Y2x1ZGVkXCJdYCBkb2VzIG5vdCkuXG4gKiAyLiBBIG5lZ2F0aW9uIHdob3NlIG5vcm1hbGl6ZWQgYm9keSBoYXMgRVhBQ1RMWSB0d28gc2VnbWVudHMsIHdob3NlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXItcnVuXG4gKiAgICAoYCpgLCBgKipgLCBgKioqYCwg4oCmKSwgYW5kIHdob3NlIGZpcnN0IHNlZ21lbnQgaXMgTk9UIGl0c2VsZiBhIHN0YXItcnVuIGZpcnN0IHNlZWRzIHRoZVxuICogICAgaW1wbGljaXQgYmFzZWxpbmUgaW50byB0aGUgc2V0LCB0aGVuIGRlbGV0ZXMgaXRzIG93biBtYXRjaGVzOiBhIGAqKmAgbGFzdCBzZWdtZW50IHNlZWRzXG4gKiAgICBgKipgIChwYWNrYWdlcyBhdCBhbnkgZGVwdGgpLCBhbnkgb3RoZXIgc3Rhci1ydW4gc2VlZHMgYCpcXC8qYCAoZGVwdGggMiBvbmx5KS4gU2VlZGluZ1xuICogICAgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJucyAoYFtcImFwcHMvKlwiLCBcIiFvdGhlci8qXCJdYCBsaW5rcyBldmVyeSBkZXB0aC0yXG4gKiAgICBwYWNrYWdlIG91dHNpZGUgb3RoZXIvKS4gTm8gb3RoZXIgbmVnYXRpb24gc2hhcGUgc2VlZHM6IGAhKmAsIGAhKipgLCBgISpcXC8qYCwgYCEqXFwvKipgLFxuICogICAgYCEqKlxcLypgLCBgIWEvYi8qYCwgYCFhL2IvKipgLCBgIWRpcmAsIGFuZCBgIWRpci8qeGAgZWFjaCBsaW5rIG5vdGhpbmcgb24gdGhlaXIgb3duLlxuICogICAgYD9gLCBicmFjZSwgYW5kIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZSBFUlJBVElDQUxMWSAoYFtcIiFvdGhlci8/XCJdYCBsaW5rc1xuICogICAgcGFja2FnZXMvYSB5ZXQgbm90IHRoZSBlcXVhbGx5IGJhc2VsaW5lLXNoYXBlZCBvdGhlci95eSwgYFtcIiFvdGhlci8/P1wiXWAgbGlua3Mgbm90aGluZywgYW5kXG4gKiAgICBgW1wiIT8vP1wiXWAgbGlua3MgdGhlIHZlcnkgb3RoZXIveCBpdCBtYXRjaGVzKSwgc28gbm8gY29uc2lzdGVudCBydWxlIGNhbiBtb2RlbCB0aGVtOyB0aGV5XG4gKiAgICBhcmUgZGVsaWJlcmF0ZWx5IHRyZWF0ZWQgYXMgbm90IHNlZWRpbmcg4oCUIHNlZSBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lIGFuZCAjMTAwNS5cbiAqIDMuIEEgbm9uLWdsb2IgcG9zaXRpdmUgcGF0dGVybiBQSU5TIGl0cyBkaXJlY3Rvcnk6IGl0IHN0YXlzIGEgd29ya3NwYWNlIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgYVxuICogICAgbWF0Y2hpbmcgbmVnYXRpb24gYXBwZWFycyAoYFtcIm90aGVyL3hcIiwgXCIhb3RoZXIveFwiXWAgYW5kIGBbXCIhb3RoZXIveFwiLCBcIm90aGVyL3hcIl1gIGJvdGhcbiAqICAgIGxpbmsgb3RoZXIveCkuXG4gKiA0LiBgKipgIG1hdGNoZXMgemVybyBvciBtb3JlIHBhdGggc2VnbWVudHMgKGBbXCJhcHBzLyoqXCJdYCBsaW5rcyB0aGUgcGFja2FnZSBhdCBhcHBzIGl0c2VsZiwgYW5kXG4gKiAgICBgIWFwcHMvKipgIGRlbGV0ZXMgaXQpLCBtYXRjaGluZyBmYXN0LWdsb2IncyBmaWxlLWdsb2Igc2VtYW50aWNzLlxuICogRG8gbm90IGFwcGx5IGdsb2JJZ25vcmUgaGVyZTogd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgZGVmaW5lZCBzb2xlbHkgYnkgdGhlIGRlY2xhcmVkIHBhdHRlcm5zLFxuICogYW5kIHNvdXJjZS1zY2FubmluZyBpZ25vcmVzIHN1Y2ggYXMgYGJ1aWxkYCBvciBgZGlzdGAgd291bGQgaGlkZSBsZWdpdGltYXRlbHkgbmFtZWQgd29ya3NwYWNlXG4gKiBkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZVBhdHRlcm5zOiBzdHJpbmdbXSwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2Ugc3RvcHMgR0xPQiB0cmF2ZXJzYWwgdGhyb3VnaCBzeW1saW5rcywgYnV0IGEgbm9uLWdsb2IgcGF0dGVyblxuICAvLyBuYW1pbmcgYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGBsaW5rZWRgIHdpdGggYGxpbmtlZCAtPiAuLi9vdGhlci1yZXBvYCkgc3RpbGwgbWF0Y2hlcyDigJRcbiAgLy8gZmFzdC1nbG9iIHJlc29sdmVzIHN0YXRpYyBwYXR0ZXJucyB3aXRoIGRpcmVjdCBmcyBjaGVja3MsIGFuZCBCdW4gZG9lcyBsaW5rIHN1Y2ggYSB3b3Jrc3BhY2UuXG4gIC8vIERlbGliZXJhdGVseSBkaXZlcmdlIGZyb20gQnVuIHRoZXJlOiBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBhbmQgbWFuaWZlc3RcbiAgLy8gcmV3cml0aW5nIHdvdWxkIG90aGVyd2lzZSBkZWxldGUgYW5kIHJld3JpdGUgZmlsZXMgaW4gQU5PVEhFUiByZXBvc2l0b3J5IHRocm91Z2ggdGhlIHN5bWxpbmssXG4gIC8vIHNvIGtlZXAgb25seSBtYW5pZmVzdHMgd2hvc2UgcmVhbCBwYXRoIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeSdzIHJlYWwgcm9vdC4gU2Nhbm5pbmcgZWFjaFxuICAvLyBwYXR0ZXJuIHNlcGFyYXRlbHkgKG5vIGNyb3NzLXBhdHRlcm4gY2FjaGluZykgaXMgZGVsaWJlcmF0ZTogZGVjbGFyYXRpb25zIGhvbGQgYSBoYW5kZnVsIG9mXG4gIC8vIHBhdHRlcm5zLCBzbyBhIGNhY2hlIHdvdWxkIGNvbXBsaWNhdGUgdGhpcyBzaGFyZWQgY29kZSB3aXRob3V0IG1lYXN1cmFibGUgZ2Fpbi5cbiAgY29uc3QgZ2xvYk1hbmlmZXN0UGF0aHMgPSAocGF0dGVybjogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIC8vIEJ1biBsaW5rcyBkb3QtZGlyZWN0b3J5IHBhY2thZ2VzIG9ubHkgdGhyb3VnaCBmdWxseSBzdGF0aWMgcGF0dGVybnM6IHdpdGggQnVuIDEuMy4xNCxcbiAgICAvLyBgLmhpZGRlbi94YCBwaW5zIHRoZSBwYWNrYWdlIHdoaWxlIGAuaGlkZGVuLypgLCBgLiovKmAsIGFuZCBgKipgIGFsbCBsaW5rIG5vdGhpbmcgdW5kZXJcbiAgICAvLyAuaGlkZGVuIOKAlCBldmVuIHdoZW4gdGhlIGRvdHRlZCBzZWdtZW50IGl0c2VsZiBpcyBsaXRlcmFsIOKAlCBzbyBhbnkgZHluYW1pYyBwYXR0ZXJuIG11c3RcbiAgICAvLyBkcm9wIG1hdGNoZXMgY29udGFpbmluZyBhIGRvdC1sZWQgc2VnbWVudCAoZmFzdC1nbG9iJ3MgYGRvdDogZmFsc2VgIG9ubHkgY292ZXJzIHNlZ21lbnRzXG4gICAgLy8gYSB3aWxkY2FyZCBtYXRjaGVzKS5cbiAgICBjb25zdCBleGNsdWRlc0RvdFNlZ21lbnRzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuKTtcbiAgICBjb25zdCBnbG9iT3B0aW9ucyA9IHsgY3dkOiByb290RGlyUGF0aCwgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9O1xuICAgIC8vIGZhc3QtZ2xvYiAzLjMuMyByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgICAvLyBgcGFja2FnZXMvPy9wYWNrYWdlLmpzb25gKSwgYWx0aG91Z2ggbWljcm9tYXRjaCBtYXRjaGVzIHRoZW0gYW5kIEJ1biAxLjMuMTQgbGlua3Mgc3VjaFxuICAgIC8vIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnMgb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnlcbiAgICAvLyBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkpLCBnbG9iYmluZyB0aGUgZGlyZWN0b3JpZXMgKHdoZXJlIGA/YCB3b3JrcykgYW5kIGNoZWNraW5nIHRoZWlyXG4gICAgLy8gbWFuaWZlc3RzIGNvbXBsZW1lbnRzIHRoZSBtYW5pZmVzdCBnbG9iLCB3aGljaCBzdGF5cyBuZWNlc3NhcnkgZm9yIGAqKmAncyB6ZXJvLXNlZ21lbnRcbiAgICAvLyBtYXRjaGVzIOKAlCBgZGlyLyoqYCBkb2VzIG5vdCByZXR1cm4gZGlyIGl0c2VsZiBhcyBhIGRpcmVjdG9yeS5cbiAgICBjb25zdCBtYW5pZmVzdFBhdGhzID0gbmV3IFNldChmZy5nbG9iU3luYyhwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpLCBnbG9iT3B0aW9ucykpO1xuICAgIGlmIChwYXR0ZXJuLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IC4uLmdsb2JPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSkgbWFuaWZlc3RQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQSB6ZXJvLXNlZ21lbnQgYCoqYCBtYXRjaCByZWFjaGVzIHRoZSByb290J3Mgb3duIG1hbmlmZXN0LCBidXQgQnVuIG5ldmVyIHRyZWF0cyB0aGVcbiAgICAvLyBtb25vcmVwbyByb290IGFzIGl0cyBvd24gd29ya3NwYWNlLlxuICAgIHJldHVybiBbLi4ubWFuaWZlc3RQYXRoc10uZmlsdGVyKFxuICAgICAgKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGFja2FnZUpzb25QYXRoICE9PSAncGFja2FnZS5qc29uJyAmJlxuICAgICAgICAoIWV4Y2x1ZGVzRG90U2VnbWVudHMgfHwgIXBhY2thZ2VKc29uUGF0aC5zcGxpdCgnLycpLnNvbWUoKHNlZ21lbnQpID0+IHNlZ21lbnQuc3RhcnRzV2l0aCgnLicpKSkgJiZcbiAgICAgICAgaXNJbnNpZGVSZWFsUm9vdChwYWNrYWdlSnNvblBhdGgpXG4gICAgKTtcbiAgfTtcbiAgbGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBpc0luc2lkZVJlYWxSb290ID0gKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlYWxSb290RGlyUGF0aCA/Pz0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVhbFJvb3REaXJQYXRoLCBmcy5yZWFscGF0aFN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSk7XG4gICAgICAvLyBDb21wYXJlIHdob2xlIHNlZ21lbnRzLCBub3QgYSBgLi5gIHByZWZpeDogYSBkaXJlY3RvcnkgbGl0ZXJhbGx5IG5hbWVkIGUuZy4gYC4ucGtnYCBpc1xuICAgICAgLy8gaW5zaWRlIHRoZSByb290LCB3aGlsZSBhIHBsYWluIHN0YXJ0c1dpdGgoJy4uJykgd291bGQgbWlzcmVhZCBpdCBhcyBwYXJlbnQgdHJhdmVyc2FsLlxuICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgbWFuaWZlc3QgdGhhdCB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBnbG9iIGFuZCB0aGUgcmVhbHBhdGggY2FsbCBpcyBub3QgYSB3b3Jrc3BhY2UuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBhY2N1bXVsYXRlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHBpbm5lZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0dGVybiBvZiB3b3Jrc3BhY2VQYXR0ZXJucykge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICBjb25zdCBwYXR0ZXJuQm9keSA9IG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KGlzTmVnYXRpdmUgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybik7XG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIGNvbnN0IGJhc2VsaW5lR2xvYiA9IGdldFNlZWRlZEJhc2VsaW5lR2xvYihwYXR0ZXJuQm9keSk7XG4gICAgICBpZiAoYmFzZWxpbmVHbG9iICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2xvYk1hbmlmZXN0UGF0aHMoYmFzZWxpbmVHbG9iKSkgYWNjdW11bGF0ZWRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkgYWNjdW11bGF0ZWRQYXRocy5kZWxldGUocGFja2FnZUpzb25QYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aHMgPSBmZy5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm5Cb2R5KSA/IGFjY3VtdWxhdGVkUGF0aHMgOiBwaW5uZWRQYXRocztcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkge1xuICAgICAgICB0YXJnZXRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5hY2N1bXVsYXRlZFBhdGhzLCAuLi5waW5uZWRQYXRoc10pXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRlY2xhcmF0aW9uIHNlZWRzIEJ1bidzIGltcGxpY2l0IHdvcmtzcGFjZSBiYXNlbGluZTogaXQgY29udGFpbnMgYXQgbGVhc3Qgb25lXG4gKiBuZWdhdGlvbiBvZiB0aGUgc2VlZGluZyBzaGFwZSAoc2VlIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzIHJ1bGUgMikuIE1lYXN1cmVkIHdpdGggQnVuXG4gKiAxLjMuMTQsIHNlZWRpbmcgaXMgcGVyLW5lZ2F0aW9uIGFuZCBoYXBwZW5zIGV2ZW4gYWxvbmdzaWRlIHBvc2l0aXZlIHBhdHRlcm5zOyBjb25jcmV0ZSBvclxuICogbWl4ZWQtbGl0ZXJhbCBsYXN0IHNlZ21lbnRzIChgIWFwcHMvZXhjbHVkZWRgLCBgIWFwcHMvKmRgKSBuZXZlciBzZWVkLCBhbmQgYD9gLCBicmFjZSwgYW5kXG4gKiBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmVkIGluY29uc2lzdGVudGx5IGFjcm9zcyBmaXh0dXJlcyAoc29tZXRpbWVzIGRyb3BwaW5nIGV2ZW5cbiAqIHVucmVsYXRlZCBzaWJsaW5nIHdvcmtzcGFjZXMpLCBzbyB0aGV5IGFyZSBjb25zZXJ2YXRpdmVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nOyBzZWVcbiAqIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLnNvbWUoXG4gICAgKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkpKSAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbi8qKlxuICogRGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIHdpdGhvdXQgQnVuJ3Mgbm8tb3Agb25lcyAoYFwiXCJgLCBhIGxvbmUgYFwiIVwiYCwgYW5kIGBcIi5cImApLCB3aGljaCBCdW5cbiAqIGlnbm9yZXMgZW50aXJlbHkg4oCUIGEgbG9uZSBgXCIhXCJgIG11c3Qgbm90IGFjdGl2YXRlIHRoZSBuZWdhdGl2ZS1vbmx5IGltcGxpY2l0IGJhc2VsaW5lLCBhbmQgYFwiXCJgXG4gKiBtdXN0IG5vdCBtYWtlIHRoZSByZXBvc2l0b3J5IHJvb3QgaXRzZWxmIGEgZGlzY292ZXJlZCB3b3Jrc3BhY2UuIERlY2xhcmF0aW9uIG9yZGVyIGFuZFxuICogZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZSBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIHBvc2l0aW9uIG1hdHRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpXG4gICAgLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgLy8gQnVuIGFwcGxpZXMgbGVhZGluZy1iYW5nIFBBUklUWSAodmVyaWZpZWQgd2l0aCBCdW4gMS4zLjE0KTogYCEhcGAgaXMgdGhlIHBvc2l0aXZlIGBwYFxuICAgICAgLy8gYW5kIGAhISFwYCB0aGUgbmVnYXRpb24gYCFwYCwgc28gY2Fub25pY2FsaXplIHRvIGF0IG1vc3Qgb25lIGJhbmcuXG4gICAgICBjb25zdCBiYW5nQ291bnQgPSAvXiEqL3UuZXhlYyh3b3Jrc3BhY2VQYXR0ZXJuKSFbMF0ubGVuZ3RoO1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKGJhbmdDb3VudCk7XG4gICAgICByZXR1cm4gYmFuZ0NvdW50ICUgMiA9PT0gMSA/IGAhJHtwYXR0ZXJuQm9keX1gIDogcGF0dGVybkJvZHk7XG4gICAgfSlcbiAgICAuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gICAgICAvLyBOb3JtYWxpemUgc28gc3BlbGxpbmdzIGxpa2UgYC4vYCwgYC4vLmAsIGFuZCBgIS4vYCBhcmUgcmVjb2duaXplZCBhcyB0aGUgc2FtZSBuby1vcHNcbiAgICAgIC8vIChwYXRoLnBvc2l4Lm5vcm1hbGl6ZSgnJykgPT09ICcuJywgc28gdGhlIGVtcHR5IHBhdHRlcm4gaXMgY292ZXJlZCB0b28pLlxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5KSAhPT0gJy4nO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENvbGxhcHNlcyBgLy9gLCByZXNvbHZlcyBgLi9gLCBhbmQgc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMsIG1pcnJvcmluZyBCdW4ncyBwYXRoIGhhbmRsaW5nLlxuICogQSBwdXJlIHN0YXItcnVuIHNlZ21lbnQgb2YgdGhyZWUgb3IgbW9yZSBzdGFycyBiZWhhdmVzIGxpa2UgYCpgIHVuZGVyIEJ1biAoYCFvdGhlci8qKipgXG4gKiBtYXRjaGVzIG90aGVyL3gpIGJ1dCBub3QgdW5kZXIgZmFzdC1nbG9iLCBzbyBjYW5vbmljYWxpemUgaXQgdG8gYCpgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkocGF0dGVybkJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnBvc2l4XG4gICAgLm5vcm1hbGl6ZShwYXR0ZXJuQm9keSlcbiAgICAucmVwbGFjZSgvXFwvKyQvdSwgJycpXG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PiAoL15cXCp7Myx9JC91LnRlc3Qoc2VnbWVudCkgPyAnKicgOiBzZWdtZW50KSlcbiAgICAuam9pbignLycpO1xufVxuXG4vKiogVGhlIGltcGxpY2l0IGJhc2VsaW5lIGdsb2IgYSBuZWdhdGlvbiBzZWVkcyB1bmRlciBCdW4ncyBydWxlIDIgYWJvdmUsIG9yIHVuZGVmaW5lZCBpZiBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlZWRlZEJhc2VsaW5lR2xvYihuZWdhdGlvbkJvZHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbmVnYXRpb25Cb2R5LnNwbGl0KCcvJyk7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggIT09IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtmaXJzdFNlZ21lbnQsIGxhc3RTZWdtZW50XSA9IHNlZ21lbnRzIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gIGlmICghL15cXCorJC91LnRlc3QobGFzdFNlZ21lbnQpIHx8IC9eXFwqKyQvdS50ZXN0KGZpcnN0U2VnbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBsYXN0U2VnbWVudCA9PT0gJyoqJyA/ICcqKicgOiAnKi8qJztcbn1cblxuLyoqIFdvcmtzcGFjZSBwYXR0ZXJucyBmcm9tIGVpdGhlciB0aGUgYXJyYXkgZm9ybSBvciBZYXJuIHYxJ3MgYHsgcGFja2FnZXM6IFvigKZdIH1gIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzKSkgcmV0dXJuIHdvcmtzcGFjZXM7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHdvcmtzcGFjZXM/LnBhY2thZ2VzKSA/IHdvcmtzcGFjZXMucGFja2FnZXMgOiBbXTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm4gKG5lZ2F0aXZlIG9uZXMgaW5jbHVkZWQpIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeTpcbiAqIGFic29sdXRlIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIG5vZGVfbW9kdWxlcyBjbGVhbnVwIG9wZXJhdGVcbiAqIG9uIGFub3RoZXIgcmVwb3NpdG9yeSdzIGZpbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gIHJldHVybiAhcGF0aC5wb3NpeC5pc0Fic29sdXRlKHBhdHRlcm5Cb2R5KSAmJiAhcGF0dGVybkJvZHkuc3BsaXQoJy8nKS5pbmNsdWRlcygnLi4nKTtcbn1cbiIsImltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBBbmNob3JlZCB0byBgXCIsIGAgc28gb25seSBhIHJlZ2lzdHJ5IGVudHJ5J3MgYHJlc29sdmVkYCBzbG90IGlzIGNsZWFyZWQuIEEgZGlyZWN0IHRhcmJhbGxcbiAqIGRlcGVuZGVuY3kgY2FycmllcyBpdHMgVVJMIGluIHRoZSB3b3Jrc3BhY2UgZGVzY3JpcHRvciBhbmQgdHVwbGUgaWRlbnRpZmllciBpbnN0ZWFkLCBhbmQgdGhvc2VcbiAqIFVSTHMgbXVzdCByZW1haW4gaW50YWN0LlxuICovXG5jb25zdCBndWFyZFJlc29sdmVkVXJsUGF0dGVybiA9IC8oXCIsIClcImh0dHBzOlxcL1xcL25wbVxcLmZsYXR0XFwudGVjaFxcL1teXCJdKlwiL2c7XG5cbi8qKlxuICogUmVtb3ZlIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGJ1bi5sb2NrLlxuICpcbiAqIEJ1biB3cml0ZXMgdGhlIHdvcmtzcGFjZSByb290J3MgbG9ja2ZpbGUgZXZlbiB3aGVuIGFuIGluc3RhbGwgcnVucyBmcm9tIGEgY2hpbGQgcGFja2FnZS4gSW4gYVxuICogR2l0IGNoZWNrb3V0IHRoZSBzZWFyY2ggY2xpbWJzIHRvIHRoYXQgcm9vdDsgd2l0aG91dCBhIGNoZWNrb3V0IGJvdW5kYXJ5IGl0IGluc3BlY3RzIG9ubHkgdGhlXG4gKiBzdGFydGluZyBkaXJlY3Rvcnkgc28gaXQgY2Fubm90IHJld3JpdGUgYW4gdW5yZWxhdGVkIGFuY2VzdG9yJ3MgbG9ja2ZpbGUuIFRoZSBwcm94eSBpc1xuICogaW5zdGFsbC10aW1lIHBvbGljeSByYXRoZXIgdGhhbiByZXBvc2l0b3J5IHN0YXRlOiBhbiBlbXB0eSByZXNvbHZlZCBzbG90IHN0aWxsIG1ha2VzIEJ1biB1c2UgdGhlXG4gKiBjb25maWd1cmVkIGRlZmF1bHQgcmVnaXN0cnkuXG4gKlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgbG9ja2ZpbGUgcGF0aCwgb3IgdW5kZWZpbmVkIHdoZW4gbm8gY2hhbmdlIHdhcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdW5Mb2NrZmlsZShzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxvY2tmaWxlUGF0aCA9IGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoKTtcbiAgaWYgKCFsb2NrZmlsZVBhdGgpIHJldHVybjtcblxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGxvY2tmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3Qgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4sICckMVwiXCInKTtcbiAgaWYgKG5vcm1hbGl6ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgLy8gQSBzaWJsaW5nIHRlbXAgZmlsZSBtYWtlcyB0aGUgcmVwbGFjZW1lbnQgYW4gYXRvbWljIHNhbWUtZGlyZWN0b3J5IHJlbmFtZSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgLy8gd3JpdGUgY2Fubm90IGxlYXZlIGEgdHJ1bmNhdGVkIGJ1bi5sb2NrIGJlaGluZC5cbiAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGAke2xvY2tmaWxlUGF0aH0ubm9ybWFsaXppbmcuJHtwcm9jZXNzLnBpZH0uJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gIHRyeSB7XG4gICAgLy8gc3RhdCdzIG1vZGUgaW5jbHVkZXMgZmlsZS10eXBlIGJpdHMsIHdoaWNoIGNobW9kIGlzIG5vdCBzcGVjaWZpZWQgdG8gYWNjZXB0LlxuICAgIGNvbnN0IG1vZGUgPSBmcy5zdGF0U3luYyhsb2NrZmlsZVBhdGgpLm1vZGUgJiAwbzc3NztcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBvcmFyeVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50LCB7IG1vZGUgfSk7XG4gICAgLy8gd3JpdGVGaWxlU3luYydzIG1vZGUgaXMgbWFza2VkIGJ5IHRoZSBwcm9jZXNzIHVtYXNrOyBjaG1vZCByZXN0b3JlcyB0aGUgZXhhY3Qgb3JpZ2luYWwgYml0cy5cbiAgICBmcy5jaG1vZFN5bmModGVtcG9yYXJ5UGF0aCwgbW9kZSk7XG4gICAgZnMucmVuYW1lU3luYyh0ZW1wb3JhcnlQYXRoLCBsb2NrZmlsZVBhdGgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZzLnJtU3luYyh0ZW1wb3JhcnlQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiBsb2NrZmlsZVBhdGg7XG59XG5cbmZ1bmN0aW9uIGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZFN0YXJ0RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShzdGFydERpclBhdGgpO1xuICBjb25zdCByZXBvc2l0b3J5Um9vdERpclBhdGggPSBmaW5kUmVwb3NpdG9yeVJvb3REaXJQYXRoKHJlc29sdmVkU3RhcnREaXJQYXRoKTtcbiAgaWYgKCFyZXBvc2l0b3J5Um9vdERpclBhdGgpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRTdGFydERpclBhdGgsICdidW4ubG9jaycpO1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKGxvY2tmaWxlUGF0aCkgPyBsb2NrZmlsZVBhdGggOiB1bmRlZmluZWQ7XG4gIH1cblxuICBsZXQgZGlyUGF0aCA9IHJlc29sdmVkU3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGxvY2tmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpKSByZXR1cm4gbG9ja2ZpbGVQYXRoO1xuICAgIGlmIChkaXJQYXRoID09PSByZXBvc2l0b3J5Um9vdERpclBhdGgpIHJldHVybjtcblxuICAgIGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBkaXJQYXRoID0gc3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnLmdpdCcpKSkgcmV0dXJuIGRpclBhdGg7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBkaXJQYXRoKSByZXR1cm47XG4gICAgZGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52ID0ge1xuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgKGZub3ggcHJvZmlsZSAvIG1pc2UgZW52KSB0byBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ3F1aWV0LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N1cHByZXNzIGVudmlyb25tZW50IHZhcmlhYmxlIGxvYWRpbmcgaW5mb3JtYXRpb24uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+ICYge1xuICAvKipcbiAgICogQ29tbWFuZC1sZXZlbCBmYWxsYmFjayBmb3IgYW4gdW5zZXQgV0JfRU5WIChlLmcuIGB3YiB0ZXN0YCBzdXBwbGllcyAndGVzdCcgd2hlbiBleHBsaWNpdCBlbnZcbiAgICogZmxhZ3Mgc3VwcHJlc3MgaXRzIGRlZmF1bHQgdGVzdCBjYXNjYWRlKS4gTm90IGEgQ0xJIGZsYWcuXG4gICAqL1xuICBjb21tYW5kRGVmYXVsdFdiRW52Pzogc3RyaW5nO1xufTtcblxuY29uc3Qgc3RhbmRhcmRXYkVudk1vZGVzID0gbmV3IFNldChbJ2RldmVsb3BtZW50JywgJ3Rlc3QnLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJ10pO1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBXQl9FTlYgdmFsdWUgd2IgZmFsbHMgYmFjayB0byB3aGVuIG5vIGVudiBzb3VyY2UgYW5kIG5vIGV4cG9ydGVkIHZhcmlhYmxlIGRlZmluZXNcbiAqIGl0OiB0aGUgY29tbWFuZC1sZXZlbCBkZWZhdWx0IGZpcnN0IChgd2IgdGVzdCAtLWNhc2NhZGUtZW52PXN0YWdpbmdgIGxvYWRzIHRoZSBzdGFnaW5nIGZpbGVzXG4gKiBidXQgaXRzIHRlc3RzIG11c3Qgc3RpbGwgcnVuIGFzIGB0ZXN0YCwgbWlycm9yaW5nIHRoZSBwcmUtMTUgYHx8PSAndGVzdCdgIGJlaGF2aW9yKSwgdGhlbiB0aGVcbiAqIGZvcmNlZCBjYXNjYWRlLCB0aGVuIHRoZSBhbWJpZW50LU5PREVfRU5WLWRyaXZlbiBhdXRvIGNhc2NhZGUgY2xhbXBlZCB0byBhIHN0YW5kYXJkIG1vZGUgKGFcbiAqIG5vbi1zdGFuZGFyZCBOT0RFX0VOViBzdWNoIGFzIGBxYWAgc3RpbGwgc2VsZWN0cyB0aGUgY2FzY2FkZSBzdWZmaXgsIGJ1dCBtdXN0IG5vdCBwcm9kdWNlIGFcbiAqIG5vbi1zdGFuZGFyZCBXQl9FTlYpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZyB7XG4gIGlmIChhcmd2LmNvbW1hbmREZWZhdWx0V2JFbnYpIHJldHVybiBhcmd2LmNvbW1hbmREZWZhdWx0V2JFbnY7XG4gIGlmIChhcmd2LmNhc2NhZGVFbnYpIHJldHVybiBhcmd2LmNhc2NhZGVFbnY7XG4gIC8vIFJlYWQgTk9ERV9FTlYgdGhyb3VnaCB0aGUgYWxpYXMgZm9yIHRoZSBzYW1lIGJ1bmRsZXItaW5saW5pbmcgcmVhc29uIGFzIGluXG4gIC8vIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcywgYW5kIGZyb20gdGhlIEFNQklFTlQgZW52aXJvbm1lbnQgKG5vdCBsb2FkZWQgZmlsZXMpIGJlY2F1c2UgdGhlXG4gIC8vIGNhc2NhZGUgc2VsZWN0aW9uIGJlbG93IHVzZXMgdGhlIGFtYmllbnQgdmFsdWUgYXMgd2VsbC5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBkZXJpdmVkID1cbiAgICBhcmd2LmNhc2NhZGVOb2RlRW52IHx8IGFyZ3YuYXV0b0Nhc2NhZGVFbnYgIT09IGZhbHNlID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnIDogJ2RldmVsb3BtZW50JztcbiAgcmV0dXJuIHN0YW5kYXJkV2JFbnZNb2Rlcy5oYXMoZGVyaXZlZCkgPyBkZXJpdmVkIDogJ2RldmVsb3BtZW50Jztcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHRoZSByZXBvc2l0b3J5J3MgZm5veCBjb25maWd1cmF0aW9uIGFuZCBtaXNlLlxuICogTm90ZSBpdCBkb2VzIG5vdCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogQHJldHVybiBbZW52VmFycywgW2VudlNvdXJjZU5hbWVzLCBlbnZWYXJOYW1lc11bXV1cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICAvKipcbiAgICAgKiBMb2FkIHZhcmlhYmxlcyBldmVuIGlmIHRoZXkgYWxyZWFkeSBleGlzdCBpbiBwcm9jZXNzLmVudi5cbiAgICAgKiBVc2VmdWwgd2hlbiBhIHBhcmVudCBwcm9jZXNzIGhhcyBhbHJlYWR5IGluamVjdGVkIHRoZSBmbm94IHZhbHVlcyBpbnRvIHRoZSBlbnZpcm9ubWVudFxuICAgICAqIGFuZCB0aGUgY29uZmlndXJlZCB2YXJpYWJsZXMgdGhlbXNlbHZlcyBhcmUgbmVlZGVkIChlLmcuIGB3YiBnZW4tZGV2LXZhcnNgKS5cbiAgICAgKi9cbiAgICBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBFeHBhbmQgYCR7V0JfRU5WfWAgcmVmZXJlbmNlcyBhZ2FpbnN0IHRoZSBmYWxsYmFjayBtb2RlIHdoZW4gbm90aGluZyBkZWZpbmVzIFdCX0VOVi5cbiAgICAgKiBPbmx5IGZvciBjYWxsZXJzIHRoYXQgc3Vic2VxdWVudGx5IENPTVBMRVRFIFdCX0VOViB3aXRoIHRoYXQgZmFsbGJhY2sgKHdiJ3MgUHJvamVjdC5lbnYpLlxuICAgICAqL1xuICAgIGV4cGFuZEZhbGxiYWNrV2JFbnY/OiBib29sZWFuO1xuICB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgc3RyaW5nW11dW11dIHtcbiAgLy8gUmVhZCBOT0RFX0VOViB0aHJvdWdoIGFuIGFsaWFzLCBuZXZlciBhcyB0aGUgYHByb2Nlc3MuZW52Lk5PREVfRU5WYCBtZW1iZXIgZXhwcmVzc2lvbjpcbiAgLy8gYnVuZGxlcnMgcmVwbGFjZSB0aGF0IGV4YWN0IGV4cHJlc3Npb24gYXQgYnVpbGQgdGltZSAocm9sbGRvd24vYnVpbGQtdHMgaW5saW5lIGl0IGFzXG4gIC8vICdwcm9kdWN0aW9uJyksIHdoaWNoIGNvbnN0YW50LWZvbGRzIHRoZSBmYWxsYmFjayBiZWxvdyBhbmQgbWFkZSB0aGUgcHVibGlzaGVkIHdiIHNlbGVjdFxuICAvLyB0aGUgcHJvZHVjdGlvbiBwcm9maWxlIHdoZW5ldmVyIFdCX0VOViB3YXMgdW5zZXQuXG4gIGNvbnN0IHJ1bnRpbWVFbnYgPSBwcm9jZXNzLmVudjtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBydW50aW1lRW52LldCX0VOViB8fCBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBjb25zdCBzaG91bGRTdXBwcmVzc091dHB1dCA9IHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQoYXJndik7XG4gIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cnVudGltZUVudi5XQl9FTlZ9LCBOT0RFX0VOVjogJHtydW50aW1lRW52Lk5PREVfRU5WfWApO1xuICB9XG5cbiAgLy8gV2hlbiB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgZm9yY2VzIGEgbW9kZSAoLS1jYXNjYWRlLWVudiAvIC0tY2FzY2FkZS1ub2RlLWVudiAvIGFuIGV4cG9ydGVkXG4gIC8vIFdCX0VOViksIHZhbHVlcyB0aGF0IHRoZSBtb2RlJ3Mgb3duIGZub3ggcHJvZmlsZSBkZWZpbmVzIG11c3Qgd2luIG92ZXIgdmFyaWFibGVzIGluaGVyaXRlZFxuICAvLyBmcm9tIHRoZSBwYXJlbnQgc2hlbGw6IGEgc3RhbGUgYGV4cG9ydCBEQVRBQkFTRV9VUkw9Li4uYCBmcm9tIGEgZGV2ZWxvcG1lbnQgc2hlbGwgbXVzdCBub3RcbiAgLy8gbGVhayBpbnRvIGB3YiB0ZXN0YCdzIHRlc3QgbW9kZSAoY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzkzMCkuIE9uIENJXG4gIC8vIHRoZSBpbmhlcml0ZWQgdmFyaWFibGVzIGtlZXAgd2lubmluZyDigJQgd29ya2Zsb3dzIGRlbGliZXJhdGVseSBpbmplY3QgZW52IHZhcnMgdGhhdCBvdmVycmlkZVxuICAvLyB0aGUgY29tbWl0dGVkIHZhbHVlcyDigJQgYW5kIHRoYXQgc2hhZG93aW5nIGlzIHRoZSBkZXNpZ25lZCBiZWhhdmlvci5cbiAgY29uc3QgbW9kZUlzRm9yY2VkID0gQm9vbGVhbihcbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudiA/IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50JyA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnYgPyBydW50aW1lRW52LldCX0VOViA6IHVuZGVmaW5lZClcbiAgKTtcbiAgY29uc3QgbW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52ID0gbW9kZUlzRm9yY2VkICYmICFpc0NJRW52aXJvbm1lbnQocnVudGltZUVudi5DSSk7XG5cbiAgY29uc3QgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzOiBbc3RyaW5nLCBzdHJpbmdbXV1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IHByb2plY3RIYXNGbm94Q29uZmlnID0gaGFzUHJvamVjdEZub3hDb25maWcoY3dkKTtcbiAgY29uc3QgW2Zub3hFbnZWYXJzLCBmbm94RW52VmFyTmFtZXNdID0gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGNhc2NhZGUsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudixcbiAgICBoYXNGbm94Q29uZmlnOiBwcm9qZWN0SGFzRm5veENvbmZpZyxcbiAgfSk7XG4gIE9iamVjdC5hc3NpZ24oZW52VmFycywgZm5veEVudlZhcnMpO1xuICAvLyBSZXBvcnQgdGhlIGZub3ggc291cmNlIHdoZW5ldmVyIGZub3gudG9tbCBleGlzdHMg4oCUIGV2ZW4gd2hlbiBpdCB5aWVsZHMgbm8ga2V5cyAoYWxsIHNoYWRvd2VkLFxuICAvLyBlbXB0eSBwcm9maWxlLCBvciBhIGZhaWxpbmcgZXhwb3J0KTogY29uc3VtZXJzIHN1Y2ggYXMgd2IncyByZXF1aXJlZC1lbnZpcm9ubWVudCB2YWxpZGF0aW9uXG4gIC8vIG11c3Qgc2VlIHRoYXQgYSBkZWNsYXJlZCBlbnYgc291cmNlIGV4aXN0cyByYXRoZXIgdGhhbiBzaWxlbnRseSBmYWlsaW5nIG9wZW4uXG4gIGlmIChmbm94RW52VmFyTmFtZXMubGVuZ3RoID4gMCB8fCBwcm9qZWN0SGFzRm5veENvbmZpZykge1xuICAgIGNvbnN0IGZub3hTb3VyY2VOYW1lID0gZm5veEVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlKTtcbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbZm5veFNvdXJjZU5hbWUsIGZub3hFbnZWYXJOYW1lc10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtmbm94RW52VmFyTmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2Zub3hTb3VyY2VOYW1lfWApO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWlzZUVudlZhcnMsIG1pc2VFbnZWYXJOYW1lc10gPSByZWFkTWlzZUVudmlyb25tZW50VmFyaWFibGVzKGN3ZCwgY2FzY2FkZSwgZW52VmFycywgb3B0aW9ucyk7XG4gIE9iamVjdC5hc3NpZ24oZW52VmFycywgbWlzZUVudlZhcnMpO1xuICBpZiAobWlzZUVudlZhck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBtaXNlU291cmNlTmFtZSA9IG1pc2VFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSk7XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW21pc2VTb3VyY2VOYW1lLCBtaXNlRW52VmFyTmFtZXNdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmICFzaG91bGRTdXBwcmVzc091dHB1dCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7bWlzZUVudlZhck5hbWVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHttaXNlU291cmNlTmFtZX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgYFJlYWQgZW52IHNvdXJjZXM6ICR7ZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLm1hcCgoW2VudlBhdGgsIGtleXNdKSA9PiAoa2V5cy5sZW5ndGggPiAwID8gYCR7ZW52UGF0aH0gKCR7a2V5cy5qb2luKCcsICcpfSlgIDogZW52UGF0aCkpLmpvaW4oJywgJykgfHwgJ25vdGhpbmcnfWBcbiAgICApO1xuICB9XG5cbiAgLy8gRXhwYW5kIHJlZmVyZW5jZXMgYWdhaW5zdCB0aGUgbGl2ZSBlbnZpcm9ubWVudCBmb3Iga2V5cyBOT1QgbG9hZGVkIGZyb20gZmlsZXMsIHNvIHRoYXQgYVxuICAvLyByZWZlcmVuY2UgdG8gYW4gZXhwb3J0ZWQga2V5IChleGNsdWRlZCBmcm9tIGVudlZhcnMgYnkgcHJvY2Vzcy1lbnYgcHJlY2VkZW5jZSkgcmVzb2x2ZXMgdG9cbiAgLy8gdGhlIGVmZmVjdGl2ZSB2YWx1ZSBpbnN0ZWFkIG9mIGFuIGVtcHR5IHN0cmluZy4gTG9hZGVkIGtleXMgYXJlIGRlbGliZXJhdGVseSBhYnNlbnQgZnJvbVxuICAvLyB0aGUgcmVmZXJlbmNlIHNldDogZG90ZW52LWV4cGFuZCB3b3VsZCBvdGhlcndpc2UgcmVwbGFjZSB0aGVpciBwYXJzZWQgdmFsdWVzIHdpdGggdGhlXG4gIC8vIHByb2Nlc3MgdmFsdWVzLCBicmVha2luZyBjYWxsZXJzIHRoYXQgbmVlZCB0aGUgZmlsZS1kZWZpbmVkIHZhbHVlcyB0aGVtc2VsdmVzLlxuICBjb25zdCByZWZlcmVuY2VFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvY2Vzcy5lbnYpKSB7XG4gICAgLy8gRXNjYXBlIGRvbGxhciBzaWducyBzbyBkb3RlbnYtZXhwYW5kIHN1YnN0aXR1dGVzIGV4cG9ydGVkIHZhbHVlcyBsaXRlcmFsbHkgaW5zdGVhZCBvZlxuICAgIC8vIHJlY3Vyc2l2ZWx5IHJlLWV4cGFuZGluZyB0aGVtIChhbiBleHBvcnRlZCBgcGEkd29yZGAgbXVzdCBzdGF5IGBwYSR3b3JkYCkuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gZW52VmFycykpIHJlZmVyZW5jZUVudltrZXldID0gdmFsdWUucmVwbGFjZUFsbCgnJCcsIFN0cmluZy5yYXdgXFwkYCk7XG4gIH1cbiAgLy8gZG90ZW52LWV4cGFuZCByZXNvbHZlcyByZWZlcmVuY2VzIGluIGtleS1pbnNlcnRpb24gb3JkZXIsIHNvIGEgZm5veCB2YWx1ZSByZWZlcmVuY2luZyBhXG4gIC8vIG1pc2UtcHJvdmlkZWQga2V5IHdvdWxkIHNlZSBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIG1pc2UgZW50cmllcyBzdGF5ZWQgYXBwZW5kZWQgYWZ0ZXIgdGhlXG4gIC8vIGZub3ggZW50cmllcy4gUmVidWlsZCB0aGUgZXhwYW5zaW9uIGlucHV0IHdpdGggdGhlIGxvd2VyLXByaW9yaXR5IHNvdXJjZXMgZmlyc3Q7IHRoZSB2YWx1ZXNcbiAgLy8gdGhlbXNlbHZlcyBhbHJlYWR5IHJlZmxlY3QgdGhlIGludGVuZGVkIGZub3gtb3Zlci1taXNlIHByZWNlZGVuY2UuXG4gIGNvbnN0IG9yZGVyZWRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFsuLi5taXNlRW52VmFyTmFtZXMsIC4uLmZub3hFbnZWYXJOYW1lc10pIG9yZGVyZWRFbnZWYXJzW2tleV0gPSBlbnZWYXJzW2tleV0hO1xuICBPYmplY3QuYXNzaWduKG9yZGVyZWRFbnZWYXJzLCBlbnZWYXJzKTtcbiAgLy8gZXhwYW5kKCkgbXV0YXRlcyBCT1RIIGl0cyBwYXJzZWQgaW5wdXQgQU5EIHByb2Nlc3NFbnYgKGRvdGVudi1leHBhbmQgd3JpdGVzIGV2ZXJ5IHBhcnNlZFxuICAvLyByZXN1bHQgaW50byBwcm9jZXNzRW52KSwgc28gc25hcHNob3QgYm90aCBmb3IgdGhlIHJlLWV4cGFuc2lvbiBiZWxvdyDigJQgdGhlIHJldHJ5IG11c3Qgbm90XG4gIC8vIHNlZSB0aGUgZmlyc3QgcGFzcydzIHN0YWxlIGRlcGVuZGVudCB2YWx1ZXMuXG4gIGNvbnN0IHByZUV4cGFuc2lvbkVudlZhcnMgPSB7IC4uLm9yZGVyZWRFbnZWYXJzIH07XG4gIGNvbnN0IHByaXN0aW5lUmVmZXJlbmNlRW52ID0geyAuLi5yZWZlcmVuY2VFbnYgfTtcbiAgbGV0IGV4cGFuZGVkRW52VmFycyA9IGV4cGFuZCh7IHBhcnNlZDogb3JkZXJlZEVudlZhcnMsIHByb2Nlc3NFbnY6IHJlZmVyZW5jZUVudiB9KS5wYXJzZWQgPz8gb3JkZXJlZEVudlZhcnM7XG4gIC8vIEEgdmFsdWUgcmVmZXJlbmNpbmcgJHtXQl9FTlZ9IG11c3QgZXhwYW5kIHRvIHdoYXQgdGhlIGNoaWxkIHdpbGwgYWN0dWFsbHkgc2VlOiB3aGVuIHRoZVxuICAvLyBFRkZFQ1RJVkUgV0JfRU5WIGVuZHMgdXAgZW1wdHkg4oCUIHdoZXRoZXIgaXQgd2FzIG5ldmVyIGRlZmluZWQsIGRlZmluZWQgZW1wdHksIG9yIGVtcHRpZWQgYnlcbiAgLy8gdGhlIGV4cGFuc2lvbiBpdHNlbGYgKGUuZy4gYFdCX0VOVj0ke01JU1NJTkdfTU9ERX1gKSDigJQgd2IncyBQcm9qZWN0LmVudiBsYXRlciBmaWxscyBpdCB3aXRoXG4gIC8vIHRoZSBmYWxsYmFjayBtb2RlLCBzbyByZS1leHBhbmQgZnJvbSB0aGUgb3JpZ2luYWwgdmFsdWVzIHdpdGggdGhhdCBmYWxsYmFjayBhdmFpbGFibGUuXG4gIC8vIE9wdC1pbiB2aWEgdGhlIG9wdGlvbjogYSBkaXJlY3QgcmVhZEVudmlyb25tZW50VmFyaWFibGVzL3JlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzXG4gIC8vIGNhbGxlciBuZXZlciByZWNlaXZlcyB0aGUgY29tcGxldGVkIFdCX0VOViwgYW5kIGV4cGFuZGluZyByZWZlcmVuY2VzIGFnYWluc3QgYSB2YWx1ZSB0aGF0IGlzXG4gIC8vIG5vdCBhY3R1YWxseSBhcHBsaWVkIHdvdWxkIG1ha2UgdGhlIHBhaXIgaW5jb25zaXN0ZW50LlxuICAvLyBUaGUgbG9hZGVkIGtleSBtYXNrcyB0aGUgYW1iaWVudCB2YWx1ZSwgc28gYSBsb2FkZWQtYnV0LWVtcHRpZWQgV0JfRU5WIG5lZWRzIHRoZSByZXRyeSBldmVuXG4gIC8vIHdoZW4gYW4gZXhwb3J0ZWQgV0JfRU5WIGV4aXN0cyAoYSBmb3JjZWQgbW9kZSBmaWxlIG92ZXJyaWRlcyB0aGUgZXhwb3J0IGxvY2FsbHkpOiByZXRyeSB3aXRoXG4gIC8vIHRoZSB2YWx1ZSB0aGUgbWVyZ2VkIGVudmlyb25tZW50IHdpbGwgdWx0aW1hdGVseSByZXRhaW4uXG4gIGNvbnN0IGVmZmVjdGl2ZVdiRW52ID0gZXhwYW5kZWRFbnZWYXJzLldCX0VOViA/PyBydW50aW1lRW52LldCX0VOVjtcbiAgaWYgKG9wdGlvbnM/LmV4cGFuZEZhbGxiYWNrV2JFbnYgJiYgIWVmZmVjdGl2ZVdiRW52KSB7XG4gICAgY29uc3QgcmVFeHBhbnNpb25JbnB1dCA9IHsgLi4ucHJlRXhwYW5zaW9uRW52VmFycyB9O1xuICAgIGRlbGV0ZSByZUV4cGFuc2lvbklucHV0LldCX0VOVjtcbiAgICBjb25zdCByZXRyeVJlZmVyZW5jZUVudiA9IHsgLi4ucHJpc3RpbmVSZWZlcmVuY2VFbnYsIFdCX0VOVjogcnVudGltZUVudi5XQl9FTlYgfHwgcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndikgfTtcbiAgICBleHBhbmRlZEVudlZhcnMgPSBleHBhbmQoeyBwYXJzZWQ6IHJlRXhwYW5zaW9uSW5wdXQsIHByb2Nlc3NFbnY6IHJldHJ5UmVmZXJlbmNlRW52IH0pLnBhcnNlZCA/PyByZUV4cGFuc2lvbklucHV0O1xuICB9XG4gIHJldHVybiBbZXhwYW5kZWRFbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXNdO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gdGhlIHJlcG9zaXRvcnkncyBmbm94IGNvbmZpZ3VyYXRpb24gKGBmbm94LnRvbWxgKS5cbiAqIFRoZSBiYXNlIGBbc2VjcmV0c11gIHRhYmxlIGNhcnJpZXMgdGhlIGRldmVsb3BtZW50IHZhbHVlcywgYW5kIGBbcHJvZmlsZXMuPGNhc2NhZGU+LnNlY3JldHNdYFxuICogb3ZlcmxheXMgaXQ7IGFuIHVua25vd24gcHJvZmlsZSBmYWxscyBiYWNrIHRvIHRoZSBiYXNlIHNlY3JldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzKFxuICBjd2Q6IHN0cmluZyxcbiAgY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zPzoge1xuICAgIGlnbm9yZVByb2Nlc3NFbnY/OiBib29sZWFuO1xuICAgIG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0Vudj86IGJvb2xlYW47XG4gICAgLyoqIFByZWNvbXB1dGVkIGhhc1Byb2plY3RGbm94Q29uZmlnKGN3ZCkgcmVzdWx0LCB0byBhdm9pZCByZS13YWxraW5nIHRoZSBhbmNlc3RvciBkaXJlY3Rvcmllcy4gKi9cbiAgICBoYXNGbm94Q29uZmlnPzogYm9vbGVhbjtcbiAgfVxuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIHN0cmluZ1tdXSB7XG4gIGlmICghKG9wdGlvbnM/Lmhhc0Zub3hDb25maWcgPz8gaGFzUHJvamVjdEZub3hDb25maWcoY3dkKSkpIHJldHVybiBbe30sIFtdXTtcblxuICBjb25zdCBzZWNyZXRzID0gcnVuRm5veEV4cG9ydChjd2QsIGNhc2NhZGUsIHsgcXVpZXQ6IGZhbHNlIH0pO1xuICBpZiAoIXNlY3JldHMpIHJldHVybiBbe30sIFtdXTtcbiAgLy8gYFtwcm9maWxlcy48Y2FzY2FkZT4uc2VjcmV0c11gIGlzIHRoZSBmbm94IGFuYWxvZ3VlIG9mIGAuZW52LjxjYXNjYWRlPmA6IHdoZW4gdGhlIGNhbGxlclxuICAvLyBmb3JjZXMgYSBtb2RlIG9mZiBDSSwgcHJvZmlsZS1zcGVjaWZpYyB2YWx1ZXMgbXVzdCBvdmVycmlkZSBpbmhlcml0ZWQgc2hlbGwgdmFyaWFibGVzIGp1c3RcbiAgLy8gbGlrZSBgLmVudi48bW9kZT5gIHZhbHVlcyBkbywgd2hpbGUgYmFzZSBgW3NlY3JldHNdYCB2YWx1ZXMga2VlcCBsb3NpbmcgdG8gcHJvY2Vzcy5lbnYuIEEga2V5XG4gIC8vIGlzIHByb2ZpbGUtc3BlY2lmaWMgd2hlbiB0aGUgcHJvZmlsZSBleHBvcnQncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2UgZXhwb3J0J3M7IHdoZW4gdGhlXG4gIC8vIGJhc2UgZXhwb3J0IGZhaWxzLCBubyBvdmVycmlkZSBpcyBhcHBsaWVkIChjb25zZXJ2YXRpdmUpLiBUaGUgYmFzZSBleHBvcnQgcnVucyBMQVpJTFksIG9ubHlcbiAgLy8gd2hlbiBhIHByb2Nlc3MuZW52IGNvbGxpc2lvbiBhY3R1YWxseSBuZWVkcyBhZGp1ZGljYXRpbmcg4oCUIGl0IHdvdWxkIG90aGVyd2lzZSBhZGQgYVxuICAvLyBzdWJwcm9jZXNzIChpbmNsdWRpbmcgYWdlIGRlY3J5cHRpb24pIHRvIGV2ZXJ5IGZvcmNlZC1tb2RlIGludm9jYXRpb24gZm9yIG5vdGhpbmcuXG4gIGxldCBjYWNoZWRCYXNlU2VjcmV0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQgfCBmYWxzZSA9IGZhbHNlO1xuICBjb25zdCBnZXRCYXNlU2VjcmV0cyA9ICgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKGNhY2hlZEJhc2VTZWNyZXRzID09PSBmYWxzZSkge1xuICAgICAgY2FjaGVkQmFzZVNlY3JldHMgPSBydW5Gbm94RXhwb3J0KGN3ZCwgdW5kZWZpbmVkLCB7IHF1aWV0OiB0cnVlLCBpZ25vcmVQcm9maWxlRW52VmFyOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkQmFzZVNlY3JldHM7XG4gIH07XG5cbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZWNyZXRzKSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAvLyBFeHBsaWNpdGx5IGV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aW4gb3ZlciBmbm94IGJhc2UgdmFsdWVzLlxuICAgIC8vIChUaGUgbWlzZSByZWFkZXIgYmVsb3cgaW50ZW50aW9uYWxseSB1c2VzIGEgdmFsdWUtZXF1YWxpdHkgY2hlY2sgaW5zdGVhZDogYG1pc2UgZW52YCBlY2hvZXNcbiAgICAvLyBiYWNrIHZhcmlhYmxlcyB0aGUgYW1iaWVudCBtaXNlIGFjdGl2YXRpb24gYWxyZWFkeSBleHBvcnRlZCwgYW5kIGEgZGlmZmVyaW5nIHZhbHVlIG1lYW5zIHRoZVxuICAgIC8vIHJlcXVlc3RlZCBjYXNjYWRlIHByb2ZpbGUgc2hvdWxkIHdpbiBvdmVyIHRoZSBzdGFsZSBhY3RpdmF0aW9uLilcbiAgICBpZiAoIW9wdGlvbnM/Lmlnbm9yZVByb2Nlc3NFbnYgJiYga2V5IGluIHByb2Nlc3MuZW52KSB7XG4gICAgICBjb25zdCBiYXNlU2VjcmV0cyA9IG9wdGlvbnM/Lm1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiAmJiBjYXNjYWRlID8gZ2V0QmFzZVNlY3JldHMoKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IG92ZXJyaWRlc1Byb2Nlc3NFbnYgPSBiYXNlU2VjcmV0cyAhPT0gdW5kZWZpbmVkICYmIGJhc2VTZWNyZXRzW2tleV0gIT09IHZhbHVlO1xuICAgICAgaWYgKCFvdmVycmlkZXNQcm9jZXNzRW52KSBjb250aW51ZTtcbiAgICB9XG4gICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIFtlbnZWYXJzLCBrZXlzXTtcbn1cblxuZnVuY3Rpb24gcnVuRm5veEV4cG9ydChcbiAgY3dkOiBzdHJpbmcsXG4gIGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogeyBxdWlldDogYm9vbGVhbjsgaWdub3JlUHJvZmlsZUVudlZhcj86IGJvb2xlYW4gfVxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAvLyBgLS1pZi1taXNzaW5nIGVycm9yYCAoZGVmYXVsdCk6IGZub3ggb3RoZXJ3aXNlIGV4aXRzIDAgYW5kIHNpbGVudGx5IG9taXRzIHNlY3JldHMgaXQgZmFpbHMgdG9cbiAgLy8gcmVzb2x2ZSAoZS5nLiBhIG1pc3NpbmcgYWdlIGtleSksIHdoaWNoIHdvdWxkIGJlIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdW5kZWNsYXJlZCBzZWNyZXRzLlxuICAvLyBPcHQtaW4gZXNjYXBlIGhhdGNoIGBXQl9BTExPV19NSVNTSU5HX1NFQ1JFVFM9MWA6IHN3aXRjaCB0byBgd2FybmAgc28gYSBrZXlsZXNzIGNvbnRleHQg4oCUIGUuZy4gYVxuICAvLyBEb2NrZXIvUmFpbHdheSBpbWFnZSBidWlsZCB0aGF0IG9ubHkgaW5saW5lcyBub24tc2VjcmV0IHB1YmxpYyB2YWx1ZXMgKGBBUFBfVElUTEVgLFxuICAvLyBgTkVYVF9QVUJMSUNfKmApIHdoaWxlIHRoZSBhZ2Uga2V5IGlzIGRlbGliZXJhdGVseSBhYnNlbnQg4oCUIHN0aWxsIGxvYWRzIHRoZSByZXNvbHZhYmxlIHZhbHVlc1xuICAvLyAocGxhaW50ZXh0IGRlZmF1bHRzIHBsdXMgYW55IHNlY3JldCB0aGF0IERJRCBkZWNyeXB0KSBpbnN0ZWFkIG9mIGZhaWxpbmcgb3V0cmlnaHQuIGB3YXJuYCwgbm90XG4gIC8vIGBpZ25vcmVgLCBrZWVwcyBmbm94IHJlcG9ydGluZyB0aGUgc2tpcHBlZCBzZWNyZXQgbmFtZXMgb24gc3RkZXJyIChzdXJmYWNlZCBiZWxvdyksIHNvIHJlbGF4aW5nXG4gIC8vIHRoZSBjaGVjayBzdGF5cyBhdWRpdGFibGUgcmF0aGVyIHRoYW4gc2lsZW50bHkgZHJvcHBpbmcgZGVjbGFyZWQgc2VjcmV0cy5cbiAgLy8gYC0tbm9uLWludGVyYWN0aXZlYDogcHJvbXB0cyBvciBicm93c2VyIGF1dGggZmxvd3Mgd291bGQgaGFuZyBmb3JldmVyIGJlY2F1c2Ugc3RkaW4gaXMgaWdub3JlZC5cbiAgY29uc3QgYWxsb3dNaXNzaW5nU2VjcmV0cyA9XG4gICAgcHJvY2Vzcy5lbnYuV0JfQUxMT1dfTUlTU0lOR19TRUNSRVRTID09PSAnMScgfHwgcHJvY2Vzcy5lbnYuV0JfQUxMT1dfTUlTU0lOR19TRUNSRVRTID09PSAndHJ1ZSc7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJ2V4cG9ydCcsXG4gICAgJy0tZm9ybWF0JyxcbiAgICAnanNvbicsXG4gICAgJy0tbm8tY29sb3InLFxuICAgICctLWlmLW1pc3NpbmcnLFxuICAgIGFsbG93TWlzc2luZ1NlY3JldHMgPyAnd2FybicgOiAnZXJyb3InLFxuICAgICctLW5vbi1pbnRlcmFjdGl2ZScsXG4gIF07XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgaWYgKGNhc2NhZGUpIHtcbiAgICBhcmdzLnB1c2goJy0tcHJvZmlsZScsIGNhc2NhZGUpO1xuICB9XG4gIGlmIChvcHRpb25zLmlnbm9yZVByb2ZpbGVFbnZWYXIpIHtcbiAgICAvLyBXaXRob3V0IGAtLXByb2ZpbGVgLCBmbm94IGZhbGxzIGJhY2sgdG8gRk5PWF9QUk9GSUxFOyB0aGUgYmFzZS1hZGp1ZGljYXRpb24gZXhwb3J0IG11c3RcbiAgICAvLyByZWFkIHRoZSBCQVNFIHNlY3JldHMsIHNvIHRoZSBpbmhlcml0ZWQgcHJvZmlsZSBzZWxlY3Rpb24gaXMgY2xlYXJlZCBmb3IgaXQg4oCUIGFuZCBvbmx5IGZvclxuICAgIC8vIGl0LiBBIFBSSU1BUlkgZXhwb3J0IHN0aWxsIGhvbm9ycyBGTk9YX1BST0ZJTEU6IGl0IGVpdGhlciBzdGF5cyBwcm9maWxlLWxlc3MgKGZub3ggcmVhZHMgdGhlXG4gICAgLy8gdmFyaWFibGUpIG9yIGZvbGRzIGl0IGludG8gdGhlIGAtLXByb2ZpbGVgIGl0IHBhc3NlcyAoc2VlIHdiIGRvdGVudidzIGNhc2NhZGUpLlxuICAgIGRlbGV0ZSBlbnYuRk5PWF9QUk9GSUxFO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNoaWxkUHJvY2Vzcy5zcGF3blN5bmMoJ2Zub3gnLCBhcmdzLCB7XG4gICAgY3dkLFxuICAgIGVudixcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCAhcmVzdWx0LnN0ZG91dD8udHJpbSgpKSB7XG4gICAgLy8gVGhlIHJlcG9zaXRvcnkgZGVjbGFyZXMgZm5veC1tYW5hZ2VkIHNlY3JldHMgKGZub3gudG9tbCBleGlzdHMpLCBzbyBhIGZhaWxpbmcgZXhwb3J0IG11c3QgYmVcbiAgICAvLyBzdXJmYWNlZDogc3dhbGxvd2luZyBpdCB3b3VsZCBtYWtlIGRlY2xhcmVkIHNlY3JldHMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB1bmRlY2xhcmVkIG9uZXMuXG4gICAgaWYgKCFvcHRpb25zLnF1aWV0KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gcmVhZCBmbm94IHNlY3JldHM6ICR7cmVzdWx0LmVycm9yPy5tZXNzYWdlIHx8IHJlc3VsdC5zdGRlcnI/LnRyaW0oKSB8fCBgZm5veCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtyZXN1bHQuc3RhdHVzfWB9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFsbG93TWlzc2luZ1NlY3JldHMgJiYgIW9wdGlvbnMucXVpZXQgJiYgcmVzdWx0LnN0ZGVycj8udHJpbSgpKSB7XG4gICAgLy8gV2l0aCBgLS1pZi1taXNzaW5nIHdhcm5gLCBmbm94IGV4aXRzIDAgYnV0IHJlcG9ydHMgdGhlIHNlY3JldHMgaXQgY291bGQgbm90IHJlc29sdmUgb24gc3RkZXJyLlxuICAgIC8vIFN1cmZhY2UgdGhlbSBzbyByZWxheGluZyB0aGUgY2hlY2sgdmlhIFdCX0FMTE9XX01JU1NJTkdfU0VDUkVUUyBkb2VzIG5vdCBoaWRlIGEgcmVhbCBnYXAuXG4gICAgY29uc29sZS53YXJuKGBXQl9BTExPV19NSVNTSU5HX1NFQ1JFVFM6IGNvbnRpbnVpbmcgd2l0aG91dCB1bnJlc29sdmVkIGZub3ggc2VjcmV0cy5cXG4ke3Jlc3VsdC5zdGRlcnIudHJpbSgpfWApO1xuICB9XG5cbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgc2VjcmV0cyA9IChwYXJzZWQgYXMgeyBzZWNyZXRzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uc2VjcmV0cztcbiAgaWYgKCFzZWNyZXRzIHx8IHR5cGVvZiBzZWNyZXRzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNlY3JldHMpKSByZXR1cm47XG4gIHJldHVybiBzZWNyZXRzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzUHJvamVjdEZub3hDb25maWcoY3dkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc0FuY2VzdG9yQ29udGFpbmluZyhjd2QsIFsnZm5veC50b21sJ10pO1xufVxuXG5mdW5jdGlvbiBmbm94RW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBjYXNjYWRlID8gYGZub3ggZXhwb3J0IC0tcHJvZmlsZSAke2Nhc2NhZGV9YCA6ICdmbm94IGV4cG9ydCc7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGN3ZDogc3RyaW5nLFxuICBjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN1cnJlbnRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvcHRpb25zPzogeyBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbiB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgc3RyaW5nW11dIHtcbiAgaWYgKCFoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2QpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3QgYXJncyA9IFsnZW52JywgJy0tanNvbicsICctLWNkJywgY3dkXTtcbiAgaWYgKGNhc2NhZGUpIHtcbiAgICBhcmdzLnB1c2goJy0tZW52JywgY2FzY2FkZSk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hpbGRQcm9jZXNzLnNwYXduU3luYygnbWlzZScsIGFyZ3MsIHtcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCAhcmVzdWx0LnN0ZG91dD8udHJpbSgpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW3t9LCBbXV07XG4gIH1cbiAgaWYgKCFwYXJzZWQgfHwgdHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwYXJzZWQpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwga2V5IGluIGN1cnJlbnRFbnZWYXJzKSBjb250aW51ZTtcbiAgICBpZiAob3B0aW9ucz8uaWdub3JlUHJvY2Vzc0Vudikge1xuICAgICAgLy8gYG1pc2UgZW52YCBhbHdheXMgZW1pdHMgUEFUSCBkdWUgdG8gdG9vbCBzaGltczsgY29uc3VtZXJzIG9mIGZpbGUtZGVmaW5lZCB2YXJpYWJsZXNcbiAgICAgIC8vIChlLmcuIGB3YiBnZW4tZGV2LXZhcnNgKSBtdXN0IG5vdCBwcm9wYWdhdGUgaXQuXG4gICAgICBpZiAoa2V5ID09PSAnUEFUSCcpIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnZba2V5XSA9PT0gdmFsdWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gW2VudlZhcnMsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzQW5jZXN0b3JDb250YWluaW5nKGN3ZCwgWydtaXNlLnRvbWwnLCAnLm1pc2UudG9tbCddKTtcbn1cblxuZnVuY3Rpb24gaGFzQW5jZXN0b3JDb250YWluaW5nKGN3ZDogc3RyaW5nLCBmaWxlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGN1cnJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCk7IDsgY3VycmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpKSB7XG4gICAgaWYgKGZpbGVOYW1lcy5zb21lKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsIGZpbGVOYW1lKSkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgaWYgKHBhcmVudFBhdGggPT09IGN1cnJlbnRQYXRoKSByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWlzZUVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gY2FzY2FkZSA/IGBtaXNlIGVudiAtLWVudiAke2Nhc2NhZGV9YCA6ICdtaXNlIGVudic7XG59XG5cbmZ1bmN0aW9uIGlzQ0lFbnZpcm9ubWVudChjaUVudjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWNpRW52ICYmIGNpRW52ICE9PSAnMCcgJiYgY2lFbnYgIT09ICdmYWxzZSc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3Qgb3V0cHV0T3B0aW9ucyA9IGFyZ3YgYXMgRW52UmVhZGVyT3B0aW9ucyAmIHsgcXVpZXRFbnY/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH07XG4gIHJldHVybiBvdXRwdXRPcHRpb25zLnF1aWV0RW52ID09PSB0cnVlIHx8IChvdXRwdXRPcHRpb25zLnF1aWV0RW52ICE9PSBmYWxzZSAmJiBvdXRwdXRPcHRpb25zLnNpbGVudCA9PT0gdHJ1ZSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBmbm94L21pc2UgYW5kIGFzc2lnbnMgdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICAvLyBFeGlzdGluZyBwcm9jZXNzLmVudiBrZXlzIGFyZSBrZXB0OiBlbnZWYXJzIG1heSBkZWxpYmVyYXRlbHkgY29udGFpbiBkaWZmZXJpbmcgdmFsdWVzIHRoYXRcbiAgICAvLyBtdXN0IHdpbiBvbmx5IGluIHRoZSByZXR1cm5lZCByZWNvcmQgKG1pc2UgY2FzY2FkZS1wcm9maWxlIHZhbHVlcywgZm9yY2VkLW1vZGUgb3ZlcnJpZGVzXG4gICAgLy8gY29uc3VtZWQgdmlhIGBwcm9qZWN0LmVudmApLCBuZXZlciBjbG9iYmVyIHRoZSBjYWxsZXIncyBvd24gcHJvY2VzcyBlbnZpcm9ubWVudC5cbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzRXJybm9FeGNlcHRpb24oZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAnY29kZScgaW4gZXJyb3I7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHBzT3V0cHV0OiBzdHJpbmcpOiBNYXA8bnVtYmVyLCBudW1iZXJbXT4ge1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcHNPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IC9eXFxzKihcXGQrKVxccysoXFxkKylcXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkUGlkID0gTnVtYmVyKG1hdGNoZWRbMV0pO1xuICAgIGNvbnN0IHBhcmVudFBpZCA9IE51bWJlcihtYXRjaGVkWzJdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudFBpZCk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkUGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50UGlkLCBbY2hpbGRQaWRdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuQnlQYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyLCBjaGlsZHJlbkJ5UGFyZW50OiBNYXA8bnVtYmVyLCBudW1iZXJbXT4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGRlc2NlbmRhbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBxdWV1ZSA9IFsuLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocm9vdFBpZCkgPz8gW10pXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgcGlkID0gcXVldWVbaW5kZXhdIGFzIG51bWJlcjtcbiAgICBpbmRleCArPSAxO1xuICAgIGRlc2NlbmRhbnRzLnB1c2gocGlkKTtcbiAgICBxdWV1ZS5wdXNoKC4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChwaWQpID8/IFtdKSk7XG4gIH1cbiAgcmV0dXJuIGRlc2NlbmRhbnRzO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgaXNFcnJub0V4Y2VwdGlvbiB9IGZyb20gJy4vZXJybm8uanMnO1xuaW1wb3J0IHsgYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwLCBjb2xsZWN0RGVzY2VuZGFudFBpZHMgYXMgY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCB9IGZyb20gJy4vcHJvY2Vzc1RyZWUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJlZUtpbGwocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgPSAnU0lHVEVSTScpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgfHwgcGlkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGlkOiAke3BpZH1gKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAga2lsbFRyZWVPbldpbmRvd3MocGlkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXNjZW5kYW50cyA9IGNvbGxlY3REZXNjZW5kYW50UGlkcyhwaWQpO1xuICBjb25zdCB0YXJnZXRQaWRzID0gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQsIGRlc2NlbmRhbnRzKTtcbiAgZm9yIChjb25zdCB0YXJnZXRQaWQgb2YgdGFyZ2V0UGlkcykge1xuICAgIGtpbGxJZk5lZWRlZCh0YXJnZXRQaWQsIHNpZ25hbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbElmTmVlZGVkKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgc2lnbmFsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxUcmVlT25XaW5kb3dzKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcnVuQ29tbWFuZCgndGFza2tpbGwnLCBbJy9QSUQnLCBTdHJpbmcocGlkKSwgJy9UJywgJy9GJ10sIHtcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IHJ1bkNvbW1hbmQoXG4gICAgJ3BzJyxcbiAgICBbJy1BbycsICdwaWQ9LHBwaWQ9J10sXG4gICAgLy8gS2VlcCBjb21tYW5kIGJvdW5kZWQgc28gd2F0Y2gtbW9kZSBraWxsIGxvb3BzIGNhbm5vdCBoYW5nIHRoaXMgcGF0aC5cbiAgICB7IG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsIHRpbWVvdXQ6IDIwMDAgfVxuICApO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHN0ZG91dCk7XG4gIHJldHVybiBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwKHJvb3RQaWQsIGNoaWxkcmVuQnlQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZDogbnVtYmVyLCBkZXNjZW5kYW50czogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSBkZXNjZW5kYW50cy50b1JldmVyc2VkKCk7XG4gIHRhcmdldFBpZHMucHVzaChwaWQpO1xuICByZXR1cm4gdGFyZ2V0UGlkcztcbn1cblxuZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IHsgdGltZW91dDogbnVtYmVyOyBtYXhCdWZmZXI6IG51bWJlciB9XG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoY29tbWFuZCwgWy4uLmFyZ3NdLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBvcHRpb25zPy5tYXhCdWZmZXIsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiAnJyB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHN0ZGVyciA9IGV4dHJhY3RTdGRlcnIoZXJyb3IpO1xuICAgIHRocm93IG5ldyBDb21tYW5kRXhlY3V0aW9uRXJyb3IoY29tbWFuZCwgYXJncywgc3RkZXJyLCB0b0V4aXRDb2RlKGVycm9yKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbW1hbmRFeGVjdXRpb25FcnJvcikge1xuICAgIHJldHVybiAvbm8gc3VjaCBwcm9jZXNzfG5vdCBmb3VuZHxub3QgcmVjb2duaXplZHx0aGVyZSBpcyBubyBydW5uaW5nIGluc3RhbmNlL2kudGVzdChlcnJvci5zdGRlcnIpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdG9FeGl0Q29kZShlcnJvcjogdW5rbm93bik6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXMnIGluIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzOiB1bmtub3duIH0pLnN0YXR1cztcbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGRlcnIoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCBlcnJvciA9PT0gbnVsbCB8fCAhKCdzdGRlcnInIGluIGVycm9yKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHN0ZGVyciA9IChlcnJvciBhcyBSZWNvcmQ8J3N0ZGVycicsIHVua25vd24+KS5zdGRlcnI7XG4gIGlmICh0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdGRlcnI7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdGRlcnIpKSB7XG4gICAgcmV0dXJuIHN0ZGVyci50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuY2xhc3MgQ29tbWFuZEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sIHN0ZGVycjogc3RyaW5nLCBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29tbWFuZEV4ZWN1dGlvbkVycm9yJztcbiAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFNwYXduT3B0aW9ucyxcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZSxcbiAgU3Bhd25TeW5jUmV0dXJucyxcbiAgU3RkaW9OdWxsLFxuICBTdGRpb1BpcGUsXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnLi90cmVlS2lsbC5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRvdXQgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3Rkb3V0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRlcnI/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgYmxhbmstb25seSBsaW5lcyBhcmUgc2tpcHBlZCB3aGlsZSBwcmludGluZyBzdGRvdXQvc3RkZXJyIGluIHJlYWx0aW1lICovXG4gIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBjb25zdCBzdGRvdXRQcmludGVyID0gY3JlYXRlUmVhbHRpbWVQcmludGVyKHByb2Nlc3Muc3Rkb3V0LCBvcHRpb25zPy5vbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmcpO1xuICAgICAgY29uc3Qgc3RkZXJyUHJpbnRlciA9IGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihwcm9jZXNzLnN0ZGVyciwgb3B0aW9ucz8ub21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZG91dCkge1xuICAgICAgICAgIHN0ZG91dFByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZGVycikge1xuICAgICAgICAgIHN0ZGVyclByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0cmVlS2lsbChwcm9jLnBpZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvYy5waWR9KWAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBjbGVhbnVwU2lnbmFsczogTm9kZUpTLlNpZ25hbHNbXSA9XG4gICAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBbJ1NJR0lOVCcsICdTSUdURVJNJ10gOiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXTtcbiAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICAgIGNvbnN0IHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBbc2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoc2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWxIYW5kbGVycy5jbGVhcigpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGNsZWFudXBTaWduYWxzKSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlU2lnbmFsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgc3RvcFByb2Nlc3MoKTtcbiAgICAgICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MubGlzdGVuZXJDb3VudChzaWduYWwpID09PSAwKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIgfCBudWxsLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgc3Rkb3V0UHJpbnRlci5mbHVzaCgpO1xuICAgICAgICBzdGRlcnJQcmludGVyLmZsdXNoKCk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcblxuZnVuY3Rpb24gY3JlYXRlUmVhbHRpbWVQcmludGVyKFxuICBzdHJlYW06IE5vZGVKUy5Xcml0ZVN0cmVhbSxcbiAgb21pdEJsYW5rTGluZXMgPSBmYWxzZVxuKTogeyB3cml0ZTogKGRhdGE6IHN0cmluZykgPT4gdm9pZDsgZmx1c2g6ICgpID0+IHZvaWQgfSB7XG4gIGlmICghb21pdEJsYW5rTGluZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGU6IChkYXRhKSA9PiBzdHJlYW0ud3JpdGUoZGF0YSksXG4gICAgICBmbHVzaDogKCkgPT4ge30sXG4gICAgfTtcbiAgfVxuXG4gIGxldCBwZW5kaW5nID0gJyc7XG4gIHJldHVybiB7XG4gICAgd3JpdGU6IChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nICs9IGRhdGE7XG4gICAgICBjb25zdCBsaW5lcyA9IHBlbmRpbmcuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgIHBlbmRpbmcgPSBsaW5lcy5wb3AoKSA/PyAnJztcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAoIWlzQmxhbmtMaW5lKGxpbmUpKSB7XG4gICAgICAgICAgc3RyZWFtLndyaXRlKGAke2xpbmV9XFxuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGZsdXNoOiAoKSA9PiB7XG4gICAgICBpZiAoIWlzQmxhbmtMaW5lKHBlbmRpbmcpKSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShwZW5kaW5nKTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmcgPSAnJztcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0JsYW5rTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxpbmUucmVwbGFjZUFsbChBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCwgJycpLnRyaW0oKS5sZW5ndGggPT09IDA7XG59XG4iLCJjb25zdCBib29sZWFuT3B0aW9uTmFtZXMgPSBuZXcgU2V0KFtcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnLFxuICAnY2FzY2FkZS1ub2RlLWVudicsXG4gICdkcnktcnVuJyxcbiAgJ2RyeScsXG4gICdkJyxcbiAgJ2hlbHAnLFxuICAnaCcsXG4gICdxdWlldC1lbnYnLFxuICAndmVyYm9zZScsXG4gICd2JyxcbiAgJ3ZlcnNpb24nLFxuXSk7XG5jb25zdCB2YWx1ZU9wdGlvbk5hbWVzID0gbmV3IFNldChbJ2Nhc2NhZGUtZW52JywgJ3dvcmtpbmctZGlyJywgJ3cnXSk7XG5jb25zdCBib3VuZGFyeU1hcmtlckVudk5hbWUgPSAnV0JfSU5URVJOQUxfUlVOX0JPVU5EQVJZX01BUktFUic7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm90ZWN0UnVuU2NyaXB0QXJncyhhcmd2KSB7XG4gIGNvbnN0IHJ1bkluZGV4ID0gZmluZFRvcExldmVsUnVuSW5kZXgoYXJndik7XG4gIGlmIChydW5JbmRleCA9PT0gLTEpIHJldHVybjtcblxuICBjb25zdCBzY3JpcHRJbmRleCA9IGZpbmRSdW5TY3JpcHRJbmRleChhcmd2LCBydW5JbmRleCArIDEpO1xuICBpZiAoc2NyaXB0SW5kZXggPT09IHVuZGVmaW5lZCB8fCBhcmd2W3NjcmlwdEluZGV4IC0gMV0gPT09ICctLScpIHJldHVybjtcblxuICBjb25zdCBleGlzdGluZ01hcmtlciA9IHByb2Nlc3MuZW52W2JvdW5kYXJ5TWFya2VyRW52TmFtZV07XG4gIGlmIChhcmd2W3NjcmlwdEluZGV4ICsgMV0gPT09ICctLScpIHtcbiAgICBpZiAoZXhpc3RpbmdNYXJrZXIgJiYgYXJndltzY3JpcHRJbmRleCArIDJdID09PSBleGlzdGluZ01hcmtlcikgcmV0dXJuO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudltib3VuZGFyeU1hcmtlckVudk5hbWVdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBtYXJrZXI7XG4gIGRvIG1hcmtlciA9IGBfX1dCX1JVTl9TQ1JJUFRfQVJHU18ke3JhbmRvbVVVSUQoKX1fX2A7XG4gIHdoaWxlIChhcmd2LmluY2x1ZGVzKG1hcmtlcikpO1xuICBwcm9jZXNzLmVudltib3VuZGFyeU1hcmtlckVudk5hbWVdID0gbWFya2VyO1xuICBhcmd2LnNwbGljZShzY3JpcHRJbmRleCArIDEsIDAsICctLScsIG1hcmtlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW5TY3JpcHRBcmdzKGFyZ3YpIHtcbiAgY29uc3QgcnVuSW5kZXggPSBmaW5kVG9wTGV2ZWxSdW5JbmRleChhcmd2KTtcbiAgaWYgKHJ1bkluZGV4ID09PSAtMSkgcmV0dXJuIFtdO1xuICBjb25zdCBzY3JpcHRJbmRleCA9IGZpbmRSdW5TY3JpcHRJbmRleChhcmd2LCBydW5JbmRleCArIDEpO1xuICBpZiAoc2NyaXB0SW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGFyZ3MgPSBhcmd2LnNsaWNlKHNjcmlwdEluZGV4KTtcbiAgY29uc3QgbWFya2VyID0gcHJvY2Vzcy5lbnZbYm91bmRhcnlNYXJrZXJFbnZOYW1lXTtcbiAgaWYgKG1hcmtlciAmJiBhcmdzWzFdID09PSAnLS0nICYmIGFyZ3NbMl0gPT09IG1hcmtlcikgYXJncy5zcGxpY2UoMSwgMik7XG4gIGRlbGV0ZSBwcm9jZXNzLmVudltib3VuZGFyeU1hcmtlckVudk5hbWVdO1xuICByZXR1cm4gYXJncztcbn1cblxuZnVuY3Rpb24gZmluZFRvcExldmVsUnVuSW5kZXgoYXJndikge1xuICBmb3IgKGxldCBpbmRleCA9IDI7IGluZGV4IDwgYXJndi5sZW5ndGg7ICkge1xuICAgIGNvbnN0IGNvbnN1bWVkID0gY291bnRPcHRpb25Ub2tlbnMoYXJndiwgaW5kZXgpO1xuICAgIGlmIChjb25zdW1lZCA9PT0gMCkgcmV0dXJuIGFyZ3ZbaW5kZXhdID09PSAncnVuJyA/IGluZGV4IDogLTE7XG4gICAgaW5kZXggKz0gY29uc3VtZWQ7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBmaW5kUnVuU2NyaXB0SW5kZXgoYXJndiwgc3RhcnRJbmRleCkge1xuICBmb3IgKGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7IGluZGV4IDwgYXJndi5sZW5ndGg7ICkge1xuICAgIGlmIChhcmd2W2luZGV4XSA9PT0gJy0tJykgcmV0dXJuIGFyZ3ZbaW5kZXggKyAxXSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogaW5kZXggKyAxO1xuICAgIGNvbnN0IGNvbnN1bWVkID0gY291bnRPcHRpb25Ub2tlbnMoYXJndiwgaW5kZXgpO1xuICAgIGlmIChjb25zdW1lZCA9PT0gMCkgcmV0dXJuIGluZGV4O1xuICAgIGluZGV4ICs9IGNvbnN1bWVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvdW50T3B0aW9uVG9rZW5zKGFyZ3YsIGluZGV4KSB7XG4gIGNvbnN0IGFyZyA9IGFyZ3ZbaW5kZXhdO1xuICBpZiAoIWFyZz8uc3RhcnRzV2l0aCgnLScpIHx8IGFyZyA9PT0gJy0nKSByZXR1cm4gMDtcbiAgaWYgKGFyZy5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgY29uc3Qgb3B0aW9uVGV4dCA9IGFyZy5zbGljZSgyKTtcbiAgICBjb25zdCBlcXVhbHNJbmRleCA9IG9wdGlvblRleHQuaW5kZXhPZignPScpO1xuICAgIGNvbnN0IHJhd05hbWUgPSBlcXVhbHNJbmRleCA9PT0gLTEgPyBvcHRpb25UZXh0IDogb3B0aW9uVGV4dC5zbGljZSgwLCBlcXVhbHNJbmRleCk7XG4gICAgY29uc3QgbmFtZSA9IHJhd05hbWUuc3RhcnRzV2l0aCgnbm8tJykgPyByYXdOYW1lLnNsaWNlKDMpIDogcmF3TmFtZTtcbiAgICBpZiAoYm9vbGVhbk9wdGlvbk5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIGVxdWFsc0luZGV4ID09PSAtMSAmJiBpc0Jvb2xlYW5MaXRlcmFsKGFyZ3ZbaW5kZXggKyAxXSkgPyAyIDogMTtcbiAgICB9XG4gICAgaWYgKCF2YWx1ZU9wdGlvbk5hbWVzLmhhcyhuYW1lKSkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGVxdWFsc0luZGV4ID09PSAtMSA/IDIgOiAxO1xuICB9XG5cbiAgY29uc3Qgc2hvcnRPcHRpb25zID0gYXJnLnNsaWNlKDEpO1xuICBpZiAoL15bZGh2XT0oZmFsc2V8dHJ1ZSkkLy50ZXN0KHNob3J0T3B0aW9ucykpIHJldHVybiAxO1xuICBpZiAoL15bZGh2XSQvLnRlc3Qoc2hvcnRPcHRpb25zKSAmJiBpc0Jvb2xlYW5MaXRlcmFsKGFyZ3ZbaW5kZXggKyAxXSkpIHJldHVybiAyO1xuICBmb3IgKGxldCBvcHRpb25JbmRleCA9IDA7IG9wdGlvbkluZGV4IDwgc2hvcnRPcHRpb25zLmxlbmd0aDsgb3B0aW9uSW5kZXgrKykge1xuICAgIGNvbnN0IG5hbWUgPSBzaG9ydE9wdGlvbnNbb3B0aW9uSW5kZXhdO1xuICAgIGlmIChib29sZWFuT3B0aW9uTmFtZXMuaGFzKG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAodmFsdWVPcHRpb25OYW1lcy5oYXMobmFtZSkpIHJldHVybiBvcHRpb25JbmRleCArIDEgPCBzaG9ydE9wdGlvbnMubGVuZ3RoID8gMSA6IDI7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbkxpdGVyYWwodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSAnZmFsc2UnIHx8IHZhbHVlID09PSAndHJ1ZSc7XG59XG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAgICogRm9yIGV4YW1wbGUsIGByZXRyeUNvdW50OiAzYCBydW5zIHRoZSBmdW5jdGlvbiBhdCBtb3N0IDMgdGltZXM6IDEgaW5pdGlhbCBhdHRlbXB0IGFuZCB1cCB0byAyIHJldHJpZXMuXG4gICAqL1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuKiBBIFNIQTMtNTEyIGltcGxlbWVudGF0aW9uIHNwZWNpYWxpemVkIGFuZCBvcHRpbWl6ZWQgZnJvbVxuKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfSAodmVyc2lvbiAwLjkuMykuXG4qXG4qIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXG4qIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDIzXG4qIEBsaWNlbnNlIE1JVFxuKi9cbmNvbnN0IGU9QXJyYXkuZnJvbSh7bGVuZ3RoOjI1Nn0sKGUsdCk9PnQudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsYDBgKSksdD1uZXcgSW50MzJBcnJheShbMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF0pLG49bmV3IEludDMyQXJyYXkoNTApLHI9bmV3IEludDMyQXJyYXkoMTgpLGk9bmV3IFRleHRFbmNvZGVyO2xldCBhPW5ldyBVaW50OEFycmF5KDQwOTYpLG89bmV3IFVpbnQzMkFycmF5KGEuYnVmZmVyKTtjb25zdCBlZT1uZXcgVWludDhBcnJheShuZXcgVWludDMyQXJyYXkoWzFdKS5idWZmZXIpWzBdPT09MTtmdW5jdGlvbiBzKHQpe2xldCBzPXQubGVuZ3RoKjMsbD1hLHU9bztpZihsLmxlbmd0aDxzKXtsZXQgZT1sLmxlbmd0aCoyO2Zvcig7ZTxzOyllKj0yO2w9bmV3IFVpbnQ4QXJyYXkoZSksdT1uZXcgVWludDMyQXJyYXkobC5idWZmZXIpLGU8PTEwNDg1NzYmJihhPWwsbz11KX1sZXQgZD1pLmVuY29kZUludG8odCxsKS53cml0dGVuLGY9bjtmLmZpbGwoMCk7bGV0IHA9MDtpZihlZSl7bGV0IGU9MDtmb3IoO2QtcD49NzI7KXtmb3IobGV0IHQ9MDt0PDE4O3QrKylmW3RdPWZbdF1edVtlK3RdO2MoZiksZSs9MTgscCs9NzJ9fWVsc2UgZm9yKDtkLXA+PTcyOyl7Zm9yKGxldCBlPTA7ZTwxODtlKyspe2xldCB0PXArKGU8PDIpO2ZbZV09ZltlXV4obFt0XXxsW3QrMV08PDh8bFt0KzJdPDwxNnxsW3QrM108PDI0KX1jKGYpLHArPTcyfWxldCBtPXI7bS5maWxsKDApO2ZvcihsZXQgZT1wO2U8ZDtlKyspe2xldCB0PWUtcDttW3Q+PjJdPW1bdD4+Ml18bFtlXTw8KCh0JjMpPDwzKX1sZXQgaD1kLXA7bVtoPj4yXT1tW2g+PjJdfDY8PCgoaCYzKTw8MyksbVsxN118PTIxNDc0ODM2NDg7Zm9yKGxldCBlPTA7ZTwxODtlKyspZltlXT1mW2VdXm1bZV07YyhmKTtsZXQgZz1gYDtmb3IobGV0IHQ9MDt0PDE2O3QrPTQpe2xldCBuPWZbdF0scj1mW3QrMV0saT1mW3QrMl0sYT1mW3QrM107Zys9ZVtuJjI1NV0rZVtuPj44JjI1NV0rZVtuPj4xNiYyNTVdK2Vbbj4+PjI0XStlW3ImMjU1XStlW3I+PjgmMjU1XStlW3I+PjE2JjI1NV0rZVtyPj4+MjRdK2VbaSYyNTVdK2VbaT4+OCYyNTVdK2VbaT4+MTYmMjU1XStlW2k+Pj4yNF0rZVthJjI1NV0rZVthPj44JjI1NV0rZVthPj4xNiYyNTVdK2VbYT4+PjI0XX1yZXR1cm4gZ31mdW5jdGlvbiBjKGUpe2xldCBuLHIsaSxhLG8sZWUscyxjLGwsdSxkLGYscCxtLGgsZyx0ZSxuZSxyZSxpZSxhZSxvZSxzZSxjZSxsZSx1ZSxkZSxmZSxwZSxtZSxoZSxnZSxfZSx2ZSx5ZSxiZSx4ZSxTZSxDZSx3ZSxUZSxFZSxEZSxPZSxrZSxBZSxqZSxNZSxOZSxQZSxGZSxJZSxMZSxSZSx6ZSxCZSxWZSxIZSxVZSxXZSxHZSxLZSxxZSxfPWVbMF0sdj1lWzFdLHk9ZVsyXSxKZT1lWzNdLGI9ZVs0XSx4PWVbNV0sUz1lWzZdLEM9ZVs3XSx3PWVbOF0sVD1lWzldLEU9ZVsxMF0sRD1lWzExXSxPPWVbMTJdLGs9ZVsxM10sQT1lWzE0XSxqPWVbMTVdLE09ZVsxNl0sTj1lWzE3XSxQPWVbMThdLEY9ZVsxOV0sST1lWzIwXSxMPWVbMjFdLFI9ZVsyMl0sej1lWzIzXSxCPWVbMjRdLFY9ZVsyNV0sSD1lWzI2XSxVPWVbMjddLFc9ZVsyOF0sRz1lWzI5XSxLPWVbMzBdLHE9ZVszMV0sSj1lWzMyXSxZPWVbMzNdLFg9ZVszNF0sWj1lWzM1XSxRPWVbMzZdLCQ9ZVszN10sWWU9ZVszOF0sWGU9ZVszOV0sWmU9ZVs0MF0sUWU9ZVs0MV0sJGU9ZVs0Ml0sZXQ9ZVs0M10sdHQ9ZVs0NF0sbnQ9ZVs0NV0scnQ9ZVs0Nl0saXQ9ZVs0N10sYXQ9ZVs0OF0sb3Q9ZVs0OV07Zm9yKGk9MDtpPDQ4O2krPTIpYT1fXkVeSV5LXlplLG89dl5EXkxecV5RZSxlZT15Xk9eUl5KXiRlLHM9SmVea156XlleZXQsYz1iXkFeQl5YXnR0LGw9eF5qXlZeWl5udCx1PVNeTV5IXlFecnQsZD1DXk5eVV4kXml0LGY9d15QXldeWWVeYXQscD1UXkZeR15YZV5vdCxuPWZeKGVlPDwxfHM+Pj4zMSkscj1wXihzPDwxfGVlPj4+MzEpLF9ePW4sdl49cixFXj1uLERePXIsSV49bixMXj1yLEtePW4scV49cixaZV49bixRZV49cixuPWFeKGM8PDF8bD4+PjMxKSxyPW9eKGw8PDF8Yz4+PjMxKSx5Xj1uLEplXj1yLE9ePW4sa149cixSXj1uLHpePXIsSl49bixZXj1yLCRlXj1uLGV0Xj1yLG49ZWVeKHU8PDF8ZD4+PjMxKSxyPXNeKGQ8PDF8dT4+PjMxKSxiXj1uLHhePXIsQV49bixqXj1yLEJePW4sVl49cixYXj1uLFpePXIsdHRePW4sbnRePXIsbj1jXihmPDwxfHA+Pj4zMSkscj1sXihwPDwxfGY+Pj4zMSksU149bixDXj1yLE1ePW4sTl49cixIXj1uLFVePXIsUV49biwkXj1yLHJ0Xj1uLGl0Xj1yLG49dV4oYTw8MXxvPj4+MzEpLHI9ZF4obzw8MXxhPj4+MzEpLHdePW4sVF49cixQXj1uLEZePXIsV149bixHXj1yLFllXj1uLFhlXj1yLGF0Xj1uLG90Xj1yLG09XyxoPXYsQWU9RDw8NHxFPj4+MjgsamU9RTw8NHxEPj4+MjgsZmU9STw8M3xMPj4+MjkscGU9TDw8M3xJPj4+MjksV2U9cTw8OXxLPj4+MjMsR2U9Szw8OXxxPj4+MjMsRWU9WmU8PDE4fFFlPj4+MTQsRGU9UWU8PDE4fFplPj4+MTQsdmU9eTw8MXxKZT4+PjMxLHllPUplPDwxfHk+Pj4zMSxnPWs8PDEyfE8+Pj4yMCx0ZT1PPDwxMnxrPj4+MjAsTWU9Ujw8MTB8ej4+PjIyLE5lPXo8PDEwfFI+Pj4yMixtZT1ZPDwxM3xKPj4+MTksaGU9Sjw8MTN8WT4+PjE5LEtlPSRlPDwyfGV0Pj4+MzAscWU9ZXQ8PDJ8JGU+Pj4zMCxSZT14PDwzMHxiPj4+Mix6ZT1iPDwzMHx4Pj4+MixiZT1BPDw2fGo+Pj4yNix4ZT1qPDw2fEE+Pj4yNixuZT1WPDwxMXxCPj4+MjEscmU9Qjw8MTF8Vj4+PjIxLFBlPVg8PDE1fFo+Pj4xNyxGZT1aPDwxNXxYPj4+MTcsZ2U9bnQ8PDI5fHR0Pj4+MyxfZT10dDw8Mjl8bnQ+Pj4zLGNlPVM8PDI4fEM+Pj40LGxlPUM8PDI4fFM+Pj40LEJlPU48PDIzfE0+Pj45LFZlPU08PDIzfE4+Pj45LFNlPUg8PDI1fFU+Pj43LENlPVU8PDI1fEg+Pj43LGllPVE8PDIxfCQ+Pj4xMSxhZT0kPDwyMXxRPj4+MTEsSWU9aXQ8PDI0fHJ0Pj4+OCxMZT1ydDw8MjR8aXQ+Pj44LE9lPXc8PDI3fFQ+Pj41LGtlPVQ8PDI3fHc+Pj41LHVlPVA8PDIwfEY+Pj4xMixkZT1GPDwyMHxQPj4+MTIsSGU9Rzw8N3xXPj4+MjUsVWU9Vzw8N3xHPj4+MjUsd2U9WWU8PDh8WGU+Pj4yNCxUZT1YZTw8OHxZZT4+PjI0LG9lPWF0PDwxNHxvdD4+PjE4LHNlPW90PDwxNHxhdD4+PjE4LF89bV5+ZyZuZSx2PWhefnRlJnJlLEU9Y2VefnVlJmZlLEQ9bGVefmRlJnBlLEk9dmVefmJlJlNlLEw9eWVefnhlJkNlLEs9T2VefkFlJk1lLHE9a2VefmplJk5lLFplPVJlXn5CZSZIZSxRZT16ZV5+VmUmVWUseT1nXn5uZSZpZSxKZT10ZV5+cmUmYWUsTz11ZV5+ZmUmbWUsaz1kZV5+cGUmaGUsUj1iZV5+U2Umd2Usej14ZV5+Q2UmVGUsSj1BZV5+TWUmUGUsWT1qZV5+TmUmRmUsJGU9QmVefkhlJldlLGV0PVZlXn5VZSZHZSxiPW5lXn5pZSZvZSx4PXJlXn5hZSZzZSxBPWZlXn5tZSZnZSxqPXBlXn5oZSZfZSxCPVNlXn53ZSZFZSxWPUNlXn5UZSZEZSxYPU1lXn5QZSZJZSxaPU5lXn5GZSZMZSx0dD1IZV5+V2UmS2UsbnQ9VWVefkdlJnFlLFM9aWVefm9lJm0sQz1hZV5+c2UmaCxNPW1lXn5nZSZjZSxOPWhlXn5fZSZsZSxIPXdlXn5FZSZ2ZSxVPVRlXn5EZSZ5ZSxRPVBlXn5JZSZPZSwkPUZlXn5MZSZrZSxydD1XZV5+S2UmUmUsaXQ9R2VefnFlJnplLHc9b2Vefm0mZyxUPXNlXn5oJnRlLFA9Z2VefmNlJnVlLEY9X2VefmxlJmRlLFc9RWVefnZlJmJlLEc9RGVefnllJnhlLFllPUllXn5PZSZBZSxYZT1MZV5+a2UmamUsYXQ9S2VeflJlJkJlLG90PXFlXn56ZSZWZSxfXj10W2ldLHZePXRbaSsxXTtlWzBdPV8sZVsxXT12LGVbMl09eSxlWzNdPUplLGVbNF09YixlWzVdPXgsZVs2XT1TLGVbN109QyxlWzhdPXcsZVs5XT1ULGVbMTBdPUUsZVsxMV09RCxlWzEyXT1PLGVbMTNdPWssZVsxNF09QSxlWzE1XT1qLGVbMTZdPU0sZVsxN109TixlWzE4XT1QLGVbMTldPUYsZVsyMF09SSxlWzIxXT1MLGVbMjJdPVIsZVsyM109eixlWzI0XT1CLGVbMjVdPVYsZVsyNl09SCxlWzI3XT1VLGVbMjhdPVcsZVsyOV09RyxlWzMwXT1LLGVbMzFdPXEsZVszMl09SixlWzMzXT1ZLGVbMzRdPVgsZVszNV09WixlWzM2XT1RLGVbMzddPSQsZVszOF09WWUsZVszOV09WGUsZVs0MF09WmUsZVs0MV09UWUsZVs0Ml09JGUsZVs0M109ZXQsZVs0NF09dHQsZVs0NV09bnQsZVs0Nl09cnQsZVs0N109aXQsZVs0OF09YXQsZVs0OV09b3R9ZXhwb3J0e3MgYXMgc2hhM181MTJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXAiLCJjb25zdCBlPXIoKSx0PW5ldyBUZXh0RW5jb2RlcixuPW5ldyBUZXh0RGVjb2RlcihgdXRmLThgKTtmdW5jdGlvbiByKCl7cmV0dXJuIG5ldyBNYXAoW3tpbnN0YW5jZTpFcnJvcixmcm9tOmU9PntsZXQgdD1bZS5uYW1lLGUubWVzc2FnZV07cmV0dXJuIGUuc3RhY2shPT12b2lkIDAmJnQucHVzaChlLnN0YWNrKSxlLmNhdXNlIT09dm9pZCAwJiYoZS5zdGFjaz09PXZvaWQgMCYmdC5wdXNoKHZvaWQgMCksdC5wdXNoKGUuY2F1c2UpKSx0fSxzdHViOigpPT5FcnJvcigpLGh5ZHJhdGU6KGUsW3QsbixyLGldKT0+e2UubmFtZT10LGUubWVzc2FnZT1uLHI9PT12b2lkIDA/ZGVsZXRlIGUuc3RhY2s6ZS5zdGFjaz1yLGkhPT12b2lkIDAmJihlLmNhdXNlPWkpfX0se2luc3RhbmNlOlVpbnQ4QXJyYXksZnJvbTplPT5bYnRvYShuLmRlY29kZShlKSldLGNyZWF0ZTooW2VdKT0+dC5lbmNvZGUoYXRvYihlKSl9LHtpbnN0YW5jZTpNYXAsZnJvbTplPT5bLi4uZS5lbnRyaWVzKCldLHN0dWI6KCk9Pm5ldyBNYXAsaHlkcmF0ZTooZSx0KT0+e2ZvcihsZXRbbixyXW9mIHQpZS5zZXQobixyKX19LHtpbnN0YW5jZTpTZXQsZnJvbTplPT5bLi4uZS52YWx1ZXMoKV0sc3R1YjooKT0+bmV3IFNldCxoeWRyYXRlOihlLHQpPT57Zm9yKGxldCBuIG9mIHQpZS5hZGQobil9fSx7aW5zdGFuY2U6RGF0ZSxmcm9tOmU9PltlLnRvSlNPTigpXSxjcmVhdGU6KFtlXSk9Pm5ldyBEYXRlKGUpfSx7aW5zdGFuY2U6UmVnRXhwLGZyb206KHtmbGFnczplLHNvdXJjZTp0fSk9PmU/W3QsZV06W3RdLGNyZWF0ZTooW2UsdF0pPT5uZXcgUmVnRXhwKGUsdCl9LHtpbnN0YW5jZTpVUkwsZnJvbTplPT5bZS5ocmVmXSxjcmVhdGU6KFtlXSk9Pm5ldyBVUkwoZSl9XS5tYXAoZT0+W2UuaW5zdGFuY2UubmFtZSxlXSkpfWV4cG9ydHtlIGFzIEdMT0JBTF9DT05TVFJVQ1RPUl9NQVB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RydWN0b3JzLmpzLm1hcCIsImltcG9ydHtHTE9CQUxfQ09OU1RSVUNUT1JfTUFQIGFzIGV9ZnJvbVwiLi9jb25zdHJ1Y3RvcnMuanNcIjtmdW5jdGlvbiB0KHQsbj1lKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkocih0LG4pKX1mdW5jdGlvbiBuKGUpe2lmKGU9PT12b2lkIDApcmV0dXJuLTE7aWYodHlwZW9mIGU9PWBudW1iZXJgKXtpZihOdW1iZXIuaXNOYU4oZSkpcmV0dXJuLTM7aWYoIU51bWJlci5pc0Zpbml0ZShlKSlyZXR1cm4gZTwwPy01Oi00fXJldHVybiBudWxsfWZ1bmN0aW9uIHIodCxyPWUpe2xldCBpPW4odCk7aWYoaSE9PW51bGwpcmV0dXJuIGk7bGV0IGE9W10sbz1uZXcgTWFwO3JldHVybiBzKHQpLGE7ZnVuY3Rpb24gcyhlKXtsZXQgdD1uKGUpO2lmKHQhPT1udWxsKXJldHVybiB0O2xldCBpPW8uZ2V0KGUpO2lmKGkhPT12b2lkIDApcmV0dXJuIGk7c3dpdGNoKGk9YS5sZW5ndGgsdHlwZW9mIGUpe2Nhc2VgbnVtYmVyYDpjYXNlYHN0cmluZ2A6Y2FzZWBib29sZWFuYDphW2ldPWUsby5zZXQoZSxpKTticmVhaztjYXNlYGJpZ2ludGA6YVtpXT1bLTYsZS50b1N0cmluZygxNildLG8uc2V0KGUsaSk7YnJlYWs7Y2FzZWBvYmplY3RgOmlmKGU9PT1udWxsKWFbaV09ZSxvLnNldChlLGkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7bGV0IHQ9ZS5sZW5ndGgsbj1BcnJheSh0KTthW2ldPW4sby5zZXQoZSxpKTtmb3IobGV0IHI9MDtyPHQ7cisrKW5bcl09cyhlW3JdKX1lbHNle2xldCB0PWUuY29uc3RydWN0b3Isbj10eXBlb2YgdD09YGZ1bmN0aW9uYD9yLmdldCh0Lm5hbWUpOnZvaWQgMDtpZihuPT09dm9pZCAwKXtsZXQgdD1PYmplY3Qua2V5cyhlKSxuPXQubGVuZ3RoLHI9QXJyYXkobituKzEpO3JbMF09YGAsYVtpXT1yLG8uc2V0KGUsaSk7Zm9yKGxldCBpPTA7aTxuO2krKyl7bGV0IG49dFtpXSxhPWkraTtyW2ErMV09cyhuKSxyW2ErMl09cyhlW25dKX19ZWxzZXtsZXQgcj1uLmZyb20oZSksYz1yLmxlbmd0aCxsPUFycmF5KGMrMSk7bFswXT10Lm5hbWUsYVtpXT1sLG8uc2V0KGUsaSk7Zm9yKGxldCBlPTA7ZTxjO2UrKylsW2UrMV09cyhyW2VdKX19fXJldHVybiBpfX1leHBvcnR7dCBhcyBzdHJpbmdpZnl9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5naWZ5LmpzLm1hcCIsImltcG9ydHtzaGEzXzUxMiBhcyBlfWZyb21cIi4vaGFzaC5qc1wiO2ltcG9ydHtzdHJpbmdpZnkgYXMgdH1mcm9tXCIuL29zb24vc3RyaW5naWZ5LmpzXCI7ZnVuY3Rpb24gbihuLHIpe3JldHVybiBlKHQoW24scl0pKX1mdW5jdGlvbiByKGUsbil7cmV0dXJuIHQoW2Usbl0pfWZ1bmN0aW9uIGkoKXtyZXR1cm5gYH1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbiBhcyBnZXRDYWNoZUtleU9mSGFzaCxyIGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXAiLCJpbXBvcnR7Z2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nIGFzIGUsZ2V0Q2FjaGVLZXlPZkhhc2ggYXMgdH1mcm9tXCIuL2dldENhY2hlS2V5LmpzXCI7Y29uc3Qgbj1pKHtnZXRDYWNoZUtleTp0fSkscj1pKHtnZXRDYWNoZUtleTplfSk7ZnVuY3Rpb24gaSh7Y2FjaGVEdXJhdGlvbjplPTEvMCxnZXRDYWNoZUtleTpuPXR9PXt9KXtyZXR1cm4gZnVuY3Rpb24odCxyKXtsZXQgaSxhLG87cmV0dXJuIHI/LmtpbmQ9PT1gZ2V0dGVyYD9mdW5jdGlvbigpe2xldCByPW4odGhpcyxbXSkscz1EYXRlLm5vdygpO3JldHVybihvIT09cnx8cy1hPmUpJiYobz1yLGk9dC5jYWxsKHRoaXMpLGE9cyksaX06ZnVuY3Rpb24oLi4ucyl7bGV0IGM9bih0aGlzLHMpLGw9RGF0ZS5ub3coKTtyZXR1cm4obyE9PWN8fGwtYT5lKSYmKG89YyxpPVJlZmxlY3QuYXBwbHkodCxyP3RoaXM6dm9pZCAwLHMpLGE9bCksaX19fWV4cG9ydHtuIGFzIG1lbW9pemVPbmUsaSBhcyBtZW1vaXplT25lRmFjdG9yeSxyIGFzIG1lbW9pemVPbmVXaXRoRW1wdHlIYXNofTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9pemVPbmUuanMubWFwIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBQcmVwZW5kIGV2ZXJ5IGV4aXN0aW5nIGBub2RlX21vZHVsZXMvLmJpbmAgZGlyZWN0b3J5IGZyb20gdGhlIGdpdmVuIGRpcmVjdG9yeSB1cCB0byB0aGVcbiAqIHJlcG9zaXRvcnkgcm9vdCAob3IgZmlsZXN5c3RlbSByb290KSB0byB0aGUgZW52aXJvbm1lbnQncyBQQVRILCBuZWFyZXN0IGRpcmVjdG9yeSBmaXJzdCBzb1xuICogYSB3b3Jrc3BhY2UtbG9jYWwgZGVwZW5kZW5jeSB3aW5zIG92ZXIgYSByZXBvc2l0b3J5LXJvb3Qgb25lLiBOZWVkZWQgd2hlcmV2ZXIgd2Igc3RyaXBzXG4gKiB5YXJuJ3MgdGVtcG9yYXJ5IGJpbiBmb2xkZXIgZnJvbSBQQVRIICh5YXJuIEJlcnJ5IGV4cG9zZXMgZGVwZW5kZW5jeSBleGVjdXRhYmxlcyBvbmx5XG4gKiB0aHJvdWdoIHRoYXQgZm9sZGVyLCBuZXZlciB0aHJvdWdoIGBub2RlX21vZHVsZXMvLmJpbmAgb24gUEFUSCksIHNvIHRoYXQgYmFyZSBiaW5hcnkgbmFtZXNcbiAqIGluIHdyYXBwZWQgY29tbWFuZHMga2VlcCByZXNvbHZpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGgoZGlyUGF0aDogc3RyaW5nLCBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBib29sZWFuIHtcbiAgY29uc3QgYmluUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXJyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICBiaW5QYXRocy5wdXNoKGJpblBhdGgpO1xuICAgIH1cblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gIH1cbiAgaWYgKGJpblBhdGhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBlbnYuUEFUSCA9IGVudi5QQVRIID8gYCR7YmluUGF0aHMuam9pbignOicpfToke2Vudi5QQVRIfWAgOiBiaW5QYXRocy5qb2luKCc6Jyk7XG4gIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVHJ1dGh5RW52VmFsdWUoY2lFbnYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEb2NrZXJFbmFibGVkKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+KTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1RydXRoeUVudlZhbHVlKHByb2plY3QuZW52LldCX0RPQ0tFUik7XG59XG5cbmZ1bmN0aW9uIGlzVHJ1dGh5RW52VmFsdWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISF2YWx1ZSAmJiB2YWx1ZSAhPT0gJzAnICYmIHZhbHVlICE9PSAnZmFsc2UnO1xufVxuIiwiLyoqXG4gKiBUaGUga2V5cyBhY3R1YWxseSBkZWNsYXJlZCBpbiB0aGUgcHJvamVjdCdzIGZub3ggc291cmNlcy4gYG1pc2UgZW52YCBpcyByZXBvcnRlZCBhcyBhXG4gKiBwc2V1ZG8tc291cmNlIHRoYXQgbWl4ZXMgaW4gaG9zdC90b29sIHZhcmlhYmxlcyAoUEFUSCwgQ0FSR09fSE9NRSwgUlVTVFVQXyosIC4uLik7IHRob3NlIG11c3RcbiAqIG5ldmVyIGJlIHRyZWF0ZWQgYXMgdGhlIHByb2plY3QncyBvd24gdmFyaWFibGVzLCBzbyB0aGV5IGFyZSBleGNsdWRlZCBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0Rm5veFNvdXJjZWRLZXlzKGVudlNvdXJjZXM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW3N0cmluZywgcmVhZG9ubHkgc3RyaW5nW11dPik6IFNldDxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBTZXQoZW52U291cmNlcy5maWx0ZXIoKFtzb3VyY2VdKSA9PiAhc291cmNlLnN0YXJ0c1dpdGgoJ21pc2UgZW52JykpLmZsYXRNYXAoKFssIGtleXNdKSA9PiBrZXlzKSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlc0J1blJ1bnRpbWUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIE1pcnJvcnMgUHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXI6IHRoZSBvdXRlcm1vc3QgcGFja2FnZU1hbmFnZXIgZGVjbGFyYXRpb24gKHRoZVxuICAvLyB3b3Jrc3BhY2Ugcm9vdCdzKSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgbmVzdGVkIG9uZXMsIGFuZCBhbiBleHBsaWNpdCBub24tQnVuIGRlY2xhcmF0aW9uXG4gIC8vIHdpbnMgb3ZlciB0aGUgZGlyZWN0b3J5IG1hcmtlcnMuIFRoZSB3YWxrIHRoZXJlZm9yZSBjb2xsZWN0cyBzaWduYWxzIHVwIHRvIHRoZSByZXBvc2l0b3J5XG4gIC8vIHJvb3QgaW5zdGVhZCBvZiBkZWNpZGluZyBhdCB0aGUgZmlyc3QgaGl0LCBzbyBhIGNoaWxkIHdvcmtzcGFjZSBjYW5ub3Qgb3ZlcnJpZGUgdGhlIHJvb3QuXG4gIGxldCBvdXRlcm1vc3RQYWNrYWdlTWFuYWdlcjogdW5rbm93bjtcbiAgbGV0IGhhc1NvbWVCdW5EaXJlY3RvcnlNYXJrZXIgPSBmYWxzZTtcbiAgZm9yIChsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7IDsgY3VycmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpKSB7XG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByZWFkUGFja2FnZU1hbmFnZXJGaWVsZChwYXRoLmpvaW4oY3VycmVudFBhdGgsICdwYWNrYWdlLmpzb24nKSk7XG4gICAgaWYgKHBhY2thZ2VNYW5hZ2VyICE9PSB1bmRlZmluZWQpIG91dGVybW9zdFBhY2thZ2VNYW5hZ2VyID0gcGFja2FnZU1hbmFnZXI7XG4gICAgaGFzU29tZUJ1bkRpcmVjdG9yeU1hcmtlciB8fD0gaGFzQnVuRGlyZWN0b3J5TWFya2VyKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpIHx8IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCkgPT09IGN1cnJlbnRQYXRoKSB7XG4gICAgICBpZiAoaXNFeHBsaWNpdE5vbkJ1blBhY2thZ2VNYW5hZ2VyKG91dGVybW9zdFBhY2thZ2VNYW5hZ2VyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGhhc1NvbWVCdW5EaXJlY3RvcnlNYXJrZXIgfHwgaXNCdW5QYWNrYWdlTWFuYWdlcihvdXRlcm1vc3RQYWNrYWdlTWFuYWdlcik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgZGlyZWN0b3J5IGNhcnJpZXMgYSBidW4gbWFya2VyOiBhIGJ1biBsb2NrZmlsZSwgYSBtaXNlLXBpbm5lZCBidW4sIG9yIGFcbiAqIGAudG9vbC12ZXJzaW9uc2AgYnVuIGVudHJ5LiB3YmZ5IG1pZ3JhdGVzIC50b29sLXZlcnNpb25zIGludG8gbWlzZS50b21sLCBzbyBhIG1pc2UtcGlubmVkIGJ1blxuICogbXVzdCBjb3VudCBhcyB3ZWxsOiByZXBvcyB0aGF0IGdpdGlnbm9yZSBidW4ubG9jayBhbmQgaGF2ZSBubyBwYWNrYWdlTWFuYWdlciBmaWVsZCByZWx5IG9uIHRoZVxuICogdG9vbCBtYW5pZmVzdC4gVGhpcyBpcyB0aGUgc2luZ2xlIHNpZ25hbCBsaXN0IGRlY2lkaW5nIGJ1bi12cy15YXJuOyBgUHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXJgXG4gKiBhbmQgYHVzZXNCdW5SdW50aW1lYCBzaGFyZSBpdCDigJQgYW5kIGJvdGggZ2l2ZSBhbiBleHBsaWNpdCBub24tQnVuIHBhY2thZ2VNYW5hZ2VyIGRlY2xhcmF0aW9uXG4gKiBwcmVjZWRlbmNlIG92ZXIgaXQgKHNlZSBpc0V4cGxpY2l0Tm9uQnVuUGFja2FnZU1hbmFnZXIpIOKAlCBzbyB0aGUgdHdvIGRldGVjdGlvbnMgY2Fubm90IGRyaWZ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQnVuRGlyZWN0b3J5TWFya2VyKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIFsnYnVuLmxvY2snLCAnYnVuLmxvY2tiJ10uc29tZSgoZmlsZU5hbWUpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSkpIHx8XG4gICAgWydtaXNlLnRvbWwnLCAnLm1pc2UudG9tbCddLnNvbWUoKGZpbGVOYW1lKSA9PlxuICAgICAgdGVzdEZpbGVDb250ZW50KHBhdGguam9pbihkaXJQYXRoLCBmaWxlTmFtZSksIC9eXFxzKig/OlwiYnVuXCJ8YnVuKVxccyo9L20pXG4gICAgKSB8fFxuICAgIHRlc3RGaWxlQ29udGVudChwYXRoLmpvaW4oZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksIC8oXnxcXG4pYnVuXFxzLylcbiAgKTtcbn1cblxuLyoqXG4gKiBBbiBleHBsaWNpdCBub24tQnVuIHBhY2thZ2VNYW5hZ2VyIGRlY2xhcmF0aW9uIChlLmcuIGB5YXJuQDQuMTcuMGApIG92ZXJyaWRlcyB0aGUgZGlyZWN0b3J5XG4gKiBtYXJrZXJzOiB5YXJuLWVyYSByZXBvc2l0b3JpZXMgbWF5IHBpbiBidW4gaW4gbWlzZS50b21sIHNvbGVseSBmb3IgYGJ1bnhgLWJhc2VkIGhlbHBlcnNcbiAqIChlLmcuIGB3YiByYWlsd2F5LWVudmApLCBhbmQgQnVuLW1hbmFnZWQgcmVwb3NpdG9yaWVzIG5ldmVyIGRlY2xhcmUgYSBub24tQnVuIHBhY2thZ2VNYW5hZ2VyXG4gKiAod2JmeSBkZWxldGVzIHRoZSBmaWVsZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0V4cGxpY2l0Tm9uQnVuUGFja2FnZU1hbmFnZXIocGFja2FnZU1hbmFnZXI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBwYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycgJiYgISFwYWNrYWdlTWFuYWdlci50cmltKCkgJiYgIWlzQnVuUGFja2FnZU1hbmFnZXIocGFja2FnZU1hbmFnZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCdW5QYWNrYWdlTWFuYWdlcihwYWNrYWdlTWFuYWdlcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJyAmJiBwYWNrYWdlTWFuYWdlci5zdGFydHNXaXRoKCdidW5AJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQYWNrYWdlTWFuYWdlckZpZWxkKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogdW5rbm93biB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgcGFja2FnZU1hbmFnZXI/OiB1bmtub3duIH0pLnBhY2thZ2VNYW5hZ2VyO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RGaWxlQ29udGVudChmaWxlUGF0aDogc3RyaW5nLCBwYXR0ZXJuOiBSZWdFeHApOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0dGVybi50ZXN0KGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IEFMTE9XRURfVEVTVF9ESVJFQ1RPUllfTkFNRVMgPSBuZXcgU2V0KFsndW5pdCcsICdlMmUnLCAnZGVidWcnLCAnaGVscGVycycsICdmaXh0dXJlcyddKTtcbmNvbnN0IFJVTk5BQkxFX1RFU1RfRElSRUNUT1JZX05BTUVTID0gbmV3IFNldChbJ3VuaXQnLCAnZTJlJywgJ2RlYnVnJ10pO1xuY29uc3QgVEVTVF9GSUxFX05BTUVfUkVHRVhQID0gL1xcLig/OnRlc3R8c3BlYylcXC5bY21dP1tqdF1zeD8kLztcblxuLyoqXG4gKiBFbmZvcmNlcyB0aGUgdGVzdC1sYXlvdXQgY29udmVudGlvbiB3aXRoIG5vIGZhbGxiYWNrOiBgdGVzdC9gIG1heSBjb250YWluIG9ubHkgdGhlIGB1bml0YCwgYGUyZWAsXG4gKiBgZGVidWdgLCBgaGVscGVyc2AsIGFuZCBgZml4dHVyZXNgIGRpcmVjdG9yaWVzLCBhbmQgdGVzdCBmaWxlcyBtYXkgZXhpc3Qgb25seSB1bmRlciBgdGVzdC91bml0L2AsXG4gKiBgdGVzdC9lMmUvYCwgYW5kIGB0ZXN0L2RlYnVnL2Ag4oCUIGFueXdoZXJlIGVsc2UgaW4gdGhlIHByb2plY3QgKGUuZy4gYHRlc3QvaGVscGVycy9gLCBgc3JjL2AsIG9yIHRoZVxuICogcHJvamVjdCByb290KSwgd2Igd291bGQgc2lsZW50bHkgc2tpcCB0aGVtLiBBIHByb2plY3QncyBvd24gUGxheXdyaWdodCBjb25maWcgYWxzbyByZXF1aXJlc1xuICogYHRlc3QvZTJlYCBmb3IgdGhlIHNhbWUgcmVhc29uLiBgdGVzdC9maXh0dXJlcy9gIGlzIGV4ZW1wdCBmcm9tIHRoZSB0ZXN0LWZpbGUgY2hlY2sgYmVjYXVzZVxuICogZml4dHVyZXMgbWF5IGNvbnRhaW4gdGVzdCBmaWxlcyBhcyBkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uJz4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRlc3REaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnKTtcbiAgY29uc3QgdmlvbGF0aW9ucyA9IFsuLi5maW5kRmlsZVN5c3RlbVZpb2xhdGlvbnMocHJvamVjdC5kaXJQYXRoKV07XG4gIC8vIE9ubHkgYSBwcm9qZWN0J3MgT1dOIFBsYXl3cmlnaHQgY29uZmlnIGNvdW50czogYSB3b3Jrc3BhY2Ugcm9vdCBsZWdpdGltYXRlbHkgc2hhcmVzIGEgcm9vdC1sZXZlbFxuICAvLyBwbGF5d3JpZ2h0LmNvbmZpZy50cyB3aGlsZSBrZWVwaW5nIGUyZSBzcGVjcyBpbiBhIHNpbmdsZSBhcHAgcGFja2FnZS4gQ2hlY2tlZCBvdXRzaWRlIHRoZVxuICAvLyBtZW1vaXplZCB3YWxrIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgY2FsbGVyLXN1cHBsaWVkIHBhY2thZ2VKc29uLCBub3Qgb25seSB0aGUgZGlyZWN0b3J5LlxuICBpZiAoXG4gICAgIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3BsYXl3cmlnaHQuY29uZmlnLnRzJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRlc3REaXJQYXRoLCAnZTJlJykpXG4gICkge1xuICAgIHZpb2xhdGlvbnMucHVzaCgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgfVxuICByZXR1cm4gdmlvbGF0aW9ucztcbn1cblxuLy8gVGhlIHJlY3Vyc2l2ZSB3YWxrIGlzIHRoZSBleHBlbnNpdmUgcGFydCBhbmQgcnVucyBmb3IgdGhlIHNhbWUgZGlyZWN0b3JpZXMgZnJvbSBib3RoIGB3YiBsaW50YFxuLy8gYW5kIGB3YiB0ZXN0YCB3aXRoaW4gb25lIGB3YiB2ZXJpZnlgLCBzbyBpdHMgcmVzdWx0IGlzIHNoYXJlZCBwZXIgcHJvamVjdCBkaXJlY3RvcnkuXG5jb25zdCBmaWxlU3lzdGVtVmlvbGF0aW9uc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJUZXN0U3RydWN0dXJlQ2FjaGUoKTogdm9pZCB7XG4gIGZpbGVTeXN0ZW1WaW9sYXRpb25zQ2FjaGUuY2xlYXIoKTtcbn1cblxuZnVuY3Rpb24gZmluZEZpbGVTeXN0ZW1WaW9sYXRpb25zKHByb2plY3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNhY2hlZFZpb2xhdGlvbnMgPSBmaWxlU3lzdGVtVmlvbGF0aW9uc0NhY2hlLmdldChwcm9qZWN0RGlyUGF0aCk7XG4gIGlmIChjYWNoZWRWaW9sYXRpb25zKSByZXR1cm4gY2FjaGVkVmlvbGF0aW9ucztcblxuICBjb25zdCB2aW9sYXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB0ZXN0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0RGlyUGF0aCwgJ3Rlc3QnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmModGVzdERpclBhdGgpKSB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBmcy5yZWFkZGlyU3luYyh0ZXN0RGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICAvLyBPUyBhbmQgZWRpdG9yIGFydGlmYWN0cyBzdWNoIGFzIC5EU19TdG9yZSBhcmUgZW52aXJvbm1lbnQgbm9pc2UsIG5vdCBsYXlvdXQgbWlzdGFrZXMuXG4gICAgICBpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKCcuJykpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpIHx8ICFBTExPV0VEX1RFU1RfRElSRUNUT1JZX05BTUVTLmhhcyhlbnRyeS5uYW1lKSkge1xuICAgICAgICB2aW9sYXRpb25zLnB1c2goYHRlc3QvJHtlbnRyeS5uYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb2xsZWN0U3RyYXlUZXN0RmlsZXMocHJvamVjdERpclBhdGgsICcnLCB2aW9sYXRpb25zKTtcbiAgLy8gQSB0ZXN0IGZpbGUgZGlyZWN0bHkgdW5kZXIgdGVzdC8gaXMgcmVwb3J0ZWQgYnkgYm90aCB0aGUgdG9wLWxldmVsIGNoZWNrIGFuZCB0aGUgc3RyYXktZmlsZSB3YWxrLlxuICBjb25zdCB1bmlxdWVWaW9sYXRpb25zID0gWy4uLm5ldyBTZXQodmlvbGF0aW9ucyldO1xuICBmaWxlU3lzdGVtVmlvbGF0aW9uc0NhY2hlLnNldChwcm9qZWN0RGlyUGF0aCwgdW5pcXVlVmlvbGF0aW9ucyk7XG4gIHJldHVybiB1bmlxdWVWaW9sYXRpb25zO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0U3RyYXlUZXN0RmlsZXMocHJvamVjdERpclBhdGg6IHN0cmluZywgcmVsYXRpdmVEaXJQYXRoOiBzdHJpbmcsIHZpb2xhdGlvbnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZnMucmVhZGRpclN5bmMocGF0aC5qb2luKHByb2plY3REaXJQYXRoLCByZWxhdGl2ZURpclBhdGgpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAvLyBIaWRkZW4gZW50cmllcyAoLmdpdCwgLnRtcCwgLm5leHQsIC4uLikgYW5kIGRlcGVuZGVuY2llcyBhcmUgbm90IHByb2plY3QtYXV0aG9yZWQgdGVzdCBsb2NhdGlvbnM6XG4gICAgLy8gdGhlIGNvbnZlbnRpb24gcGxhY2VzIHRlc3RzIG9ubHkgdW5kZXIgdGVzdC8sIHNvIGEgdGVzdCBmaWxlIGluIGEgaGlkZGVuIGRpcmVjdG9yeSAoZS5nLlxuICAgIC8vIC5zdG9yeWJvb2spIGlzIG91dHNpZGUgdGhlIGlucHV0IGNvbnRyYWN0LCBhbmQgZW51bWVyYXRpbmcgZW52aXJvbm1lbnRhbCBoaWRkZW4gZGlyZWN0b3JpZXNcbiAgICAvLyBpbnN0ZWFkIHdvdWxkIGZhbHNlLXBvc2l0aXZlIG9uIGFueSB1bmxpc3RlZCBnZW5lcmF0ZWQgb25lICgudHVyYm8sIC53cmFuZ2xlciwgLi4uKS4gVmlzaWJsZVxuICAgIC8vIGJ1aWxkIG91dHB1dHMgc3VjaCBhcyBkaXN0LyBhcmUgZGVsaWJlcmF0ZWx5IE5PVCBza2lwcGVkOiB3YmZ5LW1hbmFnZWQgYnVpbGRzIG5ldmVyIGVtaXRcbiAgICAvLyB0ZXN0LXBhdHRlcm4gZmlsZXMgdGhlcmUsIHNvIGFueSBtYXRjaCBpcyBhbiBhdXRob3JlZCBmaWxlIHdvcnRoIGZsYWdnaW5nLlxuICAgIC8vIFN5bWxpbmtzIGZhaWwgYGlzRGlyZWN0b3J5KClgIG9uIGEgRGlyZW50LCBzbyBjeWNsZXMgYXJlIGltcG9zc2libGUuXG4gICAgaWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnLicpIHx8IGVudHJ5Lm5hbWUgPT09ICdub2RlX21vZHVsZXMnKSBjb250aW51ZTtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZURpclBhdGggPyBgJHtyZWxhdGl2ZURpclBhdGh9LyR7ZW50cnkubmFtZX1gIDogZW50cnkubmFtZTtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgLy8gdGVzdC91bml0LCB0ZXN0L2UyZSwgYW5kIHRlc3QvZGVidWcgaG9sZCB0aGUgcnVubmFibGUgdGVzdHM7IHRlc3QvZml4dHVyZXMgbWF5IGNvbnRhaW5cbiAgICAgIC8vIHRlc3QgZmlsZXMgYXMgZGF0YS5cbiAgICAgIGlmIChyZWxhdGl2ZURpclBhdGggPT09ICd0ZXN0JyAmJiAoUlVOTkFCTEVfVEVTVF9ESVJFQ1RPUllfTkFNRVMuaGFzKGVudHJ5Lm5hbWUpIHx8IGVudHJ5Lm5hbWUgPT09ICdmaXh0dXJlcycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQSBuZXN0ZWQgcGFja2FnZSAoZS5nLiBhIHdvcmtzcGFjZSBtZW1iZXIpIGlzIHZhbGlkYXRlZCBhcyBpdHMgb3duIHByb2plY3QuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdERpclBhdGgsIHJlbGF0aXZlUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG4gICAgICBjb2xsZWN0U3RyYXlUZXN0RmlsZXMocHJvamVjdERpclBhdGgsIHJlbGF0aXZlUGF0aCwgdmlvbGF0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChURVNUX0ZJTEVfTkFNRV9SRUdFWFAudGVzdChlbnRyeS5uYW1lKSkge1xuICAgICAgdmlvbGF0aW9ucy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3ROYW1lOiBzdHJpbmcsIHZpb2xhdGlvbnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgY2hhbGsucmVkKFxuICAgICAgYEludmFsaWQgdGVzdCBsYXlvdXQgaW4gJHtwcm9qZWN0TmFtZX0uIHRlc3QvIG1heSBjb250YWluIG9ubHkgdGhlIHVuaXQsIGUyZSwgZGVidWcsIGhlbHBlcnMsIGFuZCBmaXh0dXJlcyBkaXJlY3RvcmllcywgdGVzdCBmaWxlcyBtYXkgZXhpc3Qgb25seSB1bmRlciB0ZXN0L3VuaXQvLCB0ZXN0L2UyZS8sIGFuZCB0ZXN0L2RlYnVnLywgYW5kIGEgUGxheXdyaWdodCBjb25maWcgcmVxdWlyZXMgdGVzdC9lMmUvOlxcbmAgK1xuICAgICAgICB2aW9sYXRpb25zLm1hcCgodmlvbGF0aW9uKSA9PiBgICAke3Zpb2xhdGlvbn1gKS5qb2luKCdcXG4nKVxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXBvcnRzIGV2ZXJ5IHByb2plY3QncyBsYXlvdXQgdmlvbGF0aW9ucyBhbmQgdGVsbHMgdGhlIGNhbGxlciB3aGV0aGVyIGFueSBwcm9qZWN0IHZpb2xhdGVkIHRoZVxuICogY29udmVudGlvbiwgc28gYSBzaW5nbGUgcnVuIHN1cmZhY2VzIGFsbCBvZiB0aGVtIGluc3RlYWQgb2Ygb25seSB0aGUgZmlyc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyhwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAnbmFtZScgfCAncGFja2FnZUpzb24nPltdKTogYm9vbGVhbiB7XG4gIGxldCB2aW9sYXRlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zdCB2aW9sYXRpb25zID0gZmluZFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QpO1xuICAgIGlmICh2aW9sYXRpb25zLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICBwcmludFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QubmFtZSwgdmlvbGF0aW9ucyk7XG4gICAgdmlvbGF0ZWQgPSB0cnVlO1xuICB9XG4gIHJldHVybiB2aW9sYXRlZDtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgb3B0aW9uTmFtZSBvZiBPYmplY3Qua2V5cyh5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52KSkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0T3B0aW9uVmFsdWUoYXJndiwgb3B0aW9uTmFtZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBhcmdzLnB1c2godmFsdWUgPyBgLS0ke29wdGlvbk5hbWV9YCA6IGAtLSR7b3B0aW9uTmFtZX09ZmFsc2VgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke3ZhbHVlfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7aXRlbX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIChhcmd2IGFzIEVudlJlYWRlck9wdGlvbnMgJiB7IHNpbGVudD86IGJvb2xlYW4gfSkuc2lsZW50ID09PSB0cnVlICYmXG4gICAgZ2V0T3B0aW9uVmFsdWUoYXJndiwgJ3F1aWV0LWVudicpID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgYXJncy5wdXNoKCctLXF1aWV0LWVudicpO1xuICB9XG4gIHJldHVybiBhcmdzO1xufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25WYWx1ZShhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcHRpb25OYW1lOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgY2FtZWxDYXNlT3B0aW9uTmFtZSA9IG9wdGlvbk5hbWUucmVwbGFjZUFsbCgvLShbYS16XSkvZywgKF8sIGNoYXJhY3Rlcjogc3RyaW5nKSA9PiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKSk7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcmd2IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9uc1tvcHRpb25OYW1lXSA/PyBvcHRpb25zW2NhbWVsQ2FzZU9wdGlvbk5hbWVdO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnKSkuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bmFtZX09JHtzaGVsbEVzY2FwZUFyZ3VtZW50KHZhbHVlKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hlbGxFc2NhcGVBcmd1bWVudChhcmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXltcXHcuLzo9LEAlKy1dKyQvdS50ZXN0KGFyZykgPyBhcmcgOiBgJyR7YXJnLnJlcGxhY2VBbGwoXCInXCIsIGAnXCInXCInYCl9J2A7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4vc2hlbGwuanMnO1xuXG5jb25zdCB3cmFuZ2xlckNvbmZpZ0ZpbGVOYW1lcyA9IFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbicsICd3cmFuZ2xlci50b21sJ107XG5cbi8qKlxuICogQnVpbGQgYSBjb21tYW5kIGdlbmVyYXRpbmcgYSAuZGV2LnZhcnMgZmlsZSAodmlhIGB3YiBnZW4tZGV2LXZhcnNgKSBzbyB0aGF0XG4gKiBgd3JhbmdsZXIgZGV2YCBjYW4gc2VlIHRoZSB3Yi1tYW5hZ2VkIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndjogU2NyaXB0QXJndiwgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICd3YicsICdnZW4tZGV2LXZhcnMnLCAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksIG91dHB1dFBhdGhdKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGB3cmFuZ2xlciBkZXZgLXN0eWxlIGNvbW1hbmQuIGBlbnYgLXUgQ0xPVURGTEFSRV9FTlZgIG1ha2VzIHdyYW5nbGVyIHNlcnZlIHRoZSB0b3AtbGV2ZWxcbiAqIChub24tZGVwbG95KSBjb25maWcuIHdyYW5nbGVyIChsaWtlIHZpbmV4dCkgcmVxdWlyZXMgcmVhbCBOb2RlLmpzIOKAlCBgYnVuIHJ1bmAgcmVzcGVjdHMgdGhlIGJpbidzXG4gKiBub2RlIHNoZWJhbmcsIGFuZCB3YiBuZXZlciBjb21wb3NlcyBgLS1idW5gICh3aG9zZSBub2RlLT5idW4gUEFUSCBzaGltIGJyZWFrcyBib3RoIHRvb2xzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kKGFyZ3M6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgZW52IC11IENMT1VERkxBUkVfRU5WIFlBUk4gd3JhbmdsZXIgJHthcmdzfWAudHJpbSgpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgY29tbWFuZCBhcHBseWluZyB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyB0byB0aGUgbG9jYWwgZGF0YWJhc2UsIG9yIHVuZGVmaW5lZFxuICogaWYgdGhlIHByb2plY3QgaGFzIG5vIEQxIGRhdGFiYXNlIG9yIG5vIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIGRpcmVjdG9yeS5cbiAqIENJPXRydWUgc3VwcHJlc3NlcyB3cmFuZ2xlcidzIGludGVyYWN0aXZlIGNvbmZpcm1hdGlvbiBwcm9tcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdlbnYnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICBpZiAoIWRhdGFiYXNlTmFtZSB8fCAhZmluZEQxTWlncmF0aW9uc0RpclBhdGgocHJvamVjdCkpIHJldHVybjtcblxuICByZXR1cm4gYENJPXRydWUgWUFSTiB3cmFuZ2xlciBkMSBtaWdyYXRpb25zIGFwcGx5ICR7ZGF0YWJhc2VOYW1lfSAtLWxvY2FsIC0tcGVyc2lzdC10byBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiYDtcbn1cblxuLyoqXG4gKiBQcmVmaXggdGhlIGdpdmVuIHNjcmlwdCB3aXRoIGNvbW1hbmRzIGV4cG9ydGluZyBEQVRBQkFTRV9VUkwgcG9pbnRpbmcgdG8gdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZSxcbiAqIHNvIHRoYXQgZHJpenpsZS1raXQgYW5kIHNlZWQgc2NyaXB0cyBjYW4gb3BlcmF0ZSBvbiB0aGUgc2FtZSBkYXRhYmFzZSBhcyB0aGUgYXBwLlxuICogRG8gbm90aGluZyBpZiB0aGUgcHJvamVjdCBoYXMgbm8gRDEgZGF0YWJhc2UgaW4gaXRzIHdyYW5nbGVyIGNvbmZpZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ2Vudic+LCBzY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICBpZiAoIWRhdGFiYXNlTmFtZSkgcmV0dXJuIHNjcmlwdDtcblxuICAvLyBFeGNsdWRpbmcgbWluaWZsYXJlJ3MgbWV0YWRhdGEuc3FsaXRlLCB3aGljaCBsaXZlcyBuZXh0IHRvIHRoZSBoYXNoLW5hbWVkIGRhdGFiYXNlIGZpbGUuXG4gIC8vIEFuIHVubWF0Y2hlZCBnbG9iIGNhbm5vdCBoYXBwZW4gaGVyZTogdGhlIHNjcmlwdCBydW5zIHVuZGVyIC9iaW4vc2ggKHZpYSBOb2RlJ3MgYHNoZWxsOiB0cnVlYCksXG4gIC8vIGFuZCB0aGUgcHJlY2VkaW5nIG1hdGVyaWFsaXphdGlvbiBjb21tYW5kIGd1YXJhbnRlZXMgdGhlIFNRTGl0ZSBmaWxlIGV4aXN0cy5cbiAgLy8gUHJvamVjdHMgd2l0aCBtdWx0aXBsZSBEMSBkYXRhYmFzZXMgYXJlIG5vdCBzdXBwb3J0ZWQ6IHRoZSBoYXNoLW5hbWVkIGZpbGVzIGNhbm5vdCBiZVxuICAvLyBkaXN0aW5ndWlzaGVkIGNoZWFwbHkgKG1hdGVyaWFsaXphdGlvbiBkb2VzIG5vdCBldmVuIHVwZGF0ZSB0aGUgdGFyZ2V0IGZpbGUncyBtdGltZSkuXG4gIC8vIFRoZSBzdGF0ZSBkaXJlY3RvcnkgbXVzdCBiZSBhYnNvbHV0ZSBiZWNhdXNlIHRoZSB3cmFwcGVkIHNjcmlwdCBtYXkgYGNkYCB0byB0aGUgbW9ub3JlcG8gcm9vdC5cbiAgY29uc3Qgc3RhdGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpKTtcbiAgY29uc3QgZXhwb3J0Q29tbWFuZCA9IGBleHBvcnQgREFUQUJBU0VfVVJMPVwiZmlsZTokKGxzIFwiJHtzdGF0ZURpclBhdGh9XCIvdjMvZDEvbWluaWZsYXJlLUQxRGF0YWJhc2VPYmplY3QvKi5zcWxpdGUgfCBncmVwIC12IG1ldGFkYXRhIHwgaGVhZCAtMSlcImA7XG4gIHJldHVybiBgJHtidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdCwgZGF0YWJhc2VOYW1lKX0gJiYgJHtleHBvcnRDb21tYW5kfSAmJiAke3NjcmlwdH1gO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgRDEgZGF0YWJhc2UgZGVjbGFyZWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZyBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuO1xuXG4gIHJldHVybiBzY2FuV3JhbmdsZXJDb25maWdWYWx1ZShjb25maWdQYXRoLCAnZGF0YWJhc2VfbmFtZScpO1xufVxuXG4vLyBMb29rZWQgdXAgZnJvbSBtYW55IGNhbGwgc2l0ZXMgKGZyYW1ld29yayBkZXRlY3Rpb24sIHdvcmtlci10eXBlcyBnZW5lcmF0aW9uLCBkZXBsb3ksIHRlc3QpLCBzb1xuLy8gdGhlIGV4aXN0ZW5jZSBwcm9iZXMgYXJlIHNoYXJlZC4gS2V5ZWQgb24gdGhlIHByb2plY3QgT0JKRUNUIChub3QgaXRzIGRpcmVjdG9yeSBwYXRoKTogdGhlIHNhbWVcbi8vIHNoYXJlZCBQcm9qZWN0IGluc3RhbmNlIGZsb3dzIHRocm91Z2ggZXZlcnkgY2FsbCBzaXRlIHdpdGhpbiBvbmUgaW52b2NhdGlvbiwgd2hpbGUgY2FsbGVycyB0aGF0XG4vLyByZXdyaXRlIGNvbmZpZ3MgYW5kIHBhc3MgZnJlc2ggcGFydGlhbCBvYmplY3RzIG11c3Qgb2JzZXJ2ZSB0aGUgY3VycmVudCBkaXNrIHN0YXRlLlxuY29uc3Qgd3JhbmdsZXJDb25maWdQYXRoQ2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIHsgY29uZmlnUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkIH0+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIFRlc3RzIG1heSBwYXNzIHBhcnRpYWwgUHJvamVjdCBvYmplY3RzIHdpdGhvdXQgZGlyUGF0aC5cbiAgaWYgKCFwcm9qZWN0LmRpclBhdGgpIHJldHVybjtcbiAgY29uc3QgY2FjaGVkID0gd3JhbmdsZXJDb25maWdQYXRoQ2FjaGUuZ2V0KHByb2plY3QpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkLmNvbmZpZ1BhdGg7XG5cbiAgY29uc3QgY29uZmlnUGF0aCA9IHdyYW5nbGVyQ29uZmlnRmlsZU5hbWVzXG4gICAgLm1hcCgoZmlsZU5hbWUpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGZpbGVOYW1lKSlcbiAgICAuZmluZCgoZmlsZVBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKTtcbiAgd3JhbmdsZXJDb25maWdQYXRoQ2FjaGUuc2V0KHByb2plY3QsIHsgY29uZmlnUGF0aCB9KTtcbiAgcmV0dXJuIGNvbmZpZ1BhdGg7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIG9mIHRoZSB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyBkaXJlY3RvcnkgKGBtaWdyYXRpb25zX2RpcmAgaW4gdGhlIHdyYW5nbGVyXG4gKiBjb25maWcsIGRlZmF1bHRpbmcgdG8gYG1pZ3JhdGlvbnNgKSBpZiBpdCBleGlzdHMgb24gZGlzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmREMU1pZ3JhdGlvbnNEaXJQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcblxuICBjb25zdCBtaWdyYXRpb25zRGlyUGF0aCA9IHBhdGguam9pbihcbiAgICBwcm9qZWN0LmRpclBhdGgsXG4gICAgc2NhbldyYW5nbGVyQ29uZmlnVmFsdWUoY29uZmlnUGF0aCwgJ21pZ3JhdGlvbnNfZGlyJykgPz8gJ21pZ3JhdGlvbnMnXG4gICk7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKSA/IG1pZ3JhdGlvbnNEaXJQYXRoIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBmaXJzdCB2YWx1ZSBkZWNsYXJlZCBmb3IgdGhlIGtleSBpbiB0aGUgd3JhbmdsZXIgY29uZmlnLCBjb3ZlcmluZyBKU09OKEMpXG4gKiAoYFwia2V5XCI6IFwiLi4uXCJgKSBhbmQgVE9NTCwgaW5jbHVkaW5nIGl0cyBpbmxpbmUtdGFibGUgZm9ybSAoYGQxX2RhdGFiYXNlcyA9IFt7IC4uLiwga2V5ID0gXCIuLi5cIiB9XWApLFxuICogd2l0aG91dCBmdWxsIHBhcnNlcnMuIENvbW1lbnRlZC1vdXQgbGluZXMgYXJlIHNraXBwZWQgc28gdGhhdCB0aGV5IGNhbm5vdCBzaGFkb3cgdGhlIGFjdGl2ZVxuICogdmFsdWUsIGFuZCB0aGUga2V5IG11c3QgZm9sbG93IGEgbGluZSBzdGFydCwgYHtgIG9yIGAsYCBzbyB0aGF0IHByb3NlIG1lbnRpb25pbmcgaXQgY2Fubm90IG1hdGNoLlxuICovXG5mdW5jdGlvbiBzY2FuV3JhbmdsZXJDb25maWdWYWx1ZShjb25maWdQYXRoOiBzdHJpbmcsIGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga2V5VmFsdWVQYXR0ZXJuID0gbmV3IFJlZ0V4cChgKD86XnxbLHtdKVxcXFxzKltcIiddPyR7a2V5fVtcIiddP1xcXFxzKls6PV1cXFxccypbXCInXShbXlwiJ10rKVtcIiddYCwgJ3UnKTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmICgvXlxccyooPzojfFxcL1xcLykvdS50ZXN0KGxpbmUpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IG1hdGNoID0ga2V5VmFsdWVQYXR0ZXJuLmV4ZWMobGluZSk7XG4gICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV07XG4gIH1cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgY29tbWFuZCBtYXRlcmlhbGl6aW5nIHRoZSBsb2NhbCBtaW5pZmxhcmUgRDEgU1FMaXRlIGZpbGUuXG4gKiBBIG5vLW9wIHF1ZXJ5IGZvcmNlcyBtaW5pZmxhcmUgdG8gY3JlYXRlIHRoZSBTUUxpdGUgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldC5cbiAqIE9ubHkgc3Rkb3V0IGlzIHN1cHByZXNzZWQ7IHdyYW5nbGVyIHJlcG9ydHMgZXJyb3JzIG9uIHN0ZGVyciwgd2hpY2ggbXVzdCBzdGF5IHZpc2libGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4sIGRhdGFiYXNlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBZQVJOIHdyYW5nbGVyIGQxIGV4ZWN1dGUgJHtkYXRhYmFzZU5hbWV9IC0tbG9jYWwgLS1wZXJzaXN0LXRvIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCIgLS1jb21tYW5kIFwiU0VMRUNUIDFcIiA+IC9kZXYvbnVsbGA7XG59XG5cbi8qKlxuICogR2V0IHRoZSBsb2NhbCB3cmFuZ2xlci9taW5pZmxhcmUgc3RhdGUgZGlyZWN0b3J5LlxuICogRGV2ZWxvcG1lbnQgZm9sbG93cyB3cmFuZ2xlcidzIGRlZmF1bHQgZGlyZWN0b3J5IHNvIHRoYXQgcGxhaW4gYHdyYW5nbGVyIGRldmAgLyBgdmluZXh0IGRldmBcbiAqICh3aXRob3V0IGEgcGVyc2lzdC1wYXRoIG92ZXJyaWRlKSBzaGFyZXMgdGhlIHNhbWUgZGF0YWJhc2UgYXMgd2ItbWFuYWdlZCBkYiBjb21tYW5kcy5cbiAqIE90aGVyIGVudmlyb25tZW50cyAoZS5nLiB0ZXN0KSBnZXQgdGhlaXIgb3duIGRpcmVjdG9yeSBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlc2V0XG4gKiB3aXRob3V0IGRlc3Ryb3lpbmcgZGV2ZWxvcG1lbnQgc3RhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4pOiBzdHJpbmcge1xuICAvLyBEZXN0cnVjdGl2ZSB0ZXN0IHJlc2V0cyBhcmUgZ2F0ZWQgb24gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSwgd2hpY2ggYWNjZXB0c1xuICAvLyBlaXRoZXIgV0JfRU5WIG9yIE1JU0VfRU5WOyByZXNvbHZlIHRvIHRoZSB0ZXN0IGRpcmVjdG9yeSB3aGVuZXZlciBlaXRoZXIgc2F5cyAndGVzdCcgc29cbiAgLy8gdGhhdCBzdWNoIHJlc2V0cyBjYW4gbmV2ZXIgdGFyZ2V0IHRoZSBkZXZlbG9wbWVudCBzdGF0ZS5cbiAgY29uc3Qgd2JFbnYgPSBbcHJvamVjdC5lbnYuV0JfRU5WLCBwcm9qZWN0LmVudi5NSVNFX0VOVl0uaW5jbHVkZXMoJ3Rlc3QnKVxuICAgID8gJ3Rlc3QnXG4gICAgOiBwcm9qZWN0LmVudi5XQl9FTlYgfHwgcHJvamVjdC5lbnYuTUlTRV9FTlY7XG4gIHJldHVybiAhd2JFbnYgfHwgd2JFbnYgPT09ICdkZXZlbG9wbWVudCcgPyAnLndyYW5nbGVyL3N0YXRlJyA6IGAud3JhbmdsZXIvc3RhdGUtJHt3YkVudn1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHtcbiAgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuLFxuICByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsXG4gIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLFxuICByZXNvbHZlRmFsbGJhY2tXYkVudixcbiAgc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZU9uZSB9IGZyb20gJ2F0LWRlY29yYXRvcnMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoIH0gZnJvbSAnLi91dGlscy9iaW5QYXRoLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuL3V0aWxzL2NpLmpzJztcbmltcG9ydCB7IHNlbGVjdEZub3hTb3VyY2VkS2V5cyB9IGZyb20gJy4vdXRpbHMvZW52U291cmNlcy5qcyc7XG5pbXBvcnQgeyBoYXNCdW5EaXJlY3RvcnlNYXJrZXIsIGlzQnVuUGFja2FnZU1hbmFnZXIsIGlzRXhwbGljaXROb25CdW5QYWNrYWdlTWFuYWdlciB9IGZyb20gJy4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgeyBjbGVhclRlc3RTdHJ1Y3R1cmVDYWNoZSB9IGZyb20gJy4vdXRpbHMvdGVzdFN0cnVjdHVyZS5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi91dGlscy93cmFuZ2xlci5qcyc7XG5cbi8qKiBUaGUgZmlsZSBgd3JhbmdsZXIgdHlwZXNgIHdyaXRlcyBieSBkZWZhdWx0LiAqL1xuY29uc3QgV09SS0VSX1RZUEVTX0ZJTEVfTkFNRSA9ICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJztcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcm0gPSAncHJpc21hJyB8ICdkcml6emxlJztcblxuZXhwb3J0IGNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudXNlc0J1blBhY2thZ2VNYW5hZ2VyO1xuICB9XG5cbiAgLy8gVGhlIHBhY2thZ2UgbWFuYWdlciBtdXN0IGZvbGxvdyB0aGUgdGFyZ2V0IHByb2plY3QsIG5vdCB0aGUgcnVudGltZSB0aGF0IGxhdW5jaGVkIHdiOlxuICAvLyBgbm9kZSB3YiAuLi5gIGFnYWluc3QgYSBCdW4gcmVwbyBtdXN0IHN0aWxsIHJ1biBgYnVuIGluc3RhbGxgLCBhbmQgdmljZSB2ZXJzYS5cbiAgZ2V0IHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCgpOiAnYnVuJyB8ICd5YXJuJyB7XG4gICAgcmV0dXJuIHRoaXMuaXNCdW5BdmFpbGFibGUgPyAnYnVuJyA6ICd5YXJuJztcbiAgfVxuXG4gIGdldCBwYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmQoKTogJ2J1biBydW4nIHwgJ3lhcm4nIHtcbiAgICByZXR1cm4gdGhpcy5pc0J1bkF2YWlsYWJsZSA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgfVxuXG4gIC8vIEEgc2luZ2xlIHNpZ25hbCBkZWNpZGVzIGV2ZXJ5IGJ1bi12cy15YXJuIGJyYW5jaCBpbiB3YiAoc2NyaXB0IG5vcm1hbGl6YXRpb24gaW5jbHVkZWQpOlxuICAvLyBzcGxpdHRpbmcgdGhlIHRvb2wtbWFuaWZlc3Qgc2lnbmFsIGZyb20gdGhlIGxvY2tmaWxlIHNpZ25hbCBvbmNlIHByb2R1Y2VkIGNvbW1hbmRzIG1peGluZ1xuICAvLyBgYnVuIGluc3RhbGxgIHdpdGggYHlhcm4gcHJpc21hIC4uLmAgaW4gbWlzZS1waW5uZWQgcmVwb3Mgd2hvc2UgYnVuLmxvY2sgaXMgZ2l0aWdub3JlZC5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHVzZXNCdW5QYWNrYWdlTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICAvLyBTb21lIHJlcG9zaXRvcmllcyByZWx5IG9uIHRoZSBsb2NrZmlsZSBvciBwYWNrYWdlTWFuYWdlciBmaWVsZCBpbnN0ZWFkIG9mIG1pc2UuXG4gICAgLy8gRG9ja2VyIG9wdGltaXphdGlvbiBtdXN0IGZvbGxvdyB0aGUgdGFyZ2V0IHByb2plY3QsIG5vdCB0aGUgcnVudGltZSB0aGF0IGxhdW5jaGVkIHdiLlxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gdGhpcy5yb290UGFja2FnZUpzb24/LnBhY2thZ2VNYW5hZ2VyID8/IHRoaXMucGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXI7XG4gICAgaWYgKGlzRXhwbGljaXROb25CdW5QYWNrYWdlTWFuYWdlcihwYWNrYWdlTWFuYWdlcikpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaGFzQnVuRGlyZWN0b3J5TWFya2VyKHRoaXMucm9vdERpclBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gaXNCdW5QYWNrYWdlTWFuYWdlcihwYWNrYWdlTWFuYWdlcik7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgID8gJ1lBUk4gcnVuIGJ1aWxkJ1xuICAgICAgOiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkXG4gICAgICAgID8gYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke3RoaXMuYXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gXG4gICAgICAgIDogXCJlY2hvICdObyBidWlsZCBzY3JpcHQnXCI7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgLyoqIEEgd29ya3NwYWNlIHJvb3Qgd2l0aG91dCBzb3VyY2VzIG9mIGl0cyBvd24gcnVucyBuZWl0aGVyIGxpbnQgbm9yIHR5cGVjaGVjayBjb21tYW5kcy4gKi9cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc093blNvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnBhY2thZ2VKc29uLndvcmtzcGFjZXMgfHwgdGhpcy5oYXNTb3VyY2VDb2RlO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNsYXJlZEVudktleUNhY2hlOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG5hbWVzIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhlIFBST0pFQ1QgZGVjbGFyZXMgKGl0cyBmbm94Ly5lbnYgc291cmNlcyksIGV4Y2x1ZGluZ1xuICAgKiBib3RoIHRoZSBhbWJpZW50IHByb2Nlc3MgZW52aXJvbm1lbnQgYW5kIHRoZSBgbWlzZSBlbnZgIHBzZXVkby1zb3VyY2UgdGhhdCByZXBvcnRzIGhvc3QvdG9vbFxuICAgKiB2YXJpYWJsZXMgc3VjaCBhcyBQQVRILiBgZW52YCBjYW5ub3QgYW5zd2VyIHRoaXM6IGl0IG1lcmdlcyBwcm9jZXNzLmVudiwgc28gYSBwcm9qZWN0IHZhcmlhYmxlXG4gICAqIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gaW5oZXJpdGVkIG9uZSB0aGVyZS5cbiAgICovXG4gIGdldCBkZWNsYXJlZEVudktleXMoKTogU2V0PHN0cmluZz4ge1xuICAgIGlmICh0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGUpIHJldHVybiB0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGU7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHtcbiAgICAgIHRoaXMuZGVjbGFyZWRFbnZLZXlDYWNoZSA9IG5ldyBTZXQoKTtcbiAgICAgIHJldHVybiB0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGU7XG4gICAgfVxuICAgIGNvbnN0IFssIGVudlNvdXJjZXNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgdGhpcy5kZWNsYXJlZEVudktleUNhY2hlID0gc2VsZWN0Rm5veFNvdXJjZWRLZXlzKGVudlNvdXJjZXMpO1xuICAgIHJldHVybiB0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGU7XG4gIH1cblxuICAvLyBDYWNoZWQgaW4gYSBwbGFpbiBmaWVsZCByYXRoZXIgdGhhbiB3aXRoIEBtZW1vaXplT25lOiB0aGF0IGRlY29yYXRvciBrZXlzIGl0cyBjYWNoZSBvbiBhIGhhc2hcbiAgLy8gb2YgdGhlIGluc3RhbmNlLCB3aGljaCBjaGFuZ2VzIGFzIG90aGVyIG1lbW9pemVkIGdldHRlcnMgcG9wdWxhdGUgdGhlIGluc3RhbmNlLCBzbyBgZW52YCBjb3VsZFxuICAvLyBzaWxlbnRseSBiZSByZWNvbXB1dGVkIOKAlCBkcm9wcGluZyBpbi1wbGFjZSBtdXRhdGlvbnMgKGUuZy4gYHByb2plY3QuZW52LlBPUlQgfHw9IOKApmAsIG9yIHRoZVxuICAvLyBzZWNyZXRzIGB3YiBkZXBsb3lgIG1lcmdlcyBmcm9tIC5lbnYuY2xvdWRmbGFyZSkgdGhhdCBjYWxsZXJzIHJlbHkgb24gZm9yIHNwYXduZWQgY29tbWFuZHMuXG4gIHByaXZhdGUgZW52Q2FjaGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodGhpcy5lbnZDYWNoZSkgcmV0dXJuIHRoaXMuZW52Q2FjaGU7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHtcbiAgICAgIHRoaXMuZW52Q2FjaGUgPSBwcm9jZXNzLmVudjtcbiAgICAgIHJldHVybiB0aGlzLmVudkNhY2hlO1xuICAgIH1cblxuICAgIGNvbnN0IFttZXJnZWRFbnYsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lUGFpcnNdID0gcmVhZEFuZE1lcmdlRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpO1xuICAgIHRoaXMuZW52Q2FjaGUgPSBtZXJnZWRFbnY7XG4gICAgLy8gYG1pc2UgZW52YCBpcyBleGNsdWRlZDogaXQgcmVwb3J0cyB0b29sLWFjdGl2YXRpb24gb3V0cHV0IChlLmcuIFBBVEgpIGV2ZW4gaW4gcmVwb3MgdGhhdFxuICAgIC8vIGRlY2xhcmUgbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIGF0IGFsbCwgd2hpY2ggbXVzdCBub3QgdHJpZ2dlciB0aGUgQ0kgc3RyaWN0bmVzcyBiZWxvdy5cbiAgICB0aGlzLmNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudihlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzLnNvbWUoKFtzb3VyY2VdKSA9PiAhc291cmNlLnN0YXJ0c1dpdGgoJ21pc2UgZW52JykpKTtcbiAgICByZXR1cm4gdGhpcy5lbnZDYWNoZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0YW5kYXJkV2JFbnZNb2RlcyA9IG5ldyBTZXQoWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddKTtcblxuICAvKipcbiAgICogQ29tcGxldGVzIGFuZCB2YWxpZGF0ZXMgdGhlIHJlc29sdmVkIGBXQl9FTlZgIHBlciB0aGUgb3JnIHN0YW5kYXJkIChzZWUgdGhlXG4gICAqIGd1aWRlbGluZXMtZm9yLW1pc2UtZm5veCBza2lsbCk6XG4gICAqIC0gTG9jYWxseSwgYW4gdW5zZXQgYFdCX0VOVmAgZmFsbHMgYmFjayB0byB0aGUgc2VsZWN0ZWQgY2FzY2FkZSBtb2RlIChkZXZlbG9wbWVudCB1bmxlc3MgYVxuICAgKiAgIGNvbW1hbmQgZm9yY2VzIGFub3RoZXIsIGUuZy4gYHdiIHRlc3RgIGZvcmNlcyB0ZXN0KSwgc28gY2FzdWFsIGBidW4gd2IgLi4uYCBpbnZvY2F0aW9uc1xuICAgKiAgIHdvcmsgaW4gcmVwb3NpdG9yaWVzIHRoYXQgZGVmaW5lIG5vIFdCX0VOViBhdCBhbGwuXG4gICAqIC0gT24gQ0ksIGFuIHVuc2V0IGBXQl9FTlZgIGlzIGEgaGFyZCBlcnJvciB3aGVuIGVudiBzb3VyY2VzIGV4aXN0OiB3b3JrZmxvd3MgbXVzdCBleHBvcnQgdGhlXG4gICAqICAgZW52aXJvbm1lbnQgZXhwbGljaXRseSBpbnN0ZWFkIG9mIHNpbGVudGx5IHJ1bm5pbmcgaW4gYW4gYW1iaWd1b3VzIG1vZGUuXG4gICAqIC0gVGhlIHZhbHVlIG11c3QgbmFtZSBhIHN0YW5kYXJkIG1vZGU7IGFuIHVua25vd24gdmFsdWUgKGUuZy4gYSB0eXBvIGxpa2UgYHByb2RjdXRpb25gKSB3b3VsZFxuICAgKiAgIG90aGVyd2lzZSBzaWxlbnRseSBzZWxlY3QgdGhlIGRldmVsb3BtZW50IGNhc2NhZGUsIHdoaWNoIGlzIHRoZSBmYWlsdXJlIHRoaXMgZ3VhcmRzIGFnYWluc3QuXG4gICAqIC0gYE5FWFRfUFVCTElDX1dCX0VOVmAgaXMgZGVyaXZlZCBmcm9tIGBXQl9FTlZgIGZvciBOZXh0LmpzL3ZpbmV4dCBhcHBzIHdoZW4gbWlzc2luZywgc28gYVxuICAgKiAgIHByb2R1Y3Rpb24gYnVpbGQgY2FuIG5vIGxvbmdlciBiYWtlIGEgc3RhbGUgZGV2ZWxvcG1lbnQgdmFsdWUgaW50byB0aGUgY2xpZW50IGJ1bmRsZS5cbiAgICogU2tpcHBlZCB3aGVuIGBXQl9TS0lQX0VOVl9DSEVDSz0xYCBpcyBzZXQuXG4gICAqL1xuICBwcml2YXRlIGNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudihoYXNFbnZpcm9ubWVudFNvdXJjZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBlbnYgPSB0aGlzLmVudkNhY2hlO1xuICAgIGlmICghZW52KSByZXR1cm47XG4gICAgaWYgKGVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJzEnIHx8IGVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJ3RydWUnKSByZXR1cm47XG5cbiAgICAvLyBPbiBDSSwgV0JfRU5WIG11c3QgYmUgRVhQT1JURUQgYnkgdGhlIHdvcmtmbG93IOKAlCBjaGVja2VkIGFnYWluc3QgcHJvY2Vzcy5lbnYsIG5vdCB0aGVcbiAgICAvLyBtZXJnZWQgZW52aXJvbm1lbnQ6IGEgY29tbWl0dGVkIGJhc2UgZGVmYXVsdCAoZS5nLiBmbm94J3MgZGV2ZWxvcG1lbnQgZW50cnkpIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHNhdGlzZnkgdGhlIGNoZWNrIGFuZCBzaWxlbnRseSBydW4gQ0kgaW4gZGV2ZWxvcG1lbnQgbW9kZS5cbiAgICBpZiAoaXNDSShlbnYuQ0kpICYmICFwcm9jZXNzLmVudi5XQl9FTlYgJiYgaGFzRW52aXJvbm1lbnRTb3VyY2VzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgJ1dCX0VOViBpcyBub3QgZXhwb3J0ZWQgb24gQ0kuIEV4cG9ydCBXQl9FTlYgZXhwbGljaXRseSAodGhlIHJldXNhYmxlIHdvcmtmbG93cyBwYXNzIGl0IHZpYSB0aGUgXCJlbnZpcm9ubWVudFwiIGlucHV0KSwgJyArXG4gICAgICAgICAgICAnb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKCFlbnYuV0JfRU5WKSB7XG4gICAgICAvLyBUaGUgc2hhcmVkIHJlc29sdmVyIGtlZXBzIHRoaXMgZmFsbGJhY2sgY29uc2lzdGVudCB3aXRoIHRoZSBjYXNjYWRlIHNlbGVjdGlvbiBBTkQgd2l0aFxuICAgICAgLy8gdGhlICR7V0JfRU5WfSBleHBhbnNpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzIGFscmVhZHkgcGVyZm9ybWVkOiB0aGUgZm9yY2VkIGNhc2NhZGVcbiAgICAgIC8vIChlLmcuIGB3YiB0ZXN0YCksIHRoZW4gdGhlIGNvbW1hbmQtbGV2ZWwgZGVmYXVsdCwgdGhlbiB0aGUgQU1CSUVOVC1OT0RFX0VOVi1kcml2ZW4gYXV0b1xuICAgICAgLy8gY2FzY2FkZSBjbGFtcGVkIHRvIGEgc3RhbmRhcmQgbW9kZSAoYW4gZXhwbGljaXQgLS1jYXNjYWRlLWVudiBrZWVwcyBpdHMgdmFsdWUgYW5kIGlzXG4gICAgICAvLyB2YWxpZGF0ZWQgYmVsb3cgbGlrZSBhbnkgb3RoZXIgV0JfRU5WKS5cbiAgICAgIGNvbnN0IG1vZGUgPSByZXNvbHZlRmFsbGJhY2tXYkVudih0aGlzLmFyZ3YpO1xuICAgICAgZW52LldCX0VOViA9IG1vZGU7XG4gICAgICBpZiAoaGFzRW52aXJvbm1lbnRTb3VyY2VzICYmICFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBXQl9FTlYgaXMgbm90IGRlZmluZWQ7IGRlZmF1bHRpbmcgdG8gXCIke21vZGV9XCIuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghUHJvamVjdC5zdGFuZGFyZFdiRW52TW9kZXMuaGFzKGVudi5XQl9FTlYpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYFdCX0VOViBtdXN0IGJlIG9uZSBvZiBkZXZlbG9wbWVudCwgdGVzdCwgc3RhZ2luZywgb3IgcHJvZHVjdGlvbiwgYnV0IGlzIFwiJHtlbnYuV0JfRU5WfVwiLiBgICtcbiAgICAgICAgICAgICdGaXggdGhlIHZhbHVlIGluIHRoZSBlbnYgc291cmNlIG9yIHRoZSBleHBvcnRlZCB2YXJpYWJsZSwgb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gQSBmb3JjZWQgbW9kZSAoYW4gZXhwbGljaXQvY29tbWFuZC1kZWZhdWx0IC0tY2FzY2FkZS1lbnYsIG9yIGFuIGV4cG9ydGVkIFdCX0VOViB3aG9zZVxuICAgIC8vIHByb2ZpbGUgdmFsdWVzIG1heSBvdmVycmlkZSBpdCBsb2NhbGx5IHBlciBpc3N1ZSAjOTMwKSBtdXN0IG5vdCBiZSBzaWxlbnRseSByZXBsYWNlZCBieVxuICAgIC8vIGFub3RoZXIgbW9kZSBhbiBlbnYgc291cmNlIGRlZmluZXM6IGB3YiB0ZXN0YCByZXNvbHZpbmcgV0JfRU5WPWRldmVsb3BtZW50IGZyb20gdGhlIGJhc2VcbiAgICAvLyBmbm94IHNlY3JldHMgd291bGQgcnVuIHRoZSB0ZXN0cyBhZ2FpbnN0IGRldmVsb3BtZW50IHZhbHVlcywgYW5kIGFuIGV4cG9ydGVkXG4gICAgLy8gV0JfRU5WPXByb2R1Y3Rpb24gb3ZlcnJpZGRlbiB0byBkZXZlbG9wbWVudCBieSB0aGUgcHJvZHVjdGlvbiBwcm9maWxlIHdvdWxkIGJ1aWxkL2RlcGxveVxuICAgIC8vIHRoZSB3cm9uZyBlbnZpcm9ubWVudCB3aGlsZSBsb29raW5nIHN1Y2Nlc3NmdWwuXG4gICAgLy8gLS1jYXNjYWRlLW5vZGUtZW52IGZvcmNlcyA8Tk9ERV9FTlYgfHwgZGV2ZWxvcG1lbnQ+IChwZXIgaXRzIG93biBkb2N1bWVudGF0aW9uKSwgcmVhZCBmcm9tXG4gICAgLy8gdGhlIEFNQklFTlQgZW52aXJvbm1lbnQgbGlrZSB0aGUgY2FzY2FkZSBzZWxlY3Rpb24uIE9ubHkgYSBTVEFOREFSRCBmb3JjZWQgbW9kZSBpcyBlbmZvcmNlZDpcbiAgICAvLyBhIG5vbi1zdGFuZGFyZCBvbmUgKGUuZy4gTk9ERV9FTlY9cWEpIGFscmVhZHkgaGFkIGl0cyBmYWxsYmFjayBjbGFtcGVkIHRvIGRldmVsb3BtZW50IGFib3ZlLFxuICAgIC8vIGFuZCBlcnJvcmluZyBvbiB0aGF0IGNsYW1wIHdvdWxkIGNvbnRyYWRpY3QgaXQuXG4gICAgY29uc3QgZm9yY2VkTW9kZSA9XG4gICAgICB0aGlzLmFyZ3YuY2FzY2FkZUVudiA/P1xuICAgICAgKHRoaXMuYXJndi5jYXNjYWRlTm9kZUVudiA/IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCcgOiBwcm9jZXNzLmVudi5XQl9FTlYgfHwgdW5kZWZpbmVkKTtcbiAgICAvLyBUaGUgQVVUTy1zZWxlY3RlZCBtb2RlIGNvdW50cyBhcyB0aGUgZXhwZWN0YXRpb24gdG9vOiB3aXRoIG5vdGhpbmcgc2V0IGFueXdoZXJlLCB0aGVcbiAgICAvLyBkZXZlbG9wbWVudCB2YWx1ZXMgYXJlIGxvYWRlZCwgc28gYW4gZW52IHNvdXJjZSBkZWNsYXJpbmcgV0JfRU5WPXByb2R1Y3Rpb24gd291bGRcbiAgICAvLyBvdGhlcndpc2UgcnVuIGRldmVsb3BtZW50IHNvdXJjZXMgbGFiZWxlZCBhcyBwcm9kdWN0aW9uLlxuICAgIGNvbnN0IGV4cGVjdGVkTW9kZSA9XG4gICAgICBmb3JjZWRNb2RlID8/ICh0aGlzLmFyZ3YuYXV0b0Nhc2NhZGVFbnYgIT09IGZhbHNlID8gcmVzb2x2ZUZhbGxiYWNrV2JFbnYodGhpcy5hcmd2KSA6IHVuZGVmaW5lZCk7XG4gICAgLy8gVGhlIGNvbW1hbmQtbGV2ZWwgZGVmYXVsdCBpcyBhIGxlZ2l0aW1hdGUgc2Vjb25kIGV4cGVjdGF0aW9uOiBgd2IgdGVzdCAtLWNhc2NhZGUtZW52PXN0YWdpbmdgXG4gICAgLy8gbG9hZHMgdGhlIHN0YWdpbmcgZmlsZXMgd2hpbGUgdGhlIGZhbGxiYWNrIGNvcnJlY3RseSBmaWxscyBXQl9FTlY9dGVzdC5cbiAgICBpZiAoXG4gICAgICBleHBlY3RlZE1vZGUgJiZcbiAgICAgIFByb2plY3Quc3RhbmRhcmRXYkVudk1vZGVzLmhhcyhleHBlY3RlZE1vZGUpICYmXG4gICAgICBlbnYuV0JfRU5WICE9PSBleHBlY3RlZE1vZGUgJiZcbiAgICAgIGVudi5XQl9FTlYgIT09IHRoaXMuYXJndi5jb21tYW5kRGVmYXVsdFdiRW52XG4gICAgKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYFdCX0VOViByZXNvbHZlcyB0byBcIiR7ZW52LldCX0VOVn1cIiBhbHRob3VnaCB0aGUgXCIke2V4cGVjdGVkTW9kZX1cIiBlbnZpcm9ubWVudCB3YXMgc2VsZWN0ZWQuIGAgK1xuICAgICAgICAgICAgYEZpeCB0aGUgV0JfRU5WIGRlZmluZWQgaW4gdGhlIG1vZGUncyBlbnYgc291cmNlIChlLmcuIHRoZSBmbm94IFwiJHtleHBlY3RlZE1vZGV9XCIgcHJvZmlsZSksIGAgK1xuICAgICAgICAgICAgJ29yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlcXVpcmVzTmV4dFB1YmxpY1diRW52ICYmIGVudi5ORVhUX1BVQkxJQ19XQl9FTlYgIT09IGVudi5XQl9FTlYpIHtcbiAgICAgIC8vIEFzc2lnbiB1bmNvbmRpdGlvbmFsbHksIG5vdCBgfHw9YDogdGhlIHBhaXIgbXVzdCBhZ3JlZSBieSBjb252ZW50aW9uLCBhbmQgYSBzdGFsZSB2YWx1ZVxuICAgICAgLy8gKGUuZy4gdGhlIGZub3ggYmFzZSBkZXZlbG9wbWVudCBkZWZhdWx0IHdoaWxlIENJIGV4cG9ydHMgV0JfRU5WPXRlc3QpIHdvdWxkIG90aGVyd2lzZVxuICAgICAgLy8gYmUgYmFrZWQgaW50byB0aGUgY2xpZW50IGJ1bmRsZSBldmVuIHRob3VnaCB0aGUgc2VydmVyIHNpZGUgcnVucyB3aXRoIHRoZSBjb3JyZWN0IFdCX0VOVi5cbiAgICAgIGlmIChlbnYuTkVYVF9QVUJMSUNfV0JfRU5WICYmICFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBPdmVycmlkaW5nIE5FWFRfUFVCTElDX1dCX0VOViAoXCIke2Vudi5ORVhUX1BVQkxJQ19XQl9FTlZ9XCIpIHdpdGggV0JfRU5WIChcIiR7ZW52LldCX0VOVn1cIikuYCk7XG4gICAgICB9XG4gICAgICBlbnYuTkVYVF9QVUJMSUNfV0JfRU5WID0gZW52LldCX0VOVjtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBwcml2YXRlIGdldCByZXF1aXJlc05leHRQdWJsaWNXYkVudigpOiBib29sZWFuIHtcbiAgICAvLyBPV04gZGVwZW5kZW5jaWVzIG9ubHk6IGEgcm9vdC1sZXZlbCBuZXh0L3ZpbmV4dCBkZXZEZXBlbmRlbmN5IGluIGEgbWl4ZWQgbW9ub3JlcG8gbXVzdCBub3RcbiAgICAvLyBmb3JjZSBORVhUX1BVQkxJQ19XQl9FTlYgb250byBldmVyeSBub24tTmV4dCB3b3Jrc3BhY2UgcGFja2FnZS5cbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCduZXh0JykgfHwgISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCd2aW5leHQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYHdyYW5nbGVyIHR5cGVzYCBzaG91bGQgZ2VuZXJhdGUgYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNgIGhlcmUuIEEgd3JhbmdsZXIgY29uZmlnXG4gICAqIGFuZCBhbiBvd24gd3JhbmdsZXIgZGVwZW5kZW5jeSBhcmUgYm90aCByZXF1aXJlZCDigJQgd3JhbmdsZXIgZXhpdHMgbm9uLXplcm8gd2l0aG91dCBhIGNvbmZpZyxcbiAgICogYW5kIGluIGEgbWl4ZWQgbW9ub3JlcG8gYSByb290LWxldmVsIHdyYW5nbGVyIGRldkRlcGVuZGVuY3kgbXVzdCBub3QgbWFrZSBldmVyeSB3b3Jrc3BhY2VcbiAgICogcGFja2FnZSBlbWl0IHR5cGVzIGl0IG5ldmVyIGNvbnN1bWVzLlxuICAgKlxuICAgKiBUaGUgcGFja2FnZSdzIG93biBjb21taXR0ZWQgZ2l0aWdub3JlIHJ1bGUgaXMgdGhlIHRoaXJkIHNpZ25hbCwgYW5kIHRoZSBvbmUgdGhhdCBzYXlzIHRoZVxuICAgKiBwYWNrYWdlIGFjdHVhbGx5IENPTlNVTUVTIHRoZSBmaWxlOiB3YmZ5IHdyaXRlcyB0aGF0IHJ1bGUgb25seSBmb3IgcGFja2FnZXMgd2hvc2Ugb3duIHRzY29uZmlnXG4gICAqIGNhbiByZWZlcmVuY2UgYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNgLCBhbmQgZGVsaWJlcmF0ZWx5IGxlYXZlcyBhbG9uZSBwYWNrYWdlcyB0aGF0XG4gICAqIGhhbmQtbWFpbnRhaW4gdGhlaXIgYEVudmAgaW5zdGVhZC4gV2l0aG91dCB0aGlzIGNoZWNrLCBzdWNoIGEgcGFja2FnZSB3b3VsZCBnYWluIGFuIHVudHJhY2tlZFxuICAgKiB+NTAwS0IgZ2VuZXJhdGVkIGZpbGUgb24gZXZlcnkgaW5zdGFsbC5cbiAgICovXG4gIEBtZW1vaXplT25lXG4gIGdldCBnZW5lcmF0ZXNXb3JrZXJUeXBlcygpOiBib29sZWFuIHtcbiAgICBpZiAoIWZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgodGhpcykgfHwgIXRoaXMuaGFzT3duRGVwZW5kZW5jeSgnd3JhbmdsZXInKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIERlZmVuc2UgaW4gZGVwdGggYWdhaW5zdCB3YmZ5J3MgZ2l0aWdub3JlIHJ1bGUgYW5kIHRoaXMgcHJlZGljYXRlIGRyaWZ0aW5nIGFwYXJ0OiBpZiB0aGUgcGFja2FnZSBzdGlsbFxuICAgIC8vIHJ1bnMgaXRzIG93biBvdXRwdXQtY2hhbmdpbmcgYHdyYW5nbGVyIHR5cGVzYCAoZS5nLiBgLS1zdHJpY3QtdmFycz1mYWxzZWApLCB0aGUgYmFyZSBpbnZvY2F0aW9uIGhlcmUgd291bGRcbiAgICAvLyBvdmVyd3JpdGUgdGhhdCBmaWxlIHdpdGggYSBkaWZmZXJlbnQgYEVudmAuXG4gICAgaWYgKGhhc091dHB1dENoYW5naW5nV3JhbmdsZXJUeXBlcyh0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge30sIHRoaXMuZGlyUGF0aCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gaGFzTWFuYWdlZEdpdGlnbm9yZVJ1bGUodGhpcy5kaXJQYXRoLCBXT1JLRVJfVFlQRVNfRklMRV9OQU1FKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbigncHJpc21hJyk7XG4gIH1cblxuICAvKiogQmxpdHogcmVwb3NpdG9yaWVzIGtlZXAgdGhlaXIgUHJpc21hIHNjaGVtYSBhbmQgU1FMaXRlIGRhdGFiYXNlcyB1bmRlciBkYi8gaW5zdGVhZCBvZiBwcmlzbWEvLiAqL1xuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJpc21hRGlyTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdkYicsICdzY2hlbWEucHJpc21hJykpID8gJ2RiJyA6ICdwcmlzbWEnO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RyaXp6bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignZHJpenpsZS1vcm0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkYXRhYmFzZU9ybSgpOiBEYXRhYmFzZU9ybSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJpc21hKSByZXR1cm4gJ3ByaXNtYSc7XG4gICAgaWYgKHRoaXMuaGFzRHJpenpsZSkgcmV0dXJuICdkcml6emxlJztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzVml0ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udml0ZXN0ID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aXRlc3QpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094bGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGxpbnQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNUeXBlQXdhcmVPeGxpbnQoKTogYm9vbGVhbiB7XG4gICAgLy8gT3hsaW50J3MgdHlwZS1hd2FyZSBtb2RlIHJlcXVpcmVzIHRoZSBveGxpbnQtdHNnb2xpbnQgYmluYXJ5LlxuICAgIHJldHVybiB0aGlzLmhhc094bGludCAmJiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludC10c2dvbGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094Zm10KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294Zm10Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJldHRpZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgncHJldHRpZXInKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQb2V0cnlMb2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwb2V0cnkubG9jaycpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncG9ldHJ5LmxvY2snKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1B1YnNwZWNZYW1sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSkgfHxcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwdWJzcGVjLnlhbWwnKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0NhcmdvVG9tbCgpOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IHRoZSBwcm9qZWN0J3Mgb3duIGRpcmVjdG9yeSBpcyBjaGVja2VkIGJlY2F1c2UgYGNhcmdvIGZtdCAtLWFsbGBcbiAgICAvLyBjb3ZlcnMgdGhlIHdob2xlIHdvcmtzcGFjZTsgbWF0Y2hpbmcgdGhlIHJvb3QgZGlyZWN0b3J5IHRvbyB3b3VsZCBtYWtlXG4gICAgLy8gZXZlcnkgZGVzY2VuZGFudCBwcm9qZWN0IHJ1biB0aGUgc2FtZSB3b3Jrc3BhY2Utd2lkZSBjb21tYW5kIGluXG4gICAgLy8gcGFyYWxsZWwuXG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ0NhcmdvLnRvbWwnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdveGxpbnQnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNPeGxpbnQpIHJldHVybiAnb3hsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBoYXNPd25EZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQbGF5d3JpZ2h0Q29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBQbGF5d3JpZ2h0IGNvbmZpZyBkZWNsYXJlcyBhIGB3ZWJTZXJ2ZXJgIGJsb2NrLCBpLmUuIFBsYXl3cmlnaHQgaXRzZWxmIGJ1aWxkcyBhbmRcbiAgICogc3RhcnRzIHRoZSBhcHAgdW5kZXIgdGVzdC4gVW5saWtlIHtAbGluayBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodH0gdGhpcyBpZ25vcmVzIENJLCBzb1xuICAgKiBpdCBhbHNvIGhvbGRzIGZvciBsaWJyYXJ5IGZpeHR1cmVzIHdob3NlIG9ubHkgc2VydmVyIGlzIHRoZSBvbmUgUGxheXdyaWdodCBtYW5hZ2VzLlxuICAgKi9cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWcoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgICAgcmV0dXJuIC9cXGJ3ZWJTZXJ2ZXJcXGIvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICAvLyBPbiBDSSB3YiBsYXVuY2hlcyB0aGUgYXBwIGl0c2VsZiBzbyB0aGUgcnVuIGRvZXMgbm90IGRlcGVuZCBvbiBQbGF5d3JpZ2h0J3MgYHJldXNlRXhpc3RpbmdTZXJ2ZXJgXG4gICAgLy8gKHdoaWNoIGlzIGRpc2FibGVkIG9uIENJKTsgbG9jYWxseSwgYSBgd2ViU2VydmVyYCBibG9jayBtZWFucyBQbGF5d3JpZ2h0IGFscmVhZHkgb3ducyB0aGUgc2VydmVyLlxuICAgIGlmIChpc0NJKHRoaXMuZW52LkNJKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWc7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIGNvbnN0IGRvY2tlcmZpbGVEaXJQYXRoID0gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSk7XG4gICAgcmV0dXJuIGRvY2tlcmZpbGVEaXJQYXRoID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiAoSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRvY2tlcmZpbGVEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCh0aGlzLmRpclBhdGgsIHRoaXMuZW52KTtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNEZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKSA/PyB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucm9vdFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXBlbmRlbmN5VmVyc2lvbih0aGlzLnBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCwgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBwcml2YXRlIGdldCByb290UGFja2FnZUpzb24oKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJvb3REaXJQYXRoID09PSB0aGlzLmRpclBhdGgpIHJldHVybiB0aGlzLnBhY2thZ2VKc29uO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW3diXSBGYWlsZWQgdG8gcmVhZCBvciBwYXJzZSAke3BhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyl9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd1BhdGggPSBkYlVybC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpLnJlcGxhY2UoL1s/I10uKiQvLCAnJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcmF3UGF0aC5zdGFydHNXaXRoKCcvLycpID8gcmF3UGF0aC5zbGljZSgyKSA6IHJhd1BhdGg7XG4gIHJldHVybiBub3JtYWxpemVkUGF0aCB8fCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+ICYgUGFydGlhbDxQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdyb290RGlyUGF0aCc+PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBpZiAocGF0aC5pc0Fic29sdXRlKGRiUGF0aCkpIHJldHVybiBkYlBhdGg7XG5cbiAgY29uc3QgYmFzZURpclBhdGggPSBwcm9qZWN0LnJvb3REaXJQYXRoID8/IHByb2plY3QuZGlyUGF0aDtcbiAgcmV0dXJuIGJhc2VEaXJQYXRoID8gcGF0aC5yZXNvbHZlKGJhc2VEaXJQYXRoLCBkYlBhdGgpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBwcm9qZWN0J3MgZW52IHNvdXJjZXMgYW5kIG1lcmdlcyB0aGVtIG92ZXIgcHJvY2Vzcy5lbnYsIHJlcG9ydGluZyBlYWNoIGxvYWRlZCBzb3VyY2UuXG4gKiBTaGFyZWQgYnkgUHJvamVjdC5lbnYgYW5kIGB3YiBydW5gJ3Mgc3RhbmRhbG9uZSAobWFuaWZlc3QtbGVzcykgZW52aXJvbm1lbnQgbG9hZGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRNZXJnZUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBkaXJQYXRoOiBzdHJpbmdcbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBbc3RyaW5nLCBzdHJpbmdbXV1bXV0ge1xuICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgZGlyUGF0aCwge1xuICAgIC8vIENhbGxlcnMgZmlsbCBhbiB1bnNldCBXQl9FTlYgd2l0aCB0aGUgc2FtZSBmYWxsYmFjayBhZnRlcndhcmRzLCBzbyBleHBhbmRpbmcgJHtXQl9FTlZ9XG4gICAgLy8gcmVmZXJlbmNlcyBhZ2FpbnN0IGl0IGtlZXBzIHRoZSBwYWlyIGNvbnNpc3RlbnQuXG4gICAgZXhwYW5kRmFsbGJhY2tXYkVudjogdHJ1ZSxcbiAgfSk7XG4gIGlmICghc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2KSkge1xuICAgIGZvciAoY29uc3QgW2VudlBhdGgsIG5hbWVzXSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYExvYWRlZCAke25hbWVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgfVxuICAvLyBTcHJlYWRpbmcgZW52VmFycyBsYXN0IGlzIHNhZmUgZm9yIGV4cG9ydGVkLXZhcmlhYmxlIHByZWNlZGVuY2U6IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlc1xuICAvLyBhbHJlYWR5IGV4Y2x1ZGVzIGtleXMgcHJlc2VudCBpbiBwcm9jZXNzLmVudiBmcm9tIC5lbnYvZm5veCBzb3VyY2VzIChyZXR1cm5pbmcgYSBrZXkgdGhhdFxuICAvLyBleGlzdHMgaW4gcHJvY2Vzcy5lbnYgb25seSBmb3IgZGVsaWJlcmF0ZSBmb3JjZWQtbW9kZSBvdmVycmlkZXMpLiBNaXNlIHZhbHVlcyB0aGF0XG4gIC8vIGRpZmZlciBmcm9tIHRoZSBhbWJpZW50IGFjdGl2YXRpb24gYXJlIGRlbGliZXJhdGVseSBrZXB0IHNvIHRoZSByZXF1ZXN0ZWQgY2FzY2FkZSBwcm9maWxlXG4gIC8vIChlLmcuIGAtLWNhc2NhZGUtZW52PXRlc3RgKSB3aW5zIG92ZXIgYSBzdGFsZSBgbWlzZSBhY3RpdmF0ZWAgZW52aXJvbm1lbnQuXG4gIHJldHVybiBbeyAuLi5wcm9jZXNzLmVudiwgLi4uZW52VmFycyB9LCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuLy8gUHJvamVjdCBjb25zdHJ1Y3Rpb24gcmUtcmVhZHMgbWFuaWZlc3RzIGFuZCBlbnYgc291cmNlcywgYW5kIGB3YiB2ZXJpZnlgIGNvbXBvc2VzIGNvbW1hbmRzXG4vLyAobGludCwgdHlwZWNoZWNrLCB0ZXN0KSB0aGF0IGVhY2ggcmVidWlsZCB0aGUgZ3JhcGgg4oCUIHNvIGluc3RhbmNlcyBhcmUgc2hhcmVkIHBlclxuLy8gKGRpcmVjdG9yeSwgbG9hZEVudiwgZW52LXJlbGV2YW50IGFyZ3YpIHdpdGhpbiBvbmUgaW52b2NhdGlvbi4gU2hhcmluZyBpcyBzYWZlIGJlY2F1c2UgYVxuLy8gUHJvamVjdCBpcyBpbW11dGFibGUgZXhjZXB0IGZvciBlbnYgbXV0YXRpb25zIChlLmcuIGBwcm9qZWN0LmVudi5QT1JUIHx8PSAuLi5gKSwgd2hpY2ggY2FsbGVyc1xuLy8gZGVsaWJlcmF0ZWx5IHJlbHkgb24gc3RheWluZyB2aXNpYmxlIHRvIGxhdGVyIHN0ZXBzLiBUaGUgY2FjaGVzIGxpdmUgZm9yIHRoZSB3aG9sZSBwcm9jZXNzIGFuZFxuLy8gbmV2ZXIgb2JzZXJ2ZSBsYXRlciBmaWxlc3lzdGVtIG11dGF0aW9ucywgc28gY29kZSB0aGF0IHJld3JpdGVzIGEgcHJvamVjdCBkaXJlY3RvcnkgYW5kIG5lZWRzIGFcbi8vIGZyZXNoIHZpZXcgKHRvZGF5IG9ubHkgdGVzdHMpIG11c3QgY2FsbCBjbGVhclByb2plY3RDYWNoZXMgZmlyc3QuXG5jb25zdCBzZWxmUHJvamVjdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb2plY3Q+KCk7XG5jb25zdCBkZXNjZW5kYW50UHJvamVjdHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPFByb2plY3RbXT4+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclByb2plY3RDYWNoZXMoKTogdm9pZCB7XG4gIHNlbGZQcm9qZWN0Q2FjaGUuY2xlYXIoKTtcbiAgZGVzY2VuZGFudFByb2plY3RzQ2FjaGUuY2xlYXIoKTtcbiAgY2xlYXJUZXN0U3RydWN0dXJlQ2FjaGUoKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm9qZWN0Q2FjaGVLZXkoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudjogYm9vbGVhbiwgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gT25seSB0aGUgaW5wdXRzIGEgUHJvamVjdCBhY3R1YWxseSByZWFkcyBwYXJ0aWNpcGF0ZTogdGhlIGVudiBjYXNjYWRlIHNlbGVjdGlvblxuICAvLyAocmVhZEVudmlyb25tZW50VmFyaWFibGVzIC8gcmVzb2x2ZUZhbGxiYWNrV2JFbnYgLyBjb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYpIGFuZCB0aGUgb3V0cHV0XG4gIC8vIHN3aXRjaGVzIChzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0LCBidWlsZENvbW1hbmQncyAtLXZlcmJvc2UpLiBUaGUgYW1iaWVudFxuICAvLyBXQl9FTlYgLyBOT0RFX0VOViAvIENJIHZhbHVlcyBmZWVkIHRoZSBzYW1lIGNhc2NhZGUgc2VsZWN0aW9uIGFuZCBhcmUgbXV0YXRlZCBtaWQtcnVuIGJ5XG4gIC8vIGNvbW1hbmRzIHN1Y2ggYXMgYHdiIGRiIHJlc2V0YCAod2hpY2ggZm9yY2VzIFdCX0VOVj10ZXN0IGFuZCByZS1yZXNvbHZlcyBwcm9qZWN0cyksIHNvIHRoZXlcbiAgLy8gbXVzdCBwYXJ0aWNpcGF0ZSB0b28gb3IgdGhlIHNlY29uZCByZXNvbHV0aW9uIHdvdWxkIHJldXNlIGEgUHJvamVjdCB3aXRoIHRoZSB3cm9uZyBlbnYuXG4gIGNvbnN0IHsgYXV0b0Nhc2NhZGVFbnYsIGNhc2NhZGVFbnYsIGNhc2NhZGVOb2RlRW52LCBjb21tYW5kRGVmYXVsdFdiRW52LCBxdWlldEVudiwgdmVyYm9zZSB9ID0gYXJndjtcbiAgY29uc3QgeyBzaWxlbnQgfSA9IGFyZ3YgYXMgeyBzaWxlbnQ/OiBib29sZWFuIH07XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgcGF0aC5yZXNvbHZlKGRpclBhdGgpLFxuICAgIGxvYWRFbnYsXG4gICAgYXV0b0Nhc2NhZGVFbnYsXG4gICAgY2FzY2FkZUVudixcbiAgICBjYXNjYWRlTm9kZUVudixcbiAgICBjb21tYW5kRGVmYXVsdFdiRW52LFxuICAgIHF1aWV0RW52LFxuICAgIHZlcmJvc2UsXG4gICAgc2lsZW50LFxuICAgIHByb2Nlc3MuZW52LldCX0VOVixcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOVixcbiAgICBwcm9jZXNzLmVudi5DSSxcbiAgXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgY2FjaGVLZXkgPSBidWlsZFByb2plY3RDYWNoZUtleShhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgbGV0IHByb2plY3QgPSBzZWxmUHJvamVjdENhY2hlLmdldChjYWNoZUtleSk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIHByb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICBzZWxmUHJvamVjdENhY2hlLnNldChjYWNoZUtleSwgcHJvamVjdCk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0OiBQcm9qZWN0LCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByb2plY3QuZW52LldCX0VOViA9PT0gbmFtZSB8fCBwcm9qZWN0LmVudi5NSVNFX0VOViA9PT0gbmFtZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmREZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBQcm9taXNlPEZvdW5kUHJvamVjdHMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgcm9vdEFuZFNlbGZQcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGxvYWRFbnYsIGRpclBhdGgpO1xuICBpZiAoIXJvb3RBbmRTZWxmUHJvamVjdHMpIHJldHVybjtcbiAgaWYgKHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCAhPT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmKSB7XG4gICAgcmV0dXJuIHsgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cywgZGVzY2VuZGFudHM6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdIH07XG4gIH1cblxuICBjb25zdCBjYWNoZUtleSA9IGJ1aWxkUHJvamVjdENhY2hlS2V5KGFyZ3YsIGxvYWRFbnYsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdC5kaXJQYXRoKTtcbiAgbGV0IGRlc2NlbmRhbnRzID0gZGVzY2VuZGFudFByb2plY3RzQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgaWYgKCFkZXNjZW5kYW50cykge1xuICAgIGRlc2NlbmRhbnRzID0gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudik7XG4gICAgZGVzY2VuZGFudFByb2plY3RzQ2FjaGUuc2V0KGNhY2hlS2V5LCBkZXNjZW5kYW50cyk7XG4gIH1cbiAgcmV0dXJuIHsgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cywgZGVzY2VuZGFudHM6IGF3YWl0IGRlc2NlbmRhbnRzIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IE9taXQ8Rm91bmRQcm9qZWN0cywgJ2Rlc2NlbmRhbnRzJz4gfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCB0aGlzUHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCF0aGlzUHJvamVjdCkgcmV0dXJuO1xuXG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIHJvb3RQcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIGxvYWRFbnYsIHJvb3REaXJQYXRoKSA/PyB0aGlzUHJvamVjdDtcbiAgfVxuICByZXR1cm4geyByb290OiByb290UHJvamVjdCwgc2VsZjogdGhpc1Byb2plY3QgfTtcbn1cblxuLyoqXG4gKiBUaGUgcm9vdCBwcm9qZWN0IGZvbGxvd2VkIGJ5IG9uZSBQcm9qZWN0IHBlciB3b3Jrc3BhY2UgZGlyZWN0b3J5IHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzXG4gKiBwYWNrYWdlIG1hbmFnZXIgd291bGQgbGluayAoaXNzdWUgIzEwMDgpOiBCdW4gcmVwb3MgdXNlIHRoZSBzaGFyZWQgQnVuLWV4YWN0IHJlc29sdmVyXG4gKiAobmVnYXRpb25zLCBwaW5uZWQgcG9zaXRpdmVzLCBhbmQgYmFzZWxpbmUtc2VlZGluZyBuZWdhdGlvbnMgaW5jbHVkZWQpLCB3aGlsZSBZYXJuIHJlcG9zIGtlZXBcbiAqIGdsb2Igc2VtYW50aWNzIOKAlCBCdW4tb25seSBydWxlcyBzdWNoIGFzIHRoZSBpbXBsaWNpdCBiYXNlbGluZSB3b3VsZCBpbnZlbnQgd29ya3NwYWNlcyBZYXJuXG4gKiBuZXZlciBsaW5rcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICByb290UHJvamVjdDogUHJvamVjdCxcbiAgbG9hZEVudjogYm9vbGVhblxuKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBhd2FpdCBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMocm9vdFByb2plY3QpO1xuICByZXR1cm4gW1xuICAgIHJvb3RQcm9qZWN0LFxuICAgIC4uLndvcmtzcGFjZURpclBhdGhzLm1hcChcbiAgICAgIC8vIFRoZSBmYWxsYmFjayBrZWVwcyBhIHdvcmtzcGFjZSB3aG9zZSBtYW5pZmVzdCB2YW5pc2hlZCBhZnRlciB0aGUgZ2xvYiAoZmluZFNlbGZQcm9qZWN0XG4gICAgICAvLyB3b3VsZCBkcm9wIGl0KSBkaXNjb3ZlcmVkLCBtYXRjaGluZyB0aGUgbG9uZy1zdGFuZGluZyBkaXJlY3QgY29uc3RydWN0aW9uLlxuICAgICAgKHdvcmtzcGFjZURpclBhdGgpID0+XG4gICAgICAgIGZpbmRTZWxmUHJvamVjdChhcmd2LCBsb2FkRW52LCB3b3Jrc3BhY2VEaXJQYXRoKSA/PyBuZXcgUHJvamVjdCh3b3Jrc3BhY2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KVxuICAgICksXG4gIF07XG59XG5cbi8qKlxuICogVGhlIGFic29sdXRlIGRpcmVjdG9yeSBvZiBldmVyeSB3b3Jrc3BhY2UgdGhlIHRhcmdldCByZXBvc2l0b3J5J3MgcGFja2FnZSBtYW5hZ2VyIHdvdWxkIGxpbmssXG4gKiBtYXRjaGluZyB0aGUgbWFuYWdlciB0aGUgd2F5IGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyBkZXNjcmliZXMuIEV4cG9ydGVkIGZvciB3YiByZWxlYXNlLCB3aG9zZVxuICogcGx1Z2luIGluc3BlY3Rpb24sIG5vZGVfbW9kdWxlcyBjbGVhbnVwLCBhbmQgbWFuaWZlc3QgcmV3cml0aW5nIG11c3Qgc2VlIHRoZSBzYW1lIHdvcmtzcGFjZSBzZXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uJyB8ICd1c2VzQnVuUGFja2FnZU1hbmFnZXInPlxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBpZiAocHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUJ1bldvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMocHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzLCBwcm9qZWN0LmRpclBhdGgpLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpXG4gICAgKTtcbiAgfVxuICAvLyBZYXJuIDEuMjIuMjIgcmVzb2x2ZXMgZWFjaCBkZWNsYXJlZCBwYXR0ZXJuIChhcnJheSBvciBgeyBwYWNrYWdlczogW+KApl0gfWAgZm9ybSkgaW5kZXBlbmRlbnRseVxuICAvLyBhbmQgdW5pb25zIHRoZSByZXN1bHRzLCBzbyBhIGxlYWRpbmctYCFgIHBhdHRlcm4gaXMgbm90IGFuIGV4Y2x1c2lvbiDigJQgYFtcInBhY2thZ2VzLypcIixcbiAgLy8gXCIhcGFja2FnZXMvYVwiXWAgc3RpbGwgbGlua3MgcGFja2FnZXMvYS4gWWFybiBhZGRpdGlvbmFsbHkgaWdub3JlcyBtYW5pZmVzdHMgbWlzc2luZyBhIG5hbWUgb3JcbiAgLy8gdmVyc2lvbiAoXCJNaXNzaW5nIHZlcnNpb24gaW4gd29ya3NwYWNlIOKApiwgaWdub3JpbmcuXCIpLCBidXQgdGhhdCBpcyBkZWxpYmVyYXRlbHkgTk9UIG1pcnJvcmVkOlxuICAvLyB3YidzIGRlc2NlbmRhbnQgZGlzY292ZXJ5IGV4aXN0cyB0byBydW4gY29tbWFuZHMgKGxpbnQsIHRlc3QsIHR5cGVjaGVjaywg4oCmKSBpbiBzdWItcGFja2FnZXMsXG4gIC8vIGFuZCB2ZXJzaW9uLWxlc3MgcHJpdmF0ZSBwYWNrYWdlcyBtdXN0IHN0YXkgZGlzY292ZXJlZCDigJQgdGhlIGxvbmctc3RhbmRpbmcgYmVoYXZpb3Igd2Inc1xuICAvLyBtb25vcmVwbyBmaXh0dXJlcyBlbmNvZGUuIEdsb2IgZm9yIHRoZSBtYW5pZmVzdHMgdGhlbXNlbHZlczogZ2xvYmJ5J3MgYG9ubHlEaXJlY3Rvcmllc2BcbiAgLy8gd291bGQgcmV0dXJuIGEgbGl0ZXJhbCBkaXJlY3RvcnkgcGF0dGVybidzIENISUxEUkVOIGluc3RlYWQgb2YgdGhlIGRpcmVjdG9yeS4gVGhlIHJlYWxwYXRoXG4gIC8vIGNvbnRhaW5tZW50IG1pcnJvcnMgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHM6IGEgd29ya3NwYWNlIHN5bWxpbmsgZXNjYXBpbmcgdGhlXG4gIC8vIHJlcG9zaXRvcnkgbXVzdCBub3QgbGV0IGNvbnN1bWVycyB0b3VjaCBhbm90aGVyIGNoZWNrb3V0LlxuICBjb25zdCBwb3NpdGl2ZVBhdHRlcm5zID0gZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpLmZpbHRlcihcbiAgICAocGF0dGVybikgPT4gIXBhdHRlcm4uc3RhcnRzV2l0aCgnIScpICYmIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybihwYXR0ZXJuKVxuICApO1xuICBpZiAocG9zaXRpdmVQYXR0ZXJucy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgLy8gZXhwYW5kRGlyZWN0b3JpZXM6IGZhbHNlIOKAlCBnbG9iYnkgd291bGQgb3RoZXJ3aXNlIGV4cGFuZCBhIGxpdGVyYWwgZGlyZWN0b3J5IHBhdHRlcm4gdG8gaXRzXG4gIC8vIENISUxEUkVOLCB0dXJuaW5nIGUuZy4gYHBhY2thZ2VzYCBpbnRvIG1hdGNoZXMgZm9yIGV2ZXJ5IHBhY2thZ2VzLyogc3ViZGlyZWN0b3J5LlxuICBjb25zdCBnbG9iYnlPcHRpb25zID0ge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGV4cGFuZERpcmVjdG9yaWVzOiBmYWxzZSxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gIH07XG4gIC8vIGZhc3QtZ2xvYiAoZ2xvYmJ5J3MgZW5naW5lKSByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgLy8gYHBhY2thZ2VzLz8vcGFja2FnZS5qc29uYCkgYWx0aG91Z2ggWWFybiBsaW5rcyBzdWNoIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnNcbiAgLy8gb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnkgZGlyZWN0b3J5IGluIHRoZSByZXBvc2l0b3J5KSwgZ2xvYmJpbmdcbiAgLy8gdGhlIGRpcmVjdG9yaWVzICh3aGVyZSBgP2Agd29ya3MpIGFuZCBjaGVja2luZyB0aGVpciBtYW5pZmVzdHMgY29tcGxlbWVudHMgdGhlIG1hbmlmZXN0IGdsb2IuXG4gIGNvbnN0IGdsb2JiZWRNYW5pZmVzdFBhdGhzID0gYXdhaXQgZ2xvYmJ5KFxuICAgIHBvc2l0aXZlUGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICBnbG9iYnlPcHRpb25zXG4gICk7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aFNldCA9IG5ldyBTZXQoZ2xvYmJlZE1hbmlmZXN0UGF0aHMpO1xuICBjb25zdCBxdWVzdGlvbk1hcmtQYXR0ZXJucyA9IHBvc2l0aXZlUGF0dGVybnMuZmlsdGVyKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLmluY2x1ZGVzKCc/JykpO1xuICBpZiAocXVlc3Rpb25NYXJrUGF0dGVybnMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBhd2FpdCBnbG9iYnkocXVlc3Rpb25NYXJrUGF0dGVybnMsIHsgLi4uZ2xvYmJ5T3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLnBvc2l4LmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgbWFuaWZlc3RQYXRoKSkpIG1hbmlmZXN0UGF0aFNldC5hZGQobWFuaWZlc3RQYXRoKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbWFuaWZlc3RQYXRocyA9IFsuLi5tYW5pZmVzdFBhdGhTZXRdO1xuICBjb25zdCByZWFsUm9vdERpclBhdGggPSBmcy5yZWFscGF0aFN5bmMocHJvamVjdC5kaXJQYXRoKTtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBtYW5pZmVzdFBhdGhzXG4gICAgLy8gQSBgKipgIHBhdHRlcm4gcmVhY2hlcyB0aGUgcm9vdCdzIG93biBtYW5pZmVzdCBhbmQgaW5zdGFsbGVkIHBhY2thZ2VzLCBidXQgbmVpdGhlciBpcyBhXG4gICAgLy8gd29ya3NwYWNlIHRvIFlhcm4gKHdoaWNoIG5ldmVyIGRlc2NlbmRzIGludG8gbm9kZV9tb2R1bGVzKS5cbiAgICAuZmlsdGVyKChtYW5pZmVzdFBhdGgpID0+IHtcbiAgICAgIGlmIChtYW5pZmVzdFBhdGggPT09ICdwYWNrYWdlLmpzb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlYWxSb290RGlyUGF0aCwgZnMucmVhbHBhdGhTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIG1hbmlmZXN0UGF0aCkpKTtcbiAgICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgbWFuaWZlc3QgdmFuaXNoZWQgYmV0d2VlbiB0aGUgZ2xvYiBhbmQgdGhlIHJlYWxwYXRoIGNhbGw6IG5vdCBhIHdvcmtzcGFjZS5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pXG4gICAgLm1hcCgobWFuaWZlc3RQYXRoKSA9PiBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBwYXRoLnBvc2l4LmRpcm5hbWUobWFuaWZlc3RQYXRoKSkpO1xuICByZXR1cm4gWy4uLm5ldyBTZXQod29ya3NwYWNlRGlyUGF0aHMpXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHBhY2thZ2UncyBvd24gY29tbWl0dGVkIC5naXRpZ25vcmUgY2FycmllcyB3YmZ5J3MgbWFuYWdlZCBydWxlIGZvciB0aGUgZmlsZS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGBnaXQgY2hlY2staWdub3JlYDogdGhhdCBhbHNvIGhvbm9ycyBgLmdpdC9pbmZvL2V4Y2x1ZGVgIGFuZCB0aGUgdXNlcidzIGdsb2JhbFxuICogZXhjbHVkZXMsIHdoaWNoIGEgZnJlc2ggY2xvbmUgYW5kIENJIGRvIG5vdCBoYXZlLiBBIGRldmVsb3BlciB3aXRoIGEgcGVyc29uYWxcbiAqIGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYCBleGNsdWRlIHdvdWxkIG90aGVyd2lzZSB0dXJuIGdlbmVyYXRpb24gb24gZm9yIGEgcGFja2FnZSB3YmZ5XG4gKiBkZWxpYmVyYXRlbHkgbGVmdCB1bm1hbmFnZWQsIGFuZCB0aGUgcmVzdWx0aW5nIGZpbGUgd291bGQgYmUgaW52aXNpYmxlIGluIGBnaXQgc3RhdHVzYC5cbiAqIGBwYWNrYWdlcy93YmZ5L3NyYy9maXhlcnMvd29ya2VyVHlwZXMudHNgIGdhdGVzIG9uIHRoZSBzYW1lIGNvbW1pdHRlZCBydWxlLlxuICovXG5mdW5jdGlvbiBoYXNNYW5hZ2VkR2l0aWdub3JlUnVsZShkaXJQYXRoOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnNcbiAgICAgIC5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICcuZ2l0aWdub3JlJyksICd1dGY4JylcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5zb21lKChsaW5lKSA9PiBsaW5lLnRyaW0oKSA9PT0gYC8ke2ZpbGVOYW1lfWApO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgcGFja2FnZSBzY3JpcHQgcnVucyBhIGB3cmFuZ2xlciB0eXBlc2AgdGhhdCB3b3VsZCB3cml0ZSBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGF0IHRoZSBiYXJlXG4gKiBpbnZvY2F0aW9uIHdyaXRlcy4gYC0tY2hlY2tgL2AtLWhlbHBgIHZhbGlkYXRlIG9yIHByaW50IGFuZCB3cml0ZSBub3RoaW5nLCBzbyB0aGV5IGRvIG5vdCBjb3VudC4gYC0tZW52LWZpbGVgXG4gKiBjb3VudHMgd2hlbmV2ZXIgYSBmaWxlIGl0IG5hbWVzIEVYSVNUUzogdGhlIGZsYWcgc2VsZWN0cyB3aGF0IHdyYW5nbGVyIHJlYWRzIHRvIGluZmVyIGxvY2FsIHZhcnMgYW5kIHNlY3JldHMsXG4gKiBzbyB0aGUgYmFyZSBpbnZvY2F0aW9uIGhlcmUgd291bGQgcmVnZW5lcmF0ZSBhIHNtYWxsZXIgYEVudmAuIE1pcnJvcnMgd2JmeSdzIGBoYXNDdXN0b21XcmFuZ2xlclR5cGVzSW52b2NhdGlvbmBcbiAqIChpbmNsdWRpbmcgaXRzIGBuYW1lc09ubHlNaXNzaW5nRW52RmlsZXNgIHJ1bGUpOyB0aGUgdHdvIG11c3QgYWdyZWUsIHNpbmNlIHdiZnkncyBhbnN3ZXIgZGVjaWRlcyB0aGVcbiAqIGdpdGlnbm9yZSBydWxlIHRoaXMgcHJlZGljYXRlIGtleXMgb24uXG4gKi9cbmZ1bmN0aW9uIGhhc091dHB1dENoYW5naW5nV3JhbmdsZXJUeXBlcyhzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgd3JhbmdsZXJUeXBlc1BhdHRlcm4gPSAvKD86XnxcXHMpd3JhbmdsZXJcXHMrdHlwZXMoPzpcXHN8JCkvdTtcbiAgY29uc3QgZW52RmlsZU9ubHlQYXR0ZXJuID0gL14oPzooPzpidW54fG5weClcXHMrfCg/Onlhcm58cG5wbSlcXHMrZGx4XFxzKyk/d3JhbmdsZXJcXHMrdHlwZXMoPzpcXHMrLS1lbnYtZmlsZVxccytcXFMrKSokL3U7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4ge1xuICAgIGlmICghc2NyaXB0IHx8ICF3cmFuZ2xlclR5cGVzUGF0dGVybi50ZXN0KHNjcmlwdCkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBDaGVja2VkIG9uIHRoZSBXSE9MRSBzY3JpcHQsIGJlZm9yZSBzcGxpdHRpbmc6IGBjZCBzdWIgJiYgd3JhbmdsZXIgdHlwZXNgIHJ1bnMgdGhlIGdlbmVyYXRvciBpbiBhbm90aGVyXG4gICAgLy8gZGlyZWN0b3J5IGFnYWluc3QgYW5vdGhlciBjb25maWcsIGJ1dCBpdHMgc2Vjb25kIHNlZ21lbnQgYWxvbmUgbG9va3MgbGlrZSBhIHBsYWluIGludm9jYXRpb24uIHdiZnlcbiAgICAvLyBjbGFzc2lmaWVzIGFueSBzY3JpcHQgY2FycnlpbmcgdGhpcyBzeW50YXggYXMgY3VzdG9tLCBhbmQgdGhlIHR3byBwcmVkaWNhdGVzIG11c3QgYWdyZWUuXG4gICAgaWYgKC9bO3w8PmAkJ1wiKCldfFxcYmNkXFxzL3UudGVzdChzY3JpcHQpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gc2NyaXB0XG4gICAgICAuc3BsaXQoJyYmJylcbiAgICAgIC5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJykpXG4gICAgICAuc29tZSgoc2VnbWVudCkgPT4ge1xuICAgICAgICBpZiAoIXdyYW5nbGVyVHlwZXNQYXR0ZXJuLnRlc3Qoc2VnbWVudCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKC8oPzpefFxccykoPzotLWhlbHB8LWgpKD86XFxzfD18JCkvdS50ZXN0KHNlZ21lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIGAtLWNoZWNrYCBjb21wYXJlcyB0aGUgcmVzdWx0IEZPUiBUSEUgU1VQUExJRUQgT1BUSU9OUywgc28gaXQgaXMgb25seSBoYXJtbGVzcyB3aGVuIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAvLyBpbnZvY2F0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJhcmUgb25lLlxuICAgICAgICBjb25zdCB3aXRob3V0Q2hlY2sgPSBzZWdtZW50XG4gICAgICAgICAgLnJlcGxhY2UoLyg/Ol58XFxzKS0tY2hlY2soPzpcXHN8PXwkKS91LCAnICcpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJylcbiAgICAgICAgICAudHJpbSgpO1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB3aXRob3V0Q2hlY2sgPT09IHNlZ21lbnQgPyBzZWdtZW50IDogd2l0aG91dENoZWNrO1xuICAgICAgICAvLyBOb3QgZXF1aXZhbGVudCB0byB0aGUgYmFyZSBpbnZvY2F0aW9uLCB3aXRoIG9yIHdpdGhvdXQgYC0tY2hlY2tgOiBgLS1jaGVja2AgY29tcGFyZXMgdGhlIHJlc3VsdCBGT1JcbiAgICAgICAgLy8gVEhFIFNVUFBMSUVEIE9QVElPTlMsIHNvIGAtLWNoZWNrIC0tc3RyaWN0LXZhcnM9ZmFsc2VgIHN0aWxsIGRlc2NyaWJlcyBhIGRpZmZlcmVudCBmaWxlLlxuICAgICAgICBpZiAoIWVudkZpbGVPbmx5UGF0dGVybi50ZXN0KGNhbmRpZGF0ZSkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gWy4uLmNhbmRpZGF0ZS5tYXRjaEFsbCgvLS1lbnYtZmlsZVxccysoXFxTKykvZ3UpXS5zb21lKFxuICAgICAgICAgIChtYXRjaCkgPT4gISFtYXRjaFsxXSAmJiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBtYXRjaFsxXSkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBCaW5hcnlMaWtlLCBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdCdWlsZCBvdXRwdXQgcGF0aHMgKHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSkgdGhhdCBtdXN0IGV4aXN0IGZvciB0aGUgY2FjaGUgdG8gYmUgdmFsaWQgKGRlZmF1bHQ6IGF1dG8tZGV0ZWN0ZWQgY29tbW9uIG91dHB1dCBkaXJlY3RvcmllcyknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBidWlsZElmTmVlZGVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdidWlsZElmTmVlZGVkJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBjb2RlIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgYnVpbGRJZk5lZWRlZChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZElmTmVlZGVkKFxuICAvLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYnVpbGRDb21tYW5kID1cbiAgICBhcmd2LmNvbW1hbmQgPz8gKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQgPyBgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyUnVuQ29tbWFuZH0gYnVpbGRgIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFidWlsZENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1NraXAgdG8gYnVpbGQgYmVjYXVzZSBubyBidWlsZCBjb21tYW5kIGlzIGRlZmluZWQuJykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBidWlsZENvbW1hbmQgfTtcblxuICAvLyBUaGUgY2FjaGUgcmVxdWlyZXMgdGhlIGdpdCByZXBvc2l0b3J5IHJvb3QgdG8gQkUgcm9vdERpclBhdGg6IHBvcmNlbGFpbiBwYXRocyBhbmQgZGlmZlxuICAvLyBwYXRoc3BlY3MgYmVsb3cgYXJlIGpvaW5lZC9leGVjdXRlZCBhZ2FpbnN0IHJvb3REaXJQYXRoLiBXaGVuIHRoZSByZXBvIHJvb3QgaXMgZWxzZXdoZXJlXG4gIC8vIChlLmcuIGEgc3VicHJvamVjdCBvZiBhIGxhcmdlciByZXBvc2l0b3J5KSwgYWx3YXlzIGJ1aWxkIGluc3RlYWQgb2YgbWlzLXJlc29sdmluZyBwYXRocy5cbiAgLy8gQSBmcmVzaGx5IGluaXRpYWxpemVkIHJlcG8gd2l0aG91dCBjb21taXRzICh1bmJvcm4gSEVBRCkgbGlrZXdpc2UgYnVpbGRzIHdpdGhvdXQgY2FjaGluZzpcbiAgLy8gcmVzb2x2aW5nIEhFQUQgd291bGQgZmFpbC5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpID8gZ2V0R2l0Q29tbWl0SGFzaChwcm9qZWN0KSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YsIGNvbW1pdEhhc2gpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IG91dHB1dFBhdGhzID0gZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBkZXRlY3RFeGlzdGluZ0RlZmF1bHRPdXRwdXRQYXRocyhwcm9qZWN0KTtcbiAgICBpZiAob3V0cHV0UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBXaXRoIG5vIHJlY29yZGVkIG91dHB1dHMsIGEgZGVsZXRlZCBidWlsZCBkaXJlY3RvcnkgY2FuIG5ldmVyIGludmFsaWRhdGUgdGhlIGNhY2hlOyBtYWtlXG4gICAgICAvLyB0aGUgaW5hY3RpdmUgcHJvdGVjdGlvbiB2aXNpYmxlIGluc3RlYWQgb2YgZmFpbGluZyBzaWxlbnRseSAoY2YuIGlzc3VlICM5ODEpLlxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay55ZWxsb3coJ05vIGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkgZGV0ZWN0ZWQ7IHBhc3MgLS1vdXRwdXQgdG8gZW5hYmxlIG1pc3Npbmctb3V0cHV0IGNhY2hlIGludmFsaWRhdGlvbi4nKVxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHsgaGFzaDogY29udGVudEhhc2gsIG91dHB1dFBhdGhzIH0pLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBDb21tb24gYnVpbGQgb3V0cHV0IGRpcmVjdG9yaWVzIHVzZWQgYWNyb3NzIG9yZyBwcm9qZWN0cyAodmluZXh0L2J1aWxkLXRzIGVtaXQgZGlzdCxcbi8vIE5leHQuanMgZW1pdHMgLm5leHQsIENSQS1zdHlsZSBhcHBzIGVtaXQgYnVpbGQsIGBuZXh0IGV4cG9ydGAgZW1pdHMgb3V0KS5cbmNvbnN0IGRlZmF1bHRPdXRwdXRDYW5kaWRhdGVzID0gWydkaXN0JywgJ2J1aWxkJywgJy5uZXh0JywgJ291dCddO1xuXG5mdW5jdGlvbiBnZXRFeHBsaWNpdE91dHB1dFBhdGhzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBhcmd2Lm91dHB1dD8ubGVuZ3RoID8gYXJndi5vdXRwdXQubWFwKFN0cmluZykgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRldGVjdEV4aXN0aW5nRGVmYXVsdE91dHB1dFBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FuZGlkYXRlcy5maWx0ZXIoKG91dHB1dFBhdGgpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgb3V0cHV0UGF0aCkpKTtcbn1cblxuLyoqIEFuIGAtLW91dHB1dGAgdmFsdWUgbWF5IG5hbWUgYSBmaWxlLCBzbyBtYXRjaCB0aGUgZXhhY3QgcGF0aCBhcyB3ZWxsIGFzIGRlc2NlbmRhbnRzLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc091dHB1dFBhdGgob3V0cHV0UGF0aHM6IHN0cmluZ1tdLCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBvdXRwdXRQYXRocy5zb21lKChvdXRwdXRQYXRoKSA9PiBmaWxlUGF0aCA9PT0gb3V0cHV0UGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke291dHB1dFBhdGh9L2ApKTtcbn1cblxuLyoqIFRoZSBIRUFEIGNvbW1pdCBoYXNoLCBvciB1bmRlZmluZWQgb24gYW4gdW5ib3JuIEhFQUQgKGEgcmVwbyB3aXRob3V0IGNvbW1pdHMpLiAqL1xuZnVuY3Rpb24gZ2V0R2l0Q29tbWl0SGFzaChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsncmV2LXBhcnNlJywgJy0tdmVyaWZ5JywgJ0hFQUQnXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgc3RkaW86ICdwaXBlJyxcbiAgfSk7XG4gIHJldHVybiByZXQuc3RhdHVzID09PSAwID8gcmV0LnN0ZG91dC50cmltKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgY29tbWl0SGFzaDogc3RyaW5nXG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICAvLyBUaGUgaW52b2tlZCBidWlsZCBjb21tYW5kIGlzIHBhcnQgb2YgdGhlIGNhY2hlIGlkZW50aXR5OiBgLWMgY29tbWFuZEJgIG11c3Qgbm90IHJldXNlIGFcbiAgLy8gY2FjaGUgcmVjb3JkZWQgZm9yIGNvbW1hbmRBIHdpdGggb3RoZXJ3aXNlIHVuY2hhbmdlZCBpbnB1dHMuXG4gIGhhc2gudXBkYXRlKGFyZ3YuY29tbWFuZCA/PyAnJyk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50ID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIGNvbnN0IGNhY2hlID0gcGFyc2VCdWlsZENhY2hlKGNhY2hlZENvbnRlbnQpO1xuICBpZiAoY2FjaGU/Lmhhc2ggIT09IGNvbnRlbnRIYXNoKSByZXR1cm4gW2ZhbHNlLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG5cbiAgLy8gVGhlIGNhY2hlIGlzIHZhbGlkIG9ubHkgd2hpbGUgdGhlIHJlY29yZGVkIChvciBleHBsaWNpdGx5IHJlcXVlc3RlZCkgYnVpbGQgb3V0cHV0cyBzdGlsbFxuICAvLyBleGlzdDogYSBkZWxldGVkIG91dHB1dCBkaXJlY3RvcnkgKGUuZy4gYHJtIC1yZiBkaXN0YCkgbXVzdCB0cmlnZ2VyIGEgcmVidWlsZCBldmVuIHdoZW4gdGhlXG4gIC8vIGlucHV0cyBhcmUgdW5jaGFuZ2VkIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85ODEpLlxuICBjb25zdCByZXF1aXJlZE91dHB1dFBhdGhzID0gZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBjYWNoZS5vdXRwdXRQYXRocztcbiAgY29uc3QgbWlzc2luZ091dHB1dFBhdGhzID0gcmVxdWlyZWRPdXRwdXRQYXRocy5maWx0ZXIoXG4gICAgKG91dHB1dFBhdGgpID0+ICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIG91dHB1dFBhdGgpKVxuICApO1xuICBpZiAobWlzc2luZ091dHB1dFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KGBSZWJ1aWxkaW5nIGJlY2F1c2UgYnVpbGQgb3V0cHV0cyBhcmUgbWlzc2luZzogJHttaXNzaW5nT3V0cHV0UGF0aHMuam9pbignLCAnKX1gKSk7XG4gICAgcmV0dXJuIFtmYWxzZSwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xuICB9XG4gIHJldHVybiBbdHJ1ZSwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5mdW5jdGlvbiBwYXJzZUJ1aWxkQ2FjaGUoY2FjaGVkQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogeyBoYXNoOiBzdHJpbmc7IG91dHB1dFBhdGhzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjYWNoZWRDb250ZW50KSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjYWNoZWRDb250ZW50KSBhcyB7IGhhc2g/OiB1bmtub3duOyBvdXRwdXRQYXRocz86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHBhcnNlZD8uaGFzaCAhPT0gJ3N0cmluZycpIHJldHVybjtcbiAgICBjb25zdCBvdXRwdXRQYXRocyA9IEFycmF5LmlzQXJyYXkocGFyc2VkLm91dHB1dFBhdGhzKVxuICAgICAgPyBwYXJzZWQub3V0cHV0UGF0aHMuZmlsdGVyKChwKSA9PiB0eXBlb2YgcCA9PT0gJ3N0cmluZycpXG4gICAgICA6IFtdO1xuICAgIHJldHVybiB7IGhhc2g6IHBhcnNlZC5oYXNoLCBvdXRwdXRQYXRocyB9O1xuICB9IGNhdGNoIHtcbiAgICAvLyBBIGxlZ2FjeSBjYWNoZSBmaWxlIGNvbnRhaW5zIGEgcmF3IGNvbnRlbnQgaGFzaCB3aXRob3V0IG91dHB1dCByZWNvcmRzLiBUcmVhdCBpdCBhcyBhIG1pc3M6XG4gICAgLy8gaG9ub3JpbmcgaXQgd291bGQgbGV0IGEgbWF0Y2hpbmcgaGFzaCBza2lwIGEgYnVpbGQgd2hvc2Ugb3V0cHV0cyB3ZXJlIGRlbGV0ZWQsIGFuZCBvbmVcbiAgICAvLyByZWJ1aWxkIHVwZ3JhZGVzIHRoZSByZWNvcmQgdG8gdGhlIEpTT04gZm9ybWF0LlxuICAgIHJldHVybjtcbiAgfVxufVxuXG4vLyBNYXRjaGVkIGFzIGNvbXBsZXRlIHBhdGggU0VHTUVOVFMgKG5vdCBzdWJzdHJpbmdzKTogYHNyYy9jb250ZXN0L2AgbXVzdCBub3QgYmUgZXhjbHVkZWQgYnlcbi8vIGB0ZXN0YCwgYW5kIGBteXNyYy9gIG11c3Qgbm90IGJlIGluY2x1ZGVkIGJ5IGBzcmNgLlxuY29uc3QgaW5jbHVkZURpck5hbWVzID0gbmV3IFNldChbJ3NyYycsICdwdWJsaWMnXSk7XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG4gICdidW4ubG9jaycsXG4gICdidW4ubG9ja2InLFxuXTtcbmNvbnN0IGV4Y2x1ZGVEaXJOYW1lcyA9IG5ldyBTZXQoWyd0ZXN0JywgJ3Rlc3RzJywgJ19fdGVzdHNfXycsICd0ZXN0LWZpeHR1cmVzJ10pO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAvLyBgLXVhbGxgIGxpc3RzIHVudHJhY2tlZCBmaWxlcyBpbmRpdmlkdWFsbHkgKG5vdCBqdXN0IHRoZWlyIGRpcmVjdG9yeSksIHNvIG5ldyBmaWxlcyBpbiBhXG4gICAgLy8gYnJhbmQtbmV3IHNvdXJjZSBkaXJlY3RvcnkgcGFydGljaXBhdGUgaW4gdGhlIGhhc2ggYmVsb3cuIGAtemAgeWllbGRzIE5VTC1kZWxpbWl0ZWQsXG4gICAgLy8gVU5RVU9URUQgcmVjb3Jkczogd2l0aG91dCBpdCBnaXQgQy1xdW90ZXMgbm9uLUFTQ0lJIHBhdGhzLCB3aGljaCB3b3VsZCBzaWxlbnRseSBkcm9wIHRob3NlXG4gICAgLy8gZmlsZXMgZnJvbSBib3RoIHRoZSB1bnRyYWNrZWQgaGFzaGluZyBhbmQgdGhlIGBnaXQgZGlmZmAgcGF0aHNwZWNzLlxuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ3N0YXR1cycsICctLXBvcmNlbGFpbicsICctdWFsbCcsICcteiddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCB0b2tlbnMgPSByZXQuc3Rkb3V0LnNwbGl0KCdcXDAnKS5maWx0ZXIoKHRva2VuKSA9PiB0b2tlbi5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBzdGF0dXNFbnRyaWVzOiB7IHVudHJhY2tlZDogYm9vbGVhbjsgZmlsZVBhdGg6IHN0cmluZyB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG9rZW5zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdITtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRva2VuLnNsaWNlKDAsIDIpO1xuICAgICAgc3RhdHVzRW50cmllcy5wdXNoKHsgdW50cmFja2VkOiBzdGF0dXMgPT09ICc/PycsIGZpbGVQYXRoOiB0b2tlbi5zbGljZSgzKSB9KTtcbiAgICAgIC8vIFJlbmFtZS9jb3B5IHJlY29yZHMgY2FycnkgdGhlIE9SSUdJTkFMIHBhdGggYXMgYW4gZXh0cmEgTlVMLWRlbGltaXRlZCBmaWVsZDsgaW5jbHVkZSBpdFxuICAgICAgLy8gc28gYSBmaWxlIHJlbmFtZWQgb3V0IG9mIHRoZSBidWlsZCBpbnB1dHMgc3RpbGwgaW52YWxpZGF0ZXMgdGhlIGNhY2hlLlxuICAgICAgaWYgKHN0YXR1cy5pbmNsdWRlcygnUicpIHx8IHN0YXR1cy5pbmNsdWRlcygnQycpKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUGF0aCA9IHRva2Vuc1srK2luZGV4XTtcbiAgICAgICAgaWYgKG9yaWdpbmFsUGF0aCkgc3RhdHVzRW50cmllcy5wdXNoKHsgdW50cmFja2VkOiBmYWxzZSwgZmlsZVBhdGg6IG9yaWdpbmFsUGF0aCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZEVudHJpZXMgPSBzdGF0dXNFbnRyaWVzLm1hcCgoZW50cnkpID0+ICh7XG4gICAgICAuLi5lbnRyeSxcbiAgICAgIGhhc2hQYXRoOlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0J1xuICAgICAgICAgID8gZW50cnkuZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC93YlxcL3Rlc3RcXC9maXh0dXJlc1xcL1teL10rXFwvLywgJycpXG4gICAgICAgICAgOiBlbnRyeS5maWxlUGF0aCxcbiAgICB9KSk7XG4gICAgLy8gQnVpbGQgT1VUUFVUUyBtdXN0IG5ldmVyIGNvdW50IGFzIGJ1aWxkIGlucHV0czogaGFzaGluZyBlLmcuIGFuIHVudHJhY2tlZCBkaXN0LyBmaWxlIHdvdWxkXG4gICAgLy8gY2hhbmdlIHRoZSBoYXNoIG9uIGV2ZXJ5IGJ1aWxkIGFuZCBkaXNhYmxlIHRoZSBjYWNoZSBwZXJtYW5lbnRseS5cbiAgICBjb25zdCBwcm9qZWN0UmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LnJvb3REaXJQYXRoLCBwcm9qZWN0LmRpclBhdGgpO1xuICAgIGNvbnN0IGV4cGxpY2l0T3V0cHV0UGF0aHMgPSAoZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBbXSkubWFwKChvdXRwdXRQYXRoKSA9PlxuICAgICAgcGF0aC5qb2luKHByb2plY3RSZWxhdGl2ZURpclBhdGgsIG91dHB1dFBhdGgpXG4gICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEVudHJpZXMgPSBub3JtYWxpemVkRW50cmllcy5maWx0ZXIoKHsgZmlsZVBhdGgsIGhhc2hQYXRoIH0pID0+IHtcbiAgICAgIGNvbnN0IGRpcmVjdG9yeVNlZ21lbnRzID0gaGFzaFBhdGguc3BsaXQoJy8nKS5zbGljZSgwLCAtMSk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoZGlyZWN0b3J5U2VnbWVudHMuc29tZSgoc2VnbWVudCkgPT4gaW5jbHVkZURpck5hbWVzLmhhcyhzZWdtZW50KSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gaGFzaFBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFkaXJlY3RvcnlTZWdtZW50cy5zb21lKChzZWdtZW50KSA9PiBleGNsdWRlRGlyTmFtZXMuaGFzKHNlZ21lbnQpKSAmJlxuICAgICAgICAvLyBPbmx5IEVYUExJQ0lUTFkgZGVjbGFyZWQgb3V0cHV0cyBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgaW5wdXQgaGFzaC4gRGVmYXVsdCBjYW5kaWRhdGVzXG4gICAgICAgIC8vIChkaXN0L2J1aWxkLy5uZXh0L291dCkgYXJlIE5PVDogZ2l0aWdub3JlZCBhcnRpZmFjdHMgbmV2ZXIgYXBwZWFyIGluIGBnaXQgc3RhdHVzYFxuICAgICAgICAvLyBhbnl3YXksIGFuZCBhIG5vbi1pZ25vcmVkIGZpbGUgdGhlcmUgbWF5IGJlIGdlbnVpbmUgc291cmNlIChlLmcuIGJ1aWxkLyBzY3JpcHRzKSwgd2hvc2VcbiAgICAgICAgLy8gY2hhbmdlcyBtdXN0IGludmFsaWRhdGUgdGhlIGNhY2hlIOKAlCBjb3JyZWN0bmVzcyBvdmVyIGNhY2hlIGhpdHMuIFByb2plY3RzIGtlZXBpbmdcbiAgICAgICAgLy8gbm9uLWlnbm9yZWQgYXJ0aWZhY3RzIGluIHRob3NlIGRpcmVjdG9yaWVzIHNob3VsZCBnaXRpZ25vcmUgdGhlbSBvciBwYXNzIC0tb3V0cHV0LlxuICAgICAgICAhbWF0Y2hlc091dHB1dFBhdGgoZXhwbGljaXRPdXRwdXRQYXRocywgZmlsZVBhdGgpXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkuaGFzaFBhdGgpLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gVW50cmFja2VkIGZpbGVzIG5ldmVyIGFwcGVhciBpbiBgZ2l0IGRpZmZgLCBzbyBoYXNoIHRoZWlyIGNvbnRlbnRzIGRpcmVjdGx5LlxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZmlsdGVyZWRFbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnVudHJhY2tlZCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhc2gudXBkYXRlKGVudHJ5Lmhhc2hQYXRoKTtcbiAgICAgICAgaGFzaC51cGRhdGUoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCBlbnRyeS5maWxlUGF0aCkpKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgZmlsZSBtYXkgdmFuaXNoIGNvbmN1cnJlbnRseTsgdGhlIHRyYWNrZWQtc3RhdGUgZGlmZiBiZWxvdyBpcyB1bmFmZmVjdGVkLlxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrZWRQYXRocyA9IGZpbHRlcmVkRW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiAhZW50cnkudW50cmFja2VkKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5oYXNoUGF0aCk7XG4gICAgaWYgKHRyYWNrZWRQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIGBnaXQgZGlmZiBIRUFEIC0tYCB3aXRoIG5vIHBhdGhzcGVjIHdvdWxkIGRpZmYgRVZFUlkgZmlsZSwgbGV0dGluZyBleGNsdWRlZCBjaGFuZ2VzXG4gICAgICAvLyAoZG9jcywgdGVzdHMpIGludmFsaWRhdGUgdGhlIGNhY2hlLlxuICAgICAgcmVzb2x2ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBgZ2l0IGRpZmYgSEVBRGAgKG5vdCBwbGFpbiBgZ2l0IGRpZmZgKSBzbyBzdGFnZWQtb25seSBjaGFuZ2VzIGludmFsaWRhdGUgdGhlIGNhY2hlIHRvbztcbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGguXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICdIRUFEJywgJy0tJywgLi4udHJhY2tlZFBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgb25TaWduYWw/OiAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHZvaWQ7XG4gIG9taXRTaWxlbnRTdGFydD86IGJvb2xlYW47XG4gIHByZXNlcnZlQ29sb3I/OiBib29sZWFuO1xuICBwcm9jZXNzU2lsZW50T3V0cHV0PzogKG91dHB1dDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHByaW50UmF3T3V0cHV0PzogYm9vbGVhbjtcbiAgcHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5PzogYm9vbGVhbjtcbiAgc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zPzogbnVtYmVyO1xuICBzaWxlbnRTdWNjZXNzTWVzc2FnZT86IHN0cmluZztcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gIGV4aXRJZkZhaWxlZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVmZmVyZWRSdW5SZXN1bHQge1xuICBleGl0Q29kZTogbnVtYmVyO1xuICBvdXRwdXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+ICYgeyBzaWxlbnQ/OiBib29sZWFuIH0sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBpZiAoIShhcmd2LnNpbGVudCAmJiBvcHRzLm9taXRTaWxlbnRTdGFydCAmJiAhYXJndi5kcnlSdW4pKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgYXJndi5zaWxlbnQgPyAnQ29tbWFuZCcgOiAnU3RhcnQnKTtcbiAgfVxuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3Qgc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCA9IEJvb2xlYW4oXG4gICAgYXJndi5zaWxlbnQgJiYgKG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dCA/PyBvcHRzLnByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSlcbiAgKTtcbiAgbGV0IHdyb3RlU2lsZW50UHJvZ3Jlc3MgPSBmYWxzZTtcbiAgY29uc3QgcHJvZ3Jlc3NUaW1lciA9XG4gICAgYXJndi5zaWxlbnQgJiYgb3B0cy5zaWxlbnRQcm9ncmVzc0ludGVydmFsTXNcbiAgICAgID8gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcuJyk7XG4gICAgICAgICAgd3JvdGVTaWxlbnRQcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIH0sIG9wdHMuc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IChhcmd2LnNpbGVudCA/IHRydWUgOiB1bmRlZmluZWQpIH0pLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiBhcmd2LnNpbGVudCA/ICdwaXBlJyA6ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgbWVyZ2VPdXRBbmRFcnJvcjogc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHByaW50aW5nU3Rkb3V0OiBhcmd2LnNpbGVudCAmJiAhc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgb21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nOiBhcmd2LnNpbGVudCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgIGlmIChwcm9ncmVzc1RpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHByb2dyZXNzVGltZXIpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICBpZiAod3JvdGVTaWxlbnRQcm9ncmVzcykge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxuICBpZiAoc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCAmJiAoIW9wdHMucHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5IHx8IGV4aXRDb2RlICE9PSAwKSkge1xuICAgIGNvbnN0IG91dHB1dCA9IChvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQgPyBvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQocmV0LnN0ZG91dCkgOiByZXQuc3Rkb3V0KS50cmltKCk7XG4gICAgaWYgKG91dHB1dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFyZ3Yuc2lsZW50ICYmIGV4aXRDb2RlID09PSAwICYmIG9wdHMuc2lsZW50U3VjY2Vzc01lc3NhZ2UpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4ob3B0cy5zaWxlbnRTdWNjZXNzTWVzc2FnZSkpO1xuICB9XG4gIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgZXhpdENvZGUsIG9wdHMsIHsgc2lsZW50U3VjY2VzczogYXJndi5zaWxlbnQgfSk7XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChwYXJhbGxlbCknLCB0cnVlKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IHRydWUgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHByaW50aW5nU3Rkb3V0OiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgcHJpbnRpbmdTdGRlcnI6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSByZXQuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAob3V0ICYmICFvcHRzLnByaW50UmF3T3V0cHV0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8QnVmZmVyZWRSdW5SZXN1bHQ+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICAgIG91dHB1dDogJycsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyB0cnVlIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICByZXR1cm4ge1xuICAgICAgZXhpdENvZGU6IHJldC5zdGF0dXMgPz8gMSxcbiAgICAgIG91dHB1dDogcmV0LnN0ZG91dCxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHsgcHJpbnRhYmxlOiBzdHJpbmc7IHJ1bm5hYmxlOiBzdHJpbmcgfSB7XG4gIC8vIE5vIGAtLWJ1bmA6IGl0cyBub2RlLT5idW4gUEFUSCBzaGltIGxlYWtzIGludG8gZXZlcnkgY2hpbGQgcHJvY2VzcyBhbmQgYnJlYWtzIHRvb2xzIHJlcXVpcmluZ1xuICAvLyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpLlxuICBjb25zdCBwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVuID0gcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKC9QUklTTUEgZ2VuZXJhdGUoPyFcXHMrLS1uby1oaW50cykoPz1cXHN8JCkvZ3UsICdQUklTTUEgZ2VuZXJhdGUgLS1uby1oaW50cycpXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOIHJ1biAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiBydW4gJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1bikgcnVuYC5cbiAgICAucmVwbGFjZUFsbCgnWUFSTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ3lhcm4gcnVuICcpO1xuICBpZiAocHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIpIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIGJ1aWxkLXRzIHJ1bicsICdidW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdidW4gcnVuIGJ1biBydW4nLCAnYnVuIHJ1bicpXG4gICAgICAvLyBCZWNhdXNlIGJ1biBjYW4gcnVuIHNyYy9pbmRleC50cyBkaXJlY3RseS5cbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGApO1xuICBjb25zdCBydW5uYWJsZVNjcmlwdCA9IG5ld1NjcmlwdFxuICAgIC8vIEtlZXAgUGxheXdyaWdodCBhcyBhIHBhY2thZ2UtbWFuYWdlciBjb21tYW5kIGluc3RlYWQgb2YgcmVzb2x2aW5nIGl0IHRocm91Z2ggbm9kZV9tb2R1bGVzLy5iaW4uXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIXByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKTtcbiAgcmV0dXJuIHtcbiAgICBwcmludGFibGU6IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiAtLSAke3ByaW50YWJsZVNjcmlwdH1gLFxuICAgIHJ1bm5hYmxlOiBydW5uYWJsZVNjcmlwdCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPixcbiAgcHJpbnRPcHRpb25zOiB7IHNpbGVudFN1Y2Nlc3M/OiBib29sZWFuIH0gPSB7fVxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGlmIChwcmludE9wdGlvbnMuc2lsZW50U3VjY2VzcykgcmV0dXJuO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVFbnYoXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgb3B0czogT3B0aW9uc1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5ld0VudiA9IHsgLi4uZW52IH07XG4gIGlmIChvcHRzLmNpKSB7XG4gICAgbmV3RW52LkNJID0gJzEnO1xuICB9XG4gIGNvbmZpZ3VyZUNvbG9yRW52KG5ld0Vudiwgb3B0cy5wcmVzZXJ2ZUNvbG9yKTtcbiAgcmV0dXJuIG5ld0Vudjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIGNoaWxkLXByb2Nlc3MgY29sb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB3Yi1tYW5hZ2VkIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gZW52IFRoZSBjaGlsZC1wcm9jZXNzIGVudmlyb25tZW50IHRvIG11dGF0ZS5cbiAqIEBwYXJhbSBwcmVzZXJ2ZUNvbG9yIFdoZXRoZXIgd2Igc2hvdWxkIHByZXNlcnZlIGNvbG9ycyBmb3Igb3V0cHV0IHRoYXQgaXQgY2FwdHVyZXMgYW5kIHJlcHJpbnRzIHRvIGFuIGludGVyYWN0aXZlIFRUWS5cbiAqL1xuZnVuY3Rpb24gY29uZmlndXJlQ29sb3JFbnYoZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBwcmVzZXJ2ZUNvbG9yPzogYm9vbGVhbik6IHZvaWQge1xuICBpZiAoZW52Lk5PX0NPTE9SICE9PSB1bmRlZmluZWQgfHwgcHJlc2VydmVDb2xvciA9PT0gZmFsc2UpIHtcbiAgICAvLyBOT19DT0xPUiBhbmQgcHJlc2VydmVDb2xvcj1mYWxzZSBhcmUgZXhwbGljaXQgbm8tY29sb3IgY2hvaWNlcywgc28gaW5oZXJpdGVkIEZPUkNFX0NPTE9SIG11c3Qgbm90IGxlYWsgdGhyb3VnaC5cbiAgICBkZWxldGUgZW52LkZPUkNFX0NPTE9SO1xuICB9IGVsc2UgaWYgKHByZXNlcnZlQ29sb3IgJiYgcHJvY2Vzcy5zdGRvdXQuaXNUVFkpIHtcbiAgICBlbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGNoZWNrRW52QnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgY2hlY2tFbnZDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBjaGVja0VudkJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY2hlY2stZW52JyxcbiAgZGVzY3JpYmU6XG4gICAgJ1ZlcmlmeSB0aGF0IGV2ZXJ5IGZub3gtZGVjbGFyZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHNlY3JldCByZXNvbHZlcyBmb3IgdGhlIGN1cnJlbnQgV0JfRU5WLiBQcmVmaXggc2NyaXB0cyB0aGF0IHdyaXRlIHRvIHJlbW90ZSBlbnZpcm9ubWVudHMgd2l0aCB0aGlzIGNvbW1hbmQgdG8gZmFpbCBmYXN0IG9uIG1pc3Npbmcgc2VjcmV0cy4nLFxuICBidWlsZGVyOiBjaGVja0VudkJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGNoZWNrRW52KGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrRW52KFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgY2hlY2tFbnZCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICBjb25zb2xlLmluZm8oJ05vIGZub3gudG9tbCBmb3VuZDsgbm90aGluZyB0byBjaGVjay4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSZWFkaW5nIHByb2plY3QuZW52IHJlc29sdmVzIGFuZCB2YWxpZGF0ZXMgV0JfRU5WIChjb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYpLCBzbyB0aGUgcHJvZmlsZVxuICAvLyBiZWxvdyBpcyB0aGUgc2FtZSBvbmUgZXZlcnkgb3RoZXIgd2IgY29tbWFuZCB3b3VsZCBsb2FkLlxuICBjb25zdCBwcm9maWxlID0gcHJvamVjdC5lbnYuV0JfRU5WIHx8ICdkZXZlbG9wbWVudCc7XG4gIC8vIGAtLWlmLW1pc3NpbmcgZXJyb3JgIG1ha2VzIHVucmVzb2x2YWJsZSBzZWNyZXRzIChlLmcuIGEgbWlzc2luZyBhZ2UgaWRlbnRpdHkpIGEgaGFyZCBmYWlsdXJlLFxuICAvLyB1bmxpa2UgdGhlIHRvbGVyYW50IGRlZmF1bHQgdXNlZCBmb3Igb3JkaW5hcnkgZW52IGxvYWRpbmcuXG4gIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgIGBmbm94IGV4cG9ydCAtLWFsbCAtLWZvcm1hdCBqc29uIC0tbm8tZGFlbW9uIC0taWYtbWlzc2luZyBlcnJvciAtLXByb2ZpbGUgJHtwcm9maWxlfSA+IC9kZXYvbnVsbGAsXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBGYWlsZWQgdG8gcmVzb2x2ZSBmbm94LWRlY2xhcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgcHJvZmlsZSBcIiR7cHJvZmlsZX1cIi5gKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICBjb25zb2xlLmluZm8oYEFsbCBmbm94LWRlY2xhcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyByZXNvbHZlIGZvciBwcm9maWxlIFwiJHtwcm9maWxlfVwiLmApO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYsIG5vcm1hbGl6ZVNjcmlwdCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBGT1JDRV9LSUxMX0RFTEFZX01TID0gNTAwMDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2tpbGwtb3RoZXJzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGV4aXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdraWxsLW90aGVycy1vbi1mYWlsJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGZhaWxzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHN1Y2Nlc3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RlZmluZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gY3JpdGVyaWEnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFsnYWxsJywgJ2ZpcnN0J10sXG4gICAgZGVmYXVsdDogJ2FsbCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ29tbWFuZHMgdG8gcnVuIGNvbmN1cnJlbnRseScsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmludGVyZmFjZSBSdW5Db25jdXJyZW50bHlPcHRpb25zIHtcbiAgY29tbWFuZHM6IHN0cmluZ1tdO1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBraWxsT3RoZXJzOiBib29sZWFuO1xuICBraWxsT3RoZXJzT25GYWlsOiBib29sZWFuO1xuICBzdWNjZXNzOiAnYWxsJyB8ICdmaXJzdCc7XG4gIGNpPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmN1cnJlbnRseUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdjb25jdXJyZW50bHkgPGNvbW1hbmRzLi4uPicsXG4gIGRlc2NyaWJlOiAnUnVuIGNvbW1hbmRzIGNvbmN1cnJlbnRseScsXG4gIGJ1aWxkZXI6IHsgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsIC4uLmJ1aWxkZXIsIC4uLmFyZ3VtZW50c0J1aWxkZXIgfSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1hbmRzID0gKGFyZ3YuY29tbWFuZHMgPz8gW10pLm1hcChTdHJpbmcpLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAoY29tbWFuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gY29tbWFuZHMgcHJvdmlkZWQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bkNvbmN1cnJlbnRseSh7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBraWxsT3RoZXJzOiBhcmd2LmtpbGxPdGhlcnMgPz8gZmFsc2UsXG4gICAgICAgIGtpbGxPdGhlcnNPbkZhaWw6IGFyZ3Yua2lsbE90aGVyc09uRmFpbCA/PyBmYWxzZSxcbiAgICAgICAgc3VjY2VzczogYXJndi5zdWNjZXNzLFxuICAgICAgICBjaTogdHlwZW9mIGFyZ3YuY2kgPT09ICdib29sZWFuJyA/IGFyZ3YuY2kgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Db25jdXJyZW50bHkob3B0aW9uczogUnVuQ29uY3VycmVudGx5T3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGNoaWxkcmVuID0gb3B0aW9ucy5jb21tYW5kcy5tYXAoKGNvbW1hbmQpID0+XG4gICAgY2hpbGRfcHJvY2Vzcy5zcGF3bihub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgb3B0aW9ucy5wcm9qZWN0KS5ydW5uYWJsZSwge1xuICAgICAgY3dkOiBvcHRpb25zLnByb2plY3QuZGlyUGF0aCxcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYob3B0aW9ucy5wcm9qZWN0LmVudiwgeyBjaTogb3B0aW9ucy5jaSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KVxuICApO1xuXG4gIGxldCBzdG9wcGluZyA9IGZhbHNlO1xuICBsZXQgaW50ZXJydXB0ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBsZXQgZmlyc3RSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0b3BSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZm9yY2VLaWxsUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBjb25zdCByZXN1bHRzID0gQXJyYXkuZnJvbTxudW1iZXIgfCB1bmRlZmluZWQ+KHsgbGVuZ3RoOiBjaGlsZHJlbi5sZW5ndGggfSk7XG4gIGNvbnN0IHdhaXRGb3JFeGl0UHJvbWlzZXMgPSBjaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHNldHRsZSA9IChleGl0Q29kZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG5cbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0gZXhpdENvZGU7XG4gICAgICAgIGZpcnN0UmVzdWx0ID8/PSBleGl0Q29kZTtcblxuICAgICAgICBpZiAoIXN0b3BwaW5nICYmIHNob3VsZFN0b3BPdGhlcnMoZXhpdENvZGUsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgc3RvcFJlc3VsdCA9IGV4aXRDb2RlO1xuICAgICAgICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICAgICAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCAnU0lHVEVSTScpKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgICAgIHNldHRsZSgxKTtcbiAgICAgIH0pO1xuICAgICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgc2V0dGxlKGdldEV4aXRDb2RlKGNvZGUgPz8gdW5kZWZpbmVkLCBzaWduYWwgPz8gdW5kZWZpbmVkKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3Qgc3RvcEFsbCA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgaW50ZXJydXB0ZWRTaWduYWwgPz89IHNpZ25hbDtcbiAgICBpZiAoc3RvcHBpbmcpIHJldHVybjtcblxuICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCBzaWduYWwpKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lnaW50ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR0lOVCcpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWd0ZXJtID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1RFUk0nKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lncXVpdCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdRVUlUJyk7XG4gIH07XG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgcHJvY2Vzcy5vbignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB0cnkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3JFeGl0UHJvbWlzZXMpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGZvcmNlS2lsbFByb21pc2VzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIH1cblxuICBpZiAoaW50ZXJydXB0ZWRTaWduYWwpIHtcbiAgICByZXR1cm4gZ2V0RXhpdENvZGUodW5kZWZpbmVkLCBpbnRlcnJ1cHRlZFNpZ25hbCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnKSB7XG4gICAgcmV0dXJuIGZpcnN0UmVzdWx0ID8/IDE7XG4gIH1cbiAgaWYgKHN0b3BSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdG9wUmVzdWx0O1xuICB9XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpdENvZGUoY29kZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjb2RlO1xuICB9XG4gIGlmIChzaWduYWwgJiYgc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSB7XG4gICAgcmV0dXJuIDEyOCArIGNvbnN0YW50cy5zaWduYWxzW3NpZ25hbF07XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN0b3BPdGhlcnMoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIG9wdGlvbnM6IFBpY2s8UnVuQ29uY3VycmVudGx5T3B0aW9ucywgJ2tpbGxPdGhlcnMnIHwgJ2tpbGxPdGhlcnNPbkZhaWwnIHwgJ3N1Y2Nlc3MnPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcgfHwgb3B0aW9ucy5raWxsT3RoZXJzIHx8IChvcHRpb25zLmtpbGxPdGhlcnNPbkZhaWwgJiYgZXhpdENvZGUgIT09IDApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmb3JjZUtpbGxQaWRzID0gc2lnbmFsUGlkcyh0b0NoaWxkUGlkcyhjaGlsZHJlbiksIHNpZ25hbCk7XG4gIGlmIChmb3JjZUtpbGxQaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGlmIChhd2FpdCB3YWl0Rm9yRm9yY2VLaWxsKGZvcmNlS2lsbFBpZHMpKSB7XG4gICAgc2lnbmFsUGlkcyhmb3JjZUtpbGxQaWRzLCAnU0lHS0lMTCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRQaWRzKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdKTogbnVtYmVyW10ge1xuICByZXR1cm4gY2hpbGRyZW4uZmxhdE1hcCgoY2hpbGQpID0+IChjaGlsZC5waWQgPT09IHVuZGVmaW5lZCA/IFtdIDogW2NoaWxkLnBpZF0pKTtcbn1cblxuZnVuY3Rpb24gc2lnbmFsUGlkcyhwaWRzOiByZWFkb25seSBudW1iZXJbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IG51bWJlcltdIHtcbiAgY29uc3Qgc2lnbmFsZWRQaWRzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBpZCBvZiBwaWRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICgha2lsbFByb2Nlc3NHcm91cChwaWQsIHNpZ25hbCkpIGNvbnRpbnVlO1xuXG4gICAgICBzaWduYWxlZFBpZHMucHVzaChwaWQpO1xuICAgICAgdHJlZUtpbGwocGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBraWxsIGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2lnbmFsZWRQaWRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yRm9yY2VLaWxsKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEZPUkNFX0tJTExfREVMQVlfTVM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICBpZiAocGlkcy5ldmVyeShpc1Byb2Nlc3NHcm91cEdvbmUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCBzbGVlcChNYXRoLm1pbigxMDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSkpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1Byb2Nlc3NHcm91cEdvbmUocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgMCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG5mdW5jdGlvbiBraWxsUHJvY2Vzc0dyb3VwKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsIHNpZ25hbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5jb25zdCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUgPSAnbGl0ZXN0cmVhbS55bWwnO1xuY29uc3QgREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4sIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnUGF0aCkgcmV0dXJuIGAtY29uZmlnIFwiJHtjb25maWdQYXRofVwiYDtcblxuICBjb25zdCBsb2NhbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbENvbmZpZ1BhdGgpKSByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xuICBpZiAoZnMuZXhpc3RzU3luYyhERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgpKSByZXR1cm4gYC1jb25maWcgJHtERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEh9YDtcbiAgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aCwgaXNQcm9qZWN0RW52aXJvbm1lbnQsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgeyBidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQsIGdldEQxRGF0YWJhc2VOYW1lLCBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgeyBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uIH0gZnJvbSAnLi9saXRlc3RyZWFtLmpzJztcblxuY2xhc3MgRHJpenpsZVNjcmlwdHMge1xuICBjbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0LCAnY2xlYW51cC1saXRlc3RyZWFtJyk7XG4gICAgY29uc3Qgd2FsQ2hlY2twb2ludENvbW1hbmQgPSBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF0gJiYgY29tbWFuZCAtdiBzcWxpdGUzID4vZGV2L251bGw7IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBzcWxpdGUzIFwiJHtkYlBhdGh9XCI7IGZpYDtcbiAgICByZXR1cm4gYCR7d2FsQ2hlY2twb2ludENvbW1hbmR9OyBybSAtZiBcIiR7ZGJQYXRofVwiLiogXCIke2RiUGF0aH1cIi0qOyBybSAtUmYgXCIke3BhdGguZGlybmFtZShkYlBhdGgpfS8uJHtwYXRoLmJhc2VuYW1lKGRiUGF0aCl9XCIqIHx8IHRydWVgO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3QgZDFEYXRhYmFzZU5hbWUgPSBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0KTtcbiAgICBpZiAoZDFEYXRhYmFzZU5hbWUpIHtcbiAgICAgIC8vIFJlbW92ZSBvbmx5IHRoZSBEMSBzdWJ0cmVlIHNvIHRoYXQgb3RoZXIgbG9jYWxseS1wZXJzaXN0ZWQgYmluZGluZ3MgKEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzKSBzdXJ2aXZlLFxuICAgICAgLy8gdGhlbiByZS1tYXRlcmlhbGl6ZSB0aGUgRDEgU1FMaXRlIGZpbGUuIEl0cyBwYXRoIGlzIGRldGVybWluaXN0aWMsIHNvIGEgREFUQUJBU0VfVVJMIGV4cG9ydGVkXG4gICAgICAvLyBiZWZvcmUgdGhlIHJlbW92YWwgc3RheXMgdmFsaWQuXG4gICAgICByZXR1cm4gYHJtIC1SZiBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfS92My9kMVwiICYmICR7YnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kKHByb2plY3QsIGQxRGF0YWJhc2VOYW1lKX0gJiYgJHt0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcmVtb3ZlQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpO1xuICAgIGlmICghcmVtb3ZlQ29tbWFuZCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgcmVzZXQgc3VwcG9ydHMgRHJpenpsZSBvbmx5IHdoZW4gZmlsZTogREFUQUJBU0VfVVJMIGlzIHNldC4nICYmIGV4aXQgMVwiO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtyZW1vdmVDb21tYW5kfSAmJiAke3RoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyl9YDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VlZENvbW1hbmQgPSB0aGlzLnNlZWQocHJvamVjdCk7XG4gICAgY29uc3QgbWlncmF0ZUNvbW1hbmQgPSB0aGlzLmRlcGxveShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gICAgcmV0dXJuIHNlZWRDb21tYW5kID09PSAndHJ1ZScgPyBtaWdyYXRlQ29tbWFuZCA6IGAke21pZ3JhdGVDb21tYW5kfSAmJiAke3NlZWRDb21tYW5kfWA7XG4gIH1cblxuICBtaWdyYXRlRm9yU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgaWYgKGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgJiYgKGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpIHx8IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzZXQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIGRlcGxveShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgbWlncmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdkZXBsb3ktZm9yY2UnKTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiRmFtaWx5Q29tbWFuZChkYlBhdGgpO1xuICAgIGNvbnN0IGxpdGVzdHJlYW1Db25maWdPcHRpb24gPSBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QpO1xuICAgIC8vIFRoZSBlbnZpcm9ubWVudCBhc3NpZ25tZW50IG11c3QgZ28gdGhyb3VnaCBidWlsZERyaXp6bGVLaXRDb21tYW5kOiBwcmVmaXhpbmcgaXRzXG4gICAgLy8gcG9zc2libHktcGFyZW50aGVzaXplZCByZXN1bHQgd2l0aCBgQUxMT1dfVE9fU0tJUF9TRUVEPTBgIHdvdWxkIGJlIGEgc2hlbGwgc3ludGF4IGVycm9yLlxuICAgIGNvbnN0IG1pZ3JhdGVXaXRoU2VlZENvbW1hbmQgPSBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsICdtaWdyYXRlJywgJ0FMTE9XX1RPX1NLSVBfU0VFRD0wJyk7XG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07ICR7dGhpcy5kZXBsb3kocHJvamVjdCl9ICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlICR7bGl0ZXN0cmVhbUNvbmZpZ09wdGlvbn0gLW8gXCIke2RiUGF0aH1cIiBcIiR7ZGJQYXRofVwiICYmIGxzIC1haGwgXCIke2RiUGF0aH1cIiAmJiAke21pZ3JhdGVXaXRoU2VlZENvbW1hbmR9YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdsaXN0LWJhY2t1cHMnKTtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4ICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gXCIke2RiUGF0aH1cImA7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZywgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ3Jlc3RvcmUnKTtcbiAgICByZXR1cm4gYCR7YnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKG91dHB1dFBhdGgpfTsgbGl0ZXN0cmVhbSByZXN0b3JlICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gLW8gXCIke291dHB1dFBhdGh9XCIgXCIke2RiUGF0aH1cImA7XG4gIH1cblxuICBnZW5lcmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgZ2VuZXJhdGUgJHthZGRpdGlvbmFsT3B0aW9uc31gLnRyaW0oKSk7XG4gIH1cblxuICBtaWdyYXRlRGV2KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5zZWVkKSByZXR1cm4gJ1lBUk4gcnVuIHNlZWQnO1xuICAgIGNvbnN0IGRlZmF1bHRTZWVkUGF0aCA9IHBhdGguam9pbignZGInLCAnc2VlZC50cycpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRlZmF1bHRTZWVkUGF0aCkpKSB7XG4gICAgICByZXR1cm4gcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgQlVOICR7ZGVmYXVsdFNlZWRQYXRofWAgOiBgQlVOIGJ1aWxkLXRzIHJ1biAke2RlZmF1bHRTZWVkUGF0aH1gO1xuICAgIH1cbiAgICByZXR1cm4gJ3RydWUnO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHJldHVybiBcImVjaG8gJ3diIGRiIHN0dWRpbyBmb3IgRHJpenpsZSBkb2VzIG5vdCBzdXBwb3J0IGRiLXVybC1vci1wYXRoLicgJiYgZXhpdCAxXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgYHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0OiBQcm9qZWN0LCBhcmdzOiBzdHJpbmcsIGVudmlyb25tZW50QXNzaWdubWVudCA9ICcnKTogc3RyaW5nIHtcbiAgY29uc3QgY29tbWFuZCA9IGAke2Vudmlyb25tZW50QXNzaWdubWVudCAmJiBgJHtlbnZpcm9ubWVudEFzc2lnbm1lbnR9IGB9WUFSTiBkcml6emxlLWtpdCAke2FyZ3N9YDtcbiAgLy8gQSBjYWxsZXItc3VwcGxpZWQgLS1jb25maWcgcmVzb2x2ZXMgYWdhaW5zdCB0aGUgcHJvamVjdCBkaXJlY3RvcnksIHNvIHRoZSBjd2QgbXVzdCBzdGF5IHRoZXJlLlxuICByZXR1cm4gYXJncy5pbmNsdWRlcygnLS1jb25maWcnKSA/IGNvbW1hbmQgOiB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdCwgY29tbWFuZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdDogUHJvamVjdCwgY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29uZmlnID0gZmluZERyaXp6bGVDb25maWcocHJvamVjdCk7XG4gIC8vIGRyaXp6bGUta2l0IHJlc29sdmVzIHJlbGF0aXZlIHBhdGhzIGluIGl0cyBjb25maWcgYWdhaW5zdCB0aGUgY3dkLCBzbyB0aGUgY29tbWFuZCBtdXN0IHJ1blxuICAvLyBpbiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgZHJpenpsZS5jb25maWcuKiBldmVuIHdoZW4gbW9ub3JlcG8gcGFja2FnZXMgc2hhcmUgaXQgYXQgdGhlIHJvb3QuXG4gIHJldHVybiBjb25maWcgJiYgY29uZmlnLmRpclBhdGggIT09IHByb2plY3QuZGlyUGF0aFxuICAgID8gYCgke2J1aWxkU2hlbGxDb21tYW5kKFsnY2QnLCBjb25maWcuZGlyUGF0aF0pfSAmJiAke2NvbW1hbmR9KWBcbiAgICA6IGNvbW1hbmQ7XG59XG5cbi8qKlxuICogV2hldGhlciBkcml6emxlLWtpdCBpcyB0aGUgcHJvamVjdCdzIEQxIG1pZ3JhdGlvbiBtZWNoYW5pc20uIEEgZHJpenpsZS1vcm0gZGVwZW5kZW5jeSBhbG9uZSBpc1xuICogbm90IGEgcmVsaWFibGUgbWFya2VyOiBhIFdvcmtlciBtYXkgdXNlIEQxIG9ubHkgZm9yIGNhY2hpbmcgd2hpbGUgaXRzIGRyaXp6bGUgY29uZmlnIHRhcmdldHMgYW5cbiAqIHVucmVsYXRlZCBkYXRhYmFzZSAoZS5nLiBQb3N0Z3JlU1FMIHZpYSBIeXBlcmRyaXZlKSwgYW5kIHJ1bm5pbmcgYGRyaXp6bGUta2l0IG1pZ3JhdGVgIGFnYWluc3RcbiAqIHRoYXQgZGF0YWJhc2UgZHVyaW5nIGEgRDEgZGVwbG95IHdvdWxkIGJlIHdyb25nIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NDIpLlxuICogU28gcmVxdWlyZSBhbiBleHBsaWNpdCBtYXJrZXI6IGEgZHJpenpsZSBjb25maWcgd2hvc2UgZGlhbGVjdC9kcml2ZXIgdGFyZ2V0cyBzcWxpdGUsIGQxLWh0dHAsIG9yXG4gKiBkdXJhYmxlLXNxbGl0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXNEcml6emxlS2l0Rm9yRDEocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICBpZiAoIXByb2plY3QuaGFzRHJpenpsZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGNvbmZpZyA9IGZpbmREcml6emxlQ29uZmlnKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZykgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IHN0cmlwSnNDb21tZW50cyhmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCBjb25maWcuZmlsZU5hbWUpLCAndXRmOCcpKTtcbiAgICAvLyBTY2FuIG9ubHkgdGhlIGV4cG9ydGVkIGNvbmZpZydzIG9iamVjdCBsaXRlcmFsOiBkcml6emxlLWtpdCBjb25zdW1lcyB0aGUgZGVmYXVsdCBleHBvcnQsXG4gICAgLy8gYW5kIG1hdGNoaW5nIG90aGVyIHRleHQgKGFuIHVudXNlZCBzcWxpdGUtc2hhcGVkIGNvbnN0YW50IGFib3ZlIHRoZSBleHBvcnQsIG9yIG1hcmtlci1saWtlXG4gICAgLy8gc3RyaW5nIGNvbnRlbnQgaW4gc3RhdGVtZW50cyBhZnRlciBpdCkgd291bGQgc2VsZWN0IHRoZSB3cm9uZyBtaWdyYXRpb24gbWVjaGFuaXNtLlxuICAgIC8vIFBPU0lUSU9OUyAoZXhwb3J0IG1hcmtlcnMsIGRlY2xhcmF0aW9ucykgYXJlIGxvY2F0ZWQgb24gYSBzdHJpbmctbWFza2VkIHZpZXcgb2YgdGhlIHNhbWVcbiAgICAvLyBsZW5ndGgsIHNvIGBleHBvcnQgZGVmYXVsdGAgaW5zaWRlIGEgc3RyaW5nIGxpdGVyYWwgY2Fubm90IG1pc2xlYWQgdGhlIHNlYXJjaC5cbiAgICBjb25zdCBtYXNrZWRDb250ZW50ID0gbWFza1N0cmluZ0NvbnRlbnRzKGNvbnRlbnQpO1xuICAgIGNvbnN0IGV4cG9ydEluZGljZXMgPSBbJ2V4cG9ydCBkZWZhdWx0JywgJ21vZHVsZS5leHBvcnRzJ11cbiAgICAgIC5tYXAoKG1hcmtlcikgPT4gbWFza2VkQ29udGVudC5pbmRleE9mKG1hcmtlcikpXG4gICAgICAuZmlsdGVyKChpbmRleCkgPT4gaW5kZXggIT09IC0xKTtcbiAgICBjb25zdCBleHBvcnRTdGFydEluZGV4ID0gZXhwb3J0SW5kaWNlcy5sZW5ndGggPiAwID8gTWF0aC5taW4oLi4uZXhwb3J0SW5kaWNlcykgOiAwO1xuICAgIGNvbnN0IG9iamVjdFNwYW4gPSBleHRyYWN0RXhwb3J0ZWRDb25maWdPYmplY3QoY29udGVudCwgbWFza2VkQ29udGVudCwgZXhwb3J0U3RhcnRJbmRleCk7XG4gICAgcmV0dXJuIG9iamVjdFNwYW4gIT09IHVuZGVmaW5lZCAmJiBkZWNsYXJlc1NxbGl0ZVRhcmdldChvYmplY3RTcGFuKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGhlIG9iamVjdCBsaXRlcmFsIHRoZSBleHBvcnQgYWN0dWFsbHkgZXZhbHVhdGVzIHRvOiBmb3IgYGV4cG9ydCBkZWZhdWx0IHsuLi59YCBvclxuICogYGV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7Li4ufSlgIHRoZSBmaXJzdCBiYWxhbmNlZCBvYmplY3QgYWZ0ZXIgdGhlIG1hcmtlciwgYW5kIGZvclxuICogYGV4cG9ydCBkZWZhdWx0IGNvbmZpZztgIHRoZSBpbml0aWFsaXplciBvZiB0aGF0IGlkZW50aWZpZXIncyBkZWNsYXJhdGlvbiDigJQgbmV2ZXIgdGhlIHdob2xlXG4gKiBmaWxlLCBzaW5jZSBhbiB1bnJlbGF0ZWQgb2JqZWN0IChlLmcuIGFuIHVudXNlZCBzcWxpdGUtc2hhcGVkIGNvbnN0YW50KSBtdXN0IG5vdCBiZSBzZWxlY3RlZC5cbiAqIFVuZGVmaW5lZCB3aGVuIHRoZSBleHByZXNzaW9uIGNhbm5vdCBiZSByZXNvbHZlZDsgd2IgZGVwbG95J3MgdW5tYW5hZ2VkLUQxIHdhcm5pbmcgY292ZXJzIHRoYXQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RFeHBvcnRlZENvbmZpZ09iamVjdChcbiAgY29udGVudDogc3RyaW5nLFxuICBtYXNrZWRDb250ZW50OiBzdHJpbmcsXG4gIGV4cG9ydFN0YXJ0SW5kZXg6IG51bWJlclxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZXhwb3J0ZWRFeHByZXNzaW9uID0gbWFza2VkQ29udGVudFxuICAgIC5zbGljZShleHBvcnRTdGFydEluZGV4KVxuICAgIC5yZXBsYWNlKC9eKD86ZXhwb3J0XFxzK2RlZmF1bHR8bW9kdWxlXFwuZXhwb3J0c1xccyo9KVxccyovLCAnJyk7XG4gIC8vIEFuIGlkZW50aWZpZXIgZXhwb3J0IG1heSBjYXJyeSBhIFR5cGVTY3JpcHQgdHlwZSBwb3N0Zml4IChgY29uZmlnIHNhdGlzZmllcyBDb25maWc7YCAvXG4gIC8vIGBjb25maWcgYXMgQ29uZmlnO2ApOyB0aGUgaWRlbnRpZmllciBpcyByZWNvZ25pemVkIEZJUlNUIHNvIGEgcG9zdGZpeCBjb250YWluaW5nIGEgVFlQRVxuICAvLyBsaXRlcmFsIChgc2F0aXNmaWVzIHsgZGlhbGVjdDogJ3NxbGl0ZScgfCAuLi4gfWApIGlzIG5ldmVyIG1pc3Rha2VuIGZvciB0aGUgcnVudGltZSBjb25maWcuXG4gIGNvbnN0IGlkZW50aWZpZXJNYXRjaCA9IC9eKFtBLVphLXpfJF1bXFx3JF0qKVxccyooPzpzYXRpc2ZpZXNcXGJ8YXNcXGJ8O3xcXG58JCkvLmV4ZWMoZXhwb3J0ZWRFeHByZXNzaW9uKTtcbiAgaWYgKCFpZGVudGlmaWVyTWF0Y2gpIHtcbiAgICBjb25zdCBicmFjZU9mZnNldCA9IG1hc2tlZENvbnRlbnQuc2xpY2UoZXhwb3J0U3RhcnRJbmRleCkuaW5kZXhPZigneycpO1xuICAgIGlmIChicmFjZU9mZnNldCA9PT0gLTEpIHJldHVybjtcbiAgICByZXR1cm4gZXh0cmFjdEZpcnN0QmFsYW5jZWRPYmplY3QoY29udGVudC5zbGljZShleHBvcnRTdGFydEluZGV4ICsgYnJhY2VPZmZzZXQpKTtcbiAgfVxuXG4gIC8vIGAkYCBpcyBsZWdhbCBpbiBpZGVudGlmaWVycyBidXQgYSByZWdleCBhbmNob3IsIHNvIGl0IG11c3QgYmUgZXNjYXBlZCBiZWZvcmUgaW50ZXJwb2xhdGlvbjtcbiAgLy8gYCg/IVtcXHckXSlgIChub3QgYFxcYmApIGVuZHMgdGhlIG1hdGNoIGJlY2F1c2UgYFxcYmAgbmV2ZXIgZmlyZXMgYWZ0ZXIgYSB0cmFpbGluZyBgJGAuXG4gIGNvbnN0IGVzY2FwZWRJZGVudGlmaWVyID0gaWRlbnRpZmllck1hdGNoWzFdIS5yZXBsYWNlQWxsKCckJywgU3RyaW5nLnJhd2BcXCRgKTtcbiAgY29uc3QgZGVjbGFyYXRpb25FbmRJbmRleCA9IGZpbmRNb2R1bGVTY29wZURlY2xhcmF0aW9uRW5kKG1hc2tlZENvbnRlbnQsIGVzY2FwZWRJZGVudGlmaWVyKTtcbiAgaWYgKGRlY2xhcmF0aW9uRW5kSW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAvLyBUaGUgaW5pdGlhbGl6ZXIgbXVzdCBiZWxvbmcgdG8gVEhJUyBkZWNsYXJhdGlvbiAoYSB0eXBlIGFubm90YXRpb24gbWF5IHByZWNlZGUgdGhlIGA9YCk7IGFuXG4gIC8vIHVuaW5pdGlhbGl6ZWQgYGxldCBjb25maWc7YCBzdGF5cyB1bnJlc29sdmVkIGluc3RlYWQgb2YgZ3JhYmJpbmcgYSBsYXRlciBzdGF0ZW1lbnQncyBgPWAuXG4gIGNvbnN0IGFzc2lnbm1lbnRNYXRjaCA9IC9eXFxzKig/OjpbXj07XFxuXSopPz0vLmV4ZWMobWFza2VkQ29udGVudC5zbGljZShkZWNsYXJhdGlvbkVuZEluZGV4KSk7XG4gIGlmICghYXNzaWdubWVudE1hdGNoKSByZXR1cm47XG4gIHJldHVybiBleHRyYWN0Rmlyc3RCYWxhbmNlZE9iamVjdChjb250ZW50LnNsaWNlKGRlY2xhcmF0aW9uRW5kSW5kZXggKyBhc3NpZ25tZW50TWF0Y2hbMF0ubGVuZ3RoKSk7XG59XG5cbi8qKlxuICogVGhlIGVuZCBpbmRleCBvZiB0aGUgaWRlbnRpZmllcidzIGRlY2xhcmF0aW9uIGF0IGJyYWNlIGRlcHRoIFpFUk8gKG1vZHVsZSBzY29wZSk6IGEgc2FtZS1uYW1lZFxuICogZGVjbGFyYXRpb24gaW5zaWRlIGEgZnVuY3Rpb24gYm9keSBtdXN0IG5vdCBzaGFkb3cgdGhlIGJpbmRpbmcgdGhlIGV4cG9ydCByZWZlcmVuY2VzLCBhbmRcbiAqIGluZGVudGF0aW9uIGlzIG5vIHNjb3BlIHNpZ25hbCDigJQgZGVwdGggb3ZlciB0aGUgc3RyaW5nLW1hc2tlZCBjb250ZW50IGlzLlxuICovXG5mdW5jdGlvbiBmaW5kTW9kdWxlU2NvcGVEZWNsYXJhdGlvbkVuZChtYXNrZWRDb250ZW50OiBzdHJpbmcsIGVzY2FwZWRJZGVudGlmaWVyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWNsYXJhdGlvblJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICBTdHJpbmcucmF3YCg/PCFbXFx3JF0pKD86ZXhwb3J0XFxzKyk/KD86Y29uc3R8bGV0fHZhcilcXHMrJHtlc2NhcGVkSWRlbnRpZmllcn0oPyFbXFx3JF0pYCxcbiAgICAnZydcbiAgKTtcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IHNjYW5JbmRleCA9IDA7XG4gIGZvciAobGV0IG1hdGNoID0gZGVjbGFyYXRpb25SZWdleC5leGVjKG1hc2tlZENvbnRlbnQpOyBtYXRjaDsgbWF0Y2ggPSBkZWNsYXJhdGlvblJlZ2V4LmV4ZWMobWFza2VkQ29udGVudCkpIHtcbiAgICBmb3IgKDsgc2NhbkluZGV4IDwgbWF0Y2guaW5kZXg7IHNjYW5JbmRleCsrKSB7XG4gICAgICBjb25zdCBjaGFyID0gbWFza2VkQ29udGVudFtzY2FuSW5kZXhdO1xuICAgICAgaWYgKGNoYXIgPT09ICd7JykgZGVwdGgrKztcbiAgICAgIGVsc2UgaWYgKGNoYXIgPT09ICd9JykgZGVwdGgtLTtcbiAgICB9XG4gICAgaWYgKGRlcHRoID09PSAwKSByZXR1cm4gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgdGhlIENPTlRFTlRTIG9mIHN0cmluZyBsaXRlcmFscyB3aXRoIHNwYWNlcyAoc2FtZSBsZW5ndGgsIG5ld2xpbmVzIGtlcHQpLCBzbyBwb3NpdGlvblxuICogc2VhcmNoZXMgb3ZlciB0aGUgcmVzdWx0IGNhbm5vdCBtYXRjaCB0ZXh0IGluc2lkZSBzdHJpbmdzIHdoaWxlIGFsbCBpbmRleGVzIHN0aWxsIG1hcCAxOjEgdG9cbiAqIHRoZSBvcmlnaW5hbCBjb250ZW50LlxuICovXG5mdW5jdGlvbiBtYXNrU3RyaW5nQ29udGVudHMoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgc3RyaW5nRGVsaW1pdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgaWYgKHN0cmluZ0RlbGltaXRlcikge1xuICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykge1xuICAgICAgICByZXN1bHQgKz0gJyAgJztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gc3RyaW5nRGVsaW1pdGVyIHx8IChzdHJpbmdEZWxpbWl0ZXIgIT09ICdgJyAmJiBjaGFyID09PSAnXFxuJykpIHtcbiAgICAgICAgc3RyaW5nRGVsaW1pdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gY2hhciA9PT0gJ1xcbicgPyAnXFxuJyA6ICcgJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHN0cmluZ0RlbGltaXRlciA9IGNoYXI7XG4gICAgcmVzdWx0ICs9IGNoYXI7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdHJpbmctYXdhcmUgc2NhbiBmb3IgdGhlIG1hcmtlcnMgaW5kaWNhdGluZyB0aGUgY29uZmlnIG1hbmFnZXMgYSAoQ2xvdWRmbGFyZSBEMSBjb21wYXRpYmxlKVxuICogU1FMaXRlIGRhdGFiYXNlIOKAlCBhIGBkaWFsZWN0OiAnc3FsaXRlJ2AsIGBkcml2ZXI6ICdkMS1odHRwJ2AsIG9yIGBkcml2ZXI6ICdkdXJhYmxlLXNxbGl0ZSdgXG4gKiBQUk9QRVJUWSAocGxhaW4gb3IgcXVvdGVkIGtleSkuIEtleXMgYXJlIG9ubHkgcmVjb2duaXplZCBpbiBjb2RlIHBvc2l0aW9uLCBzbyBtYXJrZXItbGlrZSB0ZXh0XG4gKiBlbWJlZGRlZCBpbiB1bnJlbGF0ZWQgc3RyaW5nIHZhbHVlcyAoZS5nLiBhIHNjaGVtYSBwYXRoKSBjYW5ub3QgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVzU3FsaXRlVGFyZ2V0KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZ3MoY29udGVudCk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0b2tlbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdITtcbiAgICBsZXQga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHZhbHVlVG9rZW5JbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0b2tlbi50eXBlID09PSAnY29kZScpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gLyg/Ol58W1xcc3ssKF0pKGRpYWxlY3R8ZHJpdmVyKVxccyo6XFxzKiQvLmV4ZWModG9rZW4udmFsdWUpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGtleSA9IG1hdGNoWzFdO1xuICAgICAgICB2YWx1ZVRva2VuSW5kZXggPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0b2tlbi52YWx1ZSA9PT0gJ2RpYWxlY3QnIHx8IHRva2VuLnZhbHVlID09PSAnZHJpdmVyJykge1xuICAgICAgLy8gQSBxdW90ZWQga2V5OiB0aGUgc3Vycm91bmRpbmcgY29kZSB0b2tlbnMgbXVzdCBmb3JtIGEgcHJvcGVydHkgcG9zaXRpb24gKGB7YC9gLGAgYmVmb3JlLFxuICAgICAgLy8gYDpgIGFmdGVyKS5cbiAgICAgIGNvbnN0IHByZXZpb3VzVG9rZW4gPSB0b2tlbnNbaW5kZXggLSAxXTtcbiAgICAgIGNvbnN0IG5leHRUb2tlbiA9IHRva2Vuc1tpbmRleCArIDFdO1xuICAgICAgaWYgKFxuICAgICAgICBwcmV2aW91c1Rva2VuPy50eXBlID09PSAnY29kZScgJiZcbiAgICAgICAgL1t7LChdXFxzKiQvLnRlc3QocHJldmlvdXNUb2tlbi52YWx1ZSkgJiZcbiAgICAgICAgbmV4dFRva2VuPy50eXBlID09PSAnY29kZScgJiZcbiAgICAgICAgL15cXHMqOlxccyokLy50ZXN0KG5leHRUb2tlbi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBrZXkgPSB0b2tlbi52YWx1ZTtcbiAgICAgICAgdmFsdWVUb2tlbkluZGV4ID0gaW5kZXggKyAyO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwgdmFsdWVUb2tlbkluZGV4ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgdmFsdWVUb2tlbiA9IHRva2Vuc1t2YWx1ZVRva2VuSW5kZXhdO1xuICAgIGlmICh2YWx1ZVRva2VuPy50eXBlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgaWYgKGtleSA9PT0gJ2RpYWxlY3QnICYmIHZhbHVlVG9rZW4udmFsdWUgPT09ICdzcWxpdGUnKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoa2V5ID09PSAnZHJpdmVyJyAmJiAodmFsdWVUb2tlbi52YWx1ZSA9PT0gJ2QxLWh0dHAnIHx8IHZhbHVlVG9rZW4udmFsdWUgPT09ICdkdXJhYmxlLXNxbGl0ZScpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU3BsaXQgaW50byBhbHRlcm5hdGluZyBjb2RlIGFuZCBzdHJpbmctbGl0ZXJhbC1jb250ZW50IHRva2VucyAocXVvdGVzIGV4Y2x1ZGVkKS4gVGhlIGlucHV0IGlzXG4gKiBhbHJlYWR5IGNvbW1lbnQtZnJlZSDigJQgdXNlc0RyaXp6bGVLaXRGb3JEMSBydW5zIHN0cmlwSnNDb21tZW50cyBiZWZvcmUgYW55IHNjYW5uaW5nIOKAlCBzb1xuICogY29tbWVudCBkZWxpbWl0ZXJzIG5lZWQgbm8gaGFuZGxpbmcgaGVyZSAoYSBjb21tZW50ZWQtb3V0IGAvLyBkaWFsZWN0OiAnc3FsaXRlJ2AgY2FuIG5ldmVyXG4gKiByZWFjaCB0aGlzIHRva2VuaXplcikuXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplU3RyaW5ncyhjb250ZW50OiBzdHJpbmcpOiB7IHR5cGU6ICdjb2RlJyB8ICdzdHJpbmcnOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gIGNvbnN0IHRva2VuczogeyB0eXBlOiAnY29kZScgfCAnc3RyaW5nJzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcbiAgbGV0IGNvZGUgPSAnJztcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvbnRlbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaW5kZXhdITtcbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHtcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogJ2NvZGUnLCB2YWx1ZTogY29kZSB9KTtcbiAgICAgIGNvZGUgPSAnJztcbiAgICAgIGxldCB2YWx1ZSA9ICcnO1xuICAgICAgaW5kZXgrKztcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQubGVuZ3RoICYmIGNvbnRlbnRbaW5kZXhdICE9PSBjaGFyKSB7XG4gICAgICAgIGlmIChjb250ZW50W2luZGV4XSA9PT0gJ1xcXFwnKSBpbmRleCsrO1xuICAgICAgICB2YWx1ZSArPSBjb250ZW50W2luZGV4XSA/PyAnJztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogJ3N0cmluZycsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvZGUgKz0gY2hhcjtcbiAgfVxuICB0b2tlbnMucHVzaCh7IHR5cGU6ICdjb2RlJywgdmFsdWU6IGNvZGUgfSk7XG4gIHJldHVybiB0b2tlbnM7XG59XG5cbi8qKiBUaGUgZmlyc3QgYHsgLi4uIH1gIHNwYW4gKHN0cmluZy1hd2FyZSBicmFjZSBtYXRjaGluZyksIG9yIHVuZGVmaW5lZCB3aGVuIG5vbmUgZXhpc3RzLiAqL1xuZnVuY3Rpb24gZXh0cmFjdEZpcnN0QmFsYW5jZWRPYmplY3QoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhcnRJbmRleCA9IGNvbnRlbnQuaW5kZXhPZigneycpO1xuICBpZiAoc3RhcnRJbmRleCA9PT0gLTEpIHJldHVybjtcblxuICBsZXQgZGVwdGggPSAwO1xuICBsZXQgc3RyaW5nRGVsaW1pdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGluZGV4ID0gc3RhcnRJbmRleDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgaWYgKHN0cmluZ0RlbGltaXRlcikge1xuICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykgaW5kZXgrKztcbiAgICAgIGVsc2UgaWYgKGNoYXIgPT09IHN0cmluZ0RlbGltaXRlciB8fCAoc3RyaW5nRGVsaW1pdGVyICE9PSAnYCcgJiYgY2hhciA9PT0gJ1xcbicpKSBzdHJpbmdEZWxpbWl0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09ICdcIicgfHwgY2hhciA9PT0gJ2AnKSBzdHJpbmdEZWxpbWl0ZXIgPSBjaGFyO1xuICAgIGVsc2UgaWYgKGNoYXIgPT09ICd7JykgZGVwdGgrKztcbiAgICBlbHNlIGlmIChjaGFyID09PSAnfScgJiYgLS1kZXB0aCA9PT0gMCkgcmV0dXJuIGNvbnRlbnQuc2xpY2Uoc3RhcnRJbmRleCwgaW5kZXggKyAxKTtcbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogUmVtb3ZlIGJsb2NrIGFuZCBsaW5lIGNvbW1lbnRzIHNvIGNvbW1lbnRlZC1vdXQgbWFya2VycyAoZS5nLiBgLy8gZGlhbGVjdDogJ3NxbGl0ZSdgIGluIGFcbiAqIFBvc3RncmVTUUwgY29uZmlnKSBjYW5ub3QgbWlzY2xhc3NpZnkgdGhlIGNvbmZpZy4gVGhlIHNjYW5uZXIgdHJhY2tzIHN0cmluZyBzdGF0ZSwgc28gYC8vYFxuICogaW5zaWRlIHN0cmluZyBsaXRlcmFscyAoVVJMcyBzdWNoIGFzIGBodHRwczovLy4uLmAgaW4gY29ubmVjdGlvbiBzdHJpbmdzKSBzdXJ2aXZlcyB3aGlsZVxuICogY29tbWVudHMgZGlyZWN0bHkgYWZ0ZXIgYSBzdHJpbmcgbGl0ZXJhbCBhcmUgc3RpbGwgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBKc0NvbW1lbnRzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgbGV0IHN0cmluZ0RlbGltaXRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29udGVudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyID0gY29udGVudFtpbmRleF0hO1xuICAgIGNvbnN0IG5leHRDaGFyID0gY29udGVudFtpbmRleCArIDFdO1xuICAgIGlmIChzdHJpbmdEZWxpbWl0ZXIpIHtcbiAgICAgIGlmIChjaGFyID09PSAnXFxcXCcpIHtcbiAgICAgICAgcmVzdWx0ICs9IGNoYXIgKyAobmV4dENoYXIgPz8gJycpO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBzdHJpbmdEZWxpbWl0ZXIgfHwgKHN0cmluZ0RlbGltaXRlciAhPT0gJ2AnICYmIGNoYXIgPT09ICdcXG4nKSkge1xuICAgICAgICBzdHJpbmdEZWxpbWl0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHtcbiAgICAgIHN0cmluZ0RlbGltaXRlciA9IGNoYXI7XG4gICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gJy8nICYmIG5leHRDaGFyID09PSAnLycpIHtcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQubGVuZ3RoICYmIGNvbnRlbnRbaW5kZXhdICE9PSAnXFxuJykgaW5kZXgrKztcbiAgICAgIHJlc3VsdCArPSAnXFxuJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gJy8nICYmIG5leHRDaGFyID09PSAnKicpIHtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICB3aGlsZSAoaW5kZXggPCBjb250ZW50Lmxlbmd0aCAmJiAhKGNvbnRlbnRbaW5kZXhdID09PSAnKicgJiYgY29udGVudFtpbmRleCArIDFdID09PSAnLycpKSBpbmRleCsrO1xuICAgICAgaW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXN1bHQgKz0gY2hhcjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZERyaXp6bGVDb25maWcocHJvamVjdDogUHJvamVjdCk6IHsgZGlyUGF0aDogc3RyaW5nOyBmaWxlTmFtZTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gWydkcml6emxlLmNvbmZpZy50cycsICdkcml6emxlLmNvbmZpZy5tdHMnLCAnZHJpenpsZS5jb25maWcuanMnLCAnZHJpenpsZS5jb25maWcubWpzJ107XG4gIGZvciAoY29uc3QgZGlyUGF0aCBvZiBbcHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnJvb3REaXJQYXRoXSkge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gY2FuZGlkYXRlcy5maW5kKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZU5hbWUpKSk7XG4gICAgaWYgKGZpbGVOYW1lKSByZXR1cm4geyBkaXJQYXRoLCBmaWxlTmFtZSB9O1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSA/IGRiUGF0aCA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRiUGF0aCk7XG4gIHJldHVybiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZEZvclBhdGgoYWJzb2x1dGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBybSAtZiBcIiR7ZGJQYXRofVwiIFwiJHtkYlBhdGh9LXdhbFwiIFwiJHtkYlBhdGh9LXNobVwiYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkZhbWlseUNvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1SZiBcIiR7ZGJQYXRofVwiKmA7XG59XG5cbmZ1bmN0aW9uIGdldFNxbGl0ZURiUGF0aE9yRXJyb3IocHJvamVjdDogUHJvamVjdCwgY29tbWFuZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdiIGRiICR7Y29tbWFuZE5hbWV9IHN1cHBvcnRzIERyaXp6bGUgb25seSB3aGVuIGZpbGU6IERBVEFCQVNFX1VSTCBpcyBzZXQuYCk7XG4gIH1cbiAgcmV0dXJuIGRiUGF0aDtcbn1cblxuZnVuY3Rpb24gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdDogUHJvamVjdCwgY29tbWFuZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aE9yRXJyb3IocHJvamVjdCwgY29tbWFuZE5hbWUpO1xuICByZXR1cm4gcGF0aC5pc0Fic29sdXRlKGRiUGF0aCkgPyBkYlBhdGggOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkYlBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZXRTcWxpdGVEYlBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG59XG5cbmV4cG9ydCBjb25zdCBkcml6emxlU2NyaXB0cyA9IG5ldyBEcml6emxlU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuL3dyYW5nbGVyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBXcmFuZ2xlckQxRGF0YWJhc2Uge1xuICBiaW5kaW5nPzogc3RyaW5nO1xuICBkYXRhYmFzZV9uYW1lPzogc3RyaW5nO1xuICBkYXRhYmFzZV9pZD86IHN0cmluZztcbiAgbWlncmF0aW9uc19kaXI/OiBzdHJpbmc7XG4gIG1pZ3JhdGlvbnNfcGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBEMSBiaW5kaW5nIHVzZXMgd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgdGhhdCBgd3JhbmdsZXIgZDEgbWlncmF0aW9ucyBhcHBseWBcbiAqIHdvdWxkIGFjdHVhbGx5IGRpc2NvdmVyOiBhbiBleHBsaWNpdCBgbWlncmF0aW9uc19wYXR0ZXJuYCBvcHRzIGluLCBvdGhlcndpc2UgdGhlIG1pZ3JhdGlvbnNcbiAqIGRpcmVjdG9yeSBtdXN0IGNvbnRhaW4gZmxhdCBgKi5zcWxgIGZpbGVzICh3cmFuZ2xlcidzIGRlZmF1bHQgcGF0dGVybikuIEEgZHJpenpsZS1raXQgYG91dGBcbiAqIGRpcmVjdG9yeSB3aXRoIG5lc3RlZCBgPG5hbWU+L21pZ3JhdGlvbi5zcWxgIGZpbGVzIGFuZCBubyBwYXR0ZXJuIHdvdWxkIG1hdGNoIG5vdGhpbmcgYW5kXG4gKiBzaWxlbnRseSBhcHBseSB6ZXJvIG1pZ3JhdGlvbnMsIHNvIGl0IG11c3QgZmFsbCB0aHJvdWdoIHRvIHRoZSBkcml6emxlLWtpdCBtZWNoYW5pc20uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VzV3JhbmdsZXJOYXRpdmVNaWdyYXRpb25zKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPiwgZGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSk6IGJvb2xlYW4ge1xuICAvLyBBbiBleHBsaWNpdCBwYXR0ZXJuIG9wdHMgaW50byB0aGUgd3JhbmdsZXItbmF0aXZlIG1lY2hhbmlzbSBldmVuIGJlZm9yZSB0aGUgZGlyZWN0b3J5XG4gIC8vIGV4aXN0czsgd3JhbmdsZXIgdGhlbiBmYWlscyBzYWZlbHkgd2l0aCBcIk5vIG1pZ3JhdGlvbnMgZm9sZGVyIGZvdW5kXCIgaW5zdGVhZCBvZiB3YlxuICAvLyBzaWxlbnRseSBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgbWlncmF0aW9uIGVuZ2luZS5cbiAgaWYgKGRhdGFiYXNlLm1pZ3JhdGlvbnNfcGF0dGVybikgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGF0YWJhc2UubWlncmF0aW9uc19kaXIgPz8gJ21pZ3JhdGlvbnMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZnMucmVhZGRpclN5bmMobWlncmF0aW9uc0RpclBhdGgpLnNvbWUoKGZpbGVOYW1lKSA9PiBmaWxlTmFtZS5lbmRzV2l0aCgnLnNxbCcpKTtcbn1cblxuY29uc3QgTkFNRV9LRVlFRF9CSU5ESU5HX1BBUkVOVFMgPSBuZXcgU2V0KFsnYmluZGluZ3MnLCAnc2VuZF9lbWFpbCcsICdyYXRlbGltaXRzJ10pO1xuY29uc3QgUkVDT1JEX0tFWUVEX0JJTkRJTkdfS0VZUyA9IG5ldyBTZXQoWyd3YXNtX21vZHVsZXMnLCAndGV4dF9ibG9icycsICdkYXRhX2Jsb2JzJ10pO1xuXG4vKipcbiAqIENvbGxlY3QgZXZlcnkgYmluZGluZyBuYW1lIGRlY2xhcmVkIGluIHRoZSAoZW52aXJvbm1lbnQtcmVzb2x2ZWQpIGNvbmZpZyBzdWJ0cmVlOiBgYmluZGluZ2BcbiAqIHByb3BlcnRpZXMgYW55d2hlcmUgKEQxLCBLViwgUjIsIHNlcnZpY2VzLCBhc3NldHMsIHF1ZXVlcywgZXRjLiksIHRoZSBgbmFtZWAta2V5ZWQgYmluZGluZ3NcbiAqIChgZHVyYWJsZV9vYmplY3RzLmJpbmRpbmdzYCwgYGxvZ2Z3ZHIuYmluZGluZ3NgLCBgc2VuZF9lbWFpbGAsIGByYXRlbGltaXRzYCksIGFuZCB0aGVcbiAqIHJlY29yZC1rZXllZCBsZWdhY3kgbW9kdWxlIGJpbmRpbmdzIChgd2FzbV9tb2R1bGVzYCwgYHRleHRfYmxvYnNgLCBgZGF0YV9ibG9ic2ApLiBBIHNlY3JldFxuICogc2hhcmluZyBhIGJpbmRpbmcncyBuYW1lIHdvdWxkIHNpbGVudGx5IHJlcGxhY2UgdGhhdCBiaW5kaW5nIHdpdGggYSBwbGFpbiBzdHJpbmcgb24gZGVwbG95LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEJpbmRpbmdOYW1lcyh2YWx1ZTogdW5rbm93biwgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKSwgcGFyZW50S2V5ID0gJycpOiBTZXQ8c3RyaW5nPiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkgY29sbGVjdEJpbmRpbmdOYW1lcyhpdGVtLCBuYW1lcywgcGFyZW50S2V5KTtcbiAgICByZXR1cm4gbmFtZXM7XG4gIH1cbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gbmFtZXM7XG4gIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGlmIChrZXkgPT09ICdiaW5kaW5nJyAmJiB0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lcy5hZGQoY2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbmFtZScgJiYgdHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyAmJiBOQU1FX0tFWUVEX0JJTkRJTkdfUEFSRU5UUy5oYXMocGFyZW50S2V5KSkge1xuICAgICAgbmFtZXMuYWRkKGNoaWxkKTtcbiAgICB9IGVsc2UgaWYgKFJFQ09SRF9LRVlFRF9CSU5ESU5HX0tFWVMuaGFzKGtleSkgJiYgY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcbiAgICAgIGZvciAoY29uc3QgYmluZGluZ05hbWUgb2YgT2JqZWN0LmtleXMoY2hpbGQpKSBuYW1lcy5hZGQoYmluZGluZ05hbWUpO1xuICAgIH0gZWxzZSBpZiAoa2V5ICE9PSAnZW52JyAmJiBrZXkgIT09ICd2YXJzJyAmJiBrZXkgIT09ICdtZXRhZGF0YScgJiYga2V5ICE9PSAnb3B0aW9ucycpIHtcbiAgICAgIC8vIE5lc3RlZCBgZW52YCBzdWJ0cmVlcyBiZWxvbmcgdG8gb3RoZXIgZW52aXJvbm1lbnRzOyBgdmFyc2AgdmFsdWVzLCBgdW5zYWZlLm1ldGFkYXRhYCxcbiAgICAgIC8vIGFuZCBgdW5zYWZlLmJpbmRpbmdzW10uZGV2Lm9wdGlvbnNgIGFyZSBhcmJpdHJhcnkgSlNPTiB3aG9zZSBwcm9wZXJ0aWVzIChlLmcuIGFcbiAgICAgIC8vIFwiYmluZGluZ1wiIGZpZWxkKSBhcmUgZGF0YSwgbm90IFdvcmtlciBiaW5kaW5ncy5cbiAgICAgIGNvbGxlY3RCaW5kaW5nTmFtZXMoY2hpbGQsIG5hbWVzLCBrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmFtZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB7XG4gIC8qKiBUaGUgV29ya2VyIG5hbWUgZm9yIHRoZSBkZXBsb3kgZW52aXJvbm1lbnQgKHdyYW5nbGVyIGFwcGVuZHMgYC08ZW52PmAgd2hlbiB0aGUgZW52IHNlY3Rpb24gaGFzIG5vIG93biBuYW1lKS4gKi9cbiAgd29ya2VyTmFtZT86IHN0cmluZztcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICB2YXJLZXlzOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBlbnZpcm9ubWVudCdzIGB2YXJzYCB2YWx1ZXMgKG5lZWRlZCBmb3IgQ2xvdWRmbGFyZSdzIGNvbWJpbmVkIGNvdW50L3NpemUgbGltaXRzKS4gKi9cbiAgdmFyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBTZWNyZXRzIGRlY2xhcmVkIGFzIHJlcXVpcmVkIHZpYSB3cmFuZ2xlcidzIGBzZWNyZXRzLnJlcXVpcmVkYCAodmFsaWRhdGVkIGF0IGRlcGxveSB0aW1lKS4gKi9cbiAgcmVxdWlyZWRTZWNyZXROYW1lczogc3RyaW5nW107XG4gIC8qKiBOYW1lcyBvZiBhbGwgbm9uLXZhciBiaW5kaW5ncyAoRDEsIEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzLCBzZW5kX2VtYWlsLCBzZXJ2aWNlcywgLi4uKS4gKi9cbiAgYmluZGluZ05hbWVzOiBzdHJpbmdbXTtcbiAgZDFEYXRhYmFzZXM6IFdyYW5nbGVyRDFEYXRhYmFzZVtdO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZW52aXJvbm1lbnQgY29tZXMgZnJvbSBhbiBgZW52LjxuYW1lPmAgc2VjdGlvbiAodGhlbiB3cmFuZ2xlciBjb21tYW5kcyBuZWVkXG4gICAqIGAtLWVudiA8bmFtZT5gIC8gYENMT1VERkxBUkVfRU5WPTxuYW1lPmApLiBgcHJvZHVjdGlvbmAgbWF5IGJlIGVpdGhlciB0aGUgdG9wIGxldmVsIG9yIGFcbiAgICogbmFtZWQgYGVudi5wcm9kdWN0aW9uYCBzZWN0aW9uOyB0aGUgc2VjdGlvbiB3aW5zIHdoZW4gaXQgZXhpc3RzLlxuICAgKi9cbiAgdXNlc0VudlNlY3Rpb246IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBSYXdXcmFuZ2xlckNvbmZpZyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZDFfZGF0YWJhc2VzPzogV3JhbmdsZXJEMURhdGFiYXNlW107XG4gIGFzc2V0cz86IHVua25vd247XG4gIGxvZ2Z3ZHI/OiB1bmtub3duO1xuICB3YXNtX21vZHVsZXM/OiB1bmtub3duO1xuICB0ZXh0X2Jsb2JzPzogdW5rbm93bjtcbiAgZGF0YV9ibG9icz86IHVua25vd247XG4gIHNpdGU/OiB1bmtub3duO1xuICBzZWNyZXRzPzogeyByZXF1aXJlZD86IHN0cmluZ1tdIH07XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIFJhd1dyYW5nbGVyQ29uZmlnPjtcbn1cblxuLy8gV29ya2VycyBTaXRlcyBpbXBsaWNpdGx5IGJpbmRzIGl0cyBLViBuYW1lc3BhY2UgYXMgX19TVEFUSUNfQ09OVEVOVC5cbmZ1bmN0aW9uIHNpdGVCaW5kaW5nTmFtZXMoY29uZmlnOiBSYXdXcmFuZ2xlckNvbmZpZywgZW52Q29uZmlnPzogUmF3V3JhbmdsZXJDb25maWcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoZW52Q29uZmlnPy5zaXRlID8/IGNvbmZpZy5zaXRlKSA/IFsnX19TVEFUSUNfQ09OVEVOVCddIDogW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgd3JhbmdsZXIgY29uZmlnIHZhbHVlcyBuZWVkZWQgZm9yIGRlcGxveWluZyB0byB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuXG4gKiBGb2xsb3dzIHdyYW5nbGVyJ3MgaW5oZXJpdGFuY2UgcnVsZXM6IGBhY2NvdW50X2lkYCBpcyBpbmhlcml0ZWQgYnkgbmFtZWQgZW52aXJvbm1lbnRzLFxuICogd2hpbGUgYHZhcnNgIGFuZCBgZDFfZGF0YWJhc2VzYCBhcmUgbm90IGFuZCBtdXN0IGJlIHJlZGVjbGFyZWQgcGVyIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdyYW5nbGVyQ29uZmlnRm9yRW52KFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4sXG4gIGVudk5hbWU6IHN0cmluZ1xuKTogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcbiAgaWYgKHBhdGguZXh0bmFtZShjb25maWdQYXRoKSA9PT0gJy50b21sJykge1xuICAgIHRocm93IG5ldyBFcnJvcignd2IgZGVwbG95IHN1cHBvcnRzIHdyYW5nbGVyLmpzb25jL3dyYW5nbGVyLmpzb24gY29uZmlncyBvbmx5OyBtaWdyYXRlIHdyYW5nbGVyLnRvbWwgZmlyc3QuJyk7XG4gIH1cblxuICAvLyBqc29uYy1wYXJzZXIgaXMgZmF1bHQgdG9sZXJhbnQgYW5kIHdvdWxkIHJldHVybiBhIHBhcnRpYWwgb2JqZWN0IGZvciBtYWxmb3JtZWQgaW5wdXQsXG4gIC8vIHdoaWNoIGNvdWxkIG1pZ3JhdGUgYSByZW1vdGUgZGF0YWJhc2UgZnJvbSBhIGhhbGYtcmVhZCBjb25maWc7IHJlamVjdCBhbnkgcGFyc2UgZXJyb3IuXG4gIGNvbnN0IHBhcnNlRXJyb3JzOiBQYXJzZUVycm9yW10gPSBbXTtcbiAgY29uc3QgY29uZmlnID0gcGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JyksIHBhcnNlRXJyb3JzLCB7XG4gICAgYWxsb3dUcmFpbGluZ0NvbW1hOiB0cnVlLFxuICB9KSBhcyBSYXdXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgaWYgKHBhcnNlRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSAke2NvbmZpZ1BhdGh9OiAke3BhcnNlRXJyb3JzLmxlbmd0aH0gSlNPTkMgc3ludGF4IGVycm9yKHMpLmApO1xuICB9XG4gIGlmICghY29uZmlnKSByZXR1cm47XG5cbiAgY29uc3QgZW52Q29uZmlnID0gY29uZmlnLmVudj8uW2Vudk5hbWVdO1xuICBpZiAoIWVudkNvbmZpZyAmJiBlbnZOYW1lICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB3cmFuZ2xlciBjb25maWcgaGFzIG5vIFwiZW52XCI6IHsgXCIke2Vudk5hbWV9XCI6IC4uLiB9IHNlY3Rpb24uYCk7XG4gIH1cbiAgcmV0dXJuIGVudkNvbmZpZ1xuICAgID8ge1xuICAgICAgICB3b3JrZXJOYW1lOiBlbnZDb25maWcubmFtZSA/PyAoY29uZmlnLm5hbWUgPyBgJHtjb25maWcubmFtZX0tJHtlbnZOYW1lfWAgOiB1bmRlZmluZWQpLFxuICAgICAgICBhY2NvdW50SWQ6IGVudkNvbmZpZy5hY2NvdW50X2lkID8/IGNvbmZpZy5hY2NvdW50X2lkLFxuICAgICAgICB2YXJLZXlzOiBPYmplY3Qua2V5cyhlbnZDb25maWcudmFycyA/PyB7fSksXG4gICAgICAgIHZhcnM6IGVudkNvbmZpZy52YXJzID8/IHt9LFxuICAgICAgICAvLyBNb3N0IGJpbmRpbmdzIGFyZSBub24taW5oZXJpdGFibGUgYW5kIG11c3QgYmUgcmVkZWNsYXJlZCBwZXIgZW52aXJvbm1lbnQsIHNvIG9ubHkgdGhlXG4gICAgICAgIC8vIGVudmlyb25tZW50J3Mgb3duIG5hbWVzIGNvdW50IOKAlCBwbHVzIHRoZSBnZW51aW5lbHkgaW5oZXJpdGVkIHNoYXBlcyAoYXNzZXRzLCBsb2dmd2RyKSxcbiAgICAgICAgLy8gd2hpY2ggd3JhbmdsZXIgcmVzb2x2ZXMgYXMgd2hvbGUgZmllbGRzOiB0aGUgZW52aXJvbm1lbnQncyBvd24gZmllbGQgb3ZlcnJpZGVzIHRoZVxuICAgICAgICAvLyB0b3AgbGV2ZWwgZW50aXJlbHksIHNvIG9ubHkgdGhlIGVmZmVjdGl2ZSB2YWx1ZSdzIG5hbWVzIGNvdW50LlxuICAgICAgICBiaW5kaW5nTmFtZXM6IFtcbiAgICAgICAgICAuLi5jb2xsZWN0QmluZGluZ05hbWVzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhc3NldHM6IGVudkNvbmZpZy5hc3NldHMgPz8gY29uZmlnLmFzc2V0cyxcbiAgICAgICAgICAgICAgbG9nZndkcjogZW52Q29uZmlnLmxvZ2Z3ZHIgPz8gY29uZmlnLmxvZ2Z3ZHIsXG4gICAgICAgICAgICAgIHdhc21fbW9kdWxlczogZW52Q29uZmlnLndhc21fbW9kdWxlcyA/PyBjb25maWcud2FzbV9tb2R1bGVzLFxuICAgICAgICAgICAgICB0ZXh0X2Jsb2JzOiBlbnZDb25maWcudGV4dF9ibG9icyA/PyBjb25maWcudGV4dF9ibG9icyxcbiAgICAgICAgICAgICAgZGF0YV9ibG9iczogZW52Q29uZmlnLmRhdGFfYmxvYnMgPz8gY29uZmlnLmRhdGFfYmxvYnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29sbGVjdEJpbmRpbmdOYW1lcyhlbnZDb25maWcpXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5zaXRlQmluZGluZ05hbWVzKGNvbmZpZywgZW52Q29uZmlnKSxcbiAgICAgICAgXSxcbiAgICAgICAgZDFEYXRhYmFzZXM6IGVudkNvbmZpZy5kMV9kYXRhYmFzZXMgPz8gW10sXG4gICAgICAgIC8vIGBzZWNyZXRzYCBpcyBub24taW5oZXJpdGFibGU6IGEgdG9wLWxldmVsIHJlcXVpcmVtZW50IG11c3Qgbm90IGZvcmNlIChvciB1cGxvYWQpXG4gICAgICAgIC8vIGEgc2VjcmV0IGludG8gYSBuYW1lZCBlbnZpcm9ubWVudC5cbiAgICAgICAgcmVxdWlyZWRTZWNyZXROYW1lczogZW52Q29uZmlnLnNlY3JldHM/LnJlcXVpcmVkID8/IFtdLFxuICAgICAgICB1c2VzRW52U2VjdGlvbjogdHJ1ZSxcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgd29ya2VyTmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgIGFjY291bnRJZDogY29uZmlnLmFjY291bnRfaWQsXG4gICAgICAgIHZhcktleXM6IE9iamVjdC5rZXlzKGNvbmZpZy52YXJzID8/IHt9KSxcbiAgICAgICAgdmFyczogY29uZmlnLnZhcnMgPz8ge30sXG4gICAgICAgIGJpbmRpbmdOYW1lczogWy4uLmNvbGxlY3RCaW5kaW5nTmFtZXMoY29uZmlnKSwgLi4uc2l0ZUJpbmRpbmdOYW1lcyhjb25maWcpXSxcbiAgICAgICAgZDFEYXRhYmFzZXM6IGNvbmZpZy5kMV9kYXRhYmFzZXMgPz8gW10sXG4gICAgICAgIHJlcXVpcmVkU2VjcmV0TmFtZXM6IGNvbmZpZy5zZWNyZXRzPy5yZXF1aXJlZCA/PyBbXSxcbiAgICAgICAgdXNlc0VudlNlY3Rpb246IGZhbHNlLFxuICAgICAgfTtcbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcywgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZERyaXp6bGVLaXRDb21tYW5kLCB1c2VzRHJpenpsZUtpdEZvckQxIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQsIHNoZWxsRXNjYXBlQXJndW1lbnQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnLCBXcmFuZ2xlckQxRGF0YWJhc2UgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlckNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlV3JhbmdsZXJDb25maWdGb3JFbnYsIHVzZXNXcmFuZ2xlck5hdGl2ZU1pZ3JhdGlvbnMgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlckNvbmZpZy5qcyc7XG5cbi8qKlxuICogS2V5cyB0aGF0IGRyaXZlIHRoZSBkZXBsb3kgaXRzZWxmIChvciBhcmUgbWVhbmluZ2Z1bCBvbmx5IGxvY2FsbHkpIGFuZCB0aHVzIG11c3QgbmV2ZXIgYmVcbiAqIHB1c2hlZCB0byB0aGUgV29ya2VyIGFzIHNlY3JldHMuIGBXQl9FTlZgIC8gYE5FWFRfUFVCTElDX1dCX0VOVmAgYmVsb25nIGluIHdyYW5nbGVyIGB2YXJzYC5cbiAqL1xuY29uc3QgTk9OX1NFQ1JFVF9LRVlTID0gbmV3IFNldChbXG4gICdDSScsXG4gIC8vIFdyYW5nbGVyIHN5c3RlbS9hdXRoZW50aWNhdGlvbiB2YXJpYWJsZXMgKGh0dHBzOi8vZGV2ZWxvcGVycy5jbG91ZGZsYXJlLmNvbS93b3JrZXJzL3dyYW5nbGVyL3N5c3RlbS1lbnZpcm9ubWVudC12YXJpYWJsZXMvKSxcbiAgLy8gaW5jbHVkaW5nIGxlZ2FjeSBhbGlhc2VzOyBhcHAtc3BlY2lmaWMgbmFtZXMgc3VjaCBhcyBDTE9VREZMQVJFX1IyX0FDQ0VTU19LRVlfSUQgc3RheSBlbGlnaWJsZS5cbiAgJ0NGX0FDQ09VTlRfSUQnLFxuICAnQ0ZfQVBJX0JBU0VfVVJMJyxcbiAgJ0NGX0FQSV9FTUFJTCcsXG4gICdDRl9BUElfS0VZJyxcbiAgJ0NGX0FQSV9UT0tFTicsXG4gICdDRl9FTUFJTCcsXG4gICdDTE9VREZMQVJFX0FDQ0VTU19DTElFTlRfSUQnLFxuICAnQ0xPVURGTEFSRV9BQ0NFU1NfQ0xJRU5UX1NFQ1JFVCcsXG4gICdDTE9VREZMQVJFX0FDQ09VTlRfSUQnLFxuICAnQ0xPVURGTEFSRV9BUElfQkFTRV9VUkwnLFxuICAnQ0xPVURGTEFSRV9BUElfS0VZJyxcbiAgJ0NMT1VERkxBUkVfQVBJX1RPS0VOJyxcbiAgJ0NMT1VERkxBUkVfQVVUSF9VU0VfS0VZUklORycsXG4gICdDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEJyxcbiAgJ0NMT1VERkxBUkVfRU1BSUwnLFxuICAnQ0xPVURGTEFSRV9FTlYnLFxuICAnQ0xPVURGTEFSRV9JTkNMVURFX1BST0NFU1NfRU5WJyxcbiAgJ0NMT1VERkxBUkVfTE9BRF9ERVZfVkFSU19GUk9NX0RPVF9FTlYnLFxuICAnRE9DS0VSX0hPU1QnLFxuICAnSFRUUF9QUk9YWScsXG4gICdIVFRQU19QUk9YWScsXG4gICdodHRwX3Byb3h5JyxcbiAgJ2h0dHBzX3Byb3h5JyxcbiAgJ0ZPUkNFX0NPTE9SJyxcbiAgJ01JTklGTEFSRV9DQUNIRV9ESVInLFxuICAnTUlTRV9FTlYnLFxuICAnTk9fQ09MT1InLFxuICAnTkVYVF9QVUJMSUNfV0JfRU5WJyxcbiAgJ05FWFRfUFVCTElDX1dCX1ZFUlNJT04nLFxuICAnTk9ERV9FTlYnLFxuICAnUE9SVCcsXG4gICdXQl9FTlYnLFxuICAnV0JfVkVSU0lPTicsXG5dKTtcblxuY29uc3QgTk9OX1NFQ1JFVF9LRVlfUFJFRklYRVMgPSBbJ1dSQU5HTEVSXycsICdDTE9VREZMQVJFX0hZUEVSRFJJVkVfTE9DQUxfQ09OTkVDVElPTl9TVFJJTkdfJywgJ0NMT1VERkxBUkVfQ0ZfRkVUQ0hfJ107XG5cbmZ1bmN0aW9uIGlzTm9uU2VjcmV0S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBOT05fU0VDUkVUX0tFWVMuaGFzKGtleSkgfHwgTk9OX1NFQ1JFVF9LRVlfUFJFRklYRVMuc29tZSgocHJlZml4KSA9PiBrZXkuc3RhcnRzV2l0aChwcmVmaXgpKTtcbn1cblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIERlcGxveUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIERlcGxveUNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPERlcGxveUNvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgRGVwbG95Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6XG4gICAgJ0RlcGxveSBhIENsb3VkZmxhcmUgV29ya2VycyBhcHAgKHZpbmV4dCBvciBwbGFpbiBXb3JrZXIpIHRvIHRoZSBXQl9FTlYgZW52aXJvbm1lbnQ6IHZhbGlkYXRlIHNlY3JldHMsIGJ1aWxkLCBhcHBseSByZW1vdGUgRDEgbWlncmF0aW9ucywgdGhlbiBkZXBsb3kgY29kZSBhbmQgc2VjcmV0cyBhdG9taWNhbGx5LicsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4geWFyZ3MgYXMgdW5rbm93biBhcyBBcmd2PERlcGxveUNvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2OiBEZXBsb3lDb21tYW5kQXJndikge1xuICAgIC8vIEEgc3RyYXkgZXhwb3J0ZWQgQ0xPVURGTEFSRV9FTlYgd291bGQgYmFrZSB0aGUgd3JvbmcgZW52aXJvbm1lbnQgaW50byB0aGUgYnVpbGQgYW5kXG4gICAgLy8gYXBwbHkgdGhlIGVudmlyb25tZW50IHN1ZmZpeCB0d2ljZSBvbiBkZXBsb3k7IGl0IGlzIHJlLXNldCBleHBsaWNpdGx5IHdoZXJlIG5lZWRlZC5cbiAgICAvLyBBIGRvdGVudiBmaWxlIGRlZmluaW5nIGl0IHN0aWxsIHN1cmZhY2VzIHRocm91Z2ggcHJvamVjdC5lbnYsIHdoaWNoIHRoZSBleHBsaWNpdCBgLS1lbnZgXG4gICAgLy8gZmxhZ3MgYmVsb3cgb3ZlcnJpZGUuXG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNMT1VERkxBUkVfRU5WO1xuXG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3Qgd3JhbmdsZXJDb25maWdQYXRoID0gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgICBpZiAoIXdyYW5nbGVyQ29uZmlnUGF0aCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ3diIGRlcGxveSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwcyAobm8gd3JhbmdsZXIgY29uZmlnIGZvdW5kKS4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGVudk5hbWUgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgaWYgKCFlbnZOYW1lIHx8IGVudk5hbWUgPT09ICdkZXZlbG9wbWVudCcgfHwgZW52TmFtZSA9PT0gJ3Rlc3QnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoYFdCX0VOViBtdXN0IG5hbWUgYSBkZXBsb3kgZW52aXJvbm1lbnQgKGUuZy4gc3RhZ2luZyBvciBwcm9kdWN0aW9uKSwgYnV0IGlzICR7ZW52TmFtZX0uYClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHZhbHVlcyBnbyBpbnRvIGJvdGggcHJvY2Vzcy5lbnYgKGluaGVyaXRlZCBieSBldmVyeXRoaW5nIHdiIHNwYXducykgYW5kIHByb2plY3QuZW52XG4gICAgLy8gKHRoZSBlbnZpcm9ubWVudCB3YiBpdHNlbGYgcmVhZHMgYW5kIHBhc3NlcyBleHBsaWNpdGx5KTsgdGhlIGxhdHRlciBpcyBhIGNhY2hlZCBzbmFwc2hvdFxuICAgIC8vIHRha2VuIGJlZm9yZSB0aGlzIHBvaW50LCBzbyB3cml0aW5nIG9ubHkgdG8gcHJvY2Vzcy5lbnYgd291bGQgbGVhdmUgd2IncyBvd24gcHJlZmxpZ2h0IOKAlFxuICAgIC8vIGFuZCBhbnkgY29tbWFuZCBzcGF3bmVkIHdpdGggcHJvamVjdC5lbnYg4oCUIHdpdGhvdXQgdGhlIHRva2VuLlxuICAgIGNvbnN0IGNsb3VkZmxhcmVFbnZWYXJzID0gcmVhZENsb3VkZmxhcmVFbnZGaWxlcyhwcm9qZWN0LmRpclBhdGgsIHByb2plY3Qucm9vdERpclBhdGgpO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNsb3VkZmxhcmVFbnZWYXJzKSkge1xuICAgICAgLy8gPz89IHNvIHRoYXQgYW4gZXhwbGljaXRseSBleHBvcnRlZCBlbXB0eSB2YWx1ZSBzdGlsbCB3aW5zIG92ZXIgdGhlIGZpbGUuXG4gICAgICBwcm9jZXNzLmVudltrZXldID8/PSB2YWx1ZTtcbiAgICAgIHByb2plY3QuZW52W2tleV0gPz89IHZhbHVlO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgcmVzb2x2ZWRDb25maWcgPSByZXNvbHZlV3JhbmdsZXJDb25maWdGb3JFbnYocHJvamVjdCwgZW52TmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFN0cmluZyhlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBpZiAoIXJlc29sdmVkQ29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIHBhcnNlICR7d3JhbmdsZXJDb25maWdQYXRofS5gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGFjY291bnRJZCA9IHJlc29sdmVkQ29uZmlnLmFjY291bnRJZCA/PyBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FDQ09VTlRfSUQ7XG4gICAgLy8gUHJlZmVyIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIHdoZW5ldmVyIHRoZSByZXNvbHZlZCBlbnZpcm9ubWVudCdzIEQxIGJpbmRpbmdzIGhhdmUgYW5cbiAgICAvLyBleGlzdGluZyBtaWdyYXRpb25zIGRpcmVjdG9yeS4gQSBkcml6emxlLW9ybSBkZXBlbmRlbmN5IGFsb25lIGRvZXMgbm90IGltcGx5IHRoZSBwcm9qZWN0XG4gICAgLy8gbWlncmF0ZXMgRDEgd2l0aCBkcml6emxlLWtpdCdzIGQxLWh0dHAgZHJpdmVyOiB0aGUgZXhwbGljaXQgbWFya2VyIGlzIGEgZHJpenpsZSBjb25maWdcbiAgICAvLyB3aG9zZSBkaWFsZWN0L2RyaXZlciB0YXJnZXRzIHNxbGl0ZSAvIGQxLWh0dHAgLyBkdXJhYmxlLXNxbGl0ZSAoc2VlIHVzZXNEcml6emxlS2l0Rm9yRDE7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTQyKS4gQSBkcml6emxlIGNvbmZpZyB0YXJnZXRpbmcgYW5vdGhlclxuICAgIC8vIGRhdGFiYXNlIChlLmcuIFBvc3RncmVTUUwgdmlhIEh5cGVyZHJpdmUpIGxlYXZlcyB0aGUgRDEgYmluZGluZ3MgdW5tYW5hZ2VkIGJ5IHdiIGRlcGxveS5cbiAgICBjb25zdCB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzID0gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMuZmlsdGVyKChkYXRhYmFzZSkgPT5cbiAgICAgIHVzZXNXcmFuZ2xlck5hdGl2ZU1pZ3JhdGlvbnMocHJvamVjdCwgZGF0YWJhc2UpXG4gICAgKTtcbiAgICBjb25zdCBkcml6emxlS2l0TWFuYWdlc0QxID0gdXNlc0RyaXp6bGVLaXRGb3JEMShwcm9qZWN0KTtcbiAgICBpZiAoXG4gICAgICBkcml6emxlS2l0TWFuYWdlc0QxICYmXG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoIDwgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoXG4gICAgKSB7XG4gICAgICAvLyBNaWdyYXRpbmcgb25seSB0aGUgd3JhbmdsZXItbmF0aXZlIHN1YnNldCB3b3VsZCBzaWxlbnRseSBkZXBsb3kgY29kZSBhZ2FpbnN0IHRoZVxuICAgICAgLy8gb3RoZXIsIHVubWlncmF0ZWQgZGF0YWJhc2VzLlxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKCd3YiBkZXBsb3kgZG9lcyBub3Qgc3VwcG9ydCBtaXhpbmcgd3JhbmdsZXItbmF0aXZlIGFuZCBub24tbmF0aXZlIEQxIG1pZ3JhdGlvbiBsYXlvdXRzLicpXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBkcml6emxlRDFEYXRhYmFzZSA9XG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMCAmJiBkcml6emxlS2l0TWFuYWdlc0QxID8gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXNbMF0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoID09PSAwICYmIGRyaXp6bGVLaXRNYW5hZ2VzRDEgJiYgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKCd3YiBkZXBsb3kgc3VwcG9ydHMgZHJpenpsZS1raXQgbWlncmF0aW9ucyBvbmx5IGZvciBhIHNpbmdsZSBEMSBiaW5kaW5nOyBmb3VuZCBtdWx0aXBsZS4nKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgbWFuYWdlZEQxRGF0YWJhc2VzID0gbmV3IFNldCh3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzKTtcbiAgICBpZiAoZHJpenpsZUQxRGF0YWJhc2UpIG1hbmFnZWREMURhdGFiYXNlcy5hZGQoZHJpenpsZUQxRGF0YWJhc2UpO1xuICAgIGNvbnN0IHVubWFuYWdlZEQxRGF0YWJhc2VzID0gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMuZmlsdGVyKChkYXRhYmFzZSkgPT4gIW1hbmFnZWREMURhdGFiYXNlcy5oYXMoZGF0YWJhc2UpKTtcbiAgICBpZiAodW5tYW5hZ2VkRDFEYXRhYmFzZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gU2F5IHNvIG91dCBsb3VkIGluc3RlYWQgb2Ygc2lsZW50bHkgZGVwbG95aW5nIGNvZGUgYWdhaW5zdCB1bm1pZ3JhdGVkIGRhdGFiYXNlczogdGhlXG4gICAgICAvLyBkcml6emxlIG1hcmtlciBkZXRlY3Rpb24gaXMgaGV1cmlzdGljICh0ZXh0IHNjYW4gb2YgZHJpenpsZS5jb25maWcuKiksIHNvIGEgcHJvamVjdCB0aGF0XG4gICAgICAvLyBnZW51aW5lbHkgbWlncmF0ZXMgRDEgbXVzdCBiZSBhYmxlIHRvIG5vdGljZSB3aGVuIG5vIG1lY2hhbmlzbSB3YXMgc2VsZWN0ZWQuIFRoaXMgYWxzb1xuICAgICAgLy8gY292ZXJzIHBhcnRpYWwgbGF5b3V0cyAoc29tZSBiaW5kaW5ncyB3cmFuZ2xlci1uYXRpdmUsIG90aGVycyB1bm1hbmFnZWQpLlxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgYE5vIEQxIG1pZ3JhdGlvbiBtZWNoYW5pc20gZGV0ZWN0ZWQgZm9yICR7dW5tYW5hZ2VkRDFEYXRhYmFzZXNcbiAgICAgICAgICAgIC5tYXAoKGRhdGFiYXNlKSA9PiBkYXRhYmFzZS5iaW5kaW5nID8/IGRhdGFiYXNlLmRhdGFiYXNlX25hbWUgPz8gJ3VubmFtZWQgYmluZGluZycpXG4gICAgICAgICAgICAuam9pbignLCAnKX0gYCArXG4gICAgICAgICAgICAnKG5vIHdyYW5nbGVyIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IGFuZCBubyBkcml6emxlIGNvbmZpZyB0YXJnZXRpbmcgc3FsaXRlL2QxLWh0dHAvZHVyYWJsZS1zcWxpdGUpOyB3YiBkZXBsb3kgd2lsbCBub3QgcnVuIEQxIG1pZ3JhdGlvbnMgZm9yIHRoZW0uJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBEcnkgcnVucyBleGVjdXRlIG5vdGhpbmcgYXV0aGVudGljYXRlZCwgc28gdGhleSBza2lwIHRoZSBjcmVkZW50aWFsIHByZWZsaWdodCBlbnRpcmVseS5cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICAvLyBBIGRyaXp6bGUtc2VsZWN0ZWQgRDEgZGF0YWJhc2Ugcm91dGVzIGJvdGggdGhlIG1pZ3JhdGlvbiBpbiBzdGVwIDMgYW5kIGFueSBkZXBsb3kvcG9zdFxuICAgICAgLy8gaG9vayB0aHJvdWdoIGRyaXp6bGUta2l0J3MgZDEtaHR0cCBkcml2ZXIsIHdoaWNoIG5lZWRzIENMT1VERkxBUkVfQVBJX1RPS0VOIGV2ZW4gZm9yXG4gICAgICAvLyBsb2NhbCwgd3JhbmdsZXItT0F1dGggZGVwbG95cy4gRmFpbGluZyBoZXJlIGtlZXBzIHRoZSBmYWlsLWZhc3Qgb3JkZXJpbmc6IGEgbWlzc2luZyB0b2tlblxuICAgICAgLy8gbXVzdCBhYm9ydCBiZWZvcmUgdGhlIGRlcGxveSBnb2VzIGxpdmUsIG5vdCBkdXJpbmcgbWlncmF0aW9uIG9yIGRlcGxveS9wb3N0XG4gICAgICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTU2KS4gV3JhbmdsZXItbmF0aXZlIHByb2plY3RzICh3aXRoIG9yXG4gICAgICAvLyB3aXRob3V0IGhvb2tzKSBtdXN0IG5vdCByZXF1aXJlIHRoZSB0b2tlbjogYSBsb2NhbCB3cmFuZ2xlciBPQXV0aCBsb2dpbiBzdWZmaWNlcyB0aGVyZSxcbiAgICAgIC8vIGV2ZW4gdGhvdWdoIHN0ZXAgNSBzdGlsbCBleHBvcnRzIENMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQgdG8gdGhlaXIgaG9va3MuXG4gICAgICBpZiAoZHJpenpsZUQxRGF0YWJhc2UgJiYgIXByb2plY3QuZW52LkNMT1VERkxBUkVfQVBJX1RPS0VOKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdDTE9VREZMQVJFX0FQSV9UT0tFTiBpcyByZXF1aXJlZCBmb3IgcmVtb3RlIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMuJykpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNXcmFuZ2xlckF1dGhlbnRpY2F0aW9uID1cbiAgICAgICAgISFwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9UT0tFTiB8fFxuICAgICAgICAhIXByb2plY3QuZW52LkNGX0FQSV9UT0tFTiB8fFxuICAgICAgICAhIShwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9LRVkgJiYgcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9FTUFJTCkgfHxcbiAgICAgICAgISEocHJvamVjdC5lbnYuQ0ZfQVBJX0tFWSAmJiBwcm9qZWN0LmVudi5DRl9FTUFJTCk7XG4gICAgICBpZiAoaXNDSShwcm9qZWN0LmVudi5DSSkgJiYgIWhhc1dyYW5nbGVyQXV0aGVudGljYXRpb24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1dyYW5nbGVyIGF1dGhlbnRpY2F0aW9uIChlLmcuIENMT1VERkxBUkVfQVBJX1RPS0VOKSBpcyByZXF1aXJlZCB0byBkZXBsb3kgb24gQ0kuJykpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwLXNwZWNpZmljIHZhbGlkYXRpb24gaG9vayAoZS5nLiBzZWNyZXQgcGFpcnMgdGhhdCBtdXN0IGJlIGJvdGgtc2V0LW9yLWJvdGgtZW1wdHkpLlxuICAgIC8vIFRoZSByZXVzYWJsZSBkZXBsb3kueW1sIGFscmVhZHkgcnVucyBpdCBvbiBDSTsgcnVuIGl0IGhlcmUgZm9yIGxvY2FsIGRlcGxveXMuXG4gICAgaWYgKCFpc0NJKHByb2plY3QuZW52LkNJKSAmJiBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGVwbG95L2NpLXNldHVwJ10pIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZGVwbG95L2NpLXNldHVwJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgLy8gMS4gUmVzb2x2ZSBhbmQgdmFsaWRhdGUgYWxsIHNlY3JldHMgYmVmb3JlIGFueSBidWlsZCBvciByZW1vdGUgbXV0YXRpb24sIHNvIGEgbWlzc2luZ1xuICAgIC8vICAgIHNlY3JldCBhYm9ydHMgdGhlIGRlcGxveSBpbnN0ZWFkIG9mIGxlYXZpbmcgYSBtaWdyYXRlZCBkYXRhYmFzZSBiZWhpbmQgYW4gb2xkIFdvcmtlci5cbiAgICBjb25zdCBbZW52VmFycywgZW52U291cmNlc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gUmVzdHJpY3QgdGhlIHNlY3JldHMgZG9tYWluIHRvIGtleXMgdGhlIHByb2plY3QncyBmbm94IGNvbmZpZ3VyYXRpb24gZGVjbGFyZXM6IGBtaXNlIGVudmBcbiAgICAvLyBvdXRwdXQgKHJlcG9ydGVkIGFzIGEgcHNldWRvLXNvdXJjZSkgbWl4ZXMgaW4gaG9zdC90b29sIHZhcmlhYmxlcyBzdWNoIGFzIENBUkdPX0hPTUUsXG4gICAgLy8gd2hpY2ggbXVzdCBuZXZlciBiZSB1cGxvYWRlZCBhcyBXb3JrZXIgc2VjcmV0cy5cbiAgICBjb25zdCBmbm94S2V5cyA9IG5ldyBTZXQoXG4gICAgICBlbnZTb3VyY2VzLmZpbHRlcigoW3NvdXJjZV0pID0+ICFzb3VyY2Uuc3RhcnRzV2l0aCgnbWlzZSBlbnYnKSkuZmxhdE1hcCgoWywga2V5c10pID0+IGtleXMpXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgaWYgKCFmbm94S2V5cy5oYXMoa2V5KSkgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gICAgLy8gTmFtZXMgZGVjbGFyZWQgdmlhIHdyYW5nbGVyIGBzZWNyZXRzLnJlcXVpcmVkYCBtYXkgbGlrZXdpc2UgYmUgc3VwcGxpZWQgcHVyZWx5IGFzXG4gICAgLy8gZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuIENJIHdvcmtmbG93IGVudikgaW5zdGVhZCBvZiBmbm94IHZhbHVlcy5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZXNvbHZlZENvbmZpZy5yZXF1aXJlZFNlY3JldE5hbWVzKSB7XG4gICAgICBjb25zdCBleHBvcnRlZFZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlbnZWYXJzW2tleV0gPT09IHVuZGVmaW5lZCAmJiBleHBvcnRlZFZhbHVlICE9PSB1bmRlZmluZWQpIGVudlZhcnNba2V5XSA9IGV4cG9ydGVkVmFsdWU7XG4gICAgfVxuICAgIC8vIEV4cGxpY2l0bHkgZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3Qgd2luIG92ZXIgZG90ZW52IHZhbHVlcyAocHJvamVjdC5lbnYgYWxyZWFkeVxuICAgIC8vIGFwcGxpZXMgdGhhdCBwcmVjZWRlbmNlKSwgb3IgYEFVVEhfU0VDUkVUPS4uLiB3YiBkZXBsb3lgIHdvdWxkIHB1c2ggdGhlIHN0YWxlIGZpbGUgdmFsdWUuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlZmZlY3RpdmVWYWx1ZSAhPT0gdW5kZWZpbmVkKSBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG4gICAgY29uc3Qgc2VjcmV0cyA9IHNlbGVjdFdvcmtlclNlY3JldHMoZW52VmFycywgWy4uLnJlc29sdmVkQ29uZmlnLnZhcktleXMsIC4uLnJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lc10pO1xuICAgIC8vIGAtLXZhciBXQl9WRVJTSU9OOi4uLmAgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIG9uIGRlcGxveSwgc28gYVxuICAgIC8vIHJlc291cmNlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIHdvdWxkIHNpbGVudGx5IGJlY29tZSBhIHN0cmluZyB2YXJpYWJsZS5cbiAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTiAmJiByZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMoJ1dCX1ZFUlNJT04nKSkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1dCX1ZFUlNJT04gY29sbGlkZXMgd2l0aCBhIFdvcmtlciBiaW5kaW5nIG5hbWU7IHJlbmFtZSB0aGUgYmluZGluZy4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGJpbmRpbmdDb2xsaXNpb25zID0gT2JqZWN0LmtleXMoZW52VmFycykuZmlsdGVyKChrZXkpID0+IHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lcy5pbmNsdWRlcyhrZXkpKTtcbiAgICBpZiAoYmluZGluZ0NvbGxpc2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVXBsb2FkaW5nIGEgc2VjcmV0IG5hbWVkIGxpa2UgYSBiaW5kaW5nIHdvdWxkIHJlcGxhY2UgdGhlIGJpbmRpbmcgd2l0aCBhIHBsYWluIHN0cmluZy5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGBTa2lwcGluZyBlbnYga2V5cyB0aGF0IGNvbGxpZGUgd2l0aCBXb3JrZXIgYmluZGluZyBuYW1lczogJHtiaW5kaW5nQ29sbGlzaW9ucy5qb2luKCcsICcpfWApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBXcmFuZ2xlciB2YWxpZGF0ZXMgYHNlY3JldHMucmVxdWlyZWRgIG9ubHkgZHVyaW5nIHRoZSByZWFsIHVwbG9hZCDigJQgYWZ0ZXIgbWlncmF0aW9ucyDigJRcbiAgICAvLyBzbyB3YiBjaGVja3MgdXBmcm9udDogZWFjaCByZXF1aXJlZCBuYW1lIG11c3QgYmUgYSBrZXkgaW4gdGhlIG91dGdvaW5nIHBheWxvYWQgKHByZXNlbmNlLFxuICAgIC8vIG5vdCB0cnV0aGluZXNzIOKAlCBhbiBleHBsaWNpdCBlbXB0eSBjbGVhcnMgYSBzdGFsZSB2YWx1ZSkgb3IgYW4gZWZmZWN0aXZlIHZhci9iaW5kaW5nLlxuICAgIGNvbnN0IHVuc2F0aXNmaWVkUmVxdWlyZWRTZWNyZXROYW1lcyA9IHJlc29sdmVkQ29uZmlnLnJlcXVpcmVkU2VjcmV0TmFtZXMuZmlsdGVyKFxuICAgICAgKG5hbWUpID0+XG4gICAgICAgICFPYmplY3QuaGFzT3duKHNlY3JldHMsIG5hbWUpICYmXG4gICAgICAgICFyZXNvbHZlZENvbmZpZy52YXJLZXlzLmluY2x1ZGVzKG5hbWUpICYmXG4gICAgICAgICFyZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMobmFtZSlcbiAgICApO1xuICAgIGlmICh1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBTZWNyZXRzIHJlcXVpcmVkIGJ5IHRoZSB3cmFuZ2xlciBjb25maWcgYXJlIG5vdCBwcm92aWRlZDogJHt1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMuam9pbignLCAnKX1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IHNlY3JldEtleXMgPSBPYmplY3Qua2V5cyhzZWNyZXRzKS50b1NvcnRlZCgpO1xuICAgIC8vIENsb3VkZmxhcmUgbGltaXRzIGEgYnVsayB1cGxvYWQgdG8gMTAwIHNlY3JldHMsIGVhY2ggdmFyaWFibGUvc2VjcmV0IHZhbHVlIHRvIDUgS0IsIGFuZFxuICAgIC8vIHRoZSBjb21iaW5lZCB2YXJpYWJsZStzZWNyZXQgY291bnQgdG8gMTI4ICg2NCBvbiB0aGUgRnJlZSBwbGFuLCB3aGljaCBjYW5ub3QgYmUgZGV0ZWN0ZWRcbiAgICAvLyBoZXJlIOKAlCBoZW5jZSBhIHdhcm5pbmcpLiBGYWlsaW5nIGJlZm9yZSBhbnkgYnVpbGQgb3IgbWlncmF0aW9uIGtlZXBzIGFuIG92ZXJzaXplZCBwYXlsb2FkXG4gICAgLy8gZnJvbSBhYm9ydGluZyB0aGUgZGVwbG95IGFmdGVyIHJlbW90ZSBtaWdyYXRpb25zIGFscmVhZHkgcmFuLlxuICAgIGlmIChzZWNyZXRLZXlzLmxlbmd0aCA+IDEwMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKGBDbG91ZGZsYXJlIGFjY2VwdHMgYXQgbW9zdCAxMDAgc2VjcmV0cyBwZXIgZGVwbG95LCBidXQgJHtzZWNyZXRLZXlzLmxlbmd0aH0gd2VyZSBzZWxlY3RlZC5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gVGhlIENMSS1wcm92aWRlZCBXQl9WRVJTSU9OIG92ZXJsYXlzIGEgY29uZmlndXJlZCB2YXIgb2YgdGhlIHNhbWUgbmFtZSBvbiBkZXBsb3ksXG4gICAgLy8gc28gb25seSB0aGUgZWZmZWN0aXZlIHZhbHVlIHBhcnRpY2lwYXRlcyBpbiB0aGUgbGltaXQgY2hlY2tzLlxuICAgIGNvbnN0IGVmZmVjdGl2ZVZhcnMgPSBuZXcgTWFwKE9iamVjdC5lbnRyaWVzPHVua25vd24+KHJlc29sdmVkQ29uZmlnLnZhcnMpKTtcbiAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTikgZWZmZWN0aXZlVmFycy5zZXQoJ1dCX1ZFUlNJT04nLCBwcm9qZWN0LmVudi5XQl9WRVJTSU9OKTtcbiAgICBjb25zdCB2YXJFbnRyaWVzID0gWy4uLmVmZmVjdGl2ZVZhcnNdO1xuICAgIGNvbnN0IG92ZXJzaXplZEtleXMgPSBbXG4gICAgICAuLi5zZWNyZXRLZXlzLmZpbHRlcigoa2V5KSA9PiBCdWZmZXIuYnl0ZUxlbmd0aChzZWNyZXRzW2tleV0gPz8gJycsICd1dGY4JykgPiA1ICogMTAyNCksXG4gICAgICAuLi52YXJFbnRyaWVzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKFssIHZhbHVlXSkgPT4gQnVmZmVyLmJ5dGVMZW5ndGgodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpLCAndXRmOCcpID4gNSAqIDEwMjRcbiAgICAgICAgKVxuICAgICAgICAubWFwKChba2V5XSkgPT4ga2V5KSxcbiAgICBdO1xuICAgIGlmIChvdmVyc2l6ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBWYXJpYWJsZSBvciBzZWNyZXQgdmFsdWVzIGV4Y2VlZCBDbG91ZGZsYXJlJ3MgNSBLQiBsaW1pdDogJHtvdmVyc2l6ZWRLZXlzLmpvaW4oJywgJyl9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBgLS1zZWNyZXRzLWZpbGVgIGlzIGFkZGl0aXZlOiByZW1vdGUgc2VjcmV0cyBhYnNlbnQgZnJvbSB0aGUgcGF5bG9hZCBzdGF5IGF0dGFjaGVkIHRvIHRoZVxuICAgIC8vIG5ldyB2ZXJzaW9uLCBzbyB0aGV5IGNvdW50IGFnYWluc3QgdGhlIGNvbWJpbmVkIGxpbWl0IHRvby4gTGlzdGluZyB0aGVtIG5lZWRzIGFuXG4gICAgLy8gYXV0aGVudGljYXRlZCByZW1vdGUgcm91bmQtdHJpcCwgd2hpY2ggZHJ5IHJ1bnMgc2tpcDsgd2hlbiB0aGUgbGlzdGluZyBmYWlscyBmb3IgYW55XG4gICAgLy8gcmVhc29uIG90aGVyIHRoYW4gYSBub3QteWV0LWNyZWF0ZWQgV29ya2VyLCBkZWdyYWRlIHRvIHRoZSBsb2NhbC1vbmx5IGNvdW50IGluc3RlYWQgb2ZcbiAgICAvLyBibG9ja2luZyBhIGRlcGxveSB0aGF0IHdyYW5nbGVyIGl0c2VsZiBtaWdodCBhY2NlcHQuXG4gICAgY29uc3QgcmVtb3RlU2VjcmV0TmFtZXMgPSBhcmd2LmRyeVJ1blxuICAgICAgPyBbXVxuICAgICAgOiBhd2FpdCBsaXN0UmVtb3RlV29ya2VyU2VjcmV0TmFtZXMocHJvamVjdCwgYXJndiwgd3JhbmdsZXJDb25maWdQYXRoLCByZXNvbHZlZENvbmZpZywgZW52TmFtZSk7XG4gICAgY29uc3QgaW5oZXJpdGVkU2VjcmV0TmFtZXMgPSBzZWxlY3RJbmhlcml0ZWRSZW1vdGVTZWNyZXROYW1lcyhcbiAgICAgIHJlbW90ZVNlY3JldE5hbWVzID8/IFtdLFxuICAgICAgc2VjcmV0cyxcbiAgICAgIHZhckVudHJpZXMubWFwKChba2V5XSkgPT4ga2V5KSxcbiAgICAgIHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lc1xuICAgICk7XG4gICAgY29uc3QgY29tYmluZWRDb3VudCA9XG4gICAgICBuZXcgU2V0KFsuLi5zZWNyZXRLZXlzLCAuLi52YXJFbnRyaWVzLm1hcCgoW2tleV0pID0+IGtleSldKS5zaXplICsgaW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RoO1xuICAgIGNvbnN0IGluaGVyaXRlZE5vdGUgPVxuICAgICAgaW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RoID4gMFxuICAgICAgICA/IGAgKGluY2x1ZGluZyAke2luaGVyaXRlZFNlY3JldE5hbWVzLmxlbmd0aH0gcmVtb3RlIHNlY3JldHMga2VwdCBmcm9tIHRoZSBwcmV2aW91cyB2ZXJzaW9uOiAke2luaGVyaXRlZFNlY3JldE5hbWVzLmpvaW4oJywgJyl9KWBcbiAgICAgICAgOiAnJztcbiAgICBpZiAoY29tYmluZWRDb3VudCA+IDEyOCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBDbG91ZGZsYXJlIGFsbG93cyBhdCBtb3N0IDEyOCB2YXJpYWJsZXMgYW5kIHNlY3JldHMgY29tYmluZWQsIGJ1dCAke2NvbWJpbmVkQ291bnR9IHdlcmUgc2VsZWN0ZWQke2luaGVyaXRlZE5vdGV9LmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKGNvbWJpbmVkQ291bnQgPiA2NCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coYCR7Y29tYmluZWRDb3VudH0gdmFyaWFibGVzIGFuZCBzZWNyZXRzJHtpbmhlcml0ZWROb3RlfSBleGNlZWQgdGhlIEZyZWUgcGxhbidzIGxpbWl0IG9mIDY0LmApXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5jeWFuKFxuICAgICAgICBgRGVwbG95aW5nICR7cmVzb2x2ZWRDb25maWcud29ya2VyTmFtZSA/PyBwcm9qZWN0Lm5hbWV9ICgke2Vudk5hbWV9KSB3aXRoICR7c2VjcmV0S2V5cy5sZW5ndGh9IHNlY3JldHM6ICR7c2VjcmV0S2V5cy5qb2luKCcsICcpfWBcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gMi4gQnVpbGQgKHZpbmV4dCBlbWJlZHMgdGhlIGVudmlyb25tZW50LWFwcGxpZWQgd3JhbmdsZXIgY29uZmlnIGludG8gZGlzdC9zZXJ2ZXIvd3JhbmdsZXIuanNvbikuXG4gICAgLy8gICAgQnVpbGRpbmcgYmVmb3JlIG1pZ3JhdGluZyBrZWVwcyBhIGJ1aWxkIGZhaWx1cmUgZnJvbSBsZWF2aW5nIGEgbWlncmF0ZWQgc2NoZW1hIGJlaGluZFxuICAgIC8vICAgIHRoZSBvbGQgV29ya2VyLiBQbGFpbiBXb3JrZXJzIGhhdmUgbm8gYnVpbGQgc3RlcDsgd3JhbmdsZXIgYnVuZGxlcyB0aGUgZW50cnkgaXRzZWxmLlxuICAgIGNvbnN0IGlzVmluZXh0ID0gISEocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpbmV4dCA/PyBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udmluZXh0KTtcbiAgICBjb25zdCBkZXBsb3lDb25maWdQYXRoID0gaXNWaW5leHQgPyBwYXRoLmpvaW4oJ2Rpc3QnLCAnc2VydmVyJywgJ3dyYW5nbGVyLmpzb24nKSA6IHdyYW5nbGVyQ29uZmlnUGF0aDtcbiAgICBjb25zdCBjbG91ZGZsYXJlRW52QXNzaWdubWVudCA9IHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uXG4gICAgICA/IGAke2J1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQoJ0NMT1VERkxBUkVfRU5WJywgZW52TmFtZSl9IGBcbiAgICAgIDogJyc7XG4gICAgaWYgKGlzVmluZXh0KSB7XG4gICAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTikge1xuICAgICAgICBwcm9qZWN0LmVudi5ORVhUX1BVQkxJQ19XQl9WRVJTSU9OIHx8PSBwcm9qZWN0LmVudi5XQl9WRVJTSU9OO1xuICAgICAgfVxuICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZ2VuLWNvZGUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtjbG91ZGZsYXJlRW52QXNzaWdubWVudH1ZQVJOIHZpbmV4dCBidWlsZGAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgLy8gT24gZHJ5IHJ1bnMgdGhlIHZpbmV4dCBidWlsZCBhYm92ZSBpcyBhIHByaW50ZWQgbm8tb3AsIHNvIHRoZSBidWlsdCBjb25maWcgaXNcbiAgICAgIC8vIGxlZ2l0aW1hdGVseSBhYnNlbnQgYW5kIG11c3Qgbm90IGFib3J0IHRoZSBydW4uXG4gICAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRlcGxveUNvbmZpZ1BhdGgpKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgJHtkZXBsb3lDb25maWdQYXRofSBub3QgZm91bmQ7IHRoZSB2aW5leHQgYnVpbGQgZGlkIG5vdCBwcm9kdWNlIGEgZGVwbG95IGNvbmZpZy5gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIC8vIFdyYW5nbGVyIHZhbGlkYXRlcyBpdHMgY29uZmlnIHNjaGVtYSBvbmx5IHdoZW4gaXQgcnVucywgc28gYSBkcnkgcnVuIG9mIHRoZSBidWlsdFxuICAgICAgLy8gY29uZmlnIHN1cmZhY2VzIGNvbmZpZyBhbmQgYnVuZGxlIGVycm9ycyBCRUZPUkUgdGhlIHJlbW90ZSBtaWdyYXRpb25zIGJlbG93IG11dGF0ZVxuICAgICAgLy8gdGhlIGRhdGFiYXNlLCBtaXJyb3JpbmcgdGhlIHBsYWluLVdvcmtlciBkcnkgcnVuLiBObyAtLWVudjogdGhlIGJ1aWx0IGNvbmZpZyBhbHJlYWR5XG4gICAgICAvLyBoYXMgdGhlIGVudmlyb25tZW50IGFwcGxpZWQuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBZQVJOIHdyYW5nbGVyIGRlcGxveSAtLWRyeS1ydW4gLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGRlcGxveUNvbmZpZ1BhdGgpfWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBsYWluIFdvcmtlcnMgYXJlIGZpcnN0IGNvbXBpbGVkIGJ5IHdyYW5nbGVyIGR1cmluZyB0aGUgZGVwbG95IGl0c2VsZjsgYSBkcnkgcnVuXG4gICAgICAvLyBzdXJmYWNlcyBjb21waWxlIGVycm9ycyAoZS5nLiBhIG1pc3NpbmcgZW50cnkgcG9pbnQpIEJFRk9SRSB0aGUgcmVtb3RlIG1pZ3JhdGlvbnNcbiAgICAgIC8vIGJlbG93IG11dGF0ZSB0aGUgZGF0YWJhc2UuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBZQVJOIHdyYW5nbGVyIGRlcGxveSAtLWRyeS1ydW4gLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KHdyYW5nbGVyQ29uZmlnUGF0aCl9JHtyZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IGAgLS1lbnYgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGVudk5hbWUpfWAgOiAnJ31gLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIEFwcGx5IEQxIG1pZ3JhdGlvbnMgdG8gdGhlIHJlbW90ZSBkYXRhYmFzZSB3aXRoIHRoZSBwcm9qZWN0J3Mgc2luZ2xlIG1pZ3JhdGlvblxuICAgIC8vICAgIG1lY2hhbmlzbSAod3JhbmdsZXItbmF0aXZlIHdoZW4gYSBtaWdyYXRpb25zIGRpcmVjdG9yeSBleGlzdHMsIGVsc2UgZHJpenpsZS1raXQgd2hlblxuICAgIC8vICAgIHRoZSBkcml6emxlIGNvbmZpZyB0YXJnZXRzIHNxbGl0ZS9kMS1odHRwL2R1cmFibGUtc3FsaXRlKS4gTWlncmF0aW9ucyBtdXN0IGJlIGJhY2t3YXJkXG4gICAgLy8gICAgY29tcGF0aWJsZTogdGhlIG9sZCBXb3JrZXIgc2VydmVzXG4gICAgLy8gICAgdHJhZmZpYyB1bnRpbCB0aGUgZGVwbG95IGJlbG93LlxuICAgIGNvbnN0IGVudk9wdGlvbiA9IHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gYCAtLWVudiAke3NoZWxsRXNjYXBlQXJndW1lbnQoZW52TmFtZSl9YCA6ICcnO1xuICAgIGZvciAoY29uc3QgZGF0YWJhc2Ugb2Ygd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcykge1xuICAgICAgY29uc3QgZGF0YWJhc2VOYW1lID0gZGF0YWJhc2UuZGF0YWJhc2VfbmFtZSA/PyBkYXRhYmFzZS5iaW5kaW5nO1xuICAgICAgaWYgKCFkYXRhYmFzZU5hbWUpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBgQ0k9dHJ1ZSBZQVJOIHdyYW5nbGVyIGQxIG1pZ3JhdGlvbnMgYXBwbHkgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGRhdGFiYXNlTmFtZSl9IC0tcmVtb3RlIC0tY29uZmlnICR7c2hlbGxFc2NhcGVBcmd1bWVudCh3cmFuZ2xlckNvbmZpZ1BhdGgpfSR7ZW52T3B0aW9ufWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkcml6emxlRDFEYXRhYmFzZSkge1xuICAgICAgaWYgKCFkcml6emxlRDFEYXRhYmFzZS5kYXRhYmFzZV9pZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgVGhlICR7ZW52TmFtZX0gRDEgYmluZGluZyBoYXMgbm8gZGF0YWJhc2VfaWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZy5gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGlmICghYWNjb3VudElkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgJ0NMT1VERkxBUkVfQUNDT1VOVF9JRCAob3IgYWNjb3VudF9pZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnKSBpcyByZXF1aXJlZCBmb3IgcmVtb3RlIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMuJ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBidWlsZERyaXp6bGVLaXRDb21tYW5kKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgJ21pZ3JhdGUnLFxuICAgICAgICAgIGBDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEPSR7ZHJpenpsZUQxRGF0YWJhc2UuZGF0YWJhc2VfaWR9IENMT1VERkxBUkVfQUNDT1VOVF9JRD0ke2FjY291bnRJZH1gXG4gICAgICAgICksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gNC4gRGVwbG95IGNvZGUgYW5kIHNlY3JldHMgYXRvbWljYWxseSAobm8gcG9zdC1kZXBsb3kgc2VjcmV0IHB1c2ggdGhhdCBjb3VsZCBsZWF2ZSB0aGVcbiAgICAvLyAgICBuZXcgdmVyc2lvbiBydW5uaW5nIHdpdGhvdXQg4oCUIG9yIHdpdGggc3RhbGUg4oCUIHNlY3JldHMpLiBUaGUgc2VjcmV0cyBKU09OIGdvZXMgdGhyb3VnaFxuICAgIC8vICAgIGEgbW9kZS0wNjAwIGZpbGUgaW4gYSBwcml2YXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgZGVsZXRlZCByaWdodCBhZnRlciB0aGUgZGVwbG95OlxuICAgIC8vICAgIC9kZXYvc3RkaW4gaXMgTk9UIHJlbGlhYmxlIGhlcmUgYmVjYXVzZSB3cmFuZ2xlciByZWFkcyB0aGUgc2VjcmV0cyBmaWxlIG9ubHkgYWZ0ZXJcbiAgICAvLyAgICB1cGxvYWRpbmcgYXNzZXRzLCBieSB3aGljaCBwb2ludCB0aGUgcGlwZWQgc3RkaW4gbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNvbnN1bWVkIOKAlFxuICAgIC8vICAgIG9ic2VydmVkIGFzIGEgZmxha3kgYENvdWxkIG5vdCByZWFkIGZpbGU6IC9kZXYvc3RkaW5gIG9uIENJLiBFeHBsaWNpdGx5IGVtcHR5IHZhbHVlc1xuICAgIC8vICAgIHN0YXkgaW4gdGhlIHBheWxvYWQ6IC0tc2VjcmV0cy1maWxlIGlzIGFkZGl0aXZlLCBzbyBwdXNoaW5nICcnIGlzIHRoZSBvbmx5IHdheSB0b1xuICAgIC8vICAgIGNsZWFyIGEgc3RhbGUgc2VjcmV0LlxuICAgIGNvbnN0IGRlcGxveUFyZ3MgPSBbXG4gICAgICAnZGVwbG95JyxcbiAgICAgICctLWNvbmZpZycsXG4gICAgICBkZXBsb3lDb25maWdQYXRoLFxuICAgICAgLy8gdmluZXh0J3MgYnVpbHQgY29uZmlnIGFscmVhZHkgaGFzIHRoZSBlbnZpcm9ubWVudCBhcHBsaWVkOyBwYXNzaW5nIC0tZW52IHRoZXJlIHdvdWxkXG4gICAgICAvLyBhcHBseSB0aGUgZW52aXJvbm1lbnQgc3VmZml4IHR3aWNlLlxuICAgICAgLi4uKCFpc1ZpbmV4dCAmJiByZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IFsnLS1lbnYnLCBlbnZOYW1lXSA6IFtdKSxcbiAgICAgIC4uLihwcm9qZWN0LmVudi5XQl9WRVJTSU9OID8gWyctLXZhcicsIGBXQl9WRVJTSU9OOiR7cHJvamVjdC5lbnYuV0JfVkVSU0lPTn1gXSA6IFtdKSxcbiAgICAgICctLXNlY3JldHMtZmlsZScsXG4gICAgXTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgUnVubmluZzogd3JhbmdsZXIgJHtkZXBsb3lBcmdzLmpvaW4oJyAnKX0gPHRlbXBvcmFyeSBzZWNyZXRzIGZpbGU+YCkpO1xuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdCk7XG4gICAgICBjb25zdCBkZXBsb3lFbnYgPSB7IC4uLnByb2plY3QuZW52IH07XG4gICAgICBkZWxldGUgZGVwbG95RW52LkNMT1VERkxBUkVfRU5WO1xuICAgICAgLy8gMG83MDAgZGlyZWN0b3J5ICsgMG82MDAgZmlsZTogcmVhZGFibGUgb25seSBieSB0aGUgZGVwbG95aW5nIHVzZXIsIGxpa2UgdGhlIGRvdGVudlxuICAgICAgLy8gZmlsZXMgdGhlIENJIHdvcmtmbG93IGFscmVhZHkgd3JpdGVzIG5leHQgdG8gaXQuIHdyYW5nbGVyIHJ1bnMgdGhyb3VnaCBhbiBhc3luYyBzcGF3blxuICAgICAgLy8gKHNwYXduU3luYyB3b3VsZCBibG9jayB0aGUgZXZlbnQgbG9vcCwgc28gYSBzaHV0ZG93biBzaWduYWwgd291bGQga2lsbCB0aGUgcHJvY2Vzc1xuICAgICAgLy8gYmVmb3JlIGFueSBjbGVhbnVwKSBhbmQgdGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkIGluIGEgZmluYWxseSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgICAgIC8vIGRlcGxveSBjYW5ub3QgbGVhdmUgdGhlIHBsYWludGV4dCBzZWNyZXRzIGJlaGluZC4gU2h1dGRvd24gaGFuZGxpbmcgZGV0YWlsczpcbiAgICAgIC8vIC0gSGFuZGxlcnMgKGluY2x1ZGluZyBTSUdIVVAsIG9uIHdoaWNoIE5vZGUgYWxzbyB0ZXJtaW5hdGVzIGJ5IGRlZmF1bHQpIGFyZSBpbnN0YWxsZWRcbiAgICAgIC8vICAgQkVGT1JFIHRoZSBmaWxlIGlzIHdyaXR0ZW4gYW5kIHVzZSBwcm9jZXNzLm9uLCBub3Qgb25jZSwgc28gYSByZXBlYXRlZCBzaWduYWwgY2Fubm90XG4gICAgICAvLyAgIGZhbGwgYmFjayB0byBkZWZhdWx0IHRlcm1pbmF0aW9uIGFuZCBieXBhc3MgdGhlIGZpbmFsbHkgY2xlYW51cC5cbiAgICAgIC8vIC0gU0lHSFVQL1NJR1FVSVQgYXJlIGZvcndhcmRlZCB0byB3cmFuZ2xlciBhcyBTSUdURVJNOiB3cmFuZ2xlcidzIGxhdW5jaGVyIHJlbGF5cyBvbmx5XG4gICAgICAvLyAgIFNJR0lOVC9TSUdURVJNIHRvIGl0cyBpbm5lciBOb2RlIHByb2Nlc3MsIGFuZCBhbnl0aGluZyBlbHNlIHdvdWxkIG9ycGhhbiBhIGRlcGxveW1lbnRcbiAgICAgIC8vICAgdGhhdCBrZWVwcyBtdXRhdGluZyB0aGUgcmVtb3RlIFdvcmtlciBhZnRlciB3YiBleGl0cy5cbiAgICAgIC8vIC0gVGhlIHJlLXJhaXNlIGJlbG93IHVzZXMgdGhlIHNpZ25hbCB3YiBpdHNlbGYgcmVjZWl2ZWQ6IHdyYW5nbGVyIGNhdGNoZXMgU0lHSU5UIGFuZFxuICAgICAgLy8gICBleGl0cyBudW1lcmljYWxseSAoZS5nLiAxNDMpLCB3aGljaCBtdXN0IG5vdCBtYXNxdWVyYWRlIGFzIGFuIG9yZGluYXJ5IGZhaWx1cmUuXG4gICAgICBjb25zdCBzZWNyZXRzRGlyUGF0aCA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diLWRlcGxveS0nKSk7XG4gICAgICBjb25zdCBzaHV0ZG93blNpZ25hbHMgPSBbJ1NJR0hVUCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10gYXMgY29uc3Q7XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBsZXQgd3JhbmdsZXJQcm9jZXNzOiBSZXR1cm5UeXBlPHR5cGVvZiBzcGF3bj4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgcmVjZWl2ZWRTaHV0ZG93blNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaHV0ZG93blNpZ25hbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICByZWNlaXZlZFNodXRkb3duU2lnbmFsID8/PSBzaWduYWw7XG4gICAgICAgICAgaWYgKHdyYW5nbGVyUHJvY2Vzcykge1xuICAgICAgICAgICAgd3JhbmdsZXJQcm9jZXNzLmtpbGwoc2lnbmFsID09PSAnU0lHSU5UJyB8fCBzaWduYWwgPT09ICdTSUdURVJNJyA/IHNpZ25hbCA6ICdTSUdURVJNJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3NodXRkb3duU2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcy5ybVN5bmMoc2VjcmV0c0RpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIC8vIFdpdGggdGhlIGhhbmRsZXJzIHJlbW92ZWQsIHJlLXJhaXNpbmcgdHJpZ2dlcnMgdGhlIGRlZmF1bHQgYmVoYXZpb3IuXG4gICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgfVxuICAgICAgbGV0IGRlcGxveVN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VjcmV0c0ZpbGVQYXRoID0gcGF0aC5qb2luKHNlY3JldHNEaXJQYXRoLCAnc2VjcmV0cy5qc29uJyk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2VjcmV0c0ZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZWNyZXRzKSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgICAgICAgZGVwbG95U3RhdHVzID0gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2VzcyA9IHNwYXduKCd3cmFuZ2xlcicsIFsuLi5kZXBsb3lBcmdzLCBzZWNyZXRzRmlsZVBhdGhdLCB7XG4gICAgICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgICAgIGVudjogZGVwbG95RW52IGFzIE5vZGVKUy5Qcm9jZXNzRW52LFxuICAgICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2Vzcy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmVzb2x2ZSgxKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB3cmFuZ2xlclByb2Nlc3Mub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHNpZ25hbCA/IDEgOiAoY29kZSA/PyB1bmRlZmluZWQpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBwcm9jZXNzLmV4aXQgc2tpcHMgZmluYWxseSBibG9ja3MsIHNvIHRoZSBleGl0LW9uLWZhaWx1cmUgYmVsb3cgc3RheXMgb3V0c2lkZS5cbiAgICAgICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5vZmYoc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhzZWNyZXRzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlY2VpdmVkU2h1dGRvd25TaWduYWwpIHtcbiAgICAgICAgLy8gUmUtcmFpc2Ugc28gdGhlIGNhbGxlciBvYnNlcnZlcyB0aGUgc2FtZSBzaWduYWwtZGVyaXZlZCBleGl0IHN0YXR1cy5cbiAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCByZWNlaXZlZFNodXRkb3duU2lnbmFsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRlcGxveVN0YXR1cyAhPT0gMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgd3JhbmdsZXIgZGVwbG95IGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2RlcGxveVN0YXR1cyA/PyAndW5rbm93bid9LmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGRlcGxveVN0YXR1cyA/PyAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA1LiBPcHRpb25hbCBwb3N0LWRlcGxveSBob29rIChlLmcuIHNlZWRpbmcgdGhlIHJlbW90ZSBEMSB2aWEgZHJpenpsZSdzIGQxLWh0dHAgZHJpdmVyKS5cbiAgICAvLyAgICBBc3NpZ24gdGhlIHJlc29sdmVkIGlkcyB1bmNvbmRpdGlvbmFsbHk6IGEgc3RhbGUgZXhwb3J0ZWQgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRFxuICAgIC8vICAgIG11c3Qgbm90IHJlZGlyZWN0IHRoZSBob29rIHRvIGFub3RoZXIgZGF0YWJhc2UuXG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkZXBsb3kvcG9zdCddKSB7XG4gICAgICAvLyBUaGUgaWQgaXMgdW5hbWJpZ3VvdXMgb25seSB3aXRoIGEgc2luZ2xlIEQxIGJpbmRpbmc7IHdpdGggbXVsdGlwbGUsIHRoZSBob29rIG11c3RcbiAgICAgIC8vIHJlc29sdmUgaXRzIHRhcmdldCBpdHNlbGYuIENsZWFyIGZpcnN0IGVpdGhlciB3YXk6IGEgc3RhbGUgaW5oZXJpdGVkIGlkIG11c3Qgbm90XG4gICAgICAvLyByZWRpcmVjdCB0aGUgaG9vayB0byBhbm90aGVyIGRhdGFiYXNlLlxuICAgICAgY29uc3QgaG9va0QxRGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMSA/IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgZGVsZXRlIHByb2plY3QuZW52LkNMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQ7XG4gICAgICBpZiAocmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KCdNdWx0aXBsZSBEMSBiaW5kaW5ncyBleGlzdDsgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCBpcyBub3Qgc2V0IGZvciBkZXBsb3kvcG9zdC4nKSk7XG4gICAgICB9XG4gICAgICBpZiAoaG9va0QxRGF0YWJhc2U/LmRhdGFiYXNlX2lkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEID0gaG9va0QxRGF0YWJhc2UuZGF0YWJhc2VfaWQ7XG4gICAgICBpZiAoYWNjb3VudElkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FDQ09VTlRfSUQgPSBhY2NvdW50SWQ7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ1lBUk4gcnVuIGRlcGxveS9wb3N0JywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBSZWFkIHRoZSBDbG91ZGZsYXJlIEFQSSB0b2tlbiB0aGF0IENJIGRyb3BzIGluIGEgYC5lbnYuY2xvdWRmbGFyZWAgZmlsZSAoZS5nLiB0aGUgcmV1c2FibGVcbiAqIGRlcGxveSB3b3JrZmxvdydzIGBmaWxlX3BhdGhfMWApLCBsb29raW5nIGJlc2lkZSB0aGUgV29ya2VyJ3Mgd3JhbmdsZXIgY29uZmlnIGFuZCBhdCB0aGVcbiAqIG1vbm9yZXBvIHJvb3Qg4oCUIGBmaWxlX3BhdGhfMWAgaXMgcmVwby1yZWxhdGl2ZSwgc28gYm90aCBzcGVsbGluZ3Mgb2NjdXIgaW4gcHJhY3RpY2UuXG4gKiBOZWFyZXIgZmlsZXMgd2luOiBhIHdvcmtzcGFjZSBtYXkgb3ZlcnJpZGUgdGhlIHJvb3QgdG9rZW4sIG5ldmVyIHRoZSByZXZlcnNlLlxuICogYENMT1VERkxBUkVfRU5WYCBpcyBkcm9wcGVkOyBpdCB3b3VsZCBkb3VibGUtYXBwbHkgdGhlIGVudmlyb25tZW50IHN1ZmZpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRDbG91ZGZsYXJlRW52RmlsZXMoZGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBjdXJyZW50RGlyUGF0aCBvZiBuZXcgU2V0KHJvb3REaXJQYXRoID8gW2RpclBhdGgsIHJvb3REaXJQYXRoXSA6IFtkaXJQYXRoXSkpIHtcbiAgICBjb25zdCBjbG91ZGZsYXJlRW52UGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJy5lbnYuY2xvdWRmbGFyZScpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhjbG91ZGZsYXJlRW52UGF0aCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IGNsb3VkZmxhcmVFbnZQYXRoLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdDTE9VREZMQVJFX0VOVicpIGNvbnRpbnVlO1xuICAgICAgZW52VmFyc1trZXldID8/PSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogU2VsZWN0IHRoZSBzZWNyZXRzIHRvIHB1c2ggdG8gdGhlIFdvcmtlciBmcm9tIHRoZSBkb3RlbnYtbG9hZGVkIGVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIGV2ZXJ5IGV4cGxpY2l0bHkgc2V0IHZhbHVlIOKAlCBpbmNsdWRpbmcgZW1wdHkgc3RyaW5ncywgd2hpY2ggY2xlYXIgc3RhbGUgcmVtb3RlIHNlY3JldHNcbiAqIHNpbmNlIGB3cmFuZ2xlciBkZXBsb3kgLS1zZWNyZXRzLWZpbGVgIGlzIGFkZGl0aXZlIOKAlCBleGNlcHQgd3JhbmdsZXIgYHZhcnNgIChhIHNlY3JldCBtYXlcbiAqIG5vdCBzaGFyZSBhIG5hbWUgd2l0aCBhIHZhciksIGRlcGxveS1jb250cm9sIGtleXMsIGFuZCBsb2NhbCBgZmlsZTpgIERBVEFCQVNFX1VSTHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RXb3JrZXJTZWNyZXRzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGNvbmZpZ1ZhcktleXM6IHN0cmluZ1tdKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNvbmZpZ0tleXMgPSBuZXcgU2V0KGNvbmZpZ1ZhcktleXMpO1xuICBjb25zdCBzZWNyZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIC8vIE5vIHJ1bnRpbWUgdW5kZWZpbmVkIGNoZWNrIG9uIGB2YWx1ZWA6IGVudlZhcnMgaXMgYnVpbHQgZXhjbHVzaXZlbHkgZnJvbSBkb3RlbnYtcGFyc2VkXG4gIC8vIHN0cmluZ3MsIGFuZCBldmVyeSBjYWxsZXItc2lkZSBtZXJnZSBlaXRoZXIgY29hbGVzY2VzIHdpdGggYD8/ICcnYCBvciBndWFyZHMgYWdhaW5zdFxuICAvLyB1bmRlZmluZWQgYmVmb3JlIGFzc2lnbmluZywgc28gdGhlIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gdHlwZSBob2xkcyBhdCBydW50aW1lIHRvby5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICBpZiAoY29uZmlnS2V5cy5oYXMoa2V5KSB8fCBpc05vblNlY3JldEtleShrZXkpKSBjb250aW51ZTtcbiAgICBpZiAoa2V5ID09PSAnREFUQUJBU0VfVVJMJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdmaWxlOicpKSBjb250aW51ZTtcbiAgICBzZWNyZXRzW2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gc2VjcmV0cztcbn1cblxuLyoqXG4gKiBMaXN0IHRoZSBzZWNyZXQgbmFtZXMgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoZSBkZXBsb3kgdGFyZ2V0IFdvcmtlci4gUmV0dXJucyB1bmRlZmluZWQgd2hlblxuICogdGhlIGxpc3RpbmcgZmFpbHMgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiB0aGUgV29ya2VyIG5vdCBleGlzdGluZyB5ZXQgKGZpcnN0IGRlcGxveSksIHNvXG4gKiB0aGUgY2FsbGVyIGNhbiBkZWdyYWRlIHRvIHRoZSBsb2NhbC1vbmx5IGxpbWl0IGNoZWNrcyBpbnN0ZWFkIG9mIGJsb2NraW5nIGEgZGVwbG95IHRoYXRcbiAqIHdyYW5nbGVyIGl0c2VsZiBtaWdodCBhY2NlcHQuIEZhaWxpbmcgY2xvc2VkIGluc3RlYWQgd291bGQgdHVybiBldmVyeSB0cmFuc2llbnQgbGlzdGluZ1xuICogZmFpbHVyZSAobmV0d29yaywgYSB0b2tlbiB3aXRob3V0IHNlY3JldC1yZWFkIHBlcm1pc3Npb24pIGludG8gYSBkZXBsb3kgYmxvY2tlciwgYW5kIOKAlCBzaW5jZVxuICogd3JhbmdsZXIgNC54IHJlcG9ydHMgYSBtaXNzaW5nIFdvcmtlciBvbmx5IHZpYSBhbiBlcnJvci1tZXNzYWdlIGhpbnQg4oCUIGFueSB1bnJlY29nbml6ZWRcbiAqIG5vdC1mb3VuZCBzaGFwZSB3b3VsZCB0aGVuIGJsb2NrIGZpcnN0IGRlcGxveXMgZW50aXJlbHk7IHRoaXMgcHJlZmxpZ2h0IG11c3Qgb25seSBldmVyIGFkZFxuICogZmFpbHVyZXMgdGhhdCB3cmFuZ2xlciBpdHNlbGYgd291bGQgcmFpc2UgYWZ0ZXIgdGhlIG1pZ3JhdGlvbnMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RSZW1vdGVXb3JrZXJTZWNyZXROYW1lcyhcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogRGVwbG95Q29tbWFuZEFyZ3YsXG4gIHdyYW5nbGVyQ29uZmlnUGF0aDogc3RyaW5nLFxuICByZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyxcbiAgZW52TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB7XG4gIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdCk7XG4gIGNvbnN0IGxpc3RBcmdzID0gW1xuICAgICdzZWNyZXQnLFxuICAgICdsaXN0JyxcbiAgICAnLS1mb3JtYXQnLFxuICAgICdqc29uJyxcbiAgICAnLS1jb25maWcnLFxuICAgIHdyYW5nbGVyQ29uZmlnUGF0aCxcbiAgICAuLi4ocmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBbJy0tZW52JywgZW52TmFtZV0gOiBbXSksXG4gIF07XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiB3cmFuZ2xlciAke2xpc3RBcmdzLmpvaW4oJyAnKX1gKSk7XG4gIGxldCByZXQ7XG4gIHRyeSB7XG4gICAgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYygnd3JhbmdsZXInLCBsaXN0QXJncywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52IGFzIE5vZGVKUy5Qcm9jZXNzRW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICBgRmFpbGVkIHRvIHJ1biB3cmFuZ2xlciB0byBsaXN0IHJlbW90ZSBzZWNyZXRzOyBjaGVja2luZyBvbmx5IHRoZSBsb2NhbCBwYXlsb2FkIGFnYWluc3QgQ2xvdWRmbGFyZSdzIGxpbWl0cy5cXG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChyZXQuc3RhdHVzID09PSAwKSB7XG4gICAgLy8gQ3V0IHRoZSBKU09OIGFycmF5IG91dCBvZiB0aGUgc3Vycm91bmRpbmcgb3V0cHV0OiB3cmFuZ2xlciBtYXkgcHJpbnQgaXRzIGJhbm5lciBhbmRcbiAgICAvLyBcIk11bHRpcGxlIGVudmlyb25tZW50c1wiIHdhcm5pbmdzIGFyb3VuZCB0aGUgcGF5bG9hZC5cbiAgICBjb25zdCBqc29uU3RhcnQgPSByZXQuc3Rkb3V0LmluZGV4T2YoJ1snKTtcbiAgICBjb25zdCBqc29uRW5kID0gcmV0LnN0ZG91dC5sYXN0SW5kZXhPZignXScpO1xuICAgIGlmIChqc29uU3RhcnQgIT09IC0xICYmIGpzb25FbmQgIT09IC0xICYmIGpzb25TdGFydCA8IGpzb25FbmQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmV0LnN0ZG91dC5zbGljZShqc29uU3RhcnQsIGpzb25FbmQgKyAxKSkgYXMgeyBuYW1lPzogdW5rbm93biB9W107XG4gICAgICAgIHJldHVybiBwYXJzZWQubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSkuZmlsdGVyKChuYW1lKTogbmFtZSBpcyBzdHJpbmcgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gdGhlIHdhcm5pbmcgYmVsb3cuXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKC9cXFtjb2RlOiAxMDAoMDd8OTApXFxdfElmIHRoaXMgaXMgYSBuZXcgV29ya2VyLy50ZXN0KHJldC5zdGRvdXQgKyByZXQuc3RkZXJyKSkge1xuICAgIC8vIFRoZSBXb3JrZXIgZG9lcyBub3QgZXhpc3QgeWV0LCBzbyBhIGZpcnN0IGRlcGxveSBpbmhlcml0cyBub3RoaW5nLiBXcmFuZ2xlciA0LnggY2F0Y2hlc1xuICAgIC8vIHRoZSBDbG91ZGZsYXJlIEFQSSBlcnJvcnMgMTAwMDcgKHdvcmtlcnMuYXBpLmVycm9yLnNlcnZpY2Vfbm90X2ZvdW5kKSBhbmQgMTAwOTBcbiAgICAvLyAod29ya2Vycy5hcGkuZXJyb3Iuc2NyaXB0X25vdF9mb3VuZCkgYW5kIHJldGhyb3dzIHRoZW0gYXMgYSBVc2VyRXJyb3IgY29udGFpbmluZyB0aGVcbiAgICAvLyAnSWYgdGhpcyBpcyBhIG5ldyBXb3JrZXIsIHJ1biBgd3JhbmdsZXIgZGVwbG95YCBmaXJzdCcgaGludCB3aXRob3V0IHRoZSBudW1lcmljIGNvZGUsXG4gICAgLy8gc28gbWF0Y2ggYm90aCBzaGFwZXMuXG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnNvbGUud2FybihcbiAgICBjaGFsay55ZWxsb3coXG4gICAgICBgRmFpbGVkIHRvIGxpc3QgdGhlIHJlbW90ZSBXb3JrZXIgc2VjcmV0czsgY2hlY2tpbmcgb25seSB0aGUgbG9jYWwgcGF5bG9hZCBhZ2FpbnN0IENsb3VkZmxhcmUncyBsaW1pdHMuXFxuJHsocmV0LnN0ZGVyciB8fCByZXQuc3Rkb3V0KS50cmltKCl9YFxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZW1vdGUgc2VjcmV0cyB0aGF0IHN0YXkgYXR0YWNoZWQgdG8gdGhlIG5ldyB2ZXJzaW9uOiBgd3JhbmdsZXIgZGVwbG95IC0tc2VjcmV0cy1maWxlYCBpc1xuICogYWRkaXRpdmUsIHNvIGV2ZXJ5IHJlbW90ZSBzZWNyZXQgdGhlIG91dGdvaW5nIHBheWxvYWQgZG9lcyBub3Qgb3ZlcndyaXRlIGtlZXBzIGNvdW50aW5nXG4gKiBhZ2FpbnN0IENsb3VkZmxhcmUncyBjb21iaW5lZCB2YXJpYWJsZStzZWNyZXQgbGltaXQg4oCUIGV4Y2VwdCBuYW1lcyB0aGF0IGFuIGVmZmVjdGl2ZSB2YXIgb3JcbiAqIGJpbmRpbmcgcmVwbGFjZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJbmhlcml0ZWRSZW1vdGVTZWNyZXROYW1lcyhcbiAgcmVtb3RlU2VjcmV0TmFtZXM6IHN0cmluZ1tdLFxuICBvdXRnb2luZ1NlY3JldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGVmZmVjdGl2ZVZhcktleXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBiaW5kaW5nTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJlcGxhY2VkTmFtZXMgPSBuZXcgU2V0KFsuLi5lZmZlY3RpdmVWYXJLZXlzLCAuLi5iaW5kaW5nTmFtZXNdKTtcbiAgcmV0dXJuIHJlbW90ZVNlY3JldE5hbWVzLmZpbHRlcigobmFtZSkgPT4gIU9iamVjdC5oYXNPd24ob3V0Z29pbmdTZWNyZXRzLCBuYW1lKSAmJiAhcmVwbGFjZWROYW1lcy5oYXMobmFtZSkpO1xufVxuXG4vKipcbiAqIFJlYWRpbmcgYmluRXhpc3RzIHByZXBlbmRzIG5vZGVfbW9kdWxlcy8uYmluIGRpcmVjdG9yaWVzIHRvIHByb2plY3QuZW52LlBBVEgsXG4gKiBzbyB0aGUgZGlyZWN0IChub24tc2hlbGwpIHdyYW5nbGVyIHNwYXducyByZXNvbHZlIHRoZSBsb2NhbCBiaW5hcnkuXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBpZiAoIXByb2plY3QuYmluRXhpc3RzKSB7XG4gICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdygnbm9kZV9tb2R1bGVzLy5iaW4gbm90IGZvdW5kOyByZWx5aW5nIG9uIFBBVEggdG8gcmVzb2x2ZSB3cmFuZ2xlci4nKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRGbm94RW52aXJvbm1lbnRWYXJpYWJsZXMsIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCB9IGZyb20gJy4uL3V0aWxzL2JpblBhdGguanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuaW50ZXJmYWNlIFBhcnNlZERvdGVudkFyZ3Mge1xuICBjb21tYW5kOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIENvbW1hbmRFbnZpcm9ubWVudCB7XG4gIGN3ZDogc3RyaW5nO1xuICBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52O1xufVxuXG5jb25zdCBzaHV0ZG93blNpZ25hbHMgPSBuZXcgU2V0PE5vZGVKUy5TaWduYWxzPihbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSk7XG5cbmV4cG9ydCBjb25zdCBkb3RlbnZDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAnZG90ZW52IFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6ICdMb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGZub3ggYW5kIHJ1biBhIGNvbW1hbmQuJyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PiB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBydW5QYXJzZWREb3RlbnZDb21tYW5kKGdldFBhcnNlZERvdGVudkFyZ3NGcm9tWWFyZ3MoYXJndikpO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFyc2VkRG90ZW52Q29tbWFuZCh7IGNvbW1hbmQgfTogUGFyc2VkRG90ZW52QXJncyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5Db21tYW5kV2l0aEVudmlyb25tZW50KGNvbW1hbmQsICd3YiBkb3RlbnYgLS0gPGNvbW1hbmQ+IFthcmdzLi4uXScpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ29tbWFuZFdpdGhFbnZpcm9ubWVudChcbiAgY29tbWFuZDogc3RyaW5nW10sXG4gIHVzYWdlOiBzdHJpbmcsXG4gIGNvbW1hbmRFbnZpcm9ubWVudD86IENvbW1hbmRFbnZpcm9ubWVudFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjb21tYW5kLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYFVzYWdlOiAke3VzYWdlfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGN3ZCA9IHBhdGgucmVzb2x2ZShjb21tYW5kRW52aXJvbm1lbnQ/LmN3ZCA/PyBwcm9jZXNzLmN3ZCgpKTtcbiAgY29uc3QgZW52ID0gY29tbWFuZEVudmlyb25tZW50Py5lbnYgPz8gcHJvY2Vzcy5lbnY7XG4gIGlmICghY29tbWFuZEVudmlyb25tZW50KSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QpO1xuICBjb25zdCBiZXJyeUJpbkZvbGRlclBhdGggPSBlbnYuQkVSUllfQklOX0ZPTERFUjtcbiAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudik7XG4gIC8vIFN0cmlwcGluZyB5YXJuJ3MgZW52aXJvbm1lbnQgYWxzbyByZW1vdmVzIGl0cyB0ZW1wb3JhcnkgYmluIGZvbGRlciDigJQgdGhlIE9OTFkgcGxhY2VcbiAgLy8geWFybiBCZXJyeSBleHBvc2VzIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMg4oCUIHNvIHJlc3RvcmUgdGhlIHByb2plY3QncyBvd25cbiAgLy8gbm9kZV9tb2R1bGVzLy5iaW4gZGlyZWN0b3JpZXMgdG8ga2VlcCBiYXJlIGJpbmFyeSBuYW1lcyByZXNvbHZhYmxlLiBQbHVnJ24nUGxheSBpbnN0YWxsc1xuICAvLyBjcmVhdGUgbm8gbm9kZV9tb2R1bGVzIGF0IGFsbDsgdGhlIHRlbXBvcmFyeSBiaW4gZm9sZGVyIGlzIHRoZW4gdGhlIHNvbGUgc291cmNlIG9mXG4gIC8vIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMsIHNvIHJlc3RvcmUgaXQgaW5zdGVhZC5cbiAgLy8gVGhlIHRlbXBvcmFyeSBmb2xkZXIgaXMgZGVsaWJlcmF0ZWx5IE5PVCByZXN0b3JlZCB3aGVuIC5iaW4gZGlyZWN0b3JpZXMgZXhpc3Q6IGl0IGFsc29cbiAgLy8gY29udGFpbnMgbm9kZS95YXJuIHNoaW1zLCBhbmQgYSBsZWFrZWQgbm9kZSBzaGltIHdvdWxkIHZpb2xhdGUgd2IncyByZWFsLU5vZGUgZ3VhcmFudGVlXG4gIC8vIGZvciB0b29scyBsaWtlIHdyYW5nbGVyL3ZpbmV4dC4gQ2hpbGQgYHlhcm5gIGludm9jYXRpb25zIHN0YXkgcmVzb2x2YWJsZSB0aHJvdWdoIHRoZVxuICAvLyBsYXVuY2hlciBvbiB0aGUgYmFzZSBQQVRIIChtaXNlL2NvcmVwYWNrKSwgd2hpY2ggZXZlcnkgc3VwcG9ydGVkIGVudmlyb25tZW50IGhhcyDigJRcbiAgLy8gbm90aGluZyBjb3VsZCBoYXZlIHN0YXJ0ZWQgYHlhcm4gcnVuYC9gd2IgZG90ZW52YCB3aXRob3V0IGl0LlxuICBpZiAoIXByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aChjd2QsIGVudikgJiYgYmVycnlCaW5Gb2xkZXJQYXRoKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSCA/IGAke2JlcnJ5QmluRm9sZGVyUGF0aH06JHtlbnYuUEFUSH1gIDogYmVycnlCaW5Gb2xkZXJQYXRoO1xuICB9XG5cbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGNvbW1hbmRbMF0hLCBjb21tYW5kLnNsaWNlKDEpLCB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH0pO1xuICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNodXRkb3duU2lnbmFscykge1xuICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY2hpbGQua2lsbChzaWduYWwpO1xuICAgICAgfTtcbiAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgfVxuICAgIGNoaWxkLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgIHByb2Nlc3Mub2ZmKHNodXRkb3duU2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgLy8gUmUtcmFpc2UgZXZlbiBmb3IgZm9yd2FyZGVkIHNodXRkb3duIHNpZ25hbHMgc28gY2FsbGVycyBvYnNlcnZlIHRoZSBjb252ZW50aW9uYWxcbiAgICAgICAgLy8gc2lnbmFsIGV4aXQgc3RhdHVzIChlLmcuIDEzMCBmb3IgU0lHSU5UKSBpbnN0ZWFkIG9mIGEgbWlzbGVhZGluZyBzdWNjZXNzLlxuICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBjb2RlID8/IDE7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJzZWREb3RlbnZBcmdzRnJvbVlhcmdzKGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZSk6IFBhcnNlZERvdGVudkFyZ3Mge1xuICByZXR1cm4ge1xuICAgIGNvbW1hbmQ6IFtcbiAgICAgIC4uLigoYXJndi5hcmdzIGFzIHVua25vd25bXSB8IHVuZGVmaW5lZCkgPz8gW10pLm1hcChTdHJpbmcpLFxuICAgICAgLi4uKChhcmd2WyctLSddIGFzIHVua25vd25bXSB8IHVuZGVmaW5lZCkgPz8gW10pLm1hcChTdHJpbmcpLFxuICAgIF0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhbmRhcmRXYkVudih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBmaXhUYXJnZXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoXG4gICAgIXZhbHVlIHx8XG4gICAgWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddLmluY2x1ZGVzKHZhbHVlKSB8fFxuICAgIHByb2Nlc3MuZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAnMScgfHxcbiAgICBwcm9jZXNzLmVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJ3RydWUnXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLmVycm9yKFxuICAgIGBXQl9FTlYgbXVzdCBiZSBvbmUgb2YgZGV2ZWxvcG1lbnQsIHRlc3QsIHN0YWdpbmcsIG9yIHByb2R1Y3Rpb24sIGJ1dCBpcyBcIiR7dmFsdWV9XCIuIGAgK1xuICAgICAgYEZpeCAke2ZpeFRhcmdldH0sIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay5gXG4gICk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuLy8gTk9URTogYHdiIGRvdGVudmAgZGVsaWJlcmF0ZWx5IHNraXBzIFByb2plY3QuZW52J3MgZnVsbCB2YWxpZGF0aW9uOiBpdCBpcyBhIGdlbmVyaWMgcnVubmVyIGFsc29cbi8vIHVzZWQgYmVmb3JlIGVudiBzb3VyY2VzIGV4aXN0IChib290c3RyYXApIGFuZCBtdXN0IG5vdCBmYWlsIGZhc3QgZm9yIHJlcG9zaXRvcmllcyB0aGF0IGhhdmUgbm90XG4vLyBhZG9wdGVkIHRoZSBvcmcgZW52IHN0YW5kYXJkLiBBIE5PTi1FTVBUWSBXQl9FTlYgaXMgc3RpbGwgdmFsaWRhdGVkIGFnYWluc3QgdGhlIHN0YW5kYXJkIG1vZGVzLFxuLy8gdGhvdWdoIOKAlCBhIHR5cG8gbGlrZSBgcHJvZGN1dGlvbmAgd291bGQgb3RoZXJ3aXNlIHNpbGVudGx5IHNlbGVjdCB0aGUgYmFzZSAoZGV2ZWxvcG1lbnQpIHZhbHVlcy5cbmZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIFRoZSBtb2RlIGlzIEZPUkNFRCBvbmx5IHdoZW4gV0JfRU5WIGlzIGV4cGxpY2l0bHkgZXhwb3J0ZWQ7IGl0IGRyaXZlcyB0aGUgZm9yY2VkLW1vZGUgb3ZlcnJpZGVcbiAgLy8gYmVsb3cgYW5kIHRoZSB2YWxpZGF0aW9uIGF0IHRoZSBlbmQuXG4gIGNvbnN0IG1vZGUgPSBwcm9jZXNzLmVudi5XQl9FTlY7XG4gIC8vIFRoZSBmbm94IGAtLXByb2ZpbGVgIHNlbGVjdG9yLCBkZWZhdWx0aW5nIHRvIGRldmVsb3BtZW50IGxpa2Ugd2IncyBtYWluIGxvYWRlciAoYFdCX0VOViB8fFxuICAvLyBOT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnYCwgc2VlIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcykgc28gYSByZXBvIGtlZXBpbmcgZGV2LW9ubHkgc2VjcmV0c1xuICAvLyBpbiBgW3Byb2ZpbGVzLmRldmVsb3BtZW50LnNlY3JldHNdYCBsb2FkcyB0aGVtIHdoZW4gV0JfRU5WIGlzIHVuc2V0IGluc3RlYWQgb2Ygb25seSB0aGUgYmFzZVxuICAvLyB0YWJsZS4gSXQgYWRkaXRpb25hbGx5IGhvbm9ycyBhbiBleHBsaWNpdCBGTk9YX1BST0ZJTEUsIGJlY2F1c2UgZm5veCBob25vcnMgaXQgYW5kIGB3YiBkb3RlbnZgXG4gIC8vIHdpdGhvdXQgV0JfRU5WIGlzIGRvY3VtZW50ZWQgdG8gYXMgd2VsbCAoc2VlIHJ1bkZub3hFeHBvcnQncyBpZ25vcmVQcm9maWxlRW52VmFyIG5vdGUpLlxuICAvLyBOT0RFX0VOViBpcyByZWFkIHRocm91Z2ggdGhlIGBydW50aW1lRW52YCBhbGlhcywgbmV2ZXIgYXMgdGhlIGBwcm9jZXNzLmVudi5OT0RFX0VOVmAgbWVtYmVyXG4gIC8vIGV4cHJlc3Npb24gdGhhdCB0aGUgYnVuZGxlciBpbmxpbmVzIHRvICdwcm9kdWN0aW9uJyAod2hpY2ggd291bGQgd3JvbmdseSBzZWxlY3QgcHJvZHVjdGlvbikuXG4gIGNvbnN0IHJ1bnRpbWVFbnYgPSBwcm9jZXNzLmVudjtcbiAgY29uc3QgZm5veENhc2NhZGUgPSBtb2RlIHx8IHJ1bnRpbWVFbnYuRk5PWF9QUk9GSUxFIHx8IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50JztcbiAgLy8gV0JfRU5WIGluIHByb2Nlc3MuZW52IG1lYW5zIHRoZSBtb2RlIGlzIGV4cGxpY2l0bHkgZm9yY2VkLCBzbyB2YWx1ZXMgZnJvbSB0aGUgbW9kZSdzIG93biBmbm94XG4gIC8vIHByb2ZpbGUgd2luIG92ZXIgdmFyaWFibGVzIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQgc2hlbGwg4oCUIGV4Y2VwdCBvbiBDSSwgd2hlcmUgaW5qZWN0ZWQgZW52XG4gIC8vIHZhcnMgbXVzdCBrZWVwIG92ZXJyaWRpbmcgY29tbWl0dGVkIHZhbHVlc1xuICAvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzkzMCkuXG4gIGNvbnN0IG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiA9ICEhbW9kZSAmJiAhaXNDSShwcm9jZXNzLmVudi5DSSk7XG4gIGNvbnN0IFtwYXJzZWRdID0gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGZub3hDYXNjYWRlLCB7IG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiB9KTtcbiAgLy8gRXhwYW5kICR7Li4ufSByZWZlcmVuY2VzIGFnYWluc3QgZXhwb3J0ZWQgdmFyaWFibGVzIHdob3NlIGZub3ggdmFsdWUgbG9zZXMgdG8gdGhlIHNoZWxsXG4gIC8vIChtaXJyb3JpbmcgcmVhZEVudmlyb25tZW50VmFyaWFibGVzJyBlZmZlY3RpdmUtdmFsdWUgc2VtYW50aWNzKTogYSByZWZlcmVuY2UgbXVzdCByZXNvbHZlIHRvXG4gIC8vIHRoZSB2YWx1ZSB0aGUgY2hpbGQgd2lsbCBhY3R1YWxseSBzZWUuIHJlYWRGbm94RW52aXJvbm1lbnRWYXJpYWJsZXMgcmV0dXJucyBhXG4gIC8vIHByb2Nlc3MuZW52LXNoYWRvd2VkIGtleSBvbmx5IHdoZW4gdGhlIGZvcmNlZCBwcm9maWxlIG92ZXJyaWRlcyBpdCwgc28gZXZlcnkgcGFyc2VkIGtleSdzIG93blxuICAvLyB2YWx1ZSB3aW5zIGFuZCBpcyBleGNsdWRlZCBmcm9tIHRoZSByZWZlcmVuY2Ugc2V0LlxuICBjb25zdCByZWZlcmVuY2VFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvY2Vzcy5lbnYpKSB7XG4gICAgLy8gRXNjYXBlIGRvbGxhciBzaWducyBzbyBleHBvcnRlZCB2YWx1ZXMgc3Vic3RpdHV0ZSBsaXRlcmFsbHkgKHBhJHdvcmQgc3RheXMgcGEkd29yZCkuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gcGFyc2VkKSkge1xuICAgICAgcmVmZXJlbmNlRW52W2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKCckJywgU3RyaW5nLnJhd2BcXCRgKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZW52VmFycyA9IGV4cGFuZCh7IHBhcnNlZCwgcHJvY2Vzc0VudjogcmVmZXJlbmNlRW52IH0pLnBhcnNlZCA/PyBwYXJzZWQ7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudltrZXldID09PSB2YWx1ZSkgY29udGludWU7XG4gICAgLy8gQSBwcm9jZXNzLmVudi1zaGFkb3dlZCBrZXkgcmVhY2hlcyBoZXJlIG9ubHkgd2hlbiB0aGUgZm9yY2VkIHByb2ZpbGUgb3ZlcnJpZGVzIGl0IChzZWVcbiAgICAvLyByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzKTsgb24gQ0kgc3VjaCBrZXlzIGFyZSBuZXZlciByZXR1cm5lZCwgc28gbm8gYnJhbmNoIGlzIG5lZWRlZC5cbiAgICBpZiAobW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBXYXJuaW5nOiAke2tleX0gaW4gdGhlIFwiJHttb2RlfVwiIG1vZGUncyBlbnYgc291cmNlcyBvdmVycmlkZXMgdGhlIHZhbHVlIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQgZW52aXJvbm1lbnQgYmVjYXVzZSBXQl9FTlYgaXMgZXhwbGljaXRseSBzZXQuYFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgLy8gVmFsaWRhdGUgb25seSBBRlRFUiBhcHBseWluZyB0aGUgc291cmNlcywgc28gYSBXQl9TS0lQX0VOVl9DSEVDSyBkZWZpbmVkIGluIGFuIGVudiBTT1VSQ0UgaXNcbiAgLy8gaG9ub3JlZDogYm90aCB0aGUgY2FwdHVyZWQgZXhwb3J0ZWQgbW9kZSAoaXQgc2VsZWN0ZWQgdGhlIHByb2ZpbGUpIGFuZCB0aGUgRklOQUwgdmFsdWUgdGhlXG4gIC8vIGNoaWxkIHdpbGwgc2VlIOKAlCB0aGUgZm5veCBwcm9maWxlIG1heSBkZWZpbmUgYSBicm9rZW4gV0JfRU5WIChlLmcuIGBwcm9kY3V0aW9uYCksIGFuZCBhIGZvcmNlZFxuICAvLyBtb2RlJ3MgcHJvZmlsZSBtYXkgZXZlbiBvdmVycmlkZSBhIFZBTElEIGV4cG9ydGVkIHZhbHVlLlxuICB2YWxpZGF0ZVN0YW5kYXJkV2JFbnYobW9kZSwgJ3RoZSBleHBvcnRlZCB2YXJpYWJsZScpO1xuICB2YWxpZGF0ZVN0YW5kYXJkV2JFbnYocHJvY2Vzcy5lbnYuV0JfRU5WLCAndGhlIGVudiBzb3VyY2Ugb3IgdGhlIGV4cG9ydGVkIHZhcmlhYmxlJyk7XG4gIC8vIFRoZSBzZWxlY3RlZCBlbnZpcm9ubWVudCBpcyB3aGF0IGFuIGVudiBzb3VyY2Ugc2lsZW50bHkgcmVzb2x2aW5nIFdCX0VOViB0byBhIERJRkZFUkVOVCB2YWx1ZVxuICAvLyBtdXN0IGFncmVlIHdpdGgsIGVsc2UgdGhlIGNoaWxkIHJ1bnMgbGFiZWxlZCBvbmUgZW52aXJvbm1lbnQgd2hpbGUgY2FycnlpbmcgYW5vdGhlcidzIHNlY3JldHMuXG4gIC8vIE9ubHkgYSBTVEFOREFSRCBjYXNjYWRlIGlzIGVuZm9yY2VkIChtaXJyb3JpbmcgUHJvamVjdC5jb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYpOiBhIGN1c3RvbVxuICAvLyBzZWxlY3RvciBzdWNoIGFzIGBOT0RFX0VOVj1xYWAgbGVnaXRpbWF0ZWx5IHNlbGVjdHMgdGhlIGBxYWAgcHJvZmlsZSB3aGlsZSBXQl9FTlYgc3RheXMgYVxuICAvLyBzdGFuZGFyZCBtb2RlLlxuICBjb25zdCBleHBlY3RlZENhc2NhZGUgPSBmbm94Q2FzY2FkZTtcbiAgaWYgKFxuICAgIHByb2Nlc3MuZW52LldCX0VOViAmJlxuICAgIFsnZGV2ZWxvcG1lbnQnLCAndGVzdCcsICdzdGFnaW5nJywgJ3Byb2R1Y3Rpb24nXS5pbmNsdWRlcyhleHBlY3RlZENhc2NhZGUpICYmXG4gICAgcHJvY2Vzcy5lbnYuV0JfRU5WICE9PSBleHBlY3RlZENhc2NhZGUgJiZcbiAgICBwcm9jZXNzLmVudi5XQl9TS0lQX0VOVl9DSEVDSyAhPT0gJzEnICYmXG4gICAgcHJvY2Vzcy5lbnYuV0JfU0tJUF9FTlZfQ0hFQ0sgIT09ICd0cnVlJ1xuICApIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYFdCX0VOViByZXNvbHZlcyB0byBcIiR7cHJvY2Vzcy5lbnYuV0JfRU5WfVwiIGFsdGhvdWdoIHRoZSBcIiR7ZXhwZWN0ZWRDYXNjYWRlfVwiIGVudmlyb25tZW50IHdhcyBzZWxlY3RlZC4gYCArXG4gICAgICAgIGBGaXggdGhlIFdCX0VOViBkZWZpbmVkIGluIHRoZSBlbnYgc291cmNlcywgb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLmBcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBGSUxFX1NDSEVNQSwgZ2V0RmlsZURhdGFiYXNlVXJsUGF0aCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiB9IGZyb20gJy4vbGl0ZXN0cmVhbS5qcyc7XG5cbmNvbnN0IFBPU1NJQkxFX1BSSVNNQV9QQVRIUyA9IFtcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ3ByaXNtYScgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSwgZGJQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbignZGInLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdkYicgfSxcbl07XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgXG4gKiBhbmQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFByaXNtYVNjcmlwdHMge1xuICBjbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0TW91bnREaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNsZWFuVXBDb21tYW5kID0gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICAvLyBDbGVhbnVwIGV4aXN0aW5nIGFydGlmYWN0cyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBMaXRlc3RyZWFtIHJlcGxpY2F0aW9uLlxuICAgIC8vIE5vdGUgdGhhdCBkb24ndCBtZXJnZSBtdWx0aXBsZSBybSBjb21tYW5kcyBpbnRvIG9uZSwgYmVjYXVzZSBpZiBvbmUgZmFpbHMsIHRoZSBzdWJzZXF1ZW50IG9uZXMgd29uJ3QgcnVuLlxuICAgIHJldHVybiBgJHtjbGVhblVwQ29tbWFuZH07IHJtIC1SZiAke2RpclBhdGh9Ly5wcm9kLnNxbGl0ZTMqIHx8IHRydWVgO1xuICB9XG5cbiAgZGVwbG95KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIGdlbmVyYXRlKF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBbJ1BSSVNNQSBnZW5lcmF0ZScsIGFkZGl0aW9uYWxPcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldE1vdW50RGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnT3B0aW9uID0gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0KTtcbiAgICAvLyBgcHJpc21hIG1pZ3JhdGUgcmVzZXRgIGNhbiBmYWlsIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGV4aXN0aW5nIGRhdGFiYXNlLCBzbyB3ZSByZW1vdmUgaXQgZmlyc3QuXG4gICAgLy8gRG9uJ3Qgc2tpcCBcIm1pZ3JhdGUgZGVwbG95XCIgYmVjYXVzZSByZXN0b3JlZCBkYXRhYmFzZSBtYXkgYmUgb2xkZXIgdGhhbiB0aGUgY3VycmVudCBzY2hlbWEuXG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07IFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQgJiYgJHtyZW1vdmVEYkNvbW1hbmR9XG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgJHtsaXRlc3RyZWFtQ29uZmlnT3B0aW9ufSAtbyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBscyAtYWhsICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXN0QmFja3Vwcyhwcm9qZWN0OiBQcm9qZWN0LCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0TW91bnREaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgbGl0ZXN0cmVhbSBsdHggJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9ICYmICR7dGhpcy5nZW5lcmF0ZShwcm9qZWN0KX0gJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXYgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgY29uc3Qgc3RlcHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgY2xlYW51cENvbW1hbmQgPSBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0KTtcbiAgICBpZiAoY2xlYW51cENvbW1hbmQpIHN0ZXBzLnB1c2goY2xlYW51cENvbW1hbmQpO1xuICAgIGNvbnN0IHJlc2V0Q29tbWFuZCA9IFsnUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZScsIGFkZGl0aW9uYWxPcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIHN0ZXBzLnB1c2gocmVzZXRDb21tYW5kKTtcbiAgICByZXR1cm4gc3RlcHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nLCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0TW91bnREaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgcm0gLVJmICR7b3V0cHV0UGF0aH0qOyBsaXRlc3RyZWFtIHJlc3RvcmUgJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSAtbyAke291dHB1dFBhdGh9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gQmxpdHogc2VlZCBtb2R1bGVzIGRlZmF1bHQtZXhwb3J0IHRoZSBzZWVkIGZ1bmN0aW9uIHdpdGhvdXQgY2FsbGluZyBpdCwgc28gb25seVxuICAgIC8vIGBibGl0eiBkYiBzZWVkYCAod2hvc2UgbG9hZGVyIGludm9rZXMgdGhlIGV4cG9ydCkgYWN0dWFsbHkgcG9wdWxhdGVzIHRoZSBkYXRhYmFzZS5cbiAgICAvLyBCdW4tZXJhIEJsaXR6IHJlcG9zaXRvcmllcyBkZWNsYXJlIHByaXNtYS5zZWVkIGluc3RlYWQgYW5kIG11c3QgYXZvaWQgdGhlIGJsaXR6IENMSSxcbiAgICAvLyB3aGljaCBwYXRjaGVzIHRoZSBpbnN0YWxsZWQgbmV4dCBwYWNrYWdlIGluc2lkZSBCdW4ncyBzaGFyZWQgZ2xvYmFsIHN0b3JlLlxuICAgIGlmICghcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgJiYgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdibGl0eicpKSB7XG4gICAgICByZXR1cm4gYFlBUk4gYmxpdHogZGIgc2VlZCR7c2NyaXB0UGF0aCA/IGAgLWYgJHtzY3JpcHRQYXRofWAgOiAnJ31gO1xuICAgIH1cbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgY29uc3Qgc2VlZHNQYXRoID0gYCR7cHJvamVjdC5wcmlzbWFEaXJOYW1lfS9zZWVkcy50c2A7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwiJHtzZWVkc1BhdGh9XCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuICR7c2VlZHNQYXRofTsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gICAgICBpZiAoYmFzZURpcikge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyLCBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKSk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG4vKiogV2hlcmUgdGhlIExpdGVzdHJlYW0tcmVwbGljYXRlZCBTUUxpdGUgZGF0YWJhc2UgaXMgbW91bnRlZCwgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QgZGlyZWN0b3J5LiAqL1xuZnVuY3Rpb24gZ2V0TW91bnREaXJQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7cHJvamVjdC5wcmlzbWFEaXJOYW1lfS9tb3VudGA7XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF07IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBQUklTTUEgZGIgZXhlY3V0ZSAtLXN0ZGluIC0tdXJsIFwiJHtGSUxFX1NDSEVNQX0ke2RiUGF0aH1cIjsgZmkgJiYgcm0gLWYgXCIke2RiUGF0aH1cIi4qIFwiJHtkYlBhdGh9XCItKmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3RGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFyYXdEYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKHJhd0RiUGF0aClcbiAgICA/IHJhd0RiUGF0aFxuICAgIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciA/PyAnLicsIHJhd0RiUGF0aCk7XG5cbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IHsgbm9ybWFsaXplQnVuTG9ja2ZpbGUgYXMgbm9ybWFsaXplU2hhcmVkQnVuTG9ja2ZpbGUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG4vKipcbiAqIFN0cmlwIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGBidW4ubG9ja2AgYW5kIHJlcG9ydCBhIGNoYW5nZS5cbiAqXG4gKiBidW4gcmVjb3JkcyBhbiBhYnNvbHV0ZSBgcmVzb2x2ZWRgIFVSTCBmb3IgYW4gYWxyZWFkeS1sb2NrZWQgcGFja2FnZSB3aGVuZXZlciB0aGUgY29uZmlndXJlZFxuICogcmVnaXN0cnkgZG9lcyBub3Qgc2VydmUgdGhlIHRhcmJhbGwgaG9zdCBuYW1lZCBpbiB0aGUgcGFja2FnZSBtZXRhZGF0YSDigJQgd2hpY2ggaXMgZXhhY3RseSB3aGF0XG4gKiB0aGUgVGFrdW1pIEd1YXJkIHByb3h5IGRvZXMuIFNvIGFueSBpbnN0YWxsIHJ1biB3aXRoIEd1YXJkIGFzIHRoZSBERUZBVUxUIHJlZ2lzdHJ5IChDSSwgb3IgYVxuICogZGV2ZWxvcGVyIHdobyBwdXQgaXQgaW4gfi8ubnBtcmMpIGJha2VzIG5wbS5mbGF0dC50ZWNoIFVSTHMgaW50byB0aGUgbG9ja2ZpbGUsIGFuZCBjb21taXR0aW5nXG4gKiB0aGVtIHBpbnMgYSBTSEFSRUQgbG9ja2ZpbGUgdG8gb25lIGVudmlyb25tZW50J3MgbWlycm9yOiBldmVyeSBsYXRlciBpbnN0YWxsIGRvd25sb2FkcyB0aHJvdWdoXG4gKiB0aGUgcHJveHksIGFuZCBhIGNvbGQtY2FjaGUgaW5zdGFsbCBmYWlscyBvdXRyaWdodCB3aXRoIDQwMSBmb3IgYW55b25lIHdob3NlIG5wbXJjIGNhcnJpZXMgYVxuICogcmVnaXN0cnkubnBtanMub3JnIHRva2VuLCBiZWNhdXNlIGJ1biBzZW5kcyB0aGUgZGVmYXVsdCByZWdpc3RyeSdzIGNyZWRlbnRpYWxzIHRvIHdoYXRldmVyIGhvc3RcbiAqIHRoZSBsb2NrZmlsZSBuYW1lcy4gR3VhcmQgY292ZXJhZ2UgZG9lcyBub3QgZGVwZW5kIG9uIHRoZXNlIFVSTHMg4oCUIHdpdGggYW4gZW1wdHkgYHJlc29sdmVkYCwgYnVuXG4gKiBkZXJpdmVzIHRoZSBkb3dubG9hZCBVUkwgZnJvbSB0aGUgY29uZmlndXJlZCByZWdpc3RyeSDigJQgc28gdGhleSBhcmUgcHVyZSBkYW1hZ2UuXG4gKlxuICogd2JmeSBnZW5lcmF0ZXMgYSBwcmUtY29tbWl0IGhvb2sgdGhhdCBzdHJpcHMgdGhlIHNhbWUgVVJMcywgYnV0IHRoYXQgb25seSBmaXJlcyBhdCBgZ2l0IGNvbW1pdGAuXG4gKiBSdW5uaW5nIHRoaXMgcmlnaHQgYWZ0ZXIgYW4gaW5zdGFsbCBjbG9zZXMgdGhlIHdpbmRvdyBpbiBiZXR3ZWVuLCB3aGVyZSB0aGUgcmV3cml0dGVuIGxvY2tmaWxlIGlzXG4gKiBzaW1wbHkgdGhlIHdvcmtpbmcgdHJlZSdzIHN0YXRlOiBhIGJ5cGFzc2VkIGhvb2ssIGEgY29tbWl0IGZyb20gYSB0b29sIHRoYXQgZG9lcyBub3QgcnVuIGhvb2tzLFxuICogb3IgYSBkaWZmIHJlYWQgYnkgYSBodW1hbiBvciBhbiBhZ2VudCBhbGwgc2VlIGl0LiBPbmx5IHRoZSBHdWFyZCBob3N0IGlzIHN0cmlwcGVkOyBhIHNjb3BlZFxuICogcmVnaXN0cnkgc3VjaCBhcyBWZXJkYWNjaW8gbGVnaXRpbWF0ZWx5IHJlY29yZHMgaXRzIG93biBVUkwgZm9yIHByaXZhdGUgcGFja2FnZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdW5Mb2NrZmlsZShyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGxvY2tmaWxlUGF0aCA9IG5vcm1hbGl6ZVNoYXJlZEJ1bkxvY2tmaWxlKHJvb3REaXJQYXRoKTtcbiAgaWYgKCFsb2NrZmlsZVBhdGgpIHJldHVybjtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSZW1vdmVkIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gJHtsb2NrZmlsZVBhdGh9IHRvIGtlZXAgaXQgcmVnaXN0cnktYWdub3N0aWMuYCkpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlVG9tbCB9IGZyb20gJ3Ntb2wtdG9tbCc7XG5cbi8qKlxuICogV3JpdGUgdGhlIGtleS1vbmx5IHN0dWIgdGhhdCBgd3JhbmdsZXIgdHlwZXMgLS1lbnYtZmlsZWAgcmVhZHMgdG8gdHlwZSB0aGUgQ2xvdWRmbGFyZSBgRW52YC5cbiAqXG4gKiBgd3JhbmdsZXIgdHlwZXNgIGRlcml2ZXMgZWFjaCBgRW52YCBtZW1iZXIgZnJvbSBhIGtleSdzIG1lcmUgcHJlc2VuY2UgaW4gdGhlIGZpbGUg4oCUIG5ldmVyIGZyb20gaXRzXG4gKiB2YWx1ZSwgYW5kIG5ldmVyIGZyb20gcHJvY2Vzcy5lbnYg4oCUIGFuZCBgLS1lbnYtZmlsZWAgUkVQTEFDRVMgd3JhbmdsZXIncyBuYXRpdmUgYC5lbnZgL2AuZGV2LnZhcnNgXG4gKiByZWFkaW5nLiBUaGUgc3R1YiB0aGVyZWZvcmUgY2FycmllcyBldmVyeSBkZWNsYXJlZCBiaW5kaW5nIGtleSB3aXRoIGEgY29uc3RhbnQgcGxhY2Vob2xkZXIgdmFsdWVcbiAqIChgMWAsIG5vdCBlbXB0eSwgc28gaXQgY2Fubm90IG92ZXJyaWRlIGEgd3JhbmdsZXIgYHZhcnNgIGJpbmRpbmcgd2l0aCBhbiBlbXB0eSBzdHJpbmcpLiBJdCB3cml0ZXMgbm9cbiAqIHJlYWwgc2VjcmV0IGFuZCBuZWVkcyBubyBkZWNyeXB0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVXb3JrZXJUeXBlc0VudlN0dWIocHJvamVjdERpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZywgb3V0cHV0UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGtleU5hbWVzID0gY29sbGVjdFdvcmtlckJpbmRpbmdLZXlOYW1lcyhwcm9qZWN0RGlyUGF0aCwgcm9vdERpclBhdGgpO1xuICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKG91dHB1dFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICBvdXRwdXRQYXRoLFxuICAgIGtleU5hbWVzLm1hcCgoa2V5TmFtZSkgPT4gYCR7a2V5TmFtZX09MWApLmpvaW4oJ1xcbicpICsgKGtleU5hbWVzLmxlbmd0aCA+IDAgPyAnXFxuJyA6ICcnKVxuICApO1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCAke291dHB1dFBhdGh9IHdpdGggJHtrZXlOYW1lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzLmApKTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IHRoZSBkZWNsYXJlZCBXb3JrZXIgYmluZGluZyBrZXkgTkFNRVMgZnJvbSB0aGUgY29tbWl0dGVkIGBmbm94LnRvbWxgIGZpbGVzIHdpdGhvdXRcbiAqIGRlY3J5cHRpbmcgYW55dGhpbmcgb3IgaW52b2tpbmcgdGhlIGVudmlyb25tZW50IHJlYWRlci4gVGhpcyBkZWxpYmVyYXRlbHkgYXZvaWRzIHByb2Nlc3MuZW52LFxuICogYG1pc2UgZW52YCBob3N0L3Rvb2wgdmFyaWFibGVzLCBhbmQgY2FzY2FkZS9wcm9maWxlIHNlbGVjdGlvbiwgYWxsIG9mIHdoaWNoIHdvdWxkIG90aGVyd2lzZVxuICogcG9sbHV0ZSBvciBuYXJyb3cgdGhlIGdlbmVyYXRlZCBgRW52YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RXb3JrZXJCaW5kaW5nS2V5TmFtZXMocHJvamVjdERpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qga2V5TmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gZm5veCBtZXJnZXMgdGhlIHdob2xlIGFuY2VzdG9yIGNvbmZpZyBjaGFpbiAoYSBuZXN0ZWQgV29ya2VyIGluaGVyaXRzIHRoZSBtb25vcmVwbyByb290J3NcbiAgLy8gc2VjcmV0cyksIHNvIHVuaW9uIGV2ZXJ5IGZub3gudG9tbCBmcm9tIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSB1cCB0byB0aGUgcmVwb3NpdG9yeSByb290LlxuICBmb3IgKGNvbnN0IGNvbmZpZ1BhdGggb2YgZmluZEFuY2VzdG9yRm5veENvbmZpZ1BhdGhzKHByb2plY3REaXJQYXRoLCByb290RGlyUGF0aCkpIHtcbiAgICBmb3IgKGNvbnN0IGtleU5hbWUgb2YgcGFyc2VGbm94U2VjcmV0S2V5TmFtZXMoY29uZmlnUGF0aCkpIGtleU5hbWVzLmFkZChrZXlOYW1lKTtcbiAgfVxuICByZXR1cm4gWy4uLmtleU5hbWVzXS50b1NvcnRlZCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbn1cblxuLyoqIEV2ZXJ5IGBmbm94LnRvbWxgIGZyb20gYHByb2plY3REaXJQYXRoYCB1cCB0byAoYW5kIGluY2x1ZGluZykgYHJvb3REaXJQYXRoYCwgbmVhcmVzdCBmaXJzdC4gKi9cbmZ1bmN0aW9uIGZpbmRBbmNlc3RvckZub3hDb25maWdQYXRocyhwcm9qZWN0RGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBjb25maWdQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgpO1xuICBmb3IgKGxldCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3REaXJQYXRoKTsgOyBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpKSB7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAnZm5veC50b21sJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIGNvbmZpZ1BhdGhzLnB1c2goY29uZmlnUGF0aCk7XG4gICAgLy8gU3RvcCBhdCB0aGUgcmVwb3NpdG9yeSByb290IChpdHMgcGFyZW50J3Mgc2VjcmV0cyBhcmUgbm90IHBhcnQgb2YgdGhpcyByZXBvKSBvciwgZGVmZW5zaXZlbHksXG4gICAgLy8gYXQgdGhlIGZpbGVzeXN0ZW0gcm9vdCB3aGVuIHJvb3REaXJQYXRoIGlzIG5vdCBhY3R1YWxseSBhbiBhbmNlc3Rvci5cbiAgICBpZiAoZGlyUGF0aCA9PT0gcm9vdFBhdGggfHwgcGF0aC5kaXJuYW1lKGRpclBhdGgpID09PSBkaXJQYXRoKSBicmVhaztcbiAgfVxuICByZXR1cm4gY29uZmlnUGF0aHM7XG59XG5cbmludGVyZmFjZSBGbm94U2VjcmV0c1RhYmxlIHtcbiAgW2tleU5hbWU6IHN0cmluZ106IHVua25vd247XG59XG5pbnRlcmZhY2UgRm5veENvbmZpZyB7XG4gIHNlY3JldHM/OiBGbm94U2VjcmV0c1RhYmxlO1xuICBwcm9maWxlcz86IFJlY29yZDxzdHJpbmcsIHsgc2VjcmV0cz86IEZub3hTZWNyZXRzVGFibGUgfSB8IHVuZGVmaW5lZD47XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIGtleSBuYW1lcyB1bmRlciBgZm5veC50b21sYCdzIGBbc2VjcmV0c11gIGFuZCBldmVyeSBgW3Byb2ZpbGVzLjxuYW1lPi5zZWNyZXRzXWAgdGFibGUuXG4gKiBmbm94IHN0b3JlcyBrZXkgbmFtZXMgaW4gcGxhaW50ZXh0IChvbmx5IHZhbHVlcyBhcmUgZW5jcnlwdGVkKSwgc28gdGhpcyBuZWVkcyBubyBhZ2Uga2V5LiBFdmVyeVxuICogcHJvZmlsZSdzIHNlY3JldHMgYXJlIHVuaW9uZWQgc28gdGhlIEVudiBpcyBhIGRldGVybWluaXN0aWMgc3VwZXJzZXQgY292ZXJpbmcgYWxsIGVudmlyb25tZW50c1xuICogKGxpa2UgdGhlIGZvcm1lciBjb21taXR0ZWQgLmVudi5leGFtcGxlKSwgaW5kZXBlbmRlbnQgb2YgdGhlIHByb2ZpbGUgYSBnaXZlbiBydW4gcmVzb2x2ZXMuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRm5veFNlY3JldEtleU5hbWVzKGNvbmZpZ1BhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29uZmlnID0gcGFyc2VUb21sKGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpKSBhcyBGbm94Q29uZmlnO1xuICBjb25zdCBrZXlOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgY29sbGVjdCA9IChzZWNyZXRzOiBGbm94U2VjcmV0c1RhYmxlIHwgdW5kZWZpbmVkKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBba2V5TmFtZSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHNlY3JldHMgPz8ge30pKSB7XG4gICAgICAvLyBTa2lwIHNlY3JldHMgZm5veCBkb2VzIG5vdCBleHBvcnQgYXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIChgZW52ID0gZmFsc2VgIC8gYFwiZXhlY1wiYCk6IHRoZXlcbiAgICAgIC8vIGFyZSBuZXZlciBXb3JrZXIgYmluZGluZ3MsIG1hdGNoaW5nIGBmbm94IGV4cG9ydGAncyBkZWZhdWx0LlxuICAgICAgY29uc3QgZW52ID0gdHlwZW9mIGVudHJ5ID09PSAnb2JqZWN0JyAmJiBlbnRyeSAhPT0gbnVsbCA/IChlbnRyeSBhcyB7IGVudj86IHVua25vd24gfSkuZW52IDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGVudiA9PT0gZmFsc2UgfHwgZW52ID09PSAnZXhlYycpIGNvbnRpbnVlO1xuICAgICAga2V5TmFtZXMucHVzaChrZXlOYW1lKTtcbiAgICB9XG4gIH07XG4gIGNvbGxlY3QoY29uZmlnLnNlY3JldHMpO1xuICBmb3IgKGNvbnN0IHByb2ZpbGUgb2YgT2JqZWN0LnZhbHVlcyhjb25maWcucHJvZmlsZXMgPz8ge30pKSBjb2xsZWN0KHByb2ZpbGU/LnNlY3JldHMpO1xuICByZXR1cm4ga2V5TmFtZXM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREcml6emxlQ29uZmlnLCB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQnVuTG9ja2ZpbGUgfSBmcm9tICcuLi91dGlscy9idW5Mb2NrZmlsZS5qcyc7XG5pbXBvcnQgeyB3cml0ZVdvcmtlclR5cGVzRW52U3R1YiB9IGZyb20gJy4uL3V0aWxzL3dvcmtlclR5cGVzRW52LmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG4vLyBgd3JhbmdsZXIgdHlwZXNgIGRlcml2ZXMgdGhlIENsb3VkZmxhcmUgYEVudmAncyBzZWNyZXQvdmFyIG1lbWJlcnMgb25seSBmcm9tIHRoZSBLRVkgTkFNRVMgaW4gYVxuLy8gLmRldi52YXJzLy5lbnYgZmlsZSAobmV2ZXIgZnJvbSBwcm9jZXNzLmVudiksIGFuZCBgLS1lbnYtZmlsZWAgUkVQTEFDRVMgdGhhdCBkZWZhdWx0IGZpbGUgc2V0LiBTb1xuLy8gZ2VuLWNvZGUgdHlwZXMgYSBXb3JrZXIgYWdhaW5zdCBhIHRocm93YXdheSBrZXktb25seSBzdHViIHdyaXR0ZW4gaGVyZSBmcm9tIGNvbW1pdHRlZCBzb3VyY2VzLlxuY29uc3Qgd29ya2VyVHlwZXNFbnZQYXRoID0gcGF0aC5qb2luKCcud3JhbmdsZXInLCAnd29ya2VyLXR5cGVzLmVudicpO1xuXG5leHBvcnQgY29uc3QgZ2VuQ29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdnZW4tY29kZScsXG4gIGRlc2NyaWJlOiAnR2VuZXJhdGUgY29kZSBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gQmVmb3JlIHRoZSBlYXJseSByZXR1cm4gYmVsb3c6IGBnZW4tY29kZWAgaXMgdGhlIGBwb3N0aW5zdGFsbGAgc2NyaXB0IHdiZnkgZ2VuZXJhdGVzLCBtYWtpbmdcbiAgICAvLyB0aGlzIHRoZSBmaXJzdCB3YiBjb2RlIHRoYXQgcnVucyBhZnRlciBidW4gbWF5IGhhdmUgcmV3cml0dGVuIHRoZSBsb2NrZmlsZSwgYW5kIGEgcmVwb3NpdG9yeVxuICAgIC8vIHdpdGggbm90aGluZyB0byBnZW5lcmF0ZSBuZWVkcyB0aGUgbm9ybWFsaXphdGlvbiBqdXN0IGFzIG11Y2guIGByb290RGlyUGF0aGAgcmF0aGVyIHRoYW5cbiAgICAvLyBgcHJvamVjdHMucm9vdC5kaXJQYXRoYDogYnVuIHJ1bnMgYSB3b3Jrc3BhY2UgcGFja2FnZSdzIHBvc3RpbnN0YWxsIGZyb20gdGhhdCBwYWNrYWdlJ3NcbiAgICAvLyBkaXJlY3RvcnksIGFuZCBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyBvbmx5IGNsaW1icyBvdXQgb2YgYHBhY2thZ2VzLypgLCBzbyBhIHdvcmtzcGFjZSBzdWNoXG4gICAgLy8gYXMgYGFwcHMvd2ViYCB3b3VsZCBvdGhlcndpc2UgbG9vayBmb3IgYGFwcHMvd2ViL2J1bi5sb2NrYCBpbnN0ZWFkIG9mIHRoZSByZXBvc2l0b3J5J3MuXG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgbm9ybWFsaXplQnVuTG9ja2ZpbGUocHJvamVjdHMuc2VsZi5yb290RGlyUGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VuQ29kZVRhcmdldHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1xuICAgICAgLm1hcCgocHJvamVjdCkgPT4gKHsgcHJvamVjdCwgc2NyaXB0czogZ2V0R2VuQ29kZVNjcmlwdHMocHJvamVjdCkgfSkpXG4gICAgICAuZmlsdGVyKCh7IHNjcmlwdHMgfSkgPT4gc2NyaXB0cy5sZW5ndGggPiAwKTtcbiAgICBpZiAoZ2VuQ29kZVRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ05vIGNvZGUgZ2VuZXJhdGlvbiBuZWVkZWQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCwgc2NyaXB0cyB9IG9mIGdlbkNvZGVUYXJnZXRzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJnZW4tY29kZVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG4gICAgICAvLyBXcml0ZSB0aGUga2V5IHN0dWIgdGhlIGZpcnN0IHNjcmlwdCdzIGB3cmFuZ2xlciB0eXBlcyAtLWVudi1maWxlYCBjb25zdW1lcy4gSXQgaXMgZGVyaXZlZCBmcm9tXG4gICAgICAvLyBjb21taXR0ZWQgc291cmNlcyAoZm5veC50b21sIGtleSBuYW1lcyksIHNvIGl0IG5lZWRzIG5vIGFnZSBrZXksIG5ldmVyIHB1bGxzIGluXG4gICAgICAvLyBwcm9jZXNzLmVudiAvIGBtaXNlIGVudmAgaG9zdCB2YXJpYWJsZXMsIGFuZCBkb2VzIG5vdCBkZXBlbmQgb24gd2hpY2ggcHJvZmlsZSBhIHJ1biByZXNvbHZlcy5cbiAgICAgIGlmICghYXJndi5kcnlSdW4gJiYgZ2V0V3JhbmdsZXJUeXBlc1NjcmlwdChwcm9qZWN0KSkge1xuICAgICAgICB3cml0ZVdvcmtlclR5cGVzRW52U3R1YihcbiAgICAgICAgICBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgICAgcHJvamVjdC5yb290RGlyUGF0aCxcbiAgICAgICAgICBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCB3b3JrZXJUeXBlc0VudlBhdGgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBzY3JpcHRzKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5Db2RlU2NyaXB0cyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBzY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICAvLyBGaXJzdDogYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNgIGlzIGdpdGlnbm9yZWQsIHNvIG9uIGEgZnJlc2ggY2hlY2tvdXQgaXQgZG9lcyBub3QgZXhpc3QgeWV0LFxuICAvLyBhbmQgdGhlIGdlbmVyYXRvcnMgYmVsb3cgdHlwZS1jaGVjayBhZ2FpbnN0IHRoZSBDbG91ZGZsYXJlIGBFbnZgIGl0IGRlY2xhcmVzLlxuICBjb25zdCB3cmFuZ2xlclR5cGVzU2NyaXB0ID0gZ2V0V3JhbmdsZXJUeXBlc1NjcmlwdChwcm9qZWN0KTtcbiAgaWYgKHdyYW5nbGVyVHlwZXNTY3JpcHQpIHtcbiAgICAvLyBgLS1lbnYtZmlsZWAgcG9pbnRzIHdyYW5nbGVyIGF0IHRoZSBrZXkgc3R1YiB0aGUgaGFuZGxlciB3cml0ZXMgKHNlZSB3cml0ZVdvcmtlclR5cGVzRW52U3R1YiksXG4gICAgLy8gc28gYSBmcmVzaCBjaGVja291dCB3aXRoIG5vIHJ1bnRpbWUgLmRldi52YXJzIChlLmcuIENJKSBzdGlsbCB0eXBlcyBldmVyeSBzZWNyZXQuIFdpdGhvdXQgaXQgYVxuICAgIC8vIGJhcmUgYHdyYW5nbGVyIHR5cGVzYCB5aWVsZHMgYW4gYEVudmAgbWlzc2luZyBldmVyeSBzZWNyZXQgYW5kIHRoZSB0eXBlLWF3YXJlIGdlbmVyYXRvcnMvbGludGVyc1xuICAgIC8vIGJlbG93IGZhaWwgKGUuZy4gXCJQcm9wZXJ0eSAnQVVUSF9TRUNSRVQnIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0VudidcIikuXG4gICAgc2NyaXB0cy5wdXNoKGAke3dyYW5nbGVyVHlwZXNTY3JpcHR9IC0tZW52LWZpbGUgJHt3b3JrZXJUeXBlc0VudlBhdGh9YCk7XG4gIH1cbiAgLy8gWWFybi1lcmEgQmxpdHogcmVwb3NpdG9yaWVzIG5lZWQgYGJsaXR6IGNvZGVnZW5gIGZvciB0aGUgcm91dGUgbWFuaWZlc3QgKG5vZGVfbW9kdWxlcy8uYmxpdHopXG4gIC8vIHRoYXQgQGJsaXR6anMvbmV4dCdzIHR5cGUgZGVjbGFyYXRpb25zIHJlLWV4cG9ydDsgaW5zdGFsbCBzY3JpcHRzIGRvIG5vdCBydW4gaXRcbiAgLy8gKGVuYWJsZVNjcmlwdHM6IGZhbHNlKS4gTmV2ZXIgdW5kZXIgQnVuOiB0aGUgYmxpdHogQ0xJIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW5cbiAgLy8gcGxhY2UsIHdoaWNoIG11c3Qgbm90IGhhcHBlbiBpbiBCdW4ncyBzaGFyZWQgZ2xvYmFsIHN0b3JlIChCdW4tZXJhIEJsaXR6IHJlcG9zaXRvcmllcyBnZW5lcmF0ZVxuICAvLyB0aGUgbWFuaWZlc3Qgd2l0aCB0aGVpciBvd24gc2NyaXB0cyBpbnN0ZWFkKS4gT24gYSBmcmVzaCBpbnN0YWxsIGBibGl0eiBjb2RlZ2VuYCBhbHNvXG4gIC8vIGdlbmVyYXRlcyB0aGUgUHJpc21hIGNsaWVudCBpdHNlbGYsIG1ha2luZyB0aGUgUFJJU01BIGdlbmVyYXRlIHN0ZXAgYmVsb3cgcmVkdW5kYW50IG9uY2Ug4oCUXG4gIC8vIGtlZXBpbmcgYm90aCBpcyBkZWxpYmVyYXRlOiBhZnRlciBzY2hlbWEtb25seSBjaGFuZ2VzIGJsaXR6J3MgYWxyZWFkeS1nZW5lcmF0ZWQgZ3VhcmQgc2tpcHNcbiAgLy8gaXRzIGludGVybmFsIGdlbmVyYXRlLCBzbyB0aGUgZXhwbGljaXQgc3RlcCBpcyBzdGlsbCB3aGF0IHJlZ2VuZXJhdGVzIHRoZSBjbGllbnQuXG4gIGlmICghcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgJiYgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdibGl0eicpICYmIHByb2plY3QuaGFzU291cmNlQ29kZSkge1xuICAgIHNjcmlwdHMucHVzaCgnWUFSTiBibGl0eiBjb2RlZ2VuJyk7XG4gIH1cbiAgY29uc3QgcHJpc21hR2VuZXJhdGVTY3JpcHQgPSBnZXRQcmlzbWFHZW5lcmF0ZVNjcmlwdChwcm9qZWN0KTtcbiAgaWYgKHByaXNtYUdlbmVyYXRlU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKHByaXNtYUdlbmVyYXRlU2NyaXB0KTtcbiAgfVxuICBjb25zdCBjaGFrcmFUeXBlZ2VuU2NyaXB0ID0gZ2V0Q2hha3JhU2NyaXB0KHByb2plY3QpO1xuICBpZiAoY2hha3JhVHlwZWdlblNjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChjaGFrcmFUeXBlZ2VuU2NyaXB0KTtcbiAgfVxuICBjb25zdCBkcml6emxlQ2hlY2tTY3JpcHQgPSBnZXREcml6emxlQ2hlY2tTY3JpcHQocHJvamVjdCk7XG4gIGlmIChkcml6emxlQ2hlY2tTY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goZHJpenpsZUNoZWNrU2NyaXB0KTtcbiAgfVxuICBjb25zdCBnZW5JMThuVHNTY3JpcHQgPSBnZXRHZW5JMThuVHNTY3JpcHQocHJvamVjdCk7XG4gIGlmIChnZW5JMThuVHNTY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goZ2VuSTE4blRzU2NyaXB0KTtcbiAgfVxuICByZXR1cm4gc2NyaXB0cztcbn1cblxuLyoqXG4gKiBgWUFSTiB3cmFuZ2xlcmAgcmF0aGVyIHRoYW4gYGJ1bnggd3JhbmdsZXJgOiB3cmFuZ2xlciBuZWVkcyByZWFsIE5vZGUuanMsIGFuZCBgYnVueGAgbWF5IHJlc29sdmVcbiAqIGEgdmVyc2lvbiBvdGhlciB0aGFuIHRoZSBsb2NrZmlsZSdzLiBSZXR1cm5zIHRoZSBiYXNlIGNvbW1hbmQ7IHRoZSBjYWxsZXIgYXBwZW5kcyBgLS1lbnYtZmlsZWBcbiAqIHBvaW50aW5nIGF0IGEgZ2VuZXJhdGVkIGtleS1vbmx5IHN0dWIgKHNlZSBnZXRHZW5Db2RlU2NyaXB0cykgYmVjYXVzZSBmbm94IHJlcG9zaXRvcmllcyBoYXZlIG5vXG4gKiBgLmVudmAgZmlsZSBmb3Igd3JhbmdsZXIgdG8gaW5mZXIgdGhlIHNlY3JldCBiaW5kaW5ncyBmcm9tLiBgLS1zdHJpY3QtdmFyc2AgaXMgZGVsaWJlcmF0ZWx5IGxlZnRcbiAqIG91dCDigJQgaXQgaXMgYSBwZXItcmVwb3NpdG9yeSB0eXBlLXN0cmljdG5lc3MgY2hvaWNlIHRoYXQgYmVsb25ncyBpbiB0aGUgd3JhbmdsZXIgY29uZmlnLlxuICovXG5mdW5jdGlvbiBnZXRXcmFuZ2xlclR5cGVzU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuZ2VuZXJhdGVzV29ya2VyVHlwZXMpIHJldHVybjtcbiAgcmV0dXJuICdZQVJOIHdyYW5nbGVyIHR5cGVzJztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuSTE4blRzU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHtcbiAgICBpZiAoIXByb2plY3QuaGFzU291cmNlQ29kZSkgcmV0dXJuO1xuICAgIHJldHVybiAnWUFSTiBydW4gZ2VuLWkxOG4tdHMnO1xuICB9XG4gIGlmIChcbiAgICBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ2dlbi1pMThuLXRzJykgJiZcbiAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdpMThuJykpXG4gICkge1xuICAgIHJldHVybiAnWUFSTiBnZW4taTE4bi10cyAtaSBpMThuIC1vIHNyYy9fX2dlbmVyYXRlZF9fL2kxOG4udHMgLWQgamEtSlAnO1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gZ2V0UHJpc21hR2VuZXJhdGVTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcHJvamVjdC5oYXNQcmlzbWEpIHJldHVybjtcbiAgaWYgKCFoYXNQcmlzbWFTY2hlbWEocHJvamVjdCkpIHJldHVybjtcbiAgcmV0dXJuIHByaXNtYVNjcmlwdHMuZ2VuZXJhdGUocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIGdldENoYWtyYVNjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ0BjaGFrcmEtdWkvY2xpJykpIHJldHVybjtcbiAgaWYgKCFmaWxlRXhpc3RzKHByb2plY3QsICdzcmMvdGhlbWUudHMnKSkgcmV0dXJuO1xuICByZXR1cm4gJ1lBUk4gY2hha3JhIHR5cGVnZW4gc3JjL3RoZW1lLnRzIC0tc3RyaWN0Jztcbn1cblxuZnVuY3Rpb24gZ2V0RHJpenpsZUNoZWNrU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuaGFzRHJpenpsZSkgcmV0dXJuO1xuICBjb25zdCBjb25maWcgPSBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0KTtcbiAgaWYgKCFjb25maWcpIHJldHVybjtcbiAgLy8gS2VlcCB0aGUgZXhwbGljaXQgLS1jb25maWcgYmVjYXVzZSBkcml6emxlLWtpdCdzIGRlZmF1bHQgbG9va3VwIG1pc3NlcyBzb21lIGV4dGVuc2lvbnMgKGUuZy4gLm10cykuXG4gIHJldHVybiBgJHt3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdCwgYFlBUk4gZHJpenpsZS1raXQgY2hlY2sgLS1jb25maWcgJHtjb25maWcuZmlsZU5hbWV9YCl9IHx8IHRydWVgO1xufVxuXG5mdW5jdGlvbiBmaWxlRXhpc3RzKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZmlsZVBhdGgpKTtcbn1cblxuZnVuY3Rpb24gaGFzUHJpc21hU2NoZW1hKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsncHJpc21hL3NjaGVtYS5wcmlzbWEnLCAncHJpc21hL3NjaGVtYScsICdkYi9zY2hlbWEucHJpc21hJ10uc29tZSgoZmlsZVBhdGgpID0+XG4gICAgZmlsZUV4aXN0cyhwcm9qZWN0LCBmaWxlUGF0aClcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZURvdGVudiB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG4vLyBDbG91ZGZsYXJlIFdvcmtlcnMgZG9uJ3Qgc2VlIHRoZSBwcm9jZXNzIGVudmlyb25tZW50OyB3cmFuZ2xlciBkZXYgcmVhZHMgdmFycyBmcm9tIGEgLmRldi52YXJzXG4vLyBmaWxlIG5leHQgdG8gaXRzIGNvbmZpZyBmaWxlIGluc3RlYWQuIFRoaXMgY29tbWFuZCBicmlkZ2VzIHRoZSBmbm94LW1hbmFnZWQgdmFsdWVzIHRvIHRoYXQgZmlsZS5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgR2VuRGV2VmFyc0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucyAmIHsgcGF0aD86IHN0cmluZyB9PjtcblxuZXhwb3J0IGNvbnN0IGdlbkRldlZhcnNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdnZW4tZGV2LXZhcnMgW3BhdGhdJyxcbiAgZGVzY3JpYmU6XG4gICAgJ0dlbmVyYXRlIGEgLmRldi52YXJzIGZpbGUgZm9yIGB3cmFuZ2xlciBkZXZgIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBsb2FkZWQgZnJvbSBmbm94IChwbHVzIFdCX0VOViBhbmQgTkVYVF9QVUJMSUNfV0JfRU5WKS4nLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+XG4gICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIGdlbmVyYXRlZCAuZGV2LnZhcnMgZmlsZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnLmRldi52YXJzJyxcbiAgICB9KSBhcyB1bmtub3duIGFzIEFyZ3Y8R2VuRGV2VmFyc0NvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2OiBHZW5EZXZWYXJzQ29tbWFuZEFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIFJlc3RyaWN0IHRvIHZhcmlhYmxlcyBsb2FkZWQgZnJvbSB0aGUgcHJvamVjdCdzIGRlY2xhcmVkIGVudmlyb25tZW50IHNvdXJjZXMgc28gdGhhdFxuICAgIC8vIHVucmVsYXRlZCBwcm9jZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyBuZXZlciBsZWFrIGludG8gdGhlIGdlbmVyYXRlZCBmaWxlLiBJZ25vcmVcbiAgICAvLyBwcm9jZXNzLmVudiBiZWNhdXNlIHRoZSBwYXJlbnQgd2IgcHJvY2VzcyBpbmplY3RzIHRoZSBmbm94IHZhbHVlcyBpbnRvIGl0LCB3aGljaCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzdXBwcmVzcyBsb2FkaW5nIHRoZW0gaGVyZS4gd2JmeSBkZWNsYXJlcyB0aGUgV0JfRU5WLWZhbWlseSBrZXlzIGluIGZub3gsIHNvXG4gICAgLy8gdGhleSBhcmUgYWxyZWFkeSBpbmNsdWRlZDsgcHJvY2Vzcy1vbmx5IGtleXMgYXJlIGludGVudGlvbmFsbHkgb3V0c2lkZSB0aGlzIGFsbG93bGlzdC5cbiAgICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gRXhwbGljaXRseSBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCB3aW4gb3ZlciBmbm94IHZhbHVlcyBmb3IgY29uZmlndXJlZCBrZXlzXG4gICAgLy8gKHByb2plY3QuZW52IGFwcGxpZXMgdGhhdCBwcmVjZWRlbmNlKSwgb3IgYEFVVEhfU0VDUkVUPS4uLiB3YiBzdGFydGAgd291bGQgc2VydmUgdGhlXG4gICAgLy8gc3RhbGUgY29uZmlndXJlZCB2YWx1ZS4gQW4gZXhwb3J0IHRoYXQgZW1wdGllcyBhIG5vbi1lbXB0eSBjb25maWd1cmVkIHZhbHVlIGlzIGRlbGliZXJhdGVcbiAgICAvLyBhbmQgbXVzdCBzdXJ2aXZlIHRoZSBlbXB0eS12YWx1ZSBmaWx0ZXIgYmVsb3cgKHVubGlrZSBgS0VZPWAgcGxhY2Vob2xkZXJzLCB3aGljaCBzdGF5XG4gICAgLy8gb21pdHRlZCBzbyB0aGV5IGNhbm5vdCBvdmVycmlkZSB3cmFuZ2xlciBgdmFyc2Agd2l0aCBlbXB0eSBzdHJpbmdzKS5cbiAgICBjb25zdCBleHBsaWNpdGx5RW1wdGllZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSAnJyAmJiBlbnZWYXJzW2tleV0gIT09ICcnKSBleHBsaWNpdGx5RW1wdGllZEtleXMuYWRkKGtleSk7XG4gICAgICBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgbGluZXMgPSBPYmplY3QuZW50cmllcyhlbnZWYXJzKVxuICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gJycgfHwgZXhwbGljaXRseUVtcHRpZWRLZXlzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PSR7cXVvdGVEb3RlbnZWYWx1ZShrZXksIHZhbHVlKX1gKTtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYXJndi5wYXRoID8/ICcuZGV2LnZhcnMnKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBXb3VsZCBnZW5lcmF0ZSAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShvdXRwdXRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nKTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gIH0sXG59O1xuXG4vKipcbiAqIFF1b3RlIGEgdmFsdWUgZm9yIGRvdGVudiAod2hpY2ggd3JhbmdsZXIgdXNlcyBmb3IgLmRldi52YXJzKS4gRXZlcnkgY2FuZGlkYXRlIHJlcHJlc2VudGF0aW9uXG4gKiBpcyB2ZXJpZmllZCBieSBhY3R1YWxseSBwYXJzaW5nIGl0IGJhY2sgKG91ciBkb3RlbnYgcGFyc2VyIG1hdGNoZXMgd3JhbmdsZXIncyBidW5kbGVkIGRvdGVudlxuICogMTYgZm9yIHRoZXNlIGNvbnN0cnVjdHMpLCBzbyBhIHZhbHVlIGlzIGVpdGhlciBzZXJpYWxpemVkIGxvc3NsZXNzbHkgb3IgcmVqZWN0ZWQg4oCUIG5ldmVyXG4gKiBzaWxlbnRseSBjb3JydXB0ZWQuIENhbmRpZGF0ZXM6IHNpbmdsZSBxdW90ZXMgKGxpdGVyYWwgc3BhbjsgY2xvc2VkIGVhcmx5IGJ5IGFuIGFwb3N0cm9waGUpLFxuICogYmFja3RpY2tzIChlcXVhbGx5IGxpdGVyYWwpLCB0aGVuIGRvdWJsZSBxdW90ZXMgd2l0aCBlc2NhcGVkIG5ld2xpbmVzL0NScyAoZG90ZW52IGRvZXMgbm90XG4gKiB1bmVzY2FwZSBpbm5lciBcXFwiIOKAlCBhIGAjYCBhZnRlciBhbiBlbWJlZGRlZCBxdW90ZSBzdGFydHMgYSBjb21tZW50LCB3aGljaCB0aGUgcm91bmQtdHJpcFxuICogY2hlY2sgY2F0Y2hlcyBhbmQgcmVqZWN0cykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZURvdGVudlZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZG91YmxlUXVvdGVkQm9keSA9IHZhbHVlLnJlcGxhY2VBbGwoJ1xcbicsIFN0cmluZy5yYXdgXFxuYCkucmVwbGFjZUFsbCgnXFxyJywgU3RyaW5nLnJhd2BcXHJgKTtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtgJyR7dmFsdWV9J2AsIGBcXGAke3ZhbHVlfVxcYGAsIGBcIiR7ZG91YmxlUXVvdGVkQm9keX1cImBdO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKHBhcnNlRG90ZW52KGAke2tleX09JHtjYW5kaWRhdGV9YClba2V5XSA9PT0gdmFsdWUpIHJldHVybiBjYW5kaWRhdGU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdmFsdWUgb2YgJHtrZXl9IGNhbm5vdCBiZSBsb3NzbGVzc2x5IHNlcmlhbGl6ZWQgaW50byAuZGV2LnZhcnM7IHNpbXBsaWZ5IGl0cyBxdW90aW5nLmApO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG5jb25zdCBraWxsUG9ydElmTm9uQ2lCdWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBraWxsUG9ydElmTm9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2tpbGwtcG9ydC1pZi1ub24tY2knLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIHBvcnQgc3BlY2lmaWVkIGJ5IFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgbm9uLUNJLicsXG4gIGJ1aWxkZXI6IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGtpbGxQb3J0SWZOb25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydElmTm9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwIGtpbGxpbmcgcG9ydCBkdWUgdG8gQ0k6ICR7cHJvamVjdC5lbnYuQ0l9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9ydEVudiA9IHByb2plY3QuZW52LlBPUlQ7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhgS2lsbGluZyB0aGUgcG9ydDogJHtwb3J0fWApO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIXNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGUsIG91dHB1dCkpIHJldHVybjtcblxuICBjb25zdCBub3JtYWxpemVkT3V0cHV0ID0gbm9ybWFsaXplQnVmZmVyZWRPdXRwdXQob3V0cHV0KTtcbiAgaWYgKG5vcm1hbGl6ZWRPdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShub3JtYWxpemVkT3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV4aXRDb2RlICE9PSAwIHx8IGhhc1dhcm5pbmdPdXRwdXQob3V0cHV0KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQnVmZmVyZWRPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gb3V0cHV0LnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzV2FybmluZ091dHB1dChvdXRwdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL1xcYndhcm4oPzppbmcpP3M/XFxiL2kudGVzdChvdXRwdXQucmVwbGFjZUFsbCgvXFxiKD86MHxubykgd2FybmluZ3M/XFxiL2dpLCAnJykpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgQnVmZmVyZWRSdW5SZXN1bHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVTY3JpcHQsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmludEJ1ZmZlcmVkT3V0cHV0LCBzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0IH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHsgcmVwb3J0VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMgfSBmcm9tICcuLi91dGlscy90ZXN0U3RydWN0dXJlLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHF1aWV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZXBvcnQgZXJyb3JzIG9ubHknLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdQcmludCBvbmx5IGZhaWxlZCBvciB3YXJuaW5nIGNvbW1hbmQgb3V0cHV0JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBMaW50Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPjtcbmV4cG9ydCB0eXBlIExpbnRDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxMaW50Q29tbWFuZE9wdGlvbnM+ICYge1xuICAnLS0nPzogdW5rbm93bltdO1xuICBfOiB1bmtub3duW107XG4gIHByaW50QWxsT3V0cHV0PzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IG94bGludEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddKTtcbmNvbnN0IHB5dGhvbkV4dGVuc2lvbnMgPSBuZXcgU2V0KFsncHknXSk7XG5jb25zdCBkYXJ0RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydkYXJ0J10pO1xuY29uc3QgcnVzdEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsncnMnXSk7XG5jb25zdCBveGZtdEV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgLi4ub3hsaW50RXh0ZW5zaW9ucyxcbiAgJ2NzcycsXG4gICdncWwnLFxuICAnZ3JhcGhxbCcsXG4gICdoYnMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdsZXNzJyxcbiAgJ21kJyxcbiAgJ21keCcsXG4gICdzY3NzJyxcbiAgJ3RvbWwnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllckV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgJ2NqcycsXG4gICdjc3MnLFxuICAnY3RzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2phdmEnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWQnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzY3NzJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllck9ubHlFeHRlbnNpb25zID0gbmV3IFNldChbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5maWx0ZXIoKGV4dCkgPT4gIW94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0KSkpO1xuY29uc3QgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybiA9ICchKiovdGVzdHstLC99Zml4dHVyZXMvKionO1xuXG50eXBlIEJ1ZmZlcmVkTGludFJ1blJlc3VsdCA9IEJ1ZmZlcmVkUnVuUmVzdWx0ICYgeyBjb21tYW5kOiBzdHJpbmc7IGN3ZDogc3RyaW5nIH07XG50eXBlIExpbnRSdW5SZXN1bHQgPSBCdWZmZXJlZExpbnRSdW5SZXN1bHQgfCB7IGV4aXRDb2RlOiBudW1iZXIgfTtcbmludGVyZmFjZSBMaW50UnVuQ29tbWFuZCB7XG4gIGNvbW1hbmQ6IHN0cmluZztcbiAgcHJvamVjdDogUHJvamVjdDtcbn1cblxuZXhwb3J0IGNvbnN0IGxpbnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIExpbnRDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdsaW50IFtmaWxlcy4uLl0nLFxuICBkZXNjcmliZTogJ0xpbnQgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgbGludChhcmd2IGFzIExpbnRDb21tYW5kQXJndik7XG4gICAgaWYgKGV4aXRDb2RlKSBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpbnQoYXJndjogTGludENvbW1hbmRBcmd2KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgZmlsZXMgPSBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndik7XG4gIGNvbnN0IHNob3VsZFJ1bkZvcm1hdHRlcnMgPSBCb29sZWFuKGFyZ3YuZm9ybWF0KTtcbiAgY29uc3Qgc2hvdWxkUnVuTGludGVycyA9ICFhcmd2LmZvcm1hdCB8fCBhcmd2LmZpeDtcbiAgLy8gVGhlIHRlc3QgbGF5b3V0IGlzIGEgc3RhdGljIHN0cnVjdHVyYWwgcnVsZSwgc28gYHdiIGxpbnRgIGlzIGl0cyBob21lOiBgd2IgdmVyaWZ5YCAodmlhIGl0c1xuICAvLyBjbGVhbnVwIHN0ZXApIGFuZCBDSSdzIGxpbnQgam9iIHRoZW4gZW5mb3JjZSBpdCB3aXRoIG5vIGV4dHJhIHdpcmluZywgYW5kIGEgc3RyYXkgdGVzdCBmaWxlXG4gIC8vIHN1cmZhY2VzIGhlcmUgaW5zdGVhZCBvZiBhdCBgd2IgdGVzdGAsIHdoZXJlIGAtLXBhc3NXaXRoTm9UZXN0c2Agd291bGQgb3RoZXJ3aXNlIGxldCB0aGUgc3VpdGVcbiAgLy8gcGFzcyB3aGlsZSBzaWxlbnRseSBydW5uaW5nIG5vbmUgb2YgaXQuIFJlcG9ydGVkIGJlZm9yZSB0aGUgbGludGVycyBydW4gc28gdGhlIGRpYWdub3NpcyBsZWFkc1xuICAvLyB0aGUgb3V0cHV0LCBidXQgbmV2ZXIgc2hvcnQtY2lyY3VpdHMgdGhlbTogYC0tZml4IC0tZm9ybWF0YCBtdXN0IHN0aWxsIGNsZWFuIHVwIHdoYXQgaXQgY2FuLFxuICAvLyBiZWNhdXNlIGEgbGF5b3V0IHZpb2xhdGlvbiBpcyBub3QgYXV0by1maXhhYmxlIGFuZCB3b3VsZCBvdGhlcndpc2UgYmxvY2sgZXZlcnkgb3RoZXIgZml4LlxuICAvLyBUaHJlZSBydW4gc2hhcGVzIG9wdCBvdXQuIEV4cGxpY2l0LXBhdGggcnVucyAoZS5nLiB0aGUgbGVmdGhvb2sgcHJlLWNvbW1pdCBob29rKSBza2lwIGl0IHNvIGFcbiAgLy8gcHJlLWV4aXN0aW5nIHZpb2xhdGlvbiBpbiBhbiB1bnRvdWNoZWQgcGFja2FnZSBjYW5ub3QgYmxvY2sgYW4gdW5yZWxhdGVkIGNvbW1pdC4gYC0tZHJ5LXJ1bmBcbiAgLy8gc2tpcHMgaXQgc28gdGhpcyBzdGF5cyB0aGUgb25lIHN0ZXAgdGhhdCBjb3VsZCBmYWlsIGEgcnVuIHdob3NlIHdob2xlIGNvbnRyYWN0IGlzIHRvIGV4ZWN1dGVcbiAgLy8gbm90aGluZy4gRm9ybWF0dGVyLW9ubHkgcnVucyAoYC0tZm9ybWF0YCB3aXRob3V0IGAtLWZpeGApIHNraXAgaXQgYmVjYXVzZSB0aGV5IGxpbnQgbm90aGluZyBhdFxuICAvLyBhbGwsIGFuZCB3YmZ5IGNoYWlucyB0aGF0IHNjcmlwdCBhcyBgYnVuIHdiIGxpbnQgLS1mb3JtYXQgJiYgYnVuIHJ1biBmb3JtYXQtY29kZWAgZm9yIERhcnQgYW5kXG4gIC8vIFB5dGhvbiByZXBvc2l0b3JpZXMg4oCUIGZhaWxpbmcgaXQgdGhlcmUgd291bGQgc2lsZW50bHkgc3RyaXAgdGhlaXIgb25seSBmb3JtYXR0aW5nIHBhc3MuXG4gIGNvbnN0IHZpb2xhdGVzVGVzdFN0cnVjdHVyZSA9XG4gICAgc2hvdWxkUnVuTGludGVycyAmJiAhYXJndi5kcnlSdW4gJiYgZmlsZXMubGVuZ3RoID09PSAwICYmIHJlcG9ydFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3RzLmRlc2NlbmRhbnRzKTtcbiAgY29uc3QgbGludEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgZGFydEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIC8vIGBjYXJnbyBmbXQgLS1hbGxgIGFsd2F5cyBmb3JtYXRzIHRoZSB3aG9sZSB3b3Jrc3BhY2UsIHNvIHdlIHRyYWNrIHRhcmdldFxuICAvLyBwcm9qZWN0cyByYXRoZXIgdGhhbiBpbmRpdmlkdWFsIGZpbGUgcGF0aHMuIEV2ZXJ5IHByb2plY3Qgd2l0aCBpdHMgb3duXG4gIC8vIGBDYXJnby50b21sYCBydW5zIGl0cyBvd24gYGNhcmdvIGZtdCAtLWFsbGA7IHdlIGludGVudGlvbmFsbHkgZG8gbm90IGRlZHVwXG4gIC8vIGJ5IGRpcmVjdG9yeS4gQSBuZXN0ZWQgb3Igc2libGluZyBjcmF0ZSBjYW4gYmUgYW4gaW5kZXBlbmRlbnQgQ2FyZ29cbiAgLy8gd29ya3NwYWNlIHRoYXQgYSBwYXJlbnQncyBgY2FyZ28gZm10IC0tYWxsYCBuZXZlciByZWFjaGVzLCBzbyBza2lwcGluZyBpdFxuICAvLyB3b3VsZCBsZWF2ZSBpdCB1bmZvcm1hdHRlZCwgd2hpbGUgYW55IGdlbnVpbmVseSBvdmVybGFwcGluZyBydW5zIGFyZVxuICAvLyBoYXJtbGVzcyBiZWNhdXNlIHJ1c3RmbXQgaXMgZGV0ZXJtaW5pc3RpYyBhbmQgaWRlbXBvdGVudC4gRGVkdXBpbmcgYnkgcmVhbFxuICAvLyB3b3Jrc3BhY2UgbWVtYmVyc2hpcCB3b3VsZCByZXF1aXJlIGludm9raW5nIGBjYXJnbyBsb2NhdGUtcHJvamVjdGAuXG4gIGNvbnN0IGNhcmdvRm9ybWF0UHJvamVjdHMgPSBuZXcgU2V0PFByb2plY3Q+KCk7XG4gIGNvbnN0IHByZXR0aWVyRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSBmYWxzZTtcbiAgbGV0IHByZXR0aWVyQXJnczogc3RyaW5nW107XG4gIGxldCBzb3J0UGFja2FnZUpzb25BcmdzOiBzdHJpbmdbXTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW50VGFyZ2V0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpO1xuICAgICAgICBjb25zdCBmaWxlS2luZCA9IGF3YWl0IGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9O1xuICAgICAgfSlcbiAgICApO1xuICAgIGZvciAoY29uc3QgeyBmaWxlS2luZCwgZmlsZVBhdGggfSBvZiBsaW50VGFyZ2V0cykge1xuICAgICAgaWYgKFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKC4uLmdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSk7XG5cbiAgICAgIGZvciAoY29uc3QgeyBsaW50UGF0aCwgcHJvamVjdCB9IG9mIGdldEV4cGxpY2l0TGludFRhcmdldHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jayAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgcHl0aG9uRmlsZVBhdGhzID0gcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBweXRob25GaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgZGFydEZpbGVQYXRocyA9IGRhcnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGRhcnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgZGFydEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgZGFydEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzQ2FyZ29Ub21sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgcnVzdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY2FyZ29Gb3JtYXRQcm9qZWN0cy5hZGQocHJvamVjdCk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRGaWxlUGF0aHMgPSBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4obGludFBhdGgpLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZm9ybWF0dGVyUGF0aCBvZiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhwcm9qZWN0LCBsaW50UGF0aCwgZmlsZUtpbmQsIGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYXJndi5mb3JtYXQgJiYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQgJiYgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb24pICYmICFwcm9qZWN0LnByZWZlcnJlZExpbnRlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBObyBsaW50ZXIgZm91bmQgZm9yICR7cHJvamVjdC5uYW1lfS4gSW5zdGFsbCBPeGxpbnQuYCkpO1xuICAgICAgICAgIG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByZXR0aWVyQXJncyA9IFsuLi5uZXcgU2V0KHByZXR0aWVyRmlsZVBhdGhzKV07XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IFsuLi5uZXcgU2V0KHBhY2thZ2VKc29uRmlsZVBhdGhzKV07XG4gIH0gZWxzZSB7XG4gICAgcHJldHRpZXJBcmdzID0gYnVpbGRQcmV0dGllckFyZ3MocHJvamVjdHMuc2VsZi5kaXJQYXRoLCBwcm9qZWN0cy5kZXNjZW5kYW50cyk7XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gcC5wYWNrYWdlSnNvblBhdGgpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyQ29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10gPSBbXTtcbiAgY29uc3QgbGludGVyQ29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10gPSBbXTtcbiAgY29uc3QgbGludFJ1bk9wdGlvbnMgPSB7IGV4aXRJZkZhaWxlZDogZmFsc2UsIHByZXNlcnZlQ29sb3I6ICFhcmd2LnByaW50QWxsT3V0cHV0IH0gYXMgY29uc3Q7XG4gIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgW3Byb2plY3QsIGxpbnRGaWxlUGF0aHNdIG9mIGxpbnRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICBpZiAoIWxpbnRDb21tYW5kKSBjb250aW51ZTtcblxuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogbGludENvbW1hbmQsIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIHB5dGhvbkZpbGVQYXRoc10gb2YgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2LCBweXRob25GaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZChweXRob25GaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzXSBvZiBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0TGludENvbW1hbmQoZGFydEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZChkYXJ0RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBjYXJnb0Zvcm1hdFByb2plY3RzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBbcHJvamVjdCwgb3hmbXRGaWxlUGF0aHNdIG9mIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZE94Zm10Q29tbWFuZChveGZtdEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzT3duU291cmNlQ29kZSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBpZiAobGludENvbW1hbmQpIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBsaW50Q29tbWFuZCwgcHJvamVjdCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2KSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwpIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRMaW50Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZE94Zm10Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrKSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sKSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNDYXJnb1RvbWwpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBsaW50RXhpdENvZGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgY29uc3QgZm9ybWF0dGVyUmVzdWx0cyA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kcyhmb3JtYXR0ZXJDb21tYW5kcywgYXJndiwgbGludFJ1bk9wdGlvbnMpO1xuICAgIHByaW50U2lsZW50TGludE91dHB1dHMoZm9ybWF0dGVyUmVzdWx0cywgYXJndik7XG4gICAgbGludEV4aXRDb2Rlcy5wdXNoKC4uLmZvcm1hdHRlclJlc3VsdHMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5leGl0Q29kZSkpO1xuXG4gICAgaWYgKGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgaWYgKG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgaWYgKHByZXR0aWVyQXJncy5sZW5ndGggPiAwICYmIHByb2plY3RzLnNlbGYuaGFzUHJldHRpZXIpIHtcbiAgICAgIGNvbnN0IHByZXR0aWVyUmVzdWx0ID0gYXdhaXQgcnVuTGludENvbW1hbmQoXG4gICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgICAnWUFSTicsXG4gICAgICAgICAgJ3ByZXR0aWVyJyxcbiAgICAgICAgICAnLS1jYWNoZScsXG4gICAgICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgICAgICctLXdyaXRlJyxcbiAgICAgICAgICAnLS0nLFxuICAgICAgICAgIC4uLnByZXR0aWVyQXJncyxcbiAgICAgICAgXSksXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIGxpbnRSdW5PcHRpb25zXG4gICAgICApO1xuICAgICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhbcHJldHRpZXJSZXN1bHRdLCBhcmd2KTtcbiAgICAgIGxpbnRFeGl0Q29kZXMucHVzaChwcmV0dGllclJlc3VsdC5leGl0Q29kZSk7XG4gICAgfVxuICAgIGlmIChzb3J0UGFja2FnZUpzb25BcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNvcnRQYWNrYWdlSnNvblJlc3VsdCA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kKFxuICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ1lBUk4nLCAnc29ydC1wYWNrYWdlLWpzb24nLCAnLS0nLCAuLi5zb3J0UGFja2FnZUpzb25BcmdzXSksXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIGxpbnRSdW5PcHRpb25zXG4gICAgICApO1xuICAgICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhbc29ydFBhY2thZ2VKc29uUmVzdWx0XSwgYXJndik7XG4gICAgICBsaW50RXhpdENvZGVzLnB1c2goc29ydFBhY2thZ2VKc29uUmVzdWx0LmV4aXRDb2RlKTtcbiAgICB9XG5cbiAgICBpZiAobGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgIGNvbnN0IGxpbnRlclJlc3VsdHMgPSBhd2FpdCBydW5MaW50Q29tbWFuZHMobGludGVyQ29tbWFuZHMsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKTtcbiAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKGxpbnRlclJlc3VsdHMsIGFyZ3YpO1xuICAgIGxpbnRFeGl0Q29kZXMucHVzaCguLi5saW50ZXJSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUpKTtcbiAgfVxuXG4gIHJldHVybiBsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkgfHwgdmlvbGF0ZXNUZXN0U3RydWN0dXJlID8gMSA6IDA7XG59XG5cbmZ1bmN0aW9uIHJ1bkxpbnRDb21tYW5kcyhcbiAgY29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10sXG4gIGFyZ3Y6IExpbnRDb21tYW5kQXJndixcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduSW5QYXJhbGxlbD5bM11cbik6IFByb21pc2U8TGludFJ1blJlc3VsdFtdPiB7XG4gIHJldHVybiBQcm9taXNlLmFsbChjb21tYW5kcy5tYXAoKHsgY29tbWFuZCwgcHJvamVjdCB9KSA9PiBydW5MaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKSkpO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHQ+IHtcbiAgaWYgKGFyZ3Yuc2lsZW50KSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKHJlc3VsdCkgPT4gKHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIGNvbW1hbmQ6IG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLFxuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgfSkpO1xuICB9XG4gIHJldHVybiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKGV4aXRDb2RlKSA9PiAoeyBleGl0Q29kZSB9KSk7XG59XG5cbmZ1bmN0aW9uIHByaW50U2lsZW50TGludE91dHB1dHMoXG4gIHJlc3VsdHM6IExpbnRSdW5SZXN1bHRbXSxcbiAgYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICdwcmludEFsbE91dHB1dCcgfCAnc2lsZW50Jz5cbik6IHZvaWQge1xuICBjb25zdCBwcmludGFibGVSZXN1bHRzID1cbiAgICBhcmd2LnNpbGVudCAmJiAhYXJndi5wcmludEFsbE91dHB1dFxuICAgICAgPyByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiAnb3V0cHV0JyBpbiByZXN1bHQgJiYgc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dChyZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5vdXRwdXQpKVxuICAgICAgOiByZXN1bHRzO1xuICBpZiAocHJpbnRhYmxlUmVzdWx0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBwcmludGFibGVSZXN1bHRzKSB7XG4gICAgaWYgKCEoJ291dHB1dCcgaW4gcmVzdWx0KSkgY29udGludWU7XG5cbiAgICBpZiAoYXJndi5wcmludEFsbE91dHB1dCkge1xuICAgICAgcHJpbnRDb21tYW5kT3V0cHV0KHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhcmd2LnNpbGVudCkge1xuICAgICAgICBwcmludENvbW1hbmRIZWFkZXIocmVzdWx0LmNvbW1hbmQsIHJlc3VsdC5jd2QpO1xuICAgICAgfVxuICAgICAgcHJpbnRCdWZmZXJlZE91dHB1dChyZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5vdXRwdXQpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRPdXRwdXQocmVzdWx0OiBCdWZmZXJlZExpbnRSdW5SZXN1bHQpOiB2b2lkIHtcbiAgcHJpbnRDb21tYW5kSGVhZGVyKHJlc3VsdC5jb21tYW5kLCByZXN1bHQuY3dkKTtcblxuICBpZiAocmVzdWx0LmV4aXRDb2RlID09PSAwICYmIHNob3VsZFN1cHByZXNzU3VjY2Vzc2Z1bFZlcmlmeU91dHB1dChyZXN1bHQuY29tbWFuZCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dC50cmltKCk7XG4gIGlmIChvdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRIZWFkZXIoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3VwcHJlc3NTdWNjZXNzZnVsVmVyaWZ5T3V0cHV0KGNvbW1hbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnIG94Zm10ICcpIHx8IGNvbW1hbmQuaW5jbHVkZXMoJyBzb3J0LXBhY2thZ2UtanNvbiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTGludENvbW1hbmQoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzVHlwZUF3YXJlT3hsaW50Jz4sXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAnZml4JyB8ICdmb3JtYXQnPiAmIFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PixcbiAgZmlsZXM/OiBzdHJpbmdbXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50Jykge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnb3hsaW50JyxcbiAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgIC8vIFR5cGUtYXdhcmUgbW9kZSBtYWtlcyBveGxpbnQgcmVwb3J0IHR5cGUtY2hlY2sgZGlhZ25vc3RpY3MuIFBhc3MgdGhlIGZsYWdzIGV4cGxpY2l0bHlcbiAgICAgIC8vIGJlY2F1c2Ugb3hsaW50IHJlamVjdHMgdGhlIGVxdWl2YWxlbnQgb3B0aW9ucyBpbiBub24tcm9vdCBjb25maWdzLCBzbyBwZXItcGFja2FnZSBydW5zXG4gICAgICAvLyBpbiBtb25vcmVwb3Mgd291bGQgb3RoZXJ3aXNlIG1pc3MgdHlwZSBlcnJvcnMuXG4gICAgICAuLi4ocHJvamVjdC5oYXNUeXBlQXdhcmVPeGxpbnQgPyBbJy0tdHlwZS1hd2FyZScsICctLXR5cGUtY2hlY2snXSA6IFtdKSxcbiAgICAgIC4uLihhcmd2LnF1aWV0ID8gWyctLXF1aWV0J10gOiBbXSksXG4gICAgICAuLi4oYXJndi5maXggPyBbJy0tZml4J10gOiBbXSksXG4gICAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgIF0pO1xuICB9XG4gIHJldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT3hmbXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICdZQVJOJyxcbiAgICAnb3hmbXQnLFxuICAgICctLXdyaXRlJyxcbiAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgLi4uKGZpbGVzID8/IFsnLiddKSxcbiAgICAnISoqL3BhY2thZ2UuanNvbicsXG4gIF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gdG9MaW50VGFyZ2V0cyhmaWxlcyk7XG4gIHJldHVybiBbXG4gICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2lzb3J0JywgJy0tcHJvZmlsZScsICdibGFjaycsICctLWZpbHRlci1maWxlcycsIC4uLnRhcmdldHNdKSxcbiAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnYmxhY2snLCAuLi50YXJnZXRzXSksXG4gIF0uam9pbignICYmICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2OiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sIGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2ZsYWtlOCcsIC4uLihhcmd2LnF1aWV0ID8gWyctcSddIDogW10pLCAuLi50b0xpbnRUYXJnZXRzKGZpbGVzKV0pO1xufVxuXG5mdW5jdGlvbiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpOiBzdHJpbmcge1xuICAvLyBGb3JtYXR0aW5nIG11c3QgZ28gdGhyb3VnaCBjYXJnbyAobm90IHJ1c3RmbXQgb24gaW5kaXZpZHVhbCBmaWxlcykgc28gZWFjaFxuICAvLyBjcmF0ZSdzIGVkaXRpb24gYW5kIHJ1c3RmbXQgY29uZmlndXJhdGlvbiBhcmUgcmVzcGVjdGVkOyBgLS1hbGxgIGNvdmVyc1xuICAvLyBldmVyeSB3b3Jrc3BhY2UgbWVtYmVyIGFuZCBpcyBhIG5vLW9wIHN1ZmZpeCBmb3Igc2luZ2xlLWNyYXRlIHByb2plY3RzLlxuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydjYXJnbycsICdmbXQnLCAnLS1hbGwnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERhcnRGb3JtYXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2Zvcm1hdCcsIC4uLnRvTGludFRhcmdldHMoZmlsZXMpXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERhcnRMaW50Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnZGFydCcsICdhbmFseXplJywgLi4udG9MaW50VGFyZ2V0cyhmaWxlcyldKTtcbn1cblxuZnVuY3Rpb24gdG9MaW50VGFyZ2V0cyhmaWxlczogc3RyaW5nW10gfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJBcmdzKFxuICBzZWxmRGlyUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJncyA9IG5ldyBTZXQ8c3RyaW5nPihbYCoqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19YCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl0pO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoIW5lZWRzUHJldHRpZXIocHJvamVjdCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcHJvamVjdFBhdHRlcm4gPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnKiovey4qLyx9Ki57JyArIFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmpvaW4oJywnKSArICd9Jyk7XG4gICAgYXJncy5hZGQocGF0aC5yZWxhdGl2ZShzZWxmRGlyUGF0aCwgcHJvamVjdFBhdHRlcm4pIHx8IHByb2plY3RQYXR0ZXJuKTtcbiAgfVxuICByZXR1cm4gWy4uLmFyZ3NdO1xufVxuXG5mdW5jdGlvbiBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0czogUHJvamVjdFtdLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGxldCBvd25pbmdQcm9qZWN0OiBQcm9qZWN0IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoXG4gICAgICAoZmlsZVBhdGggPT09IHByb2plY3QuZGlyUGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3Byb2plY3QuZGlyUGF0aH0vYCkpICYmXG4gICAgICAoIW93bmluZ1Byb2plY3QgfHwgcHJvamVjdC5kaXJQYXRoLmxlbmd0aCA+IG93bmluZ1Byb2plY3QuZGlyUGF0aC5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBvd25pbmdQcm9qZWN0ID0gcHJvamVjdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG93bmluZ1Byb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICctLScgfCAnXycgfCAnZmlsZXMnPik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGludFRhcmdldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBbLi4uKGFyZ3YuZmlsZXMgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSksIC4uLihhcmd2WyctLSddID8/IFtdKV0pIHtcbiAgICBsaW50VGFyZ2V0cy5hZGQoU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW50VGFyZ2V0c107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8J2RpcmVjdG9yeScgfCAnb3RoZXInPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkgcmV0dXJuICdkaXJlY3RvcnknO1xuICB9IGNhdGNoIHtcbiAgICAvLyBNaXNzaW5nIHBhdGhzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkb3duc3RyZWFtIHRvb2xzLlxuICB9XG5cbiAgcmV0dXJuICdvdGhlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5oYXNPeGZtdCkgcmV0dXJuIG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgaWYgKG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gcHJldHRpZXJPbmx5RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcicsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgcHJvamVjdC5oYXNPeGZtdCkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgbmVlZHNQcmV0dGllcihwcm9qZWN0KSkge1xuICAgIHJldHVybiBbZmlsZVBhdGgsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dO1xuICB9XG4gIGlmIChzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKGZpbGVQYXRoLCBgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uUGF0aCc+W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgcmV0dXJuIFtdO1xuICByZXR1cm4gcHJvamVjdHNcbiAgICAuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoID09PSBwYXRoLmpvaW4oZmlsZVBhdGgsICdwYWNrYWdlLmpzb24nKSB8fFxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgIClcbiAgICAubWFwKChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdExpbnRUYXJnZXRzKFxuICBwcm9qZWN0czogUHJvamVjdFtdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiB7IGxpbnRQYXRoOiBzdHJpbmc7IHByb2plY3Q6IFByb2plY3QgfVtdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5Jykge1xuICAgIGNvbnN0IGRlc2NlbmRhbnRQcm9qZWN0cyA9IHByb2plY3RzLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LmRpclBhdGggPT09IGZpbGVQYXRoIHx8IHByb2plY3QuZGlyUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgICk7XG4gICAgaWYgKGRlc2NlbmRhbnRQcm9qZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZGVzY2VuZGFudFByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gKHsgbGludFBhdGg6IHByb2plY3QuZGlyUGF0aCwgcHJvamVjdCB9KSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzLCBmaWxlUGF0aCk7XG4gIHJldHVybiBwcm9qZWN0ID8gW3sgbGludFBhdGg6IGZpbGVQYXRoLCBwcm9qZWN0IH1dIDogW107XG59XG5cbmZ1bmN0aW9uIGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBweXRob25FeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IGRhcnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4sIGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5lZWRzUHJldHRpZXIocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+KTogYm9vbGVhbiB7XG4gIHJldHVybiAhcHJvamVjdC5oYXNPeGZtdCAmJiBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCc7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tICdub2RlOm5ldCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQgeyBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCB9IGZyb20gJy4vcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBnaXZlbiBwb3J0IGFuZCBraWxscyBhbnkgcHJvY2VzcyB1c2luZyBpdC5cbiAqIE5vdGUgd2IgYWx3YXlzIHJlcXVpcmVzIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyhyYXdQb3J0OiB1bmtub3duLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihyYXdQb3J0KTtcbiAgaWYgKCFwb3J0KSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBnaXZlbiBwb3J0ICgke3BvcnR9KSBpcyBpbnZhbGlkLmApO1xuXG4gIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQsIHByb2plY3QpO1xuICByZXR1cm4gcG9ydDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3J0IGlzIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBwb3J0IGlzIGF2YWlsYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1BvcnRBdmFpbGFibGUocG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIENoZWNrIGJvdGggc3RhY2tzIHRvIGNhdGNoIHByb2Nlc3NlcyBib3VuZCBvbmx5IG9uIElQdjYgb3IgSVB2NC5cbiAgZm9yIChjb25zdCBob3N0IG9mIFsnMTI3LjAuMC4xJywgJzo6J10pIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBwcm9iZVBvcnQoaG9zdCwgcG9ydCk7XG4gICAgaWYgKCFhdmFpbGFibGUpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvYmVQb3J0KGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuXG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFGTk9TVVBQT1JUJykge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsIGhvc3QpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IGV4ZWNGaWxlU3luYywgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCwgcHJpbnRTdGFydCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuaW1wb3J0IHsgaXNQb3J0QXZhaWxhYmxlIH0gZnJvbSAnLi9wb3J0LmpzJztcblxuY29uc3Qga2lsbGVkID0gbmV3IFNldDxudW1iZXIgfCBzdHJpbmc+KCk7XG5jb25zdCBzdGFsZVByb2Nlc3NQb2xsSW50ZXJ2YWxNcyA9IDEwMDtcbmNvbnN0IHN0YWxlUHJvY2Vzc01heFBvbGxzID0gMTA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQpO1xuICBpZiAoIWF2YWlsYWJsZSkge1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfVxuXG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHBvcnQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHBvcnQpO1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0LCBwcm9qZWN0KTtcbiAga2lsbExpc3RlbmluZ1Byb2Nlc3Nlc0J5UG9ydChwb3J0KTtcbn1cblxuZnVuY3Rpb24ga2lsbExpc3RlbmluZ1Byb2Nlc3Nlc0J5UG9ydChwb3J0OiBudW1iZXIpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBwaWQgb2YgbGlzdExpc3RlbmluZ1Byb2Nlc3NJZHMocG9ydCkpIHtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgJ1NJR0tJTEwnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbGlzdExpc3RlbmluZ1Byb2Nlc3NJZHMocG9ydDogbnVtYmVyKTogbnVtYmVyW10ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGV4ZWNGaWxlU3luYygnbHNvZicsIFsnLXRpJywgYHRjcDoke3BvcnR9YCwgJy1zVENQOkxJU1RFTiddLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICAgIHJldHVybiBzdGRvdXRcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAubWFwKChwaWQpID0+IE51bWJlcihwaWQudHJpbSgpKSlcbiAgICAgIC5maWx0ZXIoKHBpZCkgPT4gTnVtYmVyLmlzSW50ZWdlcihwaWQpICYmIHBpZCA+IDAgJiYgcGlkICE9PSBwcm9jZXNzLnBpZCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlU3RhbGVQcm9jZXNzKHBpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhbGVQcm9jZXNzTWF4UG9sbHM7IGkrKykge1xuICAgIGF3YWl0IHNldFRpbWVvdXQoc3RhbGVQcm9jZXNzUG9sbEludGVydmFsTXMpO1xuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFU1JDSCcpIHJldHVybjtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwaWQsICdTSUdLSUxMJyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgcHVibGlzaD0ke3BvcnR9YF0sIHByb2plY3QpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJDb250YWluZXJzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGFpbmVySWRzID0gYXdhaXQgbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzLCBwcm9qZWN0KTtcbiAgICBpZiAoY29udGFpbmVySWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydybScsICctZicsIC4uLmNvbnRhaW5lcklkc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3BzJywgJy1xJywgLi4uZmlsdGVyQXJnc10sIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IHByb2plY3QuZW52LFxuICB9KTtcbiAgcmV0dXJuIHN0ZG91dFxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoaWQpID0+IGlkLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzLCByZW1vdmVTdGFsZVByb2Nlc3MgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2RlbGF5LW1zJzoge1xuICAgIGRlZmF1bHQ6IDUwMDAsXG4gICAgZGVzY3JpYmU6ICdEZWxheSBiZWZvcmUgc3RhcnRpbmcgdGhlIG1haW50ZW5hbmNlIHBhZ2Ugc2VydmVyLicsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xudHlwZSBNYWludGVuYW5jZUFyZ3YgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPiAmIHtcbiAgYWN0aW9uOiAnc3RhcnQnIHwgJ3N0b3AnO1xufTtcbmNvbnN0IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHMgPSA1O1xuY29uc3QgbWFpbnRlbmFuY2VMaXN0ZW5SZXRyeURlbGF5TXMgPSAxMDA7XG5jb25zdCBtYXhUaW1lb3V0RGVsYXlNcyA9IDJfMTQ3XzQ4M182NDc7XG5jb25zdCBtYWludGVuYW5jZVBpZERpcmVjdG9yeU5hbWUgPSAnLndiJztcbmNvbnN0IG1haW50ZW5hbmNlSHRtbCA9IGA8IWRvY3R5cGUgaHRtbD5cbjxodG1sIGxhbmc9XCJqYVwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIj5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTFcIj5cbiAgICA8dGl0bGU+44Oh44Oz44OG44OK44Oz44K55LitPC90aXRsZT5cbiAgICA8c3R5bGU+XG4gICAgICBib2R5IHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgICAgY29sb3I6ICMxMTE4Mjc7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiU2Vnb2UgVUlcIiwgc2Fucy1zZXJpZjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgbWluLWhlaWdodDogMTAwdmg7XG4gICAgICB9XG5cbiAgICAgIG1haW4ge1xuICAgICAgICBwYWRkaW5nOiAyNHB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIGgxIHtcbiAgICAgICAgZm9udC1zaXplOiAyOHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS40O1xuICAgICAgICBtYXJnaW46IDAgMCAxNnB4O1xuICAgICAgfVxuXG4gICAgICBwIHtcbiAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS44O1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8bWFpbj5cbiAgICAgIDxoMT7nj77lnKjjg6Hjg7Pjg4bjg4rjg7PjgrnkuK3jgafjgZk8L2gxPlxuICAgICAgPHA+55qG5qeY44Gr44Gv44GU5LiN5L6/44KS44GK44GL44GR44GX44G+44GZ44GM44CB44Oh44Oz44OG44OK44Oz44K557WC5LqG44G+44Gn44GX44Gw44KJ44GP44GK5b6F44Gh44GP44Gg44GV44GE44CCPC9wPlxuICAgIDwvbWFpbj5cbiAgPC9ib2R5PlxuPC9odG1sPmA7XG5cbmV4cG9ydCBjb25zdCBtYWludGVuYW5jZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTWFpbnRlbmFuY2VBcmd2PiA9IHtcbiAgY29tbWFuZDogJ21haW50ZW5hbmNlIDxhY3Rpb24+JyxcbiAgZGVzY3JpYmU6ICdTdGFydCBvciBzdG9wIGEgbGlnaHR3ZWlnaHQgbWFpbnRlbmFuY2UgcGFnZSBzZXJ2ZXIuIEV4YW1wbGU6IHdiIG1haW50ZW5hbmNlIHN0YXJ0JyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzXG4gICAgICAucG9zaXRpb25hbCgnYWN0aW9uJywge1xuICAgICAgICBjaG9pY2VzOiBbJ3N0YXJ0JywgJ3N0b3AnXSBhcyBjb25zdCxcbiAgICAgICAgZGVzY3JpYmU6ICdNYWludGVuYW5jZSBzZXJ2ZXIgYWN0aW9uJyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbnMoYnVpbGRlcikgYXMgdW5rbm93biBhcyBBcmd2PE1haW50ZW5hbmNlQXJndj4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uID0gYXJndi5hY3Rpb247XG4gICAgaWYgKHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFNraXAgbWFpbnRlbmFuY2UgJHthY3Rpb259IGJlY2F1c2UgV0JfRU5WIGlzIHRlc3QuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IHBhcnNlUG9ydChwcm9qZWN0LmVudi5QT1JUKTtcbiAgICBpZiAoYWN0aW9uID09PSAnc3RhcnQnKSB7XG4gICAgICBhd2FpdCBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQsIGFyZ3YuZGVsYXlNcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhY3Rpb24gPT09ICdzdG9wJykge1xuICAgICAgYXdhaXQgc3RvcE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtYWludGVuYW5jZSBhY3Rpb246ICR7YWN0aW9ufWApO1xuICB9LFxufTtcblxuZnVuY3Rpb24gcGFyc2VQb3J0KHBvcnRFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGFzc2VydC5vayhOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpICYmIHBvcnQgPiAwLCBgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCk7XG4gIHJldHVybiBwb3J0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlciwgZGVsYXlNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGFzc2VydC5vayhcbiAgICBOdW1iZXIuaXNGaW5pdGUoZGVsYXlNcykgJiYgZGVsYXlNcyA+PSAwICYmIGRlbGF5TXMgPD0gbWF4VGltZW91dERlbGF5TXMsXG4gICAgYGRlbGF5LW1zIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAke21heFRpbWVvdXREZWxheU1zfTogJHtkZWxheU1zfWBcbiAgKTtcblxuICBjb25zdCBwaWRGaWxlUGF0aCA9IGF3YWl0IHdyaXRlTWFpbnRlbmFuY2VQaWRGaWxlKHByb2plY3QsIHBvcnQpO1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IGNsZWFudXAgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoLCBwcm9jZXNzLnBpZCk7XG4gIH07XG4gIGNvbnN0IGhhbmRsZVNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfTtcbiAgY29uc3QgcmVtb3ZlU2lnbmFsSGFuZGxlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR0lOVCcsIGhhbmRsZVNpZ25hbCk7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR1RFUk0nLCBoYW5kbGVTaWduYWwpO1xuICAgIHByb2Nlc3Mub2ZmKCdTSUdRVUlUJywgaGFuZGxlU2lnbmFsKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIGhhbmRsZVNpZ25hbCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIGhhbmRsZVNpZ25hbCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHUVVJVCcsIGhhbmRsZVNpZ25hbCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBzZXRUaW1lb3V0KGRlbGF5TXMsIHVuZGVmaW5lZCwgeyBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwgfSk7XG4gICAgcmVtb3ZlU2lnbmFsSGFuZGxlcnMoKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBjcmVhdGVBbmRMaXN0ZW5NYWludGVuYW5jZVNlcnZlcihwb3J0KTtcbiAgICBpZiAoIXNlcnZlcikgcmV0dXJuO1xuXG4gICAgY29uc29sZS5pbmZvKGBTdGFydGVkIG1haW50ZW5hbmNlIHNlcnZlciBvbiBwb3J0ICR7cG9ydH0uYCk7XG4gICAgYXdhaXQgd2FpdEZvclNodXRkb3duKHNlcnZlcik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICByZW1vdmVTaWduYWxIYW5kbGVycygpO1xuICAgIGF3YWl0IGNsZWFudXAoKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBbmRMaXN0ZW5NYWludGVuYW5jZVNlcnZlcihwb3J0OiBudW1iZXIpOiBQcm9taXNlPGh0dHAuU2VydmVyIHwgdW5kZWZpbmVkPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZU1haW50ZW5hbmNlU2VydmVyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpc3Rlbk1haW50ZW5hbmNlU2VydmVyKHNlcnZlciwgcG9ydCwgaGFuZGxlUnVudGltZU1haW50ZW5hbmNlU2VydmVyRXJyb3IpO1xuICAgICAgcmV0dXJuIHNlcnZlcjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgY2xvc2VNYWludGVuYW5jZVNlcnZlcihzZXJ2ZXIpO1xuICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uO1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScgJiYgYXR0ZW1wdCA8IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dChtYWludGVuYW5jZUxpc3RlblJldHJ5RGVsYXlNcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBTa2lwIG1haW50ZW5hbmNlIHNlcnZlciBiZWNhdXNlIHBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZS5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGhhbmRsZU1haW50ZW5hbmNlU3RhcnR1cEVycm9yKHBvcnQsIGVycik7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdVbnJlYWNoYWJsZSBtYWludGVuYW5jZSBzZXJ2ZXIgc3RhcnR1cCBzdGF0ZS4nKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlTWFpbnRlbmFuY2VTdGFydHVwRXJyb3IocG9ydDogbnVtYmVyLCBlcnJvcjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKTogbmV2ZXIge1xuICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZS5gKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE1haW50ZW5hbmNlIHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApKTtcbiAgfVxuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJ1bnRpbWVNYWludGVuYW5jZVNlcnZlckVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgTWFpbnRlbmFuY2Ugc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCkpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0b3BNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga2lsbE1haW50ZW5hbmNlUHJvY2Vzcyhwcm9qZWN0LCBwb3J0KTtcbiAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICBjb25zb2xlLmluZm8oYFN0b3BwZWQgbWFpbnRlbmFuY2Ugc2VydmVyIG9uIHBvcnQgJHtwb3J0fS5gKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFpbnRlbmFuY2VTZXJ2ZXIoKTogaHR0cC5TZXJ2ZXIge1xuICByZXR1cm4gaHR0cC5jcmVhdGVTZXJ2ZXIoKF9yZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDMsIHtcbiAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLXN0b3JlJyxcbiAgICAgICdjb250ZW50LXR5cGUnOiAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JyxcbiAgICB9KTtcbiAgICByZXNwb25zZS5lbmQobWFpbnRlbmFuY2VIdG1sKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3Rlbk1haW50ZW5hbmNlU2VydmVyKFxuICBzZXJ2ZXI6IGh0dHAuU2VydmVyLFxuICBwb3J0OiBudW1iZXIsXG4gIG9uUnVudGltZUVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG9uU3RhcnR1cEVycm9yID0gKGVycm9yOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgICAgc2VydmVyLm9mZignbGlzdGVuaW5nJywgb25MaXN0ZW5pbmcpO1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uTGlzdGVuaW5nID0gKCk6IHZvaWQgPT4ge1xuICAgICAgc2VydmVyLm9mZignZXJyb3InLCBvblN0YXJ0dXBFcnJvcik7XG4gICAgICBzZXJ2ZXIub24oJ2Vycm9yJywgb25SdW50aW1lRXJyb3IpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgb25TdGFydHVwRXJyb3IpO1xuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCBvbkxpc3RlbmluZyk7XG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAnMC4wLjAuMCcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvclNodXRkb3duKHNlcnZlcjogaHR0cC5TZXJ2ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzaHV0ZG93biA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdJTlQnLCBzaHV0ZG93bik7XG4gICAgICBwcm9jZXNzLm9mZignU0lHVEVSTScsIHNodXRkb3duKTtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdRVUlUJywgc2h1dGRvd24pO1xuICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNsb3NlTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIGNsb3NlIG1haW50ZW5hbmNlIHNlcnZlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9O1xuICAgIHByb2Nlc3Mub25jZSgnU0lHSU5UJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uY2UoJ1NJR1FVSVQnLCBzaHV0ZG93bik7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbG9zZU1haW50ZW5hbmNlU2VydmVyKHNlcnZlcjogaHR0cC5TZXJ2ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNlcnZlci5jbG9zZSgoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VSUl9TRVJWRVJfTk9UX1JVTk5JTkcnKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgc2VydmVyLmNsb3NlQWxsQ29ubmVjdGlvbnMoKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTWFpbnRlbmFuY2VQaWRGaWxlKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHBpZEZpbGVQYXRoID0gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LCBwb3J0KTtcbiAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHBpZEZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShwaWRGaWxlUGF0aCwgYCR7cHJvY2Vzcy5waWR9XFxuYCwgJ3V0ZjgnKTtcbiAgcmV0dXJuIHBpZEZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsTWFpbnRlbmFuY2VQcm9jZXNzKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwaWRGaWxlUGF0aCA9IG1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdCwgcG9ydCk7XG4gIGNvbnN0IHBpZCA9IGF3YWl0IHJlYWRNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgpO1xuICBpZiAocGlkICE9PSB1bmRlZmluZWQgJiYgcGlkICE9PSBwcm9jZXNzLnBpZCkge1xuICAgIHRyeSB7XG4gICAgICB0cmVlS2lsbChwaWQsICdTSUdURVJNJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGF3YWl0IHJlbW92ZVN0YWxlUHJvY2VzcyhwaWQpO1xuICB9XG4gIGF3YWl0IHJlbW92ZU1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCwgcGlkKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoOiBzdHJpbmcsIGV4cGVjdGVkUGlkPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChleHBlY3RlZFBpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcGlkID0gYXdhaXQgcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCk7XG4gICAgaWYgKHBpZCAhPT0gZXhwZWN0ZWRQaWQpIHJldHVybjtcbiAgfVxuICBhd2FpdCBmcy5ybShwaWRGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaWRUZXh0ID0gYXdhaXQgZnMucmVhZEZpbGUocGlkRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgcGlkID0gTnVtYmVyKHBpZFRleHQudHJpbSgpKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwaWQpICYmIHBpZCA+IDAgPyBwaWQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0TWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LnJvb3REaXJQYXRoLCBwb3J0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1haW50ZW5hbmNlUGlkRmlsZVBhdGgocm9vdERpclBhdGg6IHN0cmluZywgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihyb290RGlyUGF0aCwgbWFpbnRlbmFuY2VQaWREaXJlY3RvcnlOYW1lLCBgbWFpbnRlbmFuY2UtJHtwb3J0fS5waWRgKTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbi8qKlxuICogTWF0ZXJpYWxpemF0aW9uIG9mIGBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qYCByZWdpc3RyeSAoVmVyZGFjY2lvKSBkZXBlbmRlbmNpZXMgZm9yIERvY2tlciBidWlsZHM6XG4gKiB0aGUgcGFja2FnZXMgYXJlIGRvd25sb2FkZWQgb24gdGhlIGhvc3QgKGF1dGggdmlhIC5ucG1yYyAvIH4vLm5wbXJjIGxvY2FsbHksIG9yIFZFUkRBQ0NJT19UT0tFTlxuICogb24gQ0kpIGFuZCBleHRyYWN0ZWQgbmV4dCB0byB0aGUgcmVwb3NpdG9yeSBzbyBpbWFnZSBidWlsZHMgbmVlZCBubyByZWdpc3RyeSBjcmVkZW50aWFsc1xuICogKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk2NCkuXG4gKi9cbmV4cG9ydCBjb25zdCBQUklWQVRFX1JFR0lTVFJZX1NDT1BFID0gJ0B3aWxsYm9vc3Rlci1wcml2YXRlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhY2thZ2VOYW1lLnJlcGxhY2UoL15Ad2lsbGJvb3N0ZXIoPzotcHJpdmF0ZSk/XFwvLywgJycpO1xufVxuXG4vLyBgZ2l0OmAvYGdpdCtgL2BnaXRAYCAobm90IHRoZSBiYXJlIHdvcmQgYGdpdGApOiBucG0gYWxsb3dzIGFyYml0cmFyeSBkaXN0LXRhZ3MsIHNvIGEgdGFnIG5hbWVkXG4vLyBgZ2l0YCBvciBgZ2l0LW5leHRgIG11c3Qgc3RpbGwgYmUgdHJlYXRlZCBhcyBhIHJlZ2lzdHJ5IHNwZWNpZmllci5cbmNvbnN0IG5vblJlZ2lzdHJ5U3BlY2lmaWVyUHJlZml4ZXMgPSBbXG4gICdnaXQ6JyxcbiAgJ2dpdCsnLFxuICAnZ2l0QCcsXG4gICdmaWxlOicsXG4gICdsaW5rOicsXG4gICd3b3Jrc3BhY2U6JyxcbiAgJ2h0dHA6JyxcbiAgJ2h0dHBzOicsXG4gICdwb3J0YWw6JyxcbiAgJ3BhdGNoOicsXG5dO1xuXG4vLyBUaGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3Igd2hpY2ggZ2l0IHNwZWNpZmllcnMgdGhlIHByaXZhdGUtcGFja2FnZSB0b29saW5nIHN1cHBvcnRzOlxuLy8gYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIG1hdGVyaWFsaXplcyBleGFjdGx5IHRoZXNlLCBhbmQgYHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGRgIG11c3Rcbi8vIHJld3JpdGUgZXhhY3RseSB0aGVzZSAocmV3cml0aW5nIG90aGVyIG9yZ3MnIFNTSCBVUkxzIHdvdWxkIHBvaW50IGF0IG5ldmVyLW1hdGVyaWFsaXplZCBwYXRocykuXG5jb25zdCBwcml2YXRlR2l0RGVwZW5kZW5jeVBhdHRlcm4gPSAvXmdpdEBnaXRodWJcXC5jb206KD86V2lsbEJvb3N0ZXJ8V2lsbEJvb3N0ZXJMYWIpXFwvW14vI10rKD86XFwuZ2l0KT8oPzojLiopPyQvO1xuXG4vLyBSZXR1cm5zIGJvb2xlYW4gKG5vdCBhIGB2YWx1ZSBpcyBzdHJpbmdgIHByZWRpY2F0ZSk6IGEgcHJlZGljYXRlIHdvdWxkIG5hcnJvdyB0aGUgbmVnYXRpdmVcbi8vIGJyYW5jaCB0byBgdW5kZWZpbmVkYCBhbmQgYnJlYWsgYGVsc2UgaWZgIGNoYWlucyBvdmVyIGBzdHJpbmcgfCB1bmRlZmluZWRgIGRlcGVuZGVuY3kgdmFsdWVzLlxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgcHJpdmF0ZUdpdERlcGVuZGVuY3lQYXR0ZXJuLnRlc3QodmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIG5hbWUuc3RhcnRzV2l0aChgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfS9gKSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAhbm9uUmVnaXN0cnlTcGVjaWZpZXJQcmVmaXhlcy5zb21lKChwcmVmaXgpID0+IHZhbHVlLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcml2YXRlUmVnaXN0cnlBdXRoIHtcbiAgcmVnaXN0cnlVcmw6IHN0cmluZztcbiAgYXV0aFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgcmVnaXN0cnkgVVJMIGFuZCBhdXRoIHRva2VuIGZvciB0aGUgcHJpdmF0ZSBzY29wZSBmcm9tIHRoZSBwcm9qZWN0J3MgLm5wbXJjIGFuZFxuICogfi8ubnBtcmMgKG5lYXJlciBmaWxlIHdpbnMpLCBleHBhbmRpbmcgYCR7VkFSfWAgcmVmZXJlbmNlcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gT24gQ0kgdGhlXG4gKiBWRVJEQUNDSU9fVE9LRU4gZW52aXJvbm1lbnQgdmFyaWFibGUgc2VydmVzIGFzIHRoZSBmYWxsYmFjayB0b2tlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQcml2YXRlUmVnaXN0cnlBdXRoKHJvb3REaXJQYXRoOiBzdHJpbmcpOiBQcml2YXRlUmVnaXN0cnlBdXRoIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW50cmllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAvLyBSZXZlcnNlIG9yZGVyIHNvIG5lYXJlciBmaWxlcyBvdmVyd3JpdGUgdGhlIGhvbWUtZGlyZWN0b3J5IGRlZmF1bHRzLlxuICBmb3IgKGNvbnN0IG5wbXJjUGF0aCBvZiBbcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5ucG1yYycpLCBwYXRoLmpvaW4ocm9vdERpclBhdGgsICcubnBtcmMnKV0pIHtcbiAgICB0cnkge1xuICAgICAgT2JqZWN0LmFzc2lnbihlbnRyaWVzLCBwYXJzZU5wbXJjKGZzLnJlYWRGaWxlU3luYyhucG1yY1BhdGgsICd1dGY4JykpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3NpbmcgbnBtcmMgZmlsZXMgYXJlIGZpbmU7IHRoZSBvdGhlciBmaWxlIG9yIFZFUkRBQ0NJT19UT0tFTiBtYXkgc3RpbGwgcHJvdmlkZSBhdXRoLlxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlZ2lzdHJ5VXJsID0gZW50cmllc1tgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfTpyZWdpc3RyeWBdPy5yZXBsYWNlKC9cXC8rJC8sICcnKTtcbiAgaWYgKCFyZWdpc3RyeVVybCkgcmV0dXJuO1xuXG4gIC8vIG5wbS1zdHlsZSBVUkkgbWF0Y2hpbmc6IG5vcm1hbGl6ZSBib3RoIHNpZGVzIHRvIGEgdHJhaWxpbmcgc2xhc2ggc28gYSB0b2tlbiBmb3JcbiAgLy8gYC8vdmVyZGFjY2lvLmV4YW1wbGUuY29tL2AgY2FuIG5ldmVyIG1hdGNoIGAvL3ZlcmRhY2Npby5leGFtcGxlLmNvbS1vdGhlci5vcmcvYCwgYW5kIHBpY2sgdGhlXG4gIC8vIE1PU1QgU1BFQ0lGSUMgKGxvbmdlc3QpIG1hdGNoaW5nIHByZWZpeCBzbyBgLy9ob3N0L3ByaXZhdGUvYCBiZWF0cyBgLy9ob3N0L2AuXG4gIGNvbnN0IG5vcm1hbGl6ZWRSZWdpc3RyeVVybCA9IGAke3JlZ2lzdHJ5VXJsLnJlcGxhY2UoL15odHRwcz86LywgJycpLnJlcGxhY2UoL1xcLyskLywgJycpfS9gO1xuICBsZXQgbWF0Y2hlZFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBtYXRjaGVkUHJlZml4TGVuZ3RoID0gLTE7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgLy8gU2tpcCBlbXB0eSB0b2tlbnMgKGFuIHVuc2V0IGAke1ZBUn1gIGV4cGFuZHMgdG8gJycpOiBhbiBlbXB0eSBtYXRjaCBtdXN0IG5vdCBkZWZlYXQgdGhlXG4gICAgLy8gVkVSREFDQ0lPX1RPS0VOIGZhbGxiYWNrIGJlbG93LlxuICAgIGlmICgha2V5LmVuZHNXaXRoKCc6X2F1dGhUb2tlbicpIHx8ICF2YWx1ZSkgY29udGludWU7XG4gICAgY29uc3QgcHJlZml4ID0gYCR7a2V5LnNsaWNlKDAsIC0nOl9hdXRoVG9rZW4nLmxlbmd0aCkucmVwbGFjZSgvXFwvKyQvLCAnJyl9L2A7XG4gICAgaWYgKG5vcm1hbGl6ZWRSZWdpc3RyeVVybC5zdGFydHNXaXRoKHByZWZpeCkgJiYgcHJlZml4Lmxlbmd0aCA+IG1hdGNoZWRQcmVmaXhMZW5ndGgpIHtcbiAgICAgIG1hdGNoZWRQcmVmaXhMZW5ndGggPSBwcmVmaXgubGVuZ3RoO1xuICAgICAgbWF0Y2hlZFRva2VuID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIC8vIE5vIFByb2plY3QgaW5zdGFuY2UgZXhpc3RzIGF0IHRoaXMgbGF5ZXIsIHNvIHByb2Nlc3MuZW52IGlzIHRoZSBvbmx5IHNvdXJjZSBmb3IgdGhlXG4gIC8vIENJLWluamVjdGVkIGZhbGxiYWNrIHRva2VuLlxuICBjb25zdCBhdXRoVG9rZW4gPSBtYXRjaGVkVG9rZW4gPz8gcHJvY2Vzcy5lbnYuVkVSREFDQ0lPX1RPS0VOO1xuICByZXR1cm4geyByZWdpc3RyeVVybCwgYXV0aFRva2VuIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU5wbXJjKGNvbnRlbnQ6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBlbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgcmF3TGluZSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IGxpbmUgPSByYXdMaW5lLnRyaW0oKTtcbiAgICBpZiAoIWxpbmUgfHwgbGluZS5zdGFydHNXaXRoKCcjJykgfHwgbGluZS5zdGFydHNXaXRoKCc7JykpIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qgc2VwYXJhdG9ySW5kZXggPSBsaW5lLmluZGV4T2YoJz0nKTtcbiAgICBpZiAoc2VwYXJhdG9ySW5kZXggPD0gMCkgY29udGludWU7XG5cbiAgICBjb25zdCBrZXkgPSBsaW5lLnNsaWNlKDAsIHNlcGFyYXRvckluZGV4KS50cmltKCk7XG4gICAgY29uc3QgdmFsdWUgPSBsaW5lXG4gICAgICAuc2xpY2Uoc2VwYXJhdG9ySW5kZXggKyAxKVxuICAgICAgLnRyaW0oKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcJFxceyhbXn1dKylcXH0vZywgKF8sIHZhcmlhYmxlTmFtZTogc3RyaW5nKSA9PiBwcm9jZXNzLmVudlt2YXJpYWJsZU5hbWVdID8/ICcnKTtcbiAgICBlbnRyaWVzW2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gZW50cmllcztcbn1cblxuLyoqXG4gKiBEb3dubG9hZCBhbmQgZXh0cmFjdCBvbmUgcmVnaXN0cnkgcGFja2FnZSBpbnRvIGB0YXJnZXREaXJQYXRoYC4gVGhlIHNwZWNpZmllciBtYXkgYmUgYW4gZXhhY3RcbiAqIHNlbXZlciB2ZXJzaW9uICh0aGUgb3JnJ3MgY29tbW9uIGNhc2UgdmlhIGJ1bmZpZyBgZXhhY3QgPSB0cnVlYCksIGFueSBzZW12ZXIgcmFuZ2UgKHJlc29sdmVkXG4gKiBtYXgtc2F0aXNmeWluZyBhZ2FpbnN0IHRoZSByZWdpc3RyeSdzIHB1Ymxpc2hlZCB2ZXJzaW9ucywgbWF0Y2hpbmcgYG5wbSBpbnN0YWxsYCksIG9yIGFcbiAqIGRpc3QtdGFnLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlKFxuICBhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICB2ZXJzaW9uU3BlY2lmaWVyOiBzdHJpbmcsXG4gIHRhcmdldERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHZlcnNpb24gPSBhd2FpdCByZXNvbHZlVmVyc2lvbihhdXRoLCBwYWNrYWdlTmFtZSwgdmVyc2lvblNwZWNpZmllcik7XG4gIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgZmV0Y2hSZWdpc3RyeUpzb248eyBkaXN0PzogeyB0YXJiYWxsPzogc3RyaW5nIH0gfT4oXG4gICAgYXV0aCxcbiAgICBgJHthdXRoLnJlZ2lzdHJ5VXJsfS8ke2VuY29kZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKX0vJHt2ZXJzaW9ufWBcbiAgKTtcbiAgY29uc3QgdGFyYmFsbFVybCA9IG1ldGFkYXRhLmRpc3Q/LnRhcmJhbGw7XG4gIGlmICghdGFyYmFsbFVybCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gdGFyYmFsbCBVUkwgZm9yICR7cGFja2FnZU5hbWV9QCR7dmVyc2lvbn0gaW4gJHthdXRoLnJlZ2lzdHJ5VXJsfS5gKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hGcm9tUmVnaXN0cnkoYXV0aCwgdGFyYmFsbFVybCk7XG4gIGNvbnN0IHRhcmJhbGxQYXRoID0gcGF0aC5qb2luKFxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZHRlbXAocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnd2ItcHJpdmF0ZS1wYWNrYWdlLScpKSxcbiAgICAncGFja2FnZS50Z3onXG4gICk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHRhcmJhbGxQYXRoLCBCdWZmZXIuZnJvbShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHRhcmdldERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIC8vIG5wbSB0YXJiYWxscyBwbGFjZSB0aGUgY29udGVudCB1bmRlciBhIHRvcC1sZXZlbCBgcGFja2FnZS9gIGRpcmVjdG9yeS5cbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygndGFyJywgWycteHpmJywgdGFyYmFsbFBhdGgsICctQycsIHRhcmdldERpclBhdGgsICctLXN0cmlwLWNvbXBvbmVudHM9MSddLCB7XG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBleHRyYWN0ICR7cGFja2FnZU5hbWV9QCR7dmVyc2lvbn0gKCR7dGFyYmFsbFVybH0pLmApO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmRpcm5hbWUodGFyYmFsbFBhdGgpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVZlcnNpb24oXG4gIGF1dGg6IFByaXZhdGVSZWdpc3RyeUF1dGgsXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIHZlcnNpb25TcGVjaWZpZXI6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgLy8gUHJlcmVsZWFzZSBhbmQgYCtidWlsZGAgbWV0YWRhdGEgYXJlIGJvdGggcGFydCBvZiB2YWxpZCBleGFjdCBTZW1WZXIgdmVyc2lvbnMsIHNvIGFuIGV4YWN0XG4gIC8vIHNwZWNpZmllciByZXNvbHZlcyB0byBpdHNlbGYgd2l0aG91dCBhIHBhY2t1bWVudCBmZXRjaC5cbiAgaWYgKGlzRXhhY3RWZXJzaW9uKHZlcnNpb25TcGVjaWZpZXIpKSByZXR1cm4gdmVyc2lvblNwZWNpZmllcjtcblxuICBjb25zdCBwYWNrdW1lbnQgPSBhd2FpdCBmZXRjaFJlZ2lzdHJ5SnNvbjxQYWNrdW1lbnQ+KGF1dGgsIGAke2F1dGgucmVnaXN0cnlVcmx9LyR7ZW5jb2RlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpfWApO1xuICBjb25zdCB2ZXJzaW9uID0gc2VsZWN0VmVyc2lvbkZyb21QYWNrdW1lbnQodmVyc2lvblNwZWNpZmllciwgcGFja3VtZW50KTtcbiAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENhbm5vdCByZXNvbHZlICR7cGFja2FnZU5hbWV9QCR7dmVyc2lvblNwZWNpZmllcn0gYWdhaW5zdCAke2F1dGgucmVnaXN0cnlVcmx9OyB1c2UgYW4gZXhhY3QgdmVyc2lvbiwgYSBzZW12ZXIgcmFuZ2UsIG9yIGEgZGlzdC10YWcuYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHZlcnNpb247XG59XG5cbmludGVyZmFjZSBQYWNrdW1lbnQge1xuICAnZGlzdC10YWdzJz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHZlcnNpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogbnBtJ3Mgc3BlY2lmaWVyIGNsYXNzaWZpY2F0aW9uOiBgKmAgYW5kIGRpc3QtdGFnIG5hbWVzIHJlc29sdmUgdmlhIGRpc3QtdGFncyAobnBtIHJlc29sdmVzIGAqYFxuICogdG8gdGhlIGBsYXRlc3RgIHRhZyksIHdoaWxlIGFueSBvdGhlciB2YWxpZCBzZW12ZXIgcmFuZ2UgcmVzb2x2ZXMgdG8gdGhlIGhpZ2hlc3QgcHVibGlzaGVkXG4gKiB2ZXJzaW9uIHNhdGlzZnlpbmcgaXQsIG1hdGNoaW5nIGBucG0gaW5zdGFsbGAncyBtYXgtc2F0aXNmeWluZyBzZW1hbnRpY3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RWZXJzaW9uRnJvbVBhY2t1bWVudCh2ZXJzaW9uU3BlY2lmaWVyOiBzdHJpbmcsIHBhY2t1bWVudDogUGFja3VtZW50KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZlcnNpb25TcGVjaWZpZXIgIT09ICcqJyAmJiBzZW12ZXIudmFsaWRSYW5nZSh2ZXJzaW9uU3BlY2lmaWVyKSkge1xuICAgIHJldHVybiBzZW12ZXIubWF4U2F0aXNmeWluZyhPYmplY3Qua2V5cyhwYWNrdW1lbnQudmVyc2lvbnMgPz8ge30pLCB2ZXJzaW9uU3BlY2lmaWVyKSA/PyB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHBhY2t1bWVudFsnZGlzdC10YWdzJ10/Llt2ZXJzaW9uU3BlY2lmaWVyID09PSAnKicgPyAnbGF0ZXN0JyA6IHZlcnNpb25TcGVjaWZpZXJdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlZ2lzdHJ5SnNvbjxUPihhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLCB1cmw6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoRnJvbVJlZ2lzdHJ5KGF1dGgsIHVybCk7XG4gIHJldHVybiAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBUO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEZyb21SZWdpc3RyeShhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLCB1cmw6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgLy8gVGFyYmFsbCBVUkxzIGNvbWUgZnJvbSByZWdpc3RyeS1jb250cm9sbGVkIG1ldGFkYXRhOyBhdHRhY2ggdGhlIHRva2VuIG9ubHkgdG8gdGhlIGNvbmZpZ3VyZWRcbiAgLy8gcmVnaXN0cnkncyBvd24gb3JpZ2luIHNvIGEgbWFsaWNpb3VzIG9yIG1pc2NvbmZpZ3VyZWQgcmVnaXN0cnkgY2Fubm90IHJlZGlyZWN0IHRoZSBjcmVkZW50aWFsXG4gIC8vIHRvIGEgdGhpcmQtcGFydHkgaG9zdC5cbiAgY29uc3Qgc2VuZEF1dGhUb2tlbiA9ICEhYXV0aC5hdXRoVG9rZW4gJiYgaXNTYW1lT3JpZ2luKHVybCwgYXV0aC5yZWdpc3RyeVVybCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgaGVhZGVyczogc2VuZEF1dGhUb2tlbiA/IHsgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2F1dGguYXV0aFRva2VufWAgfSA6IHt9LFxuICB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfTogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIGlzU2FtZU9yaWdpbih1cmw6IHN0cmluZywgcmVnaXN0cnlVcmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHVybCkub3JpZ2luID09PSBuZXcgVVJMKHJlZ2lzdHJ5VXJsKS5vcmlnaW47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmNvZGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhY2thZ2VOYW1lLnJlcGxhY2UoJy8nLCAnJTJGJyk7XG59XG5cbi8vIFRoZSBvZmZpY2lhbCBTZW1WZXIgMi4wLjAgZ3JhbW1hciAoc2VtdmVyLm9yZyksIGFuY2hvcmVkOiBudW1lcmljLWxvb2tpbmcgZGlzdC10YWdzIHN1Y2ggYXNcbi8vIGAxLjIuM2xhdGVzdGAsIGxlYWRpbmctemVybyB2ZXJzaW9ucyAoYDAxLjIuM2ApLCBhbmQgdW5kZXJzY29yZSBpZGVudGlmaWVycyBhcmUgTk9UIHZlcnNpb25zIOKAlFxuLy8gcmVzb2x2ZVZlcnNpb24gdHJlYXRzIHRoZW0gYXMgdGFncywgbWF0Y2hpbmcgbm9kZS1zZW12ZXIncyBjbGFzc2lmaWNhdGlvbi5cbmNvbnN0IGV4YWN0U2VtdmVyUGF0dGVybiA9XG4gIC9eKD86MHxbMS05XVxcZCopXFwuKD86MHxbMS05XVxcZCopXFwuKD86MHxbMS05XVxcZCopKD86LSg/OjB8WzEtOV1cXGQqfFxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSg/OlxcLig/OjB8WzEtOV1cXGQqfFxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSkqKT8oPzpcXCtbMC05YS16QS1aLV0rKD86XFwuWzAtOWEtekEtWi1dKykqKT8kLztcblxuLyoqIFdoZXRoZXIgdGhlIHNwZWNpZmllciBpcyBhbiBleGFjdCBTZW1WZXIgdmVyc2lvbiAobm90IGEgcmFuZ2UsIHRhZywgb3IgZ2l0IFVSTCkuICovXG5mdW5jdGlvbiBpc0V4YWN0VmVyc2lvbihzcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFzcGVjaWZpZXIgJiYgZXhhY3RTZW12ZXJQYXR0ZXJuLnRlc3Qoc3BlY2lmaWVyKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIEVWRVJZIHZlcnNpb24gYHNwZWNpZmllcmAgY2FuIHJlc29sdmUgdG8gYWxzbyBzYXRpc2ZpZXMgYHJlcXVpcmVtZW50YCAoZXhhY3QgdmVyc2lvbnNcbiAqIGNvdW50IGFzIHNpbmdsZS12ZXJzaW9uIHJhbmdlcykuIENvbmZsaWN0IGNoZWNrcyB1c2UgdGhpcyBiZWNhdXNlIHRoZSBhY3R1YWxseSByZXNvbHZlZCB2ZXJzaW9uXG4gKiBpcyB1bmtub3duIGJlZm9yZSB0aGUgcmVnaXN0cnkgaXMgY29uc3VsdGVkOiBhIHN1YnNldCBzcGVjaWZpZXIncyBtYXgtc2F0aXNmeWluZyByZXNvbHV0aW9uIGlzXG4gKiBndWFyYW50ZWVkIHRvIHNhdGlzZnkgdGhlIHdpZGVyIHJlcXVpcmVtZW50LiBOb24tcmFuZ2Ugc3BlY2lmaWVycyAoZGlzdC10YWdzLCBnaXQgVVJMcykgYXJlIG5vdFxuICogY29tcGFyYWJsZSBhbmQgcmV0dXJuIGZhbHNlIOKAlCBjYWxsZXJzIGFjY2VwdCB0aG9zZSBvbmx5IG9uIGV4YWN0IHN0cmluZyBlcXVhbGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwZWNpZmllclN1YnNldChzcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZCwgcmVxdWlyZW1lbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoc3BlY2lmaWVyID09PSB1bmRlZmluZWQgfHwgcmVxdWlyZW1lbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAvLyBgKmAgcmVzb2x2ZXMgdGhyb3VnaCB0aGUgYGxhdGVzdGAgZGlzdC10YWcgKHNlbGVjdFZlcnNpb25Gcm9tUGFja3VtZW50KSwgbm90IGFzIGEgcmFuZ2UsIHNvXG4gIC8vIGl0IGlzIG5vdCBzdGF0aWNhbGx5IGNvbXBhcmFibGUgaW4gZWl0aGVyIHBvc2l0aW9uLlxuICBpZiAoc3BlY2lmaWVyID09PSAnKicgfHwgcmVxdWlyZW1lbnQgPT09ICcqJykgcmV0dXJuIGZhbHNlO1xuICAvLyBCdWlsZCBtZXRhZGF0YSBkaXN0aW5ndWlzaGVzIHJlZ2lzdHJ5IGFydGlmYWN0cyAocmVzb2x2ZVZlcnNpb24gZmV0Y2hlcyBhbiBleGFjdCBzcGVjaWZpZXJcbiAgLy8gdmVyYmF0aW0pIGJ1dCBzZW12ZXIgY29tcGFyaXNvbnMgaWdub3JlIGl0LCBzbyB0d28gZXhhY3QgdmVyc2lvbnMgbXVzdCBtYXRjaCBhcyBzdHJpbmdzLlxuICBpZiAoaXNFeGFjdFZlcnNpb24oc3BlY2lmaWVyKSAmJiBpc0V4YWN0VmVyc2lvbihyZXF1aXJlbWVudCkpIHJldHVybiBzcGVjaWZpZXIgPT09IHJlcXVpcmVtZW50O1xuICBpZiAoIXNlbXZlci52YWxpZFJhbmdlKHNwZWNpZmllcikgfHwgIXNlbXZlci52YWxpZFJhbmdlKHJlcXVpcmVtZW50KSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gc2VtdmVyLnN1YnNldChzcGVjaWZpZXIsIHJlcXVpcmVtZW50KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBtYXRlcmlhbGl6ZWQgYHZlcnNpb25gIGNhbiBiZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgcmVnaXN0cnkgYHNwZWNpZmllcmAuXG4gKiBEaXN0LXRhZ3MgKGludmFsaWQgcmFuZ2VzKSBhcmUgbm90IHN0YXRpY2FsbHkgY2hlY2thYmxlIGFuZCBwYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0ZXJpYWxpemVkVmVyc2lvblNhdGlzZmllcyhzcGVjaWZpZXI6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIEJ1aWxkIG1ldGFkYXRhIGRpc3Rpbmd1aXNoZXMgcmVnaXN0cnkgYXJ0aWZhY3RzLCBzbyBhbiBleGFjdCBzcGVjaWZpZXIgYWRtaXRzIG9ubHkgdGhlXG4gIC8vIGlkZW50aWNhbCB2ZXJzaW9uIHN0cmluZy5cbiAgaWYgKGlzRXhhY3RWZXJzaW9uKHNwZWNpZmllcikpIHJldHVybiBzcGVjaWZpZXIgPT09IHZlcnNpb247XG4gIGlmICghc2VtdmVyLnZhbGlkUmFuZ2Uoc3BlY2lmaWVyKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBzZW12ZXIuc2F0aXNmaWVzKHZlcnNpb24sIHNwZWNpZmllcik7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgaW5zdGFsbGVkIGB2ZXJzaW9uYCBpcyBzdGF0aWNhbGx5IEtOT1dOIHRvIHNhdGlzZnkgdGhlIHJlZ2lzdHJ5IGBzcGVjaWZpZXJgLlxuICogRGlzdC10YWdzIChpbnZhbGlkIHJhbmdlcykgYXJlIG5vdCBzdGF0aWNhbGx5IGNoZWNrYWJsZSBhbmQgcmV0dXJuIGZhbHNlIOKAlCB1bmxpa2VcbiAqIG1hdGVyaWFsaXplZFZlcnNpb25TYXRpc2ZpZXMsIGNhbGxlcnMgdXNlIHRoaXMgdG8gZGVjaWRlIHdoZXRoZXIgYW4gaW5zdGFsbGVkIGNvcHkgY2FuIHJlcGxhY2VcbiAqIGEgcmVnaXN0cnkgZG93bmxvYWQsIHNvIHVuY2VydGFpbnR5IG11c3QgZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbGVkVmVyc2lvblNhdGlzZmllcyhzcGVjaWZpZXI6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGAqYCByZXNvbHZlcyB0aHJvdWdoIHRoZSBgbGF0ZXN0YCBkaXN0LXRhZyAoc2VsZWN0VmVyc2lvbkZyb21QYWNrdW1lbnQpLCBzbyBsaWtlIGFueSBvdGhlclxuICAvLyBkaXN0LXRhZyBpdCBpcyBub3Qgc3RhdGljYWxseSBjaGVja2FibGUgYWdhaW5zdCBhbiBpbnN0YWxsZWQgdmVyc2lvbi5cbiAgaWYgKHNwZWNpZmllciA9PT0gJyonKSByZXR1cm4gZmFsc2U7XG4gIC8vIHJlc29sdmVWZXJzaW9uIGZldGNoZXMgYW4gZXhhY3Qgc3BlY2lmaWVyIHZlcmJhdGltIChidWlsZCBtZXRhZGF0YSBpbmNsdWRlZCksIHNvIGFuIGluc3RhbGxlZFxuICAvLyBjb3B5IG1heSByZXBsYWNlIHRoZSBkb3dubG9hZCBvbmx5IHdoZW4gdGhlIHZlcnNpb24gc3RyaW5ncyBtYXRjaCBleGFjdGx5LlxuICBpZiAoaXNFeGFjdFZlcnNpb24oc3BlY2lmaWVyKSkgcmV0dXJuIHNwZWNpZmllciA9PT0gdmVyc2lvbjtcbiAgcmV0dXJuICEhc2VtdmVyLnZhbGlkUmFuZ2Uoc3BlY2lmaWVyKSAmJiBzZW12ZXIuc2F0aXNmaWVzKHZlcnNpb24sIHNwZWNpZmllcik7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cywgZmluZFJvb3RBbmRTZWxmUHJvamVjdHMsIHR5cGUgRm91bmRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcml2YXRlUmVnaXN0cnlBdXRoIH0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7XG4gIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsXG4gIGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZSxcbiAgaW5zdGFsbGVkVmVyc2lvblNhdGlzZmllcyxcbiAgaXNQcml2YXRlR2l0RGVwZW5kZW5jeSxcbiAgaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5LFxuICByZXNvbHZlUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgc3BlY2lmaWVyU3Vic2V0LFxuICB0b1Vuc2NvcGVkUGFja2FnZU5hbWUsXG59IGZyb20gJy4uL3V0aWxzL3ByaXZhdGVSZWdpc3RyeS5qcyc7XG5cbmludGVyZmFjZSBQcml2YXRlUGFja2FnZSB7XG4gIG5hbWU6IHN0cmluZztcbiAga2luZDogJ2dpdCcgfCAncmVnaXN0cnknO1xuICAvKipcbiAgICogVW5kZWZpbmVkIGZvciByZWdpc3RyeSBwYWNrYWdlcyB0aGF0IG11c3QgYmUgZG93bmxvYWRlZDsgc2V0IGZvciBnaXQgcGFja2FnZXMgYW5kIGZvclxuICAgKiByZWdpc3RyeSBwYWNrYWdlcyB3aG9zZSBpbnN0YWxsZWQgY29weSBpbiBub2RlX21vZHVsZXMgYWxyZWFkeSBzYXRpc2ZpZXMgdGhlIHNwZWNpZmllclxuICAgKiAoc28gQ0kgc3RlcHMgd2l0aG91dCByZWdpc3RyeSBjcmVkZW50aWFscyBjYW4gc3RpbGwgbWF0ZXJpYWxpemUgdGhlbSkuXG4gICAqL1xuICBzb3VyY2VEaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRhcmdldERpclBhdGg6IHN0cmluZztcbiAgdmVyc2lvblNwZWNpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIG1hdGVyaWFsaXplZCB2ZXJzaW9uIG9uY2UgYW4gaW5zdGFsbGVkIGNvcHkgaXMgc2VsZWN0ZWQgb3IgYSBkb3dubG9hZCBpcyBleHRyYWN0ZWQuICovXG4gIHJlc29sdmVkVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5jb25zdCBkZXBlbmRlbmN5S2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdvdXQtZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnRGlyZWN0b3J5IHRvIGNvcHkgcHJpdmF0ZSBwYWNrYWdlcyBpbnRvJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnQHdpbGxib29zdGVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cFByaXZhdGVQYWNrYWdlc0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8eyBkcnlSdW4/OiBib29sZWFuIH0sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwLXByaXZhdGUtcGFja2FnZXMnLFxuICBkZXNjcmliZTpcbiAgICAnTWF0ZXJpYWxpemUgcHJpdmF0ZSBkZXBlbmRlbmNpZXMgZm9yIERvY2tlciBidWlsZHM6IGNvcHkgZ2l0IGRlcGVuZGVuY2llcywgcmV1c2UgaW5zdGFsbGVkIEB3aWxsYm9vc3Rlci1wcml2YXRlLyogcmVnaXN0cnkgcGFja2FnZXMgd2hvc2UgZXhhY3QtdmVyc2lvbiBvciBzZW12ZXItcmFuZ2Ugc3BlY2lmaWVyIHRoZSBpbnN0YWxsZWQgY29weSBzYXRpc2ZpZXMsIGFuZCBkb3dubG9hZCB0aGUgcmVzdCAoYXV0aCB2aWEgLm5wbXJjIC8gfi8ubnBtcmMgbG9jYWxseSwgb3IgVkVSREFDQ0lPX1RPS0VOIG9uIENJOyBkaXN0LXRhZyBzcGVjaWZpZXJzIHN1Y2ggYXMgYGxhdGVzdGAgYWx3YXlzIGRvd25sb2FkKS4gJyArXG4gICAgJ1RoZSBEb2NrZXJmaWxlIG11c3QgQ09QWSB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzIChlLmcuIGBDT1BZIEB3aWxsYm9vc3Rlci8gQHdpbGxib29zdGVyL2AgYW5kIGBDT1BZIEB3aWxsYm9vc3Rlci1wcml2YXRlLyBAd2lsbGJvb3N0ZXItcHJpdmF0ZS9gKSBzbyB0aGUgaW4taW1hZ2UgaW5zdGFsbCByZXNvbHZlcyB0aGUgcmV3cml0dGVuIGZpbGU6IHBhdGhzLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHJvb3RBbmRTZWxmID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcm9vdEFuZFNlbGYpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gUmVzb2x2ZSB0aGUgZGVzY2VuZGFudCBzZXQgZnJvbSB0aGUgcmVwb3NpdG9yeSBST09UIChub3QgdGhlIGN1cnJlbnQgZGlyZWN0b3J5KSBzbyB0aGVcbiAgICAvLyBjb21tYW5kIHNjYW5zIHRoZSByb290IG1hbmlmZXN0IGFuZCBldmVyeSB3b3Jrc3BhY2UgbWFuaWZlc3QgcmVnYXJkbGVzcyBvZiB3aGVyZSBpdCBydW5zOlxuICAgIC8vIGZpbmREZXNjZW5kYW50UHJvamVjdHMgcmV0dXJucyBvbmx5IHRoZSBjdXJyZW50IHByb2plY3Qgd2hlbiBpbnZva2VkIGZyb20gYSB3b3Jrc3BhY2UuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCByb290QW5kU2VsZi5yb290LmRpclBhdGgpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBTY2FuIHRoZSByb290IG1hbmlmZXN0IGFuZCBldmVyeSB3b3Jrc3BhY2UgbWFuaWZlc3Q6IGEgcHJpdmF0ZSBkZXBlbmRlbmN5IG1heSBiZSBkZWNsYXJlZCBpblxuICAgIC8vIGEgc3ViLXBhY2thZ2UgKGUuZy4gcGFja2FnZXMvc2VydmVyKSByYXRoZXIgdGhhbiB0aGUgcm9vdCwgeWV0IGl0IHN0aWxsIG1hdGVyaWFsaXplcyBhdCB0aGVcbiAgICAvLyByZXBvc2l0b3J5IHJvb3Qgc28gYHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGRgIHJlc29sdmVzIGl0IHVuaWZvcm1seS5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbWF0ZXJpYWxpemVQcml2YXRlUGFja2FnZXMocHJvamVjdHMucm9vdC5kaXJQYXRoLCBjb2xsZWN0TWFuaWZlc3RzKHByb2plY3RzKSwge1xuICAgICAgICBvdXREaXI6IGFyZ3Yub3V0RGlyLFxuICAgICAgICBkcnlSdW46IEJvb2xlYW4oYXJndi5kcnlSdW4pLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG5cbmludGVyZmFjZSBNYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlc09wdGlvbnMge1xuICAvKiogRGlyZWN0b3J5IChyZWxhdGl2ZSB0byB0aGUgcmVwb3NpdG9yeSByb290KSB0aGF0IGdpdCBkZXBlbmRlbmNpZXMgYXJlIGNvcGllZCBpbnRvLiAqL1xuICBvdXREaXI/OiBzdHJpbmc7XG4gIGRyeVJ1bj86IGJvb2xlYW47XG59XG5cbi8qKiBUaGUgcm9vdCBtYW5pZmVzdCBmb2xsb3dlZCBieSBlYWNoIGRpc3RpbmN0IHdvcmtzcGFjZSBtYW5pZmVzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0TWFuaWZlc3RzKHByb2plY3RzOiBGb3VuZFByb2plY3RzKTogUGFja2FnZUpzb25bXSB7XG4gIGNvbnN0IG1hbmlmZXN0c0J5RGlyUGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBQYWNrYWdlSnNvbj4oKTtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIFtwcm9qZWN0cy5yb290LCAuLi5wcm9qZWN0cy5kZXNjZW5kYW50c10pIHtcbiAgICBpZiAoIW1hbmlmZXN0c0J5RGlyUGF0aC5oYXMocHJvamVjdC5kaXJQYXRoKSkgbWFuaWZlc3RzQnlEaXJQYXRoLnNldChwcm9qZWN0LmRpclBhdGgsIHByb2plY3QucGFja2FnZUpzb24pO1xuICB9XG4gIHJldHVybiBbLi4ubWFuaWZlc3RzQnlEaXJQYXRoLnZhbHVlcygpXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1hdGVyaWFsaXplUHJpdmF0ZVBhY2thZ2VzKFxuICByb290UHJvamVjdERpclBhdGg6IHN0cmluZyxcbiAgbWFuaWZlc3RQYWNrYWdlSnNvbnM6IFBhY2thZ2VKc29uW10sXG4gIG9wdGlvbnM6IE1hdGVyaWFsaXplUHJpdmF0ZVBhY2thZ2VzT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBvdXREaXIgPSAnQHdpbGxib29zdGVyJywgZHJ5UnVuID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgLy8gT3V0cHV0IHBhdGhzIGFyZSByZWN1cnNpdmVseSBERUxFVEVEIGJlZm9yZSBiZWluZyByZWNyZWF0ZWQsIHNvIG5vbmUgb2YgdGhlbSBtYXkgY29udGFpbiBhXG4gIC8vIHN5bWxpbmsgY29tcG9uZW50OiBhIHN5bWxpbmsgKGUuZy4gYGVzY2FwZSAtPiBub2RlX21vZHVsZXNgLCBvciBgQHdpbGxib29zdGVyLXByaXZhdGVgXG4gIC8vIGl0c2VsZiBsaW5raW5nIGVsc2V3aGVyZSkgd291bGQgZWl0aGVyIHNtdWdnbGUgdGhlIGRlbGV0ZSBwYXN0IHRoZSBsZXhpY2FsIG92ZXJsYXAgZ3VhcmRzXG4gIC8vIG9yIGRlc3Ryb3kgdGhlIHN5bWxpbmsncyB0YXJnZXQuIFJlamVjdGluZyBjYW5vbmljYWwvbGV4aWNhbCBtaXNtYXRjaGVzIGtlZXBzIGV2ZXJ5XG4gIC8vIGRlc3RydWN0aXZlIG9wZXJhdGlvbiBvbiB0aGUgaW50ZW5kZWQgbGV4aWNhbCBsb2NhdGlvbi4gVGhlc2UgZ3VhcmRzIFRIUk9XIChub3QgcHJvY2Vzcy5leGl0KVxuICAvLyBzbyB0aGUgYXV0b21hdGljIGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZWAgY2FsbGVyIGNhbiBjYXRjaCB0aGVtIGFuZCBjb250aW51ZVxuICAvLyBub24tZmF0YWxseTsgdGhlIGV4cGxpY2l0IGNvbW1hbmQncyBoYW5kbGVyIGNhdGNoZXMgYW5kIGV4aXRzLlxuICBjb25zdCByb290RGlyUGF0aCA9IGNhbm9uaWNhbGl6ZVBhdGgocm9vdFByb2plY3REaXJQYXRoKTtcbiAgY29uc3QgcmVzb2x2ZU91dHB1dERpclBhdGggPSAocmVsYXRpdmVPckFic29sdXRlUGF0aDogc3RyaW5nLCBsYWJlbDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBsZXhpY2FsUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgcmVsYXRpdmVPckFic29sdXRlUGF0aCk7XG4gICAgY29uc3QgY2Fub25pY2FsUGF0aCA9IGNhbm9uaWNhbGl6ZVBhdGgobGV4aWNhbFBhdGgpO1xuICAgIGlmIChjYW5vbmljYWxQYXRoICE9PSBsZXhpY2FsUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2xhYmVsfSBtdXN0IG5vdCBjb250YWluIHN5bWxpbmtzICgke2xleGljYWxQYXRofSByZXNvbHZlcyB0byAke2Nhbm9uaWNhbFBhdGh9KS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGxleGljYWxQYXRoO1xuICB9O1xuICBjb25zdCBvdXREaXJQYXRoID0gcmVzb2x2ZU91dHB1dERpclBhdGgob3V0RGlyLCAnLS1vdXQtZGlyJyk7XG4gIGFzc2VydFN1YmRpcmVjdG9yeShyb290RGlyUGF0aCwgb3V0RGlyUGF0aCk7XG4gIC8vIFJlZ2lzdHJ5IHBhY2thZ2VzIGFsd2F5cyBtYXRlcmlhbGl6ZSBhdCB0aGUgcmVwb3NpdG9yeSByb290OiBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZGBcbiAgLy8gcmVzb2x2ZXMgdGhlbSBmcm9tIGA8cm9vdD4vQHdpbGxib29zdGVyLXByaXZhdGVgIHJlZ2FyZGxlc3Mgb2YgYC0tb3V0LWRpcmAuXG4gIGNvbnN0IHJlZ2lzdHJ5T3V0RGlyUGF0aCA9IHJlc29sdmVPdXRwdXREaXJQYXRoKFxuICAgIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsXG4gICAgYFRoZSAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9IG91dHB1dCBkaXJlY3RvcnlgXG4gICk7XG4gIGlmIChwYXRoc092ZXJsYXAob3V0RGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoKSkge1xuICAgIC8vIGUuZy4gYC0tb3V0LWRpciBAd2lsbGJvb3N0ZXItcHJpdmF0ZWAgb3IgYC0tb3V0LWRpciBAd2lsbGJvb3N0ZXItcHJpdmF0ZS9zdWJgOiB0aGVcbiAgICAvLyByZWdpc3RyeSBzdGVwIHJlY3Vyc2l2ZWx5IGRlbGV0ZXMgcmVnaXN0cnlPdXREaXJQYXRoLCB3aGljaCB3b3VsZCBkZXN0cm95IHRoZSBnaXRcbiAgICAvLyBwYWNrYWdlcyBjb3BpZWQgaW50byBhbiBlcXVhbCBvciBORVNURUQgZGlyZWN0b3J5IG1vbWVudHMgZWFybGllci5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYC0tb3V0LWRpciBtdXN0IG5vdCBvdmVybGFwIHRoZSAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9IHJlZ2lzdHJ5IG91dHB1dCBkaXJlY3RvcnkuYCk7XG4gIH1cbiAgY29uc3Qgc3RhZ2luZ1Jvb3REaXJQYXRoID0gcmVzb2x2ZU91dHB1dERpclBhdGgocGF0aC5qb2luKCcudG1wJywgJ3diLXByaXZhdGUtc3RhZ2luZycpLCAnVGhlIHN0YWdpbmcgZGlyZWN0b3J5Jyk7XG4gIGNvbnN0IGJhY2t1cFJvb3REaXJQYXRoID0gcmVzb2x2ZU91dHB1dERpclBhdGgocGF0aC5qb2luKCcudG1wJywgJ3diLXByaXZhdGUtYmFja3VwJyksICdUaGUgYmFja3VwIGRpcmVjdG9yeScpO1xuICBpZiAocGF0aHNPdmVybGFwKG91dERpclBhdGgsIGNhbm9uaWNhbGl6ZVBhdGgocGF0aC5qb2luKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJykpKSkge1xuICAgIC8vIFRoZSByZWN1cnNpdmUgZGVsZXRlIG9mIG91dERpclBhdGggd291bGQgZGVzdHJveSB0aGUgaW5zdGFsbGVkIHNvdXJjZXMgdGhlIGNvcGllcyByZWFkLlxuICAgIHRocm93IG5ldyBFcnJvcignLS1vdXQtZGlyIG11c3Qgbm90IG92ZXJsYXAgbm9kZV9tb2R1bGVzLicpO1xuICB9XG4gIGZvciAoY29uc3QgW2xhYmVsLCB0ZW1wb3JhcnlEaXJQYXRoXSBvZiBbXG4gICAgWydzdGFnaW5nJywgc3RhZ2luZ1Jvb3REaXJQYXRoXSxcbiAgICBbJ2JhY2t1cCcsIGJhY2t1cFJvb3REaXJQYXRoXSxcbiAgXSBhcyBjb25zdCkge1xuICAgIGlmIChwYXRoc092ZXJsYXAob3V0RGlyUGF0aCwgdGVtcG9yYXJ5RGlyUGF0aCkgfHwgcGF0aHNPdmVybGFwKHJlZ2lzdHJ5T3V0RGlyUGF0aCwgdGVtcG9yYXJ5RGlyUGF0aCkpIHtcbiAgICAgIC8vIEJvdGggZGlyZWN0b3JpZXMgYXJlIHJlY3Vyc2l2ZWx5IHJlY3JlYXRlZCwgc2lsZW50bHkgZGlzY2FyZGluZyBhbnl0aGluZyBtYXRlcmlhbGl6ZWQgaW50b1xuICAgICAgLy8gYW4gZXF1YWwgb3IgbmVzdGVkIG91dHB1dCBkaXJlY3RvcnkgbW9tZW50cyBlYXJsaWVyLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPdXRwdXQgZGlyZWN0b3JpZXMgbXVzdCBub3Qgb3ZlcmxhcCB0aGUgJHtsYWJlbH0gZGlyZWN0b3J5ICgke3RlbXBvcmFyeURpclBhdGh9KS5gKTtcbiAgICB9XG4gIH1cbiAgLy8gU3RhZ2luZyBNSVJST1JTIGVhY2ggb3V0cHV0IHRyZWUncyByZXBvc2l0b3J5LXJvb3QtcmVsYXRpdmUgbG9jYXRpb24gKGUuZy5cbiAgLy8gYDxyb290Pi9Ad2lsbGJvb3N0ZXItcHJpdmF0ZS9hYCBzdGFnZXMgYXQgYDxzdGFnaW5nPi9Ad2lsbGJvb3N0ZXItcHJpdmF0ZS9hYCksIHNvIHRoZSByZWxhdGl2ZVxuICAvLyBkaXN0YW5jZSBiZXR3ZWVuIGFueSB0d28gc3RhZ2VkIHRyZWVzIGVxdWFscyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGVpciBmaW5hbCBsb2NhdGlvbnMuIFRoYXRcbiAgLy8gbWFrZXMgY3Jvc3MtdHJlZSBgZmlsZTpgIHJld3JpdGVzIChlLmcuIGAuLi8uLi9Ad2lsbGJvb3N0ZXIvPG5hbWU+YCkgY29tcHV0ZWQgYWdhaW5zdCBzdGFnaW5nXG4gIC8vIGNvcnJlY3QgYWZ0ZXIgdGhlIHN3YXAsIHdoaWNoIGxldHMgZXZlcnkgZmFpbHVyZS1wcm9uZSBzdGVwIOKAlCBkb3dubG9hZCwgZXh0cmFjdGlvbiwgbmVzdGVkXG4gIC8vIGRpc2NvdmVyeSwgcmV3cml0aW5nIOKAlCBmaW5pc2ggYmVmb3JlIGVpdGhlciBsaXZlIHRyZWUgaXMgdG91Y2hlZC5cbiAgY29uc3QgdG9TdGFnZWRQYXRoID0gKGZpbmFsUGF0aDogc3RyaW5nKTogc3RyaW5nID0+XG4gICAgcGF0aC5qb2luKHN0YWdpbmdSb290RGlyUGF0aCwgcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgZmluYWxQYXRoKSk7XG4gIGlmIChwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBvdXREaXJQYXRoKSAhPT0gJ0B3aWxsYm9vc3RlcicpIHtcbiAgICAvLyBQcmUtZXhpc3RpbmcgbGltaXRhdGlvbiBvZiB0aGUgb3B0aW9uOiB0aGUgRG9ja2VyIG1hbmlmZXN0IHJld3JpdGUgaGFzIG5vIGFjY2VzcyB0byBpdC5cbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICdOb3RlOiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIHJld3JpdGVzIGdpdCBkZXBlbmRlbmNpZXMgdG8gPHJvb3Q+L0B3aWxsYm9vc3RlcjsgYSBjdXN0b20gLS1vdXQtZGlyIHJlcXVpcmVzIGEgbWF0Y2hpbmcgRG9ja2VyZmlsZSBsYXlvdXQuJ1xuICAgICAgKVxuICAgICk7XG4gIH1cbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzID0gYXdhaXQgY29sbGVjdFByaXZhdGVQYWNrYWdlcyhcbiAgICByb290RGlyUGF0aCxcbiAgICBtYW5pZmVzdFBhY2thZ2VKc29ucyxcbiAgICBvdXREaXJQYXRoLFxuICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aFxuICApO1xuXG4gIGlmIChkcnlSdW4pIHtcbiAgICBwcmludERyeVJ1blJlc3VsdChvdXREaXJQYXRoLCBwcml2YXRlUGFja2FnZXMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJlZ2lzdHJ5IHBhY2thZ2VzIHdob3NlIGluc3RhbGxlZCBjb3B5IHNhdGlzZmllcyB0aGUgc3BlY2lmaWVyIGFyZSBjb3BpZWQgZnJvbVxuICAvLyBub2RlX21vZHVsZXM7IG9ubHkgdGhlIHJlc3QgYXJlIGRvd25sb2FkZWQsIHNvIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzIGFyZSBuZWVkZWQgb25seSB3aGVuIGFcbiAgLy8gZG93bmxvYWQgYWN0dWFsbHkgaGFwcGVucyAoQ0kgdGVzdCBzdGVwcyBkZWxpYmVyYXRlbHkgcmVjZWl2ZSBubyBWZXJkYWNjaW8gdG9rZW4pLlxuICBjb25zdCBkb3dubG9hZGVkUGFja2FnZXMgPSBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXS5maWx0ZXIoKHApID0+IHAua2luZCA9PT0gJ3JlZ2lzdHJ5JyAmJiAhcC5zb3VyY2VEaXJQYXRoKTtcbiAgLy8gUmVzb2x2ZSByZXF1aXJlZCBjb25maWd1cmF0aW9uIEJFRk9SRSBkZWxldGluZyB0aGUgZXhpc3RpbmcgbWF0ZXJpYWxpemF0aW9ucywgc28gYSBtaXNzaW5nXG4gIC8vIHJlZ2lzdHJ5IGNvbmZpZ3VyYXRpb24gY2Fubm90IGRlc3Ryb3kgYSBwcmV2aW91c2x5IHVzYWJsZSBvdXRwdXQgdHJlZS4gVGhyb3cgKHJhdGhlciB0aGFuXG4gIC8vIGV4aXQpIHNvIGNhbGxlcnMgY2FuIGRlY2lkZTogYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIHJlcG9ydHMgaXQgYW5kIGV4aXRzLCB3aGlsZSB0aGVcbiAgLy8gYXV0b21hdGljIGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZWAgc3RlcCBjYXRjaGVzIGl0IGFuZCBjb250aW51ZXMsIGxlYXZpbmcgdGhlXG4gIC8vIGV4aXN0aW5nIG91dHB1dCB1bnRvdWNoZWQgKG5vdGhpbmcgaGFzIGJlZW4gZGVsZXRlZCB5ZXQgYXQgdGhpcyBwb2ludCkuXG4gIGNvbnN0IGF1dGggPSBkb3dubG9hZGVkUGFja2FnZXMubGVuZ3RoID4gMCA/IHJlc29sdmVQcml2YXRlUmVnaXN0cnlBdXRoKHJvb3REaXJQYXRoKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGRvd25sb2FkZWRQYWNrYWdlcy5sZW5ndGggPiAwICYmICFhdXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENhbm5vdCBkb3dubG9hZCAke2Rvd25sb2FkZWRQYWNrYWdlcy5tYXAoKHApID0+IHAubmFtZSkuam9pbignLCAnKX06IG5vIHJlZ2lzdHJ5IGNvbmZpZ3VyZWQgZm9yIHRoZSAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9IHNjb3BlOyBgICtcbiAgICAgICAgYGFkZCBcIiR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX06cmVnaXN0cnk9Li4uXCIgdG8gLm5wbXJjIG9yIH4vLm5wbXJjLiBPbmx5IGluc3RhbGxlZCBjb3BpZXMgc2F0aXNmeWluZyBhbiBleGFjdCB2ZXJzaW9uIG9yIGAgK1xuICAgICAgICAnc2VtdmVyIHJhbmdlIGFyZSByZXVzZWQgd2l0aG91dCByZWdpc3RyeSBhY2Nlc3M7IGRpc3QtdGFnIHNwZWNpZmllcnMgKGUuZy4gYGxhdGVzdGApIGFsd2F5cyByZXF1aXJlIGl0LidcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29waWVkUGFja2FnZXMgPSBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXS5maWx0ZXIoKHApID0+IHAua2luZCA9PT0gJ2dpdCcpO1xuICBjb25zdCByZWdpc3RyeVBhY2thZ2VzID0gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV0uZmlsdGVyKChwKSA9PiBwLmtpbmQgPT09ICdyZWdpc3RyeScpO1xuXG4gIC8vIE1hdGVyaWFsaXplIEJPVEggdHJlZXMgaW50byBzdGFnaW5nIGFuZCBzd2FwIHRoZW0gaW4gb25seSBhZnRlciBldmVyeSBmYWlsdXJlLXByb25lIHN0ZXBcbiAgLy8gc3VjY2VlZGVkOiBhIHJlZ2lzdHJ5IGZldGNoL2V4dHJhY3Rpb24vbmVzdGVkLWRpc2NvdmVyeS9yZXdyaXRlIGZhaWx1cmUgbXVzdCBsZWF2ZSBib3RoIGxpdmVcbiAgLy8gdHJlZXMgZXhhY3RseSBhcyB0aGV5IHdlcmUuIE90aGVyd2lzZSB0aGUgYXV0b21hdGljIGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZWBcbiAgLy8gY2FsbGVyIOKAlCB3aGljaCBjYXRjaGVzIHRoZSBmYWlsdXJlIGFuZCBjb250aW51ZXMg4oCUIHdvdWxkIHJld3JpdGUgZGVwZW5kZW5jaWVzIGFnYWluc3RcbiAgLy8gaW5jb25zaXN0ZW50IHRyZWVzIChlLmcuIGEgcmVnaXN0cnkgbWFuaWZlc3QgcG9pbnRpbmcgYXQgYSBkZWxldGVkIGBAd2lsbGJvb3N0ZXIvPG5hbWU+YCkuXG4gIGF3YWl0IGZzLnByb21pc2VzLnJtKHN0YWdpbmdSb290RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB0cnkge1xuICAgIC8vIEJvdGggb3V0cHV0IGRpcmVjdG9yaWVzIGFsd2F5cyBleGlzdCBhZnRlcndhcmRzOiBEb2NrZXJmaWxlcyBDT1BZIHRoZW0gdW5jb25kaXRpb25hbGx5LCBhbmRcbiAgICAvLyBhIG1pc3Npbmcgc291cmNlIHBhdGggZmFpbHMgdGhlIGJ1aWxkLlxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHRvU3RhZ2VkUGF0aChvdXREaXJQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodG9TdGFnZWRQYXRoKHJlZ2lzdHJ5T3V0RGlyUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcHJpdmF0ZVBhY2thZ2Ugb2YgY29waWVkUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGNvcHlJbnN0YWxsZWRQYWNrYWdlKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZSwgdG9TdGFnZWRQYXRoKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiByZWdpc3RyeVBhY2thZ2VzKSB7XG4gICAgICBpZiAocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCkge1xuICAgICAgICBhd2FpdCBjb3B5SW5zdGFsbGVkUGFja2FnZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UsIHRvU3RhZ2VkUGF0aChwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlKFxuICAgICAgICAvLyBkb3dubG9hZGVkUGFja2FnZXMgaXMgbm9uLWVtcHR5IG9uIHRoaXMgcGF0aCwgc28gdGhlIGF1dGggY2hlY2sgYWJvdmUgcGFzc2VkLlxuICAgICAgICBhdXRoISxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UubmFtZSxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UudmVyc2lvblNwZWNpZmllciA/PyAnbGF0ZXN0JyxcbiAgICAgICAgdG9TdGFnZWRQYXRoKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpXG4gICAgICApO1xuICAgICAgcHJpdmF0ZVBhY2thZ2UucmVzb2x2ZWRWZXJzaW9uID0gcmVhZEluc3RhbGxlZFZlcnNpb24oXG4gICAgICAgIHRvU3RhZ2VkUGF0aChwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKSxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UubmFtZVxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRG93bmxvYWRlZCAke3ByaXZhdGVQYWNrYWdlLm5hbWV9IHRvICR7cGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCl9YCk7XG4gICAgICAvLyBBIGRvd25sb2FkZWQgcGFja2FnZSBtYXkgaXRzZWxmIGRlcGVuZCBvbiBwcml2YXRlIHBhY2thZ2VzIHRoYXQgd2VyZSBub3QgdmlzaWJsZSBiZWZvcmVcbiAgICAgIC8vIGV4dHJhY3Rpb247IG1hdGVyaWFsaXplIHRoZW0gdG9vLiBJbnN0YWxsZWQgY29waWVzIHdlcmUgYWxyZWFkeSBkZWVwLXNjYW5uZWQgYnlcbiAgICAgIC8vIGNvbGxlY3RQcml2YXRlUGFja2FnZXMuXG4gICAgICBhd2FpdCBjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKFxuICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgYXV0aCEsXG4gICAgICAgIHByaXZhdGVQYWNrYWdlLFxuICAgICAgICBwcml2YXRlUGFja2FnZXMsXG4gICAgICAgIG91dERpclBhdGgsXG4gICAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aCxcbiAgICAgICAgdG9TdGFnZWRQYXRoXG4gICAgICApO1xuICAgIH1cblxuICAgIGF3YWl0IHJlcGxhY2VQcml2YXRlRGVwZW5kZW5jaWVzKHN0YWdpbmdSb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2VzLCB0b1N0YWdlZFBhdGgpO1xuICAgIGF3YWl0IHN3YXBNYXRlcmlhbGl6ZWRUcmVlcyhbb3V0RGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoXSwgdG9TdGFnZWRQYXRoLCBiYWNrdXBSb290RGlyUGF0aCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oc3RhZ2luZ1Jvb3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKFxuICAgIGBFbnN1cmUgdGhlIERvY2tlcmZpbGUgQ09QWXMgJHtwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBvdXREaXJQYXRoKX0vIGFuZCAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9LyBpbnRvIHRoZSBpbWFnZSBiZWZvcmUgaW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuYFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBtYW5pZmVzdFBhY2thZ2VKc29uczogUGFja2FnZUpzb25bXSxcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICByZWdpc3RyeU91dERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4+IHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPigpO1xuICAvLyBTZWVkIGZyb20gZXZlcnkgbWFuaWZlc3QgKHJvb3QgKyB3b3Jrc3BhY2VzKTsgb25lIHByaXZhdGUgcGFja2FnZSBtYXkgYmUgcmVxdWVzdGVkIGJ5IHNldmVyYWxcbiAgLy8gbWFuaWZlc3RzLCBzbyBtZXJnZSBkdXBsaWNhdGVzIHRoZSBzYW1lIHdheSBuZXN0ZWQgZGlzY292ZXJ5IGRvZXMg4oCUIGtlZXAgdGhlIG5hcnJvd2VyXG4gIC8vIGNvbXBhdGlibGUgcmVxdWlyZW1lbnQgYW5kIGZhaWwgbG91ZGx5IG9uIGEgZ2VudWluZSBjb25mbGljdC5cbiAgY29uc3QgcGFja2FnZXNUb1Byb2Nlc3M6IFByaXZhdGVQYWNrYWdlW10gPSBbXTtcbiAgY29uc3QgcXVldWVkUGFja2FnZXMgPSBuZXcgTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+KCk7XG4gIGZvciAoY29uc3QgcGFja2FnZUpzb24gb2YgbWFuaWZlc3RQYWNrYWdlSnNvbnMpIHtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RlZCBvZiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhwYWNrYWdlSnNvbiwgb3V0RGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoKSkge1xuICAgICAgY29uc3QgcXVldWVkID0gcXVldWVkUGFja2FnZXMuZ2V0KHJlcXVlc3RlZC5uYW1lKTtcbiAgICAgIGlmICghcXVldWVkKSB7XG4gICAgICAgIHF1ZXVlZFBhY2thZ2VzLnNldChyZXF1ZXN0ZWQubmFtZSwgcmVxdWVzdGVkKTtcbiAgICAgICAgcGFja2FnZXNUb1Byb2Nlc3MucHVzaChyZXF1ZXN0ZWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5hcnJvd2VyID0gbmFycm93ZXJDb21wYXRpYmxlUmVxdWlyZW1lbnQocXVldWVkLCByZXF1ZXN0ZWQpO1xuICAgICAgaWYgKG5hcnJvd2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QocXVldWVkLCByZXF1ZXN0ZWQsIHBhY2thZ2VKc29uLm5hbWUgPz8gJ2Egd29ya3NwYWNlIG1hbmlmZXN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZWQudmVyc2lvblNwZWNpZmllciA9IG5hcnJvd2VyLnZlcnNpb25TcGVjaWZpZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHBhY2thZ2VzVG9Qcm9jZXNzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHByaXZhdGVQYWNrYWdlID0gcGFja2FnZXNUb1Byb2Nlc3NbaW5kZXhdO1xuICAgIGlmICghcHJpdmF0ZVBhY2thZ2UpIGNvbnRpbnVlO1xuICAgIGlmIChwcml2YXRlUGFja2FnZXMuaGFzKHByaXZhdGVQYWNrYWdlLm5hbWUpKSBjb250aW51ZTtcblxuICAgIGlmIChwcml2YXRlUGFja2FnZS5raW5kID09PSAnZ2l0Jykge1xuICAgICAgcHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCA9IGZpbmRJbnN0YWxsZWRQYWNrYWdlRGlyKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZS5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5zdGFsbGVkID0gZmluZEluc3RhbGxlZFJlZ2lzdHJ5UGFja2FnZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UpO1xuICAgICAgcHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCA9IGluc3RhbGxlZD8uZGlyUGF0aDtcbiAgICAgIHByaXZhdGVQYWNrYWdlLnJlc29sdmVkVmVyc2lvbiA9IGluc3RhbGxlZD8udmVyc2lvbjtcbiAgICB9XG4gICAgLy8gU2VsZWN0ZWQgQkVGT1JFIHRoZSBkZWVwIHNjYW46IGEgbWFuaWZlc3QgaW5zaWRlIHRoZSBwYWNrYWdlIG1heSByZWZlciBiYWNrIHRvIHRoZSBwYWNrYWdlXG4gICAgLy8gaXRzZWxmLCBhbmQgdGhhdCByZXF1aXJlbWVudCBtdXN0IGJlIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBzZWxlY3Rpb24gKGFzc2VydE5vVmVyc2lvbkNvbmZsaWN0XG4gICAgLy8gYmVsb3cpLCBuZXZlciBuYXJyb3cgdGhlIGFscmVhZHktc2VsZWN0ZWQgc3BlY2lmaWVyLlxuICAgIHByaXZhdGVQYWNrYWdlcy5zZXQocHJpdmF0ZVBhY2thZ2UubmFtZSwgcHJpdmF0ZVBhY2thZ2UpO1xuICAgIC8vIE5lc3RlZCBwcml2YXRlIGRlcGVuZGVuY2llcyBvZiBhbiBpbnN0YWxsZWQgcGFja2FnZSBhcmUgZGlzY292ZXJhYmxlIHJpZ2h0IGF3YXk7IHJlZ2lzdHJ5XG4gICAgLy8gcGFja2FnZXMgd2l0aG91dCBhIHVzYWJsZSBpbnN0YWxsZWQgY29weSBhcmUgaW5zcGVjdGVkIGFmdGVyIGRvd25sb2FkIGluc3RlYWRcbiAgICAvLyAoY29sbGVjdE5lc3RlZFByaXZhdGVQYWNrYWdlcykuXG4gICAgaWYgKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGgpIHtcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIGZpbmRQcml2YXRlRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uLCBvdXREaXJQYXRoLCByZWdpc3RyeU91dERpclBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgcXVldWVkID0gcXVldWVkUGFja2FnZXMuZ2V0KG5lc3RlZC5uYW1lKTtcbiAgICAgICAgICBpZiAoIXF1ZXVlZCkge1xuICAgICAgICAgICAgcXVldWVkUGFja2FnZXMuc2V0KG5lc3RlZC5uYW1lLCBuZXN0ZWQpO1xuICAgICAgICAgICAgcGFja2FnZXNUb1Byb2Nlc3MucHVzaChuZXN0ZWQpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcml2YXRlUGFja2FnZXMuaGFzKG5lc3RlZC5uYW1lKSkge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBtYXRlcmlhbGl6ZWQgKG9yIHNlbGVjdGVkKTogdGhlIHJlcXVpcmVtZW50IG11c3QgYWRtaXQgdGhhdCBzZWxlY3Rpb24uXG4gICAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChxdWV1ZWQsIG5lc3RlZCwgcHJpdmF0ZVBhY2thZ2UubmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFN0aWxsIHF1ZXVlZDoga2VlcCB0aGUgTkFSUk9XRVIgY29tcGF0aWJsZSByZXF1aXJlbWVudCBzbyBkaXNjb3Zlcnkgb3JkZXIgY2Fubm90XG4gICAgICAgICAgICAvLyB0dXJuIGNvbXBhdGlibGUgY29uc3RyYWludHMgKGUuZy4gYF4xLjAuMGAgYW5kIGAxLjIuM2ApIGludG8gYSBzcHVyaW91cyBjb25mbGljdC5cbiAgICAgICAgICAgIGNvbnN0IG5hcnJvd2VyID0gbmFycm93ZXJDb21wYXRpYmxlUmVxdWlyZW1lbnQocXVldWVkLCBuZXN0ZWQpO1xuICAgICAgICAgICAgaWYgKG5hcnJvd2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QocXVldWVkLCBuZXN0ZWQsIHByaXZhdGVQYWNrYWdlLm5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcXVldWVkLnZlcnNpb25TcGVjaWZpZXIgPSBuYXJyb3dlci52ZXJzaW9uU3BlY2lmaWVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcml2YXRlUGFja2FnZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3ROZXN0ZWRQcml2YXRlUGFja2FnZXMoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIGF1dGg6IFByaXZhdGVSZWdpc3RyeUF1dGgsXG4gIGV4dHJhY3RlZFBhY2thZ2U6IFByaXZhdGVQYWNrYWdlLFxuICBwcml2YXRlUGFja2FnZXM6IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPixcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICByZWdpc3RyeU91dERpclBhdGg6IHN0cmluZyxcbiAgdG9TdGFnZWRQYXRoOiAodGFyZ2V0RGlyUGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBFdmVyeSBtYXRlcmlhbGl6ZWQgcGFja2FnZSDigJQgaW5jbHVkaW5nIGEgbGF0ZS1kaXNjb3ZlcmVkIG5lc3RlZCBnaXQgZGVwZW5kZW5jeSDigJQgbGl2ZXMgaW5cbiAgLy8gc3RhZ2luZyB1bnRpbCB0aGUgYXRvbWljIHN3YXAsIHNvIGl0cyBtYW5pZmVzdHMgbXVzdCBiZSByZWFkIHRoZXJlLlxuICBjb25zdCBleHRyYWN0ZWREaXJQYXRoID0gdG9TdGFnZWRQYXRoKGV4dHJhY3RlZFBhY2thZ2UudGFyZ2V0RGlyUGF0aCk7XG4gIC8vIFNjYW4gRVZFUlkgbWFuaWZlc3Qgb2YgdGhlIG1hdGVyaWFsaXplZCBwYWNrYWdlIChvcmcgZ2l0IGRlcGVuZGVuY2llcyBhcmUgd2hvbGUgbW9ub3JlcG9cbiAgLy8gY2hlY2tvdXRzIHdpdGggcGFja2FnZXMvKi9wYWNrYWdlLmpzb24pLCBtaXJyb3JpbmcgY29sbGVjdFByaXZhdGVQYWNrYWdlcycgZGVlcCBzY2FuIOKAlCB0aGVcbiAgLy8gZGVwZW5kZW5jeS1yZXdyaXRlIHN0ZXAgd2Fsa3MgdGhlIHNhbWUgc2V0LCBzbyBhbnl0aGluZyBkZWNsYXJlZCB0aGVyZSBtdXN0IGJlIG1hdGVyaWFsaXplZC5cbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMoZXh0cmFjdGVkRGlyUGF0aCkpIHtcbiAgICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgICAgIGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpLFxuICAgICAgb3V0RGlyUGF0aCxcbiAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aFxuICAgICkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcHJpdmF0ZVBhY2thZ2VzLmdldChuZXN0ZWQubmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgaWYgKGV4aXN0aW5nLmtpbmQgPT09ICdyZWdpc3RyeScgJiYgIWV4aXN0aW5nLnNvdXJjZURpclBhdGggJiYgZXhpc3RpbmcucmVzb2x2ZWRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBTdGlsbCBhd2FpdGluZyBpdHMgZG93bmxvYWQgKG5vIGluc3RhbGxlZCBjb3B5IHNlbGVjdGVkLCBub3RoaW5nIGV4dHJhY3RlZCB5ZXQpOiBrZWVwXG4gICAgICAgICAgLy8gdGhlIE5BUlJPV0VSIGNvbXBhdGlibGUgcmVxdWlyZW1lbnQsIGV4YWN0bHkgYXMgY29sbGVjdFByaXZhdGVQYWNrYWdlcyBkb2VzIGZvclxuICAgICAgICAgIC8vIHF1ZXVlZCBwYWNrYWdlcywgc28gbGF0ZS1kaXNjb3ZlcmVkIG5lc3RlZCBjb25zdHJhaW50cyBjYW5ub3QgZmFicmljYXRlIGNvbmZsaWN0cy5cbiAgICAgICAgICBjb25zdCBuYXJyb3dlciA9IG5hcnJvd2VyQ29tcGF0aWJsZVJlcXVpcmVtZW50KGV4aXN0aW5nLCBuZXN0ZWQpO1xuICAgICAgICAgIGlmIChuYXJyb3dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZywgbmVzdGVkLCBleHRyYWN0ZWRQYWNrYWdlLm5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID0gbmFycm93ZXIudmVyc2lvblNwZWNpZmllcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ29sbGFwc2luZyBkaWZmZXJlbnQgcmVxdWVzdGVkIHZlcnNpb25zIGludG8gb25lIG1hdGVyaWFsaXphdGlvbiB3b3VsZCBzaWxlbnRseVxuICAgICAgICAgIC8vIHZpb2xhdGUgdGhlIGRlcGVuZGVudCdzIHJlcXVpcmVtZW50LCBzbyBjb25mbGljdHMgbXVzdCBmYWlsIGxvdWRseS5cbiAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZywgbmVzdGVkLCBleHRyYWN0ZWRQYWNrYWdlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVzdGVkLmtpbmQgPT09ICdnaXQnKSB7XG4gICAgICAgIG5lc3RlZC5zb3VyY2VEaXJQYXRoID0gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGgsIG5lc3RlZC5uYW1lKTtcbiAgICAgICAgYXdhaXQgY29weUluc3RhbGxlZFBhY2thZ2Uocm9vdERpclBhdGgsIG5lc3RlZCwgdG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbnN0YWxsZWQgPSBmaW5kSW5zdGFsbGVkUmVnaXN0cnlQYWNrYWdlKHJvb3REaXJQYXRoLCBuZXN0ZWQpO1xuICAgICAgICBuZXN0ZWQuc291cmNlRGlyUGF0aCA9IGluc3RhbGxlZD8uZGlyUGF0aDtcbiAgICAgICAgbmVzdGVkLnJlc29sdmVkVmVyc2lvbiA9IGluc3RhbGxlZD8udmVyc2lvbjtcbiAgICAgICAgaWYgKG5lc3RlZC5zb3VyY2VEaXJQYXRoKSB7XG4gICAgICAgICAgYXdhaXQgY29weUluc3RhbGxlZFBhY2thZ2Uocm9vdERpclBhdGgsIG5lc3RlZCwgdG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlKFxuICAgICAgICAgICAgYXV0aCxcbiAgICAgICAgICAgIG5lc3RlZC5uYW1lLFxuICAgICAgICAgICAgbmVzdGVkLnZlcnNpb25TcGVjaWZpZXIgPz8gJ2xhdGVzdCcsXG4gICAgICAgICAgICB0b1N0YWdlZFBhdGgobmVzdGVkLnRhcmdldERpclBhdGgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBuZXN0ZWQucmVzb2x2ZWRWZXJzaW9uID0gcmVhZEluc3RhbGxlZFZlcnNpb24odG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKSwgbmVzdGVkLm5hbWUpO1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRG93bmxvYWRlZCAke25lc3RlZC5uYW1lfSAobmVzdGVkIGRlcGVuZGVuY3kpIHRvICR7bmVzdGVkLnRhcmdldERpclBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByaXZhdGVQYWNrYWdlcy5zZXQobmVzdGVkLm5hbWUsIG5lc3RlZCk7XG4gICAgICBhd2FpdCBjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKFxuICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgYXV0aCxcbiAgICAgICAgbmVzdGVkLFxuICAgICAgICBwcml2YXRlUGFja2FnZXMsXG4gICAgICAgIG91dERpclBhdGgsXG4gICAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aCxcbiAgICAgICAgdG9TdGFnZWRQYXRoXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKiogYGRlc3RpbmF0aW9uRGlyUGF0aGAgbWF5IGRpZmZlciBmcm9tIGB0YXJnZXREaXJQYXRoYCB3aGlsZSByZWdpc3RyeSBwYWNrYWdlcyBzdGFnZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvcHlJbnN0YWxsZWRQYWNrYWdlKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBwcml2YXRlUGFja2FnZTogUHJpdmF0ZVBhY2thZ2UsXG4gIGRlc3RpbmF0aW9uRGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQSByZWdpc3RyeSBwYWNrYWdlJ3MgdGFyYmFsbCBtYXkgbGVnaXRpbWF0ZWx5IGNvbnRhaW4gbm9kZV9tb2R1bGVzLyBjb250ZW50IHZpYVxuICAvLyBidW5kbGVkRGVwZW5kZW5jaWVzOyB0aG9zZSBmaWxlcyBhcmUgcGFydCBvZiB0aGUgYXJ0aWZhY3QgYW5kIG11c3Qgc3Vydml2ZSB0aGUgY29weS4gR2l0XG4gIC8vIGNoZWNrb3V0cyAoYW5kIG5vbi1idW5kbGVkIG5hbWVzKSBzdGlsbCBleGNsdWRlIG5vZGVfbW9kdWxlcywgd2hpY2ggaG9sZHMgbG9jYWxseSBpbnN0YWxsZWRcbiAgLy8gZGVwZW5kZW5jaWVzIHRoZXJlLlxuICBjb25zdCBidW5kbGVkRGVwZW5kZW5jeU5hbWVzID1cbiAgICBwcml2YXRlUGFja2FnZS5raW5kID09PSAncmVnaXN0cnknID8gcmVhZEJ1bmRsZWREZXBlbmRlbmN5TmFtZXMocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCEpIDogW107XG4gIGF3YWl0IGZzLnByb21pc2VzLmNwKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGghLCBkZXN0aW5hdGlvbkRpclBhdGgsIHtcbiAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgZm9yY2U6IHRydWUsXG4gICAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIGV4cG9zZXMgaW5zdGFsbGVkIHBhY2thZ2VzIHRocm91Z2ggc3ltbGlua3M7IHRoZSBtYXRlcmlhbGl6ZWQgdHJlZVxuICAgIC8vIG11c3QgY29udGFpbiByZWFsIGZpbGVzIChhIGNvcGllZCBhYnNvbHV0ZSBzeW1saW5rIHdvdWxkIGRhbmdsZSBpbnNpZGUgdGhlIERvY2tlciBpbWFnZSxcbiAgICAvLyBhbmQgbGF0ZXIgZGVwZW5kZW5jeSByZXdyaXRpbmcgd291bGQgd3JpdGUgdGhyb3VnaCBpdCBpbnRvIHRoZSBzaGFyZWQgc3RvcmUpLlxuICAgIGRlcmVmZXJlbmNlOiB0cnVlLFxuICAgIGZpbHRlcjogKHNyYykgPT4ge1xuICAgICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnJlbGF0aXZlKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGghLCBzcmMpLnNwbGl0KHBhdGguc2VwKTtcbiAgICAgIGlmIChzZWdtZW50cy5pbmNsdWRlcygnLmdpdCcpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBub2RlTW9kdWxlc0luZGV4ID0gc2VnbWVudHMuaW5kZXhPZignbm9kZV9tb2R1bGVzJyk7XG4gICAgICBpZiAobm9kZU1vZHVsZXNJbmRleCA9PT0gLTEpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGJ1bmRsZWREZXBlbmRlbmN5TmFtZXMgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGJ1bmRsZWREZXBlbmRlbmN5TmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBUaGUgbm9kZV9tb2R1bGVzIChhbmQgQHNjb3BlKSBkaXJlY3RvcmllcyB0aGVtc2VsdmVzIG11c3QgY29weSBzbyBidW5kbGVkIHN1YnRyZWVzIGNhbjtcbiAgICAgIC8vIG9ubHkgdGhlIGZpcnN0IG5vZGVfbW9kdWxlcyBsZXZlbCBmaWx0ZXJzIOKAlCBhbnl0aGluZyBpbnNpZGUgYSBidW5kbGVkIHN1YnRyZWUgYmVsb25ncyB0b1xuICAgICAgLy8gdGhlIGFydGlmYWN0LCBpbmNsdWRpbmcgaXRzIG93biBuZXN0ZWQgbm9kZV9tb2R1bGVzLlxuICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gc2VnbWVudHMuc2xpY2Uobm9kZU1vZHVsZXNJbmRleCArIDEpO1xuICAgICAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGZpcnN0LnN0YXJ0c1dpdGgoJ0AnKSAmJiBzZWNvbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYnVuZGxlZERlcGVuZGVuY3lOYW1lcy5zb21lKChuYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgoYCR7Zmlyc3R9L2ApKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gZmlyc3Quc3RhcnRzV2l0aCgnQCcpID8gYCR7Zmlyc3R9LyR7c2Vjb25kfWAgOiBmaXJzdDtcbiAgICAgIHJldHVybiBidW5kbGVkRGVwZW5kZW5jeU5hbWVzLmluY2x1ZGVzKHBhY2thZ2VOYW1lKTtcbiAgICB9LFxuICB9KTtcbiAgY29uc29sZS5pbmZvKGBDb3BpZWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfSB0byAke3BhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpfWApO1xufVxuXG4vKiogRGVjbGFyZWQgYnVuZGxlZCBkZXBlbmRlbmN5IG5hbWVzIG9mIHRoZSBpbnN0YWxsZWQgcGFja2FnZTsgYHRydWVgIGJ1bmRsZXMgZXZlcnkgZGVwZW5kZW5jeS4gKi9cbmZ1bmN0aW9uIHJlYWRCdW5kbGVkRGVwZW5kZW5jeU5hbWVzKHNvdXJjZURpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHwgdHJ1ZSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgICBidW5kbGVEZXBlbmRlbmNpZXM/OiBzdHJpbmdbXSB8IGJvb2xlYW47XG4gICAgICBidW5kbGVkRGVwZW5kZW5jaWVzPzogc3RyaW5nW10gfCBib29sZWFuO1xuICAgIH07XG4gICAgY29uc3QgYnVuZGxlZCA9IHBhY2thZ2VKc29uLmJ1bmRsZURlcGVuZGVuY2llcyA/PyBwYWNrYWdlSnNvbi5idW5kbGVkRGVwZW5kZW5jaWVzO1xuICAgIGlmIChidW5kbGVkID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShidW5kbGVkKSA/IGJ1bmRsZWQuZmlsdGVyKChuYW1lKSA9PiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIDogW107XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBtYXRlcmlhbGl6YXRpb24gZm9yIGBleGlzdGluZ2AgaXMgYWxyZWFkeSBzZWxlY3RlZCAoYSByYW5nZSByZXNvbHZlcyBtYXgtc2F0aXNmeWluZyBhZ2FpbnN0XG4gKiB0aGUgcmVnaXN0cnkg4oCUIHNlZSBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UpLCBzbyBhY2NlcHQgYHJlcXVlc3RlZGAgb25seSB3aGVuIGl0IGlzXG4gKiBndWFyYW50ZWVkIHNhdGlzZmllZDogYGV4aXN0aW5nYCBtdXN0IGJlIGEgc3Vic2V0IG9mIGl0IChldmVyeSBwb3NzaWJsZSByZXNvbHV0aW9uIG9mIGBleGlzdGluZ2BcbiAqIHRoZW4gc2F0aXNmaWVzIGByZXF1ZXN0ZWRgKS4gTm9uLXJhbmdlIHNwZWNpZmllcnMgKGRpc3QtdGFncywgZ2l0IFVSTHMvcmV2aXNpb25zKSBtdXN0IG1hdGNoXG4gKiBleGFjdGx5LlxuICovXG5mdW5jdGlvbiBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZzogUHJpdmF0ZVBhY2thZ2UsIHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2UsIGRlcGVuZGVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXhpc3Rpbmcua2luZCA9PT0gcmVxdWVzdGVkLmtpbmQpIHtcbiAgICBpZiAoZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA9PT0gcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIpIHJldHVybjtcbiAgICBpZiAoc3BlY2lmaWVyU3Vic2V0KGV4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIsIHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyKSkgcmV0dXJuO1xuICAgIC8vIE9uY2UgdGhlIGNvbmNyZXRlIG1hdGVyaWFsaXplZCB2ZXJzaW9uIGlzIGtub3duIChpbnN0YWxsZWQgY29weSBvciBleHRyYWN0ZWQgZG93bmxvYWQpLCBhXG4gICAgLy8gcmVxdWlyZW1lbnQgaXQgc2F0aXNmaWVzIGlzIGNvbXBhdGlibGUgZXZlbiB3aGVuIHRoZSBvcmlnaW5hbCBzcGVjaWZpZXJzIGFyZSBub3Qgc3Vic2V0c1xuICAgIC8vIChlLmcuIGBeMS4wLjBgIHJlc29sdmVkIHRvIDEuMi4zIGFsc28gc2F0aXNmaWVzIGEgbGF0ZXIgZXhhY3QgYDEuMi4zYCkuXG4gICAgaWYgKFxuICAgICAgZXhpc3RpbmcucmVzb2x2ZWRWZXJzaW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGluc3RhbGxlZFZlcnNpb25TYXRpc2ZpZXMocmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIsIGV4aXN0aW5nLnJlc29sdmVkVmVyc2lvbilcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYENvbmZsaWN0aW5nIHJlcXVpcmVtZW50cyBmb3IgJHtleGlzdGluZy5uYW1lfTogYCArXG4gICAgICBgJHtleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID8/IGV4aXN0aW5nLmtpbmR9IGlzIGFscmVhZHkgc2VsZWN0ZWQsIGJ1dCAke2RlcGVuZGVudE5hbWV9IHJlcXVpcmVzIGAgK1xuICAgICAgYCR7cmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIgPz8gcmVxdWVzdGVkLmtpbmR9LiBPbmx5IGEgc2luZ2xlIHZlcnNpb24gcGVyIHByaXZhdGUgcGFja2FnZSBpcyBzdXBwb3J0ZWQuYFxuICApO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHN5bWxpbmtzIGluIHRoZSBkZWVwZXN0IEVYSVNUSU5HIGFuY2VzdG9yIG9mIHRoZSBwYXRoIGFuZCByZWF0dGFjaGVzIHRoZSBub3QteWV0XG4gKiBleGlzdGluZyByZW1haW5kZXIsIHNvIGxleGljYWwgY29udGFpbm1lbnQvb3ZlcmxhcCBjaGVja3Mgb3BlcmF0ZSBvbiBwaHlzaWNhbCBsb2NhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZVBhdGgodGFyZ2V0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGV4aXN0aW5nUGF0aCA9IHBhdGgucmVzb2x2ZSh0YXJnZXRQYXRoKTtcbiAgY29uc3QgcmVtYWluZGVyU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhleGlzdGluZ1BhdGgpKSB7XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShleGlzdGluZ1BhdGgpO1xuICAgIGlmIChwYXJlbnRQYXRoID09PSBleGlzdGluZ1BhdGgpIGJyZWFrO1xuICAgIHJlbWFpbmRlclNlZ21lbnRzLnVuc2hpZnQocGF0aC5iYXNlbmFtZShleGlzdGluZ1BhdGgpKTtcbiAgICBleGlzdGluZ1BhdGggPSBwYXJlbnRQYXRoO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihmcy5yZWFscGF0aFN5bmMoZXhpc3RpbmdQYXRoKSwgLi4ucmVtYWluZGVyU2VnbWVudHMpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRhcmdldFBhdGgpO1xuICB9XG59XG5cbi8qKiBXaGV0aGVyIHRoZSB0d28gcGF0aHMgYXJlIGVxdWFsIG9yIG9uZSBjb250YWlucyB0aGUgb3RoZXIuICovXG5mdW5jdGlvbiBwYXRoc092ZXJsYXAoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzRXF1YWxPckFuY2VzdG9yUGF0aChhLCBiKSB8fCBpc0VxdWFsT3JBbmNlc3RvclBhdGgoYiwgYSk7XG59XG5cbmZ1bmN0aW9uIGlzRXF1YWxPckFuY2VzdG9yUGF0aChhbmNlc3RvclBhdGg6IHN0cmluZywgZGVzY2VuZGFudFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGFuY2VzdG9yUGF0aCwgZGVzY2VuZGFudFBhdGgpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoID09PSAnJyB8fCAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFN1YmRpcmVjdG9yeShyb290RGlyUGF0aDogc3RyaW5nLCBvdXREaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgb3V0RGlyUGF0aCk7XG4gIGlmIChyZWxhdGl2ZVBhdGggJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKSkgcmV0dXJuO1xuXG4gIHRocm93IG5ldyBFcnJvcihgT3V0cHV0IGRpcmVjdG9yeSBtdXN0IGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0IHJvb3Q6ICR7b3V0RGlyUGF0aH1gKTtcbn1cblxuZnVuY3Rpb24gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVuc2NvcGVkTmFtZSA9IHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7XG4gIC8vIHJlYWxwYXRoU3luYyByZXNvbHZlcyB0aGUgaXNvbGF0ZWQgbGlua2VyJ3Mgc3ltbGluayBzbyBjb3BpZXMgcmVhZCAoYW5kIHRoZSBjb3B5IGZpbHRlclxuICAvLyBjb21wdXRlcyByZWxhdGl2ZSBwYXRocyBhZ2FpbnN0KSB0aGUgYWN0dWFsIHBhY2thZ2UgZGlyZWN0b3J5LlxuICBjb25zdCBkaXJlY3REaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJ0B3aWxsYm9vc3RlcicsIHVuc2NvcGVkTmFtZSk7XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJlY3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcmV0dXJuIGZzLnJlYWxwYXRoU3luYyhkaXJlY3REaXJQYXRoKTtcbiAgfVxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIga2VlcHMgdHJhbnNpdGl2ZS1vbmx5IGRlcGVuZGVuY2llcyBvdXQgb2YgdGhlIHJvb3Qgbm9kZV9tb2R1bGVzO1xuICAvLyBzZWFyY2ggdGhlIC5idW4gc3RvcmUgZm9yIHRoZSBwYWNrYWdlIGJlZm9yZSBnaXZpbmcgdXAuIFRoZSBzdG9yZSBtYXkgbGVnaXRpbWF0ZWx5IGhvbGRcbiAgLy8gTVVMVElQTEUgcmVzb2x1dGlvbnMgb2Ygb25lIHBhY2thZ2UgKGRpZmZlcmVudCB2ZXJzaW9ucy9yZXZpc2lvbnMpLCBhbmQgcGlja2luZyBhbiBhcmJpdHJhcnlcbiAgLy8gb25lIGNvdWxkIHNpbGVudGx5IG1hdGVyaWFsaXplIHRoZSB3cm9uZyBjb250ZW50IOKAlCBzbyBhbWJpZ3VpdHkgZmFpbHMgbG91ZGx5LlxuICBjb25zdCBidW5TdG9yZURpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJ1bicpO1xuICBjb25zdCBjYW5kaWRhdGVEaXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGZzLnJlYWRkaXJTeW5jKGJ1blN0b3JlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVEaXJQYXRoID0gcGF0aC5qb2luKGJ1blN0b3JlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdub2RlX21vZHVsZXMnLCAnQHdpbGxib29zdGVyJywgdW5zY29wZWROYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjYW5kaWRhdGVEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgIGNhbmRpZGF0ZURpclBhdGhzLmFkZChmcy5yZWFscGF0aFN5bmMoY2FuZGlkYXRlRGlyUGF0aCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gLmJ1biBzdG9yZSAoaG9pc3RlZCBpbnN0YWxsKTsgZmFsbCB0aHJvdWdoIHRvIHRoZSBlcnJvciBiZWxvdy5cbiAgfVxuICBpZiAoY2FuZGlkYXRlRGlyUGF0aHMuc2l6ZSA9PT0gMSkgcmV0dXJuIFsuLi5jYW5kaWRhdGVEaXJQYXRoc11bMF0hO1xuICBpZiAoY2FuZGlkYXRlRGlyUGF0aHMuc2l6ZSA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTXVsdGlwbGUgaW5zdGFsbGVkIHJlc29sdXRpb25zIGZvdW5kIGZvciAke3BhY2thZ2VOYW1lfTogJHtbLi4uY2FuZGlkYXRlRGlyUGF0aHNdLmpvaW4oJywgJyl9LiBgICtcbiAgICAgICAgJ0RlZHVwbGljYXRlIHRoZSBkZXBlbmRlbmN5IHNvIGEgc2luZ2xlIHJlc29sdXRpb24gcmVtYWlucy4nXG4gICAgKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFByaXZhdGUgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkOiAke3BhY2thZ2VOYW1lfSAoJHtkaXJlY3REaXJQYXRofSlgKTtcbn1cblxuLyoqXG4gKiBUaGUgaW5zdGFsbGVkIG1hdGVyaWFsaXphdGlvbiBvZiBhIHJlZ2lzdHJ5IHBhY2thZ2UsIHdoZW4gaXRzIHZlcnNpb24gaXMgc3RhdGljYWxseSBrbm93biB0b1xuICogc2F0aXNmeSB0aGUgc3BlY2lmaWVyIOKAlCBzdGVwcyB3aXRob3V0IHJlZ2lzdHJ5IGNyZWRlbnRpYWxzIChlLmcuIENJIHRlc3Qgc3RlcHMsIHdoaWNoXG4gKiBkZWxpYmVyYXRlbHkgcmVjZWl2ZSBubyBWZXJkYWNjaW8gdG9rZW4pIHJldXNlIGl0IGluc3RlYWQgb2YgZG93bmxvYWRpbmcuIFJldHVybnMgdW5kZWZpbmVkXG4gKiAoZmFsbGluZyBiYWNrIHRvIGEgZG93bmxvYWQpIHdoZW4gbm8gdW5hbWJpZ3VvdXNseSBjb3JyZWN0IGluc3RhbGxlZCBjb3B5IGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gZmluZEluc3RhbGxlZFJlZ2lzdHJ5UGFja2FnZShcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcHJpdmF0ZVBhY2thZ2U6IFByaXZhdGVQYWNrYWdlXG4pOiB7IGRpclBhdGg6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBzcGVjaWZpZXIgPSBwcml2YXRlUGFja2FnZS52ZXJzaW9uU3BlY2lmaWVyID8/ICdsYXRlc3QnO1xuICBjb25zdCByZWxhdGl2ZURpclBhdGggPSBwYXRoLmpvaW4oJ25vZGVfbW9kdWxlcycsIC4uLnByaXZhdGVQYWNrYWdlLm5hbWUuc3BsaXQoJy8nKSk7XG4gIGNvbnN0IGFkZENhbmRpZGF0ZSA9IChjYW5kaWRhdGVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+LCBkaXJQYXRoOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmVhZEluc3RhbGxlZFZlcnNpb24oZGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UubmFtZSk7XG4gICAgaWYgKHZlcnNpb24gJiYgaW5zdGFsbGVkVmVyc2lvblNhdGlzZmllcyhzcGVjaWZpZXIsIHZlcnNpb24pKSBjYW5kaWRhdGVzLnNldChmcy5yZWFscGF0aFN5bmMoZGlyUGF0aCksIHZlcnNpb24pO1xuICB9O1xuICAvLyBBIHJvb3QtbGV2ZWwgaW5zdGFsbGF0aW9uIGlzIFRIRSBsb2NrZmlsZSByZXNvbHV0aW9uIGZvciB0aGUgcm9vdCBkZXBlbmRlbmN5OyB0aGUgLmJ1biBzdG9yZVxuICAvLyBpcyBjb25zdWx0ZWQgb25seSBmb3IgdHJhbnNpdGl2ZS1vbmx5IHBhY2thZ2VzLCB3aGVyZSBtdWx0aXBsZSBzYXRpc2Z5aW5nIHJlc29sdXRpb25zIG1heVxuICAvLyBjb2V4aXN0IGFuZCBwaWNraW5nIG9uZSBhcmJpdHJhcmlseSBjb3VsZCBtYXRlcmlhbGl6ZSB0aGUgd3JvbmcgY29udGVudC5cbiAgY29uc3QgZGlyZWN0Q2FuZGlkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGFkZENhbmRpZGF0ZShkaXJlY3RDYW5kaWRhdGVzLCBwYXRoLmpvaW4ocm9vdERpclBhdGgsIHJlbGF0aXZlRGlyUGF0aCkpO1xuICBpZiAoZGlyZWN0Q2FuZGlkYXRlcy5zaXplID09PSAxKSByZXR1cm4gdG9TaW5nbGVDYW5kaWRhdGUoZGlyZWN0Q2FuZGlkYXRlcyk7XG5cbiAgY29uc3Qgc3RvcmVDYW5kaWRhdGVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBmcy5yZWFkZGlyU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJ1bicpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAgIGFkZENhbmRpZGF0ZShzdG9yZUNhbmRpZGF0ZXMsIHBhdGguam9pbihyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYnVuJywgZGlyZW50Lm5hbWUsIHJlbGF0aXZlRGlyUGF0aCkpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gLmJ1biBzdG9yZSAoaG9pc3RlZCBpbnN0YWxsKTsgZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nLlxuICB9XG4gIHJldHVybiB0b1NpbmdsZUNhbmRpZGF0ZShzdG9yZUNhbmRpZGF0ZXMpO1xufVxuXG5mdW5jdGlvbiB0b1NpbmdsZUNhbmRpZGF0ZShjYW5kaWRhdGVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogeyBkaXJQYXRoOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgW2VudHJ5XSA9IGNhbmRpZGF0ZXM7XG4gIHJldHVybiBjYW5kaWRhdGVzLnNpemUgPT09IDEgJiYgZW50cnkgPyB7IGRpclBhdGg6IGVudHJ5WzBdLCB2ZXJzaW9uOiBlbnRyeVsxXSB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZWFkSW5zdGFsbGVkVmVyc2lvbihkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm5hbWUgPT09IHBhY2thZ2VOYW1lICYmIHR5cGVvZiBwYWNrYWdlSnNvbi52ZXJzaW9uID09PSAnc3RyaW5nJ1xuICAgICAgPyBwYWNrYWdlSnNvbi52ZXJzaW9uXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIHJlZ2lzdHJ5T3V0RGlyUGF0aDogc3RyaW5nXG4pOiBQcml2YXRlUGFja2FnZVtdIHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPigpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5S2V5cykge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uW2tleV07XG4gICAgaWYgKCFkZXBlbmRlbmNpZXMpIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcGVuZGVuY2llcykpIHtcbiAgICAgIGNvbnN0IGlzR2l0ID0gaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZSk7XG4gICAgICBpZiAoIWlzR2l0ICYmICFpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGlmIChpc0dpdCAmJiAhbmFtZS5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcml2YXRlIGdpdCBkZXBlbmRlbmN5IG11c3QgYmUgYW4gQHdpbGxib29zdGVyIHBhY2thZ2U6ICR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVuc2NvcGVkTmFtZSA9IHRvVW5zY29wZWRQYWNrYWdlTmFtZShuYW1lKTtcbiAgICAgIC8vIERlcGVuZGVuY3kgbmFtZXMgYmVjb21lIGV4dGVybmFsIGRhdGEgb25jZSBuZXN0ZWQgbWFuaWZlc3RzIGNvbWUgZnJvbSBkb3dubG9hZGVkXG4gICAgICAvLyB0YXJiYWxsczsgcmVqZWN0IGFueXRoaW5nIChwYXRoIHNlcGFyYXRvcnMsIGAuLmAsIGhpZGRlbi1maWxlIHByZWZpeGVzKSB0aGF0IGNvdWxkXG4gICAgICAvLyBlc2NhcGUgdGhlIG91dHB1dCBkaXJlY3RvcnkgdGhlIG5hbWUgaXMgam9pbmVkIGludG8gYmVmb3JlIGl0IGlzIHJlY3Vyc2l2ZWx5IGRlbGV0ZWQuXG4gICAgICBpZiAoIS9eW1xcdy4tXSskLy50ZXN0KHVuc2NvcGVkTmFtZSkgfHwgdW5zY29wZWROYW1lLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJpdmF0ZSBwYWNrYWdlIG5hbWU6ICR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2UgPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGtpbmQ6IGlzR2l0ID8gJ2dpdCcgOiAncmVnaXN0cnknLFxuICAgICAgICBzb3VyY2VEaXJQYXRoOiB1bmRlZmluZWQsXG4gICAgICAgIHJlc29sdmVkVmVyc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICB0YXJnZXREaXJQYXRoOiBwYXRoLmpvaW4oaXNHaXQgPyBvdXREaXJQYXRoIDogcmVnaXN0cnlPdXREaXJQYXRoLCB1bnNjb3BlZE5hbWUpLFxuICAgICAgICAvLyBUaGUgZnVsbCBnaXQgc3BlY2lmaWVyIGlzIHByZXNlcnZlZCBzbyBkaXZlcmdlbnQgVVJMcy9yZXZpc2lvbnMgKCNhYmMgdnMgI2RlZikgYXJlXG4gICAgICAgIC8vIGRldGVjdGVkIGFzIGNvbmZsaWN0cyBpbnN0ZWFkIG9mIHNpbGVudGx5IGNvbGxhcHNpbmcgaW50byBvbmUgY29waWVkIHBhY2thZ2UuXG4gICAgICAgIHZlcnNpb25TcGVjaWZpZXI6IHZhbHVlIGFzIHN0cmluZyxcbiAgICAgIH07XG4gICAgICBjb25zdCBleGlzdGluZyA9IHByaXZhdGVQYWNrYWdlcy5nZXQobmFtZSk7XG4gICAgICBwcml2YXRlUGFja2FnZXMuc2V0KG5hbWUsIGV4aXN0aW5nID8gbWVyZ2VTYW1lTWFuaWZlc3RSZXF1aXJlbWVudChleGlzdGluZywgcmVxdWVzdGVkKSA6IHJlcXVlc3RlZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXTtcbn1cblxuLyoqXG4gKiBBIG1hbmlmZXN0IG1heSBsZWdpdGltYXRlbHkgcmVxdWVzdCBvbmUgcGFja2FnZSBmcm9tIHNldmVyYWwgZGVwZW5kZW5jeSBzZWN0aW9ucyAoZS5nLiBhbiBleGFjdFxuICogZGV2RGVwZW5kZW5jaWVzIHBpbiBhbG9uZ3NpZGUgYSBwZWVyRGVwZW5kZW5jaWVzIHJhbmdlKS4gS2VlcCB0aGUgTkFSUk9XRVIgcmVxdWlyZW1lbnQg4oCUIGl0c1xuICogbWF4LXNhdGlzZnlpbmcgcmVzb2x1dGlvbiBzYXRpc2ZpZXMgdGhlIHdpZGVyIG9uZSBieSBkZWZpbml0aW9uIChhbiBleGFjdCBwaW4gaXMgdGhlIG5hcnJvd2VzdFxuICogcmFuZ2UpIOKAlCBhbmQgZmFpbCBsb3VkbHkgd2hlbiB0aGUgcmVxdWlyZW1lbnRzIGdlbnVpbmVseSBkaXZlcmdlLlxuICovXG5mdW5jdGlvbiBtZXJnZVNhbWVNYW5pZmVzdFJlcXVpcmVtZW50KGV4aXN0aW5nOiBQcml2YXRlUGFja2FnZSwgcmVxdWVzdGVkOiBQcml2YXRlUGFja2FnZSk6IFByaXZhdGVQYWNrYWdlIHtcbiAgY29uc3QgbmFycm93ZXIgPSBuYXJyb3dlckNvbXBhdGlibGVSZXF1aXJlbWVudChleGlzdGluZywgcmVxdWVzdGVkKTtcbiAgaWYgKG5hcnJvd2VyKSByZXR1cm4gbmFycm93ZXI7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgQ29uZmxpY3RpbmcgcmVxdWlyZW1lbnRzIGZvciAke2V4aXN0aW5nLm5hbWV9IHdpdGhpbiBvbmUgbWFuaWZlc3Q6IGAgK1xuICAgICAgYCR7ZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA/PyBleGlzdGluZy5raW5kfSB2cyAke3JlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyID8/IHJlcXVlc3RlZC5raW5kfS5gXG4gICk7XG59XG5cbi8qKlxuICogVGhlIHJlcXVpcmVtZW50IHdob3NlIG1heC1zYXRpc2Z5aW5nIHJlc29sdXRpb24gaXMgZ3VhcmFudGVlZCB0byBzYXRpc2Z5IHRoZSBvdGhlciAoYW4gZXhhY3RcbiAqIHBpbiBpcyB0aGUgbmFycm93ZXN0IHJhbmdlKSwgb3IgdW5kZWZpbmVkIHdoZW4gbmVpdGhlciBzdWJzdW1lcyB0aGUgb3RoZXIuXG4gKi9cbmZ1bmN0aW9uIG5hcnJvd2VyQ29tcGF0aWJsZVJlcXVpcmVtZW50KFxuICBleGlzdGluZzogUHJpdmF0ZVBhY2thZ2UsXG4gIHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2Vcbik6IFByaXZhdGVQYWNrYWdlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGV4aXN0aW5nLmtpbmQgIT09IHJlcXVlc3RlZC5raW5kKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA9PT0gcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIpIHJldHVybiBleGlzdGluZztcbiAgaWYgKHNwZWNpZmllclN1YnNldChleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyLCByZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllcikpIHJldHVybiBleGlzdGluZztcbiAgaWYgKHNwZWNpZmllclN1YnNldChyZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllciwgZXhpc3RpbmcudmVyc2lvblNwZWNpZmllcikpIHJldHVybiByZXF1ZXN0ZWQ7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VQcml2YXRlRGVwZW5kZW5jaWVzKFxuICBzdGFnaW5nUm9vdERpclBhdGg6IHN0cmluZyxcbiAgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4sXG4gIHRvU3RhZ2VkUGF0aDogKHRhcmdldERpclBhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiBwcml2YXRlUGFja2FnZXMudmFsdWVzKCkpIHtcbiAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBhd2FpdCBmaW5kUGFja2FnZUpzb25QYXRocyh0b1N0YWdlZFBhdGgocHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCkpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgaWYgKCFyZXBsYWNlUGFja2FnZUpzb25EZXBlbmRlbmNpZXMocGFja2FnZUpzb25QYXRoLCBwYWNrYWdlSnNvbiwgcHJpdmF0ZVBhY2thZ2VzLCB0b1N0YWdlZFBhdGgpKSBjb250aW51ZTtcblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhY2thZ2VKc29uUGF0aCwgYCR7SlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIHVuZGVmaW5lZCwgMil9XFxuYCwgJ3V0ZjgnKTtcbiAgICAgIC8vIFN0YWdpbmcgbWlycm9ycyB0aGUgcm9vdC1yZWxhdGl2ZSBsYXlvdXQsIHNvIHRoaXMgaXMgdGhlIG1hbmlmZXN0J3MgcG9zdC1zd2FwIGxvY2F0aW9uLlxuICAgICAgY29uc29sZS5pbmZvKGBSZXdyb3RlIHByaXZhdGUgZGVwZW5kZW5jaWVzIGluICR7cGF0aC5yZWxhdGl2ZShzdGFnaW5nUm9vdERpclBhdGgsIHBhY2thZ2VKc29uUGF0aCl9YCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25QYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4sXG4gIHRvU3RhZ2VkUGF0aDogKHRhcmdldERpclBhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeUtleXMpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIGlmICghZGVwZW5kZW5jaWVzKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICBpZiAoIWlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWUpICYmICFpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHRhcmdldFBhY2thZ2UgPSBwcml2YXRlUGFja2FnZXMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKCF0YXJnZXRQYWNrYWdlKSBjb250aW51ZTtcblxuICAgICAgLy8gQm90aCBzaWRlcyBhcmUgc3RhZ2VkIHBhdGhzOiBzdGFnaW5nIG1pcnJvcnMgdGhlIHJvb3QtcmVsYXRpdmUgbGF5b3V0LCBzbyB0aGUgcmVsYXRpdmVcbiAgICAgIC8vIHNwZWNpZmllciBpcyBpZGVudGljYWwgdG8gdGhlIG9uZSB0aGUgZmluYWwgbG9jYXRpb25zIHdvdWxkIHByb2R1Y2UuXG4gICAgICBkZXBlbmRlbmNpZXNbbmFtZV0gPVxuICAgICAgICBgZmlsZToke3BhdGgucmVsYXRpdmUocGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCksIHRvU3RhZ2VkUGF0aCh0YXJnZXRQYWNrYWdlLnRhcmdldERpclBhdGgpKX1gO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VkO1xufVxuXG4vKipcbiAqIE1vdmUgZXZlcnkgc3RhZ2VkIHRyZWUgb250byBpdHMgZmluYWwgbG9jYXRpb24gYXMgb25lIHRyYW5zYWN0aW9uOiBlYWNoIGxpdmUgdHJlZSBpcyBzZXQgYXNpZGVcbiAqIGZpcnN0IHNvIGEgZmFpbGluZyByZW5hbWUgY2FuIHJlc3RvcmUgdGhlIHByZXZpb3VzIHN0YXRlIGluc3RlYWQgb2YgbGVhdmluZyBvbmUgdHJlZSByZXBsYWNlZFxuICogYW5kIHRoZSBvdGhlciBzdGFsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN3YXBNYXRlcmlhbGl6ZWRUcmVlcyhcbiAgb3V0RGlyUGF0aHM6IHN0cmluZ1tdLFxuICB0b1N0YWdlZFBhdGg6ICh0YXJnZXREaXJQYXRoOiBzdHJpbmcpID0+IHN0cmluZyxcbiAgYmFja3VwUm9vdERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEEgVU5JUVVFIGRpcmVjdG9yeSBwZXIgaW52b2NhdGlvbjogd2hlbiBhIHJvbGxiYWNrIGZhaWxzIGl0cyBiYWNrdXAgaXMgcmV0YWluZWQgZm9yIG1hbnVhbFxuICAvLyByZWNvdmVyeSwgYW5kIGEgZml4ZWQgcGF0aCB3b3VsZCBsZXQgdGhlIG5leHQgcnVuIGRlbGV0ZSB0aGUgb25seSByZW1haW5pbmcgY29weS5cbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGJhY2t1cFJvb3REaXJQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGJhY2t1cERpclJvb3QgPSBhd2FpdCBmcy5wcm9taXNlcy5ta2R0ZW1wKGAke2JhY2t1cFJvb3REaXJQYXRofS1gKTtcbiAgLy8gUmVjb3JkZWQgQkVGT1JFIHRoZSBzdGFnZWQgdHJlZSBpcyByZW5hbWVkIGluOiBiZXR3ZWVuIHNldHRpbmcgdGhlIGxpdmUgdHJlZSBhc2lkZSBhbmRcbiAgLy8gaW5zdGFsbGluZyBpdHMgcmVwbGFjZW1lbnQgdGhlIHByZXZpb3VzIG1hdGVyaWFsaXphdGlvbiBleGlzdHMgb25seSBpbiB0aGUgYmFja3VwLCBhbmQgYSByZWNvcmRcbiAgLy8gYWRkZWQgYWZ0ZXIgdGhlIHJlbmFtZSB3b3VsZCBsZWF2ZSB0aGF0IHdpbmRvdyB1bnJlY292ZXJhYmxlLlxuICBjb25zdCBzd2FwcGVkRGlyczogeyBvdXREaXJQYXRoOiBzdHJpbmc7IGJhY2t1cERpclBhdGg6IHN0cmluZzsgaGFkUHJldmlvdXNUcmVlOiBib29sZWFuIH1bXSA9IFtdO1xuICBsZXQgcmVzdG9yZUZhaWxlZCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgW2luZGV4LCBvdXREaXJQYXRoXSBvZiBvdXREaXJQYXRocy5lbnRyaWVzKCkpIHtcbiAgICAgIC8vIEluZGV4ZWQgKG5vdCBuYW1lZCBhZnRlciB0aGUgZGlyZWN0b3J5KSBzbyB0d28gb3V0cHV0IHRyZWVzIHNoYXJpbmcgYSBiYXNlbmFtZSBjYW5ub3RcbiAgICAgIC8vIG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgYmFja3VwLlxuICAgICAgY29uc3QgYmFja3VwRGlyUGF0aCA9IHBhdGguam9pbihiYWNrdXBEaXJSb290LCBTdHJpbmcoaW5kZXgpKTtcbiAgICAgIGNvbnN0IGhhZFByZXZpb3VzVHJlZSA9IGZzLmV4aXN0c1N5bmMob3V0RGlyUGF0aCk7XG4gICAgICBpZiAoaGFkUHJldmlvdXNUcmVlKSBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob3V0RGlyUGF0aCwgYmFja3VwRGlyUGF0aCk7XG4gICAgICBzd2FwcGVkRGlycy5wdXNoKHsgb3V0RGlyUGF0aCwgYmFja3VwRGlyUGF0aCwgaGFkUHJldmlvdXNUcmVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKG91dERpclBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZSh0b1N0YWdlZFBhdGgob3V0RGlyUGF0aCksIG91dERpclBhdGgpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBSZXZlcnNlIG9yZGVyOiB1bmRvIHRoZSBtb3N0IHJlY2VudCBzd2FwIGZpcnN0LlxuICAgIGZvciAoY29uc3Qgc3dhcHBlZCBvZiBzd2FwcGVkRGlycy50b1JldmVyc2VkKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHN3YXBwZWQub3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICBpZiAoc3dhcHBlZC5oYWRQcmV2aW91c1RyZWUpIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShzd2FwcGVkLmJhY2t1cERpclBhdGgsIHN3YXBwZWQub3V0RGlyUGF0aCk7XG4gICAgICB9IGNhdGNoIChyb2xsYmFja0Vycm9yKSB7XG4gICAgICAgIC8vIFJlcG9ydGluZyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBtYXR0ZXJzIG1vcmUsIGJ1dCBhIGZhaWxlZCByb2xsYmFjayBsZWF2ZXMgdGhlIHRyZWVcbiAgICAgICAgLy8gbWlzc2luZywgc28gaXQgbXVzdCBub3QgcGFzcyBzaWxlbnRseSDigJQgYW5kIGl0cyBiYWNrdXAgaXMgdGhlbiB0aGUgT05MWSByZW1haW5pbmcgY29weS5cbiAgICAgICAgcmVzdG9yZUZhaWxlZCA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZXN0b3JlICR7c3dhcHBlZC5vdXREaXJQYXRofTogJHtTdHJpbmcocm9sbGJhY2tFcnJvcil9XFxuYCArXG4gICAgICAgICAgICAgIGBUaGUgcHJldmlvdXMgbWF0ZXJpYWxpemF0aW9uIGlzIGtlcHQgYXQgJHtzd2FwcGVkLmJhY2t1cERpclBhdGh9OyBtb3ZlIGl0IGJhY2sgYnkgaGFuZC5gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBPbmx5IHdoZW4gbm90aGluZyBpcyBsZWZ0IHRvIHJlY292ZXI6IGRlbGV0aW5nIHRoZSBiYWNrdXBzIGFmdGVyIGEgZmFpbGVkIHJlc3RvcmUgd291bGRcbiAgICAvLyBkZXN0cm95IHRoZSBsYXN0IGNvcHkgb2YgdGhlIHByZXZpb3VzIG1hdGVyaWFsaXphdGlvbi4gQW5kIGJ5IHRoaXMgcG9pbnQgYm90aCB0cmVlcyBhcmVcbiAgICAvLyBhbHJlYWR5IGNvbW1pdHRlZCwgc28gYSBjbGVhbnVwIGZhaWx1cmUgKGUuZy4gYSByZWFkLW9ubHkgZGlyZWN0b3J5IGBmcy5jcGAgcHJlc2VydmVkKSBtdXN0XG4gICAgLy8gbm90IHR1cm4gYSBzdWNjZXNzZnVsIG1hdGVyaWFsaXphdGlvbiBpbnRvIGEgcmVwb3J0ZWQgZmFpbHVyZS5cbiAgICBpZiAoIXJlc3RvcmVGYWlsZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGJhY2t1cERpclJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KGBGYWlsZWQgdG8gcmVtb3ZlICR7YmFja3VwRGlyUm9vdH06ICR7U3RyaW5nKGNsZWFudXBFcnJvcil9YCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUGFja2FnZUpzb25QYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKGRpcmVudC5uYW1lID09PSAnbm9kZV9tb2R1bGVzJyB8fCBkaXJlbnQubmFtZSA9PT0gJy5naXQnKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBwYWNrYWdlSnNvblBhdGhzLnB1c2goLi4uKGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKGNoaWxkUGF0aCkpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lID09PSAncGFja2FnZS5qc29uJykge1xuICAgICAgcGFja2FnZUpzb25QYXRocy5wdXNoKGNoaWxkUGF0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYWNrYWdlSnNvblBhdGhzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoOiBzdHJpbmcpOiBQcm9taXNlPFBhY2thZ2VKc29uPiB7XG4gIHJldHVybiBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG59XG5cbmZ1bmN0aW9uIHByaW50RHJ5UnVuUmVzdWx0KG91dERpclBhdGg6IHN0cmluZywgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4pOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKGBbZHJ5LXJ1bl0gV291bGQgcmVjcmVhdGUgJHtvdXREaXJQYXRofWApO1xuICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIHByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKSkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGhcbiAgICAgICAgPyBgW2RyeS1ydW5dIFdvdWxkIGNvcHkgJHtwcml2YXRlUGFja2FnZS5uYW1lfTogJHtwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRofWBcbiAgICAgICAgOiBwcml2YXRlUGFja2FnZS5raW5kID09PSAnZ2l0J1xuICAgICAgICAgID8gYFtkcnktcnVuXSBXb3VsZCBjb3B5ICR7cHJpdmF0ZVBhY2thZ2UubmFtZX06IChpbnN0YWxsZWQgdW5kZXIgbm9kZV9tb2R1bGVzKWBcbiAgICAgICAgICA6IGBbZHJ5LXJ1bl0gV291bGQgZG93bmxvYWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfUAke3ByaXZhdGVQYWNrYWdlLnZlcnNpb25TcGVjaWZpZXJ9IHRvICR7cHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aH1gXG4gICAgKTtcbiAgfVxuICBjb25zb2xlLmluZm8oYFtkcnktcnVuXSBXb3VsZCByZXdyaXRlIGNvcGllZCBwcml2YXRlIGRlcGVuZGVuY2llcyB0byBmaWxlOi4uLzxuYW1lPmApO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQge1xuICBmaW5kRGVzY2VuZGFudFByb2plY3RzLFxuICBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgsXG4gIGdldEZpbGVEYXRhYmFzZVVybFBhdGgsXG4gIHR5cGUgUHJvamVjdCxcbn0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBpc0RvY2tlckVuYWJsZWQgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmltcG9ydCB7XG4gIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsXG4gIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3ksXG4gIGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeSxcbiAgbWF0ZXJpYWxpemVkVmVyc2lvblNhdGlzZmllcyxcbiAgdG9VbnNjb3BlZFBhY2thZ2VOYW1lLFxufSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5pbXBvcnQgeyBjb2xsZWN0TWFuaWZlc3RzLCBtYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlcyB9IGZyb20gJy4vc2V0dXBQcml2YXRlUGFja2FnZXMuanMnO1xuXG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuY29uc3Qgc3FsaXRlRmlsZVBhdHRlcm4gPSAvXFwuKD86c3FsaXRlMz98ZGIpKD86Wy0uXSg/OmpvdXJuYWx8c2htfHdhbCkpPyQvaTtcbmNvbnN0IGRvY2tlckJ1aWxkQ2FjaGVQYXRocyA9IFtcbiAgJy5jYWNoZScsXG4gICcubXlweV9jYWNoZScsXG4gICcubmV4dC9jYWNoZScsXG4gICcucGFyY2VsLWNhY2hlJyxcbiAgJy5weXRlc3RfY2FjaGUnLFxuICAnLnJ1ZmZfY2FjaGUnLFxuICAnLnRveCcsXG4gICcudHVyYm8nLFxuICAnLnZlbnYnLFxuICAnLnlhcm4vY2FjaGUnLFxuICAnLnlhcm4vaW5zdGFsbC1zdGF0ZS5neicsXG4gICdfX3B5Y2FjaGVfXycsXG4gICdjb3ZlcmFnZScsXG4gICdub2RlX21vZHVsZXMvLmNhY2hlJyxcbiAgJ3BsYXl3cmlnaHQtcmVwb3J0JyxcbiAgJ3N0b3J5Ym9vay1zdGF0aWMnLFxuICAndGFyZ2V0JyxcbiAgJ3Rlc3QtcmVzdWx0cycsXG5dO1xuY29uc3QgZG9ja2VyQnVpbGRDYWNoZVBhdHRlcm5zID0gWycqKi8qLnB5YycsICcqKi8qLnRzYnVpbGRpbmZvJywgJyoqL19fcHljYWNoZV9fJ107XG5jb25zdCBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcyA9IFsncHJpc21hJywgJ2RiJywgJ2RyaXp6bGUnXSBhcyBjb25zdDtcbmNvbnN0IGRvY2tlckdlbmVyYXRlZERhdGFEaXJQYXRocyA9IFsnL2RhdGEnXSBhcyBjb25zdDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBNYXRlcmlhbGl6ZSBwcml2YXRlIGRlcGVuZGVuY2llcyBvbiB0aGUgaG9zdCBmaXJzdCBzbyB0aGUgcGVyLXByb2plY3QgcmV3cml0ZSBiZWxvdyByZXNvbHZlc1xuICAgIC8vIHRoZW0gdG8gZmlsZTogcGF0aHMgYW5kIHRoZSBEb2NrZXIgYnVpbGQgbmVlZHMgbm8gcmVnaXN0cnkgY3JlZGVudGlhbHMuIE9ubHkgaW4gLS1vdXRzaWRlXG4gICAgLy8gbW9kZSAodGhlIGluLWltYWdlIHNlY29uZCBwYXNzIGhhcyBubyBub2RlX21vZHVsZXMvcmVnaXN0cnkgdG8gbWF0ZXJpYWxpemUgZnJvbSkgYW5kIG9ubHlcbiAgICAvLyB3aGVuIGEgcHJpdmF0ZSBkZXBlbmRlbmN5IGlzIGFjdHVhbGx5IGRlY2xhcmVkLCBzbyByZXBvcyB3aXRob3V0IG9uZSBhcmUgdW50b3VjaGVkIOKAlCBubyBlbXB0eVxuICAgIC8vIG91dHB1dCBkaXJlY3Rvcmllcywgbm8gc3B1cmlvdXMgXCJDT1BZXCIgaGludC4gRmFpbHVyZXMgYXJlIG5vbi1mYXRhbCBhbmQgbm9uLWRlc3RydWN0aXZlOlxuICAgIC8vIG1hdGVyaWFsaXplIHRocm93cyBiZWZvcmUgZGVsZXRpbmcgYW55IGV4aXN0aW5nIG91dHB1dCAoYW5kIGNsZWFucyB1cCBpdHMgc3RhZ2luZyBvbiBhIGZhaWxlZFxuICAgIC8vIGRvd25sb2FkKSwgc28gYSByZXBvIGxhY2tpbmcgcmVnaXN0cnkgY3JlZGVudGlhbHMga2VlcHMgYnVpbGRpbmcgZXhhY3RseSBhcyBiZWZvcmUsIHdpdGggdGhlXG4gICAgLy8gcGVyLXByb2plY3QgcmV3cml0ZSBiZWxvdyBlbWl0dGluZyB0aGUgZXhpc3RpbmcgXCJydW4gd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc1wiIGhpbnQuIFRoaXNcbiAgICAvLyBrZWVwcyB0aGUgc3RlcCBhIHB1cmUgY29udmVuaWVuY2UgdGhhdCBsZXRzIHJlcG9zaXRvcmllcyBkcm9wIHRoZSBleHBsaWNpdCBjb21tYW5kLlxuICAgIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgd29ya3NwYWNlIHNldCBmcm9tIHRoZSByZXBvc2l0b3J5IHJvb3Qgc28gYSBwcml2YXRlIGRlcGVuZGVuY3kgZGVjbGFyZWQgaW5cbiAgICAgIC8vIGFueSBzaWJsaW5nIHdvcmtzcGFjZSBpcyBtYXRlcmlhbGl6ZWQgZXZlbiB3aGVuIG9wdGltaXplIHJ1bnMgZnJvbSBhIHN1YnBhY2thZ2UgZGlyZWN0b3J5LlxuICAgICAgY29uc3Qgcm9vdFByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdHMucm9vdC5kaXJQYXRoKTtcbiAgICAgIGNvbnN0IG1hbmlmZXN0cyA9IGNvbGxlY3RNYW5pZmVzdHMocm9vdFByb2plY3RzID8/IHByb2plY3RzKTtcbiAgICAgIGlmIChtYW5pZmVzdHMuc29tZShkZWNsYXJlc1ByaXZhdGVEZXBlbmRlbmN5KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG1hdGVyaWFsaXplUHJpdmF0ZVBhY2thZ2VzKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgbWFuaWZlc3RzLCB7IGRyeVJ1bjogQm9vbGVhbihhcmd2LmRyeVJ1bikgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgQ291bGQgbm90IGF1dG8tbWF0ZXJpYWxpemUgcHJpdmF0ZSBwYWNrYWdlcyAoJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9KTsgYCArXG4gICAgICAgICAgICAgICAgJ3J1biBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgaWYgdGhlIERvY2tlciBidWlsZCBuZWVkcyB0aGVtLiBDb250aW51aW5nLidcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW1pemVkUHJvamVjdHM6IFByb2plY3RbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gICAgICByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llcyhwcm9qZWN0LCBwYWNrYWdlSnNvbik7XG4gICAgICBjb25zdCByZW1vdmVkRGV2RGVwZW5kZW5jaWVzID0gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24sIHtcbiAgICAgICAgcmVtb3ZlV2JQb3N0aW5zdGFsbDogIWFyZ3Yub3V0c2lkZSAmJiByZW1vdmVkRGV2RGVwZW5kZW5jaWVzLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvd2InKSxcbiAgICAgIH0pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgICAgaWYgKGFyZ3Yub3V0c2lkZSkge1xuICAgICAgICBhd2FpdCB3cml0ZURvY2tlclNoZWxsU2NyaXB0cyhwYXRoLmpvaW4oZGlzdERpclBhdGgsICdiYXNoJykpO1xuICAgICAgfVxuICAgICAgb3B0aW1pemVkUHJvamVjdHMucHVzaChwcm9qZWN0KTtcbiAgICB9XG4gICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhYXJndi5vdXRzaWRlKSB7XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwcm9qZWN0cy5yb290LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZCwgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5pbmZvKCdJbnN0YWxsZWQgZGVwZW5kZW5jaWVzLicpO1xuICAgICAgYXdhaXQgY2xlYW51cERvY2tlckJ1aWxkQXJ0aWZhY3RzKG9wdGltaXplZFByb2plY3RzKTtcbiAgICB9XG4gIH0sXG59O1xuXG4vKiogV2hldGhlciBhbnkgZGVwZW5kZW5jeSBzZWN0aW9uIGRlY2xhcmVzIGEgcHJpdmF0ZSBnaXQgb3IgYEB3aWxsYm9vc3Rlci1wcml2YXRlLypgIHJlZ2lzdHJ5IGRlcGVuZGVuY3kuICovXG5mdW5jdGlvbiBkZWNsYXJlc1ByaXZhdGVEZXBlbmRlbmN5KHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICByZXR1cm4gZGVwZW5kZW5jeVNlY3Rpb25LZXlzLnNvbWUoKGtleSkgPT4ge1xuICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIHJldHVybiAoXG4gICAgICBkZXBzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIE9iamVjdC5lbnRyaWVzKGRlcHMpLnNvbWUoXG4gICAgICAgIChbbmFtZSwgdmFsdWVdKSA9PiBpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlKSB8fCBpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzKHByb2plY3Q6IFByb2plY3QsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzRm9yRGlyKHByb2plY3Qucm9vdERpclBhdGgsIHByb2plY3QuZGlyUGF0aCwgcGFja2FnZUpzb24pO1xufVxuXG5mdW5jdGlvbiByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llc0ZvckRpcihcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJld3JpdHRlbkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gPz8ge307XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICBpZiAoaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gRG9ja2VyIGJ1aWxkcyBjYW5ub3QgYWNjZXNzIHByaXZhdGUgU1NIIFVSTHMgdW5sZXNzIGNyZWRlbnRpYWxzIGFyZSBmb3J3YXJkZWQuXG4gICAgICAgIC8vIFRoZSBEb2NrZXJmaWxlIGNvcGllcyB0aG9zZSB3b3Jrc3BhY2UgcGFja2FnZXMgaW50byB0aGUgaW1hZ2UgaW5zdGVhZC4gT25seSB0aGUgb3JnJ3NcbiAgICAgICAgLy8gb3duIGdpdCBkZXBlbmRlbmNpZXMgYXJlIHJld3JpdHRlbiDigJQgdGhlIHNoYXJlZCBwcmVkaWNhdGUgbWF0Y2hlcyBleGFjdGx5IHdoYXRcbiAgICAgICAgLy8gYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIG1hdGVyaWFsaXplcywgc28gb3RoZXIgU1NIIFVSTHMgYXJlIGxlZnQgdW5jaGFuZ2VkIGluc3RlYWRcbiAgICAgICAgLy8gb2YgYmVpbmcgcG9pbnRlZCBhdCBuZXZlci1tYXRlcmlhbGl6ZWQgbG9jYWwgcGF0aHMuXG4gICAgICAgIGRlcHNbbmFtZV0gPSBnZXRQcml2YXRlUGFja2FnZURvY2tlclNwZWNpZmllcihyb290RGlyUGF0aCwgcGFja2FnZURpclBhdGgsICdAd2lsbGJvb3N0ZXInLCBuYW1lKTtcbiAgICAgICAgcmV3cml0dGVuRGVwZW5kZW5jaWVzLnB1c2goYCR7a2V5fS4ke25hbWV9YCk7XG4gICAgICB9IGVsc2UgaWYgKGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeShuYW1lLCB2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgbWF0ZXJpYWxpemVkVmVyc2lvbiA9IHJlYWRNYXRlcmlhbGl6ZWRQYWNrYWdlVmVyc2lvbihyb290RGlyUGF0aCwgbmFtZSk7XG4gICAgICAgIGlmIChtYXRlcmlhbGl6ZWRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBMZWF2aW5nIHRoZSByZWdpc3RyeSBzcGVjaWZpZXIgbWVhbnMgdGhlIGluLWltYWdlIGluc3RhbGwgbmVlZHMgVmVyZGFjY2lvXG4gICAgICAgICAgLy8gY3JlZGVudGlhbHMg4oCUIHRoZSBmYWlsdXJlIHRoaXMgZmVhdHVyZSBleGlzdHMgdG8gYXZvaWQg4oCUIHNvIHNheSBzbyBvdXQgbG91ZC5cbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGAke25hbWV9IGlzIG5vdCBtYXRlcmlhbGl6ZWQgdW5kZXIgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfS87IHJ1biBcXGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzXFxgIHNvIHRoZSBEb2NrZXIgYnVpbGQgZG9lcyBub3QgbmVlZCByZWdpc3RyeSBjcmVkZW50aWFscy5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgbWF0ZXJpYWxpemVkIHZlcnNpb24gaXMgc3RhbGUgd2hlbiB0aGUgc3BlY2lmaWVyIChhbiBleGFjdCB2ZXJzaW9uIG9yIGFueSBzZW12ZXJcbiAgICAgICAgLy8gcmFuZ2UgYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIHJlc29sdmVzIG1heC1zYXRpc2Z5aW5nIGFnYWluc3QgdGhlIHJlZ2lzdHJ5KSBkb2VzXG4gICAgICAgIC8vIG5vdCBhZG1pdCBpdC4gRGlzdC10YWcgc3BlY2lmaWVycyAoZS5nLiBgMjAyNi1zdGFibGVgKSBza2lwIHRoZSBzdGFsZW5lc3MgY2hlY2suXG4gICAgICAgIGlmICghbWF0ZXJpYWxpemVkVmVyc2lvblNhdGlzZmllcyh2YWx1ZSwgbWF0ZXJpYWxpemVkVmVyc2lvbikpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgICBgTWF0ZXJpYWxpemVkICR7bmFtZX0gaXMgJHttYXRlcmlhbGl6ZWRWZXJzaW9ufSBidXQgcGFja2FnZS5qc29uIHJlcXVpcmVzICR7dmFsdWV9OyByZXJ1biBcXGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzXFxgLmBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWdpc3RyeSBwYWNrYWdlcyB0aGF0IGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCBtYXRlcmlhbGl6ZWQgb24gdGhlIGhvc3QgYXJlIHVzZWQgYXNcbiAgICAgICAgLy8gbG9jYWwgcGF0aHMgc28gaW1hZ2UgYnVpbGRzIG5lZWQgbm8gVmVyZGFjY2lvIGNyZWRlbnRpYWxzOyB0aGUgQ09NTUlUVEVEIHBhY2thZ2UuanNvblxuICAgICAgICAvLyBrZWVwcyB0aGUgcmVnaXN0cnkgc3BlY2lmaWVyIOKAlCBvbmx5IHRoZSBnZW5lcmF0ZWQgKGRpc3QvKXBhY2thZ2UuanNvbiBpcyByZXdyaXR0ZW5cbiAgICAgICAgLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk2NCkuXG4gICAgICAgIGRlcHNbbmFtZV0gPSBnZXRQcml2YXRlUGFja2FnZURvY2tlclNwZWNpZmllcihyb290RGlyUGF0aCwgcGFja2FnZURpclBhdGgsIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsIG5hbWUpO1xuICAgICAgICByZXdyaXR0ZW5EZXBlbmRlbmNpZXMucHVzaChgJHtrZXl9LiR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZXdyb3RlIHByaXZhdGUgZGVwZW5kZW5jaWVzOicsIHJld3JpdHRlbkRlcGVuZGVuY2llcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG4gIHJldHVybiByZXdyaXR0ZW5EZXBlbmRlbmNpZXM7XG59XG5cbmZ1bmN0aW9uIGdldFByaXZhdGVQYWNrYWdlRG9ja2VyU3BlY2lmaWVyKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBzY29wZURpck5hbWU6IHN0cmluZyxcbiAgcGFja2FnZU5hbWU6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCBzY29wZURpck5hbWUsIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSkpO1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhY2thZ2VEaXJQYXRoLCBwcml2YXRlUGFja2FnZURpclBhdGgpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSA/IHJlbGF0aXZlUGF0aCA6IGAuLyR7cmVsYXRpdmVQYXRofWA7XG59XG5cbi8qKiBVbmRlZmluZWQgd2hlbiB0aGUgcGFja2FnZSBpcyBub3QgbWF0ZXJpYWxpemVkIChvciBpdHMgbWFuaWZlc3QgaXMgdW5yZWFkYWJsZS92ZXJzaW9ubGVzcykuICovXG5mdW5jdGlvbiByZWFkTWF0ZXJpYWxpemVkUGFja2FnZVZlcnNpb24ocm9vdERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihcbiAgICByb290RGlyUGF0aCxcbiAgICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICAgIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSksXG4gICAgJ3BhY2thZ2UuanNvbidcbiAgKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb24pLnZlcnNpb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZURpclBhdGggPSBmaW5kRG9ja2VyU2hlbGxTY3JpcHRzRGlyUGF0aCgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihzb3VyY2VEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0ZpbGUoKSB8fCAhZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5zaCcpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHRhcmdldEZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5jb3B5RmlsZShwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCB0YXJnZXRGaWxlUGF0aCk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuY2htb2QodGFyZ2V0RmlsZVBhdGgsIDBvNzU1KTtcbiAgfVxuICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCBEb2NrZXIgc2hlbGwgc2NyaXB0czogJHtwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGRpclBhdGgpIHx8IGRpclBhdGh9YCk7XG59XG5cbmZ1bmN0aW9uIGZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoKCk6IHN0cmluZyB7XG4gIGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAnZG9ja2VyJywgJ2Jhc2gnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvY2tlciBzaGVsbCBzY3JpcHRzIGRpcmVjdG9yeSBub3QgZm91bmQuJyk7XG4gICAgfVxuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5vdXRzaWRlKSB7XG4gICAgLy8gT3V0c2lkZSBvcHRpbWl6YXRpb24gd3JpdGVzIGRpc3QvcGFja2FnZS5qc29uIGJlZm9yZSBEb2NrZXIgYnVpbGRzIHRoZSBhcHAuXG4gICAgLy8gS2VlcCBidWlsZC10aW1lIGRlcGVuZGVuY2llcyBhbmQgcmVtb3ZlIG9ubHkga25vd24gbm9uLWJ1aWxkIHRvb2xpbmcuXG4gICAgcmV0dXJuIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIC8vIEluc2lkZSBEb2NrZXIsIGNvZGVnZW4vYnVpbGQgaGFzIGFscmVhZHkgZmluaXNoZWQsIHNvIHByb2R1Y3Rpb24gaW5zdGFsbCBzaG91bGQgbm90IHNlZSBkZXYgdG9vbGluZy5cbiAgY29uc3QgcmVtb3ZlZERlcGVuZGVuY2llcyA9IE9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fSk7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xuICByZXR1cm4gcmVtb3ZlZERlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyBJbiAtLW91dHNpZGUgbW9kZSwgRG9ja2VyIHN0aWxsIHJ1bnMgY29kZWdlbi9idWlsZCBiZWZvcmUgYSBzZWNvbmQgaW4taW1hZ2Ugb3B0aW1pemF0aW9uLlxuICAvLyBSZW1vdmUgb25seSB0b29saW5nIHRoYXQgaXMgbm90IG5lZWRlZCBmb3IgdGhhdCBidWlsZCBwaGFzZS5cbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2Jpb21lJyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAnb3hmbXQnLFxuICAgICdveGxpbnQnLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAvLyBTaGFyZWQgY29uZmlnIHBhY2thZ2VzIGFyZSBuZWVkZWQgb25seSBmb3IgbGludC9mb3JtYXQvdGVzdCBjb21tYW5kcywgbm90IERvY2tlciBidWlsZHMuXG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG4gIHJldHVybiByZW1vdmVkRGVwcztcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgb3B0aW9uczogeyByZW1vdmVXYlBvc3RpbnN0YWxsOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgKG9wdGlvbnMucmVtb3ZlV2JQb3N0aW5zdGFsbCAmJiBuYW1lID09PSAncG9zdGluc3RhbGwnICYmIGNvbnRlbnQudHJpbSgpID09PSAnd2IgZ2VuLWNvZGUnKSB8fFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwRG9ja2VyQnVpbGRBcnRpZmFjdHMocHJvamVjdHM6IFByb2plY3RbXSk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBhd2FpdCByZW1vdmVQcm9qZWN0Q2FjaGVzKHByb2plY3QpO1xuICAgIGF3YWl0IHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0KTtcbiAgICBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3QpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVByb2plY3RDYWNoZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gW1xuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0aHMocHJvamVjdCkpLFxuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0dGVybnMocHJvamVjdCkpLFxuICBdO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgRG9ja2VyIGJ1aWxkIGNhY2hlczonLCByZWxhdGl2ZVBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQnVpbGRDYWNoZVBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgZG9ja2VyQnVpbGRDYWNoZVBhdGhzKSB7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSBjb250aW51ZTtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICByZW1vdmVkUGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpO1xuICB9XG4gIHJldHVybiByZW1vdmVkUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gYXdhaXQgZ2xvYmJ5KGRvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucywge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzJywgJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ueWFybicsICcqKi8ueWFybi8qKicsICcqKi8uZ2l0JywgJyoqLy5naXQvKionXSxcbiAgICBvbmx5RmlsZXM6IGZhbHNlLFxuICB9KTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcmVsYXRpdmVQYXRocy5tYXAoKHJlbGF0aXZlUGF0aCkgPT5cbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoR3JvdXBzID0gYXdhaXQgUHJvbWlzZS5hbGwoW3JlbW92ZUdlbmVyYXRlZE1vdW50RGlycyhwcm9qZWN0KSwgcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCldKTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzID0gcmVtb3ZlZFBhdGhHcm91cHMuZmxhdCgpO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZ2VuZXJhdGVkIGxvY2FsIGRhdGE6JywgcmVtb3ZlZFBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkTW91bnREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aHMgPSBnZXRHZW5lcmF0ZWRNb3VudERpclBhdGhzKHByb2plY3QpO1xuICBjb25zdCByZW1vdmVkUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIHJlbGF0aXZlUGF0aHMpIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0UGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJlbW92ZWRQYXRocy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRQYXRocztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkTW91bnREaXJQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBkZWZhdWx0UGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihkaXJOYW1lLCAnbW91bnQnKSk7XG4gIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybiBkZWZhdWx0UGF0aHM7XG5cbiAgY29uc3QgYWJzb2x1dGVEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRiUGF0aCk7XG4gIGlmIChwYXRoLmJhc2VuYW1lKGFic29sdXRlRGlyUGF0aCkgIT09ICdtb3VudCcgfHwgIWlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgYWJzb2x1dGVEaXJQYXRoKSkge1xuICAgIHJldHVybiBkZWZhdWx0UGF0aHM7XG4gIH1cbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIGFic29sdXRlRGlyUGF0aCk7XG4gIGlmICghcmVsYXRpdmVQYXRoKSByZXR1cm4gZGVmYXVsdFBhdGhzO1xuXG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uZGVmYXVsdFBhdGhzLCByZWxhdGl2ZVBhdGhdKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGVmYXVsdERpcnMocHJvamVjdCksXG4gICAgcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCksXG4gIF0pO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRlZmF1bHREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpclBhdGhzID0gYXdhaXQgZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0LCBkaXJQYXRoKSkpO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGlyUGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUpKTtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gaXNEaXJlY3RvcnkoZGlyUGF0aCkpKTtcbiAgcmV0dXJuIGRpclBhdGhzLmZpbHRlcigoXywgaW5kZXgpID0+IHJlc3VsdHNbaW5kZXhdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGJGaWxlUGF0aHMgPSBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkYkZpbGVQYXRoIG9mIGRiRmlsZVBhdGhzKSB7XG4gICAgZm9yIChjb25zdCB0YXJnZXRQYXRoIG9mIGdldFNxbGl0ZUZpbGVGYW1pbHlQYXRocyhkYkZpbGVQYXRoKSkge1xuICAgICAgaWYgKCEoYXdhaXQgaXNGaWxlKHRhcmdldFBhdGgpKSkgY29udGludWU7XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICByZW1vdmVkUGF0aHMucHVzaChwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgdGFyZ2V0UGF0aCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVtb3ZlZFBhdGhzO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVEYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoIHx8ICFhYnNvbHV0ZURiUGF0aCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGZpbGVQYXRocyA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpXG4gICAgPyBbZGJQYXRoXVxuICAgIDogW2Fic29sdXRlRGJQYXRoLCAuLi5nZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUsIGRiUGF0aCkpXTtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGZpbGVQYXRocyldLmZpbHRlcigoZmlsZVBhdGgpID0+IGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3QsIGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgZmlsZVBhdGgpIHx8IGlzRG9ja2VyR2VuZXJhdGVkRGF0YUZpbGVQYXRoKHByb2plY3QsIGZpbGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJHZW5lcmF0ZWREYXRhRmlsZVBhdGgocHJvamVjdDogUHJvamVjdCwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzRG9ja2VyRW5hYmxlZChwcm9qZWN0KSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkb2NrZXJHZW5lcmF0ZWREYXRhRGlyUGF0aHMuc29tZSgoZGlyUGF0aCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcnICYmIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRmlsZUZhbWlseVBhdGhzKGRiRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBkYkZpbGVQYXRoLFxuICAgIGAke2RiRmlsZVBhdGh9LWpvdXJuYWxgLFxuICAgIGAke2RiRmlsZVBhdGh9LXNobWAsXG4gICAgYCR7ZGJGaWxlUGF0aH0td2FsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5qb3VybmFsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5zaG1gLFxuICAgIGAke2RiRmlsZVBhdGh9LndhbGAsXG4gIF07XG59XG5cbmZ1bmN0aW9uIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdDogUHJvamVjdCwgdGFyZ2V0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCB0YXJnZXRQYXRoKTtcbiAgLy8gYHN0YXJ0c1dpdGgoJy4uJylgIHdvdWxkIHJlamVjdCBwcm9qZWN0LWxvY2FsIG5hbWVzIHN1Y2ggYXMgYC4uY2FjaGVgLlxuICByZXR1cm4gcmVsYXRpdmVQYXRoID09PSAnJyB8fCAocmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChgLi4ke3BhdGguc2VwfWApKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChmaWxlUGF0aCk7XG4gICAgcmV0dXJuIHN0YXQuaXNGaWxlKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpc0RpcmVjdG9yeShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChkaXJQYXRoKTtcbiAgICByZXR1cm4gc3RhdC5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0OiBQcm9qZWN0LCBkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgc3FsaXRlRmlsZU5hbWVzID0gZGlyZW50c1xuICAgIC5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIHNxbGl0ZUZpbGVQYXR0ZXJuLnRlc3QoZGlyZW50Lm5hbWUpKVxuICAgIC5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpO1xuICBhd2FpdCBQcm9taXNlLmFsbChzcWxpdGVGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuXG4gIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBkaXJQYXRoKTtcbiAgcmV0dXJuIHNxbGl0ZUZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLmpvaW4ocmVsYXRpdmVEaXJQYXRoLCBmaWxlTmFtZSkpO1xufVxuXG5mdW5jdGlvbiBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgaWYgKCFpc0RvY2tlckVuYWJsZWQocHJvamVjdCkpIHJldHVybjtcblxuICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Jhc2gnLCAnY2xlYW51cC5zaCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc2NyaXB0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCByZXN1bHQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnYmFzaCcsIFtzY3JpcHRQYXRoLCAnLS1rZWVwLXNjcmlwdHMnXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAke3BhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBzY3JpcHRQYXRoKX1gKTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZU9ybSwgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cywgZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoLCBpc1Byb2plY3RFbnZpcm9ubWVudCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGREcml6emxlS2l0Q29tbWFuZCwgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0RvY2tlckVuYWJsZWQgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7IHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHByaXNtYUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdwcmlzbWEnLFxuICBhbGlhc2VzOiBbJ2RiJ10sXG4gIGRlc2NyaWJlOlxuICAgIFwiUnVuIGRhdGFiYXNlIGNvbW1hbmRzLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIFByaXNtYS4gRHJpenpsZSBwcm9qZWN0cyB1c2UgZHJpenpsZS1raXQuIEV4YW1wbGU6IHdiIHByaXNtYSBtaWdyYXRlLWRldiAtLSAtLW5hbWUgaW5pdFwiLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHtcbiAgICByZXR1cm4geWFyZ3NcbiAgICAgIC5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pXG4gICAgICAuY29tbWFuZChjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChnZW5lcmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXN0QmFja3Vwc0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKClcbiAgICAgIC5zdHJpY3QoZmFsc2UpOyAvLyBBbGxvdyB1bmtub3duIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRocm91Z2hcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY2xlYW51cC1saXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdDbGVhbiB1cCB0ZW1wb3JhbCBMaXRlc3RyZWFtIGZpbGVzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGNsZWFudXAtbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnL2V0Yy9saXRlc3RyZWFtLnltbCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUnLFxuICBidWlsZGVyOiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoYWxsUHJvamVjdHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ3JlYXRpbmcgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZvciBtdWx0aXBsZSBwcm9qZWN0cyBhdCBvbmNlIGlzIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSB0aGV5IHdvdWxkIG92ZXJ3cml0ZSBlYWNoIG90aGVyLidcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3QsIG9ybSwgYXJndi5vdXRwdXQpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aG91dCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZGVwbG95JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlJyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZ2VuZXJhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2dlbmVyYXRlJyxcbiAgZGVzY3JpYmU6ICdHZW5lcmF0ZSBPUk0gY2xpZW50IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZ2VuZXJhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5nZW5lcmF0ZShwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGxpdGVzdHJlYW1Db25maWdCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBjb25maWc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBsaXN0QmFja3Vwc0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgbGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyOiBsaXRlc3RyZWFtQ29uZmlnQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGxpc3QtYmFja3VwcycsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmxpc3RCYWNrdXBzKHByb2plY3QsIGFyZ3YuY29uZmlnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdjaGVjay1pZGVtcG90ZW5jeSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1J1biB0aGUgbWlncmF0aW9uIGNvbW1hbmQgdHdpY2UgdG8gY29uZmlybSBpdCBpcyBpZGVtcG90ZW50LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgbWlncmF0ZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXI6IG1pZ3JhdGVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnY2hlY2staWRlbXBvdGVuY3knXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvcm1TY3JpcHRzID0gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24od2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIG9ybVNjcmlwdHMubWlncmF0ZShwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGlmIChzaG91bGRDaGVja0lkZW1wb3RlbmN5KHByb2plY3QsIGFyZ3YuY2hlY2tJZGVtcG90ZW5jeSkpIHtcbiAgICAgICAgaWYgKGlzUHJvZHVjdGlvbkVudmlyb25tZW50KHByb2plY3QpKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdyhgU2tpcHBpbmcgaWRlbXBvdGVuY3kgY2hlY2sgZm9yICR7cHJvamVjdC5uYW1lfSBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50LmApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgb3JtU2NyaXB0cy5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIHNob3VsZENoZWNrSWRlbXBvdGVuY3kocHJvamVjdDogUHJvamVjdCwgY2hlY2tJZGVtcG90ZW5jeTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hlY2tJZGVtcG90ZW5jeSA/PyBpc0RvY2tlckVuYWJsZWQocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIGlzUHJvZHVjdGlvbkVudmlyb25tZW50KHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICdwcm9kdWN0aW9uJyk7XG59XG5cbmNvbnN0IG1pZ3JhdGVEZXZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUtZGV2JyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgYSBtaWdyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBtaWdyYXRlLWRldicsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLm1pZ3JhdGVEZXYocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gICAgICAgICdXQl9FTlY9dGVzdCBkYiByZXNldCcsXG4gICAgICAgIGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpXG4gICAgICApKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3ZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXN0b3JlQnVpbGRlciA9IHtcbiAgLi4ubGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxkcml6emxlfHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlM1wiLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCByZXN0b3JlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiByZXN0b3JlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzdG9yZScsXG4gIGRlc2NyaWJlOiBcIlJlc3RvcmUgREIgZnJvbSBMaXRlc3RyZWFtJ3MgYmFja3VwXCIsXG4gIGJ1aWxkZXI6IHJlc3RvcmVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgcmVzdG9yZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXJndi5vdXRwdXQgPz8gZ2V0RGVmYXVsdFJlc3RvcmVPdXRwdXQocHJvamVjdCwgb3JtKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXN0b3JlKHByb2plY3QsIG91dHB1dCwgYXJndi5jb25maWcpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzZWVkQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgZmlsZToge1xuICAgIGFsaWFzOiAnZicsXG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBzZWVkIHNjcmlwdC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc2VlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2VlZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NlZWQnLFxuICBkZXNjcmliZTogJ1BvcHVsYXRlIERCIHdpdGggc2VlZCBkYXRhJyxcbiAgYnVpbGRlcjogc2VlZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBzZWVkJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSkpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBkYXRhYmFzZSBzdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc3R1ZGlvJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICAvLyBSZXNvbHZlZCBhZ2FpbnN0IHRoZSBwcm9qZWN0IGRpcmVjdG9yeSBiZWNhdXNlIHByaXNtYVNjcmlwdHMuc3R1ZGlvIHJlc29sdmVzIGEgcmVsYXRpdmVcbiAgICAgIC8vIHBhdGggYWdhaW5zdCB0aGUgQ0xJIHByb2Nlc3MgZGlyZWN0b3J5LCB3aGljaCBkaWZmZXJzIGZvciB3b3Jrc3BhY2UgZGVzY2VuZGFudHMuXG4gICAgICBjb25zdCBkYlVybE9yUGF0aCA9IGFyZ3YucmVzdG9yZWRcbiAgICAgICAgPyBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnByaXNtYURpck5hbWUsICdyZXN0b3JlZC5zcWxpdGUzJylcbiAgICAgICAgOiBhcmd2LmRiVXJsT3JQYXRoPy50b1N0cmluZygpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoLCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOlxuICAgIFwiUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHRoZSBkZXRlY3RlZCBPUk0gYXMgaXMuIEFkZGl0aW9uYWwgUHJpc21hIGZsYWdzIGNhbiBhbHNvIGJlIGZvcndhcmRlZCBhZnRlciAnLS0nLlwiLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gKGFyZ3YuYXJncz8uam9pbignICcpID8/ICcnKS50cmltRW5kKCk7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydhcmdzJ10pO1xuICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gW3NjcmlwdCwgdW5rbm93bk9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKGBkYiAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgY29tbWFuZCA9IG9ybSA9PT0gJ3ByaXNtYScgPyBgUFJJU01BICR7ZnVsbENvbW1hbmR9YCA6IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgZnVsbENvbW1hbmQpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBjb21tYW5kKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBNYWtlIERyaXp6bGUgY29tbWFuZHMgd29yayBvbiBDbG91ZGZsYXJlIEQxIHByb2plY3RzIGJ5IHBvaW50aW5nIERBVEFCQVNFX1VSTFxuICogYXQgdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZS5cbiAqL1xuZnVuY3Rpb24gd2l0aExvY2FsRDFJZk5lZWRlZChvcm06IERhdGFiYXNlT3JtLCBwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBvcm0gPT09ICdkcml6emxlJyA/IHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsKHByb2plY3QsIHNjcmlwdCkgOiBzY3JpcHQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdDogUHJvamVjdCwgb3JtOiBEYXRhYmFzZU9ybSwgY29uZmlnUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldExpdGVzdHJlYW1EYlBhdGgocHJvamVjdCwgb3JtKTtcbiAgY29uc3QgcmVxdWlyZWRFbnZWYXJzID0ge1xuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUU6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVksXG4gIH0gYXMgY29uc3Q7XG4gIGNvbnN0IG1pc3NpbmdFbnZWYXJzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRFbnZWYXJzKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIXZhbHVlKVxuICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZ0VudlZhcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExpdGVzdHJlYW06ICR7bWlzc2luZ0VudlZhcnMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IGxpdGVzdHJlYW1Db25maWcgPSBgc25hcHNob3Q6XG4gIGludGVydmFsOiAyNGggICMgQ3JlYXRlIGEgYmFja3VwIHBlciBkYXlcbiAgcmV0ZW50aW9uOiA3MmggIyBLZWVwIGJhY2t1cHMgZm9yIDMgZGF5c1xuZGJzOlxuICAtIHBhdGg6ICR7ZGJQYXRofVxuICAgIGJ1c3ktdGltZW91dDogNXNcbiAgICBjaGVja3BvaW50LWludGVydmFsOiAxbVxuICAgIHJlcGxpY2E6XG4gICAgICB0eXBlOiBzM1xuICAgICAgZW5kcG9pbnQ6IGh0dHBzOi8vJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUR9LnIyLmNsb3VkZmxhcmVzdG9yYWdlLmNvbVxuICAgICAgYnVja2V0OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUV9XG4gICAgICBhY2Nlc3Mta2V5LWlkOiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRH1cbiAgICAgIHNlY3JldC1hY2Nlc3Mta2V5OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVl9XG4gICAgICBzeW5jLWludGVydmFsOiAxbVxuYDtcblxuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gLCB7XG4gICAgICBjYXVzZTogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFJlc3RvcmVPdXRwdXQocHJvamVjdDogUHJvamVjdCwgb3JtOiBEYXRhYmFzZU9ybSk6IHN0cmluZyB7XG4gIGlmIChvcm0gPT09ICdwcmlzbWEnKSByZXR1cm4gYCR7cHJvamVjdC5wcmlzbWFEaXJOYW1lfS9yZXN0b3JlZC5zcWxpdGUzYDtcbiAgcmV0dXJuICdkcml6emxlL3Jlc3RvcmVkLnNxbGl0ZTMnO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtRGJQYXRoKHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0pOiBzdHJpbmcge1xuICBpZiAob3JtID09PSAncHJpc21hJykge1xuICAgIHJldHVybiBgJHtwcm9qZWN0LnByaXNtYURpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3YiBkYiBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcgZm9yIERyaXp6bGUgcmVxdWlyZXMgZmlsZTogREFUQUJBU0VfVVJMLicpO1xuICB9XG4gIHJldHVybiBkYlBhdGg7XG59XG5cbmludGVyZmFjZSBEYXRhYmFzZU9ybVByb2plY3Qge1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBvcm06IERhdGFiYXNlT3JtO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcm0/OiBEYXRhYmFzZU9ybSk6IFByb21pc2U8RGF0YWJhc2VPcm1Qcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuZGVzY2VuZGFudHNcbiAgICAubWFwKChwcm9qZWN0KSA9PiAocHJvamVjdC5kYXRhYmFzZU9ybSA/IHsgcHJvamVjdCwgb3JtOiBwcm9qZWN0LmRhdGFiYXNlT3JtIH0gOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoKHByb2plY3QpOiBwcm9qZWN0IGlzIERhdGFiYXNlT3JtUHJvamVjdCA9PiAhIXByb2plY3QgJiYgKCFvcm0gfHwgcHJvamVjdC5vcm0gPT09IG9ybSkpO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQob3JtID8gYE5vICR7b3JtfSBwcm9qZWN0IGZvdW5kLmAgOiAnTm8gc3VwcG9ydGVkIGRhdGFiYXNlIE9STSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtOiBEYXRhYmFzZU9ybSk6IHR5cGVvZiBwcmlzbWFTY3JpcHRzIHwgdHlwZW9mIGRyaXp6bGVTY3JpcHRzIHtcbiAgcmV0dXJuIG9ybSA9PT0gJ3ByaXNtYScgPyBwcmlzbWFTY3JpcHRzIDogZHJpenpsZVNjcmlwdHM7XG59XG5cbmZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgY29tbWFuZE5hbWU6IHN0cmluZyxcbiAgcHJvamVjdHM6IERhdGFiYXNlT3JtUHJvamVjdFtdXG4pOiBHZW5lcmF0b3I8RGF0YWJhc2VPcm1Qcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGNvbnN0IG9ybVByb2plY3RCeVByb2plY3QgPSBuZXcgTWFwKHByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gW3Byb2plY3QucHJvamVjdCwgcHJvamVjdF0pKTtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChcbiAgICBjb21tYW5kTmFtZSxcbiAgICBwcm9qZWN0cy5tYXAoKHsgcHJvamVjdCB9KSA9PiBwcm9qZWN0KVxuICApKSB7XG4gICAgY29uc3Qgb3JtUHJvamVjdCA9IG9ybVByb2plY3RCeVByb2plY3QuZ2V0KHByb2plY3QpO1xuICAgIGlmICghb3JtUHJvamVjdCkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGV0ZWN0IGRhdGFiYXNlIE9STSBmb3IgJHtwcm9qZWN0Lm5hbWV9LmApO1xuXG4gICAgeWllbGQgb3JtUHJvamVjdDtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgdW5rbm93biBvcHRpb25zIGZyb20gYXJndiB0byBwYXNzIHRvIE9STSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnLS0nLFxuICAgICdfJyxcbiAgICAnJDAnLFxuICBdKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcmd2KSkge1xuICAgIGlmICghYWxsS25vd25PcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9ucyBvZiBrZWJhYi1jYXNlIG9wdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRpb25cbiAgICAgIC8vIElmIHdlIGhhdmUgYm90aCAnY3JlYXRlLW9ubHknIGFuZCAnY3JlYXRlT25seScsIHByZWZlciB0aGUga2ViYWItY2FzZSB2ZXJzaW9uXG4gICAgICBjb25zdCBrZWJhYkNhc2VLZXkgPSBrZXkucmVwbGFjZUFsbCgvW0EtWl0vZywgKG1hdGNoKSA9PiBgLSR7bWF0Y2gudG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgIGlmIChrZWJhYkNhc2VLZXkgIT09IGtleSAmJiBhcmd2W2tlYmFiQ2FzZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbiBpZiBrZWJhYi1jYXNlIGV4aXN0c1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiBmbGFnc1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbHVlKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgc3RyaW5nL251bWJlciB2YWx1ZXNcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGFycmF5c1xuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcoaXRlbSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFzc3Rocm91Z2hBcmdzID0gQXJyYXkuaXNBcnJheShhcmd2WyctLSddKSA/IGFyZ3ZbJy0tJ10ubWFwKFN0cmluZykgOiBbXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi51bmtub3duT3B0aW9ucywgLi4ucGFzc3Rocm91Z2hBcmdzXSk7XG59XG4iLCJpbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsIHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc2VsZWN0Rm5veFNvdXJjZWRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvZW52U291cmNlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG4vLyBSYWlsd2F5IGluamVjdHMgaXRzIG93biBzeXN0ZW0gdmFyaWFibGVzIGFuZCBwbGF0Zm9ybS1tYW5hZ2VkIHZhbHVlczsgbmV2ZXIgbWlycm9yIHRob3NlIGJhY2ssXG4vLyBhbmQgc2tpcCBsb2NhbC1vbmx5IGtleXMuIEFwcCB2YXJpYWJsZXMgKGluY2x1ZGluZyBEQVRBQkFTRV9VUkwsIFBPUlQpIHN0YXkgZWxpZ2libGUgYmVjYXVzZVxuLy8gZm5veCBpcyB0aGUgc291cmNlIG9mIHRydXRoIOKAlCBhIHJlcG8gdGhhdCBtdXN0IE5PVCBvd24gYSB2YWx1ZSAoZS5nLiBhIFJhaWx3YXkgcmVmZXJlbmNlXG4vLyB2YXJpYWJsZSBwb2ludGluZyBhdCBhIGxpbmtlZCBkYXRhYmFzZSBzZXJ2aWNlKSBzaW1wbHkga2VlcHMgaXQgb3V0IG9mIGZub3guXG5jb25zdCBOT05fUkFJTFdBWV9LRVlTID0gbmV3IFNldChbJ0NJJ10pO1xuY29uc3QgTk9OX1JBSUxXQVlfS0VZX1BSRUZJWEVTID0gWydSQUlMV0FZXycsICdOSVhQQUNLU18nXTtcblxuZnVuY3Rpb24gaXNOb25SYWlsd2F5S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBOT05fUkFJTFdBWV9LRVlTLmhhcyhrZXkpIHx8IE5PTl9SQUlMV0FZX0tFWV9QUkVGSVhFUy5zb21lKChwcmVmaXgpID0+IGtleS5zdGFydHNXaXRoKHByZWZpeCkpO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIHZhcmlhYmxlcyB0byBwdXNoIHRvIFJhaWx3YXkgZnJvbSBhIHJlc29sdmVkIGVudmlyb25tZW50OiBkcm9wIGVtcHR5L3VuZGVmaW5lZCB2YWx1ZXNcbiAqIChzbyBhIGBLRVk9YCBwbGFjZWhvbGRlciBuZXZlciBibGFua3MgYSByZWFsIFJhaWx3YXkgdmFyaWFibGUpIGFuZCBSYWlsd2F5LW1hbmFnZWQga2V5cywgc29ydGVkXG4gKiBmb3IgYSBzdGFibGUgY29tbWFuZCBhbmQgbG9nIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RSYWlsd2F5VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBbc3RyaW5nLCBzdHJpbmddW10ge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZW52VmFycylcbiAgICAuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIFtzdHJpbmcsIHN0cmluZ10gPT4ge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSAhPT0gJycgJiYgIWlzTm9uUmFpbHdheUtleShrZXkpO1xuICAgIH0pXG4gICAgLnRvU29ydGVkKChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbn1cblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xudHlwZSBSYWlsd2F5RW52Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8UmFpbHdheUVudkNvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHJhaWx3YXlFbnZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdyYWlsd2F5LWVudicsXG4gIGRlc2NyaWJlOlxuICAgICdTeW5jIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVjbGFyZWQgZm9yIHRoZSBjdXJyZW50IFdCX0VOViAocmVzb2x2ZWQgZnJvbSBmbm94KSB0byB0aGUgUmFpbHdheSBzZXJ2aWNlLCBrZWVwaW5nIGZub3ggdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGguIFJhaWx3YXktbWFuYWdlZCBrZXlzIChSQUlMV0FZXyosIE5JWFBBQ0tTXyosIENJKSBhcmUgbmV2ZXIgcHVzaGVkLicsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4geWFyZ3MgYXMgdW5rbm93biBhcyBBcmd2PFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndjogUmFpbHdheUVudkNvbW1hbmRBcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgZW52TmFtZSA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBpZiAoIWVudk5hbWUgfHwgZW52TmFtZSA9PT0gJ2RldmVsb3BtZW50JyB8fCBlbnZOYW1lID09PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgV0JfRU5WIG11c3QgbmFtZSBhIGRlcGxveSBlbnZpcm9ubWVudCAoZS5nLiBzdGFnaW5nIG9yIHByb2R1Y3Rpb24pLCBidXQgaXMgJHtlbnZOYW1lfS5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBSZXN0cmljdCB0byB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhlIHByb2plY3QncyBmbm94IHNvdXJjZXM7IGlnbm9yZSBwcm9jZXNzLmVudiBzb1xuICAgIC8vIFJhaWx3YXkncyBvd24gaW5qZWN0ZWQgdmFyaWFibGVzIG5ldmVyIGxlYWsgaW4uIFRoZSBlZmZlY3RpdmUgdmFsdWVzIGNvbWUgZnJvbSBwcm9qZWN0LmVudlxuICAgIC8vIChmbm94LXJlc29sdmVkIGZvciBXQl9FTlYpLiBNaXJyb3JzIHdiIGRlcGxveS5cbiAgICBjb25zdCBbZW52VmFycywgZW52U291cmNlc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gYG1pc2UgZW52YCBpcyByZXBvcnRlZCBhcyBhIHBzZXVkby1zb3VyY2UgdGhhdCBtaXhlcyBpbiBob3N0L3Rvb2wgdmFyaWFibGVzIHN1Y2ggYXMgUEFUSCBhbmRcbiAgICAvLyBDQVJHT19IT01FOyB0aG9zZSBtdXN0IG5ldmVyIGJlIHB1c2hlZCB0byBSYWlsd2F5LCBzbyBrZWVwIG9ubHkgZm5veC1kZWNsYXJlZCBrZXlzLlxuICAgIGNvbnN0IGZub3hLZXlzID0gc2VsZWN0Rm5veFNvdXJjZWRLZXlzKGVudlNvdXJjZXMpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgICBpZiAoIWZub3hLZXlzLmhhcyhrZXkpKSBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgICAvLyBFeHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2luIG92ZXIgY29uZmlndXJlZCB2YWx1ZXMgKG1hdGNoZXMgd2IgZGVwbG95IC8gZ2VuLWRldi12YXJzKS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlICE9PSB1bmRlZmluZWQpIGVudlZhcnNba2V5XSA9IGVmZmVjdGl2ZVZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJpZXMgPSBzZWxlY3RSYWlsd2F5VmFyaWFibGVzKGVudlZhcnMpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnTm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHN5bmMgdG8gUmFpbHdheS4nKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5TmFtZXMgPSBlbnRyaWVzLm1hcCgoW2tleV0pID0+IGtleSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oYFdvdWxkIHN5bmMgJHtlbnRyaWVzLmxlbmd0aH0gdmFyaWFibGUocykgdG8gUmFpbHdheSAoJHtlbnZOYW1lfSk6ICR7a2V5TmFtZXMuam9pbignLCAnKX1gKVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgUmFpbHdheSBDTEkgcmVhZHMgYXV0aCAoUkFJTFdBWV9BUElfVE9LRU4pIGFuZCBkZWZhdWx0cyBmcm9tIHRoZSBlbnZpcm9ubWVudDsgcGFzcyB0aGVcbiAgICAvLyBwcm9qZWN0L3NlcnZpY2UvZW52aXJvbm1lbnQgZXhwbGljaXRseSB3aGVuIGF2YWlsYWJsZSBzbyB0aGUgY29tbWFuZCB3b3JrcyB1bmF0dGVuZGVkIGluIENJLlxuICAgIGNvbnN0IGNvbnRleHRBcmdzOiBzdHJpbmdbXSA9IFsnLS1za2lwLWRlcGxveXMnXTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuUkFJTFdBWV9QUk9KRUNUX0lEKSBjb250ZXh0QXJncy5wdXNoKGAtLXByb2plY3Q9JHtwcm9jZXNzLmVudi5SQUlMV0FZX1BST0pFQ1RfSUR9YCk7XG4gICAgaWYgKHByb2Nlc3MuZW52LlJBSUxXQVlfU0VSVklDRV9JRCkgY29udGV4dEFyZ3MucHVzaChgLS1zZXJ2aWNlPSR7cHJvY2Vzcy5lbnYuUkFJTFdBWV9TRVJWSUNFX0lEfWApO1xuICAgIGNvbnRleHRBcmdzLnB1c2goYC0tZW52aXJvbm1lbnQ9JHtlbnZOYW1lfWApO1xuICAgIGNvbnN0IHNldEFyZ3MgPSBlbnRyaWVzLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4gWyctLXNldCcsIGAke2tleX09JHt2YWx1ZX1gXSk7XG5cbiAgICAvLyBzdGRpbzogJ3BpcGUnIGtlZXBzIHRoZSBSYWlsd2F5IENMSSdzIHZhcmlhYmxlIGxpc3RpbmcgKHdoaWNoIGVjaG9lcyB2YWx1ZXMpIG91dCBvZiBDSSBsb2dzO1xuICAgIC8vIHRoaXMgY29tbWFuZCBvbmx5IGV2ZXIgcHJpbnRzIGtleSBuYW1lcywgbmV2ZXIgdmFsdWVzLlxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMoJ2J1bngnLCBbJ0ByYWlsd2F5L2NsaScsICd2YXJpYWJsZXMnLCAuLi5jb250ZXh0QXJncywgLi4uc2V0QXJnc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoYEZhaWxlZCB0byBzeW5jIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBSYWlsd2F5IChleGl0ICR7cmV0LnN0YXR1c30pLiBLZXlzOiAke2tleU5hbWVzLmpvaW4oJywgJyl9YClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQocmV0LnN0YXR1cyA/PyAxKTtcbiAgICB9XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTeW5jZWQgJHtlbnRyaWVzLmxlbmd0aH0gdmFyaWFibGUocykgdG8gUmFpbHdheSAoJHtlbnZOYW1lfSk6ICR7a2V5TmFtZXMuam9pbignLCAnKX1gKSk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cywgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoIH0gZnJvbSAnLi4vdXRpbHMvYmluUGF0aC5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG50eXBlIFJlbGVhc2VBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gIGFyZ3M/OiB1bmtub3duW107XG4gICctLSc/OiB1bmtub3duW107XG59O1xuXG5leHBvcnQgY29uc3QgcmVsZWFzZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdyZWxlYXNlIFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgJ1J1biBzZW1hbnRpYy1yZWxlYXNlIChvciBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlKSBzbyB0aGF0IHJlcG9zaXRvcmllcyB1c2luZyBCdW4gaXNvbGF0ZWQgaW5zdGFsbHMgY2FuIHB1Ymxpc2ggdG8gbnBtOiAnICtcbiAgICBcInJlaW5zdGFsbCB3aXRoIHRoZSBob2lzdGVkIGxpbmtlciAobnBtIGNhbm5vdCB3YWxrIEJ1bidzIGlzb2xhdGVkIG5vZGVfbW9kdWxlcyBsYXlvdXQpLCBcIiArXG4gICAgJ3Jld3JpdGUgYHdvcmtzcGFjZTpgIHJhbmdlcyBucG0gY2Fubm90IHBhcnNlLCBydW4gdGhlIHJlbGVhc2UsIHRoZW4gcmVzdG9yZSB0aGUgbW9kaWZpZWQgZmlsZXMuICcgK1xuICAgICdFeHRyYSBhcmd1bWVudHMgKGUuZy4gYC0tZGVidWdgLCBhZnRlciBgLS1gKSBhcmUgZm9yd2FyZGVkIHRvIHRoZSByZWxlYXNlIGNvbW1hbmQuJyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PiB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCByZWxlYXNlKGFyZ3YgYXMgUmVsZWFzZUFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2UoYXJndjogUmVsZWFzZUFyZ3YsIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICAvLyBzZW1hbnRpYy1yZWxlYXNlIG11c3QgcnVuIGF0IHRoZSByZXBvc2l0b3J5IHJvb3Q6IGl0IHJlYWRzIHRoZSBnaXQgcmVwbyBhbmQsIGZvciBtb25vcmVwb3MsXG4gIC8vIG11bHRpLXNlbWFudGljLXJlbGVhc2Ugd2Fsa3MgdGhlIHdvcmtzcGFjZXMgaXRzZWxmLlxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMucm9vdDtcblxuICAvLyBNYXBzIGEgbXV0YXRlZCBmaWxlIHRvIGl0cyBwcmUtcmVsZWFzZSBjb250ZW50IChyYXcgYnl0ZXMg4oCUIGJ1bi5sb2NrYiBpcyBiaW5hcnkpOyBgdW5kZWZpbmVkYFxuICAvLyBtYXJrcyBhIGZpbGUgdGhhdCBkaWQgbm90IGV4aXN0IGFuZCBtdXN0IGJlIGRlbGV0ZWQgb24gcmVzdG9yZSAoZS5nLiBhIGNyZWF0ZWQgbG9ja2ZpbGUpLlxuICBjb25zdCBtb2RpZmllZEZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIEJ1ZmZlciB8IHVuZGVmaW5lZD4oKTtcbiAgLy8gV2l0aCBhIGhhbmRsZXIgaW5zdGFsbGVkLCBTSUdJTlQvU0lHVEVSTSBubyBsb25nZXIgdGVybWluYXRlIHRoaXMgcHJvY2Vzcywgc28gdGhlXG4gIC8vIGZpbmFsbHktcmVzdG9yZSBhbHdheXMgZXhlY3V0ZXMgYW5kIHRoZSBzaWduYWwgaXMgcmUtcmFpc2VkIGFmdGVyd2FyZHMuIFRoZSBoYW5kbGVyIGFsc29cbiAgLy8gRk9SV0FSRFMgdGhlIHNpZ25hbCB0byB0aGUgcnVubmluZyBjaGlsZDogY2hpbGRyZW4gYXJlIHNwYXduZWQgYXN5bmNocm9ub3VzbHkgKG5ldmVyXG4gIC8vIHNwYXduU3luYywgd2hpY2ggd291bGQgYmxvY2sgdGhlIGV2ZW50IGxvb3AgYW5kIGRlZmVyIHRoZSBoYW5kbGVyIHVudGlsIGFmdGVyIHRoZSBjaGlsZCDigJRcbiAgLy8gYW5kIGEgcHVibGlzaCDigJQgY29tcGxldGVkKSwgc28gYSBzaWduYWwgdGFyZ2V0ZWQgYXQgdGhpcyBwcm9jZXNzIGFsb25lIHN0aWxsIGNhbmNlbHMgdGhlXG4gIC8vIGNoaWxkIHByb21wdGx5LlxuICBsZXQgcmVjZWl2ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBjb25zdCBhY3RpdmVDaGlsZDogQWN0aXZlQ2hpbGRSZWYgPSB7IGN1cnJlbnQ6IHVuZGVmaW5lZCB9O1xuICBjb25zdCBzaWduYWxIYW5kbGVyID0gKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkID0+IHtcbiAgICByZWNlaXZlZFNpZ25hbCA9IHNpZ25hbDtcbiAgICAvLyB0cmVlS2lsbCAobm90IGNoaWxkLmtpbGwpOiBzZW1hbnRpYy1yZWxlYXNlIGFuZCBidW4gaW5zdGFsbCBzcGF3biB0aGVpciBvd24gc3VicHJvY2Vzc2VzXG4gICAgLy8gKG5wbSBwdWJsaXNoLCBnaXQgcHVzaCwgLi4uKSwgd2hpY2ggbXVzdCBub3Qga2VlcCBwdWJsaXNoaW5nIGFmdGVyIHdiIHJlcG9ydHMgY2FuY2VsbGF0aW9uLlxuICAgIC8vIHRyZWVLaWxsIFRIUk9XUyAobWlzc2luZy90aW1pbmctb3V0IGBwc2AsIEVQRVJNKSwgYW5kIGFuIGV4Y2VwdGlvbiBlc2NhcGluZyBhIHNpZ25hbFxuICAgIC8vIGxpc3RlbmVyIHdvdWxkIHRlcm1pbmF0ZSB0aGUgcHJvY2VzcyBhbmQgc2tpcCB0aGUgcmVzdG9yaW5nIGZpbmFsbHkg4oCUIHNvIGRlZ3JhZGUgdG9cbiAgICAvLyBraWxsaW5nIHRoZSBkaXJlY3QgY2hpbGQgaW5zdGVhZC5cbiAgICB0cnkge1xuICAgICAgaWYgKGFjdGl2ZUNoaWxkLmN1cnJlbnQ/LnBpZCkgdHJlZUtpbGwoYWN0aXZlQ2hpbGQuY3VycmVudC5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBGYWlsZWQgdG8gdGVybWluYXRlIHRoZSByZWxlYXNlIGNoaWxkIHByb2Nlc3MgdHJlZTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQ/LmtpbGwoc2lnbmFsKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGd1YXJkZWRTaWduYWxzOiBOb2RlSlMuU2lnbmFsc1tdID0gWydTSUdJTlQnLCAnU0lHVEVSTSddO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBndWFyZGVkU2lnbmFscykgcHJvY2Vzcy5vbihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuXG4gIGxldCBleGl0Q29kZSA9IDA7XG4gIGxldCByZWxlYXNlUmFuU3VjY2Vzc2Z1bGx5ID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IHJlbGVhc2VQdWJsaXNoZXNUb05wbShwcm9qZWN0KSkge1xuICAgICAgYXdhaXQgcHJlcGFyZU5wbUNvbXBhdGlibGVMYXlvdXQocHJvamVjdCwgYXJndiwgbW9kaWZpZWRGaWxlcywgYWN0aXZlQ2hpbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgaG9pc3RlZCByZWluc3RhbGwgYW5kIHdvcmtzcGFjZS1yYW5nZSByZXdyaXRlIGV4aXN0IHNvbGVseSBzbyBucG0gKHdoaWNoIHRoZVxuICAgICAgLy8gQHNlbWFudGljLXJlbGVhc2UvbnBtIHBsdWdpbiBzaGVsbHMgb3V0IHRvKSBjYW4gZGlnZXN0IHRoZSBjaGVja291dDsgd2l0aG91dCB0aGF0IHBsdWdpblxuICAgICAgLy8gdGhlIHJlbGVhc2UgcnVucyBkaXJlY3RseSBvbiB0aGUgaXNvbGF0ZWQgbGF5b3V0IChpc3N1ZSAjMTAwMCkuXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgJ1NraXBwaW5nIHRoZSBob2lzdGVkIHJlaW5zdGFsbCBiZWNhdXNlIHRoZSBzZW1hbnRpYy1yZWxlYXNlIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgaW5jbHVkZSBAc2VtYW50aWMtcmVsZWFzZS9ucG0uJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBBIHNpZ25hbCBtYXkgaGF2ZSBhcnJpdmVkIGJldHdlZW4gY2hpbGRyZW4gKG5vdGhpbmcgdG8gZm9yd2FyZCB0byBhdCB0aGF0IGluc3RhbnQpLCBzbyBpdFxuICAgIC8vIG11c3QgYmUgY2hlY2tlZCBleHBsaWNpdGx5IGJlZm9yZSBhbnl0aGluZyBwdWJsaXNoZXMuXG4gICAgaWYgKHJlY2VpdmVkU2lnbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFib3J0ZWQgYnkgJHtyZWNlaXZlZFNpZ25hbH0gYmVmb3JlIHJ1bm5pbmcgdGhlIHJlbGVhc2UuYCk7XG4gICAgfVxuICAgIGV4aXRDb2RlID0gYXdhaXQgcnVuU2VtYW50aWNSZWxlYXNlKHByb2plY3QsIGFyZ3YsIGFjdGl2ZUNoaWxkKTtcbiAgICAvLyBSZWNvcmRlZCBzZXBhcmF0ZWx5IGZyb20gcmVjZWl2ZWRTaWduYWw6IGEgc2lnbmFsIGFycml2aW5nIEFGVEVSIGEgc3VjY2Vzc2Z1bCBwdWJsaXNoIG11c3RcbiAgICAvLyBub3QgZGVtb3RlIHRoZSByZXN0b3JlIHRvIGJ5dGUtZm9yLWJ5dGUgKHRoYXQgd291bGQgcmV2ZXJ0IHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBidW1wcykuXG4gICAgcmVsZWFzZVJhblN1Y2Nlc3NmdWxseSA9IGV4aXRDb2RlID09PSAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEVycm9ycyBtdXN0IHVud2luZCB0aHJvdWdoIHRoaXMgdHJ5IChuZXZlciBgcHJvY2Vzcy5leGl0YCBpbnNpZGUgaXQpOiB0aGUgcmVzdG9yZSBiZWxvdyBpc1xuICAgIC8vIHRoZSBvbmx5IHRoaW5nIHRoYXQgdW5kb2VzIHRoZSBidW5maWcvcGFja2FnZS5qc29uIG11dGF0aW9ucy5cbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChTdHJpbmcoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcikpKTtcbiAgICBleGl0Q29kZSA9IDE7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gT24gZmFpbHVyZSBvciBpbnRlcnJ1cHRpb24sIHJlc3RvcmUgYnl0ZS1mb3ItYnl0ZTogc2VtYW50aWMtcmVsZWFzZSBtYXkgaGF2ZSBsZWZ0IFBBUlRJQUxcbiAgICAvLyBlZGl0cyAoZS5nLiBhIHZlcnNpb24gYnVtcCB3aXRob3V0IGEgcHVibGlzaCksIHdoaWNoIG11c3Qgbm90IHN1cnZpdmUuIFRoZSBzZW1hbnRpY1xuICAgIC8vIHdvcmtzcGFjZS1yYW5nZSByZXN0b3JlIGlzIHJlc2VydmVkIGZvciBhIHN1Y2Nlc3NmdWwgcmVsZWFzZS5cbiAgICBjb25zdCByZXN0b3JlZEZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgY29udGVudF0gb2YgbW9kaWZpZWRGaWxlcykge1xuICAgICAgaWYgKHJlc3RvcmVNb2RpZmllZEZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHJlbGVhc2VSYW5TdWNjZXNzZnVsbHkpKSByZXN0b3JlZEZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgaWYgKHJlc3RvcmVkRmlsZVBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihgUmVzdG9yZWQgJHtyZXN0b3JlZEZpbGVQYXRocy5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBwKSkuam9pbignLCAnKX0uYClcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIFRoZSBoaW50IGFwcGxpZXMgb25seSB3aGVuIHRoZSBob2lzdGVkIHJlaW5zdGFsbCBhY3R1YWxseSByYW47IGJ1bmZpZy50b21sIGlzIHNuYXBzaG90dGVkXG4gICAgLy8gZXhhY3RseSBpbiB0aGF0IGJyYW5jaC5cbiAgICBjb25zdCByZWluc3RhbGxlZFdpdGhIb2lzdGVkTGlua2VyID0gWy4uLm1vZGlmaWVkRmlsZXMua2V5cygpXS5zb21lKFxuICAgICAgKGZpbGVQYXRoKSA9PiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSA9PT0gJ2J1bmZpZy50b21sJ1xuICAgICk7XG4gICAgaWYgKHJlaW5zdGFsbGVkV2l0aEhvaXN0ZWRMaW5rZXIgJiYgIWlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAnbm9kZV9tb2R1bGVzIG5vdyB1c2VzIHRoZSBob2lzdGVkIGxheW91dDsgcnVuIGEgY2xlYW4gcmVpbnN0YWxsIChgcm0gLXJmIG5vZGVfbW9kdWxlcyBwYWNrYWdlcy8qL25vZGVfbW9kdWxlcyAmJiBidW4gaW5zdGFsbGApIHRvIHJlc3RvcmUgdGhlIGlzb2xhdGVkIGxheW91dC4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGd1YXJkZWRTaWduYWxzKSBwcm9jZXNzLm9mZihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICB9XG4gIGlmIChyZWNlaXZlZFNpZ25hbCkge1xuICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgcmVjZWl2ZWRTaWduYWwpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG59XG5cbmludGVyZmFjZSBBY3RpdmVDaGlsZFJlZiB7XG4gIGN1cnJlbnQ6IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNwYXduIGFzeW5jaHJvbm91c2x5IGFuZCBhd2FpdCB0aGUgZXhpdCBzdGF0dXMuIFRoZSBldmVudCBsb29wIHN0YXlzIGZyZWUsIHNvIHBhcmVudC1vbmx5XG4gKiBzaWduYWxzIGFyZSBoYW5kbGVkIHByb21wdGx5IGFuZCBmb3J3YXJkZWQgdG8gdGhlIGNoaWxkIGJ5IHJlbGVhc2UoKSdzIHNpZ25hbCBoYW5kbGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBzcGF3bkFuZFdhaXQoXG4gIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZixcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogY2hpbGRfcHJvY2Vzcy5TcGF3bk9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxudW1iZXI+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsIGFyZ3MsIG9wdGlvbnMpO1xuICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSBjaGlsZDtcbiAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChTdHJpbmcoZXJyb3IpKSk7XG4gICAgICByZXNvbHZlKDEpO1xuICAgIH0pO1xuICAgIGNoaWxkLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlKGNvZGUgPz8gMSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlbGVhc2UgY2FuIHB1Ymxpc2ggdG8gbnBtLiBUcnVlIHVubGVzcyBhIHBsdWdpbiBsaXN0IGlzIGV4cGxpY2l0bHkgY29uZmlndXJlZFxuICogKGluIGEgSlNPTi1wYXJzZWFibGUgc291cmNlKSBhbmQgb21pdHMgYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgZXZlcnl3aGVyZSBpbiBzY29wZSDigJQgdGhlIHJvb3RcbiAqIGFuZCwgZm9yIG11bHRpLXNlbWFudGljLXJlbGVhc2UgbW9ub3JlcG9zLCBlYWNoIHdvcmtzcGFjZSBwYWNrYWdlIChhIHBhY2thZ2UtbGV2ZWwgcGx1Z2luIGxpc3RcbiAqIG92ZXJyaWRlcyB0aGUgcm9vdCdzKS4gc2VtYW50aWMtcmVsZWFzZSdzIERFRkFVTFQgcGx1Z2luIGxpc3QgaW5jbHVkZXMgdGhlIG5wbSBwbHVnaW4sIHNvIGFcbiAqIG1pc3NpbmcgcGx1Z2luIGxpc3QsIGEgbm9uLUpTT04gY29uZmlnIGZpbGUsIG9yIGFuIGBleHRlbmRzYCBwcmVzZXQgY29uc2VydmF0aXZlbHkga2VlcHMgdGhlXG4gKiBucG0gcHJlcGFyYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxlYXNlUHVibGlzaGVzVG9OcG0oXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uJyB8ICd1c2VzQnVuUGFja2FnZU1hbmFnZXInPlxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHJvb3RQbHVnaW5zID0gcmVhZEV4cGxpY2l0U2VtYW50aWNSZWxlYXNlUGx1Z2lucyhwcm9qZWN0LmRpclBhdGgsIHByb2plY3QucGFja2FnZUpzb24pO1xuICAvLyBXaXRob3V0IGFuIGV4cGxpY2l0IHJvb3QgcGx1Z2luIGxpc3QsIHNlbWFudGljLXJlbGVhc2UncyBkZWZhdWx0IGxpc3QgKG5wbSBpbmNsdWRlZCkgYXBwbGllcy5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHJvb3RQbHVnaW5zKSB8fCBwbHVnaW5zSW5jbHVkZU5wbShyb290UGx1Z2lucykpIHJldHVybiB0cnVlO1xuXG4gIGZvciAoY29uc3QgcGFja2FnZURpclBhdGggb2YgYXdhaXQgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzKHByb2plY3QpKSB7XG4gICAgY29uc3QgcGx1Z2lucyA9IHJlYWRFeHBsaWNpdFNlbWFudGljUmVsZWFzZVBsdWdpbnMocGFja2FnZURpclBhdGgsIHVuZGVmaW5lZCk7XG4gICAgLy8gQSB3b3Jrc3BhY2UgcGFja2FnZSB3aXRob3V0IGl0cyBvd24gcGx1Z2luIGxpc3QgaW5oZXJpdHMgdGhlIHJvb3QncyAobnBtLWZyZWUpIGRlY2lzaW9uLlxuICAgIGlmIChwbHVnaW5zID09PSAndW5rbm93bicgfHwgKEFycmF5LmlzQXJyYXkocGx1Z2lucykgJiYgcGx1Z2luc0luY2x1ZGVOcG0ocGx1Z2lucykpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBsdWdpbnNJbmNsdWRlTnBtKHBsdWdpbnM6IHJlYWRvbmx5IHVua25vd25bXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGx1Z2lucy5zb21lKChwbHVnaW4pID0+IChBcnJheS5pc0FycmF5KHBsdWdpbikgPyBwbHVnaW5bMF0gOiBwbHVnaW4pID09PSAnQHNlbWFudGljLXJlbGVhc2UvbnBtJyk7XG59XG5cbi8qKlxuICogY29zbWljb25maWcgOSdzIGRlZmF1bHQgc2VhcmNoUGxhY2VzIG9yZGVyIGZvciBtb2R1bGUgXCJyZWxlYXNlXCIgKHdoYXQgc2VtYW50aWMtcmVsZWFzZSAyNVxuICogZGVsZWdhdGVzIHRvKSwgbWludXMgdGhlIGxlYWRpbmcgcGFja2FnZS5qc29uIGVudHJ5LCB3aGljaCB0aGUgY2FsbGVyIGNoZWNrcyBmaXJzdC4gVGhlIEZJUlNUXG4gKiBleGlzdGluZyBwbGFjZSB3aW5zOyBwbGFjZXMgd2hvc2UgZm9ybWF0IEpTT04ucGFyc2UgY2Fubm90IHJlYWQgbWFrZSB0aGUgZWZmZWN0aXZlIHBsdWdpblxuICogbGlzdCAndW5rbm93bicuXG4gKi9cbmNvbnN0IHNlbWFudGljUmVsZWFzZUNvbmZpZ1NlYXJjaFBsYWNlczogeyBmaWxlTmFtZTogc3RyaW5nOyBqc29uUGFyc2VhYmxlOiBib29sZWFuIH1bXSA9IFtcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMnLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzb24nLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnlhbWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy55bWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnRzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMubWpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuY2pzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjJywganNvblBhcnNlYWJsZTogdHJ1ZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMuanNvbicsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLnlhbWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMueW1sJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLnRzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLm1qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcuY29uZmlnL3JlbGVhc2VyYy5janMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcuanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcudHMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcubWpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJ3JlbGVhc2UuY29uZmlnLmNqcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG5dO1xuXG5mdW5jdGlvbiByZWFkRXhwbGljaXRTZW1hbnRpY1JlbGVhc2VQbHVnaW5zKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZFxuKTogcmVhZG9ubHkgdW5rbm93bltdIHwgdW5kZWZpbmVkIHwgJ3Vua25vd24nIHtcbiAgLy8gY29zbWljb25maWcgc2VhcmNoZXMgcGFja2FnZS5qc29uJ3MgYHJlbGVhc2VgIGtleSBCRUZPUkUgYW55IHJjL2NvbmZpZyBmaWxlOyBhIG1pc3Npbmcgb3JcbiAgLy8gdW5yZWFkYWJsZSBwYWNrYWdlLmpzb24ganVzdCBmYWxscyB0aHJvdWdoIHRvIHRoZSBmaWxlIHNlYXJjaCBwbGFjZXMuXG4gIGlmIChwYWNrYWdlSnNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgfSBjYXRjaCB7XG4gICAgICBwYWNrYWdlSnNvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgbGV0IGNvbmZpZyA9IChwYWNrYWdlSnNvbiBhcyB7IHJlbGVhc2U/OiB7IHBsdWdpbnM/OiB1bmtub3duOyBleHRlbmRzPzogdW5rbm93biB9IH0gfCB1bmRlZmluZWQpPy5yZWxlYXNlO1xuICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHsgZmlsZU5hbWUsIGpzb25QYXJzZWFibGUgfSBvZiBzZW1hbnRpY1JlbGVhc2VDb25maWdTZWFyY2hQbGFjZXMpIHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSBjb250aW51ZTtcbiAgICAgIGlmICghanNvblBhcnNlYWJsZSkgcmV0dXJuICd1bmtub3duJztcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpIGFzIHR5cGVvZiBjb25maWc7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuICd1bmtub3duJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoIWNvbmZpZyB8fCB0eXBlb2YgY29uZmlnICE9PSAnb2JqZWN0JykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLnBsdWdpbnMpKSByZXR1cm4gY29uZmlnLnBsdWdpbnM7XG4gIC8vIEFuIGBleHRlbmRzYCBwcmVzZXQgbWF5IGNvbnRyaWJ1dGUgaXRzIG93biBwbHVnaW4gbGlzdCwgd2hpY2ggY2Fubm90IGJlIHJlc29sdmVkIHN0YXRpY2FsbHkuXG4gIHJldHVybiBjb25maWcuZXh0ZW5kcyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogJ3Vua25vd24nO1xufVxuXG4vKipcbiAqIE1ha2UgdGhlIGNoZWNrb3V0IGRpZ2VzdGlibGUgZm9yIG5wbSwgd2hpY2ggc2VtYW50aWMtcmVsZWFzZSdzIG5wbSBwbHVnaW4gc2hlbGxzIG91dCB0byBmb3JcbiAqIGBucG0gdmVyc2lvbmAgLyBgbnBtIHB1Ymxpc2hgOlxuICogMS4gbnBtJ3MgYXJib3Jpc3QgY2Fubm90IHdhbGsgQnVuJ3MgSVNPTEFURUQgbm9kZV9tb2R1bGVzIGxheW91dCAodGhlIGAuYnVuYCBzeW1saW5rIGZhcm0pLCBzb1xuICogICAgY2xlYW4tcmVpbnN0YWxsIHdpdGggdGhlIGhvaXN0ZWQgbGlua2VyIGZpcnN0LiBBIG5vbi1jbGVhbiBsaW5rZXIgc3dpdGNoIHdvdWxkIGxlYXZlIHN0YWxlXG4gKiAgICBnbG9iYWwtc3RvcmUgc3ltbGlua3MgYmVoaW5kIChwYWNrYWdlcyB0aGVuIHJlc29sdmUgZnJvbSB+Ly5idW4vaW5zdGFsbC9jYWNoZS9saW5rcyB3aGVyZVxuICogICAgcGhhbnRvbSBkZXBlbmRlbmNpZXMgYXJlIHVucmVhY2hhYmxlKSwgc28gZXZlcnkgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBpcyB3aXBlZCBmaXJzdC5cbiAqIDIuIG5wbSBjYW5ub3QgcGFyc2UgYHdvcmtzcGFjZTpgIHNwZWNpZmllcnMsIHdoaWxlIEJ1biBSRVFVSVJFUyB0aGUgcHJvdG9jb2wgc28gYSBjb2xkIGluc3RhbGxcbiAqICAgIGxpbmtzIHRoZSB3b3Jrc3BhY2Ug4oCUIHNvIHJld3JpdGUgdGhlIHJhbmdlcyB0byBgKmAgQUZURVIgdGhlIHJlaW5zdGFsbCAoQnVuIG11c3Qgc3RpbGwgc2VlXG4gKiAgICB0aGUgcHJvdG9jb2wgd2hpbGUgaW5zdGFsbGluZzsgbnBtIG9ubHkgbmVlZHMgdGhlIG1hbmlmZXN0IFRFWFQgdG8gYmUgcGFyc2VhYmxlKS4gVGhlXG4gKiAgICBhZmZlY3RlZCBtYW5pZmVzdHMgYXJlIHByaXZhdGUvdW5wdWJsaXNoZWQgb3IgcmV3cml0dGVuIGJ5IHRoZSBucG0gcGx1Z2luIG9uIHB1Ymxpc2guXG4gKiBBbGwgbXV0YXRpb25zIGFyZSByZXN0b3JlZCBieSB0aGUgY2FsbGVyIGFmdGVyIHRoZSByZWxlYXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBwcmVwYXJlTnBtQ29tcGF0aWJsZUxheW91dChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUmVsZWFzZUFyZ3YsXG4gIG1vZGlmaWVkRmlsZXM6IE1hcDxzdHJpbmcsIEJ1ZmZlciB8IHVuZGVmaW5lZD4sXG4gIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJ1bmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgY29uc3QgYnVuZmlnID0gZnMuZXhpc3RzU3luYyhidW5maWdQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhidW5maWdQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICBjb25zdCBob2lzdGVkQnVuZmlnID0gYnVuZmlnID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBidWlsZEhvaXN0ZWRCdW5maWcoYnVuZmlnKTtcbiAgaWYgKGJ1bmZpZyAhPT0gdW5kZWZpbmVkICYmIGhvaXN0ZWRCdW5maWcgIT09IGJ1bmZpZykge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKCdDbGVhbi1yZWluc3RhbGxpbmcgd2l0aCB0aGUgaG9pc3RlZCBsaW5rZXIgc28gbnBtIGNhbiB3YWxrIG5vZGVfbW9kdWxlcy4uLicpKTtcbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICBtb2RpZmllZEZpbGVzLnNldChidW5maWdQYXRoLCBCdWZmZXIuZnJvbShidW5maWcsICd1dGY4JykpO1xuICAgICAgLy8gVGhlIGhvaXN0ZWQgcmVpbnN0YWxsIG1heSByZXdyaXRlIChvciBjcmVhdGUpIHRoZSBsb2NrZmlsZTsgc25hcHNob3QgdGhlIHJhdyBieXRlcyBzbyBhXG4gICAgICAvLyBzdWNjZXNzZnVsIHJlbGVhc2UgbGVhdmVzIG5vIHRyYWNrZWQgb3IgdW50cmFja2VkIGxvY2tmaWxlIGNoYW5nZXMgYmVoaW5kLlxuICAgICAgZm9yIChjb25zdCBsb2NrRmlsZU5hbWUgb2YgWydidW4ubG9jaycsICdidW4ubG9ja2InXSkge1xuICAgICAgICBjb25zdCBsb2NrRmlsZVBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBsb2NrRmlsZU5hbWUpO1xuICAgICAgICBtb2RpZmllZEZpbGVzLnNldChsb2NrRmlsZVBhdGgsIGZzLmV4aXN0c1N5bmMobG9ja0ZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhsb2NrRmlsZVBhdGgpIDogdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoYnVuZmlnUGF0aCwgaG9pc3RlZEJ1bmZpZyA/PyAnJywgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5vZGVNb2R1bGVzRGlyUGF0aHMgPSBbcHJvamVjdC5kaXJQYXRoLCAuLi4oYXdhaXQgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzKHByb2plY3QpKV0ubWFwKChkaXJQYXRoKSA9PlxuICAgICAgICBwYXRoLmpvaW4oZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycpXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBub2RlTW9kdWxlc0RpclBhdGggb2Ygbm9kZU1vZHVsZXNEaXJQYXRocykge1xuICAgICAgICBmcy5ybVN5bmMobm9kZU1vZHVsZXNEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICAvLyBSZXNvbHZlIGFuZCBkb3dubG9hZCB3aXRoIGxpZmVjeWNsZSBzY3JpcHRzIERJU0FCTEVEIHdoaWxlIHRoZSByZWxlYXNlIGNyZWRlbnRpYWxzXG4gICAgICAvLyAoVkVSREFDQ0lPX1RPS0VOLCBOUE1fVE9LRU4sIEdJVEhVQl9UT0tFTiwgRk5PWF9BR0VfS0VZLCAuLi4pIGFyZSBpbiB0aGUgZW52aXJvbm1lbnQsXG4gICAgICAvLyBzbyByZXBvc2l0b3J5LSBvciBkZXBlbmRlbmN5LWRlZmluZWQgcHJlaW5zdGFsbC9wb3N0aW5zdGFsbCBjYW4gbmV2ZXIgcmVhZCB0aGVtIOKAlFxuICAgICAgLy8gbWlycm9yaW5nIHJldXNhYmxlLXdvcmtmbG93cycgdHdvLXN0ZXAgcmVsZWFzZSBpbnN0YWxsIChpc3N1ZSAjMTAwMykuXG4gICAgICBjb25zdCBpbnN0YWxsU3RhdHVzID0gYXdhaXQgc3Bhd25BbmRXYWl0KGFjdGl2ZUNoaWxkLCAnYnVuJywgWydpbnN0YWxsJywgJy0taWdub3JlLXNjcmlwdHMnXSwge1xuICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgaWYgKGluc3RhbGxTdGF0dXMgIT09IDApIHtcbiAgICAgICAgLy8gVGhyb3dpbmcgKGluc3RlYWQgb2YgcHJvY2Vzcy5leGl0LCB3aGljaCB3b3VsZCBza2lwIHRoZSBjYWxsZXIncyBmaW5hbGx5KSBsZXRzIHRoZVxuICAgICAgICAvLyByZXN0b3JlIHJ1biBiZWZvcmUgdGhlIHByb2Nlc3MgdGVybWluYXRlcy5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdidW4gaW5zdGFsbCBmYWlsZWQgd2hpbGUgcHJlcGFyaW5nIHRoZSByZWxlYXNlLicpO1xuICAgICAgfVxuICAgICAgLy8gUmVwbGF5IHRoZSBza2lwcGVkIGxpZmVjeWNsZSBzY3JpcHRzIGluIGEgY3JlZGVudGlhbC1zY3J1YmJlZCBlbnZpcm9ubWVudC4gQSByZXBlYXRlZFxuICAgICAgLy8gYGJ1biBpbnN0YWxsYCBpcyBhIG5vLW9wIHRoYXQgZG9lcyBub3QgcmVwbGF5IHRoZW0sIHNvIG5vZGVfbW9kdWxlcyBpcyB3aXBlZCBhZ2FpbjtcbiAgICAgIC8vIGV2ZXJ5IHBhY2thZ2UgaXMgYWxyZWFkeSBpbiBidW4ncyBjYWNoZSBmcm9tIHRoZSBjcmVkZW50aWFsZWQgc3RlcCwgc28gdGhpcyByZS1saW5rXG4gICAgICAvLyBuZWVkcyBubyByZWdpc3RyeSBjcmVkZW50aWFscy5cbiAgICAgIGZvciAoY29uc3Qgbm9kZU1vZHVsZXNEaXJQYXRoIG9mIG5vZGVNb2R1bGVzRGlyUGF0aHMpIHtcbiAgICAgICAgZnMucm1TeW5jKG5vZGVNb2R1bGVzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVwbGF5U3RhdHVzID0gYXdhaXQgc3Bhd25BbmRXYWl0KGFjdGl2ZUNoaWxkLCAnYnVuJywgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgIGVudjogYnVpbGRDcmVkZW50aWFsRnJlZUVudihwcm9qZWN0LmVudiksXG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXBsYXlTdGF0dXMgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdidW4gaW5zdGFsbCBmYWlsZWQgd2hpbGUgcmVwbGF5aW5nIGxpZmVjeWNsZSBzY3JpcHRzIGZvciB0aGUgcmVsZWFzZS4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB3b3Jrc3BhY2VQYWNrYWdlRGlycyA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyhwcm9qZWN0KTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgW1xuICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoLFxuICAgIC4uLndvcmtzcGFjZVBhY2thZ2VEaXJzLm1hcCgoZGlyUGF0aCkgPT4gcGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gIF0pIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgY29udGludWU7XG5cbiAgICBjb25zdCBvcmlnaW5hbCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgLy8gU25hcHNob3QgRVZFUlkgbWFuaWZlc3QgKG5vdCBvbmx5IHJld3JpdHRlbiBvbmVzKTogc2VtYW50aWMtcmVsZWFzZSBhbHNvIGVkaXRzIG1hbmlmZXN0c1xuICAgIC8vIHdpdGhvdXQgd29ya3NwYWNlOiByYW5nZXMgKHZlcnNpb24gYnVtcHMpLCBhbmQgYSBmYWlsZWQgcmVsZWFzZSBtdXN0IHJlc3RvcmUgdGhvc2UgdG9vLlxuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIG1vZGlmaWVkRmlsZXMuc2V0KHBhY2thZ2VKc29uUGF0aCwgQnVmZmVyLmZyb20ob3JpZ2luYWwsICd1dGY4JykpO1xuICAgIH1cbiAgICBjb25zdCByZXdyaXR0ZW4gPSByZXdyaXRlV29ya3NwYWNlUmFuZ2VzKG9yaWdpbmFsKTtcbiAgICBpZiAocmV3cml0dGVuID09PSBvcmlnaW5hbCkgY29udGludWU7XG5cbiAgICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgUmV3cml0aW5nIHdvcmtzcGFjZTogcmFuZ2VzIGluICR7cGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIHBhY2thZ2VKc29uUGF0aCl9Li4uYCkpO1xuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCByZXdyaXR0ZW4sICd1dGY4Jyk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBjcmVkZW50aWFscyB0aGUgcmVsZWFzZSB3b3JrZmxvdyBpbmplY3RzIChjZi4gcmV1c2FibGUtd29ya2Zsb3dzJyByZWxlYXNlLnltbCBzZWNyZXRzIGFuZFxuLy8gbnBtJ3Mgb3duIHRva2VuIHZhcmlhYmxlcykuIFRoZSByZWxlYXNlIGNvbW1hbmQgbG9hZHMgdGhlIHByb2plY3Qgd2l0aCBsb2FkRW52OiBmYWxzZSwgc28gbm9cbi8vIHdiLWxvYWRlci1pbmplY3RlZCBrZXlzIGV4aXN0IHRvIHNjcnViIGJleW9uZCB0aGVzZS4gQSBkZW55bGlzdCAobm90IGFuIGFsbG93bGlzdCkgaXNcbi8vIGRlbGliZXJhdGU6IGluIHRoZSBzdXBwb3J0ZWQgZW50cnkgcG9pbnQg4oCUIHJldXNhYmxlLXdvcmtmbG93cycgcmVsZWFzZSBqb2Ig4oCUIHRoZXNlIGVudW1lcmF0ZWRcbi8vIHZhcmlhYmxlcyBhcmUgdGhlIE9OTFkgc2VjcmV0cyBpbiB0aGUgYW1iaWVudCBlbnZpcm9ubWVudCAoZm5veCBzZWNyZXRzIHN0YXkgZW5jcnlwdGVkIGJlY2F1c2Vcbi8vIEZOT1hfQUdFX0tFWSBpcyBzY3J1YmJlZCBhbmQgbmV2ZXIgZXhwb3J0ZWQgYXMgcGxhaW50ZXh0IHRoZXJlKSwgd2hpbGUgYW4gYWxsb3dsaXN0IHdvdWxkXG4vLyBicmVhayBsaWZlY3ljbGUgc2NyaXB0cyB0aGF0IGxlZ2l0aW1hdGVseSByZWFkIG9wZXJhdGlvbmFsIHZhcmlhYmxlcyAoUEFUSCwgSE9NRSwgQ0ksIC4uLikuXG4vLyBBIGxvY2FsIGB3YiByZWxlYXNlYCBpbmhlcml0cyB3aGF0ZXZlciB0aGUgZGV2ZWxvcGVyJ3Mgc2hlbGwgYWxyZWFkeSBleHBvc2VzIHRvIGV2ZXJ5XG4vLyBgYnVuIGluc3RhbGxgLCB3aGljaCB0aGlzIHJlcGxheSBkb2VzIG5vdCB3aWRlbi5cbmNvbnN0IGNyZWRlbnRpYWxFbnZWYXJOYW1lcyA9IFtcbiAgJ1ZFUkRBQ0NJT19UT0tFTicsXG4gICdOUE1fVE9LRU4nLFxuICAnTk9ERV9BVVRIX1RPS0VOJyxcbiAgJ0dJVEhVQl9UT0tFTicsXG4gICdHSF9UT0tFTicsXG4gICdHSF9QQUNLQUdFU19UT0tFTicsXG4gICdHSF9QS0dfUkVBRF9UT0tFTicsXG4gICdGTk9YX0FHRV9LRVknLFxuXTtcblxuLyoqXG4gKiBBIGNvcHkgb2YgYGVudmAgc2FmZSB0byBleHBvc2UgdG8gZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cy4gQ3JlZGVudGlhbCB2YXJpYWJsZXMgYXJlXG4gKiBFTVBUSUVEIHJhdGhlciB0aGFuIGRlbGV0ZWQgc28gYCR7VkVSREFDQ0lPX1RPS0VOfWAtc3R5bGUgcmVmZXJlbmNlcyBpbiAubnBtcmMga2VlcCBleHBhbmRpbmdcbiAqIHRvICcnIGluc3RlYWQgb2YgY3Jhc2hpbmcgdGhlIGluc3RhbGwgKHRoZSBwYXR0ZXJuIHJldXNhYmxlLXdvcmtmbG93cyByZWxpZXMgb24pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDcmVkZW50aWFsRnJlZUVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc2NydWJiZWRFbnYgPSB7IC4uLmVudiB9O1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgY3JlZGVudGlhbEVudlZhck5hbWVzKSB7XG4gICAgaWYgKG5hbWUgaW4gc2NydWJiZWRFbnYpIHNjcnViYmVkRW52W25hbWVdID0gJyc7XG4gIH1cbiAgcmV0dXJuIHNjcnViYmVkRW52O1xufVxuXG4vKipcbiAqIFVuZG8gdGhlIHRlbXBvcmFyeSByZWxlYXNlLXRpbWUgbXV0YXRpb25zIG9mIG9uZSBmaWxlLiBgcGFja2FnZS5qc29uYCBmaWxlcyBhcmUgcmVzdG9yZWRcbiAqIHNlbWFudGljYWxseSBpbnN0ZWFkIG9mIGJ5dGUtZm9yLWJ5dGU6IHNlbWFudGljLXJlbGVhc2UncyBucG0gcGx1Z2luIHdyaXRlcyB0aGUgcmVsZWFzZWRcbiAqIHZlcnNpb24gaW50byBtYW5pZmVzdHMgd2hpbGUgdGhleSBob2xkIHRoZSByZXdyaXR0ZW4gcmFuZ2VzLCBhbmQgYSBieXRlIHJlc3RvcmUgd291bGQgc2lsZW50bHlcbiAqIHJldmVydCB0aGF0IGJ1bXAg4oCUIHNvIHdoZW4gdGhlIGZpbGUgY2hhbmdlZCBkdXJpbmcgdGhlIHJlbGVhc2UsIG9ubHkgdGhlIGB3b3Jrc3BhY2U6YFxuICogc3BlY2lmaWVycyBhcmUgd3JpdHRlbiBiYWNrIGludG8gdGhlIENVUlJFTlQgY29udGVudC5cbiAqL1xuLyoqIFJldHVybnMgd2hldGhlciB0aGUgb24tZGlzayBjb250ZW50IGFjdHVhbGx5IGNoYW5nZWQgKGRyaXZlcyB0aGUgXCJSZXN0b3JlZCAuLi5cIiBtZXNzYWdlKS4gKi9cbmZ1bmN0aW9uIHJlc3RvcmVNb2RpZmllZEZpbGUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG9yaWdpbmFsQ29udGVudDogQnVmZmVyIHwgdW5kZWZpbmVkLFxuICByZWxlYXNlU3VjY2VlZGVkOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgaWYgKG9yaWdpbmFsQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZXhpc3RlZCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpO1xuICAgIGZzLnJtU3luYyhmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZXhpc3RlZDtcbiAgfVxuICBpZiAocmVsZWFzZVN1Y2NlZWRlZCAmJiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSA9PT0gJ3BhY2thZ2UuanNvbicgJiYgZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBvcmlnaW5hbENvbnRlbnQudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICBpZiAoY3VycmVudENvbnRlbnQgIT09IHJld3JpdGVXb3Jrc3BhY2VSYW5nZXMob3JpZ2luYWxUZXh0KSkge1xuICAgICAgY29uc3QgcmVzdG9yZWRDb250ZW50ID0gcmVzdG9yZVdvcmtzcGFjZVJhbmdlcyhjdXJyZW50Q29udGVudCwgb3JpZ2luYWxUZXh0KTtcbiAgICAgIGlmIChyZXN0b3JlZENvbnRlbnQgPT09IGN1cnJlbnRDb250ZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCByZXN0b3JlZENvbnRlbnQsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgY3VycmVudEJ1ZmZlciA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGN1cnJlbnRCdWZmZXI/LmVxdWFscyhvcmlnaW5hbENvbnRlbnQpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFdyaXRlIHRoZSBzbmFwc2hvdCBieXRlcyB2ZXJiYXRpbTogYnVuLmxvY2tiIGlzIGJpbmFyeSwgc28gYW55IHRleHQgZGVjb2RlL2VuY29kZSByb3VuZCB0cmlwXG4gIC8vIHdvdWxkIGNvcnJ1cHQgaXQuXG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIG9yaWdpbmFsQ29udGVudCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRIb2lzdGVkQnVuZmlnKGJ1bmZpZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1bmZpZ1xuICAgIC5yZXBsYWNlKC9eKFxccypsaW5rZXJcXHMqPVxccyopW1wiJ11pc29sYXRlZFtcIiddL211LCAnJDFcImhvaXN0ZWRcIicpXG4gICAgLnJlcGxhY2UoL15cXHMqZ2xvYmFsU3RvcmVcXHMqPVxccyp0cnVlW15cXG5dKlxcbj8vbXUsICcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJld3JpdGVXb3Jrc3BhY2VSYW5nZXMocGFja2FnZUpzb25Db250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBPcGVyYXRlIG9ubHkgaW5zaWRlIHRoZSBkZXBlbmRlbmN5IHNlY3Rpb25zOiBhIGJsYW5rZXQgYFwid29ya3NwYWNlOi4uLlwiYCByZXBsYWNlbWVudCB3b3VsZFxuICAvLyBhbHNvIGNvcnJ1cHQgdW5yZWxhdGVkIHN0cmluZyB2YWx1ZXMgKGUuZy4gYSBkZXNjcmlwdGlvbiBzdGFydGluZyB3aXRoIGB3b3Jrc3BhY2U6YCksIGFuZCBhXG4gIC8vIG5hbWUta2V5ZWQgZ2xvYmFsIHJlcGxhY2VtZW50IHdvdWxkIHRvdWNoIHNhbWUtbmFtZWQga2V5cyBpbiBvdGhlciBzZWN0aW9ucyAoZS5nLiBvdmVycmlkZXMpLlxuICByZXR1cm4gcmVwbGFjZUluRGVwZW5kZW5jeVNlY3Rpb25zKHBhY2thZ2VKc29uQ29udGVudCwgKHNlY3Rpb24pID0+XG4gICAgc2VjdGlvbi5yZXBsYWNlQWxsKC8oXCJbXlwiXFxuXStcIlxccyo6XFxzKilcIndvcmtzcGFjZTpbXlwiXSpcIi9ndSwgJyQxXCIqXCInKVxuICApO1xufVxuXG4vKipcbiAqIFJlLWFwcGx5IHRoZSBvcmlnaW5hbCBgd29ya3NwYWNlOmAgc3BlY2lmaWVycyB0byB0aGUgQ1VSUkVOVCBtYW5pZmVzdCBjb250ZW50LiBNYXRjaGluZyBrZXlzXG4gKiBvZmYgdGhlIGRlcGVuZGVuY3kgTkFNRSAobm90IHRoZSBgXCIqXCJgIHBsYWNlaG9sZGVyKSBpcyBkZWxpYmVyYXRlOiBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ3NcbiAqIHByZXBhcmUgc3RlcCBvdmVyd3JpdGVzIGxvY2FsIGRlcGVuZGVuY3kgc3BlY2lmaWVycyB3aXRoIGNvbmNyZXRlIHJlbGVhc2VkIHZlcnNpb25zLCBhbmQgdGhlXG4gKiBjb21taXR0ZWQgbWFuaWZlc3QgbXVzdCBnZXQgaXRzIGB3b3Jrc3BhY2U6YCBwcm90b2NvbCBiYWNrIHJlZ2FyZGxlc3Mg4oCUIEJ1biByZXF1aXJlcyB0aGVcbiAqIHByb3RvY29sIHNvIGEgY29sZCBpbnN0YWxsIGxpbmtzIHRoZSB3b3Jrc3BhY2UgaW5zdGVhZCBvZiByZXNvbHZpbmcgYSByZWdpc3RyeSBjb3B5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzdG9yZVdvcmtzcGFjZVJhbmdlcyhjdXJyZW50Q29udGVudDogc3RyaW5nLCBvcmlnaW5hbENvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmtzcGFjZURlcGVuZGVuY2llcyA9IGNvbGxlY3RXb3Jrc3BhY2VEZXBlbmRlbmNpZXMob3JpZ2luYWxDb250ZW50KTtcbiAgLy8gUmVzdG9yZSBwZXIgKHNlY3Rpb24sIG5hbWUpOiBhIHNhbWUtbmFtZWQgZGVwZW5kZW5jeSBpbiBhbm90aGVyIHNlY3Rpb24gbWF5IGxlZ2l0aW1hdGVseVxuICAvLyBob2xkIGEgbm9uLXdvcmtzcGFjZSByYW5nZSAoZS5nLiBhIHBlZXJEZXBlbmRlbmNpZXMgYD49MS4wLjBgIG5leHQgdG8gYSBkZXZEZXBlbmRlbmNpZXNcbiAgLy8gYHdvcmtzcGFjZToqYCkgb3IgYSBkaWZmZXJlbnQgd29ya3NwYWNlIHJhbmdlLCBhbmQgbXVzdCBrZWVwIGl0cyBvd24gdmFsdWUuXG4gIHJldHVybiByZXBsYWNlSW5EZXBlbmRlbmN5U2VjdGlvbnMoY3VycmVudENvbnRlbnQsIChzZWN0aW9uLCBzZWN0aW9uS2V5KSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9IHNlY3Rpb247XG4gICAgZm9yIChjb25zdCB7IHNlY3Rpb246IGRlcGVuZGVuY3lTZWN0aW9uLCBuYW1lLCBzcGVjaWZpZXIgfSBvZiB3b3Jrc3BhY2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgIGlmIChkZXBlbmRlbmN5U2VjdGlvbiAhPT0gc2VjdGlvbktleSkgY29udGludWU7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbChcbiAgICAgICAgbmV3IFJlZ0V4cChgKFwiJHtlc2NhcGVSZWdFeHAobmFtZSl9XCJcXFxccyo6XFxcXHMqKVwiW15cIl0qXCJgLCAnZ3UnKSxcbiAgICAgICAgLy8gQSByZXBsYWNlciBmdW5jdGlvbiwgbm90IGEgcmVwbGFjZW1lbnQgc3RyaW5nOiBzcGVjaWZpZXJzIGNvbnRhaW5pbmcgYCRgIG11c3QgYmVcbiAgICAgICAgLy8gaW5zZXJ0ZWQgbGl0ZXJhbGx5IGluc3RlYWQgb2YgYmVpbmcgaW50ZXJwcmV0ZWQgYXMgc3Vic3RpdHV0aW9uIHBhdHRlcm5zLlxuICAgICAgICAoX21hdGNoLCBwcmVmaXg6IHN0cmluZykgPT4gYCR7cHJlZml4fSR7SlNPTi5zdHJpbmdpZnkoc3BlY2lmaWVyKX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbn1cblxuLyoqIERlcGVuZGVuY3kgc2VjdGlvbnMgY29udGFpbiBvbmx5IGBcIm5hbWVcIjogXCJzcGVjaWZpZXJcImAgc3RyaW5nIHBhaXJzLCBzbyBgW157fV0qYCBzcGFucyB0aGVtLiAqL1xuZnVuY3Rpb24gcmVwbGFjZUluRGVwZW5kZW5jeVNlY3Rpb25zKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIHJlcGxhY2VTZWN0aW9uOiAoc2VjdGlvbjogc3RyaW5nLCBzZWN0aW9uS2V5OiBzdHJpbmcpID0+IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZUFsbChcbiAgICAvKFwiKGRlcGVuZGVuY2llc3xkZXZEZXBlbmRlbmNpZXN8b3B0aW9uYWxEZXBlbmRlbmNpZXN8cGVlckRlcGVuZGVuY2llcylcIlxccyo6XFxzKlxceykoW157fV0qKShcXH0pL2d1LFxuICAgIChfbWF0Y2gsIHByZWZpeDogc3RyaW5nLCBzZWN0aW9uS2V5OiBzdHJpbmcsIGJvZHk6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpID0+XG4gICAgICBgJHtwcmVmaXh9JHtyZXBsYWNlU2VjdGlvbihib2R5LCBzZWN0aW9uS2V5KX0ke3N1ZmZpeH1gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RXb3Jrc3BhY2VEZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uQ29udGVudDogc3RyaW5nXG4pOiB7IHNlY3Rpb246IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzcGVjaWZpZXI6IHN0cmluZyB9W10ge1xuICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uO1xuICB0cnkge1xuICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvbkNvbnRlbnQpIGFzIFBhY2thZ2VKc29uO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jaWVzOiB7IHNlY3Rpb246IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzcGVjaWZpZXI6IHN0cmluZyB9W10gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdCkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlSnNvbltrZXldID8/IHt9KSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHsgc2VjdGlvbjoga2V5LCBuYW1lLCBzcGVjaWZpZXI6IHZhbHVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvWyQoKSorLj9bXFxcXFxcXV57fH1dL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZW1hbnRpY1JlbGVhc2UocHJvamVjdDogUHJvamVjdCwgYXJndjogUmVsZWFzZUFyZ3YsIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGZvcndhcmRlZEFyZ3MgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2WyctLSddID8/IFtdKV0ubWFwKFN0cmluZyk7XG4gIC8vIFRoZSBQQUNLQUdFIG5hbWUgKGZvciBgYnVueGAvYHlhcm4gZGx4YCwgd2hpY2ggZmV0Y2ggYSBwYWNrYWdlKSBhbmQgdGhlIEJJTiBuYW1lIChmb3IgdGhlXG4gIC8vIGxvY2FsIG5vZGVfbW9kdWxlcy8uYmluIGxvb2t1cCkgZGlmZmVyIGZvciB0aGUgc2NvcGVkIGZvcmtzOiBgYnVueCBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlYFxuICAvLyB3b3VsZCBmZXRjaCB0aGUgdW5yZWxhdGVkIHVuc2NvcGVkIG5wbSBwYWNrYWdlIGluc3RlYWQgb2YgZS5nLiBAYW5vbGlsYWIncyBmb3JrLlxuICBjb25zdCByZWxlYXNlUGFja2FnZU5hbWUgPSAoXG4gICAgWydAYW5vbGlsYWIvbXVsdGktc2VtYW50aWMtcmVsZWFzZScsICdtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJywgJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXSBhcyBjb25zdFxuICApLmZpbmQoKHBhY2thZ2VOYW1lKSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSk7XG4gIGNvbnN0IHJlbGVhc2VCaW4gPSByZWxlYXNlUGFja2FnZU5hbWUgPyAnbXVsdGktc2VtYW50aWMtcmVsZWFzZScgOiAnc2VtYW50aWMtcmVsZWFzZSc7XG5cbiAgLy8gVGhlIHByb2plY3QgaXMgbG9hZGVkIHdpdGggbG9hZEVudjogZmFsc2UgKHNlbWFudGljLXJlbGVhc2UgcnVucyB3aXRoIHRoZSBhbWJpZW50L0NJXG4gIC8vIGVudmlyb25tZW50IGJ5IGRlc2lnbiksIHNvIHByb2plY3QuZW52IGFsaWFzZXMgcHJvY2Vzcy5lbnYgaGVyZTsgdXNpbmcgaXQga2VlcHMgdGhlXG4gIC8vIHByb2plY3QuZW52IGNvbnZlbnRpb24gYW5kIHBpY2tzIHVwIGVudiBsb2FkaW5nIGlmIHRoYXQgZGVzaWduIGV2ZXIgY2hhbmdlcy5cbiAgY29uc3QgZW52ID0geyAuLi5wcm9qZWN0LmVudiB9O1xuICBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGgocHJvamVjdC5kaXJQYXRoLCBlbnYpO1xuICBjb25zdCBoYXNMb2NhbEJpbiA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJywgcmVsZWFzZUJpbikpO1xuICBjb25zdCBmYWxsYmFja1BhY2thZ2VOYW1lID0gcmVsZWFzZVBhY2thZ2VOYW1lID8/ICdzZW1hbnRpYy1yZWxlYXNlJztcbiAgY29uc3QgY29tbWFuZCA9IGhhc0xvY2FsQmluXG4gICAgPyBbcmVsZWFzZUJpbiwgLi4uZm9yd2FyZGVkQXJnc11cbiAgICA6IHByb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kID09PSAnYnVuJ1xuICAgICAgPyBbJ2J1bngnLCBmYWxsYmFja1BhY2thZ2VOYW1lLCAuLi5mb3J3YXJkZWRBcmdzXVxuICAgICAgOiBbJ3lhcm4nLCAnZGx4JywgZmFsbGJhY2tQYWNrYWdlTmFtZSwgLi4uZm9yd2FyZGVkQXJnc107XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiAke2NvbW1hbmQuam9pbignICcpfWApKTtcbiAgaWYgKGFyZ3YuZHJ5UnVuKSByZXR1cm4gMDtcblxuICByZXR1cm4gYXdhaXQgc3Bhd25BbmRXYWl0KGFjdGl2ZUNoaWxkLCBjb21tYW5kWzBdISwgY29tbWFuZC5zbGljZSgxKSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudixcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgcmV0cnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbWF4aW11bSByZXRyeSBjb3VudCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgYWxpYXM6ICdyJyxcbiAgICBkZWZhdWx0OiAzLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBvblNpZ25hbDogKHNpZ25hbCkgPT4ge1xuICAgICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZXNvbHZlRmFsbGJhY2tXYkVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBnZXRSdW5TY3JpcHRBcmdzIH0gZnJvbSAnLi4vLi4vYmluL3J1bkFyZ3MuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCByZWFkQW5kTWVyZ2VFbnZpcm9ubWVudFZhcmlhYmxlcywgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB1c2VzQnVuUnVudGltZSB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHsgcnVuQ29tbWFuZFdpdGhFbnZpcm9ubWVudCB9IGZyb20gJy4vZG90ZW52LmpzJztcblxuZXhwb3J0IGNvbnN0IHJ1bkNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdydW4gW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ0xvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBydW4gYSBzY3JpcHQgd2l0aCB0aGUgcHJvamVjdCBydW50aW1lLicsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT5cbiAgICB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHtcbiAgICAgICdwYXJzZS1wb3NpdGlvbmFsLW51bWJlcnMnOiBmYWxzZSxcbiAgICAgICdwb3B1bGF0ZS0tJzogdHJ1ZSxcbiAgICAgICd1bmtub3duLW9wdGlvbnMtYXMtYXJncyc6IHRydWUsXG4gICAgfSksXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFyZ3MgPSBnZXRSdW5TY3JpcHRBcmdzKHByb2Nlc3MuYXJndik7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdVc2FnZTogd2IgcnVuIDxzY3JpcHQ+IFthcmdzLi4uXScpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgY3dkKTtcbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0Py5lbnYgPz8gcmVhZFN0YW5kYWxvbmVFbnZpcm9ubWVudChhcmd2LCBjd2QpO1xuICAgIGNvbnN0IGNvbW1hbmQgPSBidWlsZFJ1bkNvbW1hbmQoY3dkLCBhcmdzLCBlbnYsIHByb2plY3QpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgY29uc29sZS5pbmZvKGBXb3VsZCBydW46ICR7Y29tbWFuZC5qb2luKCcgJyl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHJ1bkNvbW1hbmRXaXRoRW52aXJvbm1lbnQoY29tbWFuZCwgJ3diIHJ1biA8c2NyaXB0PiBbYXJncy4uLl0nLCB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgfSk7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBidWlsZFJ1bkNvbW1hbmQoY3dkOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52LCBwcm9qZWN0PzogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgaWYgKCF1c2VzQnVuUnVudGltZShjd2QpKSByZXR1cm4gWydub2RlJywgLi4uYXJnc107XG4gIC8vIGBidW4gcnVuYCByZXNvbHZlcyBwYWNrYWdlLmpzb24gc2NyaXB0cyBiZWZvcmUgbG9jYWwgYmluYXJpZXMsIHNvIGEgc2NyaXB0IHRoYXQgaW52b2tlc1xuICAvLyBgd2IgcnVuIDxpdHMgb3duIG5hbWU+YCAoZS5nLiBcInZpdGVzdFwiOiBcIndiIHJ1biB2aXRlc3QgcnVuXCIpIHdvdWxkIHJlc3Bhd24gaXRzZWxmIGZvcmV2ZXIuXG4gIC8vIEJ5cGFzcyBzY3JpcHQgcmVzb2x1dGlvbiBvbmx5IGZvciBnZW51aW5lIHNlbGYtcmVjdXJzaW9uOiB0aGUgdGFyZ2V0IG5hbWVzIHRoZSBsaWZlY3ljbGVcbiAgLy8gc2NyaXB0IHRoYXQgc3Bhd25lZCB0aGlzIHByb2Nlc3MgQU5EIHRoZSBjdXJyZW50IHBhY2thZ2UgZGVjbGFyZXMgdGhhdCB2ZXJ5IHNjcmlwdCB0ZXh0IOKAlFxuICAvLyBhIGNyb3NzLXBhY2thZ2UgZGVsZWdhdGlvbiB2aWEgLS13b3JraW5nLWRpciByZWFjaGVzIGEgZGlmZmVyZW50IHNjcmlwdCB0ZXh0LCBzbyBpdCBzdGlsbFxuICAvLyBydW5zIHRoZSBkZXN0aW5hdGlvbidzIHNjcmlwdC4gcnVuQ29tbWFuZFdpdGhFbnZpcm9ubWVudCBwcmVwZW5kcyBub2RlX21vZHVsZXMvLmJpbiB0b1xuICAvLyBQQVRILCByZXNvbHZpbmcgdGhlIGRpcmVjdCBleGVjdXRpb24gdG8gdGhlIGxvY2FsIGJpbmFyeS5cbiAgY29uc3QgdGFyZ2V0ID0gYXJnc1swXTtcbiAgaWYgKHRhcmdldCAmJiB0YXJnZXQgPT09IGVudi5ucG1fbGlmZWN5Y2xlX2V2ZW50KSB7XG4gICAgY29uc3Qgc2NyaXB0ID0gcHJvamVjdCA/IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uW3RhcmdldF0gOiByZWFkUGFja2FnZVNjcmlwdChjd2QsIHRhcmdldCk7XG4gICAgaWYgKHNjcmlwdCAhPT0gdW5kZWZpbmVkICYmIHNjcmlwdCA9PT0gZW52Lm5wbV9saWZlY3ljbGVfc2NyaXB0KSByZXR1cm4gWy4uLmFyZ3NdO1xuICB9XG4gIHJldHVybiBbJ2J1bicsICdydW4nLCAuLi5hcmdzXTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VTY3JpcHQoY3dkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIGBidW4gcnVuYCByZXNvbHZlcyBzY3JpcHRzIGZyb20gdGhlIG5lYXJlc3QgYW5jZXN0b3IgcGFja2FnZS5qc29uLCBzbyBtYXRjaCB0aGF0IHNjb3BlXG4gIC8vIChlLmcuIC0td29ya2luZy1kaXIgbWF5IHBvaW50IHRvIGEgbWFuaWZlc3QtbGVzcyBzdWJkaXJlY3Rvcnkgb2YgdGhlIHJlY3Vyc2luZyBwYWNrYWdlKS5cbiAgZm9yIChsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoY3dkKTsgOyBjdXJyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCkpIHtcbiAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgICAgIHNjcmlwdHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcGFja2FnZUpzb24uc2NyaXB0cz8uW25hbWVdO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpID09PSBjdXJyZW50UGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkU3RhbmRhbG9uZUVudmlyb25tZW50KGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZSwgY3dkOiBzdHJpbmcpOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIGNvbnN0IFtlbnZdID0gcmVhZEFuZE1lcmdlRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZW52LldCX0VOViB8fD0gcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndik7XG4gIHZhbGlkYXRlU3RhbmRhbG9uZVdiRW52KGFyZ3YsIGVudik7XG4gIHJldHVybiBlbnY7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhbmRhbG9uZVdiRW52KGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZSwgZW52OiBOb2RlSlMuUHJvY2Vzc0Vudik6IHZvaWQge1xuICBpZiAoZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAnMScgfHwgZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAndHJ1ZScpIHJldHVybjtcbiAgY29uc3Qgc3RhbmRhcmRNb2RlcyA9IG5ldyBTZXQoWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddKTtcbiAgaWYgKGVudi5XQl9FTlYgJiYgIXN0YW5kYXJkTW9kZXMuaGFzKGVudi5XQl9FTlYpKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGBXQl9FTlYgbXVzdCBiZSBvbmUgb2YgZGV2ZWxvcG1lbnQsIHRlc3QsIHN0YWdpbmcsIG9yIHByb2R1Y3Rpb24sIGJ1dCBpcyBcIiR7ZW52LldCX0VOVn1cIi4gYCArXG4gICAgICAgICdGaXggdGhlIGVudiBzb3VyY2Ugb3IgdGhlIGV4cG9ydGVkIHZhcmlhYmxlLCBvciBzZXQgV0JfU0tJUF9FTlZfQ0hFQ0s9MSB0byBza2lwIHRoaXMgY2hlY2suJ1xuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBzZWxlY3RlZENhc2NhZGUgPVxuICAgIHR5cGVvZiBhcmd2LmNhc2NhZGVFbnYgPT09ICdzdHJpbmcnXG4gICAgICA/IGFyZ3YuY2FzY2FkZUVudlxuICAgICAgOiBhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICAgID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudiAhPT0gZmFsc2VcbiAgICAgICAgICA/IHJ1bnRpbWVFbnYuV0JfRU5WIHx8IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICBpZiAoZW52LldCX0VOViAmJiBzZWxlY3RlZENhc2NhZGUgJiYgc3RhbmRhcmRNb2Rlcy5oYXMoc2VsZWN0ZWRDYXNjYWRlKSAmJiBlbnYuV0JfRU5WICE9PSBzZWxlY3RlZENhc2NhZGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYFdCX0VOViByZXNvbHZlcyB0byBcIiR7ZW52LldCX0VOVn1cIiBhbHRob3VnaCB0aGUgXCIke3NlbGVjdGVkQ2FzY2FkZX1cIiBlbnZpcm9ubWVudCB3YXMgc2VsZWN0ZWQuIGAgK1xuICAgICAgICAnRml4IHRoZSBXQl9FTlYgZGVmaW5lZCBpbiB0aGUgZW52IHNvdXJjZXMsIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay4nXG4gICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3QgbG9hZGVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIChkLm5hbWUgPT09ICdtaXNlLnRvbWwnIHx8IGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignbWlzZSBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIC8vIGBtaXNlIHdoaWNoIHB5dGhvbmAgcmVzb2x2ZXMgdGhlIHByb2plY3QncyBBQ1RJVkUgaW50ZXJwcmV0ZXIgdG8gYSBzaW5nbGUgYWJzb2x1dGUgcGF0aCxcbiAgICAgIC8vIHVubGlrZSBgbWlzZSBjdXJyZW50IHB5dGhvbmAsIHdoaWNoIHByaW50cyBldmVyeSBjb25maWd1cmVkIHZlcnNpb24gKG1pc2Ugc3VwcG9ydHNcbiAgICAgIC8vIG11bHRpLXZlcnNpb24gcGlucykgYW5kIHdvdWxkIHBhc3MgZXh0cmEgcG9zaXRpb25hbCBhcmd1bWVudHMgdG8gYHBvZXRyeSBlbnYgdXNlYC5cbiAgICAgIGxldCBweXRob25QYXRoID0gJyc7XG4gICAgICB0cnkge1xuICAgICAgICBweXRob25QYXRoID0gY2hpbGRfcHJvY2Vzc1xuICAgICAgICAgIC5leGVjU3luYygnbWlzZSB3aGljaCBweXRob24nLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSB9KVxuICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgLnRyaW0oKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBtaXNlIG1pc3Npbmcgb3IgcHl0aG9uIHVuY29uZmlndXJlZDsgbGV0IHBvZXRyeSBwaWNrIGl0cyBkZWZhdWx0IGludGVycHJldGVyLlxuICAgICAgfVxuICAgICAgaWYgKHB5dGhvblBhdGgpIHtcbiAgICAgICAgLy8gVGhlIGNvbW1hbmQgcnVucyB0aHJvdWdoIGEgc2hlbGw7IFBPU0lYIHNpbmdsZSBxdW90ZXMga2VlcCB0aGUgcGF0aCBvbmUgbGl0ZXJhbCBhcmd1bWVudFxuICAgICAgICAvLyBldmVuIHdoZW4gYSByZWxvY2F0ZWQgbWlzZSBkYXRhIGRpciBwdXRzIG1ldGFjaGFyYWN0ZXJzIGludG8gaXQuXG4gICAgICAgIGNvbnN0IHF1b3RlZFB5dGhvblBhdGggPSBgJyR7cHl0aG9uUGF0aC5yZXBsYWNlQWxsKFwiJ1wiLCBTdHJpbmcucmF3YCdcXCcnYCl9J2A7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7cXVvdGVkUHl0aG9uUGF0aH1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290IHx8ICFwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkgJiZcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddXG4gICAgKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmR9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmR9IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICAnLS0nPzogc3RyaW5nW107XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xuICBzaWxlbnQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHsgJy0tJz86IHN0cmluZ1tdIH1cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSlcbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIERvY2tlciBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgRG9ja2VyU2NyaXB0cyB7XG4gIGJ1aWxkSW1hZ2UocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBlLmcuIGNvZGluZy1ib29zdGVyIHVzZXMgYFwiZG9ja2VyL2J1aWxkL3ByZXBhcmVcIjogXCJ0b3VjaCBkcmlsbC11c2Vycy5jc3ZcIixgXG4gICAgY29uc3QgcHJlZml4ID0gcHJvamVjdC5kb2NrZXJQYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RvY2tlci9idWlsZC9wcmVwYXJlJ11cbiAgICAgID8gJ1lBUk4gcnVuIGRvY2tlci9idWlsZC9wcmVwYXJlICYmICdcbiAgICAgIDogJyc7XG4gICAgY29uc3QgbWlzZUFnZUtleVNlY3JldE9wdGlvbiA9IHByb2plY3QuZW52Lk1JU0VfQUdFX0tFWVxuICAgICAgPyAnXFxuICAgICAgICAtLXNlY3JldCBpZD1taXNlX2FnZV9rZXksZW52PU1JU0VfQUdFX0tFWSdcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBjZCAke3BhdGguZGlybmFtZShwcm9qZWN0LmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpfVxuICAgICYmICR7cHJlZml4fVlBUk4gd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVcbiAgICAmJiBZQVJOIHdiIHJldHJ5IC0tIGRvY2tlciBidWlsZCAtdCAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfVxuICAgICAgICAtLWJ1aWxkLWFyZyBBUkNIPSQoWyAkKHVuYW1lIC1tKSA9ICdhcm02NCcgXSAmJiBlY2hvIGFybTY0IHx8IGVjaG8geDg2XzY0KVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9XG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX1ZFUlNJT049JHt2ZXJzaW9ufSR7bWlzZUFnZUtleVNlY3JldE9wdGlvbn0gLmA7XG4gIH1cblxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zLCBhZGRpdGlvbmFsQXJncyl9YDtcbiAgfVxuXG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIGNvbnN0IGFsbG9jYXRlVHR5ID0gYWRkaXRpb25hbEFyZ3MuaW5jbHVkZXMoJy9iaW4vYmFzaCcpO1xuICAgIGNvbnN0IG1pc2VBZ2VLZXlFbnZPcHRpb24gPSBwcm9qZWN0LmVudi5NSVNFX0FHRV9LRVkgPyAnLS1lbnYgTUlTRV9BR0VfS0VZICcgOiAnJztcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAke2FsbG9jYXRlVHR5ID8gJy1pdCAnIDogJyd9JHttaXNlQWdlS2V5RW52T3B0aW9ufSR7c2VsZWN0Q29udGFpbmVyRW52T3B0aW9ucyhwcm9qZWN0KX0tLXB1Ymxpc2ggJHtwcm9qZWN0LmVudi5QT1JUfTo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZG9ja2VyIHJtIC1mICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ID4gL2Rldi9udWxsIDI+JjEgfHwgdHJ1ZWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG5cbi8vIFZhcmlhYmxlcyB0aGUgSU1BR0UgaXRzZWxmIG93bnM6IGEgRG9ja2VyZmlsZSBwaW5zIHRoZSBjb250YWluZXIgcG9ydCAodGhlIHB1Ymxpc2hlZCBtYXBwaW5nXG4vLyB0YXJnZXRzIDgwODAsIG5vdCB0aGUgaG9zdC1zaWRlIFBPUlQpIGFuZCB0aGUgcnVudGltZSBtb2RlIGl0IHdhcyBidWlsdCBmb3IsIGFuZCBiZWZvcmUgZm5veCB0aGVcbi8vIGJha2VkIC5lbnYgZmlsZXMgbG9zdCB0byB0aG9zZSBgRU5WYCB2YWx1ZXMgdG9vIGJlY2F1c2UgcHJvY2Vzcy5lbnYgd2lucyBvdmVyIGVudiBzb3VyY2VzLlxuY29uc3QgSU1BR0VfT1dORURfS0VZUyA9IG5ldyBTZXQoWydOT0RFX0VOVicsICdQT1JUJ10pO1xuXG4vKipcbiAqIGBkb2NrZXIgcnVuIC0tZW52IEtFWWAgb3B0aW9ucyBmb3IgZXZlcnkgdmFyaWFibGUgdGhlIHByb2plY3QgZGVjbGFyZXMsIHNvIGEgY29udGFpbmVyIGdldHMgdGhlXG4gKiBhcHAncyBlbnZpcm9ubWVudC4gU2luY2UgZm5veCByZXBsYWNlZCB0aGUgLmVudiBmaWxlcyB0aGF0IGltYWdlcyB1c2VkIHRvIGJha2UgaW4g4oCUIHRoZSBhZ2Uga2V5XG4gKiB0aGF0IGRlY3J5cHRzIHRoZW0gbXVzdCBuZXZlciBlbnRlciBhIGNvbnRhaW5lciDigJQgYSBjb250YWluZXIgd291bGQgb3RoZXJ3aXNlIHN0YXJ0IHdpdGggbm9cbiAqIGNvbmZpZ3VyYXRpb24gYXQgYWxsLiBPbmx5IE5BTUVTIGFyZSBwYXNzZWQ6IGRvY2tlciB0aGVuIGZvcndhcmRzIGVhY2ggdmFsdWUgZnJvbSB3YidzIG93blxuICogZW52aXJvbm1lbnQsIGtlZXBpbmcgc2VjcmV0cyBvdXQgb2YgdGhlIGNvbW1hbmQgbGluZSAodmlzaWJsZSBpbiBgcHNgIG91dHB1dCBhbmQgQ0kgbG9ncykuXG4gKi9cbmZ1bmN0aW9uIHNlbGVjdENvbnRhaW5lckVudk9wdGlvbnMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gIGNvbnN0IG9wdGlvbnMgPSBzZWxlY3RDb250YWluZXJFbnZLZXlzKHByb2plY3QuZGVjbGFyZWRFbnZLZXlzLCBwcm9qZWN0LmVudikubWFwKChrZXkpID0+IGAtLWVudiAke2tleX1gKTtcbiAgcmV0dXJuIG9wdGlvbnMubGVuZ3RoID4gMCA/IGAke29wdGlvbnMuam9pbignICcpfSBgIDogJyc7XG59XG5cbi8qKiBUaGUgZGVjbGFyZWQgdmFyaWFibGVzIHRvIGZvcndhcmQgaW50byBhIGNvbnRhaW5lciwgc29ydGVkIGZvciBhIHN0YWJsZSBjb21tYW5kLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdENvbnRhaW5lckVudktleXMoXG4gIGRlY2xhcmVkRW52S2V5czogUmVhZG9ubHlTZXQ8c3RyaW5nPixcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+XG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uZGVjbGFyZWRFbnZLZXlzXVxuICAgIC5maWx0ZXIoKGtleSkgPT4gIUlNQUdFX09XTkVEX0tFWVMuaGFzKGtleSkgJiYgZW52W2tleV0gIT09IHVuZGVmaW5lZClcbiAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQge1xuICBmaW5kRDFNaWdyYXRpb25zRGlyUGF0aCxcbiAgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxuICB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybCxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVPcHRpb25zIHtcbiAgLyoqICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJyAqL1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xuICAvKiogUmF3IFBsYXl3cmlnaHQgYXJncyBmb3J3YXJkZWQgYWZ0ZXIgYHdiIHRlc3QgLS0gLi4uYCAqL1xuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHAgPSBzaG91bGRXYWl0QW5kT3BlbkFwcDtcbiAgfVxuXG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGRJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogc3RhcnQgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIGFzeW5jIHN0YXJ0RGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgXSk7XG4gIH1cbiAgYXN5bmMgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhc3luYyBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAnd2InLFxuICAgICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgICAgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKSxcbiAgICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICAgIF0pfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcbiAgcHJvdGVjdGVkIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBjdXN0b21TdGFydFNjcmlwdFBhdGggPSBmaW5kQ3VzdG9tUHJvZHVjdGlvblN0YXJ0U2NyaXB0UGF0aChwcm9qZWN0KTtcbiAgICBpZiAoY3VzdG9tU3RhcnRTY3JpcHRQYXRoKSB7XG4gICAgICBjb25zdCBzdGFydENvbW1hbmQgPVxuICAgICAgICBgJHtidWlsZFNoZWxsQ29tbWFuZChbJ2Jhc2gnLCBjdXN0b21TdGFydFNjcmlwdFBhdGhdKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgICAgIC8vIEEgc3RhcnQgc2NyaXB0IGZvdW5kIGF0IHRoZSBtb25vcmVwbyByb290IChjZi4gUHJvamVjdC5maW5kRmlsZSkgaXMgd3JpdHRlbiB0byBydW4gZnJvbVxuICAgICAgLy8gdGhlIHJvb3QsIGxpa2UgRG9ja2VyJ3MgV09SS0RJUiwgc28gaXRzIGN3ZCBtdXN0IGJlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBzY3JpcHRzLy5cbiAgICAgIGNvbnN0IHNjcmlwdFJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShjdXN0b21TdGFydFNjcmlwdFBhdGgpKTtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdCwgYXJndiwgW1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgc2NyaXB0Um9vdERpclBhdGggPT09IHByb2plY3QuZGlyUGF0aFxuICAgICAgICAgID8gc3RhcnRDb21tYW5kXG4gICAgICAgICAgOiBgKCR7YnVpbGRTaGVsbENvbW1hbmQoWydjZCcsIHNjcmlwdFJvb3REaXJQYXRoXSl9ICYmICR7c3RhcnRDb21tYW5kfSlgLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgY29uc3QgZWNvc3lzdGVtQ29uZmlnUGF0aCA9IGZpbmRFY29zeXN0ZW1Db25maWdQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gZWNvc3lzdGVtQ29uZmlnUGF0aFxuICAgICAgPyBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBwbTItcnVudGltZSBzdGFydCAtLW5vLWF1dG9yZXN0YXJ0ICR7ZWNvc3lzdGVtQ29uZmlnUGF0aH1gXVxuICAgICAgOiB0aGlzLmJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3QsIGFyZ3YpO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0LCBhcmd2LCBjb21tYW5kcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBgJHtwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1bicgOiAnbm9kZSd9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKSxcbiAgICBdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgY29tbWFuZHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBtaWdyYXRpb25Db21tYW5kcyA9IHRoaXMuYnVpbGRNaWdyYXRpb25Db21tYW5kcyhwcm9qZWN0KTtcbiAgICAvLyBTcGxpdHRpbmcgbWF5IGN1dCB0aHJvdWdoIGEgYChjZCDigKYgJiYg4oCmKWAgc3Vic2hlbGwsIGJ1dCByZWpvaW5pbmcgd2l0aCAnICYmICcgYW5kIHBlci1waWVjZVxuICAgIC8vIHJlZGlyZWN0cyBrZWVwcyB0aGUgc2NyaXB0IHZhbGlkLCBhbmQgd2ItZ2VuZXJhdGVkIHBhdGhzIG5ldmVyIGNvbnRhaW4gJyYmJy5cbiAgICByZXR1cm4gWy4uLm1pZ3JhdGlvbkNvbW1hbmRzLmZsYXRNYXAoKGNtZCkgPT4gY21kLnNwbGl0KCcmJicpKSwgLi4uY29tbWFuZHNdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKChjbWQpID0+IGAke2NtZH0gJHt0b0Rldk51bGwoYXJndil9YC50cmltKCkpXG4gICAgICAuam9pbignICYmICcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkTWlncmF0aW9uQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgICAvLyBUZXN0LWVudmlyb25tZW50IHdyYW5nbGVyIHN0YXRlIGlzIGRpc3Bvc2FibGU7IHdpcGUgaXQgZW50aXJlbHkgKG5vdCBqdXN0IEQxKSBiZWZvcmVcbiAgICAvLyBtaWdyYXRpbmcsIHNpbmNlIHN0YWxlIEtWIGNhY2hlIGVudHJpZXMgb3IgRHVyYWJsZSBPYmplY3Qgc3RvcmFnZSBjYW4gYnJlYWsgZTJlIHRlc3RzLlxuICAgIGNvbnN0IHdyYW5nbGVyU3RhdGVXaXBlQ29tbWFuZHMgPVxuICAgICAgaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSAmJiBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpXG4gICAgICAgID8gW2BybSAtUmYgXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cImBdXG4gICAgICAgIDogW107XG4gICAgLy8gQSBwcm9qZWN0IHdob3NlIEQxIGJpbmRpbmdzIGNhcnJ5IHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIGFwcGxpZXMgdGhlbSB3aXRoIHdyYW5nbGVyXG4gICAgLy8gKHNlZSBXb3JrZXJzU2NyaXB0cyAvIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKS4gUnVubmluZyBkcml6emxlLWtpdCBtaWdyYXRlIGFnYWluc3RcbiAgICAvLyB0aGUgc2FtZSBsb2NhbCBEMSB3b3VsZCBhcHBseSB0aGUgc2FtZSBTUUwgdHdpY2Ug4oCUIGRyaXp6bGUncyBnZW5lcmF0ZWQgc3RhdGVtZW50cyBhcmUgbm90XG4gICAgLy8gaWRlbXBvdGVudCAoYENSRUFURSBJTkRFWGAgd2l0aG91dCBJRiBOT1QgRVhJU1RTKSDigJQgc28gZHJpenpsZSBzdGF5cyBPUk0tb25seSB0aGVyZS5cbiAgICBjb25zdCBtaWdyYXRlc0QxV2l0aFdyYW5nbGVyID0gISFmaW5kRDFNaWdyYXRpb25zRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gW1xuICAgICAgLi4ud3JhbmdsZXJTdGF0ZVdpcGVDb21tYW5kcyxcbiAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IFtwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCldIDogW10pLFxuICAgICAgLi4uKHByb2plY3QuaGFzRHJpenpsZSAmJiAhbWlncmF0ZXNEMVdpdGhXcmFuZ2xlclxuICAgICAgICA/IFt3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybChwcm9qZWN0LCBkcml6emxlU2NyaXB0cy5taWdyYXRlRm9yU3RhcnQocHJvamVjdCkpXVxuICAgICAgICA6IFtdKSxcbiAgICBdO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0KSwgb3B0aW9ucyk7XG4gIH1cbiAgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBJbiB0aGUgdGVzdCBlbnZpcm9ubWVudCB0aGUgZGV2IHNlcnZlciBydW5zIGFnYWluc3QgZnJlc2gsIGRpc3Bvc2FibGUgc3RhdGUgKGUuZy4gYW4gZW1wdHlcbiAgICAvLyBsb2NhbCBEMSksIHNvIHRoZSBzY2hlbWEgbXVzdCBiZSBtaWdyYXRlZCBmaXJzdCDigJQgYW4gYXBwIHdob3NlIHBhZ2VzIHF1ZXJ5IHRoZSBkYXRhYmFzZVxuICAgIC8vIHdvdWxkIG90aGVyd2lzZSBhbnN3ZXIgNTAwIGFuZCB0aGUgc3RhcnR1cCBjaGVjayB3b3VsZCBuZXZlciBzZWUgYSAyeHguXG4gICAgY29uc3QgbWlncmF0aW9uQ29tbWFuZHMgPSBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpID8gdGhpcy5idWlsZE1pZ3JhdGlvbkNvbW1hbmRzKHByb2plY3QpIDogW107XG4gICAgLy8gVXNlIGVtcHR5IE5PREVfRU5WIHRvIGF2b2lkIFwicHJvZHVjdGlvblwiIG1vZGUgaW4gc29tZSBmcmFtZXdvcmtzLlxuICAgIGNvbnN0IHN0YXJ0dXBDaGVja0NvbW1hbmQgPSBgJHtidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KCdOT0RFX0VOVicsICcnKX0gJHtidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QXBwKHByb2plY3QpLFxuICAgIF0pfWA7XG4gICAgcmV0dXJuIFsuLi5taWdyYXRpb25Db21tYW5kcywgc3RhcnR1cENoZWNrQ29tbWFuZF0uam9pbignICYmICcpO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBwbGF5d3JpZ2h0Q29tbWFuZCA9IHRoaXMuYnVpbGRQbGF5d3JpZ2h0T25seUNvbW1hbmQocHJvamVjdCwgYXJndiwgb3B0aW9ucyk7XG4gICAgaWYgKHByb2plY3Quc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQpIHtcbiAgICAgIHJldHVybiBwbGF5d3JpZ2h0Q29tbWFuZDtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYCR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDYwMDAwMCAtaSAyMDAwJyl9XG4gICAgICAgICYmICR7cGxheXdyaWdodENvbW1hbmR9YCxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKdXN0IHJ1bnMgUGxheXdyaWdodCAocGx1cyB0aGUgb3B0aW9uYWwgYHRlc3QvZTJlLWFkZGl0aW9uYWxgIHNjcmlwdCksIHdpdGhvdXQgbGF1bmNoaW5nIHRoZSBhcHAuXG4gICAqIFVzZSB3aGVuIFBsYXl3cmlnaHQncyBvd24gYHdlYlNlcnZlcmAgY29uZmlnIGJ1aWxkcyBhbmQgc3RhcnRzIHRoZSBhcHAgdW5kZXIgdGVzdC5cbiAgICovXG4gIHByb3RlY3RlZCBidWlsZFBsYXl3cmlnaHRPbmx5Q29tbWFuZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBbXSwgcGxheXdyaWdodEFyZ3MgPSBbJ3Rlc3QnLCAndGVzdC9lMmUvJ10gfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgcmV0dXJuIGAke2J1aWxkUGxheXdyaWdodENvbW1hbmQocGxheXdyaWdodEFyZ3MsIGFyZ3YudGFyZ2V0cywgYXJndi5iYWlsLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyl9JHtzdWZmaXh9YDtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiB0ZXN0IChlMmUpIGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIHRlc3RVbml0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICBpZiAocHJvamVjdC5oYXNWaXRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIHRoaXMgY29tbWFuZCBpcyByZWZlcnJlZCBmcm9tIG90aGVyIGNvbW1hbmRzLCB3ZSBoYXZlIHRvIHVzZSBcInZpdGVzdCBydW5cIiAobm9uLWludGVyYWN0aXZlIG1vZGUpLlxuICAgICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAndml0ZXN0JyxcbiAgICAgICAgJ3J1bicsXG4gICAgICAgIC4uLih0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L3VuaXQvJ10pLFxuICAgICAgICAnLS1wYXNzV2l0aE5vVGVzdHMnLFxuICAgICAgICAnLS1hbGxvd09ubHknLFxuICAgICAgICAnLS13YXRjaD1mYWxzZScsXG4gICAgICAgIC4uLihhcmd2LmJhaWwgPyBbJy0tYmFpbD0xJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9IGVsc2UgaWYgKHByb2plY3QuaXNCdW5BdmFpbGFibGUpIHtcbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdidW4nLFxuICAgICAgICAndGVzdCcsXG4gICAgICAgIC4uLih0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L3VuaXQvJ10pLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWwnXSA6IFtdKSxcbiAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gJ2VjaG8gXCJObyB0ZXN0cy5cIic7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYCR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDEwMDAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgMTAwMDAgLWkgNTAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgMTAwMDAgLWkgMTAwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDEwMDAwIC1pIDIwMDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCAyMDAwMCAtaSA0MDAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgNjAwMDAgLWkgNTAwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDkwMDAwIC1pIDEwMDAwJyl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QW5kT3BlbkFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYCR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdFxuICAgICl9IHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCl9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHdhaXQtb24gYm9vdCBjaGVjayBwb2xsaW5nIGBodHRwLWdldDovL2xvY2FsaG9zdDo8cG9ydD5gLiBgbG9jYWxob3N0YCAobm90IGAxMjcuMC4wLjFgKVxuICogbGV0cyBOb2RlJ3MgSGFwcHkgRXllYmFsbHMgdHJ5IGJvdGggYWRkcmVzcyBmYW1pbGllczogb24gbWFjT1MsIGRldiBzZXJ2ZXJzIHdpdGhvdXQgYW4gZXhwbGljaXRcbiAqIGhvc3QgKGUuZy4gdmluZXh0L1ZpdGUpIGNhbiBiaW5kIElQdjYtb25seSAoYDo6MWApLCBzbyBhbiBJUHY0LW9ubHkgcG9sbCB3b3VsZCBoYW5nIHVudGlsIHRpbWVvdXRcbiAqIGV2ZW4gdGhvdWdoIHRoZSBzZXJ2ZXIgaXMgdXAuIFRoZSBgTk9fUFJPWFlgL2Bub19wcm94eWAgcHJlZml4IGtlZXBzIHRoZSBsb29wYmFjayBwb2xsIG9mZiBIVFRQXG4gKiBwcm94aWVzOiB3YWl0LW9uJ3MgYXhpb3MgYXBwbGllcyBgSFRUUChTKV9QUk9YWWAgZW52IHZhcnMgdW5sZXNzIGBOT19QUk9YWWAgbWF0Y2hlcyB0aGUgcG9sbGVkXG4gKiBob3N0LCBhbmQgZXhpc3RpbmcgYE5PX1BST1hZYCBjb252ZW50aW9ucyBtYXkgbGlzdCBgMTI3LjAuMC4xYCB3aXRob3V0IGBsb2NhbGhvc3RgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydDogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCB3YWl0T25BcmdzPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBOT19QUk9YWT1sb2NhbGhvc3Qgbm9fcHJveHk9bG9jYWxob3N0IHdhaXQtb24gJHt3YWl0T25BcmdzID8gYCR7d2FpdE9uQXJnc30gYCA6ICcnfWh0dHAtZ2V0Oi8vbG9jYWxob3N0OiR7cG9ydH1gO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VzdG9tUHJvZHVjdGlvblN0YXJ0U2NyaXB0UGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnc2NyaXB0cy9zdGFydC1wcm9kdWN0aW9uLnNoJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodENvbW1hbmQoXG4gIHBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSxcbiAgdGFyZ2V0czogVGVzdEFyZ3ZbJ3RhcmdldHMnXSxcbiAgYmFpbD86IGJvb2xlYW4sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gWydCVU4nLCAncGxheXdyaWdodCddO1xuICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICBpZiAocGxheXdyaWdodEFyZ3NbMF0gIT09ICd0ZXN0JyB8fCAhbm9ybWFsaXplZFRhcmdldHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihbLi4uYmFzZSwgLi4ucGxheXdyaWdodEFyZ3MsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSwgYmFpbCk7XG4gIH1cblxuICBjb25zdCByZXN0ID0gcGxheXdyaWdodEFyZ3Muc2xpY2UoMSk7XG4gIGNvbnN0IGV4cGxpY2l0VGFyZ2V0SW5kZXhlcyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKHJlc3QpO1xuICBjb25zdCByZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0ID1cbiAgICBleHBsaWNpdFRhcmdldEluZGV4ZXMubGVuZ3RoID09PSAwID8gcmVzdCA6IHJlc3QuZmlsdGVyKChfLCBpbmRleCkgPT4gIWV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5pbmNsdWRlcyhpbmRleCkpO1xuICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oXG4gICAgWy4uLmJhc2UsICd0ZXN0JywgLi4ubm9ybWFsaXplZFRhcmdldHMsIC4uLnJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSxcbiAgICBiYWlsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGNvbW1hbmRBcmdzOiBzdHJpbmdbXSwgYmFpbD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBwbGF5d3JpZ2h0SW5kZXggPSBjb21tYW5kQXJncy5pbmRleE9mKCdwbGF5d3JpZ2h0Jyk7XG4gIGNvbnN0IGlzUGxheXdyaWdodFRlc3RDb21tYW5kID0gcGxheXdyaWdodEluZGV4ICE9PSAtMSAmJiBjb21tYW5kQXJnc1twbGF5d3JpZ2h0SW5kZXggKyAxXSA9PT0gJ3Rlc3QnO1xuICBpZiAoIWJhaWwgfHwgIWlzUGxheXdyaWdodFRlc3RDb21tYW5kKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICBpZiAoY29tbWFuZEFyZ3Muc29tZSgoYXJnKSA9PiBhcmcgPT09ICctLW1heC1mYWlsdXJlcycgfHwgYXJnLnN0YXJ0c1dpdGgoJy0tbWF4LWZhaWx1cmVzPScpKSkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi5jb21tYW5kQXJncywgJy0tbWF4LWZhaWx1cmVzPTEnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhhcmdzOiBzdHJpbmdbXSk6IG51bWJlcltdIHtcbiAgbGV0IHBlbmRpbmdWYWx1ZU1vZGU6ICdvcHRpb25hbCcgfCAncmVxdWlyZWQnIHwgdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXRJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBhcmddIG9mIGFyZ3MuZW50cmllcygpKSB7XG4gICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUpIHtcbiAgICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlID09PSAncmVxdWlyZWQnIHx8ICFhcmcuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICByZXR1cm4gWy4uLnRhcmdldEluZGV4ZXMsIC4uLmFyZ3Muc2xpY2UoaW5kZXggKyAxKS5tYXAoKF8sIG9mZnNldCkgPT4gaW5kZXggKyAxICsgb2Zmc2V0KV07XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgaWYgKGFyZy5pbmNsdWRlcygnPScpKSBjb250aW51ZTtcbiAgICAgIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH0gZWxzZSBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdvcHRpb25hbCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctJykgJiYgYXJnICE9PSAnLScpIHtcbiAgICAgIGNvbnN0IHNob3J0T3B0aW9uID0gYXJnLnNsaWNlKDAsIDIpO1xuICAgICAgaWYgKGFyZy5sZW5ndGggPT09IDIgJiYgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKHNob3J0T3B0aW9uKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0YXJnZXRJbmRleGVzLnB1c2goaW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldEluZGV4ZXM7XG59XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbXG4gICctLWJyb3dzZXInLFxuICAnLS1jb25maWcnLFxuICAnLS1ncmVwJyxcbiAgJy0tZ3JlcC1pbnZlcnQnLFxuICAnLS1nbG9iYWwtdGltZW91dCcsXG4gICctLW1heC1mYWlsdXJlcycsXG4gICctLW91dHB1dCcsXG4gICctLXByb2plY3QnLFxuICAnLS1yZXBlYXQtZWFjaCcsXG4gICctLXJlcG9ydGVyJyxcbiAgJy0tcmV0cmllcycsXG4gICctLXNoYXJkJyxcbiAgJy0tdGVzdC1saXN0JyxcbiAgJy0tdGVzdC1saXN0LWludmVydCcsXG4gICctLXRpbWVvdXQnLFxuICAnLS10cmFjZScsXG4gICctLXRzY29uZmlnJyxcbiAgJy0tdWktaG9zdCcsXG4gICctLXVpLXBvcnQnLFxuICAnLS11aS10aXRsZScsXG4gICctLXdvcmtlcnMnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTID0gbmV3IFNldChbXG4gICctLW9ubHktY2hhbmdlZCcsXG4gICctLXVwZGF0ZS1zbmFwc2hvdHMnLFxuICAnLS11cGRhdGUtc291cmNlLW1ldGhvZCcsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFsnLWMnLCAnLWcnLCAnLWonXSk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cywgYnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQsIHR5cGUgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGNsYXNzIEh0dHBTZXJ2ZXJTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHRlc3RFMkVQcm90ZWN0ZWQoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICBzdGFydENvbW1hbmQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHByb2plY3QuaGFzUGxheXdyaWdodENvbmZpZykge1xuICAgICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgc3RhcnRDb21tYW5kLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvZTJlLyddO1xuICAgIGNvbnN0IHRlc3RDb21tYW5kID0gdGhpcy50ZXN0VW5pdChwcm9qZWN0LCB7IC4uLmFyZ3YsIHRhcmdldHM6IG5vcm1hbGl6ZWRUYXJnZXRzIH0pO1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICBgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMWAsXG4gICAgICBgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgNjAwMDAwIC1pIDIwMDAnKX0gJiYgJHt0ZXN0Q29tbWFuZH0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IFNFUlZFUl9MT0dfRklMRSA9ICdzZXJ2ZXIubG9nJztcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgU0VSVkVSX0xPR19GSUxFIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydERldlByb3RlY3RlZChfMTogUHJvamVjdCwgXzI6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQuJyk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERldihfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiAke3Byb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIHJ1bicgOiAnbm9kZSd9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ30gfCB0ZWUgJHtTRVJWRVJfTE9HX0ZJTEV9YFxuICAgICk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnRUZXN0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICAgKX1gXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFV2l0aFBsYXl3cmlnaHRNYW5hZ2VkU2VydmVyKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVdpdGhQbGF5d3JpZ2h0TWFuYWdlZFNlcnZlcihwcm9qZWN0LCBhcmd2LCBvcHRpb25zKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0RTJFRG9ja2VyKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cblxuICAvKipcbiAgICogQSBsaWJyYXJ5IGhhcyBubyBzZXJ2ZXIgb2YgaXRzIG93biwgYnV0IGl0IG1heSBzaGlwIGEgc2VsZi1jb250YWluZWQgUGxheXdyaWdodCBmaXh0dXJlIHdob3NlXG4gICAqIGNvbmZpZyBidWlsZHMgYW5kIHN0YXJ0cyB0aGUgYXBwIHVuZGVyIHRlc3QgdmlhIGEgYHdlYlNlcnZlcmAgYmxvY2sgKGUuZy4gYSBOZXh0LmpzIGZpeHR1cmUgdGhhdFxuICAgKiB2ZXJpZmllcyB0aGUgcHVibGlzaGVkIHBhY2thZ2UgaW1wb3J0cyBjbGVhbmx5KS4gUnVuIFBsYXl3cmlnaHQgZGlyZWN0bHkgaW4gdGhhdCBjYXNlIOKAlCBpbmNsdWRpbmdcbiAgICogb24gQ0ksIHdoZXJlIFBsYXl3cmlnaHQncyBvd24gYHdlYlNlcnZlcmAgc3RhcnRzIHRoZSBmaXh0dXJlIOKAlCBvdGhlcndpc2UgdGhlcmUgaXMgbm90aGluZyB0byBydW4uXG4gICAqL1xuICBwcml2YXRlIHRlc3RFMkVXaXRoUGxheXdyaWdodE1hbmFnZWRTZXJ2ZXIoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICBvcHRpb25zOiBUZXN0RTJFT3B0aW9uc1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBwcm9qZWN0Lmhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWdcbiAgICAgICAgPyB0aGlzLmJ1aWxkUGxheXdyaWdodE9ubHlDb21tYW5kKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpXG4gICAgICAgIDogYGVjaG8gJ2RvIG5vdGhpbmcuJ2BcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJywgJ2hvbm8nXTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICAvLyBCbGl0eidzIHdpdGhCbGl0eiB3aXJlcyBpdHMgUlBDIGxheWVyIHRocm91Z2ggYSB3ZWJwYWNrIGxvYWRlciwgd2hpY2ggVHVyYm9wYWNrIGlnbm9yZXMsXG4gICAgLy8gc28gQmxpdHogYXBwcyBtdXN0IHJ1biB0aGUgd2VicGFjayBkZXYgc2VydmVyIChUdXJib3BhY2sgZGllcyB3aXRoIHJlc29sdmUgZXJyb3JzKS5cbiAgICAvLyBQYXNzaW5nIG5vIGJ1bmRsZXIgZmxhZyBzZWxlY3RzIHdlYnBhY2sgb25seSBvbiBOZXh0LmpzIDE1OyBOZXh0LmpzIDE2IGRlZmF1bHRzIHRvXG4gICAgLy8gVHVyYm9wYWNrIGFuZCBuZWVkcyBhbiBleHBsaWNpdCAtLXdlYnBhY2ssIGEgZmxhZyBOZXh0LmpzIDE1J3MgQ0xJIHJlamVjdHMgYXMgdW5rbm93bi5cbiAgICBsZXQgYnVuZGxlck9wdGlvbiA9ICctLXR1cmJvcGFjayAnO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHtcbiAgICAgIGJ1bmRsZXJPcHRpb24gPSBnZXROZXh0TWFqb3JWZXJzaW9uKHByb2plY3QpID49IDE2ID8gJy0td2VicGFjayAnIDogJyc7XG4gICAgfVxuICAgIHJldHVybiBgWUFSTiBuZXh0IGRldiAke2J1bmRsZXJPcHRpb259JHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYFlBUk4gbmV4dCBzdGFydCAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcblxuLyoqXG4gKiBQcmVmZXJzIHRoZSBpbnN0YWxsZWQgcGFja2FnZSBvdmVyIHRoZSBkZWNsYXJlZCBzcGVjaWZpZXIgYmVjYXVzZSB0aGUgZGVjbGFyZWQgb25lIG1heSBiZSBhXG4gKiByYW5nZTsgZmFsbHMgYmFjayB0byAxNSAod2VicGFjay1ieS1kZWZhdWx0IGJlaGF2aW9yKSB3aGVuIG5laXRoZXIgaXMgcmVhZGFibGUuXG4gKi9cbmZ1bmN0aW9uIGdldE5leHRNYWpvclZlcnNpb24ocHJvamVjdDogUHJvamVjdCk6IG51bWJlciB7XG4gIHRyeSB7XG4gICAgY29uc3QgaW5zdGFsbGVkID0gSlNPTi5wYXJzZShcbiAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJ25leHQnLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICApIGFzIHsgdmVyc2lvbj86IHN0cmluZyB9O1xuICAgIGNvbnN0IG1ham9yID0gc2VtdmVyLmNvZXJjZShpbnN0YWxsZWQudmVyc2lvbik/Lm1ham9yO1xuICAgIGlmIChtYWpvciAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbWFqb3I7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVjbGFyZWQgc3BlY2lmaWVyXG4gIH1cbiAgcmV0dXJuIHNlbXZlci5jb2VyY2UocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/Lm5leHQpPy5tYWpvciA/PyAxNTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgaXNQcm9qZWN0RW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kLFxuICBidWlsZEdlbkRldlZhcnNDb21tYW5kLFxuICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxufSBmcm9tICcuLi8uLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIHZpbmV4dCAoTmV4dC5qcyBvbiBWaXRlKSBhcHBzIHRhcmdldGluZyBDbG91ZGZsYXJlIFdvcmtlcnMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpbmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICAvLyBVbmxpa2UgYG5leHQgZGV2YCwgVml0ZS1iYXNlZCB2aW5leHQgZG9lcyBub3QgcmVhZCB0aGUgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICBjb25zdCBkZXZDb21tYW5kID0gYFlBUk4gdmluZXh0IGRldiAtLXBvcnQgJHtwcm9qZWN0LmVudi5QT1JUfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICAgIC8vIFRoZSBDbG91ZGZsYXJlIHZpdGUgcGx1Z2luIChtaW5pZmxhcmUpIHJlYWRzIHJ1bnRpbWUgdmFycyBvbmx5IGZyb20gYSAuZGV2LnZhcnMgZmlsZSxcbiAgICAvLyBzbyBpdCBtdXN0IGJlIHJlZ2VuZXJhdGVkIGZyb20gdGhlIGZub3gtbWFuYWdlZCB2YWx1ZXMgYmVmb3JlIHNlcnZpbmcuXG4gICAgY29uc3QgY29tbWFuZHMgPSBbYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2LCAnLmRldi52YXJzJyldO1xuICAgIC8vIGB2aW5leHQgZGV2YCAobWluaWZsYXJlKSBzdGFydHMgd2l0aCBhbiBlbXB0eSBsb2NhbCBEMSBhbmQgYXBwbGllcyBubyBtaWdyYXRpb25zIGl0c2VsZjtcbiAgICAvLyB0aGUgdGVzdCBlbnZpcm9ubWVudCB3aXBlcyBpdHMgc3RhdGUgZGlyZWN0b3J5LCBzbyBldmVyeSBwYWdlIHdvdWxkIDUwMCB3aXRob3V0IHRoaXMuXG4gICAgY29uc3QgbWlncmF0aW9uQ29tbWFuZCA9IGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgPyBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0KSA6IHVuZGVmaW5lZDtcbiAgICBpZiAobWlncmF0aW9uQ29tbWFuZCkgY29tbWFuZHMucHVzaChtaWdyYXRpb25Db21tYW5kKTtcbiAgICByZXR1cm4gWy4uLmNvbW1hbmRzLCBkZXZDb21tYW5kXS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgLy8gU2VydmluZyB0aGUgYnVpbHQgd29ya2VyIHN0YXJ0cyBmcm9tIGFuIGVtcHR5IChvciB3aXBlZCkgbG9jYWwgRDEsIHNvIHdyYW5nbGVyLW5hdGl2ZVxuICAgIC8vIG1pZ3JhdGlvbnMgKGlmIGFueSkgbXVzdCBiZSBhcHBsaWVkIGZpcnN0OyBkcml6emxlL3ByaXNtYSBtaWdyYXRpb25zIGFyZSBoYW5kbGVkIGJ5XG4gICAgLy8gYnVpbGRQcm9kdWN0aW9uQ29tbWFuZC5cbiAgICBjb25zdCBkMU1pZ3JhdGlvbnNDb21tYW5kID0gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdCk7XG4gICAgLy8gYHZpbmV4dCBidWlsZGAgZW1pdHMgYSB3b3JrZXIgYnVuZGxlIGFuZCBpdHMgd3JhbmdsZXIgY29uZmlnIHVuZGVyIGRpc3Qvc2VydmVyLCBzbyB0aGVcbiAgICAvLyAuZGV2LnZhcnMgZmlsZSBleHBvc2luZyB3Yi1tYW5hZ2VkIGVudmlyb25tZW50IHZhcmlhYmxlcyBtdXN0IGJlIGdlbmVyYXRlZCBhZnRlciBidWlsZGluZy5cbiAgICAvLyBgLS1sb2NhbC11cHN0cmVhbWAga2VlcHMgcmVxdWVzdCBVUkxzIG9uIHRoZSBsb2NhbCBob3N0OyBvdGhlcndpc2UsIHdyYW5nbGVyIGRldiBzaW11bGF0ZXNcbiAgICAvLyB0aGUgcHJvZHVjdGlvbiBjdXN0b20gZG9tYWluIGRlY2xhcmVkIGluIHRoZSB3cmFuZ2xlciBjb25maWcgcm91dGVzLlxuICAgIHJldHVybiBbXG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndiwgJ2Rpc3Qvc2VydmVyLy5kZXYudmFycycpLFxuICAgICAgLi4uKGQxTWlncmF0aW9uc0NvbW1hbmQgPyBbZDFNaWdyYXRpb25zQ29tbWFuZF0gOiBbXSksXG4gICAgICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZChcbiAgICAgICAgYGRldiAtLWNvbmZpZyBkaXN0L3NlcnZlci93cmFuZ2xlci5qc29uIC0taXAgMTI3LjAuMC4xIC0tcG9ydCAke3BvcnR9IC0tcGVyc2lzdC10byBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiIC0tbG9jYWwtdXBzdHJlYW0gbG9jYWxob3N0OiR7cG9ydH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKVxuICAgICAgKSxcbiAgICBdO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aW5leHRTY3JpcHRzID0gbmV3IFZpbmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBWaXRlLWJhc2VkIGFwcHMgd2l0aCBQbGF5d3JpZ2h0IGUyZSB0ZXN0cy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgVml0ZVNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiB2aXRlIGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFlBUk4gdml0ZSBwcmV2aWV3ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpdGVTY3JpcHRzID0gbmV3IFZpdGVTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kLFxuICBidWlsZEdlbkRldlZhcnNDb21tYW5kLFxuICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxufSBmcm9tICcuLi8uLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgSHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIHBsYWluIENsb3VkZmxhcmUgV29ya2VycyBhcHBzIChkZXRlY3RlZCB2aWEgYSB3cmFuZ2xlclxuICogY29uZmlnIGZpbGUgd2hlbiBubyBvdGhlciBmcmFtZXdvcmsgbWF0Y2hlczsgdmluZXh0IGFwcHMgaGF2ZSB0aGVpciBvd24gc2NyaXB0cykuXG4gKiBFeHRlbmRzIEh0dHBTZXJ2ZXJTY3JpcHRzIHNvIHRoYXQgZTJlIHRlc3RzIHJ1biB2aWEgdGhlIHVuaXQtdGVzdCBydW5uZXIgYWdhaW5zdCB0aGUgcnVubmluZ1xuICogd29ya2VyIHdoZW4gdGhlIHByb2plY3QgaGFzIG5vIFBsYXl3cmlnaHQgY29uZmlnLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBXb3JrZXJzU2NyaXB0cyBleHRlbmRzIEh0dHBTZXJ2ZXJTY3JpcHRzIHtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kcyhwcm9qZWN0LCBhcmd2KS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICAvLyB3cmFuZ2xlciBkZXYgYnVuZGxlcyB0aGUgd29ya2VyIGl0c2VsZiwgc28gbm8gc2VwYXJhdGUgYnVpbGQgc3RlcCBpcyBuZWVkZWQuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRXcmFuZ2xlckRldkNvbW1hbmRzKHByb2plY3QsIGFyZ3YpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnODc4Nyc7XG4gICAgY29uc3Qgc3RhdGVEaXIgPSBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCk7XG5cbiAgICAvLyBUaGVzZSBoZWxwZXJzIHJlYWQgdGhlIGRlZmF1bHQtbmFtZWQgd3JhbmdsZXIgY29uZmlnOyB0aGF0IGlzIHNhZmUgYmVjYXVzZSB3b3JrZXJzU2NyaXB0c1xuICAgIC8vIGl0c2VsZiBpcyBvbmx5IHNlbGVjdGVkIHdoZW4gc3VjaCBhIGNvbmZpZyBmaWxlIGV4aXN0cyBpbiB0aGUgcHJvamVjdCBkaXJlY3RvcnkuXG4gICAgY29uc3QgY29tbWFuZHMgPSBbYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2LCAnLmRldi52YXJzJyldO1xuICAgIC8vIEFwcGx5IHdyYW5nbGVyLW5hdGl2ZSBEMSBtaWdyYXRpb25zIChpZiBhbnkpIHNvIHRoZSBsb2NhbCBkYXRhYmFzZSBtYXRjaGVzIHRoZSBkZXBsb3llZCBvbmUuXG4gICAgY29uc3QgZDFNaWdyYXRpb25zQ29tbWFuZCA9IGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3QpO1xuICAgIGlmIChkMU1pZ3JhdGlvbnNDb21tYW5kKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKGQxTWlncmF0aW9uc0NvbW1hbmQpO1xuICAgIH1cbiAgICBjb21tYW5kcy5wdXNoKFxuICAgICAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQoXG4gICAgICAgIGBkZXYgLS1pcCAxMjcuMC4wLjEgLS1wb3J0ICR7cHJvamVjdC5lbnYuUE9SVH0gLS1wZXJzaXN0LXRvIFwiJHtzdGF0ZURpcn1cIiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gY29tbWFuZHM7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHdvcmtlcnNTY3JpcHRzID0gbmV3IFdvcmtlcnNTY3JpcHRzKCk7XG4iLCJpbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuLi8uLi9jb21tYW5kcy9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aW5leHRTY3JpcHRzIH0gZnJvbSAnLi92aW5leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB3b3JrZXJzU2NyaXB0cyB9IGZyb20gJy4vd29ya2Vyc1NjcmlwdHMuanMnO1xuXG4vKiogUGlja3MgdGhlIHNjcmlwdHMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBwcm9qZWN0ICh0aGUgc2VsZWN0aW9uIGB3YiB0ZXN0YC9gd2IgdGVzdC1vbi1jaWAgc2hhcmUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFNjcmlwdHMocHJvamVjdDogUHJvamVjdCk6IEJhc2VTY3JpcHRzIHtcbiAgcmV0dXJuIHNlbGVjdEZyYW1ld29ya1NjcmlwdHMocHJvamVjdCkgPz8gKGRlcGVuZHNPbkh0dHBTZXJ2ZXJQYWNrYWdlKHByb2plY3QpID8gaHR0cFNlcnZlclNjcmlwdHMgOiBwbGFpbkFwcFNjcmlwdHMpO1xufVxuXG4vKiogVGhlIGZyYW1ld29yay1kZXRlY3Rpb24gcHJlZml4IGV2ZXJ5IGNvbnN1bWVyIHNoYXJlczsgYHdiIHN0YXJ0YCBjb21wb3NlcyBpdHMgb3duIHRhaWwgYXJvdW5kIGl0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEZyYW1ld29ya1NjcmlwdHMocHJvamVjdDogUHJvamVjdCk6IEJhc2VTY3JpcHRzIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIC8vIHZpbmV4dCBhcHBzIGFsc28gZGVwZW5kIG9uIG5leHQsIHNvIHRoaXMgY2hlY2sgbXVzdCBjb21lIGZpcnN0LlxuICBpZiAoZGVwcy52aW5leHQgfHwgZGV2RGVwcy52aW5leHQpIHJldHVybiB2aW5leHRTY3JpcHRzO1xuICBpZiAoZGVwcy5uZXh0KSByZXR1cm4gbmV4dFNjcmlwdHM7XG4gIGlmIChkZXZEZXBzLnZpdGUpIHJldHVybiB2aXRlU2NyaXB0cztcbiAgLy8gUGxhaW4gQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcDsgdmluZXh0IGFwcHMgYXJlIGRldGVjdGVkIGFib3ZlLlxuICBpZiAoZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KSkgcmV0dXJuIHdvcmtlcnNTY3JpcHRzO1xuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXBlbmRzT25IdHRwU2VydmVyUGFja2FnZShwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgcmV0dXJuIGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ107XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZGVwZW5kc09uSHR0cFNlcnZlclBhY2thZ2UsIHNlbGVjdEZyYW1ld29ya1NjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9zZWxlY3RTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCB0ZXN0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiU3RhcnQgYXBwLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIHRoZSB1bmRlcmx5aW5nIGFwcCBjb21tYW5kLiBFeGFtcGxlOiB3YiBzdGFydCAtLSAtLWhvc3QgMC4wLjAuMFwiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+XG4gICAgeWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KS5vcHRpb25zKGJ1aWxkZXIpIGFzIEFyZ3Y8XG4gICAgICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuICAgID4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzIHwgdW5kZWZpbmVkID0gc2VsZWN0RnJhbWV3b3JrU2NyaXB0cyhwcm9qZWN0KTtcbiAgICAgIGlmICghc2NyaXB0cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZGVwZW5kc09uSHR0cFNlcnZlclBhY2thZ2UocHJvamVjdCkgfHxcbiAgICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgICApIHtcbiAgICAgICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSA/PyAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdkZXZlbG9wbWVudCc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREZXYocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0YWdpbmcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnRQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA9IGAnL2Jpbi9iYXNoJ2A7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0gYXdhaXQgc2NyaXB0cy5zdGFydFRlc3QocHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFydCBtb2RlOiAke2FyZ3YubW9kZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgc2VsZWN0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3NlbGVjdFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGZpbmRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucywgcHJpbnRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyB9IGZyb20gJy4uL3V0aWxzL3Rlc3RTdHJ1Y3R1cmUuanMnO1xuXG5jb25zdCBBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCA9IG5ldyBSZWdFeHAoYCR7U3RyaW5nLmZyb21Db2RlUG9pbnQoMjcpfVxcXFxbWzAtP10qWyAtL10qW0Atfl1gLCAnZycpO1xuY29uc3QgU0lNSUxBUl9URVNUX09VVFBVVF9MT09LQkFDS19MSU5FX0NPVU5UID0gMjAwO1xuY29uc3QgU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTyA9IDAuMDU7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGUyZToge1xuICAgIGRlc2NyaXB0aW9uOiAnSG93IHRvIHJ1biBFMkUgdGVzdHMnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFtcbiAgICAgICdoZWFkbGVzcycsXG4gICAgICAnaGVhZGxlc3MtZGV2JyxcbiAgICAgICdoZWFkZWQnLFxuICAgICAgJ2hlYWRlZC1kZXYnLFxuICAgICAgJ2RvY2tlcicsXG4gICAgICAnZG9ja2VyLWRlYnVnJyxcbiAgICAgICdkZWJ1ZycsXG4gICAgICAnZ2VuZXJhdGUnLFxuICAgICAgJ3RyYWNlJyxcbiAgICBdLFxuICAgIGRlZmF1bHQ6ICdoZWFkbGVzcycsXG4gIH0sXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGJhaWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0b3AgdGVzdHMgYWZ0ZXIgdGhlIGZpcnN0IGZhaWx1cmUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ3VuaXQtdGltZW91dCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWVvdXQgZm9yIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgdGFyZ2V0czoge1xuICAgIGFycmF5OiB0cnVlLFxuICAgIGRlc2NyaXB0aW9uOiAnVW5pdCBvciBFMkUgdGVzdCB0YXJnZXQgcGF0aHMnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBUZXN0Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+O1xuXG5leHBvcnQgdHlwZSBUZXN0QXJndiA9IFBhcnRpYWw8XG4gIEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PlxuPjtcblxuZXhwb3J0IHR5cGUgVGVzdENvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFRlc3RDb21tYW5kT3B0aW9ucz4gJiB7ICctLSc/OiBzdHJpbmdbXSB9O1xuXG5pbnRlcmZhY2UgVGVzdFJ1bk9wdGlvbnMge1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgdGVzdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVGVzdENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3QgW3RhcmdldHMuLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgXCJUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgZmxhZ3MgdG8gUGxheXdyaWdodC4gRXhhbXBsZTogd2IgdGVzdCAtLSAtLWdyZXAgJ3VwbG9hZGVkIGltYWdlIGFzc2V0J1wiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pOiBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4gPT5cbiAgICB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5vcHRpb25zKGJ1aWxkZXIpXG4gICAgICAucG9zaXRpb25hbCgndGFyZ2V0cycsIGFyZ3VtZW50c0J1aWxkZXIudGFyZ2V0cykgYXMgQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdGVzdChhcmd2IGFzIFRlc3RDb21tYW5kQXJndikpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoYXJndjogVGVzdENvbW1hbmRBcmd2LCBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgdGVzdEFyZ3YgPSB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KGFyZ3YpO1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHModGVzdEFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgLy8gR2V0IHRlc3QgdGFyZ2V0cyBmcm9tIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4gIGNvbnN0IHRlc3RUYXJnZXRzID0gKHRlc3RBcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IHRlc3RBcmd2WyctLSddID8/IFtdO1xuICBjb25zdCB7IHNob3VsZFJ1bkUyZSwgc2hvdWxkUnVuVW5pdCB9ID0gcmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzKHRlc3RUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyk7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgLy8gUmVzb2x2ZSB0aGUgZW52aXJvbm1lbnQgZWFnZXJseTogd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudiBmb3JjZXMgdGhlIHRlc3QgY2FzY2FkZSBhbmRcbiAgICAvLyBQcm9qZWN0LmNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudiBmYWxscyBiYWNrIFdCX0VOViB0byB0aGF0IG1vZGUg4oCUIGJ1dCB0aGUgZW52IGdldHRlciBpc1xuICAgIC8vIGxhenksIHNvIGEgcHJvamVjdCB3aXRoIG5vIHJ1bm5hYmxlIHRlc3RzIHdvdWxkIG90aGVyd2lzZSBza2lwIHRoZSB2YWxpZGF0aW9uIGVudGlyZWx5LlxuICAgIHZvaWQgcHJvamVjdC5lbnY7XG5cbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IHNjcmlwdHMgPSBzZWxlY3RTY3JpcHRzKHByb2plY3QpO1xuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBzdHJ1Y3R1cmVWaW9sYXRpb25zID0gZmluZFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QpO1xuICAgIGlmIChzdHJ1Y3R1cmVWaW9sYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHByaW50VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMocHJvamVjdC5uYW1lLCBzdHJ1Y3R1cmVWaW9sYXRpb25zKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIC8vIFJ1biB1bml0IHRlc3RzIGlmIG5lZWRlZFxuICAgIGNvbnN0IGRlZmF1bHRVbml0VGFyZ2V0cyA9IGdldERlZmF1bHRVbml0VGFyZ2V0cyhwcm9qZWN0KTtcbiAgICBjb25zdCBleHBsaWNpdFVuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+ICFpc0UyZVRhcmdldCh0YXJnZXQpKTtcbiAgICBjb25zdCB1bml0VGFyZ2V0cyA9IGV4cGxpY2l0VW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IGV4cGxpY2l0VW5pdFRhcmdldHMgOiBkZWZhdWx0VW5pdFRhcmdldHM7XG4gICAgaWYgKHNob3VsZFJ1blVuaXQgJiYgdW5pdFRhcmdldHMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB1bml0QXJndiA9IHsgLi4udGVzdEFyZ3YsIHRhcmdldHM6IHVuaXRUYXJnZXRzIH07XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blVuaXRUZXN0Q29tbWFuZChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIHVuaXRBcmd2KSwgcHJvamVjdCwgdGVzdEFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgICAgICAgdGltZW91dDogdGVzdEFyZ3YudW5pdFRpbWVvdXQsXG4gICAgICB9KTtcbiAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFNraXAgZTJlIHRlc3RzIGlmIG5vdCBuZWVkZWQgb3Igbm8gZTJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIXNob3VsZFJ1bkUyZSB8fCAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBlMmUgdGFyZ2V0cyBmb3IgdGhpcyBwcm9qZWN0XG4gICAgY29uc3QgZTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiBpc0UyZVRhcmdldCh0YXJnZXQpKTtcbiAgICBjb25zdCBlMmVBcmd2ID0geyAuLi50ZXN0QXJndiwgdGFyZ2V0czogZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cyA6IHVuZGVmaW5lZCB9O1xuXG4gICAgc3dpdGNoICh0ZXN0QXJndi5lMmUpIHtcbiAgICAgIGNhc2UgJ2hlYWRsZXNzJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdoZWFkbGVzcy1kZXYnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0ZXN0T25Eb2NrZXIoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBlMmVBcmd2LFxuICAgICAgICAgIHNjcmlwdHMsXG4gICAgICAgICAgYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwcy5uZXh0IHx8IGRldkRlcHMudml0ZSkge1xuICAgICAgc3dpdGNoICh0ZXN0QXJndi5lMmUpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVkJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IFsnY29kZWdlbicsIGBodHRwOi8vbG9jYWxob3N0OiR7cHJvamVjdC5lbnYuUE9SVH1gXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RyYWNlJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCB0ZXN0QXJndiwge1xuICAgICAgICAgICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoYXJndjogVGVzdENvbW1hbmRBcmd2KTogVGVzdENvbW1hbmRBcmd2IHtcbiAgaWYgKGFyZ3YuY2FzY2FkZUVudiB8fCBhcmd2LmNhc2NhZGVOb2RlRW52IHx8IGFyZ3YuYXV0b0Nhc2NhZGVFbnYgPT09IGZhbHNlKSB7XG4gICAgLy8gRXhwbGljaXQgZW52IGZsYWdzIGtlZXAgdGhlaXIgcHJvZmlsZS1zZWxlY3Rpb24gc2VtYW50aWNzLCBidXQgdGhlIHNwYXduZWQgdGVzdHMgbXVzdCBzdGlsbFxuICAgIC8vIHJ1biBhcyBgdGVzdGAgd2hlbiB0aGUgc2VsZWN0ZWQgcHJvZmlsZSBkZWZpbmVzIG5vIFdCX0VOViAodGhlIHByZS0xNSBgfHw9ICd0ZXN0J2AgYmVoYXZpb3IpLlxuICAgIHJldHVybiB7IC4uLmFyZ3YsIGNvbW1hbmREZWZhdWx0V2JFbnY6ICd0ZXN0JyB9O1xuICB9XG4gIHJldHVybiB7IC4uLmFyZ3YsIGNhc2NhZGVFbnY6ICd0ZXN0JyB9O1xufVxuXG4vKipcbiAqIFVuaXQgdGVzdHMgbGl2ZSBvbmx5IHVuZGVyIGB0ZXN0L3VuaXQvYDsgYHRlc3QvZGVidWcvYCBydW5zIG9ubHkgd2hlbiBleHBsaWNpdGx5IHRhcmdldGVkLiBCb3RoXG4gKiB2aXRlc3QgYW5kIGBidW4gdGVzdGAgdHJlYXQgYSBiYXJlIGB0ZXN0YCBhcyBhIGZpbGVuYW1lIGZpbHRlciwgd2hpY2ggYWxzbyBtYXRjaGVzIGUuZy5cbiAqIGBzcmMvZm9vLnRlc3QudHNgLCBzbyB0aGUgdHJhaWxpbmcgc2xhc2ggdGhhdCBsaW1pdHMgdGhlIHRhcmdldCB0byB0aGUgZGlyZWN0b3J5IGlzIHJlcXVpcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZ1tdIHwgZmFsc2Uge1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpID8gWycuL3Rlc3QvdW5pdC8nXSA6IGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0T25Eb2NrZXIoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW10sXG4gIG9wdGlvbnM6IFRlc3RSdW5PcHRpb25zID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHByb2plY3QuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICBjb25zdCBidWlsZEV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgfSk7XG4gIGlmIChidWlsZEV4aXRDb2RlICE9PSAwKSB7XG4gICAgcmV0dXJuIGJ1aWxkRXhpdENvZGU7XG4gIH1cbiAgY29uc3QgdGVzdEV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgfSksXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGNvbnN0IHN0b3BFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YsIHtcbiAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICB9KTtcbiAgaWYgKHRlc3RFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiB0ZXN0RXhpdENvZGU7XG4gIH1cbiAgcmV0dXJuIHN0b3BFeGl0Q29kZTtcbn1cblxuZnVuY3Rpb24gcnVuVGVzdENvbW1hbmQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzJdLFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzNdID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBwcm9jZXNzU2lsZW50T3V0cHV0OiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBydW5Vbml0VGVzdENvbW1hbmQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzJdLFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzNdID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBvbWl0U2lsZW50U3RhcnQ6IHRydWUsXG4gICAgcHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5OiB0cnVlLFxuICAgIHNpbGVudFByb2dyZXNzSW50ZXJ2YWxNczogMTBfMDAwLFxuICAgIHNpbGVudFN1Y2Nlc3NNZXNzYWdlOiAnVW5pdCB0ZXN0cyBwYXNzZWQuJyxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZHVwZU5vaXN5VGVzdE91dHB1dChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcmVjZW50UHJpbnRlZExpbmVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVkdXBlZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgaXRlcmF0ZUxpbmVzKG91dHB1dCkpIHtcbiAgICBjb25zdCBub3JtYWxpemVkTGluZSA9IG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmUpO1xuICAgIGlmIChyZWNlbnRQcmludGVkTGluZVNldC5oYXMobm9ybWFsaXplZExpbmUpKSBjb250aW51ZTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVzLnNvbWUoKHByaW50ZWRMaW5lKSA9PiBhcmVMaW5lc1NpbWlsYXIocHJpbnRlZExpbmUsIG5vcm1hbGl6ZWRMaW5lKSkpIGNvbnRpbnVlO1xuXG4gICAgcHVzaFJlY2VudFByaW50ZWRMaW5lKHJlY2VudFByaW50ZWRMaW5lcywgcmVjZW50UHJpbnRlZExpbmVTZXQsIG5vcm1hbGl6ZWRMaW5lKTtcbiAgICBkZWR1cGVkTGluZXMucHVzaChsaW5lKTtcbiAgfVxuICByZXR1cm4gZGVkdXBlZExpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiogaXRlcmF0ZUxpbmVzKG91dHB1dDogc3RyaW5nKTogR2VuZXJhdG9yPHN0cmluZz4ge1xuICBsZXQgbGluZVN0YXJ0SW5kZXggPSAwO1xuICB3aGlsZSAobGluZVN0YXJ0SW5kZXggPD0gb3V0cHV0Lmxlbmd0aCkge1xuICAgIGNvbnN0IGxpbmVFbmRJbmRleCA9IG91dHB1dC5pbmRleE9mKCdcXG4nLCBsaW5lU3RhcnRJbmRleCk7XG4gICAgaWYgKGxpbmVFbmRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgeWllbGQgb3V0cHV0LnNsaWNlKGxpbmVTdGFydEluZGV4LCBsaW5lRW5kSW5kZXgpO1xuICAgIGxpbmVTdGFydEluZGV4ID0gbGluZUVuZEluZGV4ICsgMTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoUmVjZW50UHJpbnRlZExpbmUobGluZXM6IHN0cmluZ1tdLCBsaW5lU2V0OiBTZXQ8c3RyaW5nPiwgbGluZTogc3RyaW5nKTogdm9pZCB7XG4gIGxpbmVzLnB1c2gobGluZSk7XG4gIGxpbmVTZXQuYWRkKGxpbmUpO1xuICBpZiAobGluZXMubGVuZ3RoIDw9IFNJTUlMQVJfVEVTVF9PVVRQVVRfTE9PS0JBQ0tfTElORV9DT1VOVCkgcmV0dXJuO1xuXG4gIGNvbnN0IHJlbW92ZWRMaW5lID0gbGluZXMuc2hpZnQoKTtcbiAgaWYgKHJlbW92ZWRMaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICBsaW5lU2V0LmRlbGV0ZShyZW1vdmVkTGluZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGluZUZvclNpbWlsYXJpdHkobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxpbmVcbiAgICAucmVwbGFjZUFsbChBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCwgJycpXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlQWxsKC9eKD86XFxbW15cXF1dK1xcXVxccyopKy9nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFwobm9kZTpcXGQrXFwpL2csICcobm9kZTo8bnVtYmVyPiknKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJcXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZCspP1o/XFxiL2csICc8dGltZXN0YW1wPicpXG4gICAgLnJlcGxhY2VBbGwoLyhbPyZdY2FjaGU9KVxcZCsvZywgJyQxPG51bWJlcj4nKTtcbn1cblxuZnVuY3Rpb24gYXJlTGluZXNTaW1pbGFyKGE6IHN0cmluZywgYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1heExlbmd0aCA9IE1hdGgubWF4KGEubGVuZ3RoLCBiLmxlbmd0aCk7XG4gIGlmIChtYXhMZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICBpZiAoTWF0aC5hYnMoYS5sZW5ndGggLSBiLmxlbmd0aCkgPiBtYXhMZW5ndGggKiBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGRpc3RhbmNlKGEsIGIpIC8gbWF4TGVuZ3RoIDw9IFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU87XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKFxuICBlMmVUYXJnZXRzOiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW10sXG4gIGFkZGl0aW9uYWxBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhhc0ZvcndhcmRlZFBsYXl3cmlnaHRUYXJnZXRzID0gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMoZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLmxlbmd0aCA+IDA7XG4gIHJldHVybiBbJ3Rlc3QnLCAuLi4oZTJlVGFyZ2V0cy5sZW5ndGggPiAwIHx8IGhhc0ZvcndhcmRlZFBsYXl3cmlnaHRUYXJnZXRzID8gW10gOiBbJ3Rlc3QvZTJlLyddKSwgLi4uYWRkaXRpb25hbEFyZ3NdO1xufVxuXG4vLyBNYXRjaCB0aGUgdGVzdC9lMmUgcGF0aCBzZWdtZW50LCBub3QgdGhlICcvZTJlJyBzdWJzdHJpbmc6IGEgdW5pdCB0YXJnZXQgc3VjaCBhc1xuLy8gdGVzdC91bml0L2UyZUNvbmZpZy50ZXN0LnRzIG11c3Qgbm90IGJlIGNsYXNzaWZpZWQgYXMgYW4gZTJlIHRhcmdldC5cbmNvbnN0IEUyRV9UQVJHRVRfUkVHRVhQID0gLyg/Ol58XFwvKXRlc3RcXC9lMmUoPzpcXC98JCkvO1xuXG5mdW5jdGlvbiBpc0UyZVRhcmdldCh0YXJnZXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gRTJFX1RBUkdFVF9SRUdFWFAudGVzdCh0YXJnZXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzKFxuICB0ZXN0VGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiB7IHNob3VsZFJ1blVuaXQ6IGJvb2xlYW47IHNob3VsZFJ1bkUyZTogYm9vbGVhbiB9IHtcbiAgY29uc3QgaGFzRTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gaXNFMmVUYXJnZXQodGFyZ2V0KSk7XG4gIC8vIE5vbi1lMmUgdGFyZ2V0cyAodGVzdC91bml0LyBhbmQgdGVzdC9kZWJ1Zy8pIHJ1biB0aHJvdWdoIHRoZSB1bml0LXRlc3QgcnVubmVyLlxuICBjb25zdCBoYXNVbml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gIWlzRTJlVGFyZ2V0KHRhcmdldCkpO1xuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IHRlc3RUYXJnZXRzLmxlbmd0aCA9PT0gMCAmJiBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPT09IDA7XG5cbiAgcmV0dXJuIHtcbiAgICBzaG91bGRSdW5Vbml0OiBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNVbml0VGFyZ2V0cyxcbiAgICBzaG91bGRSdW5FMmU6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc0UyZVRhcmdldHMgfHwgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MubGVuZ3RoID4gMCxcbiAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgc2VsZWN0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3NlbGVjdFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZmluZFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zLCBwcmludFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zIH0gZnJvbSAnLi4vdXRpbHMvdGVzdFN0cnVjdHVyZS5qcyc7XG5cbmltcG9ydCB7IGdldERlZmF1bHRVbml0VGFyZ2V0cyB9IGZyb20gJy4vdGVzdC5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHtcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdGVzdE9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdC1vbi1jaScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0IG9uIENJIHdpdGggbm8gb3B0aW9ucy4nLFxuICBidWlsZGVyOiB0ZXN0T25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3RPbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RPbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBTcGF3bmVkIGNvbW1hbmRzIHJlLWRlcml2ZSB0aGVpciBlbnYgY2FzY2FkZSBmcm9tIHRoZSBleHBvcnRlZCBXQl9FTlYsIHNvIGFuIHVuZXhwb3J0ZWRcbiAgLy8gV0JfRU5WIHdvdWxkIGxldCBhIGNvbmZpZ3VyZWQgV0JfRU5WIGRlZmF1bHQgKGUuZy4gZGV2ZWxvcG1lbnQpIHNlbGVjdCB0aGUgZGV2ZWxvcG1lbnRcbiAgLy8gZW52aXJvbm1lbnQg4oCUIHJ1bm5pbmcgdGhlIGRlc3RydWN0aXZlIGUyZSBzdWl0ZSBhZ2FpbnN0IHRoZSBkZXZlbG9wZXIncyBvd24gZGF0YWJhc2UuXG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBwcm9qZWN0LmVudi5DSSB8fD0gJzEnO1xuICAgIC8vIE92ZXJ3cml0ZSwgbm90IHx8PTogcHJvamVjdC5lbnYgYWxyZWFkeSBjYXJyaWVzIHRoZSBkb3RlbnYtZGVyaXZlZCB2YWx1ZS5cbiAgICBwcm9qZWN0LmVudi5XQl9FTlYgPSBwcm9jZXNzLmVudi5XQl9FTlY7XG5cbiAgICBjb25zdCBzY3JpcHRzID0gc2VsZWN0U2NyaXB0cyhwcm9qZWN0KTtcblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3Qtb24tY2lcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgY29uc3Qgc3RydWN0dXJlVmlvbGF0aW9ucyA9IGZpbmRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyhwcm9qZWN0KTtcbiAgICBpZiAoc3RydWN0dXJlVmlvbGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBwcmludFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QubmFtZSwgc3RydWN0dXJlVmlvbGF0aW9ucyk7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0RvY2tlcmZpbGUgPSBwcm9qZWN0Lmhhc0RvY2tlcmZpbGU7XG4gICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoZG9ja2VyU2NyaXB0cy5zdG9wQWxsKCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBjb25zdCBkZWZhdWx0VW5pdFRhcmdldHMgPSBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdCk7XG4gICAgaWYgKGRlZmF1bHRVbml0VGFyZ2V0cyAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiBkZWZhdWx0VW5pdFRhcmdldHMgfTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndikucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICAvLyBDb25maXJtIGRldiBzZXJ2ZXIgc3RhcnR1cCBmb3IgY29uc2lzdGVuY3kgYWNyb3NzIHByb2plY3RzIHdpdGggRTJFIHRlc3RzLlxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChhd2FpdCBzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjcmlwdCA9IGhhc0RvY2tlcmZpbGVcbiAgICAgICAgPyBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEb2NrZXIocHJvamVjdCwgYXJndiwge30pXG4gICAgICAgIDogYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2LCB7fSk7XG4gICAgICAvLyBQcmVzZXJ2ZSBhIG5vbnplcm8gZXhpdCBjb2RlIGZyb20gYW4gZWFybGllciBwcm9qZWN0IChlLmcuIGEgbGF5b3V0IHZpb2xhdGlvbik6IGEgbGF0ZXJcbiAgICAgIC8vIHN1Y2Nlc3NmdWwgcHJvamVjdCBtdXN0IG5vdCByZXNldCB0aGUgZmFpbHVyZS5cbiAgICAgIGNvbnN0IGUyZUV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgIHNjcmlwdC5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHtcbiAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKGUyZUV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBlMmVFeGl0Q29kZTtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbnRlcmZhY2UgVHJlZUtpbGxDb21tYW5kQXJncyB7XG4gIHBpZDogbnVtYmVyO1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuY29uc3QgYnVpbGRlciA9ICh5YXJnczogQXJndik6IEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz4gPT5cbiAgeWFyZ3NcbiAgICAucG9zaXRpb25hbCgncGlkJywge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcHJvY2VzcyBJRCB0byBraWxsLicsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ3NpZ25hbCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmFsIHRvIHNlbmQgdG8gdGhlIHByb2Nlc3MgdHJlZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnU0lHVEVSTScsXG4gICAgfSkgYXMgQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPjtcblxuZXhwb3J0IGNvbnN0IHRyZWVLaWxsQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxvYmplY3QsIFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0ge1xuICBjb21tYW5kOiAndHJlZS1raWxsIDxwaWQ+IFtzaWduYWxdJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBnaXZlbiBwcm9jZXNzIGFuZCBhbGwgZGVzY2VuZGFudHMnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2lnbmFsID0gYXJndi5zaWduYWwgYXMgTm9kZUpTLlNpZ25hbHM7XG4gICAgICBpZiAoIShzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaWduYWw6ICR7c2lnbmFsfWApO1xuICAgICAgfVxuICAgICAgdHJlZUtpbGwoYXJndi5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbmV4cG9ydCB0eXBlIFR5cGVDaGVja0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3QgbG9hZGVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHByb2Nlc3MuZXhpdChhd2FpdCB0eXBlQ2hlY2soYXJndikpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHR5cGVDaGVjayhhcmd2OiBUeXBlQ2hlY2tDb21tYW5kQXJndik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBsZXQgcmVtb3ZlZE5leHREaXIgPSBmYWxzZSBhcyBib29sZWFuO1xuICBjb25zdCBwcm9taXNlcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gYnVpbGRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0KTtcbiAgICB3aGlsZSAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIHByZXNlcnZlQ29sb3I6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgLy8gUmUtdHJ5IHR5cGUgY2hlY2tpbmcgYWZ0ZXIgcmVtb3ZpbmcgYC5uZXh0YCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IG5leHREaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy5uZXh0Jyk7XG4gICAgICBpZiAoZXhpdENvZGUgJiYgZnMuZXhpc3RzU3luYyhuZXh0RGlyUGF0aCkpIHtcbiAgICAgICAgZnMucm1TeW5jKG5leHREaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1JlbW92ZWQgYC5uZXh0YCBkaXJlY3RvcnkuIFdlIHdpbGwgcmUtdHJ5IHR5cGUgY2hlY2tpbmcuJykpO1xuICAgICAgICByZW1vdmVkTmV4dERpciA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgZXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gIGZvciAoY29uc3QgZXhpdENvZGUgb2YgZXhpdENvZGVzKSB7XG4gICAgaWYgKGV4aXRDb2RlKSBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gIH1cbiAgaWYgKCFmaW5hbEV4aXRDb2RlKVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICByZW1vdmVkTmV4dERpclxuICAgICAgICAgID8gJy0tLS0tXFxuTm8gdHlwZSBlcnJvcnMgZm91bmQuIFBsZWFzZSBpZ25vcmUgdGhlIHByZXZpb3VzIHR5cGUgZXJyb3JzLCBhcyB0aGV5IHdlcmUgY2F1c2VkIGJ5IG91dGRhdGVkIE5leHQuanMgY2FjaGUgZmlsZXMuJ1xuICAgICAgICAgIDogJ05vIHR5cGUgZXJyb3JzIGZvdW5kLidcbiAgICAgIClcbiAgICApO1xuICByZXR1cm4gZmluYWxFeGl0Q29kZTtcbn1cblxuLyoqXG4gKiBFdmVyeSB0eXBlLWNoZWNrIGNvbW1hbmQgdGhpcyBwcm9qZWN0IHJ1bnMsIGFzIGBCVU5gL2BZQVJOYC1wcmVmaXhlZCBzY3JpcHRzLiBFeHBvcnRlZCBzb1xuICogYHdiIHZlcmlmeWAncyBzdGVwIHJlY2FwIGNhbiBuYW1lIHRoZSBzYW1lIHRvb2xzIGluc3RlYWQgb2YgcmUtZGVyaXZpbmcgdGhlIGNvbmRpdGlvbnMsIHdoaWNoXG4gKiB3b3VsZCBzaWxlbnRseSBnbyBzdGFsZSB0aGUgbmV4dCB0aW1lIHRoaXMgbGlzdCBjaGFuZ2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKHByb2plY3QuaGFzT3duU291cmNlQ29kZSkge1xuICAgIGNvbW1hbmRzLnB1c2goLi4uYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdCkpO1xuICB9XG4gIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmIHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgncHlyaWdodCcpKSB7XG4gICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gIH1cbiAgcmV0dXJuIGNvbW1hbmRzO1xufVxuXG5mdW5jdGlvbiBidWlsZFR5cGVTY3JpcHRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICAvLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSBjb21waWxlciBhcyBgdHlwZXNjcmlwdGAgKGB0c2NgKTsgd2JmeSByZW1vdmVzIHRoZVxuICAvLyBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgICh0c2dvKSBwcmV2aWV3IGZyb20gbm9uLU5leHQuanMgcmVwb3MgKE5leHQuanMtZmFtaWx5XG4gIC8vIHJlcG9zIGtlZXAgaXQgZm9yIGBuZXh0IGJ1aWxkYCksIHNvIHJlcG9zIHN0aWxsIG9uIHRoZSBwcmV2aWV3IHNob3VsZCBydW4gd2JmeVxuICAvLyBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gYSB0c2dvIGZhbGxiYWNrIGhlcmUuXG4gIGlmIChwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ3R5cGVzY3JpcHQnKSkge1xuICAgIHJldHVybiBbJ0JVTiB0c2MgLS1ub0VtaXQnXTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBjb25zdCB0Y0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICAuLi50eXBlQ2hlY2tDb21tYW5kLFxuICBjb21tYW5kOiAndGMnLFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cywgZmluZFJvb3RBbmRTZWxmUHJvamVjdHMsIGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlIH0gZnJvbSAnLi4vdXRpbHMvYnVuTG9ja2ZpbGUuanMnO1xuXG5pbXBvcnQgeyBidWlsZExpbnRDb21tYW5kLCBsaW50LCB0eXBlIExpbnRDb21tYW5kQXJndiB9IGZyb20gJy4vbGludC5qcyc7XG5pbXBvcnQgeyB0ZXN0LCB0eXBlIFRlc3RDb21tYW5kQXJndiwgd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudiB9IGZyb20gJy4vdGVzdC5qcyc7XG5pbXBvcnQgeyBidWlsZFR5cGVDaGVja0NvbW1hbmRzLCB0eXBlQ2hlY2ssIHR5cGUgVHlwZUNoZWNrQ29tbWFuZEFyZ3YgfSBmcm9tICcuL3R5cGVjaGVjay5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGZ1bGw6IHtcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgZGVzY3JpYmU6ICdSdW4gdGVzdHMgYWZ0ZXIgdmVyaWZ5aW5nIHByb2plY3QgY29kZScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xudHlwZSBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPjtcbnR5cGUgUGFja2FnZUNvbW1hbmRBcmd2ID0gUGljazxWZXJpZnlDb2RlQ29tbWFuZEFyZ3YsICdkcnlSdW4nIHwgJ3ZlcmJvc2UnPjtcblxuLyoqIEEgY29tcGxldGVkIGB3YiB2ZXJpZnlgIHN0ZXAsIHJlY29yZGVkIHNvIHRoZSBmaW5hbCBzdW1tYXJ5IGNhbiBwcm92ZSBldmVyeSBzdGVwIGFjdHVhbGx5IHJhbi4gKi9cbmludGVyZmFjZSBWZXJpZnlTdGVwIHtcbiAgLyoqXG4gICAqIEEgc2hvcnQgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgc3RlcCByYW4sIGUuZy4gYHRzYyAtLW5vRW1pdGAuIEFnZ3JlZ2F0ZWQgYWNyb3NzIHRoZSBkZXNjZW5kYW50XG4gICAqIHByb2plY3RzLCBzbyBgICsgYCBtZWFucyBlYWNoIHRvb2wgcmFuIHNvbWV3aGVyZSwgbm90IHRoYXQgb25lIGNvbW1hbmQgcmFuIHRoZW0gYWxsLiBPbWl0dGVkIHdoZW5cbiAgICogbm90aGluZyBiZXlvbmQgdGhlIHN0ZXAgbmFtZSBkZXNjcmliZXMgaXQuXG4gICAqL1xuICBkZXRhaWw/OiBzdHJpbmc7XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgdmVyaWZ5Q29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3ZlcmlmeScsXG4gIGRlc2NyaWJlOiAnVmVyaWZ5IHByb2plY3QgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGVwczogVmVyaWZ5U3RlcFtdID0gW107XG4gICAgaWYgKGFyZ3YuZnVsbCkge1xuICAgICAgYXdhaXQgdmVyaWZ5Q29kZUZ1bGx5KHByb2plY3RzLnNlbGYsIGFyZ3YsIHN0ZXBzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdmVyaWZ5Q29kZShwcm9qZWN0cy5zZWxmLCBhcmd2LCBzdGVwcyk7XG4gICAgICBwcmludFZlcmlmeVN1bW1hcnkoc3RlcHMsIEJvb2xlYW4oYXJndi5kcnlSdW4pKTtcbiAgICB9XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2LCBzdGVwczogVmVyaWZ5U3RlcFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9ydGVyID0gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdmVyaWZ5Q29kZShwcm9qZWN0LCBhcmd2LCBzdGVwcyk7XG4gICAgYXdhaXQgcnVuU3RlcChzdGVwcywgeyBuYW1lOiAndGVzdCcgfSwgKCkgPT4gcnVuUHJvamVjdFRlc3QocHJvamVjdCwgYXJndikpO1xuICAgIC8vIFByaW50ZWQgYmVmb3JlIHRoZSByZXBvcnRlciBmaW5pc2hlcyBzbyB0aGUgc3VtbWFyeSBsYW5kcyBpbiB2ZXJpZnktZnVsbC5sb2cgdG9vLlxuICAgIHByaW50VmVyaWZ5U3VtbWFyeShzdGVwcywgQm9vbGVhbihhcmd2LmRyeVJ1bikpO1xuICAgIHJlcG9ydGVyLnN1Y2NlZWQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXBvcnRlci5mYWlsKGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICByZXBvcnRlci5maW5pc2goKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndiwgc3RlcHM6IFZlcmlmeVN0ZXBbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kfSBpbnN0YWxsYDtcbiAgLy8gYGFsbG93RmFpbHVyZWAgc28gYSBmYWlsZWQgaW5zdGFsbCBzdGlsbCByZWFjaGVzIHRoZSBub3JtYWxpemF0aW9uIGJlbG93OiBidW4gcmV3cml0ZXMgdGhlXG4gIC8vIGxvY2tmaWxlIGJlZm9yZSBydW5uaW5nIGxpZmVjeWNsZSBzY3JpcHRzLCBzbyBhIHNjcmlwdCBmYWlsdXJlIHdvdWxkIG90aGVyd2lzZSBsZWF2ZSBHdWFyZFxuICAvLyBVUkxzIGluIHRoZSB3b3JraW5nIHRyZWUuIFRoZSBmYWlsdXJlIGlzIHJlcG9ydGVkIGFuZCBleGl0cyBleGFjdGx5IGFzIHJ1blBhY2thZ2VDb21tYW5kIHdvdWxkLlxuICBjb25zdCBpbnN0YWxsRXhpdENvZGUgPSBhd2FpdCBydW5TdGVwKHN0ZXBzLCB7IGRldGFpbDogaW5zdGFsbENvbW1hbmQsIG5hbWU6ICdpbnN0YWxsJyB9LCAoKSA9PlxuICAgIHJ1blBhY2thZ2VDb21tYW5kKGluc3RhbGxDb21tYW5kLCBwcm9qZWN0LCBhcmd2LCB7IGFsbG93RmFpbHVyZTogdHJ1ZSB9KVxuICApO1xuICAvLyBUaGUgcmVwb3NpdG9yeSBtYXkgaGF2ZSBubyBgZ2VuLWNvZGVgIHNjcmlwdCAod2hlcmUgdGhlIHNhbWUgbm9ybWFsaXphdGlvbiBydW5zIGF0IHBvc3RpbnN0YWxsKSxcbiAgLy8gYW5kIGB2ZXJpZnlgIGlzIHRoZSBjb21tYW5kIGEgZGV2ZWxvcGVyIHJ1bnMgYmVmb3JlIGNvbW1pdHRpbmcuXG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBub3JtYWxpemVCdW5Mb2NrZmlsZShwcm9qZWN0LnJvb3REaXJQYXRoKTtcbiAgfVxuICBpZiAoaW5zdGFsbEV4aXRDb2RlICE9PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2luc3RhbGxFeGl0Q29kZX0pOmApLCBpbnN0YWxsQ29tbWFuZCkpO1xuICAgIHByb2Nlc3MuZXhpdChpbnN0YWxsRXhpdENvZGUpO1xuICB9XG4gIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkge1xuICAgIGNvbnN0IGdlbkNvZGVDb21tYW5kID0gYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmR9IGdlbi1jb2RlYDtcbiAgICBhd2FpdCBydW5TdGVwKHN0ZXBzLCB7IGRldGFpbDogZ2VuQ29kZUNvbW1hbmQsIG5hbWU6ICdnZW4tY29kZScgfSwgKCkgPT5cbiAgICAgIHJ1blBhY2thZ2VDb21tYW5kKGdlbkNvZGVDb21tYW5kLCBwcm9qZWN0LCBhcmd2KVxuICAgICk7XG4gIH1cbiAgLy8gUmVzb2x2ZWQgYWZ0ZXIgYGdlbi1jb2RlYCBzbyBhIGdlbmVyYXRlZCBgc3JjYCBkaXJlY3RvcnkgaXMgYWxyZWFkeSB0aGVyZSBmb3IgYGhhc1NvdXJjZUNvZGVgLFxuICAvLyB3aGljaCBpcyBhbiBleGlzdHNTeW5jIGNoZWNrLCBhbmQgcmV1c2VkIGJ5IGJvdGggc3RlcCBkZXRhaWxzIGJlbG93LiBUaGUgcHJvamVjdCBmYWN0b3JpZXNcbiAgLy8gc2hhcmUgaW5zdGFuY2VzIHBlciAoZGlyZWN0b3J5LCBsb2FkRW52LCBlbnYtcmVsZXZhbnQgYXJndiksIHNvIGB0eXBlY2hlY2tgIHJldXNlcyB0aGlzIHZlcnlcbiAgLy8gZ3JhcGggd2hpbGUgYGxpbnRgICh3aGljaCBhZGRzIC0tc2lsZW50KSByZXNvbHZlcyBpdHMgb3duLlxuICBjb25zdCBzdGVwRGV0YWlscyA9IGF3YWl0IGJ1aWxkU3RlcERldGFpbHMoYXJndik7XG4gIC8vIGBsaW50IC0tZml4IC0tZm9ybWF0YCBwcmludHMgbm90aGluZyBvbiBzdWNjZXNzLCBzbyB3aXRob3V0IHRoZSBzdGVwIHN1bW1hcnkgYSBwYXNzaW5nIGB2ZXJpZnlgXG4gIC8vIGxvb2tzIGxpa2UgaXQgbmV2ZXIgbGludGVkIGF0IGFsbCDigJQgYW5kIGl0IHNpbGVudGx5IHJld3JvdGUgdGhlIHdvcmtpbmcgdHJlZSB3aGlsZSBhdCBpdC5cbiAgYXdhaXQgcnVuU3RlcChzdGVwcywgeyBkZXRhaWw6IHN0ZXBEZXRhaWxzLmNsZWFudXAsIG5hbWU6ICdjbGVhbnVwJyB9LCAoKSA9PlxuICAgIHJ1bkluUHJvY2Vzc0NvbW1hbmQoJ2NsZWFudXAnLCAoKSA9PlxuICAgICAgbGludCh7XG4gICAgICAgIC4uLmFyZ3YsXG4gICAgICAgIF86IFsnbGludCddLFxuICAgICAgICBmaXg6IHRydWUsXG4gICAgICAgIGZvcm1hdDogdHJ1ZSxcbiAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgfSBhcyB1bmtub3duIGFzIExpbnRDb21tYW5kQXJndilcbiAgICApXG4gICk7XG4gIC8vIFR5cGUtYXdhcmUgbGludCByZXBvcnRzIFR5cGVTY3JpcHQgZGlhZ25vc3RpY3Mgb25seSBmb3IgdGhlIGZpbGVzIG94bGludCBhY3R1YWxseSBsaW50cywgYW5kXG4gIC8vIHRoZSBzaGFyZWQgY29uZmlnIGlnbm9yZXMgZGlyZWN0b3JpZXMgdHNjIHN0aWxsIGNvbXBpbGVzIChlLmcuIGBfX2dlbmVyYXRlZF9fYCwgYEB0eXBlc2AsXG4gIC8vIGBkaXN0YCkuIEtlZXAgdGhlIHR5cGVjaGVjayBjb21tYW5kIHNvIGB2ZXJpZnlgIHN0YXlzIGVxdWl2YWxlbnQgdG8gXCJ0aGUgcmVwb3NpdG9yeSBjb21waWxlc1wiLlxuICAvLyBUaGUgb3ZlcmxhcCB3aXRoIGxpbnQgaXMgZGVsaWJlcmF0ZTogYC0tdHlwZS1hd2FyZWAgYWxzbyBwb3dlcnMgdHlwZS1hd2FyZSBsaW50IHJ1bGVzLCBhbmRcbiAgLy8gZHJvcHBpbmcgb25seSBgLS10eXBlLWNoZWNrYCBmcm9tIGxpbnQgc2F2ZXMgfjAuMXMsIGZhciBsZXNzIHRoYW4gdGhlIGNvdmVyYWdlIGl0IHdvdWxkIGNvc3QuXG4gIGF3YWl0IHJ1blN0ZXAoc3RlcHMsIHsgZGV0YWlsOiBzdGVwRGV0YWlscy50eXBlY2hlY2ssIG5hbWU6ICd0eXBlY2hlY2snIH0sICgpID0+XG4gICAgcnVuSW5Qcm9jZXNzQ29tbWFuZCgndHlwZWNoZWNrJywgKCkgPT4gdHlwZUNoZWNrKHsgLi4uYXJndiwgXzogWyd0eXBlY2hlY2snXSB9IGFzIHVua25vd24gYXMgVHlwZUNoZWNrQ29tbWFuZEFyZ3YpKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Qcm9qZWN0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdGVzdEFyZ3YgPSB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KHtcbiAgICAuLi5hcmd2LFxuICAgIF86IFsndGVzdCddLFxuICAgIGUyZTogJ2hlYWRsZXNzJyxcbiAgICBzaWxlbnQ6IHRydWUsXG4gIH0gYXMgdW5rbm93biBhcyBUZXN0Q29tbWFuZEFyZ3YpO1xuICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSByZXR1cm47XG5cbiAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGItcmVzZXQnXSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCAndGVzdCcpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKFxuICAgIGNoYWxrLnllbGxvdygnVGVzdHMgZmFpbGVkLiBUaGlzIHByb2plY3QgZGVmaW5lcyBcImRiLXJlc2V0XCIsIHNvIHdiIHdpbGwgcmVzZXQgdGhlIGRhdGFiYXNlIG9uY2UgYW5kIHJldHJ5IHRlc3RzLicpXG4gICk7XG4gIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kfSBkYi1yZXNldGAsIGZpbmRUZXN0UHJvamVjdChwcm9qZWN0LCB0ZXN0QXJndiksIHRlc3RBcmd2LCB7XG4gICAgcHJpbnRSYXdPdXRwdXQ6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IHJldHJ5RXhpdENvZGUgPSBhd2FpdCB0ZXN0KHRlc3RBcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gIGlmIChyZXRyeUV4aXRDb2RlICE9PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke3JldHJ5RXhpdENvZGV9KTpgKSwgJ3Rlc3QgYWZ0ZXIgZGItcmVzZXQgcmV0cnknKSk7XG4gICAgcHJvY2Vzcy5leGl0KHJldHJ5RXhpdENvZGUpO1xuICB9XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignVGVzdHMgcGFzc2VkIGFmdGVyIGRiLXJlc2V0IHJldHJ5LicpKTtcbn1cblxuZnVuY3Rpb24gZmluZFRlc3RQcm9qZWN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RDb21tYW5kQXJndik6IFByb2plY3Qge1xuICBjb25zdCB0ZXN0UHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0LmRpclBhdGgpO1xuICBpZiAoIXRlc3RQcm9qZWN0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQcm9qZWN0IG5vdCBmb3VuZDogJHtwcm9qZWN0LmRpclBhdGh9YCk7XG4gIH1cbiAgcmV0dXJuIHRlc3RQcm9qZWN0O1xufVxuXG4vKipcbiAqIE5hbWVzIHRoZSB0b29scyBiZWhpbmQgdGhlIGBjbGVhbnVwYCBhbmQgYHR5cGVjaGVja2Agc3RlcHMuXG4gKlxuICogQm90aCBzdGVwcyB0eXBlLWNoZWNrLCB3aGljaCByZWFkcyBhcyByZWR1bmRhbnQgdW50aWwgdGhlIHJlY2FwIHNheXMgaG93IHRoZXkgZGlmZmVyOiBgY2xlYW51cGBcbiAqIHR5cGUtY2hlY2tzIHRocm91Z2ggb3hsaW50LCB3aGljaCBzZWVzIG9ubHkgdGhlIGZpbGVzIGl0IGxpbnRzICh0aGUgc2hhcmVkIGNvbmZpZyBpZ25vcmVzXG4gKiBgX19nZW5lcmF0ZWRfX2AsIGBAdHlwZXNgLCBgZGlzdGAsIC4uLiksIHdoaWxlIGB0eXBlY2hlY2tgIHJ1bnMgdGhlIGNvbXBpbGVyIG92ZXIgdGhlIHdob2xlXG4gKiB0c2NvbmZpZyBwcm9ncmFtLiBFdmVyeSBsYWJlbCBpcyBkZXJpdmVkIGZyb20gdGhlIHJlc29sdmVkIHByb2plY3RzIHJhdGhlciB0aGFuIGhhcmQtY29kZWQsIHNvIGFcbiAqIHJlcG9zaXRvcnkgd2hvc2UgYGNsZWFudXBgIHJ1bnMgZmxha2U4IG9yIGBkYXJ0IGFuYWx5emVgIGlzIG5ldmVyIHRvbGQgaXQgcmFuIG94bGludC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRTdGVwRGV0YWlscyhhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHsgY2xlYW51cDogc3RyaW5nOyB0eXBlY2hlY2s/OiBzdHJpbmcgfT4ge1xuICBjb25zdCBjbGVhbnVwID0gJ2xpbnQgLS1maXggLS1mb3JtYXQnO1xuICAvLyBEZWxpYmVyYXRlbHkgcmVzb2x2ZWQgd2l0aCBubyBleHBsaWNpdCBkaXJQYXRoLCBleGFjdGx5IGFzIGBsaW50YCAobGludC50cykgYW5kIGB0eXBlQ2hlY2tgXG4gIC8vICh0eXBlY2hlY2sudHMpIHJlc29sdmUgdGhlaXJzLCBzbyB0aGUgbGFiZWxzIGFsd2F5cyBkZXNjcmliZSB0aGUgdmVyeSBwcm9qZWN0IHNldCB0aG9zZSBjb21tYW5kc1xuICAvLyBwcm9jZXNzLiBUaHJlYWRpbmcgYSBkaXJQYXRoIGluIOKAlCB0aGUgc2VsZiBwcm9qZWN0J3MsIHNheSDigJQgd291bGQgbGV0IHRoZSB0d28gZGl2ZXJnZSwgd2hpY2ggaXNcbiAgLy8gdGhlIGRyaWZ0IHRoaXMgZnVuY3Rpb24gZXhpc3RzIHRvIHByZXZlbnQuXG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHJldHVybiB7IGNsZWFudXAgfTtcblxuICAvLyBBc2tzIHRoZSByZWFsIGJ1aWxkZXJzIHdoYXQgdGhleSB3b3VsZCBydW4gcmF0aGVyIHRoYW4gcmVzdGF0aW5nIHRoZWlyIGNvbmRpdGlvbnMsIHNvIGEgY2hhbmdlXG4gIC8vIHRvIGVpdGhlciBjb21tYW5kIGNhbm5vdCBsZWF2ZSB0aGVzZSBsYWJlbHMgZGVzY3JpYmluZyBzb21ldGhpbmcgaXQgc3RvcHBlZCBkb2luZy4gT25seSB0aGVcbiAgLy8gcHJvamVjdCBzZWxlY3Rpb24gaXMgcmVzdGF0ZWQ6IGBsaW50YCBhbmQgYHR5cGVDaGVja2AgYXBwbHkgaXQgYXJvdW5kIHRoZWlyIGJ1aWxkZXJzLCBub3RcbiAgLy8gaW5zaWRlIHRoZW0uXG4gIGNvbnN0IHJ1bnNUeXBlQXdhcmVMaW50ID0gcHJvamVjdHMuZGVzY2VuZGFudHMuc29tZShcbiAgICAocHJvamVjdCkgPT5cbiAgICAgIHByb2plY3QuaGFzT3duU291cmNlQ29kZSAmJiBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIHsgZml4OiB0cnVlLCBmb3JtYXQ6IHRydWUgfSk/LmluY2x1ZGVzKCctLXR5cGUtYXdhcmUnKVxuICApO1xuICBjb25zdCB0eXBlQ2hlY2tDb21tYW5kcyA9IFtcbiAgICAuLi5uZXcgU2V0KHByb2plY3RzLmRlc2NlbmRhbnRzLmZsYXRNYXAoKHByb2plY3QpID0+IGJ1aWxkVHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdCkubWFwKHRvRGlzcGxheUNvbW1hbmQpKSksXG4gIF07XG4gIHJldHVybiB7XG4gICAgY2xlYW51cDogcnVuc1R5cGVBd2FyZUxpbnQgPyBgJHtjbGVhbnVwfSAob3hsaW50IC0tdHlwZS1hd2FyZSAtLXR5cGUtY2hlY2spYCA6IGNsZWFudXAsXG4gICAgdHlwZWNoZWNrOiB0eXBlQ2hlY2tDb21tYW5kcy5sZW5ndGggPiAwID8gdHlwZUNoZWNrQ29tbWFuZHMuam9pbignICsgJykgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKiBEcm9wcyB0aGUgcGFja2FnZS1tYW5hZ2VyIHBsYWNlaG9sZGVyIGBydW5XaXRoU3Bhd25gIGV4cGFuZHMsIGxlYXZpbmcgdGhlIHRvb2wgY2FsbCB0byBzaG93LiAqL1xuZnVuY3Rpb24gdG9EaXNwbGF5Q29tbWFuZChjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29tbWFuZC5yZXBsYWNlKC9eKD86QlVOfFlBUk4pIC91LCAnJyk7XG59XG5cbi8qKiBUaW1lcyBhIHN0ZXAgYW5kIHJlY29yZHMgaXQgZm9yIHRoZSBmaW5hbCBzdW1tYXJ5LiBTdGVwcyB0aGF0IGZhaWwgZXhpdCB0aGUgcHJvY2VzcyBpbnN0ZWFkLiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuU3RlcDxUPihcbiAgc3RlcHM6IFZlcmlmeVN0ZXBbXSxcbiAgc3RlcDogT21pdDxWZXJpZnlTdGVwLCAnZHVyYXRpb25Ncyc+LFxuICBydW46ICgpID0+IFByb21pc2U8VD5cbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW4oKTtcbiAgc3RlcHMucHVzaCh7IC4uLnN0ZXAsIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUnVucyBhIHN0ZXAgdGhhdCBzdWNjZWVkcyBzaWxlbnRseTogdGhlIHJlY2FwIGlzIHRoZSBzaW5nbGUgcGxhY2UgYSBzdWNjZXNzZnVsIHN0ZXAgaXMgYW5ub3VuY2VkLFxuICogc28gd3JhcHBlciBgU3RhcnRgL2BGaW5pc2hlZGAgbGluZXMgd291bGQgb25seSByZXBlYXQgaXQuIEZhaWx1cmVzIHN0aWxsIHJlcG9ydCBiZWZvcmUgZXhpdGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuSW5Qcm9jZXNzQ29tbWFuZChjb21tYW5kTmFtZTogc3RyaW5nLCBjb21tYW5kOiAoKSA9PiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBleGl0Q29kZSA9IChhd2FpdCBjb21tYW5kKCkpID8/IDA7XG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kTmFtZSkpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG4vKipcbiAqIFJlY2FwcyBldmVyeSBjb21wbGV0ZWQgc3RlcC5cbiAqXG4gKiBgd2IgdmVyaWZ5YCBpcyBwcmltYXJpbHkgY29uc3VtZWQgYnkgQUkgY29kaW5nIGFnZW50cywgYW5kIGl0cyBwZXItY29tbWFuZCBvdXRwdXQgaXMgdW5ldmVuOiBhXG4gKiBzdWNjZXNzZnVsIGBjbGVhbnVwYCBwcmludHMgbm90aGluZyBhdCBhbGwgd2hpbGUgYHR5cGVjaGVja2AgcHJpbnRzIHBlci1wYWNrYWdlIHByb2dyZXNzLiBSZWFkaW5nXG4gKiBhIHBhc3NpbmcgcnVuIHRoZXJlZm9yZSBnYXZlIG5vIGV2aWRlbmNlIHRoYXQgbGludGluZyBoYXBwZW5lZCwgc28gdGhlIHJlY2FwIGxpc3RzIGVhY2ggc3RlcCB0aGF0XG4gKiByYW4sIHdoYXQgaXQgcmFuLCBhbmQgaG93IGxvbmcgaXQgdG9vay5cbiAqL1xuZnVuY3Rpb24gcHJpbnRWZXJpZnlTdW1tYXJ5KHN0ZXBzOiBWZXJpZnlTdGVwW10sIGRyeVJ1bjogYm9vbGVhbik6IHZvaWQge1xuICBpZiAoc3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgbmFtZVdpZHRoID0gTWF0aC5tYXgoLi4uc3RlcHMubWFwKChzdGVwKSA9PiBzdGVwLm5hbWUubGVuZ3RoKSk7XG4gIC8vIGAtLWRyeS1ydW5gIHNraXBzIGNvbW1hbmQgZXhlY3V0aW9uLCBzbyBldmVyeSBzdGVwIHRvb2sgbm8gdGltZSBhbmQgdmVyaWZpZWQgbm90aGluZzogYSBncmVlblxuICAvLyBcIlZlcmlmaWVkXCIgcmVjYXAgd291bGQgY2xhaW0gZXhhY3RseSB0aGUgd29yayB0aGUgZmxhZyBzdXBwcmVzc2VkLiBMaXN0IHdoYXQgd291bGQgcnVuIGluc3RlYWQuXG4gIGlmIChkcnlSdW4pIHtcbiAgICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0RyeSBydW4g4oCUIG5vdGhpbmcgd2FzIGV4ZWN1dGVkLiBTdGVwcyB0aGF0IHdvdWxkIHJ1bjonKSkpO1xuICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGVwcykge1xuICAgICAgLy8gUGFkIG9ubHkgd2hlbiBhIGRldGFpbCBmb2xsb3dzLCBzbyBhIGRldGFpbC1sZXNzIHN0ZXAgZG9lcyBub3QgZW1pdCB0cmFpbGluZyB3aGl0ZXNwYWNlLlxuICAgICAgY29uc29sZS5pbmZvKGAgIC0gJHtzdGVwLmRldGFpbCA/IHN0ZXAubmFtZS5wYWRFbmQobmFtZVdpZHRoKSArIGNoYWxrLmdyYXkoYCAgJHtzdGVwLmRldGFpbH1gKSA6IHN0ZXAubmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZHVyYXRpb25zID0gc3RlcHMubWFwKChzdGVwKSA9PiBmb3JtYXRTdGVwRHVyYXRpb24oc3RlcC5kdXJhdGlvbk1zKSk7XG4gIGNvbnN0IGR1cmF0aW9uV2lkdGggPSBNYXRoLm1heCguLi5kdXJhdGlvbnMubWFwKChkdXJhdGlvbikgPT4gZHVyYXRpb24ubGVuZ3RoKSk7XG4gIGNvbnN0IHRvdGFsRHVyYXRpb25NcyA9IHN0ZXBzLnJlZHVjZSgodG90YWwsIHN0ZXApID0+IHRvdGFsICsgc3RlcC5kdXJhdGlvbk1zLCAwKTtcbiAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZChgVmVyaWZpZWQgaW4gJHtmb3JtYXRTdGVwRHVyYXRpb24odG90YWxEdXJhdGlvbk1zKX06YCkpKTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIHN0ZXBdIG9mIHN0ZXBzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gKGR1cmF0aW9uc1tpbmRleF0gYXMgc3RyaW5nKS5wYWRTdGFydChkdXJhdGlvbldpZHRoKTtcbiAgICBjb25zdCBkZXRhaWwgPSBzdGVwLmRldGFpbCA/IGAgICR7c3RlcC5kZXRhaWx9YCA6ICcnO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignICDinJQgJykgKyBzdGVwLm5hbWUucGFkRW5kKG5hbWVXaWR0aCkgKyBjaGFsay5ncmF5KGAgICR7ZHVyYXRpb259JHtkZXRhaWx9YCkpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blBhY2thZ2VDb21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhY2thZ2VDb21tYW5kQXJndixcbiAgb3B0aW9uczogeyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuOyBwcmludFJhd091dHB1dD86IGJvb2xlYW4gfSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBwcmludENvbW1hbmQoY29tbWFuZCwgcHJvamVjdC5kaXJQYXRoKTtcbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKGNvbW1hbmQsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IHByZXNlcnZlQ29sb3I6IGZhbHNlIH0pLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiAncGlwZScsXG4gICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHByaW50aW5nU3Rkb3V0OiBvcHRpb25zLnByaW50UmF3T3V0cHV0LFxuICAgIHByaW50aW5nU3RkZXJyOiBvcHRpb25zLnByaW50UmF3T3V0cHV0LFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICBpZiAoIW9wdGlvbnMucHJpbnRSYXdPdXRwdXQpIHtcbiAgICBwcmludFBhY2thZ2VDb21tYW5kT3V0cHV0KGNvbW1hbmQsIGV4aXRDb2RlLCByZXQuc3Rkb3V0KTtcbiAgfVxuXG4gIGlmIChleGl0Q29kZSAhPT0gMCAmJiAhb3B0aW9ucy5hbGxvd0ZhaWx1cmUpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgY29tbWFuZCkpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG4vKipcbiAqIFByaW50cyBwYWNrYWdlIGNvbW1hbmQgb3V0cHV0IGZvciBgd2IgdmVyaWZ5YC5cbiAqXG4gKiBgd2IgdmVyaWZ5YCBpcyBwcmltYXJpbHkgY29uc3VtZWQgYnkgQUkgY29kaW5nIGFnZW50cywgc28gc3VjY2Vzc2Z1bCBub2lzeVxuICogY29tbWFuZHMgYXJlIHN1bW1hcml6ZWQgd2hpbGUgZmFpbHVyZSBvdXRwdXQgcmVtYWlucyBhdmFpbGFibGUgZm9yIGRpYWdub3Npcy5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCBUaGUgZXhlY3V0ZWQgY29tbWFuZC5cbiAqIEBwYXJhbSBleGl0Q29kZSBUaGUgY29tbWFuZCBleGl0IGNvZGUuXG4gKiBAcGFyYW0gb3V0cHV0IFRoZSBtZXJnZWQgc3Rkb3V0IGFuZCBzdGRlcnIgb3V0cHV0IGZyb20gdGhlIGNvbW1hbmQuXG4gKi9cbmZ1bmN0aW9uIHByaW50UGFja2FnZUNvbW1hbmRPdXRwdXQoY29tbWFuZDogc3RyaW5nLCBleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDAgJiYgL14oPzpidW58eWFybikgKD86aW5zdGFsbHxnZW4tY29kZSkkL3UudGVzdChjb21tYW5kKSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignU3VjY2VlZGVkLicpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0cmltbWVkT3V0cHV0ID0gb3V0cHV0LnRyaW0oKTtcbiAgaWYgKHRyaW1tZWRPdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSh0cmltbWVkT3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgY3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuY3lhbihjaGFsay5ib2xkKCdDb21tYW5kOicpLCBjb21tYW5kKSArIGNoYWxrLmdyYXkoYCBhdCAke2N3ZH1gKSk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0VmVyaWZ5RnVsbFJlcG9ydGVyKHByb2plY3Q6IFByb2plY3QpOiB7XG4gIGZhaWw6IChlcnJvcj86IHVua25vd24pID0+IHZvaWQ7XG4gIGZpbmlzaDogKCkgPT4gdm9pZDtcbiAgc3VjY2VlZDogKCkgPT4gdm9pZDtcbn0ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCB3YkRpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLndiJyk7XG4gIGZzLm1rZGlyU3luYyh3YkRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGxvZ0ZpbGVQYXRoID0gcGF0aC5qb2luKHdiRGlyUGF0aCwgJ3ZlcmlmeS1mdWxsLmxvZycpO1xuICBjb25zdCBsb2dGaWxlID0gZnMub3BlblN5bmMobG9nRmlsZVBhdGgsICd3Jyk7XG4gIGNvbnN0IG9yaWdpbmFsU3Rkb3V0V3JpdGUgPSBwcm9jZXNzLnN0ZG91dC53cml0ZS5iaW5kKHByb2Nlc3Muc3Rkb3V0KTtcbiAgY29uc3Qgb3JpZ2luYWxTdGRlcnJXcml0ZSA9IHByb2Nlc3Muc3RkZXJyLndyaXRlLmJpbmQocHJvY2Vzcy5zdGRlcnIpO1xuICBsZXQgc3VjY2VlZGVkID0gZmFsc2U7XG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlID0gdGVlV3JpdGUob3JpZ2luYWxTdGRvdXRXcml0ZSwgbG9nRmlsZSkgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xuICBwcm9jZXNzLnN0ZGVyci53cml0ZSA9IHRlZVdyaXRlKG9yaWdpbmFsU3RkZXJyV3JpdGUsIGxvZ0ZpbGUpIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZGVyci53cml0ZTtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnRnVsbCBsb2c6JyksIGxvZ0ZpbGVQYXRoKSk7XG5cbiAgY29uc3QgZmluaXNoID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChmaW5pc2hlZCkgcmV0dXJuO1xuICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlID0gb3JpZ2luYWxTdGRvdXRXcml0ZSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUgPSBvcmlnaW5hbFN0ZGVycldyaXRlIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZGVyci53cml0ZTtcblxuICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gZm9ybWF0RWxhcHNlZFRpbWUoRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCk7XG4gICAgY29uc3Qgc3RhdHVzID0gc3VjY2VlZGVkID8gJ1N1Y2NlZWRlZCcgOiAnRmFpbGVkJztcbiAgICBjb25zdCBzdW1tYXJ5ID0gYCR7c3RhdHVzfSBpbiAke2VsYXBzZWRUaW1lfS4gRnVsbCBsb2c6ICR7bG9nRmlsZVBhdGh9XFxuYDtcbiAgICBjb25zdCBjb2xvcmVkU3VtbWFyeSA9IHN1Y2NlZWRlZCA/IGNoYWxrLmdyZWVuKHN1bW1hcnkpIDogY2hhbGsucmVkKHN1bW1hcnkpO1xuICAgIG9yaWdpbmFsU3Rkb3V0V3JpdGUoY29sb3JlZFN1bW1hcnkpO1xuICAgIGZzLndyaXRlU3luYyhsb2dGaWxlLCBzdW1tYXJ5KTtcbiAgICBmcy5jbG9zZVN5bmMobG9nRmlsZSk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbmNlKCdleGl0JywgZmluaXNoKTtcblxuICByZXR1cm4ge1xuICAgIGZhaWw6IChlcnJvcikgPT4ge1xuICAgICAgc3VjY2VlZGVkID0gZmFsc2U7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSxcbiAgICBmaW5pc2g6ICgpID0+IHtcbiAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2V4aXQnLCBmaW5pc2gpO1xuICAgICAgZmluaXNoKCk7XG4gICAgfSxcbiAgICBzdWNjZWVkOiAoKSA9PiB7XG4gICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRlZVdyaXRlKG9yaWdpbmFsV3JpdGU6IHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZSwgbG9nRmlsZTogbnVtYmVyKTogdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlIHtcbiAgcmV0dXJuICgoXG4gICAgY2h1bms6IFVpbnQ4QXJyYXkgfCBzdHJpbmcsXG4gICAgZW5jb2RpbmdPckNhbGxiYWNrPzogQnVmZmVyRW5jb2RpbmcgfCAoKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkKSxcbiAgICBjYWxsYmFjaz86IChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZFxuICApID0+IHtcbiAgICBjb25zdCBidWZmZXIgPVxuICAgICAgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJ1xuICAgICAgICA/IEJ1ZmZlci5mcm9tKGNodW5rLCB0eXBlb2YgZW5jb2RpbmdPckNhbGxiYWNrID09PSAnc3RyaW5nJyA/IGVuY29kaW5nT3JDYWxsYmFjayA6ICd1dGY4JylcbiAgICAgICAgOiBjaHVuaztcbiAgICBmcy53cml0ZVN5bmMobG9nRmlsZSwgYnVmZmVyKTtcbiAgICAvLyBXcml0ZSB0byB0aGUgdGVybWluYWwgdmlhIHRoZSBvcmlnaW5hbCBzdHJlYW0gbWV0aG9kOiBhIHN5bmNocm9ub3VzIGZzLndyaXRlU3luYyBvbiB0aGVcbiAgICAvLyBzdGRvdXQvc3RkZXJyIGZkIHRocm93cyBFQUdBSU4gb24gQ0kncyBub24tYmxvY2tpbmcgcGlwZXMgd2hlbiBsYXJnZSBvdXRwdXQgZmx1c2hlcyBhdCBvbmNlLFxuICAgIC8vIHdoaWxlIHRoZSBzdHJlYW0gbWV0aG9kIGJ1ZmZlcnMgaW50ZXJuYWxseSBhbmQgaGFuZGxlcyBiYWNrcHJlc3N1cmUuXG4gICAgcmV0dXJuIG9yaWdpbmFsV3JpdGUoYnVmZmVyLCB0eXBlb2YgZW5jb2RpbmdPckNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gZW5jb2RpbmdPckNhbGxiYWNrIDogY2FsbGJhY2spO1xuICB9KSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG59XG5cbi8qKiBTdWItbWludXRlIHN0ZXBzIGtlZXAgb25lIGRlY2ltYWwgc28gYSBmYXN0IHN0ZXAgaXMgbm90IGZsYXR0ZW5lZCB0byBhIG1pc2xlYWRpbmcgYDBzYC4gKi9cbmZ1bmN0aW9uIGZvcm1hdFN0ZXBEdXJhdGlvbihtaWxsaXNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChtaWxsaXNlY29uZHMgPCA2MF8wMDApIHtcbiAgICByZXR1cm4gYCR7KG1pbGxpc2Vjb25kcyAvIDEwMDApLnRvRml4ZWQoMSl9c2A7XG4gIH1cbiAgcmV0dXJuIGZvcm1hdEVsYXBzZWRUaW1lKG1pbGxpc2Vjb25kcyk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEVsYXBzZWRUaW1lKG1pbGxpc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3Qgc2Vjb25kcyA9IE1hdGgucm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7XG4gIGNvbnN0IHJlbWFpbmluZ1NlY29uZHMgPSBzZWNvbmRzICUgNjA7XG4gIGlmIChtaW51dGVzID09PSAwKSB7XG4gICAgcmV0dXJuIGAke3JlbWFpbmluZ1NlY29uZHN9c2A7XG4gIH1cbiAgcmV0dXJuIGAke21pbnV0ZXN9bSAke3JlbWFpbmluZ1NlY29uZHN9c2A7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMsIHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgcHJvdGVjdFJ1blNjcmlwdEFyZ3MgfSBmcm9tICcuLi9iaW4vcnVuQXJncy5qcyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBjaGVja0VudkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NoZWNrRW52LmpzJztcbmltcG9ydCB7IGNvbmN1cnJlbnRseUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NvbmN1cnJlbnRseS5qcyc7XG5pbXBvcnQgeyBkZXBsb3lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9kZXBsb3kuanMnO1xuaW1wb3J0IHsgZG90ZW52Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZG90ZW52LmpzJztcbmltcG9ydCB7IGdlbkNvZGVDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9nZW5Db2RlLmpzJztcbmltcG9ydCB7IGdlbkRldlZhcnNDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9nZW5EZXZWYXJzLmpzJztcbmltcG9ydCB7IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBtYWludGVuYW5jZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL21haW50ZW5hbmNlLmpzJztcbmltcG9ydCB7IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLmpzJztcbmltcG9ydCB7IHByaXNtYUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyByYWlsd2F5RW52Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmFpbHdheUVudi5qcyc7XG5pbXBvcnQgeyByZWxlYXNlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmVsZWFzZS5qcyc7XG5pbXBvcnQgeyByZXRyeUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JldHJ5LmpzJztcbmltcG9ydCB7IHJ1bkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHNldHVwUHJpdmF0ZVBhY2thZ2VzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXBQcml2YXRlUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgc3RhcnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydC5qcyc7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgeyB0ZXN0T25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3RPbkNpLmpzJztcbmltcG9ydCB7IHRyZWVLaWxsQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHJlZUtpbGwuanMnO1xuaW1wb3J0IHsgdGNDb21tYW5kLCB0eXBlQ2hlY2tDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90eXBlY2hlY2suanMnO1xuaW1wb3J0IHsgdmVyaWZ5Q29kZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ZlcmlmeUNvZGUuanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxucHJvdGVjdFJ1blNjcmlwdEFyZ3MocHJvY2Vzcy5hcmd2KTtcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnd2InKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLm1pZGRsZXdhcmUoKGFyZ3YpID0+IHtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gYXJndlsnd29ya2luZy1kaXInXTtcbiAgICBpZiAod29ya2luZ0Rpcikge1xuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyKTtcbiAgICAgIHByb2Nlc3MuY2hkaXIoZGlyUGF0aCk7XG4gICAgfVxuXG4gICAgLy8gV2FybiBvbmx5IHdoZW4gYSBzaGltIGFjdHVhbGx5IHdpbnMgYG5vZGVgIHJlc29sdXRpb246IG92ZW4vYnVuIGltYWdlcyBhcHBlbmQgYSBoYXJtbGVzc1xuICAgIC8vIC91c3IvbG9jYWwvYnVuLW5vZGUtZmFsbGJhY2stYmluIChub2RlIC0+IGJ1bikgYXQgdGhlIEVORCBvZiBQQVRILCBzbyBhIFBBVEggc3Vic3RyaW5nXG4gICAgLy8gY2hlY2sgZmFsc2UtcG9zaXRpdmVzIHdoZW5ldmVyIGEgcmVhbCBub2RlIHByZWNlZGVzIGl0LlxuICAgIGNvbnN0IG5vZGVPblBhdGggPSBmaW5kRmlyc3ROb2RlT25QYXRoKCk7XG4gICAgaWYgKG5vZGVPblBhdGggJiYgaXNCdW5Ob2RlU2hpbShub2RlT25QYXRoKSkge1xuICAgICAgLy8gTm90IGZpeGVkIHVwIGhlcmU6IHRvb2xzIHJlcXVpcmluZyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpIG1heSBoYW5nIG9yXG4gICAgICAvLyBjcmFzaCB1bmRlciB0aGUgc2hpbSwgYW5kIHNvbWUgKHdyYW5nbGVyIGRldikgZmFpbCBzaWxlbnRseSwgc28gc3VyZmFjZSB0aGUgY2F1c2UgdXBmcm9udC5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFdhcm5pbmc6IFxcYG5vZGVcXGAgb24gUEFUSCBpcyBhIEJ1biBzaGltICgke25vZGVPblBhdGh9KTsgYCArXG4gICAgICAgICAgJ3J1biB3YiB3aXRob3V0IGAtLWJ1bmAgYW5kIHJlbW92ZSBgW3J1bl0gYnVuYCBmcm9tIGJ1bmZpZy50b21sLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3YuX1swXSAhPT0gJ3J1bicpIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKHZlcmlmeUNvZGVDb21tYW5kKVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQoY2hlY2tFbnZDb21tYW5kKVxuICAuY29tbWFuZChjb25jdXJyZW50bHlDb21tYW5kKVxuICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAuY29tbWFuZChkb3RlbnZDb21tYW5kKVxuICAuY29tbWFuZChnZW5Db2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoZ2VuRGV2VmFyc0NvbW1hbmQpXG4gIC5jb21tYW5kKGtpbGxQb3J0SWZOb25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChtYWludGVuYW5jZUNvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyYWlsd2F5RW52Q29tbWFuZClcbiAgLmNvbW1hbmQocmVsZWFzZUNvbW1hbmQpXG4gIC5jb21tYW5kKHJldHJ5Q29tbWFuZClcbiAgLmNvbW1hbmQocnVuQ29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cFByaXZhdGVQYWNrYWdlc0NvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RPbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQodHJlZUtpbGxDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG4vKiogVGhlIGZpcnN0IGV4ZWN1dGFibGUgYG5vZGVgIG9uIFBBVEgsIGkuZS4gdGhlIG9uZSBjaGlsZCBwcm9jZXNzZXMgd2lsbCBydW4uICovXG5mdW5jdGlvbiBmaW5kRmlyc3ROb2RlT25QYXRoKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgZGlyIG9mIChwcm9jZXNzLmVudi5QQVRIID8/ICcnKS5zcGxpdChwYXRoLmRlbGltaXRlcikpIHtcbiAgICBpZiAoIWRpcikgY29udGludWU7XG5cbiAgICBjb25zdCBub2RlUGF0aCA9IHBhdGguam9pbihkaXIsICdub2RlJyk7XG4gICAgdHJ5IHtcbiAgICAgIGZzLmFjY2Vzc1N5bmMobm9kZVBhdGgsIGZzLmNvbnN0YW50cy5YX09LKTtcbiAgICAgIC8vIFhfT0sgYWxzbyBwYXNzZXMgZm9yIHNlYXJjaGFibGUgZGlyZWN0b3JpZXMsIHdoaWNoIGV4ZWN2cCBza2lwcy5cbiAgICAgIGlmIChmcy5zdGF0U3luYyhub2RlUGF0aCkuaXNGaWxlKCkpIHJldHVybiBub2RlUGF0aDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE5vdCBwcmVzZW50IG9yIG5vdCBleGVjdXRhYmxlIGluIHRoaXMgZGlyZWN0b3J5OyBrZWVwIHNlYXJjaGluZy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaXNCdW5Ob2RlU2hpbShub2RlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGBidW4gLS1idW5gIGFuZCBidW5maWcncyBgcnVuLmJ1bmAgcHJlcGVuZCBhIGJ1bi1ub2RlLTx2ZXJzaW9uPiBkaXJlY3Rvcnkgd2hvc2UgYG5vZGVgIGxpbmtzXG4gIC8vIHRvIGJ1biwgYW5kIG92ZW4vYnVuIGltYWdlcyBzeW1saW5rIG5vZGUgLT4gYnVuIGluIGJ1bi1ub2RlLWZhbGxiYWNrLWJpbiwgc28gdGhlIGdpdmVhd2F5IGlzXG4gIC8vIGVpdGhlciBhIGJ1bi1ub2RlLSBwYXRoIHNlZ21lbnQgb3IgYSByZXNvbHV0aW9uIHRvIHRoZSBidW4gYmluYXJ5IGl0c2VsZi5cbiAgLy8gU2hpbXMgbGl2ZSBkaXJlY3RseSBpbiBhIGJ1bi1ub2RlLTx2ZXJzaW9uPiBkaXJlY3RvcnksIHNvIGNoZWNrIG9ubHkgdGhlIGltbWVkaWF0ZSBwYXJlbnRcbiAgLy8gKHJlbGF0aXZlIFBBVEggZW50cmllcyBpbmNsdWRlZCk6IG1hdGNoaW5nIGFuY2VzdG9ycyB3b3VsZCBmYWxzZS1wb3NpdGl2ZSBvbiBlLmcuIGEgcmVhbCBub2RlXG4gIC8vIGluc2lkZSBhIGJ1bi1ub2RlLXdvcmtzcGFjZSBjaGVja291dC5cbiAgaWYgKHBhdGguYmFzZW5hbWUocGF0aC5kaXJuYW1lKG5vZGVQYXRoKSkuc3RhcnRzV2l0aCgnYnVuLW5vZGUtJykpIHJldHVybiB0cnVlO1xuICB0cnkge1xuICAgIHJldHVybiBwYXRoLmJhc2VuYW1lKGZzLnJlYWxwYXRoU3luYyhub2RlUGF0aCkpID09PSAnYnVuJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgaWYgKHNodXR0aW5nRG93bikgcmV0dXJuO1xuXG4gICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdHJlZUtpbGwocHJvY2Vzcy5waWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2Nlc3MucGlkfSkgZHVyaW5nIHNodXRkb3duOmAsIGVycm9yKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KCk7XG4gIH0pO1xufVxuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOls5LDEwLDExLDEyLDEzXSwibWFwcGluZ3MiOiI4MkJBZUEsU0FBZ0IsRUFBb0MsRUFBbUMsRUFBK0IsQ0FDcEgsT0FBTyxHQUNMLEVBQXVDLENBQVUsQ0FBQyxDQUFDLE9BQVEsR0FDekQsR0FBK0IsQ0FBZ0IsQ0FDakQsRUFDQSxDQUNG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TSxFQUFFLE1BQU0sV0FBVyxXQUFXLFdBQVcsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLFdBQVcsTUFBTSxXQUFXLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsSUFBSSxXQUFXLE1BQU0sV0FBVyxNQUFNLFdBQVcsTUFBTSxXQUFXLElBQUksV0FBVyxNQUFNLEVBQUUsV0FBVyxXQUFXLFdBQVcsV0FBVyxNQUFNLFdBQVcsV0FBVyxFQUFFLFdBQVcsVUFBVSxDQUFDLEVBQUVDLEdBQUUsSUFBSSxXQUFXLEVBQUUsRUFBRUMsR0FBRSxJQUFJLFdBQVcsRUFBRSxFQUFFQyxHQUFFLElBQUksWUFBWSxJQUFJLEVBQUUsSUFBSSxXQUFXLElBQUksRUFBRSxHQUFFLElBQUksWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUcsSUFBSSxXQUFXLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsR0FBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxFQUFFLEVBQUUsR0FBRSxFQUFFLENBQUMsSUFBSSxFQUFFQSxHQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUVGLEdBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFQyxHQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxXQUFXLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHSCxFQUFFLEVBQUUsS0FBS0EsRUFBRSxHQUFHLEVBQUUsS0FBS0EsRUFBRSxHQUFHLEdBQUcsS0FBS0EsRUFBRSxJQUFJLElBQUlBLEVBQUUsRUFBRSxLQUFLQSxFQUFFLEdBQUcsRUFBRSxLQUFLQSxFQUFFLEdBQUcsR0FBRyxLQUFLQSxFQUFFLElBQUksSUFBSUEsRUFBRSxFQUFFLEtBQUtBLEVBQUUsR0FBRyxFQUFFLEtBQUtBLEVBQUUsR0FBRyxHQUFHLEtBQUtBLEVBQUUsSUFBSSxJQUFJQSxFQUFFLEVBQUUsS0FBS0EsRUFBRSxHQUFHLEVBQUUsS0FBS0EsRUFBRSxHQUFHLEdBQUcsS0FBS0EsRUFBRSxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxHQUFHLEVBQUcsRUFBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksRUFBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksRUFBRyxFQUFFLElBQUksRUFBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUUsR0FBRSxFQUFFLEdBQUUsRUFBRyxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsRUFBRyxFQUFHLEdBQUUsRUFBRSxHQUFFLEdBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRSxHQUFFLEdBQUUsR0FBRyxFQUFFLEdBQUUsR0FBRSxFQUFFLEdBQUUsR0FBRyxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRyxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRyxFQUFFLEdBQUUsR0FBRSxFQUFFLEVBQUcsR0FBRyxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBSSxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUssSUFBSSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsR0FBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLEdBQUksRUFBRSxHQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksSUFBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBSSxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxHQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLEdBQUcsRUFBRSxJQUFHLEVBQUUsR0FBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRSxFQUFFLEdBQUUsR0FBRyxJQUFHLEVBQUUsS0FBSSxHQUFHLEdBQUcsSUFBRyxFQUFFLEtBQUksR0FBRyxFQUFHLEdBQUcsRUFBRSxLQUFJLEdBQUcsRUFBRyxJQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUcsSUFBRyxFQUFFLEtBQUksR0FBRyxHQUFHLElBQUcsRUFBRSxLQUFJLEdBQUcsR0FBRyxHQUFJLEdBQUcsSUFBSyxHQUFHLEdBQUcsR0FBSSxHQUFHLElBQUssR0FBRyxFQUFHLElBQUcsRUFBRSxLQUFLLEdBQUcsR0FBRyxJQUFJLEVBQUUsS0FBSSxHQUFHLEVBQUUsSUFBRyxHQUFHLElBQUksR0FBRyxFQUFHLEdBQUcsR0FBRyxLQUFJLEdBQUcsR0FBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxFQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsRUFBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxHQUFHLElBQUksRUFBRSxLQUFLLEdBQUcsR0FBRyxJQUFHLEdBQUcsS0FBSSxFQUFFLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxHQUFHLElBQUcsRUFBRSxLQUFJLEdBQUcsR0FBRyxJQUFHLEVBQUUsS0FBSSxHQUFHLEVBQUcsSUFBRyxHQUFHLElBQUksR0FBRyxFQUFHLEdBQUcsR0FBRyxLQUFJLEdBQUcsR0FBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxHQUFHLElBQUksR0FBRyxLQUFLLEVBQUUsRUFBRyxJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUcsR0FBRyxHQUFHLEtBQUksRUFBRSxFQUFHLElBQUcsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFHLEdBQUcsS0FBSSxFQUFFLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxHQUFHLElBQUcsR0FBRyxLQUFJLEVBQUUsR0FBRyxJQUFHLEdBQUcsS0FBSSxFQUFFLEVBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxFQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQUcsSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFHLElBQUcsR0FBRyxLQUFJLEVBQUUsR0FBRyxJQUFHLEdBQUcsS0FBSSxFQUFFLEVBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxFQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsR0FBRyxJQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFLEtBQUksR0FBRyxHQUFHLEdBQUksRUFBRSxLQUFLLEdBQUcsR0FBRyxJQUFJLEVBQUUsSUFBSyxHQUFHLEVBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsR0FBRSxFQUFFLENBQUMsRUFBRSxFQUFHLEdBQUUsRUFBRSxDQUFDLEVBQUcsRUFBRyxHQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEVBQUUsRUFBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsRUFBRSxDQUFDLEVBQUcsRUFBRyxHQUFHLEVBQUcsQ0FBQyxFQUFHLEVBQUcsRUFBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsR0FBRyxHQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFHLENBQUMsRUFBRyxFQUFFLEdBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRSxHQUFFLEVBQUcsQ0FBQyxHQUFHLEVBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUUsRUFBRSxHQUFFLEVBQUcsQ0FBQyxFQUFFLEVBQUcsR0FBRSxHQUFHLENBQUMsRUFBRyxFQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxFQUFFLEdBQUcsQ0FBQyxFQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFHQyxHQUFFLEdBQUcsSUFBR0EsR0FBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0NScjJJLE1BQU0sR0FBRUksR0FBRSxFQUFFQyxHQUFFLElBQUksWUFBWUMsR0FBRSxJQUFJLFlBQVksT0FBTyxFQUFFLFNBQVNGLElBQUcsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsU0FBUyxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFLLElBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxJQUFLLEtBQUksRUFBRSxRQUFRLElBQUssSUFBRyxFQUFFLEtBQUssSUFBSyxFQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxTQUFTLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxJQUFLLEdBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxJQUFLLEtBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxXQUFXLEtBQUssR0FBRyxDQUFDLEtBQUtFLEdBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLRCxHQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLElBQUksSUFBSSxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsSUFBSSxJQUFJLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsT0FBTyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0NBajBCLFNBQVMsR0FBRSxFQUFFLEVBQUUsR0FBRSxDQUFDLE9BQU8sS0FBSyxVQUFVRSxHQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTQyxHQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSyxHQUFFLE1BQU0sR0FBRyxHQUFHLE9BQU8sR0FBRyxTQUFTLENBQUMsR0FBRyxPQUFPLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTRCxHQUFFLEVBQUUsRUFBRSxHQUFFLENBQUMsSUFBSSxFQUFFQyxHQUFFLENBQUMsRUFBRSxHQUFHLElBQUksS0FBSyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUVBLEdBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxLQUFLLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksSUFBSyxHQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLE9BQU8sRUFBekIsQ0FBNEIsSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFVBQVUsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sSUFBSSxTQUFTLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxHQUFHLElBQUksS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsT0FBTyxHQUFHLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUssR0FBRSxHQUFHLElBQUksSUFBSyxHQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQ0F0OEIsU0FBU0MsR0FBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPQyxHQUFFLEdBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBaUMsU0FBU0MsSUFBRyxDQUFDLE1BQU0sRUFBRSxDQ0ExRixNQUFNLEVBQUUsR0FBRSxDQUFDLFlBQVlDLEVBQUMsQ0FBQyxFQUFJLEdBQUUsQ0FBQyxZQUFZQyxFQUFDLENBQUMsRUFBRSxTQUFTLEdBQUUsQ0FBQyxjQUFjLEVBQUUsSUFBSSxZQUFZLEVBQUVELElBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxHQUFHLE9BQU8sU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxFQUFFLE9BQU8sSUFBSSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEtB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
116
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJub3JtYWxpemVCdW5Mb2NrZmlsZSIsImNvbGxlY3REZXNjZW5kYW50UGlkcyIsImlzTm9TdWNoUHJvY2Vzc0Vycm9yIiwicnVuQ29tbWFuZCIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCIsImUiLCJ0IiwibiIsInIiLCJpIiwiciIsInQiLCJuIiwiciIsIm4iLCJuIiwiZSIsImkiLCJ0IiwiZSIsImJ1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImFyZ3VtZW50c0J1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQiLCJwYXJzZSIsImRlcGxveUNvbW1hbmQiLCJub3JtYWxpemVTaGFyZWRCdW5Mb2NrZmlsZSIsInBhcnNlVG9tbCIsImJ1aWxkZXIiLCJwYXJzZURvdGVudiIsImJ1aWxkZXIiLCJmcyIsInNldFRpbWVvdXQiLCJidWlsZGVyIiwic2V0VGltZW91dCIsImZzIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJidWlsZGVyIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJmcyIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJidWlsZGVyIiwiZGVwbG95Q29tbWFuZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuV29ya3NwYWNlcy50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuTG9ja2ZpbGUudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2Vudi50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZXJybm8udHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy90cmVlS2lsbC50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvc3Bhd24udHMiLCIuLi9iaW4vcnVuQXJncy5qcyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9oYXNoLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9vc29uL2NvbnN0cnVjdG9ycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9zdHJpbmdpZnkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L2dldENhY2hlS2V5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9tZW1vaXplT25lLmpzIiwiLi4vc3JjL3V0aWxzL2JpblBhdGgudHMiLCIuLi9zcmMvdXRpbHMvY2kudHMiLCIuLi9zcmMvdXRpbHMvZW52U291cmNlcy50cyIsIi4uL3NyYy91dGlscy9ydW50aW1lLnRzIiwiLi4vc3JjL3V0aWxzL3Rlc3RTdHJ1Y3R1cmUudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvdXRpbHMvc2hlbGwudHMiLCIuLi9zcmMvdXRpbHMvd3JhbmdsZXIudHMiLCIuLi9zcmMvcHJvamVjdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZElmTmVlZGVkLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NoZWNrRW52LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9zY3JpcHRzL2xpdGVzdHJlYW0udHMiLCIuLi9zcmMvc2NyaXB0cy9kcml6emxlU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy93cmFuZ2xlckNvbmZpZy50cyIsIi4uL3NyYy9jb21tYW5kcy9kZXBsb3kudHMiLCIuLi9zcmMvY29tbWFuZHMvZG90ZW52LnRzIiwiLi4vc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy9idW5Mb2NrZmlsZS50cyIsIi4uL3NyYy91dGlscy93b3JrZXJUeXBlc0Vudi50cyIsIi4uL3NyYy9jb21tYW5kcy9nZW5Db2RlLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2dlbkRldlZhcnMudHMiLCIuLi9zcmMvY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLnRzIiwiLi4vc3JjL3V0aWxzL291dHB1dC50cyIsIi4uL3NyYy9jb21tYW5kcy9saW50LnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvdXRpbHMvcHJvY2Vzcy50cyIsIi4uL3NyYy9jb21tYW5kcy9tYWludGVuYW5jZS50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUmVnaXN0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwUHJpdmF0ZVBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JhaWx3YXlFbnYudHMiLCIuLi9zcmMvY29tbWFuZHMvcmVsZWFzZS50cyIsIi4uL3NyYy9jb21tYW5kcy9yZXRyeS50cyIsIi4uL3NyYy9jb21tYW5kcy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy9sb2cudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi92aW5leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3NlbGVjdFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0T25DaS50cyIsIi4uL3NyYy9jb21tYW5kcy90cmVlS2lsbC50cyIsIi4uL3NyYy9jb21tYW5kcy90eXBlY2hlY2sudHMiLCIuLi9zcmMvY29tbWFuZHMvdmVyaWZ5Q29kZS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuLyoqIFRoZSBgd29ya3NwYWNlc2AgZmllbGQgb2YgYSByb290IHBhY2thZ2UuanNvbjogdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlc0RlY2xhcmF0aW9uID0gc3RyaW5nW10gfCB7IHBhY2thZ2VzPzogc3RyaW5nW10gfSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpIHRoYXQgQnVuIHdvdWxkIGxpbmtcbiAqIGZvciB0aGUgZ2l2ZW4gcm9vdCBwYWNrYWdlLmpzb24gYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uLiBDYW5vbmljYWxpemVzIHRoZSBkZWNsYXJlZCBwYXR0ZXJuc1xuICogKHNlZSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyksIGRyb3BzIHBhdHRlcm5zIGVzY2FwaW5nIHRoZSByZXBvc2l0b3J5IChzZWVcbiAqIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybiksIGFuZCByZXNvbHZlcyB0aGUgcmVzdCB3aXRoIEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKFxuICAgIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKVxuICAgICksXG4gICAgcm9vdERpclBhdGhcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3b3Jrc3BhY2UgcGF0dGVybnMgdG8gcGFja2FnZS5qc29uIHBhdGhzIG1pbWlja2luZyBCdW4ncyBTRVFVRU5USUFMIGV2YWx1YXRpb24sXG4gKiBkZXJpdmVkIGVtcGlyaWNhbGx5IHdpdGggQnVuIDEuMy4xNCAoZml4dHVyZSByZXBvcyBvYnNlcnZlZCB2aWEgYGJ1biBpbnN0YWxsIC0tbG9ja2ZpbGUtb25seWA7XG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNCAvIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1KTpcbiAqIDEuIFBhdHRlcm5zIGFyZSBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIgaW50byBhbiBhY2N1bXVsYXRpbmcgc2V0OiBhIHBvc2l0aXZlIGdsb2JcbiAqICAgIHBhdHRlcm4gYWRkcyBldmVyeSBwYWNrYWdlLmpzb24gaXQgbWF0Y2hlczsgYSBuZWdhdGlvbiBkZWxldGVzIGl0cyBtYXRjaGVzIGZyb20gdGhlIHNldFxuICogICAgYWNjdW11bGF0ZWQgU08gRkFSLCBzbyBhIGxhdGVyIHBvc2l0aXZlIHJlLWFkZHMgdGhlbSAoYFtcIiFhcHBzL2V4Y2x1ZGVkXCIsIFwiYXBwcy8qXCJdYCBsaW5rc1xuICogICAgYXBwcy9leGNsdWRlZCwgd2hpbGUgYFtcImFwcHMvKlwiLCBcIiFhcHBzL2V4Y2x1ZGVkXCJdYCBkb2VzIG5vdCkuXG4gKiAyLiBBIG5lZ2F0aW9uIHdob3NlIG5vcm1hbGl6ZWQgYm9keSBoYXMgRVhBQ1RMWSB0d28gc2VnbWVudHMsIHdob3NlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXItcnVuXG4gKiAgICAoYCpgLCBgKipgLCBgKioqYCwg4oCmKSwgYW5kIHdob3NlIGZpcnN0IHNlZ21lbnQgaXMgTk9UIGl0c2VsZiBhIHN0YXItcnVuIGZpcnN0IHNlZWRzIHRoZVxuICogICAgaW1wbGljaXQgYmFzZWxpbmUgaW50byB0aGUgc2V0LCB0aGVuIGRlbGV0ZXMgaXRzIG93biBtYXRjaGVzOiBhIGAqKmAgbGFzdCBzZWdtZW50IHNlZWRzXG4gKiAgICBgKipgIChwYWNrYWdlcyBhdCBhbnkgZGVwdGgpLCBhbnkgb3RoZXIgc3Rhci1ydW4gc2VlZHMgYCpcXC8qYCAoZGVwdGggMiBvbmx5KS4gU2VlZGluZ1xuICogICAgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJucyAoYFtcImFwcHMvKlwiLCBcIiFvdGhlci8qXCJdYCBsaW5rcyBldmVyeSBkZXB0aC0yXG4gKiAgICBwYWNrYWdlIG91dHNpZGUgb3RoZXIvKS4gTm8gb3RoZXIgbmVnYXRpb24gc2hhcGUgc2VlZHM6IGAhKmAsIGAhKipgLCBgISpcXC8qYCwgYCEqXFwvKipgLFxuICogICAgYCEqKlxcLypgLCBgIWEvYi8qYCwgYCFhL2IvKipgLCBgIWRpcmAsIGFuZCBgIWRpci8qeGAgZWFjaCBsaW5rIG5vdGhpbmcgb24gdGhlaXIgb3duLlxuICogICAgYD9gLCBicmFjZSwgYW5kIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZSBFUlJBVElDQUxMWSAoYFtcIiFvdGhlci8/XCJdYCBsaW5rc1xuICogICAgcGFja2FnZXMvYSB5ZXQgbm90IHRoZSBlcXVhbGx5IGJhc2VsaW5lLXNoYXBlZCBvdGhlci95eSwgYFtcIiFvdGhlci8/P1wiXWAgbGlua3Mgbm90aGluZywgYW5kXG4gKiAgICBgW1wiIT8vP1wiXWAgbGlua3MgdGhlIHZlcnkgb3RoZXIveCBpdCBtYXRjaGVzKSwgc28gbm8gY29uc2lzdGVudCBydWxlIGNhbiBtb2RlbCB0aGVtOyB0aGV5XG4gKiAgICBhcmUgZGVsaWJlcmF0ZWx5IHRyZWF0ZWQgYXMgbm90IHNlZWRpbmcg4oCUIHNlZSBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lIGFuZCAjMTAwNS5cbiAqIDMuIEEgbm9uLWdsb2IgcG9zaXRpdmUgcGF0dGVybiBQSU5TIGl0cyBkaXJlY3Rvcnk6IGl0IHN0YXlzIGEgd29ya3NwYWNlIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgYVxuICogICAgbWF0Y2hpbmcgbmVnYXRpb24gYXBwZWFycyAoYFtcIm90aGVyL3hcIiwgXCIhb3RoZXIveFwiXWAgYW5kIGBbXCIhb3RoZXIveFwiLCBcIm90aGVyL3hcIl1gIGJvdGhcbiAqICAgIGxpbmsgb3RoZXIveCkuXG4gKiA0LiBgKipgIG1hdGNoZXMgemVybyBvciBtb3JlIHBhdGggc2VnbWVudHMgKGBbXCJhcHBzLyoqXCJdYCBsaW5rcyB0aGUgcGFja2FnZSBhdCBhcHBzIGl0c2VsZiwgYW5kXG4gKiAgICBgIWFwcHMvKipgIGRlbGV0ZXMgaXQpLCBtYXRjaGluZyBmYXN0LWdsb2IncyBmaWxlLWdsb2Igc2VtYW50aWNzLlxuICogRG8gbm90IGFwcGx5IGdsb2JJZ25vcmUgaGVyZTogd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgZGVmaW5lZCBzb2xlbHkgYnkgdGhlIGRlY2xhcmVkIHBhdHRlcm5zLFxuICogYW5kIHNvdXJjZS1zY2FubmluZyBpZ25vcmVzIHN1Y2ggYXMgYGJ1aWxkYCBvciBgZGlzdGAgd291bGQgaGlkZSBsZWdpdGltYXRlbHkgbmFtZWQgd29ya3NwYWNlXG4gKiBkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZVBhdHRlcm5zOiBzdHJpbmdbXSwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2Ugc3RvcHMgR0xPQiB0cmF2ZXJzYWwgdGhyb3VnaCBzeW1saW5rcywgYnV0IGEgbm9uLWdsb2IgcGF0dGVyblxuICAvLyBuYW1pbmcgYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGBsaW5rZWRgIHdpdGggYGxpbmtlZCAtPiAuLi9vdGhlci1yZXBvYCkgc3RpbGwgbWF0Y2hlcyDigJRcbiAgLy8gZmFzdC1nbG9iIHJlc29sdmVzIHN0YXRpYyBwYXR0ZXJucyB3aXRoIGRpcmVjdCBmcyBjaGVja3MsIGFuZCBCdW4gZG9lcyBsaW5rIHN1Y2ggYSB3b3Jrc3BhY2UuXG4gIC8vIERlbGliZXJhdGVseSBkaXZlcmdlIGZyb20gQnVuIHRoZXJlOiBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBhbmQgbWFuaWZlc3RcbiAgLy8gcmV3cml0aW5nIHdvdWxkIG90aGVyd2lzZSBkZWxldGUgYW5kIHJld3JpdGUgZmlsZXMgaW4gQU5PVEhFUiByZXBvc2l0b3J5IHRocm91Z2ggdGhlIHN5bWxpbmssXG4gIC8vIHNvIGtlZXAgb25seSBtYW5pZmVzdHMgd2hvc2UgcmVhbCBwYXRoIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeSdzIHJlYWwgcm9vdC4gU2Nhbm5pbmcgZWFjaFxuICAvLyBwYXR0ZXJuIHNlcGFyYXRlbHkgKG5vIGNyb3NzLXBhdHRlcm4gY2FjaGluZykgaXMgZGVsaWJlcmF0ZTogZGVjbGFyYXRpb25zIGhvbGQgYSBoYW5kZnVsIG9mXG4gIC8vIHBhdHRlcm5zLCBzbyBhIGNhY2hlIHdvdWxkIGNvbXBsaWNhdGUgdGhpcyBzaGFyZWQgY29kZSB3aXRob3V0IG1lYXN1cmFibGUgZ2Fpbi5cbiAgY29uc3QgZ2xvYk1hbmlmZXN0UGF0aHMgPSAocGF0dGVybjogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIC8vIEJ1biBsaW5rcyBkb3QtZGlyZWN0b3J5IHBhY2thZ2VzIG9ubHkgdGhyb3VnaCBmdWxseSBzdGF0aWMgcGF0dGVybnM6IHdpdGggQnVuIDEuMy4xNCxcbiAgICAvLyBgLmhpZGRlbi94YCBwaW5zIHRoZSBwYWNrYWdlIHdoaWxlIGAuaGlkZGVuLypgLCBgLiovKmAsIGFuZCBgKipgIGFsbCBsaW5rIG5vdGhpbmcgdW5kZXJcbiAgICAvLyAuaGlkZGVuIOKAlCBldmVuIHdoZW4gdGhlIGRvdHRlZCBzZWdtZW50IGl0c2VsZiBpcyBsaXRlcmFsIOKAlCBzbyBhbnkgZHluYW1pYyBwYXR0ZXJuIG11c3RcbiAgICAvLyBkcm9wIG1hdGNoZXMgY29udGFpbmluZyBhIGRvdC1sZWQgc2VnbWVudCAoZmFzdC1nbG9iJ3MgYGRvdDogZmFsc2VgIG9ubHkgY292ZXJzIHNlZ21lbnRzXG4gICAgLy8gYSB3aWxkY2FyZCBtYXRjaGVzKS5cbiAgICBjb25zdCBleGNsdWRlc0RvdFNlZ21lbnRzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuKTtcbiAgICBjb25zdCBnbG9iT3B0aW9ucyA9IHsgY3dkOiByb290RGlyUGF0aCwgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9O1xuICAgIC8vIGZhc3QtZ2xvYiAzLjMuMyByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgICAvLyBgcGFja2FnZXMvPy9wYWNrYWdlLmpzb25gKSwgYWx0aG91Z2ggbWljcm9tYXRjaCBtYXRjaGVzIHRoZW0gYW5kIEJ1biAxLjMuMTQgbGlua3Mgc3VjaFxuICAgIC8vIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnMgb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnlcbiAgICAvLyBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkpLCBnbG9iYmluZyB0aGUgZGlyZWN0b3JpZXMgKHdoZXJlIGA/YCB3b3JrcykgYW5kIGNoZWNraW5nIHRoZWlyXG4gICAgLy8gbWFuaWZlc3RzIGNvbXBsZW1lbnRzIHRoZSBtYW5pZmVzdCBnbG9iLCB3aGljaCBzdGF5cyBuZWNlc3NhcnkgZm9yIGAqKmAncyB6ZXJvLXNlZ21lbnRcbiAgICAvLyBtYXRjaGVzIOKAlCBgZGlyLyoqYCBkb2VzIG5vdCByZXR1cm4gZGlyIGl0c2VsZiBhcyBhIGRpcmVjdG9yeS5cbiAgICBjb25zdCBtYW5pZmVzdFBhdGhzID0gbmV3IFNldChmZy5nbG9iU3luYyhwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpLCBnbG9iT3B0aW9ucykpO1xuICAgIGlmIChwYXR0ZXJuLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IC4uLmdsb2JPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSkgbWFuaWZlc3RQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQSB6ZXJvLXNlZ21lbnQgYCoqYCBtYXRjaCByZWFjaGVzIHRoZSByb290J3Mgb3duIG1hbmlmZXN0LCBidXQgQnVuIG5ldmVyIHRyZWF0cyB0aGVcbiAgICAvLyBtb25vcmVwbyByb290IGFzIGl0cyBvd24gd29ya3NwYWNlLlxuICAgIHJldHVybiBbLi4ubWFuaWZlc3RQYXRoc10uZmlsdGVyKFxuICAgICAgKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGFja2FnZUpzb25QYXRoICE9PSAncGFja2FnZS5qc29uJyAmJlxuICAgICAgICAoIWV4Y2x1ZGVzRG90U2VnbWVudHMgfHwgIXBhY2thZ2VKc29uUGF0aC5zcGxpdCgnLycpLnNvbWUoKHNlZ21lbnQpID0+IHNlZ21lbnQuc3RhcnRzV2l0aCgnLicpKSkgJiZcbiAgICAgICAgaXNJbnNpZGVSZWFsUm9vdChwYWNrYWdlSnNvblBhdGgpXG4gICAgKTtcbiAgfTtcbiAgbGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBpc0luc2lkZVJlYWxSb290ID0gKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlYWxSb290RGlyUGF0aCA/Pz0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVhbFJvb3REaXJQYXRoLCBmcy5yZWFscGF0aFN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSk7XG4gICAgICAvLyBDb21wYXJlIHdob2xlIHNlZ21lbnRzLCBub3QgYSBgLi5gIHByZWZpeDogYSBkaXJlY3RvcnkgbGl0ZXJhbGx5IG5hbWVkIGUuZy4gYC4ucGtnYCBpc1xuICAgICAgLy8gaW5zaWRlIHRoZSByb290LCB3aGlsZSBhIHBsYWluIHN0YXJ0c1dpdGgoJy4uJykgd291bGQgbWlzcmVhZCBpdCBhcyBwYXJlbnQgdHJhdmVyc2FsLlxuICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgbWFuaWZlc3QgdGhhdCB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBnbG9iIGFuZCB0aGUgcmVhbHBhdGggY2FsbCBpcyBub3QgYSB3b3Jrc3BhY2UuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBhY2N1bXVsYXRlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHBpbm5lZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0dGVybiBvZiB3b3Jrc3BhY2VQYXR0ZXJucykge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICBjb25zdCBwYXR0ZXJuQm9keSA9IG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KGlzTmVnYXRpdmUgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybik7XG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIGNvbnN0IGJhc2VsaW5lR2xvYiA9IGdldFNlZWRlZEJhc2VsaW5lR2xvYihwYXR0ZXJuQm9keSk7XG4gICAgICBpZiAoYmFzZWxpbmVHbG9iICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2xvYk1hbmlmZXN0UGF0aHMoYmFzZWxpbmVHbG9iKSkgYWNjdW11bGF0ZWRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkgYWNjdW11bGF0ZWRQYXRocy5kZWxldGUocGFja2FnZUpzb25QYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aHMgPSBmZy5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm5Cb2R5KSA/IGFjY3VtdWxhdGVkUGF0aHMgOiBwaW5uZWRQYXRocztcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkge1xuICAgICAgICB0YXJnZXRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5hY2N1bXVsYXRlZFBhdGhzLCAuLi5waW5uZWRQYXRoc10pXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRlY2xhcmF0aW9uIHNlZWRzIEJ1bidzIGltcGxpY2l0IHdvcmtzcGFjZSBiYXNlbGluZTogaXQgY29udGFpbnMgYXQgbGVhc3Qgb25lXG4gKiBuZWdhdGlvbiBvZiB0aGUgc2VlZGluZyBzaGFwZSAoc2VlIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzIHJ1bGUgMikuIE1lYXN1cmVkIHdpdGggQnVuXG4gKiAxLjMuMTQsIHNlZWRpbmcgaXMgcGVyLW5lZ2F0aW9uIGFuZCBoYXBwZW5zIGV2ZW4gYWxvbmdzaWRlIHBvc2l0aXZlIHBhdHRlcm5zOyBjb25jcmV0ZSBvclxuICogbWl4ZWQtbGl0ZXJhbCBsYXN0IHNlZ21lbnRzIChgIWFwcHMvZXhjbHVkZWRgLCBgIWFwcHMvKmRgKSBuZXZlciBzZWVkLCBhbmQgYD9gLCBicmFjZSwgYW5kXG4gKiBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmVkIGluY29uc2lzdGVudGx5IGFjcm9zcyBmaXh0dXJlcyAoc29tZXRpbWVzIGRyb3BwaW5nIGV2ZW5cbiAqIHVucmVsYXRlZCBzaWJsaW5nIHdvcmtzcGFjZXMpLCBzbyB0aGV5IGFyZSBjb25zZXJ2YXRpdmVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nOyBzZWVcbiAqIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLnNvbWUoXG4gICAgKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkpKSAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbi8qKlxuICogRGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIHdpdGhvdXQgQnVuJ3Mgbm8tb3Agb25lcyAoYFwiXCJgLCBhIGxvbmUgYFwiIVwiYCwgYW5kIGBcIi5cImApLCB3aGljaCBCdW5cbiAqIGlnbm9yZXMgZW50aXJlbHkg4oCUIGEgbG9uZSBgXCIhXCJgIG11c3Qgbm90IGFjdGl2YXRlIHRoZSBuZWdhdGl2ZS1vbmx5IGltcGxpY2l0IGJhc2VsaW5lLCBhbmQgYFwiXCJgXG4gKiBtdXN0IG5vdCBtYWtlIHRoZSByZXBvc2l0b3J5IHJvb3QgaXRzZWxmIGEgZGlzY292ZXJlZCB3b3Jrc3BhY2UuIERlY2xhcmF0aW9uIG9yZGVyIGFuZFxuICogZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZSBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIHBvc2l0aW9uIG1hdHRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpXG4gICAgLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgLy8gQnVuIGFwcGxpZXMgbGVhZGluZy1iYW5nIFBBUklUWSAodmVyaWZpZWQgd2l0aCBCdW4gMS4zLjE0KTogYCEhcGAgaXMgdGhlIHBvc2l0aXZlIGBwYFxuICAgICAgLy8gYW5kIGAhISFwYCB0aGUgbmVnYXRpb24gYCFwYCwgc28gY2Fub25pY2FsaXplIHRvIGF0IG1vc3Qgb25lIGJhbmcuXG4gICAgICBjb25zdCBiYW5nQ291bnQgPSAvXiEqL3UuZXhlYyh3b3Jrc3BhY2VQYXR0ZXJuKSFbMF0ubGVuZ3RoO1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKGJhbmdDb3VudCk7XG4gICAgICByZXR1cm4gYmFuZ0NvdW50ICUgMiA9PT0gMSA/IGAhJHtwYXR0ZXJuQm9keX1gIDogcGF0dGVybkJvZHk7XG4gICAgfSlcbiAgICAuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gICAgICAvLyBOb3JtYWxpemUgc28gc3BlbGxpbmdzIGxpa2UgYC4vYCwgYC4vLmAsIGFuZCBgIS4vYCBhcmUgcmVjb2duaXplZCBhcyB0aGUgc2FtZSBuby1vcHNcbiAgICAgIC8vIChwYXRoLnBvc2l4Lm5vcm1hbGl6ZSgnJykgPT09ICcuJywgc28gdGhlIGVtcHR5IHBhdHRlcm4gaXMgY292ZXJlZCB0b28pLlxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5KSAhPT0gJy4nO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENvbGxhcHNlcyBgLy9gLCByZXNvbHZlcyBgLi9gLCBhbmQgc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMsIG1pcnJvcmluZyBCdW4ncyBwYXRoIGhhbmRsaW5nLlxuICogQSBwdXJlIHN0YXItcnVuIHNlZ21lbnQgb2YgdGhyZWUgb3IgbW9yZSBzdGFycyBiZWhhdmVzIGxpa2UgYCpgIHVuZGVyIEJ1biAoYCFvdGhlci8qKipgXG4gKiBtYXRjaGVzIG90aGVyL3gpIGJ1dCBub3QgdW5kZXIgZmFzdC1nbG9iLCBzbyBjYW5vbmljYWxpemUgaXQgdG8gYCpgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkocGF0dGVybkJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnBvc2l4XG4gICAgLm5vcm1hbGl6ZShwYXR0ZXJuQm9keSlcbiAgICAucmVwbGFjZSgvXFwvKyQvdSwgJycpXG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PiAoL15cXCp7Myx9JC91LnRlc3Qoc2VnbWVudCkgPyAnKicgOiBzZWdtZW50KSlcbiAgICAuam9pbignLycpO1xufVxuXG4vKiogVGhlIGltcGxpY2l0IGJhc2VsaW5lIGdsb2IgYSBuZWdhdGlvbiBzZWVkcyB1bmRlciBCdW4ncyBydWxlIDIgYWJvdmUsIG9yIHVuZGVmaW5lZCBpZiBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlZWRlZEJhc2VsaW5lR2xvYihuZWdhdGlvbkJvZHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbmVnYXRpb25Cb2R5LnNwbGl0KCcvJyk7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggIT09IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtmaXJzdFNlZ21lbnQsIGxhc3RTZWdtZW50XSA9IHNlZ21lbnRzIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gIGlmICghL15cXCorJC91LnRlc3QobGFzdFNlZ21lbnQpIHx8IC9eXFwqKyQvdS50ZXN0KGZpcnN0U2VnbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBsYXN0U2VnbWVudCA9PT0gJyoqJyA/ICcqKicgOiAnKi8qJztcbn1cblxuLyoqIFdvcmtzcGFjZSBwYXR0ZXJucyBmcm9tIGVpdGhlciB0aGUgYXJyYXkgZm9ybSBvciBZYXJuIHYxJ3MgYHsgcGFja2FnZXM6IFvigKZdIH1gIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzKSkgcmV0dXJuIHdvcmtzcGFjZXM7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHdvcmtzcGFjZXM/LnBhY2thZ2VzKSA/IHdvcmtzcGFjZXMucGFja2FnZXMgOiBbXTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm4gKG5lZ2F0aXZlIG9uZXMgaW5jbHVkZWQpIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeTpcbiAqIGFic29sdXRlIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIG5vZGVfbW9kdWxlcyBjbGVhbnVwIG9wZXJhdGVcbiAqIG9uIGFub3RoZXIgcmVwb3NpdG9yeSdzIGZpbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gIHJldHVybiAhcGF0aC5wb3NpeC5pc0Fic29sdXRlKHBhdHRlcm5Cb2R5KSAmJiAhcGF0dGVybkJvZHkuc3BsaXQoJy8nKS5pbmNsdWRlcygnLi4nKTtcbn1cbiIsImltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBBbmNob3JlZCB0byBgXCIsIGAgc28gb25seSBhIHJlZ2lzdHJ5IGVudHJ5J3MgYHJlc29sdmVkYCBzbG90IGlzIGNsZWFyZWQuIEEgZGlyZWN0IHRhcmJhbGxcbiAqIGRlcGVuZGVuY3kgY2FycmllcyBpdHMgVVJMIGluIHRoZSB3b3Jrc3BhY2UgZGVzY3JpcHRvciBhbmQgdHVwbGUgaWRlbnRpZmllciBpbnN0ZWFkLCBhbmQgdGhvc2VcbiAqIFVSTHMgbXVzdCByZW1haW4gaW50YWN0LlxuICovXG5jb25zdCBndWFyZFJlc29sdmVkVXJsUGF0dGVybiA9IC8oXCIsIClcImh0dHBzOlxcL1xcL25wbVxcLmZsYXR0XFwudGVjaFxcL1teXCJdKlwiL2c7XG5cbi8qKlxuICogUmVtb3ZlIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGJ1bi5sb2NrLlxuICpcbiAqIEJ1biB3cml0ZXMgdGhlIHdvcmtzcGFjZSByb290J3MgbG9ja2ZpbGUgZXZlbiB3aGVuIGFuIGluc3RhbGwgcnVucyBmcm9tIGEgY2hpbGQgcGFja2FnZS4gSW4gYVxuICogR2l0IGNoZWNrb3V0IHRoZSBzZWFyY2ggY2xpbWJzIHRvIHRoYXQgcm9vdDsgd2l0aG91dCBhIGNoZWNrb3V0IGJvdW5kYXJ5IGl0IGluc3BlY3RzIG9ubHkgdGhlXG4gKiBzdGFydGluZyBkaXJlY3Rvcnkgc28gaXQgY2Fubm90IHJld3JpdGUgYW4gdW5yZWxhdGVkIGFuY2VzdG9yJ3MgbG9ja2ZpbGUuIFRoZSBwcm94eSBpc1xuICogaW5zdGFsbC10aW1lIHBvbGljeSByYXRoZXIgdGhhbiByZXBvc2l0b3J5IHN0YXRlOiBhbiBlbXB0eSByZXNvbHZlZCBzbG90IHN0aWxsIG1ha2VzIEJ1biB1c2UgdGhlXG4gKiBjb25maWd1cmVkIGRlZmF1bHQgcmVnaXN0cnkuXG4gKlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgbG9ja2ZpbGUgcGF0aCwgb3IgdW5kZWZpbmVkIHdoZW4gbm8gY2hhbmdlIHdhcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdW5Mb2NrZmlsZShzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxvY2tmaWxlUGF0aCA9IGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoKTtcbiAgaWYgKCFsb2NrZmlsZVBhdGgpIHJldHVybjtcblxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGxvY2tmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3Qgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4sICckMVwiXCInKTtcbiAgaWYgKG5vcm1hbGl6ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgLy8gQSBzaWJsaW5nIHRlbXAgZmlsZSBtYWtlcyB0aGUgcmVwbGFjZW1lbnQgYW4gYXRvbWljIHNhbWUtZGlyZWN0b3J5IHJlbmFtZSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgLy8gd3JpdGUgY2Fubm90IGxlYXZlIGEgdHJ1bmNhdGVkIGJ1bi5sb2NrIGJlaGluZC5cbiAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGAke2xvY2tmaWxlUGF0aH0ubm9ybWFsaXppbmcuJHtwcm9jZXNzLnBpZH0uJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gIHRyeSB7XG4gICAgLy8gc3RhdCdzIG1vZGUgaW5jbHVkZXMgZmlsZS10eXBlIGJpdHMsIHdoaWNoIGNobW9kIGlzIG5vdCBzcGVjaWZpZWQgdG8gYWNjZXB0LlxuICAgIGNvbnN0IG1vZGUgPSBmcy5zdGF0U3luYyhsb2NrZmlsZVBhdGgpLm1vZGUgJiAwbzc3NztcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBvcmFyeVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50LCB7IG1vZGUgfSk7XG4gICAgLy8gd3JpdGVGaWxlU3luYydzIG1vZGUgaXMgbWFza2VkIGJ5IHRoZSBwcm9jZXNzIHVtYXNrOyBjaG1vZCByZXN0b3JlcyB0aGUgZXhhY3Qgb3JpZ2luYWwgYml0cy5cbiAgICBmcy5jaG1vZFN5bmModGVtcG9yYXJ5UGF0aCwgbW9kZSk7XG4gICAgZnMucmVuYW1lU3luYyh0ZW1wb3JhcnlQYXRoLCBsb2NrZmlsZVBhdGgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZzLnJtU3luYyh0ZW1wb3JhcnlQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiBsb2NrZmlsZVBhdGg7XG59XG5cbmZ1bmN0aW9uIGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZFN0YXJ0RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShzdGFydERpclBhdGgpO1xuICBjb25zdCByZXBvc2l0b3J5Um9vdERpclBhdGggPSBmaW5kUmVwb3NpdG9yeVJvb3REaXJQYXRoKHJlc29sdmVkU3RhcnREaXJQYXRoKTtcbiAgaWYgKCFyZXBvc2l0b3J5Um9vdERpclBhdGgpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRTdGFydERpclBhdGgsICdidW4ubG9jaycpO1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKGxvY2tmaWxlUGF0aCkgPyBsb2NrZmlsZVBhdGggOiB1bmRlZmluZWQ7XG4gIH1cblxuICBsZXQgZGlyUGF0aCA9IHJlc29sdmVkU3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGxvY2tmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpKSByZXR1cm4gbG9ja2ZpbGVQYXRoO1xuICAgIGlmIChkaXJQYXRoID09PSByZXBvc2l0b3J5Um9vdERpclBhdGgpIHJldHVybjtcblxuICAgIGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBkaXJQYXRoID0gc3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnLmdpdCcpKSkgcmV0dXJuIGRpclBhdGg7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBkaXJQYXRoKSByZXR1cm47XG4gICAgZGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52ID0ge1xuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgKGZub3ggcHJvZmlsZSAvIG1pc2UgZW52KSB0byBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ3F1aWV0LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N1cHByZXNzIGVudmlyb25tZW50IHZhcmlhYmxlIGxvYWRpbmcgaW5mb3JtYXRpb24uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+ICYge1xuICAvKipcbiAgICogQ29tbWFuZC1sZXZlbCBmYWxsYmFjayBmb3IgYW4gdW5zZXQgV0JfRU5WIChlLmcuIGB3YiB0ZXN0YCBzdXBwbGllcyAndGVzdCcgd2hlbiBleHBsaWNpdCBlbnZcbiAgICogZmxhZ3Mgc3VwcHJlc3MgaXRzIGRlZmF1bHQgdGVzdCBjYXNjYWRlKS4gTm90IGEgQ0xJIGZsYWcuXG4gICAqL1xuICBjb21tYW5kRGVmYXVsdFdiRW52Pzogc3RyaW5nO1xufTtcblxuY29uc3Qgc3RhbmRhcmRXYkVudk1vZGVzID0gbmV3IFNldChbJ2RldmVsb3BtZW50JywgJ3Rlc3QnLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJ10pO1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBXQl9FTlYgdmFsdWUgd2IgZmFsbHMgYmFjayB0byB3aGVuIG5vIGVudiBzb3VyY2UgYW5kIG5vIGV4cG9ydGVkIHZhcmlhYmxlIGRlZmluZXNcbiAqIGl0OiB0aGUgY29tbWFuZC1sZXZlbCBkZWZhdWx0IGZpcnN0IChgd2IgdGVzdCAtLWNhc2NhZGUtZW52PXN0YWdpbmdgIGxvYWRzIHRoZSBzdGFnaW5nIGZpbGVzXG4gKiBidXQgaXRzIHRlc3RzIG11c3Qgc3RpbGwgcnVuIGFzIGB0ZXN0YCwgbWlycm9yaW5nIHRoZSBwcmUtMTUgYHx8PSAndGVzdCdgIGJlaGF2aW9yKSwgdGhlbiB0aGVcbiAqIGZvcmNlZCBjYXNjYWRlLCB0aGVuIHRoZSBhbWJpZW50LU5PREVfRU5WLWRyaXZlbiBhdXRvIGNhc2NhZGUgY2xhbXBlZCB0byBhIHN0YW5kYXJkIG1vZGUgKGFcbiAqIG5vbi1zdGFuZGFyZCBOT0RFX0VOViBzdWNoIGFzIGBxYWAgc3RpbGwgc2VsZWN0cyB0aGUgY2FzY2FkZSBzdWZmaXgsIGJ1dCBtdXN0IG5vdCBwcm9kdWNlIGFcbiAqIG5vbi1zdGFuZGFyZCBXQl9FTlYpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZyB7XG4gIGlmIChhcmd2LmNvbW1hbmREZWZhdWx0V2JFbnYpIHJldHVybiBhcmd2LmNvbW1hbmREZWZhdWx0V2JFbnY7XG4gIGlmIChhcmd2LmNhc2NhZGVFbnYpIHJldHVybiBhcmd2LmNhc2NhZGVFbnY7XG4gIC8vIFJlYWQgTk9ERV9FTlYgdGhyb3VnaCB0aGUgYWxpYXMgZm9yIHRoZSBzYW1lIGJ1bmRsZXItaW5saW5pbmcgcmVhc29uIGFzIGluXG4gIC8vIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcywgYW5kIGZyb20gdGhlIEFNQklFTlQgZW52aXJvbm1lbnQgKG5vdCBsb2FkZWQgZmlsZXMpIGJlY2F1c2UgdGhlXG4gIC8vIGNhc2NhZGUgc2VsZWN0aW9uIGJlbG93IHVzZXMgdGhlIGFtYmllbnQgdmFsdWUgYXMgd2VsbC5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBkZXJpdmVkID1cbiAgICBhcmd2LmNhc2NhZGVOb2RlRW52IHx8IGFyZ3YuYXV0b0Nhc2NhZGVFbnYgIT09IGZhbHNlID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnIDogJ2RldmVsb3BtZW50JztcbiAgcmV0dXJuIHN0YW5kYXJkV2JFbnZNb2Rlcy5oYXMoZGVyaXZlZCkgPyBkZXJpdmVkIDogJ2RldmVsb3BtZW50Jztcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHRoZSByZXBvc2l0b3J5J3MgZm5veCBjb25maWd1cmF0aW9uIGFuZCBtaXNlLlxuICogTm90ZSBpdCBkb2VzIG5vdCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogQHJldHVybiBbZW52VmFycywgW2VudlNvdXJjZU5hbWVzLCBlbnZWYXJOYW1lc11bXV1cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICAvKipcbiAgICAgKiBMb2FkIHZhcmlhYmxlcyBldmVuIGlmIHRoZXkgYWxyZWFkeSBleGlzdCBpbiBwcm9jZXNzLmVudi5cbiAgICAgKiBVc2VmdWwgd2hlbiBhIHBhcmVudCBwcm9jZXNzIGhhcyBhbHJlYWR5IGluamVjdGVkIHRoZSBmbm94IHZhbHVlcyBpbnRvIHRoZSBlbnZpcm9ubWVudFxuICAgICAqIGFuZCB0aGUgY29uZmlndXJlZCB2YXJpYWJsZXMgdGhlbXNlbHZlcyBhcmUgbmVlZGVkIChlLmcuIGB3YiBnZW4tZGV2LXZhcnNgKS5cbiAgICAgKi9cbiAgICBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBFeHBhbmQgYCR7V0JfRU5WfWAgcmVmZXJlbmNlcyBhZ2FpbnN0IHRoZSBmYWxsYmFjayBtb2RlIHdoZW4gbm90aGluZyBkZWZpbmVzIFdCX0VOVi5cbiAgICAgKiBPbmx5IGZvciBjYWxsZXJzIHRoYXQgc3Vic2VxdWVudGx5IENPTVBMRVRFIFdCX0VOViB3aXRoIHRoYXQgZmFsbGJhY2sgKHdiJ3MgUHJvamVjdC5lbnYpLlxuICAgICAqL1xuICAgIGV4cGFuZEZhbGxiYWNrV2JFbnY/OiBib29sZWFuO1xuICB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgc3RyaW5nW11dW11dIHtcbiAgLy8gUmVhZCBOT0RFX0VOViB0aHJvdWdoIGFuIGFsaWFzLCBuZXZlciBhcyB0aGUgYHByb2Nlc3MuZW52Lk5PREVfRU5WYCBtZW1iZXIgZXhwcmVzc2lvbjpcbiAgLy8gYnVuZGxlcnMgcmVwbGFjZSB0aGF0IGV4YWN0IGV4cHJlc3Npb24gYXQgYnVpbGQgdGltZSAocm9sbGRvd24vYnVpbGQtdHMgaW5saW5lIGl0IGFzXG4gIC8vICdwcm9kdWN0aW9uJyksIHdoaWNoIGNvbnN0YW50LWZvbGRzIHRoZSBmYWxsYmFjayBiZWxvdyBhbmQgbWFkZSB0aGUgcHVibGlzaGVkIHdiIHNlbGVjdFxuICAvLyB0aGUgcHJvZHVjdGlvbiBwcm9maWxlIHdoZW5ldmVyIFdCX0VOViB3YXMgdW5zZXQuXG4gIGNvbnN0IHJ1bnRpbWVFbnYgPSBwcm9jZXNzLmVudjtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBydW50aW1lRW52LldCX0VOViB8fCBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBjb25zdCBzaG91bGRTdXBwcmVzc091dHB1dCA9IHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQoYXJndik7XG4gIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cnVudGltZUVudi5XQl9FTlZ9LCBOT0RFX0VOVjogJHtydW50aW1lRW52Lk5PREVfRU5WfWApO1xuICB9XG5cbiAgLy8gV2hlbiB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgZm9yY2VzIGEgbW9kZSAoLS1jYXNjYWRlLWVudiAvIC0tY2FzY2FkZS1ub2RlLWVudiAvIGFuIGV4cG9ydGVkXG4gIC8vIFdCX0VOViksIHZhbHVlcyB0aGF0IHRoZSBtb2RlJ3Mgb3duIGZub3ggcHJvZmlsZSBkZWZpbmVzIG11c3Qgd2luIG92ZXIgdmFyaWFibGVzIGluaGVyaXRlZFxuICAvLyBmcm9tIHRoZSBwYXJlbnQgc2hlbGw6IGEgc3RhbGUgYGV4cG9ydCBEQVRBQkFTRV9VUkw9Li4uYCBmcm9tIGEgZGV2ZWxvcG1lbnQgc2hlbGwgbXVzdCBub3RcbiAgLy8gbGVhayBpbnRvIGB3YiB0ZXN0YCdzIHRlc3QgbW9kZSAoY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzkzMCkuIE9uIENJXG4gIC8vIHRoZSBpbmhlcml0ZWQgdmFyaWFibGVzIGtlZXAgd2lubmluZyDigJQgd29ya2Zsb3dzIGRlbGliZXJhdGVseSBpbmplY3QgZW52IHZhcnMgdGhhdCBvdmVycmlkZVxuICAvLyB0aGUgY29tbWl0dGVkIHZhbHVlcyDigJQgYW5kIHRoYXQgc2hhZG93aW5nIGlzIHRoZSBkZXNpZ25lZCBiZWhhdmlvci5cbiAgY29uc3QgbW9kZUlzRm9yY2VkID0gQm9vbGVhbihcbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudiA/IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50JyA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnYgPyBydW50aW1lRW52LldCX0VOViA6IHVuZGVmaW5lZClcbiAgKTtcbiAgY29uc3QgbW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52ID0gbW9kZUlzRm9yY2VkICYmICFpc0NJRW52aXJvbm1lbnQocnVudGltZUVudi5DSSk7XG5cbiAgY29uc3QgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzOiBbc3RyaW5nLCBzdHJpbmdbXV1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IHByb2plY3RIYXNGbm94Q29uZmlnID0gaGFzUHJvamVjdEZub3hDb25maWcoY3dkKTtcbiAgY29uc3QgW2Zub3hFbnZWYXJzLCBmbm94RW52VmFyTmFtZXNdID0gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGNhc2NhZGUsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudixcbiAgICBoYXNGbm94Q29uZmlnOiBwcm9qZWN0SGFzRm5veENvbmZpZyxcbiAgfSk7XG4gIE9iamVjdC5hc3NpZ24oZW52VmFycywgZm5veEVudlZhcnMpO1xuICAvLyBSZXBvcnQgdGhlIGZub3ggc291cmNlIHdoZW5ldmVyIGZub3gudG9tbCBleGlzdHMg4oCUIGV2ZW4gd2hlbiBpdCB5aWVsZHMgbm8ga2V5cyAoYWxsIHNoYWRvd2VkLFxuICAvLyBlbXB0eSBwcm9maWxlLCBvciBhIGZhaWxpbmcgZXhwb3J0KTogY29uc3VtZXJzIHN1Y2ggYXMgd2IncyByZXF1aXJlZC1lbnZpcm9ubWVudCB2YWxpZGF0aW9uXG4gIC8vIG11c3Qgc2VlIHRoYXQgYSBkZWNsYXJlZCBlbnYgc291cmNlIGV4aXN0cyByYXRoZXIgdGhhbiBzaWxlbnRseSBmYWlsaW5nIG9wZW4uXG4gIGlmIChmbm94RW52VmFyTmFtZXMubGVuZ3RoID4gMCB8fCBwcm9qZWN0SGFzRm5veENvbmZpZykge1xuICAgIGNvbnN0IGZub3hTb3VyY2VOYW1lID0gZm5veEVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlKTtcbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbZm5veFNvdXJjZU5hbWUsIGZub3hFbnZWYXJOYW1lc10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtmbm94RW52VmFyTmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2Zub3hTb3VyY2VOYW1lfWApO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWlzZUVudlZhcnMsIG1pc2VFbnZWYXJOYW1lc10gPSByZWFkTWlzZUVudmlyb25tZW50VmFyaWFibGVzKGN3ZCwgY2FzY2FkZSwgZW52VmFycywgb3B0aW9ucyk7XG4gIE9iamVjdC5hc3NpZ24oZW52VmFycywgbWlzZUVudlZhcnMpO1xuICBpZiAobWlzZUVudlZhck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBtaXNlU291cmNlTmFtZSA9IG1pc2VFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSk7XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW21pc2VTb3VyY2VOYW1lLCBtaXNlRW52VmFyTmFtZXNdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmICFzaG91bGRTdXBwcmVzc091dHB1dCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7bWlzZUVudlZhck5hbWVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHttaXNlU291cmNlTmFtZX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgYFJlYWQgZW52IHNvdXJjZXM6ICR7ZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLm1hcCgoW2VudlBhdGgsIGtleXNdKSA9PiAoa2V5cy5sZW5ndGggPiAwID8gYCR7ZW52UGF0aH0gKCR7a2V5cy5qb2luKCcsICcpfSlgIDogZW52UGF0aCkpLmpvaW4oJywgJykgfHwgJ25vdGhpbmcnfWBcbiAgICApO1xuICB9XG5cbiAgLy8gRXhwYW5kIHJlZmVyZW5jZXMgYWdhaW5zdCB0aGUgbGl2ZSBlbnZpcm9ubWVudCBmb3Iga2V5cyBOT1QgbG9hZGVkIGZyb20gZmlsZXMsIHNvIHRoYXQgYVxuICAvLyByZWZlcmVuY2UgdG8gYW4gZXhwb3J0ZWQga2V5IChleGNsdWRlZCBmcm9tIGVudlZhcnMgYnkgcHJvY2Vzcy1lbnYgcHJlY2VkZW5jZSkgcmVzb2x2ZXMgdG9cbiAgLy8gdGhlIGVmZmVjdGl2ZSB2YWx1ZSBpbnN0ZWFkIG9mIGFuIGVtcHR5IHN0cmluZy4gTG9hZGVkIGtleXMgYXJlIGRlbGliZXJhdGVseSBhYnNlbnQgZnJvbVxuICAvLyB0aGUgcmVmZXJlbmNlIHNldDogZG90ZW52LWV4cGFuZCB3b3VsZCBvdGhlcndpc2UgcmVwbGFjZSB0aGVpciBwYXJzZWQgdmFsdWVzIHdpdGggdGhlXG4gIC8vIHByb2Nlc3MgdmFsdWVzLCBicmVha2luZyBjYWxsZXJzIHRoYXQgbmVlZCB0aGUgZmlsZS1kZWZpbmVkIHZhbHVlcyB0aGVtc2VsdmVzLlxuICBjb25zdCByZWZlcmVuY2VFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvY2Vzcy5lbnYpKSB7XG4gICAgLy8gRXNjYXBlIGRvbGxhciBzaWducyBzbyBkb3RlbnYtZXhwYW5kIHN1YnN0aXR1dGVzIGV4cG9ydGVkIHZhbHVlcyBsaXRlcmFsbHkgaW5zdGVhZCBvZlxuICAgIC8vIHJlY3Vyc2l2ZWx5IHJlLWV4cGFuZGluZyB0aGVtIChhbiBleHBvcnRlZCBgcGEkd29yZGAgbXVzdCBzdGF5IGBwYSR3b3JkYCkuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gZW52VmFycykpIHJlZmVyZW5jZUVudltrZXldID0gdmFsdWUucmVwbGFjZUFsbCgnJCcsIFN0cmluZy5yYXdgXFwkYCk7XG4gIH1cbiAgLy8gZG90ZW52LWV4cGFuZCByZXNvbHZlcyByZWZlcmVuY2VzIGluIGtleS1pbnNlcnRpb24gb3JkZXIsIHNvIGEgZm5veCB2YWx1ZSByZWZlcmVuY2luZyBhXG4gIC8vIG1pc2UtcHJvdmlkZWQga2V5IHdvdWxkIHNlZSBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIG1pc2UgZW50cmllcyBzdGF5ZWQgYXBwZW5kZWQgYWZ0ZXIgdGhlXG4gIC8vIGZub3ggZW50cmllcy4gUmVidWlsZCB0aGUgZXhwYW5zaW9uIGlucHV0IHdpdGggdGhlIGxvd2VyLXByaW9yaXR5IHNvdXJjZXMgZmlyc3Q7IHRoZSB2YWx1ZXNcbiAgLy8gdGhlbXNlbHZlcyBhbHJlYWR5IHJlZmxlY3QgdGhlIGludGVuZGVkIGZub3gtb3Zlci1taXNlIHByZWNlZGVuY2UuXG4gIGNvbnN0IG9yZGVyZWRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFsuLi5taXNlRW52VmFyTmFtZXMsIC4uLmZub3hFbnZWYXJOYW1lc10pIG9yZGVyZWRFbnZWYXJzW2tleV0gPSBlbnZWYXJzW2tleV0hO1xuICBPYmplY3QuYXNzaWduKG9yZGVyZWRFbnZWYXJzLCBlbnZWYXJzKTtcbiAgLy8gZXhwYW5kKCkgbXV0YXRlcyBCT1RIIGl0cyBwYXJzZWQgaW5wdXQgQU5EIHByb2Nlc3NFbnYgKGRvdGVudi1leHBhbmQgd3JpdGVzIGV2ZXJ5IHBhcnNlZFxuICAvLyByZXN1bHQgaW50byBwcm9jZXNzRW52KSwgc28gc25hcHNob3QgYm90aCBmb3IgdGhlIHJlLWV4cGFuc2lvbiBiZWxvdyDigJQgdGhlIHJldHJ5IG11c3Qgbm90XG4gIC8vIHNlZSB0aGUgZmlyc3QgcGFzcydzIHN0YWxlIGRlcGVuZGVudCB2YWx1ZXMuXG4gIGNvbnN0IHByZUV4cGFuc2lvbkVudlZhcnMgPSB7IC4uLm9yZGVyZWRFbnZWYXJzIH07XG4gIGNvbnN0IHByaXN0aW5lUmVmZXJlbmNlRW52ID0geyAuLi5yZWZlcmVuY2VFbnYgfTtcbiAgbGV0IGV4cGFuZGVkRW52VmFycyA9IGV4cGFuZCh7IHBhcnNlZDogb3JkZXJlZEVudlZhcnMsIHByb2Nlc3NFbnY6IHJlZmVyZW5jZUVudiB9KS5wYXJzZWQgPz8gb3JkZXJlZEVudlZhcnM7XG4gIC8vIEEgdmFsdWUgcmVmZXJlbmNpbmcgJHtXQl9FTlZ9IG11c3QgZXhwYW5kIHRvIHdoYXQgdGhlIGNoaWxkIHdpbGwgYWN0dWFsbHkgc2VlOiB3aGVuIHRoZVxuICAvLyBFRkZFQ1RJVkUgV0JfRU5WIGVuZHMgdXAgZW1wdHkg4oCUIHdoZXRoZXIgaXQgd2FzIG5ldmVyIGRlZmluZWQsIGRlZmluZWQgZW1wdHksIG9yIGVtcHRpZWQgYnlcbiAgLy8gdGhlIGV4cGFuc2lvbiBpdHNlbGYgKGUuZy4gYFdCX0VOVj0ke01JU1NJTkdfTU9ERX1gKSDigJQgd2IncyBQcm9qZWN0LmVudiBsYXRlciBmaWxscyBpdCB3aXRoXG4gIC8vIHRoZSBmYWxsYmFjayBtb2RlLCBzbyByZS1leHBhbmQgZnJvbSB0aGUgb3JpZ2luYWwgdmFsdWVzIHdpdGggdGhhdCBmYWxsYmFjayBhdmFpbGFibGUuXG4gIC8vIE9wdC1pbiB2aWEgdGhlIG9wdGlvbjogYSBkaXJlY3QgcmVhZEVudmlyb25tZW50VmFyaWFibGVzL3JlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzXG4gIC8vIGNhbGxlciBuZXZlciByZWNlaXZlcyB0aGUgY29tcGxldGVkIFdCX0VOViwgYW5kIGV4cGFuZGluZyByZWZlcmVuY2VzIGFnYWluc3QgYSB2YWx1ZSB0aGF0IGlzXG4gIC8vIG5vdCBhY3R1YWxseSBhcHBsaWVkIHdvdWxkIG1ha2UgdGhlIHBhaXIgaW5jb25zaXN0ZW50LlxuICAvLyBUaGUgbG9hZGVkIGtleSBtYXNrcyB0aGUgYW1iaWVudCB2YWx1ZSwgc28gYSBsb2FkZWQtYnV0LWVtcHRpZWQgV0JfRU5WIG5lZWRzIHRoZSByZXRyeSBldmVuXG4gIC8vIHdoZW4gYW4gZXhwb3J0ZWQgV0JfRU5WIGV4aXN0cyAoYSBmb3JjZWQgbW9kZSBmaWxlIG92ZXJyaWRlcyB0aGUgZXhwb3J0IGxvY2FsbHkpOiByZXRyeSB3aXRoXG4gIC8vIHRoZSB2YWx1ZSB0aGUgbWVyZ2VkIGVudmlyb25tZW50IHdpbGwgdWx0aW1hdGVseSByZXRhaW4uXG4gIGNvbnN0IGVmZmVjdGl2ZVdiRW52ID0gZXhwYW5kZWRFbnZWYXJzLldCX0VOViA/PyBydW50aW1lRW52LldCX0VOVjtcbiAgaWYgKG9wdGlvbnM/LmV4cGFuZEZhbGxiYWNrV2JFbnYgJiYgIWVmZmVjdGl2ZVdiRW52KSB7XG4gICAgY29uc3QgcmVFeHBhbnNpb25JbnB1dCA9IHsgLi4ucHJlRXhwYW5zaW9uRW52VmFycyB9O1xuICAgIGRlbGV0ZSByZUV4cGFuc2lvbklucHV0LldCX0VOVjtcbiAgICBjb25zdCByZXRyeVJlZmVyZW5jZUVudiA9IHsgLi4ucHJpc3RpbmVSZWZlcmVuY2VFbnYsIFdCX0VOVjogcnVudGltZUVudi5XQl9FTlYgfHwgcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndikgfTtcbiAgICBleHBhbmRlZEVudlZhcnMgPSBleHBhbmQoeyBwYXJzZWQ6IHJlRXhwYW5zaW9uSW5wdXQsIHByb2Nlc3NFbnY6IHJldHJ5UmVmZXJlbmNlRW52IH0pLnBhcnNlZCA/PyByZUV4cGFuc2lvbklucHV0O1xuICB9XG4gIHJldHVybiBbZXhwYW5kZWRFbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXNdO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gdGhlIHJlcG9zaXRvcnkncyBmbm94IGNvbmZpZ3VyYXRpb24gKGBmbm94LnRvbWxgKS5cbiAqIFRoZSBiYXNlIGBbc2VjcmV0c11gIHRhYmxlIGNhcnJpZXMgdGhlIGRldmVsb3BtZW50IHZhbHVlcywgYW5kIGBbcHJvZmlsZXMuPGNhc2NhZGU+LnNlY3JldHNdYFxuICogb3ZlcmxheXMgaXQ7IGFuIHVua25vd24gcHJvZmlsZSBmYWxscyBiYWNrIHRvIHRoZSBiYXNlIHNlY3JldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzKFxuICBjd2Q6IHN0cmluZyxcbiAgY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zPzoge1xuICAgIGlnbm9yZVByb2Nlc3NFbnY/OiBib29sZWFuO1xuICAgIG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0Vudj86IGJvb2xlYW47XG4gICAgLyoqIFByZWNvbXB1dGVkIGhhc1Byb2plY3RGbm94Q29uZmlnKGN3ZCkgcmVzdWx0LCB0byBhdm9pZCByZS13YWxraW5nIHRoZSBhbmNlc3RvciBkaXJlY3Rvcmllcy4gKi9cbiAgICBoYXNGbm94Q29uZmlnPzogYm9vbGVhbjtcbiAgfVxuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIHN0cmluZ1tdXSB7XG4gIGlmICghKG9wdGlvbnM/Lmhhc0Zub3hDb25maWcgPz8gaGFzUHJvamVjdEZub3hDb25maWcoY3dkKSkpIHJldHVybiBbe30sIFtdXTtcblxuICBjb25zdCBzZWNyZXRzID0gcnVuRm5veEV4cG9ydChjd2QsIGNhc2NhZGUsIHsgcXVpZXQ6IGZhbHNlIH0pO1xuICBpZiAoIXNlY3JldHMpIHJldHVybiBbe30sIFtdXTtcbiAgLy8gYFtwcm9maWxlcy48Y2FzY2FkZT4uc2VjcmV0c11gIGlzIHRoZSBmbm94IGFuYWxvZ3VlIG9mIGAuZW52LjxjYXNjYWRlPmA6IHdoZW4gdGhlIGNhbGxlclxuICAvLyBmb3JjZXMgYSBtb2RlIG9mZiBDSSwgcHJvZmlsZS1zcGVjaWZpYyB2YWx1ZXMgbXVzdCBvdmVycmlkZSBpbmhlcml0ZWQgc2hlbGwgdmFyaWFibGVzIGp1c3RcbiAgLy8gbGlrZSBgLmVudi48bW9kZT5gIHZhbHVlcyBkbywgd2hpbGUgYmFzZSBgW3NlY3JldHNdYCB2YWx1ZXMga2VlcCBsb3NpbmcgdG8gcHJvY2Vzcy5lbnYuIEEga2V5XG4gIC8vIGlzIHByb2ZpbGUtc3BlY2lmaWMgd2hlbiB0aGUgcHJvZmlsZSBleHBvcnQncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2UgZXhwb3J0J3M7IHdoZW4gdGhlXG4gIC8vIGJhc2UgZXhwb3J0IGZhaWxzLCBubyBvdmVycmlkZSBpcyBhcHBsaWVkIChjb25zZXJ2YXRpdmUpLiBUaGUgYmFzZSBleHBvcnQgcnVucyBMQVpJTFksIG9ubHlcbiAgLy8gd2hlbiBhIHByb2Nlc3MuZW52IGNvbGxpc2lvbiBhY3R1YWxseSBuZWVkcyBhZGp1ZGljYXRpbmcg4oCUIGl0IHdvdWxkIG90aGVyd2lzZSBhZGQgYVxuICAvLyBzdWJwcm9jZXNzIChpbmNsdWRpbmcgYWdlIGRlY3J5cHRpb24pIHRvIGV2ZXJ5IGZvcmNlZC1tb2RlIGludm9jYXRpb24gZm9yIG5vdGhpbmcuXG4gIGxldCBjYWNoZWRCYXNlU2VjcmV0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQgfCBmYWxzZSA9IGZhbHNlO1xuICBjb25zdCBnZXRCYXNlU2VjcmV0cyA9ICgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKGNhY2hlZEJhc2VTZWNyZXRzID09PSBmYWxzZSkge1xuICAgICAgY2FjaGVkQmFzZVNlY3JldHMgPSBydW5Gbm94RXhwb3J0KGN3ZCwgdW5kZWZpbmVkLCB7IHF1aWV0OiB0cnVlLCBpZ25vcmVQcm9maWxlRW52VmFyOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkQmFzZVNlY3JldHM7XG4gIH07XG5cbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZWNyZXRzKSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAvLyBFeHBsaWNpdGx5IGV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aW4gb3ZlciBmbm94IGJhc2UgdmFsdWVzLlxuICAgIC8vIChUaGUgbWlzZSByZWFkZXIgYmVsb3cgaW50ZW50aW9uYWxseSB1c2VzIGEgdmFsdWUtZXF1YWxpdHkgY2hlY2sgaW5zdGVhZDogYG1pc2UgZW52YCBlY2hvZXNcbiAgICAvLyBiYWNrIHZhcmlhYmxlcyB0aGUgYW1iaWVudCBtaXNlIGFjdGl2YXRpb24gYWxyZWFkeSBleHBvcnRlZCwgYW5kIGEgZGlmZmVyaW5nIHZhbHVlIG1lYW5zIHRoZVxuICAgIC8vIHJlcXVlc3RlZCBjYXNjYWRlIHByb2ZpbGUgc2hvdWxkIHdpbiBvdmVyIHRoZSBzdGFsZSBhY3RpdmF0aW9uLilcbiAgICBpZiAoIW9wdGlvbnM/Lmlnbm9yZVByb2Nlc3NFbnYgJiYga2V5IGluIHByb2Nlc3MuZW52KSB7XG4gICAgICBjb25zdCBiYXNlU2VjcmV0cyA9IG9wdGlvbnM/Lm1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiAmJiBjYXNjYWRlID8gZ2V0QmFzZVNlY3JldHMoKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IG92ZXJyaWRlc1Byb2Nlc3NFbnYgPSBiYXNlU2VjcmV0cyAhPT0gdW5kZWZpbmVkICYmIGJhc2VTZWNyZXRzW2tleV0gIT09IHZhbHVlO1xuICAgICAgaWYgKCFvdmVycmlkZXNQcm9jZXNzRW52KSBjb250aW51ZTtcbiAgICB9XG4gICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIFtlbnZWYXJzLCBrZXlzXTtcbn1cblxuZnVuY3Rpb24gcnVuRm5veEV4cG9ydChcbiAgY3dkOiBzdHJpbmcsXG4gIGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogeyBxdWlldDogYm9vbGVhbjsgaWdub3JlUHJvZmlsZUVudlZhcj86IGJvb2xlYW4gfVxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAvLyBgLS1pZi1taXNzaW5nIGVycm9yYCAoZGVmYXVsdCk6IGZub3ggb3RoZXJ3aXNlIGV4aXRzIDAgYW5kIHNpbGVudGx5IG9taXRzIHNlY3JldHMgaXQgZmFpbHMgdG9cbiAgLy8gcmVzb2x2ZSAoZS5nLiBhIG1pc3NpbmcgYWdlIGtleSksIHdoaWNoIHdvdWxkIGJlIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdW5kZWNsYXJlZCBzZWNyZXRzLlxuICAvLyBPcHQtaW4gZXNjYXBlIGhhdGNoIGBXQl9BTExPV19NSVNTSU5HX1NFQ1JFVFM9MWA6IHN3aXRjaCB0byBgd2FybmAgc28gYSBrZXlsZXNzIGNvbnRleHQg4oCUIGUuZy4gYVxuICAvLyBEb2NrZXIvUmFpbHdheSBpbWFnZSBidWlsZCB0aGF0IG9ubHkgaW5saW5lcyBub24tc2VjcmV0IHB1YmxpYyB2YWx1ZXMgKGBBUFBfVElUTEVgLFxuICAvLyBgTkVYVF9QVUJMSUNfKmApIHdoaWxlIHRoZSBhZ2Uga2V5IGlzIGRlbGliZXJhdGVseSBhYnNlbnQg4oCUIHN0aWxsIGxvYWRzIHRoZSByZXNvbHZhYmxlIHZhbHVlc1xuICAvLyAocGxhaW50ZXh0IGRlZmF1bHRzIHBsdXMgYW55IHNlY3JldCB0aGF0IERJRCBkZWNyeXB0KSBpbnN0ZWFkIG9mIGZhaWxpbmcgb3V0cmlnaHQuIGB3YXJuYCwgbm90XG4gIC8vIGBpZ25vcmVgLCBrZWVwcyBmbm94IHJlcG9ydGluZyB0aGUgc2tpcHBlZCBzZWNyZXQgbmFtZXMgb24gc3RkZXJyIChzdXJmYWNlZCBiZWxvdyksIHNvIHJlbGF4aW5nXG4gIC8vIHRoZSBjaGVjayBzdGF5cyBhdWRpdGFibGUgcmF0aGVyIHRoYW4gc2lsZW50bHkgZHJvcHBpbmcgZGVjbGFyZWQgc2VjcmV0cy5cbiAgLy8gYC0tbm9uLWludGVyYWN0aXZlYDogcHJvbXB0cyBvciBicm93c2VyIGF1dGggZmxvd3Mgd291bGQgaGFuZyBmb3JldmVyIGJlY2F1c2Ugc3RkaW4gaXMgaWdub3JlZC5cbiAgY29uc3QgYWxsb3dNaXNzaW5nU2VjcmV0cyA9XG4gICAgcHJvY2Vzcy5lbnYuV0JfQUxMT1dfTUlTU0lOR19TRUNSRVRTID09PSAnMScgfHwgcHJvY2Vzcy5lbnYuV0JfQUxMT1dfTUlTU0lOR19TRUNSRVRTID09PSAndHJ1ZSc7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJ2V4cG9ydCcsXG4gICAgJy0tZm9ybWF0JyxcbiAgICAnanNvbicsXG4gICAgJy0tbm8tY29sb3InLFxuICAgICctLWlmLW1pc3NpbmcnLFxuICAgIGFsbG93TWlzc2luZ1NlY3JldHMgPyAnd2FybicgOiAnZXJyb3InLFxuICAgICctLW5vbi1pbnRlcmFjdGl2ZScsXG4gIF07XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgaWYgKGNhc2NhZGUpIHtcbiAgICBhcmdzLnB1c2goJy0tcHJvZmlsZScsIGNhc2NhZGUpO1xuICB9XG4gIGlmIChvcHRpb25zLmlnbm9yZVByb2ZpbGVFbnZWYXIpIHtcbiAgICAvLyBXaXRob3V0IGAtLXByb2ZpbGVgLCBmbm94IGZhbGxzIGJhY2sgdG8gRk5PWF9QUk9GSUxFOyB0aGUgYmFzZS1hZGp1ZGljYXRpb24gZXhwb3J0IG11c3RcbiAgICAvLyByZWFkIHRoZSBCQVNFIHNlY3JldHMsIHNvIHRoZSBpbmhlcml0ZWQgcHJvZmlsZSBzZWxlY3Rpb24gaXMgY2xlYXJlZCBmb3IgaXQg4oCUIGFuZCBvbmx5IGZvclxuICAgIC8vIGl0LiBBIFBSSU1BUlkgZXhwb3J0IHN0aWxsIGhvbm9ycyBGTk9YX1BST0ZJTEU6IGl0IGVpdGhlciBzdGF5cyBwcm9maWxlLWxlc3MgKGZub3ggcmVhZHMgdGhlXG4gICAgLy8gdmFyaWFibGUpIG9yIGZvbGRzIGl0IGludG8gdGhlIGAtLXByb2ZpbGVgIGl0IHBhc3NlcyAoc2VlIHdiIGRvdGVudidzIGNhc2NhZGUpLlxuICAgIGRlbGV0ZSBlbnYuRk5PWF9QUk9GSUxFO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNoaWxkUHJvY2Vzcy5zcGF3blN5bmMoJ2Zub3gnLCBhcmdzLCB7XG4gICAgY3dkLFxuICAgIGVudixcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCAhcmVzdWx0LnN0ZG91dD8udHJpbSgpKSB7XG4gICAgLy8gVGhlIHJlcG9zaXRvcnkgZGVjbGFyZXMgZm5veC1tYW5hZ2VkIHNlY3JldHMgKGZub3gudG9tbCBleGlzdHMpLCBzbyBhIGZhaWxpbmcgZXhwb3J0IG11c3QgYmVcbiAgICAvLyBzdXJmYWNlZDogc3dhbGxvd2luZyBpdCB3b3VsZCBtYWtlIGRlY2xhcmVkIHNlY3JldHMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB1bmRlY2xhcmVkIG9uZXMuXG4gICAgaWYgKCFvcHRpb25zLnF1aWV0KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gcmVhZCBmbm94IHNlY3JldHM6ICR7cmVzdWx0LmVycm9yPy5tZXNzYWdlIHx8IHJlc3VsdC5zdGRlcnI/LnRyaW0oKSB8fCBgZm5veCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtyZXN1bHQuc3RhdHVzfWB9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFsbG93TWlzc2luZ1NlY3JldHMgJiYgIW9wdGlvbnMucXVpZXQgJiYgcmVzdWx0LnN0ZGVycj8udHJpbSgpKSB7XG4gICAgLy8gV2l0aCBgLS1pZi1taXNzaW5nIHdhcm5gLCBmbm94IGV4aXRzIDAgYnV0IHJlcG9ydHMgdGhlIHNlY3JldHMgaXQgY291bGQgbm90IHJlc29sdmUgb24gc3RkZXJyLlxuICAgIC8vIFN1cmZhY2UgdGhlbSBzbyByZWxheGluZyB0aGUgY2hlY2sgdmlhIFdCX0FMTE9XX01JU1NJTkdfU0VDUkVUUyBkb2VzIG5vdCBoaWRlIGEgcmVhbCBnYXAuXG4gICAgY29uc29sZS53YXJuKGBXQl9BTExPV19NSVNTSU5HX1NFQ1JFVFM6IGNvbnRpbnVpbmcgd2l0aG91dCB1bnJlc29sdmVkIGZub3ggc2VjcmV0cy5cXG4ke3Jlc3VsdC5zdGRlcnIudHJpbSgpfWApO1xuICB9XG5cbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgc2VjcmV0cyA9IChwYXJzZWQgYXMgeyBzZWNyZXRzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uc2VjcmV0cztcbiAgaWYgKCFzZWNyZXRzIHx8IHR5cGVvZiBzZWNyZXRzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNlY3JldHMpKSByZXR1cm47XG4gIHJldHVybiBzZWNyZXRzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzUHJvamVjdEZub3hDb25maWcoY3dkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc0FuY2VzdG9yQ29udGFpbmluZyhjd2QsIFsnZm5veC50b21sJ10pO1xufVxuXG5mdW5jdGlvbiBmbm94RW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBjYXNjYWRlID8gYGZub3ggZXhwb3J0IC0tcHJvZmlsZSAke2Nhc2NhZGV9YCA6ICdmbm94IGV4cG9ydCc7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGN3ZDogc3RyaW5nLFxuICBjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN1cnJlbnRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvcHRpb25zPzogeyBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbiB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgc3RyaW5nW11dIHtcbiAgaWYgKCFoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2QpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3QgYXJncyA9IFsnZW52JywgJy0tanNvbicsICctLWNkJywgY3dkXTtcbiAgaWYgKGNhc2NhZGUpIHtcbiAgICBhcmdzLnB1c2goJy0tZW52JywgY2FzY2FkZSk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hpbGRQcm9jZXNzLnNwYXduU3luYygnbWlzZScsIGFyZ3MsIHtcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCAhcmVzdWx0LnN0ZG91dD8udHJpbSgpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW3t9LCBbXV07XG4gIH1cbiAgaWYgKCFwYXJzZWQgfHwgdHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwYXJzZWQpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwga2V5IGluIGN1cnJlbnRFbnZWYXJzKSBjb250aW51ZTtcbiAgICBpZiAob3B0aW9ucz8uaWdub3JlUHJvY2Vzc0Vudikge1xuICAgICAgLy8gYG1pc2UgZW52YCBhbHdheXMgZW1pdHMgUEFUSCBkdWUgdG8gdG9vbCBzaGltczsgY29uc3VtZXJzIG9mIGZpbGUtZGVmaW5lZCB2YXJpYWJsZXNcbiAgICAgIC8vIChlLmcuIGB3YiBnZW4tZGV2LXZhcnNgKSBtdXN0IG5vdCBwcm9wYWdhdGUgaXQuXG4gICAgICBpZiAoa2V5ID09PSAnUEFUSCcpIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnZba2V5XSA9PT0gdmFsdWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gW2VudlZhcnMsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzQW5jZXN0b3JDb250YWluaW5nKGN3ZCwgWydtaXNlLnRvbWwnLCAnLm1pc2UudG9tbCddKTtcbn1cblxuZnVuY3Rpb24gaGFzQW5jZXN0b3JDb250YWluaW5nKGN3ZDogc3RyaW5nLCBmaWxlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGN1cnJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCk7IDsgY3VycmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpKSB7XG4gICAgaWYgKGZpbGVOYW1lcy5zb21lKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsIGZpbGVOYW1lKSkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgaWYgKHBhcmVudFBhdGggPT09IGN1cnJlbnRQYXRoKSByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWlzZUVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gY2FzY2FkZSA/IGBtaXNlIGVudiAtLWVudiAke2Nhc2NhZGV9YCA6ICdtaXNlIGVudic7XG59XG5cbmZ1bmN0aW9uIGlzQ0lFbnZpcm9ubWVudChjaUVudjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWNpRW52ICYmIGNpRW52ICE9PSAnMCcgJiYgY2lFbnYgIT09ICdmYWxzZSc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3Qgb3V0cHV0T3B0aW9ucyA9IGFyZ3YgYXMgRW52UmVhZGVyT3B0aW9ucyAmIHsgcXVpZXRFbnY/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH07XG4gIHJldHVybiBvdXRwdXRPcHRpb25zLnF1aWV0RW52ID09PSB0cnVlIHx8IChvdXRwdXRPcHRpb25zLnF1aWV0RW52ICE9PSBmYWxzZSAmJiBvdXRwdXRPcHRpb25zLnNpbGVudCA9PT0gdHJ1ZSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBmbm94L21pc2UgYW5kIGFzc2lnbnMgdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICAvLyBFeGlzdGluZyBwcm9jZXNzLmVudiBrZXlzIGFyZSBrZXB0OiBlbnZWYXJzIG1heSBkZWxpYmVyYXRlbHkgY29udGFpbiBkaWZmZXJpbmcgdmFsdWVzIHRoYXRcbiAgICAvLyBtdXN0IHdpbiBvbmx5IGluIHRoZSByZXR1cm5lZCByZWNvcmQgKG1pc2UgY2FzY2FkZS1wcm9maWxlIHZhbHVlcywgZm9yY2VkLW1vZGUgb3ZlcnJpZGVzXG4gICAgLy8gY29uc3VtZWQgdmlhIGBwcm9qZWN0LmVudmApLCBuZXZlciBjbG9iYmVyIHRoZSBjYWxsZXIncyBvd24gcHJvY2VzcyBlbnZpcm9ubWVudC5cbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzRXJybm9FeGNlcHRpb24oZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAnY29kZScgaW4gZXJyb3I7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHBzT3V0cHV0OiBzdHJpbmcpOiBNYXA8bnVtYmVyLCBudW1iZXJbXT4ge1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcHNPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IC9eXFxzKihcXGQrKVxccysoXFxkKylcXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkUGlkID0gTnVtYmVyKG1hdGNoZWRbMV0pO1xuICAgIGNvbnN0IHBhcmVudFBpZCA9IE51bWJlcihtYXRjaGVkWzJdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudFBpZCk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkUGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50UGlkLCBbY2hpbGRQaWRdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuQnlQYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyLCBjaGlsZHJlbkJ5UGFyZW50OiBNYXA8bnVtYmVyLCBudW1iZXJbXT4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGRlc2NlbmRhbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBxdWV1ZSA9IFsuLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocm9vdFBpZCkgPz8gW10pXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgcGlkID0gcXVldWVbaW5kZXhdIGFzIG51bWJlcjtcbiAgICBpbmRleCArPSAxO1xuICAgIGRlc2NlbmRhbnRzLnB1c2gocGlkKTtcbiAgICBxdWV1ZS5wdXNoKC4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChwaWQpID8/IFtdKSk7XG4gIH1cbiAgcmV0dXJuIGRlc2NlbmRhbnRzO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgaXNFcnJub0V4Y2VwdGlvbiB9IGZyb20gJy4vZXJybm8uanMnO1xuaW1wb3J0IHsgYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwLCBjb2xsZWN0RGVzY2VuZGFudFBpZHMgYXMgY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCB9IGZyb20gJy4vcHJvY2Vzc1RyZWUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJlZUtpbGwocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgPSAnU0lHVEVSTScpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgfHwgcGlkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGlkOiAke3BpZH1gKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAga2lsbFRyZWVPbldpbmRvd3MocGlkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXNjZW5kYW50cyA9IGNvbGxlY3REZXNjZW5kYW50UGlkcyhwaWQpO1xuICBjb25zdCB0YXJnZXRQaWRzID0gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQsIGRlc2NlbmRhbnRzKTtcbiAgZm9yIChjb25zdCB0YXJnZXRQaWQgb2YgdGFyZ2V0UGlkcykge1xuICAgIGtpbGxJZk5lZWRlZCh0YXJnZXRQaWQsIHNpZ25hbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbElmTmVlZGVkKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgc2lnbmFsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxUcmVlT25XaW5kb3dzKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcnVuQ29tbWFuZCgndGFza2tpbGwnLCBbJy9QSUQnLCBTdHJpbmcocGlkKSwgJy9UJywgJy9GJ10sIHtcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IHJ1bkNvbW1hbmQoXG4gICAgJ3BzJyxcbiAgICBbJy1BbycsICdwaWQ9LHBwaWQ9J10sXG4gICAgLy8gS2VlcCBjb21tYW5kIGJvdW5kZWQgc28gd2F0Y2gtbW9kZSBraWxsIGxvb3BzIGNhbm5vdCBoYW5nIHRoaXMgcGF0aC5cbiAgICB7IG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsIHRpbWVvdXQ6IDIwMDAgfVxuICApO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHN0ZG91dCk7XG4gIHJldHVybiBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwKHJvb3RQaWQsIGNoaWxkcmVuQnlQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZDogbnVtYmVyLCBkZXNjZW5kYW50czogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSBkZXNjZW5kYW50cy50b1JldmVyc2VkKCk7XG4gIHRhcmdldFBpZHMucHVzaChwaWQpO1xuICByZXR1cm4gdGFyZ2V0UGlkcztcbn1cblxuZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IHsgdGltZW91dDogbnVtYmVyOyBtYXhCdWZmZXI6IG51bWJlciB9XG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoY29tbWFuZCwgWy4uLmFyZ3NdLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBvcHRpb25zPy5tYXhCdWZmZXIsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiAnJyB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHN0ZGVyciA9IGV4dHJhY3RTdGRlcnIoZXJyb3IpO1xuICAgIHRocm93IG5ldyBDb21tYW5kRXhlY3V0aW9uRXJyb3IoY29tbWFuZCwgYXJncywgc3RkZXJyLCB0b0V4aXRDb2RlKGVycm9yKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbW1hbmRFeGVjdXRpb25FcnJvcikge1xuICAgIHJldHVybiAvbm8gc3VjaCBwcm9jZXNzfG5vdCBmb3VuZHxub3QgcmVjb2duaXplZHx0aGVyZSBpcyBubyBydW5uaW5nIGluc3RhbmNlL2kudGVzdChlcnJvci5zdGRlcnIpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdG9FeGl0Q29kZShlcnJvcjogdW5rbm93bik6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXMnIGluIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzOiB1bmtub3duIH0pLnN0YXR1cztcbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGRlcnIoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCBlcnJvciA9PT0gbnVsbCB8fCAhKCdzdGRlcnInIGluIGVycm9yKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHN0ZGVyciA9IChlcnJvciBhcyBSZWNvcmQ8J3N0ZGVycicsIHVua25vd24+KS5zdGRlcnI7XG4gIGlmICh0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdGRlcnI7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdGRlcnIpKSB7XG4gICAgcmV0dXJuIHN0ZGVyci50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuY2xhc3MgQ29tbWFuZEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sIHN0ZGVycjogc3RyaW5nLCBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29tbWFuZEV4ZWN1dGlvbkVycm9yJztcbiAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFNwYXduT3B0aW9ucyxcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZSxcbiAgU3Bhd25TeW5jUmV0dXJucyxcbiAgU3RkaW9OdWxsLFxuICBTdGRpb1BpcGUsXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnLi90cmVlS2lsbC5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRvdXQgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3Rkb3V0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRlcnI/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgYmxhbmstb25seSBsaW5lcyBhcmUgc2tpcHBlZCB3aGlsZSBwcmludGluZyBzdGRvdXQvc3RkZXJyIGluIHJlYWx0aW1lICovXG4gIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBjb25zdCBzdGRvdXRQcmludGVyID0gY3JlYXRlUmVhbHRpbWVQcmludGVyKHByb2Nlc3Muc3Rkb3V0LCBvcHRpb25zPy5vbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmcpO1xuICAgICAgY29uc3Qgc3RkZXJyUHJpbnRlciA9IGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihwcm9jZXNzLnN0ZGVyciwgb3B0aW9ucz8ub21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZG91dCkge1xuICAgICAgICAgIHN0ZG91dFByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZGVycikge1xuICAgICAgICAgIHN0ZGVyclByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0cmVlS2lsbChwcm9jLnBpZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvYy5waWR9KWAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBjbGVhbnVwU2lnbmFsczogTm9kZUpTLlNpZ25hbHNbXSA9XG4gICAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBbJ1NJR0lOVCcsICdTSUdURVJNJ10gOiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXTtcbiAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICAgIGNvbnN0IHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBbc2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoc2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWxIYW5kbGVycy5jbGVhcigpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGNsZWFudXBTaWduYWxzKSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlU2lnbmFsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgc3RvcFByb2Nlc3MoKTtcbiAgICAgICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MubGlzdGVuZXJDb3VudChzaWduYWwpID09PSAwKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIgfCBudWxsLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgc3Rkb3V0UHJpbnRlci5mbHVzaCgpO1xuICAgICAgICBzdGRlcnJQcmludGVyLmZsdXNoKCk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcblxuZnVuY3Rpb24gY3JlYXRlUmVhbHRpbWVQcmludGVyKFxuICBzdHJlYW06IE5vZGVKUy5Xcml0ZVN0cmVhbSxcbiAgb21pdEJsYW5rTGluZXMgPSBmYWxzZVxuKTogeyB3cml0ZTogKGRhdGE6IHN0cmluZykgPT4gdm9pZDsgZmx1c2g6ICgpID0+IHZvaWQgfSB7XG4gIGlmICghb21pdEJsYW5rTGluZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGU6IChkYXRhKSA9PiBzdHJlYW0ud3JpdGUoZGF0YSksXG4gICAgICBmbHVzaDogKCkgPT4ge30sXG4gICAgfTtcbiAgfVxuXG4gIGxldCBwZW5kaW5nID0gJyc7XG4gIHJldHVybiB7XG4gICAgd3JpdGU6IChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nICs9IGRhdGE7XG4gICAgICBjb25zdCBsaW5lcyA9IHBlbmRpbmcuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgIHBlbmRpbmcgPSBsaW5lcy5wb3AoKSA/PyAnJztcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAoIWlzQmxhbmtMaW5lKGxpbmUpKSB7XG4gICAgICAgICAgc3RyZWFtLndyaXRlKGAke2xpbmV9XFxuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGZsdXNoOiAoKSA9PiB7XG4gICAgICBpZiAoIWlzQmxhbmtMaW5lKHBlbmRpbmcpKSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShwZW5kaW5nKTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmcgPSAnJztcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0JsYW5rTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxpbmUucmVwbGFjZUFsbChBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCwgJycpLnRyaW0oKS5sZW5ndGggPT09IDA7XG59XG4iLCJjb25zdCBib29sZWFuT3B0aW9uTmFtZXMgPSBuZXcgU2V0KFtcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnLFxuICAnY2FzY2FkZS1ub2RlLWVudicsXG4gICdkcnktcnVuJyxcbiAgJ2RyeScsXG4gICdkJyxcbiAgJ2hlbHAnLFxuICAnaCcsXG4gICdxdWlldC1lbnYnLFxuICAndmVyYm9zZScsXG4gICd2JyxcbiAgJ3ZlcnNpb24nLFxuXSk7XG5jb25zdCB2YWx1ZU9wdGlvbk5hbWVzID0gbmV3IFNldChbJ2Nhc2NhZGUtZW52JywgJ3dvcmtpbmctZGlyJywgJ3cnXSk7XG5jb25zdCBib3VuZGFyeU1hcmtlckVudk5hbWUgPSAnV0JfSU5URVJOQUxfUlVOX0JPVU5EQVJZX01BUktFUic7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm90ZWN0UnVuU2NyaXB0QXJncyhhcmd2KSB7XG4gIGNvbnN0IHJ1bkluZGV4ID0gZmluZFRvcExldmVsUnVuSW5kZXgoYXJndik7XG4gIGlmIChydW5JbmRleCA9PT0gLTEpIHJldHVybjtcblxuICBjb25zdCBzY3JpcHRJbmRleCA9IGZpbmRSdW5TY3JpcHRJbmRleChhcmd2LCBydW5JbmRleCArIDEpO1xuICBpZiAoc2NyaXB0SW5kZXggPT09IHVuZGVmaW5lZCB8fCBhcmd2W3NjcmlwdEluZGV4IC0gMV0gPT09ICctLScpIHJldHVybjtcblxuICBjb25zdCBleGlzdGluZ01hcmtlciA9IHByb2Nlc3MuZW52W2JvdW5kYXJ5TWFya2VyRW52TmFtZV07XG4gIGlmIChhcmd2W3NjcmlwdEluZGV4ICsgMV0gPT09ICctLScpIHtcbiAgICBpZiAoZXhpc3RpbmdNYXJrZXIgJiYgYXJndltzY3JpcHRJbmRleCArIDJdID09PSBleGlzdGluZ01hcmtlcikgcmV0dXJuO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudltib3VuZGFyeU1hcmtlckVudk5hbWVdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBtYXJrZXI7XG4gIGRvIG1hcmtlciA9IGBfX1dCX1JVTl9TQ1JJUFRfQVJHU18ke3JhbmRvbVVVSUQoKX1fX2A7XG4gIHdoaWxlIChhcmd2LmluY2x1ZGVzKG1hcmtlcikpO1xuICBwcm9jZXNzLmVudltib3VuZGFyeU1hcmtlckVudk5hbWVdID0gbWFya2VyO1xuICBhcmd2LnNwbGljZShzY3JpcHRJbmRleCArIDEsIDAsICctLScsIG1hcmtlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW5TY3JpcHRBcmdzKGFyZ3YpIHtcbiAgY29uc3QgcnVuSW5kZXggPSBmaW5kVG9wTGV2ZWxSdW5JbmRleChhcmd2KTtcbiAgaWYgKHJ1bkluZGV4ID09PSAtMSkgcmV0dXJuIFtdO1xuICBjb25zdCBzY3JpcHRJbmRleCA9IGZpbmRSdW5TY3JpcHRJbmRleChhcmd2LCBydW5JbmRleCArIDEpO1xuICBpZiAoc2NyaXB0SW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGFyZ3MgPSBhcmd2LnNsaWNlKHNjcmlwdEluZGV4KTtcbiAgY29uc3QgbWFya2VyID0gcHJvY2Vzcy5lbnZbYm91bmRhcnlNYXJrZXJFbnZOYW1lXTtcbiAgaWYgKG1hcmtlciAmJiBhcmdzWzFdID09PSAnLS0nICYmIGFyZ3NbMl0gPT09IG1hcmtlcikgYXJncy5zcGxpY2UoMSwgMik7XG4gIGRlbGV0ZSBwcm9jZXNzLmVudltib3VuZGFyeU1hcmtlckVudk5hbWVdO1xuICByZXR1cm4gYXJncztcbn1cblxuZnVuY3Rpb24gZmluZFRvcExldmVsUnVuSW5kZXgoYXJndikge1xuICBmb3IgKGxldCBpbmRleCA9IDI7IGluZGV4IDwgYXJndi5sZW5ndGg7ICkge1xuICAgIGNvbnN0IGNvbnN1bWVkID0gY291bnRPcHRpb25Ub2tlbnMoYXJndiwgaW5kZXgpO1xuICAgIGlmIChjb25zdW1lZCA9PT0gMCkgcmV0dXJuIGFyZ3ZbaW5kZXhdID09PSAncnVuJyA/IGluZGV4IDogLTE7XG4gICAgaW5kZXggKz0gY29uc3VtZWQ7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBmaW5kUnVuU2NyaXB0SW5kZXgoYXJndiwgc3RhcnRJbmRleCkge1xuICBmb3IgKGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7IGluZGV4IDwgYXJndi5sZW5ndGg7ICkge1xuICAgIGlmIChhcmd2W2luZGV4XSA9PT0gJy0tJykgcmV0dXJuIGFyZ3ZbaW5kZXggKyAxXSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogaW5kZXggKyAxO1xuICAgIGNvbnN0IGNvbnN1bWVkID0gY291bnRPcHRpb25Ub2tlbnMoYXJndiwgaW5kZXgpO1xuICAgIGlmIChjb25zdW1lZCA9PT0gMCkgcmV0dXJuIGluZGV4O1xuICAgIGluZGV4ICs9IGNvbnN1bWVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvdW50T3B0aW9uVG9rZW5zKGFyZ3YsIGluZGV4KSB7XG4gIGNvbnN0IGFyZyA9IGFyZ3ZbaW5kZXhdO1xuICBpZiAoIWFyZz8uc3RhcnRzV2l0aCgnLScpIHx8IGFyZyA9PT0gJy0nKSByZXR1cm4gMDtcbiAgaWYgKGFyZy5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgY29uc3Qgb3B0aW9uVGV4dCA9IGFyZy5zbGljZSgyKTtcbiAgICBjb25zdCBlcXVhbHNJbmRleCA9IG9wdGlvblRleHQuaW5kZXhPZignPScpO1xuICAgIGNvbnN0IHJhd05hbWUgPSBlcXVhbHNJbmRleCA9PT0gLTEgPyBvcHRpb25UZXh0IDogb3B0aW9uVGV4dC5zbGljZSgwLCBlcXVhbHNJbmRleCk7XG4gICAgY29uc3QgbmFtZSA9IHJhd05hbWUuc3RhcnRzV2l0aCgnbm8tJykgPyByYXdOYW1lLnNsaWNlKDMpIDogcmF3TmFtZTtcbiAgICBpZiAoYm9vbGVhbk9wdGlvbk5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIGVxdWFsc0luZGV4ID09PSAtMSAmJiBpc0Jvb2xlYW5MaXRlcmFsKGFyZ3ZbaW5kZXggKyAxXSkgPyAyIDogMTtcbiAgICB9XG4gICAgaWYgKCF2YWx1ZU9wdGlvbk5hbWVzLmhhcyhuYW1lKSkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGVxdWFsc0luZGV4ID09PSAtMSA/IDIgOiAxO1xuICB9XG5cbiAgY29uc3Qgc2hvcnRPcHRpb25zID0gYXJnLnNsaWNlKDEpO1xuICBpZiAoL15bZGh2XT0oZmFsc2V8dHJ1ZSkkLy50ZXN0KHNob3J0T3B0aW9ucykpIHJldHVybiAxO1xuICBpZiAoL15bZGh2XSQvLnRlc3Qoc2hvcnRPcHRpb25zKSAmJiBpc0Jvb2xlYW5MaXRlcmFsKGFyZ3ZbaW5kZXggKyAxXSkpIHJldHVybiAyO1xuICBmb3IgKGxldCBvcHRpb25JbmRleCA9IDA7IG9wdGlvbkluZGV4IDwgc2hvcnRPcHRpb25zLmxlbmd0aDsgb3B0aW9uSW5kZXgrKykge1xuICAgIGNvbnN0IG5hbWUgPSBzaG9ydE9wdGlvbnNbb3B0aW9uSW5kZXhdO1xuICAgIGlmIChib29sZWFuT3B0aW9uTmFtZXMuaGFzKG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAodmFsdWVPcHRpb25OYW1lcy5oYXMobmFtZSkpIHJldHVybiBvcHRpb25JbmRleCArIDEgPCBzaG9ydE9wdGlvbnMubGVuZ3RoID8gMSA6IDI7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbkxpdGVyYWwodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSAnZmFsc2UnIHx8IHZhbHVlID09PSAndHJ1ZSc7XG59XG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAgICogRm9yIGV4YW1wbGUsIGByZXRyeUNvdW50OiAzYCBydW5zIHRoZSBmdW5jdGlvbiBhdCBtb3N0IDMgdGltZXM6IDEgaW5pdGlhbCBhdHRlbXB0IGFuZCB1cCB0byAyIHJldHJpZXMuXG4gICAqL1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuKiBBIFNIQTMtNTEyIGltcGxlbWVudGF0aW9uIHNwZWNpYWxpemVkIGFuZCBvcHRpbWl6ZWQgZnJvbVxuKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfSAodmVyc2lvbiAwLjkuMykuXG4qXG4qIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXG4qIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDIzXG4qIEBsaWNlbnNlIE1JVFxuKi9cbmNvbnN0IGU9QXJyYXkuZnJvbSh7bGVuZ3RoOjI1Nn0sKGUsdCk9PnQudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsYDBgKSksdD1uZXcgSW50MzJBcnJheShbMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF0pLG49bmV3IEludDMyQXJyYXkoNTApLHI9bmV3IEludDMyQXJyYXkoMTgpLGk9bmV3IFRleHRFbmNvZGVyO2xldCBhPW5ldyBVaW50OEFycmF5KDQwOTYpLG89bmV3IFVpbnQzMkFycmF5KGEuYnVmZmVyKTtjb25zdCBlZT1uZXcgVWludDhBcnJheShuZXcgVWludDMyQXJyYXkoWzFdKS5idWZmZXIpWzBdPT09MTtmdW5jdGlvbiBzKHQpe2xldCBzPXQubGVuZ3RoKjMsbD1hLHU9bztpZihsLmxlbmd0aDxzKXtsZXQgZT1sLmxlbmd0aCoyO2Zvcig7ZTxzOyllKj0yO2w9bmV3IFVpbnQ4QXJyYXkoZSksdT1uZXcgVWludDMyQXJyYXkobC5idWZmZXIpLGU8PTEwNDg1NzYmJihhPWwsbz11KX1sZXQgZD1pLmVuY29kZUludG8odCxsKS53cml0dGVuLGY9bjtmLmZpbGwoMCk7bGV0IHA9MDtpZihlZSl7bGV0IGU9MDtmb3IoO2QtcD49NzI7KXtmb3IobGV0IHQ9MDt0PDE4O3QrKylmW3RdPWZbdF1edVtlK3RdO2MoZiksZSs9MTgscCs9NzJ9fWVsc2UgZm9yKDtkLXA+PTcyOyl7Zm9yKGxldCBlPTA7ZTwxODtlKyspe2xldCB0PXArKGU8PDIpO2ZbZV09ZltlXV4obFt0XXxsW3QrMV08PDh8bFt0KzJdPDwxNnxsW3QrM108PDI0KX1jKGYpLHArPTcyfWxldCBtPXI7bS5maWxsKDApO2ZvcihsZXQgZT1wO2U8ZDtlKyspe2xldCB0PWUtcDttW3Q+PjJdPW1bdD4+Ml18bFtlXTw8KCh0JjMpPDwzKX1sZXQgaD1kLXA7bVtoPj4yXT1tW2g+PjJdfDY8PCgoaCYzKTw8MyksbVsxN118PTIxNDc0ODM2NDg7Zm9yKGxldCBlPTA7ZTwxODtlKyspZltlXT1mW2VdXm1bZV07YyhmKTtsZXQgZz1gYDtmb3IobGV0IHQ9MDt0PDE2O3QrPTQpe2xldCBuPWZbdF0scj1mW3QrMV0saT1mW3QrMl0sYT1mW3QrM107Zys9ZVtuJjI1NV0rZVtuPj44JjI1NV0rZVtuPj4xNiYyNTVdK2Vbbj4+PjI0XStlW3ImMjU1XStlW3I+PjgmMjU1XStlW3I+PjE2JjI1NV0rZVtyPj4+MjRdK2VbaSYyNTVdK2VbaT4+OCYyNTVdK2VbaT4+MTYmMjU1XStlW2k+Pj4yNF0rZVthJjI1NV0rZVthPj44JjI1NV0rZVthPj4xNiYyNTVdK2VbYT4+PjI0XX1yZXR1cm4gZ31mdW5jdGlvbiBjKGUpe2xldCBuLHIsaSxhLG8sZWUscyxjLGwsdSxkLGYscCxtLGgsZyx0ZSxuZSxyZSxpZSxhZSxvZSxzZSxjZSxsZSx1ZSxkZSxmZSxwZSxtZSxoZSxnZSxfZSx2ZSx5ZSxiZSx4ZSxTZSxDZSx3ZSxUZSxFZSxEZSxPZSxrZSxBZSxqZSxNZSxOZSxQZSxGZSxJZSxMZSxSZSx6ZSxCZSxWZSxIZSxVZSxXZSxHZSxLZSxxZSxfPWVbMF0sdj1lWzFdLHk9ZVsyXSxKZT1lWzNdLGI9ZVs0XSx4PWVbNV0sUz1lWzZdLEM9ZVs3XSx3PWVbOF0sVD1lWzldLEU9ZVsxMF0sRD1lWzExXSxPPWVbMTJdLGs9ZVsxM10sQT1lWzE0XSxqPWVbMTVdLE09ZVsxNl0sTj1lWzE3XSxQPWVbMThdLEY9ZVsxOV0sST1lWzIwXSxMPWVbMjFdLFI9ZVsyMl0sej1lWzIzXSxCPWVbMjRdLFY9ZVsyNV0sSD1lWzI2XSxVPWVbMjddLFc9ZVsyOF0sRz1lWzI5XSxLPWVbMzBdLHE9ZVszMV0sSj1lWzMyXSxZPWVbMzNdLFg9ZVszNF0sWj1lWzM1XSxRPWVbMzZdLCQ9ZVszN10sWWU9ZVszOF0sWGU9ZVszOV0sWmU9ZVs0MF0sUWU9ZVs0MV0sJGU9ZVs0Ml0sZXQ9ZVs0M10sdHQ9ZVs0NF0sbnQ9ZVs0NV0scnQ9ZVs0Nl0saXQ9ZVs0N10sYXQ9ZVs0OF0sb3Q9ZVs0OV07Zm9yKGk9MDtpPDQ4O2krPTIpYT1fXkVeSV5LXlplLG89dl5EXkxecV5RZSxlZT15Xk9eUl5KXiRlLHM9SmVea156XlleZXQsYz1iXkFeQl5YXnR0LGw9eF5qXlZeWl5udCx1PVNeTV5IXlFecnQsZD1DXk5eVV4kXml0LGY9d15QXldeWWVeYXQscD1UXkZeR15YZV5vdCxuPWZeKGVlPDwxfHM+Pj4zMSkscj1wXihzPDwxfGVlPj4+MzEpLF9ePW4sdl49cixFXj1uLERePXIsSV49bixMXj1yLEtePW4scV49cixaZV49bixRZV49cixuPWFeKGM8PDF8bD4+PjMxKSxyPW9eKGw8PDF8Yz4+PjMxKSx5Xj1uLEplXj1yLE9ePW4sa149cixSXj1uLHpePXIsSl49bixZXj1yLCRlXj1uLGV0Xj1yLG49ZWVeKHU8PDF8ZD4+PjMxKSxyPXNeKGQ8PDF8dT4+PjMxKSxiXj1uLHhePXIsQV49bixqXj1yLEJePW4sVl49cixYXj1uLFpePXIsdHRePW4sbnRePXIsbj1jXihmPDwxfHA+Pj4zMSkscj1sXihwPDwxfGY+Pj4zMSksU149bixDXj1yLE1ePW4sTl49cixIXj1uLFVePXIsUV49biwkXj1yLHJ0Xj1uLGl0Xj1yLG49dV4oYTw8MXxvPj4+MzEpLHI9ZF4obzw8MXxhPj4+MzEpLHdePW4sVF49cixQXj1uLEZePXIsV149bixHXj1yLFllXj1uLFhlXj1yLGF0Xj1uLG90Xj1yLG09XyxoPXYsQWU9RDw8NHxFPj4+MjgsamU9RTw8NHxEPj4+MjgsZmU9STw8M3xMPj4+MjkscGU9TDw8M3xJPj4+MjksV2U9cTw8OXxLPj4+MjMsR2U9Szw8OXxxPj4+MjMsRWU9WmU8PDE4fFFlPj4+MTQsRGU9UWU8PDE4fFplPj4+MTQsdmU9eTw8MXxKZT4+PjMxLHllPUplPDwxfHk+Pj4zMSxnPWs8PDEyfE8+Pj4yMCx0ZT1PPDwxMnxrPj4+MjAsTWU9Ujw8MTB8ej4+PjIyLE5lPXo8PDEwfFI+Pj4yMixtZT1ZPDwxM3xKPj4+MTksaGU9Sjw8MTN8WT4+PjE5LEtlPSRlPDwyfGV0Pj4+MzAscWU9ZXQ8PDJ8JGU+Pj4zMCxSZT14PDwzMHxiPj4+Mix6ZT1iPDwzMHx4Pj4+MixiZT1BPDw2fGo+Pj4yNix4ZT1qPDw2fEE+Pj4yNixuZT1WPDwxMXxCPj4+MjEscmU9Qjw8MTF8Vj4+PjIxLFBlPVg8PDE1fFo+Pj4xNyxGZT1aPDwxNXxYPj4+MTcsZ2U9bnQ8PDI5fHR0Pj4+MyxfZT10dDw8Mjl8bnQ+Pj4zLGNlPVM8PDI4fEM+Pj40LGxlPUM8PDI4fFM+Pj40LEJlPU48PDIzfE0+Pj45LFZlPU08PDIzfE4+Pj45LFNlPUg8PDI1fFU+Pj43LENlPVU8PDI1fEg+Pj43LGllPVE8PDIxfCQ+Pj4xMSxhZT0kPDwyMXxRPj4+MTEsSWU9aXQ8PDI0fHJ0Pj4+OCxMZT1ydDw8MjR8aXQ+Pj44LE9lPXc8PDI3fFQ+Pj41LGtlPVQ8PDI3fHc+Pj41LHVlPVA8PDIwfEY+Pj4xMixkZT1GPDwyMHxQPj4+MTIsSGU9Rzw8N3xXPj4+MjUsVWU9Vzw8N3xHPj4+MjUsd2U9WWU8PDh8WGU+Pj4yNCxUZT1YZTw8OHxZZT4+PjI0LG9lPWF0PDwxNHxvdD4+PjE4LHNlPW90PDwxNHxhdD4+PjE4LF89bV5+ZyZuZSx2PWhefnRlJnJlLEU9Y2VefnVlJmZlLEQ9bGVefmRlJnBlLEk9dmVefmJlJlNlLEw9eWVefnhlJkNlLEs9T2VefkFlJk1lLHE9a2VefmplJk5lLFplPVJlXn5CZSZIZSxRZT16ZV5+VmUmVWUseT1nXn5uZSZpZSxKZT10ZV5+cmUmYWUsTz11ZV5+ZmUmbWUsaz1kZV5+cGUmaGUsUj1iZV5+U2Umd2Usej14ZV5+Q2UmVGUsSj1BZV5+TWUmUGUsWT1qZV5+TmUmRmUsJGU9QmVefkhlJldlLGV0PVZlXn5VZSZHZSxiPW5lXn5pZSZvZSx4PXJlXn5hZSZzZSxBPWZlXn5tZSZnZSxqPXBlXn5oZSZfZSxCPVNlXn53ZSZFZSxWPUNlXn5UZSZEZSxYPU1lXn5QZSZJZSxaPU5lXn5GZSZMZSx0dD1IZV5+V2UmS2UsbnQ9VWVefkdlJnFlLFM9aWVefm9lJm0sQz1hZV5+c2UmaCxNPW1lXn5nZSZjZSxOPWhlXn5fZSZsZSxIPXdlXn5FZSZ2ZSxVPVRlXn5EZSZ5ZSxRPVBlXn5JZSZPZSwkPUZlXn5MZSZrZSxydD1XZV5+S2UmUmUsaXQ9R2VefnFlJnplLHc9b2Vefm0mZyxUPXNlXn5oJnRlLFA9Z2VefmNlJnVlLEY9X2VefmxlJmRlLFc9RWVefnZlJmJlLEc9RGVefnllJnhlLFllPUllXn5PZSZBZSxYZT1MZV5+a2UmamUsYXQ9S2VeflJlJkJlLG90PXFlXn56ZSZWZSxfXj10W2ldLHZePXRbaSsxXTtlWzBdPV8sZVsxXT12LGVbMl09eSxlWzNdPUplLGVbNF09YixlWzVdPXgsZVs2XT1TLGVbN109QyxlWzhdPXcsZVs5XT1ULGVbMTBdPUUsZVsxMV09RCxlWzEyXT1PLGVbMTNdPWssZVsxNF09QSxlWzE1XT1qLGVbMTZdPU0sZVsxN109TixlWzE4XT1QLGVbMTldPUYsZVsyMF09SSxlWzIxXT1MLGVbMjJdPVIsZVsyM109eixlWzI0XT1CLGVbMjVdPVYsZVsyNl09SCxlWzI3XT1VLGVbMjhdPVcsZVsyOV09RyxlWzMwXT1LLGVbMzFdPXEsZVszMl09SixlWzMzXT1ZLGVbMzRdPVgsZVszNV09WixlWzM2XT1RLGVbMzddPSQsZVszOF09WWUsZVszOV09WGUsZVs0MF09WmUsZVs0MV09UWUsZVs0Ml09JGUsZVs0M109ZXQsZVs0NF09dHQsZVs0NV09bnQsZVs0Nl09cnQsZVs0N109aXQsZVs0OF09YXQsZVs0OV09b3R9ZXhwb3J0e3MgYXMgc2hhM181MTJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXAiLCJjb25zdCBlPXIoKSx0PW5ldyBUZXh0RW5jb2RlcixuPW5ldyBUZXh0RGVjb2RlcihgdXRmLThgKTtmdW5jdGlvbiByKCl7cmV0dXJuIG5ldyBNYXAoW3tpbnN0YW5jZTpFcnJvcixmcm9tOmU9PntsZXQgdD1bZS5uYW1lLGUubWVzc2FnZV07cmV0dXJuIGUuc3RhY2shPT12b2lkIDAmJnQucHVzaChlLnN0YWNrKSxlLmNhdXNlIT09dm9pZCAwJiYoZS5zdGFjaz09PXZvaWQgMCYmdC5wdXNoKHZvaWQgMCksdC5wdXNoKGUuY2F1c2UpKSx0fSxzdHViOigpPT5FcnJvcigpLGh5ZHJhdGU6KGUsW3QsbixyLGldKT0+e2UubmFtZT10LGUubWVzc2FnZT1uLHI9PT12b2lkIDA/ZGVsZXRlIGUuc3RhY2s6ZS5zdGFjaz1yLGkhPT12b2lkIDAmJihlLmNhdXNlPWkpfX0se2luc3RhbmNlOlVpbnQ4QXJyYXksZnJvbTplPT5bYnRvYShuLmRlY29kZShlKSldLGNyZWF0ZTooW2VdKT0+dC5lbmNvZGUoYXRvYihlKSl9LHtpbnN0YW5jZTpNYXAsZnJvbTplPT5bLi4uZS5lbnRyaWVzKCldLHN0dWI6KCk9Pm5ldyBNYXAsaHlkcmF0ZTooZSx0KT0+e2ZvcihsZXRbbixyXW9mIHQpZS5zZXQobixyKX19LHtpbnN0YW5jZTpTZXQsZnJvbTplPT5bLi4uZS52YWx1ZXMoKV0sc3R1YjooKT0+bmV3IFNldCxoeWRyYXRlOihlLHQpPT57Zm9yKGxldCBuIG9mIHQpZS5hZGQobil9fSx7aW5zdGFuY2U6RGF0ZSxmcm9tOmU9PltlLnRvSlNPTigpXSxjcmVhdGU6KFtlXSk9Pm5ldyBEYXRlKGUpfSx7aW5zdGFuY2U6UmVnRXhwLGZyb206KHtmbGFnczplLHNvdXJjZTp0fSk9PmU/W3QsZV06W3RdLGNyZWF0ZTooW2UsdF0pPT5uZXcgUmVnRXhwKGUsdCl9LHtpbnN0YW5jZTpVUkwsZnJvbTplPT5bZS5ocmVmXSxjcmVhdGU6KFtlXSk9Pm5ldyBVUkwoZSl9XS5tYXAoZT0+W2UuaW5zdGFuY2UubmFtZSxlXSkpfWV4cG9ydHtlIGFzIEdMT0JBTF9DT05TVFJVQ1RPUl9NQVB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RydWN0b3JzLmpzLm1hcCIsImltcG9ydHtHTE9CQUxfQ09OU1RSVUNUT1JfTUFQIGFzIGV9ZnJvbVwiLi9jb25zdHJ1Y3RvcnMuanNcIjtmdW5jdGlvbiB0KHQsbj1lKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkocih0LG4pKX1mdW5jdGlvbiBuKGUpe2lmKGU9PT12b2lkIDApcmV0dXJuLTE7aWYodHlwZW9mIGU9PWBudW1iZXJgKXtpZihOdW1iZXIuaXNOYU4oZSkpcmV0dXJuLTM7aWYoIU51bWJlci5pc0Zpbml0ZShlKSlyZXR1cm4gZTwwPy01Oi00fXJldHVybiBudWxsfWZ1bmN0aW9uIHIodCxyPWUpe2xldCBpPW4odCk7aWYoaSE9PW51bGwpcmV0dXJuIGk7bGV0IGE9W10sbz1uZXcgTWFwO3JldHVybiBzKHQpLGE7ZnVuY3Rpb24gcyhlKXtsZXQgdD1uKGUpO2lmKHQhPT1udWxsKXJldHVybiB0O2xldCBpPW8uZ2V0KGUpO2lmKGkhPT12b2lkIDApcmV0dXJuIGk7c3dpdGNoKGk9YS5sZW5ndGgsdHlwZW9mIGUpe2Nhc2VgbnVtYmVyYDpjYXNlYHN0cmluZ2A6Y2FzZWBib29sZWFuYDphW2ldPWUsby5zZXQoZSxpKTticmVhaztjYXNlYGJpZ2ludGA6YVtpXT1bLTYsZS50b1N0cmluZygxNildLG8uc2V0KGUsaSk7YnJlYWs7Y2FzZWBvYmplY3RgOmlmKGU9PT1udWxsKWFbaV09ZSxvLnNldChlLGkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7bGV0IHQ9ZS5sZW5ndGgsbj1BcnJheSh0KTthW2ldPW4sby5zZXQoZSxpKTtmb3IobGV0IHI9MDtyPHQ7cisrKW5bcl09cyhlW3JdKX1lbHNle2xldCB0PWUuY29uc3RydWN0b3Isbj10eXBlb2YgdD09YGZ1bmN0aW9uYD9yLmdldCh0Lm5hbWUpOnZvaWQgMDtpZihuPT09dm9pZCAwKXtsZXQgdD1PYmplY3Qua2V5cyhlKSxuPXQubGVuZ3RoLHI9QXJyYXkobituKzEpO3JbMF09YGAsYVtpXT1yLG8uc2V0KGUsaSk7Zm9yKGxldCBpPTA7aTxuO2krKyl7bGV0IG49dFtpXSxhPWkraTtyW2ErMV09cyhuKSxyW2ErMl09cyhlW25dKX19ZWxzZXtsZXQgcj1uLmZyb20oZSksYz1yLmxlbmd0aCxsPUFycmF5KGMrMSk7bFswXT10Lm5hbWUsYVtpXT1sLG8uc2V0KGUsaSk7Zm9yKGxldCBlPTA7ZTxjO2UrKylsW2UrMV09cyhyW2VdKX19fXJldHVybiBpfX1leHBvcnR7dCBhcyBzdHJpbmdpZnl9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5naWZ5LmpzLm1hcCIsImltcG9ydHtzaGEzXzUxMiBhcyBlfWZyb21cIi4vaGFzaC5qc1wiO2ltcG9ydHtzdHJpbmdpZnkgYXMgdH1mcm9tXCIuL29zb24vc3RyaW5naWZ5LmpzXCI7ZnVuY3Rpb24gbihuLHIpe3JldHVybiBlKHQoW24scl0pKX1mdW5jdGlvbiByKGUsbil7cmV0dXJuIHQoW2Usbl0pfWZ1bmN0aW9uIGkoKXtyZXR1cm5gYH1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbiBhcyBnZXRDYWNoZUtleU9mSGFzaCxyIGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXAiLCJpbXBvcnR7Z2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nIGFzIGUsZ2V0Q2FjaGVLZXlPZkhhc2ggYXMgdH1mcm9tXCIuL2dldENhY2hlS2V5LmpzXCI7Y29uc3Qgbj1pKHtnZXRDYWNoZUtleTp0fSkscj1pKHtnZXRDYWNoZUtleTplfSk7ZnVuY3Rpb24gaSh7Y2FjaGVEdXJhdGlvbjplPTEvMCxnZXRDYWNoZUtleTpuPXR9PXt9KXtyZXR1cm4gZnVuY3Rpb24odCxyKXtsZXQgaSxhLG87cmV0dXJuIHI/LmtpbmQ9PT1gZ2V0dGVyYD9mdW5jdGlvbigpe2xldCByPW4odGhpcyxbXSkscz1EYXRlLm5vdygpO3JldHVybihvIT09cnx8cy1hPmUpJiYobz1yLGk9dC5jYWxsKHRoaXMpLGE9cyksaX06ZnVuY3Rpb24oLi4ucyl7bGV0IGM9bih0aGlzLHMpLGw9RGF0ZS5ub3coKTtyZXR1cm4obyE9PWN8fGwtYT5lKSYmKG89YyxpPVJlZmxlY3QuYXBwbHkodCxyP3RoaXM6dm9pZCAwLHMpLGE9bCksaX19fWV4cG9ydHtuIGFzIG1lbW9pemVPbmUsaSBhcyBtZW1vaXplT25lRmFjdG9yeSxyIGFzIG1lbW9pemVPbmVXaXRoRW1wdHlIYXNofTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9pemVPbmUuanMubWFwIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBQcmVwZW5kIGV2ZXJ5IGV4aXN0aW5nIGBub2RlX21vZHVsZXMvLmJpbmAgZGlyZWN0b3J5IGZyb20gdGhlIGdpdmVuIGRpcmVjdG9yeSB1cCB0byB0aGVcbiAqIHJlcG9zaXRvcnkgcm9vdCAob3IgZmlsZXN5c3RlbSByb290KSB0byB0aGUgZW52aXJvbm1lbnQncyBQQVRILCBuZWFyZXN0IGRpcmVjdG9yeSBmaXJzdCBzb1xuICogYSB3b3Jrc3BhY2UtbG9jYWwgZGVwZW5kZW5jeSB3aW5zIG92ZXIgYSByZXBvc2l0b3J5LXJvb3Qgb25lLiBOZWVkZWQgd2hlcmV2ZXIgd2Igc3RyaXBzXG4gKiB5YXJuJ3MgdGVtcG9yYXJ5IGJpbiBmb2xkZXIgZnJvbSBQQVRIICh5YXJuIEJlcnJ5IGV4cG9zZXMgZGVwZW5kZW5jeSBleGVjdXRhYmxlcyBvbmx5XG4gKiB0aHJvdWdoIHRoYXQgZm9sZGVyLCBuZXZlciB0aHJvdWdoIGBub2RlX21vZHVsZXMvLmJpbmAgb24gUEFUSCksIHNvIHRoYXQgYmFyZSBiaW5hcnkgbmFtZXNcbiAqIGluIHdyYXBwZWQgY29tbWFuZHMga2VlcCByZXNvbHZpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGgoZGlyUGF0aDogc3RyaW5nLCBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBib29sZWFuIHtcbiAgY29uc3QgYmluUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXJyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICBiaW5QYXRocy5wdXNoKGJpblBhdGgpO1xuICAgIH1cblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gIH1cbiAgaWYgKGJpblBhdGhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBlbnYuUEFUSCA9IGVudi5QQVRIID8gYCR7YmluUGF0aHMuam9pbignOicpfToke2Vudi5QQVRIfWAgOiBiaW5QYXRocy5qb2luKCc6Jyk7XG4gIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVHJ1dGh5RW52VmFsdWUoY2lFbnYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEb2NrZXJFbmFibGVkKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+KTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1RydXRoeUVudlZhbHVlKHByb2plY3QuZW52LldCX0RPQ0tFUik7XG59XG5cbmZ1bmN0aW9uIGlzVHJ1dGh5RW52VmFsdWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISF2YWx1ZSAmJiB2YWx1ZSAhPT0gJzAnICYmIHZhbHVlICE9PSAnZmFsc2UnO1xufVxuIiwiLyoqXG4gKiBUaGUga2V5cyBhY3R1YWxseSBkZWNsYXJlZCBpbiB0aGUgcHJvamVjdCdzIGZub3ggc291cmNlcy4gYG1pc2UgZW52YCBpcyByZXBvcnRlZCBhcyBhXG4gKiBwc2V1ZG8tc291cmNlIHRoYXQgbWl4ZXMgaW4gaG9zdC90b29sIHZhcmlhYmxlcyAoUEFUSCwgQ0FSR09fSE9NRSwgUlVTVFVQXyosIC4uLik7IHRob3NlIG11c3RcbiAqIG5ldmVyIGJlIHRyZWF0ZWQgYXMgdGhlIHByb2plY3QncyBvd24gdmFyaWFibGVzLCBzbyB0aGV5IGFyZSBleGNsdWRlZCBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0Rm5veFNvdXJjZWRLZXlzKGVudlNvdXJjZXM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW3N0cmluZywgcmVhZG9ubHkgc3RyaW5nW11dPik6IFNldDxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBTZXQoZW52U291cmNlcy5maWx0ZXIoKFtzb3VyY2VdKSA9PiAhc291cmNlLnN0YXJ0c1dpdGgoJ21pc2UgZW52JykpLmZsYXRNYXAoKFssIGtleXNdKSA9PiBrZXlzKSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlc0J1blJ1bnRpbWUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIE1pcnJvcnMgUHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXI6IHRoZSBvdXRlcm1vc3QgcGFja2FnZU1hbmFnZXIgZGVjbGFyYXRpb24gKHRoZVxuICAvLyB3b3Jrc3BhY2Ugcm9vdCdzKSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgbmVzdGVkIG9uZXMsIGFuZCBhbiBleHBsaWNpdCBub24tQnVuIGRlY2xhcmF0aW9uXG4gIC8vIHdpbnMgb3ZlciB0aGUgZGlyZWN0b3J5IG1hcmtlcnMuIFRoZSB3YWxrIHRoZXJlZm9yZSBjb2xsZWN0cyBzaWduYWxzIHVwIHRvIHRoZSByZXBvc2l0b3J5XG4gIC8vIHJvb3QgaW5zdGVhZCBvZiBkZWNpZGluZyBhdCB0aGUgZmlyc3QgaGl0LCBzbyBhIGNoaWxkIHdvcmtzcGFjZSBjYW5ub3Qgb3ZlcnJpZGUgdGhlIHJvb3QuXG4gIGxldCBvdXRlcm1vc3RQYWNrYWdlTWFuYWdlcjogdW5rbm93bjtcbiAgbGV0IGhhc1NvbWVCdW5EaXJlY3RvcnlNYXJrZXIgPSBmYWxzZTtcbiAgZm9yIChsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7IDsgY3VycmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpKSB7XG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByZWFkUGFja2FnZU1hbmFnZXJGaWVsZChwYXRoLmpvaW4oY3VycmVudFBhdGgsICdwYWNrYWdlLmpzb24nKSk7XG4gICAgaWYgKHBhY2thZ2VNYW5hZ2VyICE9PSB1bmRlZmluZWQpIG91dGVybW9zdFBhY2thZ2VNYW5hZ2VyID0gcGFja2FnZU1hbmFnZXI7XG4gICAgaGFzU29tZUJ1bkRpcmVjdG9yeU1hcmtlciB8fD0gaGFzQnVuRGlyZWN0b3J5TWFya2VyKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpIHx8IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCkgPT09IGN1cnJlbnRQYXRoKSB7XG4gICAgICBpZiAoaXNFeHBsaWNpdE5vbkJ1blBhY2thZ2VNYW5hZ2VyKG91dGVybW9zdFBhY2thZ2VNYW5hZ2VyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGhhc1NvbWVCdW5EaXJlY3RvcnlNYXJrZXIgfHwgaXNCdW5QYWNrYWdlTWFuYWdlcihvdXRlcm1vc3RQYWNrYWdlTWFuYWdlcik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgZGlyZWN0b3J5IGNhcnJpZXMgYSBidW4gbWFya2VyOiBhIGJ1biBsb2NrZmlsZSwgYSBtaXNlLXBpbm5lZCBidW4sIG9yIGFcbiAqIGAudG9vbC12ZXJzaW9uc2AgYnVuIGVudHJ5LiB3YmZ5IG1pZ3JhdGVzIC50b29sLXZlcnNpb25zIGludG8gbWlzZS50b21sLCBzbyBhIG1pc2UtcGlubmVkIGJ1blxuICogbXVzdCBjb3VudCBhcyB3ZWxsOiByZXBvcyB0aGF0IGdpdGlnbm9yZSBidW4ubG9jayBhbmQgaGF2ZSBubyBwYWNrYWdlTWFuYWdlciBmaWVsZCByZWx5IG9uIHRoZVxuICogdG9vbCBtYW5pZmVzdC4gVGhpcyBpcyB0aGUgc2luZ2xlIHNpZ25hbCBsaXN0IGRlY2lkaW5nIGJ1bi12cy15YXJuOyBgUHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXJgXG4gKiBhbmQgYHVzZXNCdW5SdW50aW1lYCBzaGFyZSBpdCDigJQgYW5kIGJvdGggZ2l2ZSBhbiBleHBsaWNpdCBub24tQnVuIHBhY2thZ2VNYW5hZ2VyIGRlY2xhcmF0aW9uXG4gKiBwcmVjZWRlbmNlIG92ZXIgaXQgKHNlZSBpc0V4cGxpY2l0Tm9uQnVuUGFja2FnZU1hbmFnZXIpIOKAlCBzbyB0aGUgdHdvIGRldGVjdGlvbnMgY2Fubm90IGRyaWZ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQnVuRGlyZWN0b3J5TWFya2VyKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIFsnYnVuLmxvY2snLCAnYnVuLmxvY2tiJ10uc29tZSgoZmlsZU5hbWUpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSkpIHx8XG4gICAgWydtaXNlLnRvbWwnLCAnLm1pc2UudG9tbCddLnNvbWUoKGZpbGVOYW1lKSA9PlxuICAgICAgdGVzdEZpbGVDb250ZW50KHBhdGguam9pbihkaXJQYXRoLCBmaWxlTmFtZSksIC9eXFxzKig/OlwiYnVuXCJ8YnVuKVxccyo9L20pXG4gICAgKSB8fFxuICAgIHRlc3RGaWxlQ29udGVudChwYXRoLmpvaW4oZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksIC8oXnxcXG4pYnVuXFxzLylcbiAgKTtcbn1cblxuLyoqXG4gKiBBbiBleHBsaWNpdCBub24tQnVuIHBhY2thZ2VNYW5hZ2VyIGRlY2xhcmF0aW9uIChlLmcuIGB5YXJuQDQuMTcuMGApIG92ZXJyaWRlcyB0aGUgZGlyZWN0b3J5XG4gKiBtYXJrZXJzOiB5YXJuLWVyYSByZXBvc2l0b3JpZXMgbWF5IHBpbiBidW4gaW4gbWlzZS50b21sIHNvbGVseSBmb3IgYGJ1bnhgLWJhc2VkIGhlbHBlcnNcbiAqIChlLmcuIGB3YiByYWlsd2F5LWVudmApLCBhbmQgQnVuLW1hbmFnZWQgcmVwb3NpdG9yaWVzIG5ldmVyIGRlY2xhcmUgYSBub24tQnVuIHBhY2thZ2VNYW5hZ2VyXG4gKiAod2JmeSBkZWxldGVzIHRoZSBmaWVsZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0V4cGxpY2l0Tm9uQnVuUGFja2FnZU1hbmFnZXIocGFja2FnZU1hbmFnZXI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBwYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycgJiYgISFwYWNrYWdlTWFuYWdlci50cmltKCkgJiYgIWlzQnVuUGFja2FnZU1hbmFnZXIocGFja2FnZU1hbmFnZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCdW5QYWNrYWdlTWFuYWdlcihwYWNrYWdlTWFuYWdlcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJyAmJiBwYWNrYWdlTWFuYWdlci5zdGFydHNXaXRoKCdidW5AJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQYWNrYWdlTWFuYWdlckZpZWxkKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogdW5rbm93biB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgcGFja2FnZU1hbmFnZXI/OiB1bmtub3duIH0pLnBhY2thZ2VNYW5hZ2VyO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RGaWxlQ29udGVudChmaWxlUGF0aDogc3RyaW5nLCBwYXR0ZXJuOiBSZWdFeHApOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0dGVybi50ZXN0KGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IEFMTE9XRURfVEVTVF9ESVJFQ1RPUllfTkFNRVMgPSBuZXcgU2V0KFsndW5pdCcsICdlMmUnLCAnZGVidWcnLCAnaGVscGVycycsICdmaXh0dXJlcyddKTtcbmNvbnN0IFJVTk5BQkxFX1RFU1RfRElSRUNUT1JZX05BTUVTID0gbmV3IFNldChbJ3VuaXQnLCAnZTJlJywgJ2RlYnVnJ10pO1xuY29uc3QgVEVTVF9GSUxFX05BTUVfUkVHRVhQID0gL1xcLig/OnRlc3R8c3BlYylcXC5bY21dP1tqdF1zeD8kLztcblxuLyoqXG4gKiBFbmZvcmNlcyB0aGUgdGVzdC1sYXlvdXQgY29udmVudGlvbiB3aXRoIG5vIGZhbGxiYWNrOiBgdGVzdC9gIG1heSBjb250YWluIG9ubHkgdGhlIGB1bml0YCwgYGUyZWAsXG4gKiBgZGVidWdgLCBgaGVscGVyc2AsIGFuZCBgZml4dHVyZXNgIGRpcmVjdG9yaWVzLCBhbmQgdGVzdCBmaWxlcyBtYXkgZXhpc3Qgb25seSB1bmRlciBgdGVzdC91bml0L2AsXG4gKiBgdGVzdC9lMmUvYCwgYW5kIGB0ZXN0L2RlYnVnL2Ag4oCUIGFueXdoZXJlIGVsc2UgaW4gdGhlIHByb2plY3QgKGUuZy4gYHRlc3QvaGVscGVycy9gLCBgc3JjL2AsIG9yIHRoZVxuICogcHJvamVjdCByb290KSwgd2Igd291bGQgc2lsZW50bHkgc2tpcCB0aGVtLiBBIHByb2plY3QncyBvd24gUGxheXdyaWdodCBjb25maWcgYWxzbyByZXF1aXJlc1xuICogYHRlc3QvZTJlYCBmb3IgdGhlIHNhbWUgcmVhc29uLiBgdGVzdC9maXh0dXJlcy9gIGlzIGV4ZW1wdCBmcm9tIHRoZSB0ZXN0LWZpbGUgY2hlY2sgYmVjYXVzZVxuICogZml4dHVyZXMgbWF5IGNvbnRhaW4gdGVzdCBmaWxlcyBhcyBkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uJz4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRlc3REaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnKTtcbiAgY29uc3QgdmlvbGF0aW9ucyA9IFsuLi5maW5kRmlsZVN5c3RlbVZpb2xhdGlvbnMocHJvamVjdC5kaXJQYXRoKV07XG4gIC8vIE9ubHkgYSBwcm9qZWN0J3MgT1dOIFBsYXl3cmlnaHQgY29uZmlnIGNvdW50czogYSB3b3Jrc3BhY2Ugcm9vdCBsZWdpdGltYXRlbHkgc2hhcmVzIGEgcm9vdC1sZXZlbFxuICAvLyBwbGF5d3JpZ2h0LmNvbmZpZy50cyB3aGlsZSBrZWVwaW5nIGUyZSBzcGVjcyBpbiBhIHNpbmdsZSBhcHAgcGFja2FnZS4gQ2hlY2tlZCBvdXRzaWRlIHRoZVxuICAvLyBtZW1vaXplZCB3YWxrIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgY2FsbGVyLXN1cHBsaWVkIHBhY2thZ2VKc29uLCBub3Qgb25seSB0aGUgZGlyZWN0b3J5LlxuICBpZiAoXG4gICAgIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3BsYXl3cmlnaHQuY29uZmlnLnRzJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRlc3REaXJQYXRoLCAnZTJlJykpXG4gICkge1xuICAgIHZpb2xhdGlvbnMucHVzaCgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgfVxuICByZXR1cm4gdmlvbGF0aW9ucztcbn1cblxuLy8gVGhlIHJlY3Vyc2l2ZSB3YWxrIGlzIHRoZSBleHBlbnNpdmUgcGFydCBhbmQgcnVucyBmb3IgdGhlIHNhbWUgZGlyZWN0b3JpZXMgZnJvbSBib3RoIGB3YiBsaW50YFxuLy8gYW5kIGB3YiB0ZXN0YCB3aXRoaW4gb25lIGB3YiB2ZXJpZnlgLCBzbyBpdHMgcmVzdWx0IGlzIHNoYXJlZCBwZXIgcHJvamVjdCBkaXJlY3RvcnkuXG5jb25zdCBmaWxlU3lzdGVtVmlvbGF0aW9uc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJUZXN0U3RydWN0dXJlQ2FjaGUoKTogdm9pZCB7XG4gIGZpbGVTeXN0ZW1WaW9sYXRpb25zQ2FjaGUuY2xlYXIoKTtcbn1cblxuZnVuY3Rpb24gZmluZEZpbGVTeXN0ZW1WaW9sYXRpb25zKHByb2plY3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNhY2hlZFZpb2xhdGlvbnMgPSBmaWxlU3lzdGVtVmlvbGF0aW9uc0NhY2hlLmdldChwcm9qZWN0RGlyUGF0aCk7XG4gIGlmIChjYWNoZWRWaW9sYXRpb25zKSByZXR1cm4gY2FjaGVkVmlvbGF0aW9ucztcblxuICBjb25zdCB2aW9sYXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB0ZXN0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0RGlyUGF0aCwgJ3Rlc3QnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmModGVzdERpclBhdGgpKSB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBmcy5yZWFkZGlyU3luYyh0ZXN0RGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICAvLyBPUyBhbmQgZWRpdG9yIGFydGlmYWN0cyBzdWNoIGFzIC5EU19TdG9yZSBhcmUgZW52aXJvbm1lbnQgbm9pc2UsIG5vdCBsYXlvdXQgbWlzdGFrZXMuXG4gICAgICBpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKCcuJykpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpIHx8ICFBTExPV0VEX1RFU1RfRElSRUNUT1JZX05BTUVTLmhhcyhlbnRyeS5uYW1lKSkge1xuICAgICAgICB2aW9sYXRpb25zLnB1c2goYHRlc3QvJHtlbnRyeS5uYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb2xsZWN0U3RyYXlUZXN0RmlsZXMocHJvamVjdERpclBhdGgsICcnLCB2aW9sYXRpb25zKTtcbiAgLy8gQSB0ZXN0IGZpbGUgZGlyZWN0bHkgdW5kZXIgdGVzdC8gaXMgcmVwb3J0ZWQgYnkgYm90aCB0aGUgdG9wLWxldmVsIGNoZWNrIGFuZCB0aGUgc3RyYXktZmlsZSB3YWxrLlxuICBjb25zdCB1bmlxdWVWaW9sYXRpb25zID0gWy4uLm5ldyBTZXQodmlvbGF0aW9ucyldO1xuICBmaWxlU3lzdGVtVmlvbGF0aW9uc0NhY2hlLnNldChwcm9qZWN0RGlyUGF0aCwgdW5pcXVlVmlvbGF0aW9ucyk7XG4gIHJldHVybiB1bmlxdWVWaW9sYXRpb25zO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0U3RyYXlUZXN0RmlsZXMocHJvamVjdERpclBhdGg6IHN0cmluZywgcmVsYXRpdmVEaXJQYXRoOiBzdHJpbmcsIHZpb2xhdGlvbnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZnMucmVhZGRpclN5bmMocGF0aC5qb2luKHByb2plY3REaXJQYXRoLCByZWxhdGl2ZURpclBhdGgpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAvLyBIaWRkZW4gZW50cmllcyAoLmdpdCwgLnRtcCwgLm5leHQsIC4uLikgYW5kIGRlcGVuZGVuY2llcyBhcmUgbm90IHByb2plY3QtYXV0aG9yZWQgdGVzdCBsb2NhdGlvbnM6XG4gICAgLy8gdGhlIGNvbnZlbnRpb24gcGxhY2VzIHRlc3RzIG9ubHkgdW5kZXIgdGVzdC8sIHNvIGEgdGVzdCBmaWxlIGluIGEgaGlkZGVuIGRpcmVjdG9yeSAoZS5nLlxuICAgIC8vIC5zdG9yeWJvb2spIGlzIG91dHNpZGUgdGhlIGlucHV0IGNvbnRyYWN0LCBhbmQgZW51bWVyYXRpbmcgZW52aXJvbm1lbnRhbCBoaWRkZW4gZGlyZWN0b3JpZXNcbiAgICAvLyBpbnN0ZWFkIHdvdWxkIGZhbHNlLXBvc2l0aXZlIG9uIGFueSB1bmxpc3RlZCBnZW5lcmF0ZWQgb25lICgudHVyYm8sIC53cmFuZ2xlciwgLi4uKS4gVmlzaWJsZVxuICAgIC8vIGJ1aWxkIG91dHB1dHMgc3VjaCBhcyBkaXN0LyBhcmUgZGVsaWJlcmF0ZWx5IE5PVCBza2lwcGVkOiB3YmZ5LW1hbmFnZWQgYnVpbGRzIG5ldmVyIGVtaXRcbiAgICAvLyB0ZXN0LXBhdHRlcm4gZmlsZXMgdGhlcmUsIHNvIGFueSBtYXRjaCBpcyBhbiBhdXRob3JlZCBmaWxlIHdvcnRoIGZsYWdnaW5nLlxuICAgIC8vIFN5bWxpbmtzIGZhaWwgYGlzRGlyZWN0b3J5KClgIG9uIGEgRGlyZW50LCBzbyBjeWNsZXMgYXJlIGltcG9zc2libGUuXG4gICAgaWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnLicpIHx8IGVudHJ5Lm5hbWUgPT09ICdub2RlX21vZHVsZXMnKSBjb250aW51ZTtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZURpclBhdGggPyBgJHtyZWxhdGl2ZURpclBhdGh9LyR7ZW50cnkubmFtZX1gIDogZW50cnkubmFtZTtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgLy8gdGVzdC91bml0LCB0ZXN0L2UyZSwgYW5kIHRlc3QvZGVidWcgaG9sZCB0aGUgcnVubmFibGUgdGVzdHM7IHRlc3QvZml4dHVyZXMgbWF5IGNvbnRhaW5cbiAgICAgIC8vIHRlc3QgZmlsZXMgYXMgZGF0YS5cbiAgICAgIGlmIChyZWxhdGl2ZURpclBhdGggPT09ICd0ZXN0JyAmJiAoUlVOTkFCTEVfVEVTVF9ESVJFQ1RPUllfTkFNRVMuaGFzKGVudHJ5Lm5hbWUpIHx8IGVudHJ5Lm5hbWUgPT09ICdmaXh0dXJlcycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQSBuZXN0ZWQgcGFja2FnZSAoZS5nLiBhIHdvcmtzcGFjZSBtZW1iZXIpIGlzIHZhbGlkYXRlZCBhcyBpdHMgb3duIHByb2plY3QuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdERpclBhdGgsIHJlbGF0aXZlUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG4gICAgICBjb2xsZWN0U3RyYXlUZXN0RmlsZXMocHJvamVjdERpclBhdGgsIHJlbGF0aXZlUGF0aCwgdmlvbGF0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChURVNUX0ZJTEVfTkFNRV9SRUdFWFAudGVzdChlbnRyeS5uYW1lKSkge1xuICAgICAgdmlvbGF0aW9ucy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3ROYW1lOiBzdHJpbmcsIHZpb2xhdGlvbnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgY2hhbGsucmVkKFxuICAgICAgYEludmFsaWQgdGVzdCBsYXlvdXQgaW4gJHtwcm9qZWN0TmFtZX0uIHRlc3QvIG1heSBjb250YWluIG9ubHkgdGhlIHVuaXQsIGUyZSwgZGVidWcsIGhlbHBlcnMsIGFuZCBmaXh0dXJlcyBkaXJlY3RvcmllcywgdGVzdCBmaWxlcyBtYXkgZXhpc3Qgb25seSB1bmRlciB0ZXN0L3VuaXQvLCB0ZXN0L2UyZS8sIGFuZCB0ZXN0L2RlYnVnLywgYW5kIGEgUGxheXdyaWdodCBjb25maWcgcmVxdWlyZXMgdGVzdC9lMmUvOlxcbmAgK1xuICAgICAgICB2aW9sYXRpb25zLm1hcCgodmlvbGF0aW9uKSA9PiBgICAke3Zpb2xhdGlvbn1gKS5qb2luKCdcXG4nKVxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXBvcnRzIGV2ZXJ5IHByb2plY3QncyBsYXlvdXQgdmlvbGF0aW9ucyBhbmQgdGVsbHMgdGhlIGNhbGxlciB3aGV0aGVyIGFueSBwcm9qZWN0IHZpb2xhdGVkIHRoZVxuICogY29udmVudGlvbiwgc28gYSBzaW5nbGUgcnVuIHN1cmZhY2VzIGFsbCBvZiB0aGVtIGluc3RlYWQgb2Ygb25seSB0aGUgZmlyc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyhwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAnbmFtZScgfCAncGFja2FnZUpzb24nPltdKTogYm9vbGVhbiB7XG4gIGxldCB2aW9sYXRlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zdCB2aW9sYXRpb25zID0gZmluZFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QpO1xuICAgIGlmICh2aW9sYXRpb25zLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICBwcmludFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QubmFtZSwgdmlvbGF0aW9ucyk7XG4gICAgdmlvbGF0ZWQgPSB0cnVlO1xuICB9XG4gIHJldHVybiB2aW9sYXRlZDtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgb3B0aW9uTmFtZSBvZiBPYmplY3Qua2V5cyh5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52KSkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0T3B0aW9uVmFsdWUoYXJndiwgb3B0aW9uTmFtZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBhcmdzLnB1c2godmFsdWUgPyBgLS0ke29wdGlvbk5hbWV9YCA6IGAtLSR7b3B0aW9uTmFtZX09ZmFsc2VgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke3ZhbHVlfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7aXRlbX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIChhcmd2IGFzIEVudlJlYWRlck9wdGlvbnMgJiB7IHNpbGVudD86IGJvb2xlYW4gfSkuc2lsZW50ID09PSB0cnVlICYmXG4gICAgZ2V0T3B0aW9uVmFsdWUoYXJndiwgJ3F1aWV0LWVudicpID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgYXJncy5wdXNoKCctLXF1aWV0LWVudicpO1xuICB9XG4gIHJldHVybiBhcmdzO1xufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25WYWx1ZShhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcHRpb25OYW1lOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgY2FtZWxDYXNlT3B0aW9uTmFtZSA9IG9wdGlvbk5hbWUucmVwbGFjZUFsbCgvLShbYS16XSkvZywgKF8sIGNoYXJhY3Rlcjogc3RyaW5nKSA9PiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKSk7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcmd2IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9uc1tvcHRpb25OYW1lXSA/PyBvcHRpb25zW2NhbWVsQ2FzZU9wdGlvbk5hbWVdO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnKSkuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bmFtZX09JHtzaGVsbEVzY2FwZUFyZ3VtZW50KHZhbHVlKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hlbGxFc2NhcGVBcmd1bWVudChhcmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXltcXHcuLzo9LEAlKy1dKyQvdS50ZXN0KGFyZykgPyBhcmcgOiBgJyR7YXJnLnJlcGxhY2VBbGwoXCInXCIsIGAnXCInXCInYCl9J2A7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4vc2hlbGwuanMnO1xuXG5jb25zdCB3cmFuZ2xlckNvbmZpZ0ZpbGVOYW1lcyA9IFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbicsICd3cmFuZ2xlci50b21sJ107XG5cbi8qKlxuICogQnVpbGQgYSBjb21tYW5kIGdlbmVyYXRpbmcgYSAuZGV2LnZhcnMgZmlsZSAodmlhIGB3YiBnZW4tZGV2LXZhcnNgKSBzbyB0aGF0XG4gKiBgd3JhbmdsZXIgZGV2YCBjYW4gc2VlIHRoZSB3Yi1tYW5hZ2VkIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndjogU2NyaXB0QXJndiwgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICd3YicsICdnZW4tZGV2LXZhcnMnLCAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksIG91dHB1dFBhdGhdKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGB3cmFuZ2xlciBkZXZgLXN0eWxlIGNvbW1hbmQuIGBlbnYgLXUgQ0xPVURGTEFSRV9FTlZgIG1ha2VzIHdyYW5nbGVyIHNlcnZlIHRoZSB0b3AtbGV2ZWxcbiAqIChub24tZGVwbG95KSBjb25maWcuIHdyYW5nbGVyIChsaWtlIHZpbmV4dCkgcmVxdWlyZXMgcmVhbCBOb2RlLmpzIOKAlCBgYnVuIHJ1bmAgcmVzcGVjdHMgdGhlIGJpbidzXG4gKiBub2RlIHNoZWJhbmcsIGFuZCB3YiBuZXZlciBjb21wb3NlcyBgLS1idW5gICh3aG9zZSBub2RlLT5idW4gUEFUSCBzaGltIGJyZWFrcyBib3RoIHRvb2xzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kKGFyZ3M6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgZW52IC11IENMT1VERkxBUkVfRU5WIFlBUk4gd3JhbmdsZXIgJHthcmdzfWAudHJpbSgpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgY29tbWFuZCBhcHBseWluZyB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyB0byB0aGUgbG9jYWwgZGF0YWJhc2UsIG9yIHVuZGVmaW5lZFxuICogaWYgdGhlIHByb2plY3QgaGFzIG5vIEQxIGRhdGFiYXNlIG9yIG5vIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIGRpcmVjdG9yeS5cbiAqIENJPXRydWUgc3VwcHJlc3NlcyB3cmFuZ2xlcidzIGludGVyYWN0aXZlIGNvbmZpcm1hdGlvbiBwcm9tcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdlbnYnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICBpZiAoIWRhdGFiYXNlTmFtZSB8fCAhZmluZEQxTWlncmF0aW9uc0RpclBhdGgocHJvamVjdCkpIHJldHVybjtcblxuICByZXR1cm4gYENJPXRydWUgWUFSTiB3cmFuZ2xlciBkMSBtaWdyYXRpb25zIGFwcGx5ICR7ZGF0YWJhc2VOYW1lfSAtLWxvY2FsIC0tcGVyc2lzdC10byBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiYDtcbn1cblxuLyoqXG4gKiBQcmVmaXggdGhlIGdpdmVuIHNjcmlwdCB3aXRoIGNvbW1hbmRzIGV4cG9ydGluZyBEQVRBQkFTRV9VUkwgcG9pbnRpbmcgdG8gdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZSxcbiAqIHNvIHRoYXQgZHJpenpsZS1raXQgYW5kIHNlZWQgc2NyaXB0cyBjYW4gb3BlcmF0ZSBvbiB0aGUgc2FtZSBkYXRhYmFzZSBhcyB0aGUgYXBwLlxuICogRG8gbm90aGluZyBpZiB0aGUgcHJvamVjdCBoYXMgbm8gRDEgZGF0YWJhc2UgaW4gaXRzIHdyYW5nbGVyIGNvbmZpZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ2Vudic+LCBzY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICBpZiAoIWRhdGFiYXNlTmFtZSkgcmV0dXJuIHNjcmlwdDtcblxuICAvLyBFeGNsdWRpbmcgbWluaWZsYXJlJ3MgbWV0YWRhdGEuc3FsaXRlLCB3aGljaCBsaXZlcyBuZXh0IHRvIHRoZSBoYXNoLW5hbWVkIGRhdGFiYXNlIGZpbGUuXG4gIC8vIEFuIHVubWF0Y2hlZCBnbG9iIGNhbm5vdCBoYXBwZW4gaGVyZTogdGhlIHNjcmlwdCBydW5zIHVuZGVyIC9iaW4vc2ggKHZpYSBOb2RlJ3MgYHNoZWxsOiB0cnVlYCksXG4gIC8vIGFuZCB0aGUgcHJlY2VkaW5nIG1hdGVyaWFsaXphdGlvbiBjb21tYW5kIGd1YXJhbnRlZXMgdGhlIFNRTGl0ZSBmaWxlIGV4aXN0cy5cbiAgLy8gUHJvamVjdHMgd2l0aCBtdWx0aXBsZSBEMSBkYXRhYmFzZXMgYXJlIG5vdCBzdXBwb3J0ZWQ6IHRoZSBoYXNoLW5hbWVkIGZpbGVzIGNhbm5vdCBiZVxuICAvLyBkaXN0aW5ndWlzaGVkIGNoZWFwbHkgKG1hdGVyaWFsaXphdGlvbiBkb2VzIG5vdCBldmVuIHVwZGF0ZSB0aGUgdGFyZ2V0IGZpbGUncyBtdGltZSkuXG4gIC8vIFRoZSBzdGF0ZSBkaXJlY3RvcnkgbXVzdCBiZSBhYnNvbHV0ZSBiZWNhdXNlIHRoZSB3cmFwcGVkIHNjcmlwdCBtYXkgYGNkYCB0byB0aGUgbW9ub3JlcG8gcm9vdC5cbiAgY29uc3Qgc3RhdGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpKTtcbiAgY29uc3QgZXhwb3J0Q29tbWFuZCA9IGBleHBvcnQgREFUQUJBU0VfVVJMPVwiZmlsZTokKGxzIFwiJHtzdGF0ZURpclBhdGh9XCIvdjMvZDEvbWluaWZsYXJlLUQxRGF0YWJhc2VPYmplY3QvKi5zcWxpdGUgfCBncmVwIC12IG1ldGFkYXRhIHwgaGVhZCAtMSlcImA7XG4gIHJldHVybiBgJHtidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdCwgZGF0YWJhc2VOYW1lKX0gJiYgJHtleHBvcnRDb21tYW5kfSAmJiAke3NjcmlwdH1gO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgRDEgZGF0YWJhc2UgZGVjbGFyZWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZyBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuO1xuXG4gIHJldHVybiBzY2FuV3JhbmdsZXJDb25maWdWYWx1ZShjb25maWdQYXRoLCAnZGF0YWJhc2VfbmFtZScpO1xufVxuXG4vLyBMb29rZWQgdXAgZnJvbSBtYW55IGNhbGwgc2l0ZXMgKGZyYW1ld29yayBkZXRlY3Rpb24sIHdvcmtlci10eXBlcyBnZW5lcmF0aW9uLCBkZXBsb3ksIHRlc3QpLCBzb1xuLy8gdGhlIGV4aXN0ZW5jZSBwcm9iZXMgYXJlIHNoYXJlZC4gS2V5ZWQgb24gdGhlIHByb2plY3QgT0JKRUNUIChub3QgaXRzIGRpcmVjdG9yeSBwYXRoKTogdGhlIHNhbWVcbi8vIHNoYXJlZCBQcm9qZWN0IGluc3RhbmNlIGZsb3dzIHRocm91Z2ggZXZlcnkgY2FsbCBzaXRlIHdpdGhpbiBvbmUgaW52b2NhdGlvbiwgd2hpbGUgY2FsbGVycyB0aGF0XG4vLyByZXdyaXRlIGNvbmZpZ3MgYW5kIHBhc3MgZnJlc2ggcGFydGlhbCBvYmplY3RzIG11c3Qgb2JzZXJ2ZSB0aGUgY3VycmVudCBkaXNrIHN0YXRlLlxuY29uc3Qgd3JhbmdsZXJDb25maWdQYXRoQ2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIHsgY29uZmlnUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkIH0+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIFRlc3RzIG1heSBwYXNzIHBhcnRpYWwgUHJvamVjdCBvYmplY3RzIHdpdGhvdXQgZGlyUGF0aC5cbiAgaWYgKCFwcm9qZWN0LmRpclBhdGgpIHJldHVybjtcbiAgY29uc3QgY2FjaGVkID0gd3JhbmdsZXJDb25maWdQYXRoQ2FjaGUuZ2V0KHByb2plY3QpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkLmNvbmZpZ1BhdGg7XG5cbiAgY29uc3QgY29uZmlnUGF0aCA9IHdyYW5nbGVyQ29uZmlnRmlsZU5hbWVzXG4gICAgLm1hcCgoZmlsZU5hbWUpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGZpbGVOYW1lKSlcbiAgICAuZmluZCgoZmlsZVBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKTtcbiAgd3JhbmdsZXJDb25maWdQYXRoQ2FjaGUuc2V0KHByb2plY3QsIHsgY29uZmlnUGF0aCB9KTtcbiAgcmV0dXJuIGNvbmZpZ1BhdGg7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIG9mIHRoZSB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyBkaXJlY3RvcnkgKGBtaWdyYXRpb25zX2RpcmAgaW4gdGhlIHdyYW5nbGVyXG4gKiBjb25maWcsIGRlZmF1bHRpbmcgdG8gYG1pZ3JhdGlvbnNgKSBpZiBpdCBleGlzdHMgb24gZGlzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmREMU1pZ3JhdGlvbnNEaXJQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcblxuICBjb25zdCBtaWdyYXRpb25zRGlyUGF0aCA9IHBhdGguam9pbihcbiAgICBwcm9qZWN0LmRpclBhdGgsXG4gICAgc2NhbldyYW5nbGVyQ29uZmlnVmFsdWUoY29uZmlnUGF0aCwgJ21pZ3JhdGlvbnNfZGlyJykgPz8gJ21pZ3JhdGlvbnMnXG4gICk7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKSA/IG1pZ3JhdGlvbnNEaXJQYXRoIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBmaXJzdCB2YWx1ZSBkZWNsYXJlZCBmb3IgdGhlIGtleSBpbiB0aGUgd3JhbmdsZXIgY29uZmlnLCBjb3ZlcmluZyBKU09OKEMpXG4gKiAoYFwia2V5XCI6IFwiLi4uXCJgKSBhbmQgVE9NTCwgaW5jbHVkaW5nIGl0cyBpbmxpbmUtdGFibGUgZm9ybSAoYGQxX2RhdGFiYXNlcyA9IFt7IC4uLiwga2V5ID0gXCIuLi5cIiB9XWApLFxuICogd2l0aG91dCBmdWxsIHBhcnNlcnMuIENvbW1lbnRlZC1vdXQgbGluZXMgYXJlIHNraXBwZWQgc28gdGhhdCB0aGV5IGNhbm5vdCBzaGFkb3cgdGhlIGFjdGl2ZVxuICogdmFsdWUsIGFuZCB0aGUga2V5IG11c3QgZm9sbG93IGEgbGluZSBzdGFydCwgYHtgIG9yIGAsYCBzbyB0aGF0IHByb3NlIG1lbnRpb25pbmcgaXQgY2Fubm90IG1hdGNoLlxuICovXG5mdW5jdGlvbiBzY2FuV3JhbmdsZXJDb25maWdWYWx1ZShjb25maWdQYXRoOiBzdHJpbmcsIGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga2V5VmFsdWVQYXR0ZXJuID0gbmV3IFJlZ0V4cChgKD86XnxbLHtdKVxcXFxzKltcIiddPyR7a2V5fVtcIiddP1xcXFxzKls6PV1cXFxccypbXCInXShbXlwiJ10rKVtcIiddYCwgJ3UnKTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmICgvXlxccyooPzojfFxcL1xcLykvdS50ZXN0KGxpbmUpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IG1hdGNoID0ga2V5VmFsdWVQYXR0ZXJuLmV4ZWMobGluZSk7XG4gICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV07XG4gIH1cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgY29tbWFuZCBtYXRlcmlhbGl6aW5nIHRoZSBsb2NhbCBtaW5pZmxhcmUgRDEgU1FMaXRlIGZpbGUuXG4gKiBBIG5vLW9wIHF1ZXJ5IGZvcmNlcyBtaW5pZmxhcmUgdG8gY3JlYXRlIHRoZSBTUUxpdGUgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldC5cbiAqIE9ubHkgc3Rkb3V0IGlzIHN1cHByZXNzZWQ7IHdyYW5nbGVyIHJlcG9ydHMgZXJyb3JzIG9uIHN0ZGVyciwgd2hpY2ggbXVzdCBzdGF5IHZpc2libGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4sIGRhdGFiYXNlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBZQVJOIHdyYW5nbGVyIGQxIGV4ZWN1dGUgJHtkYXRhYmFzZU5hbWV9IC0tbG9jYWwgLS1wZXJzaXN0LXRvIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCIgLS1jb21tYW5kIFwiU0VMRUNUIDFcIiA+IC9kZXYvbnVsbGA7XG59XG5cbi8qKlxuICogR2V0IHRoZSBsb2NhbCB3cmFuZ2xlci9taW5pZmxhcmUgc3RhdGUgZGlyZWN0b3J5LlxuICogRGV2ZWxvcG1lbnQgZm9sbG93cyB3cmFuZ2xlcidzIGRlZmF1bHQgZGlyZWN0b3J5IHNvIHRoYXQgcGxhaW4gYHdyYW5nbGVyIGRldmAgLyBgdmluZXh0IGRldmBcbiAqICh3aXRob3V0IGEgcGVyc2lzdC1wYXRoIG92ZXJyaWRlKSBzaGFyZXMgdGhlIHNhbWUgZGF0YWJhc2UgYXMgd2ItbWFuYWdlZCBkYiBjb21tYW5kcy5cbiAqIE90aGVyIGVudmlyb25tZW50cyAoZS5nLiB0ZXN0KSBnZXQgdGhlaXIgb3duIGRpcmVjdG9yeSBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlc2V0XG4gKiB3aXRob3V0IGRlc3Ryb3lpbmcgZGV2ZWxvcG1lbnQgc3RhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4pOiBzdHJpbmcge1xuICAvLyBEZXN0cnVjdGl2ZSB0ZXN0IHJlc2V0cyBhcmUgZ2F0ZWQgb24gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSwgd2hpY2ggYWNjZXB0c1xuICAvLyBlaXRoZXIgV0JfRU5WIG9yIE1JU0VfRU5WOyByZXNvbHZlIHRvIHRoZSB0ZXN0IGRpcmVjdG9yeSB3aGVuZXZlciBlaXRoZXIgc2F5cyAndGVzdCcgc29cbiAgLy8gdGhhdCBzdWNoIHJlc2V0cyBjYW4gbmV2ZXIgdGFyZ2V0IHRoZSBkZXZlbG9wbWVudCBzdGF0ZS5cbiAgY29uc3Qgd2JFbnYgPSBbcHJvamVjdC5lbnYuV0JfRU5WLCBwcm9qZWN0LmVudi5NSVNFX0VOVl0uaW5jbHVkZXMoJ3Rlc3QnKVxuICAgID8gJ3Rlc3QnXG4gICAgOiBwcm9qZWN0LmVudi5XQl9FTlYgfHwgcHJvamVjdC5lbnYuTUlTRV9FTlY7XG4gIHJldHVybiAhd2JFbnYgfHwgd2JFbnYgPT09ICdkZXZlbG9wbWVudCcgPyAnLndyYW5nbGVyL3N0YXRlJyA6IGAud3JhbmdsZXIvc3RhdGUtJHt3YkVudn1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHtcbiAgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuLFxuICByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsXG4gIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLFxuICByZXNvbHZlRmFsbGJhY2tXYkVudixcbiAgc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZU9uZSB9IGZyb20gJ2F0LWRlY29yYXRvcnMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoIH0gZnJvbSAnLi91dGlscy9iaW5QYXRoLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuL3V0aWxzL2NpLmpzJztcbmltcG9ydCB7IHNlbGVjdEZub3hTb3VyY2VkS2V5cyB9IGZyb20gJy4vdXRpbHMvZW52U291cmNlcy5qcyc7XG5pbXBvcnQgeyBoYXNCdW5EaXJlY3RvcnlNYXJrZXIsIGlzQnVuUGFja2FnZU1hbmFnZXIsIGlzRXhwbGljaXROb25CdW5QYWNrYWdlTWFuYWdlciB9IGZyb20gJy4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgeyBjbGVhclRlc3RTdHJ1Y3R1cmVDYWNoZSB9IGZyb20gJy4vdXRpbHMvdGVzdFN0cnVjdHVyZS5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi91dGlscy93cmFuZ2xlci5qcyc7XG5cbi8qKiBUaGUgZmlsZSBgd3JhbmdsZXIgdHlwZXNgIHdyaXRlcyBieSBkZWZhdWx0LiAqL1xuY29uc3QgV09SS0VSX1RZUEVTX0ZJTEVfTkFNRSA9ICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJztcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcm0gPSAncHJpc21hJyB8ICdkcml6emxlJztcblxuZXhwb3J0IGNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudXNlc0J1blBhY2thZ2VNYW5hZ2VyO1xuICB9XG5cbiAgLy8gVGhlIHBhY2thZ2UgbWFuYWdlciBtdXN0IGZvbGxvdyB0aGUgdGFyZ2V0IHByb2plY3QsIG5vdCB0aGUgcnVudGltZSB0aGF0IGxhdW5jaGVkIHdiOlxuICAvLyBgbm9kZSB3YiAuLi5gIGFnYWluc3QgYSBCdW4gcmVwbyBtdXN0IHN0aWxsIHJ1biBgYnVuIGluc3RhbGxgLCBhbmQgdmljZSB2ZXJzYS5cbiAgZ2V0IHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCgpOiAnYnVuJyB8ICd5YXJuJyB7XG4gICAgcmV0dXJuIHRoaXMuaXNCdW5BdmFpbGFibGUgPyAnYnVuJyA6ICd5YXJuJztcbiAgfVxuXG4gIGdldCBwYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmQoKTogJ2J1biBydW4nIHwgJ3lhcm4nIHtcbiAgICByZXR1cm4gdGhpcy5pc0J1bkF2YWlsYWJsZSA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgfVxuXG4gIC8vIEEgc2luZ2xlIHNpZ25hbCBkZWNpZGVzIGV2ZXJ5IGJ1bi12cy15YXJuIGJyYW5jaCBpbiB3YiAoc2NyaXB0IG5vcm1hbGl6YXRpb24gaW5jbHVkZWQpOlxuICAvLyBzcGxpdHRpbmcgdGhlIHRvb2wtbWFuaWZlc3Qgc2lnbmFsIGZyb20gdGhlIGxvY2tmaWxlIHNpZ25hbCBvbmNlIHByb2R1Y2VkIGNvbW1hbmRzIG1peGluZ1xuICAvLyBgYnVuIGluc3RhbGxgIHdpdGggYHlhcm4gcHJpc21hIC4uLmAgaW4gbWlzZS1waW5uZWQgcmVwb3Mgd2hvc2UgYnVuLmxvY2sgaXMgZ2l0aWdub3JlZC5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHVzZXNCdW5QYWNrYWdlTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICAvLyBTb21lIHJlcG9zaXRvcmllcyByZWx5IG9uIHRoZSBsb2NrZmlsZSBvciBwYWNrYWdlTWFuYWdlciBmaWVsZCBpbnN0ZWFkIG9mIG1pc2UuXG4gICAgLy8gRG9ja2VyIG9wdGltaXphdGlvbiBtdXN0IGZvbGxvdyB0aGUgdGFyZ2V0IHByb2plY3QsIG5vdCB0aGUgcnVudGltZSB0aGF0IGxhdW5jaGVkIHdiLlxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gdGhpcy5yb290UGFja2FnZUpzb24/LnBhY2thZ2VNYW5hZ2VyID8/IHRoaXMucGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXI7XG4gICAgaWYgKGlzRXhwbGljaXROb25CdW5QYWNrYWdlTWFuYWdlcihwYWNrYWdlTWFuYWdlcikpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaGFzQnVuRGlyZWN0b3J5TWFya2VyKHRoaXMucm9vdERpclBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gaXNCdW5QYWNrYWdlTWFuYWdlcihwYWNrYWdlTWFuYWdlcik7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgID8gJ1lBUk4gcnVuIGJ1aWxkJ1xuICAgICAgOiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkXG4gICAgICAgID8gYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke3RoaXMuYXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gXG4gICAgICAgIDogXCJlY2hvICdObyBidWlsZCBzY3JpcHQnXCI7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgLyoqIEEgd29ya3NwYWNlIHJvb3Qgd2l0aG91dCBzb3VyY2VzIG9mIGl0cyBvd24gcnVucyBuZWl0aGVyIGxpbnQgbm9yIHR5cGVjaGVjayBjb21tYW5kcy4gKi9cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc093blNvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnBhY2thZ2VKc29uLndvcmtzcGFjZXMgfHwgdGhpcy5oYXNTb3VyY2VDb2RlO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNsYXJlZEVudktleUNhY2hlOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG5hbWVzIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhlIFBST0pFQ1QgZGVjbGFyZXMgKGl0cyBmbm94Ly5lbnYgc291cmNlcyksIGV4Y2x1ZGluZ1xuICAgKiBib3RoIHRoZSBhbWJpZW50IHByb2Nlc3MgZW52aXJvbm1lbnQgYW5kIHRoZSBgbWlzZSBlbnZgIHBzZXVkby1zb3VyY2UgdGhhdCByZXBvcnRzIGhvc3QvdG9vbFxuICAgKiB2YXJpYWJsZXMgc3VjaCBhcyBQQVRILiBgZW52YCBjYW5ub3QgYW5zd2VyIHRoaXM6IGl0IG1lcmdlcyBwcm9jZXNzLmVudiwgc28gYSBwcm9qZWN0IHZhcmlhYmxlXG4gICAqIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gaW5oZXJpdGVkIG9uZSB0aGVyZS5cbiAgICovXG4gIGdldCBkZWNsYXJlZEVudktleXMoKTogU2V0PHN0cmluZz4ge1xuICAgIGlmICh0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGUpIHJldHVybiB0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGU7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHtcbiAgICAgIHRoaXMuZGVjbGFyZWRFbnZLZXlDYWNoZSA9IG5ldyBTZXQoKTtcbiAgICAgIHJldHVybiB0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGU7XG4gICAgfVxuICAgIGNvbnN0IFssIGVudlNvdXJjZXNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgdGhpcy5kZWNsYXJlZEVudktleUNhY2hlID0gc2VsZWN0Rm5veFNvdXJjZWRLZXlzKGVudlNvdXJjZXMpO1xuICAgIHJldHVybiB0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGU7XG4gIH1cblxuICAvLyBDYWNoZWQgaW4gYSBwbGFpbiBmaWVsZCByYXRoZXIgdGhhbiB3aXRoIEBtZW1vaXplT25lOiB0aGF0IGRlY29yYXRvciBrZXlzIGl0cyBjYWNoZSBvbiBhIGhhc2hcbiAgLy8gb2YgdGhlIGluc3RhbmNlLCB3aGljaCBjaGFuZ2VzIGFzIG90aGVyIG1lbW9pemVkIGdldHRlcnMgcG9wdWxhdGUgdGhlIGluc3RhbmNlLCBzbyBgZW52YCBjb3VsZFxuICAvLyBzaWxlbnRseSBiZSByZWNvbXB1dGVkIOKAlCBkcm9wcGluZyBpbi1wbGFjZSBtdXRhdGlvbnMgKGUuZy4gYHByb2plY3QuZW52LlBPUlQgfHw9IOKApmAsIG9yIHRoZVxuICAvLyBzZWNyZXRzIGB3YiBkZXBsb3lgIG1lcmdlcyBmcm9tIC5lbnYuY2xvdWRmbGFyZSkgdGhhdCBjYWxsZXJzIHJlbHkgb24gZm9yIHNwYXduZWQgY29tbWFuZHMuXG4gIHByaXZhdGUgZW52Q2FjaGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodGhpcy5lbnZDYWNoZSkgcmV0dXJuIHRoaXMuZW52Q2FjaGU7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHtcbiAgICAgIHRoaXMuZW52Q2FjaGUgPSBwcm9jZXNzLmVudjtcbiAgICAgIHJldHVybiB0aGlzLmVudkNhY2hlO1xuICAgIH1cblxuICAgIGNvbnN0IFttZXJnZWRFbnYsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lUGFpcnNdID0gcmVhZEFuZE1lcmdlRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpO1xuICAgIHRoaXMuZW52Q2FjaGUgPSBtZXJnZWRFbnY7XG4gICAgLy8gYG1pc2UgZW52YCBpcyBleGNsdWRlZDogaXQgcmVwb3J0cyB0b29sLWFjdGl2YXRpb24gb3V0cHV0IChlLmcuIFBBVEgpIGV2ZW4gaW4gcmVwb3MgdGhhdFxuICAgIC8vIGRlY2xhcmUgbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIGF0IGFsbCwgd2hpY2ggbXVzdCBub3QgdHJpZ2dlciB0aGUgQ0kgc3RyaWN0bmVzcyBiZWxvdy5cbiAgICB0aGlzLmNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudihlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzLnNvbWUoKFtzb3VyY2VdKSA9PiAhc291cmNlLnN0YXJ0c1dpdGgoJ21pc2UgZW52JykpKTtcbiAgICByZXR1cm4gdGhpcy5lbnZDYWNoZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0YW5kYXJkV2JFbnZNb2RlcyA9IG5ldyBTZXQoWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddKTtcblxuICAvKipcbiAgICogQ29tcGxldGVzIGFuZCB2YWxpZGF0ZXMgdGhlIHJlc29sdmVkIGBXQl9FTlZgIHBlciB0aGUgb3JnIHN0YW5kYXJkIChzZWUgdGhlXG4gICAqIGd1aWRlbGluZXMtZm9yLW1pc2UtZm5veCBza2lsbCk6XG4gICAqIC0gTG9jYWxseSwgYW4gdW5zZXQgYFdCX0VOVmAgZmFsbHMgYmFjayB0byB0aGUgc2VsZWN0ZWQgY2FzY2FkZSBtb2RlIChkZXZlbG9wbWVudCB1bmxlc3MgYVxuICAgKiAgIGNvbW1hbmQgZm9yY2VzIGFub3RoZXIsIGUuZy4gYHdiIHRlc3RgIGZvcmNlcyB0ZXN0KSwgc28gY2FzdWFsIGBidW4gd2IgLi4uYCBpbnZvY2F0aW9uc1xuICAgKiAgIHdvcmsgaW4gcmVwb3NpdG9yaWVzIHRoYXQgZGVmaW5lIG5vIFdCX0VOViBhdCBhbGwuXG4gICAqIC0gT24gQ0ksIGFuIHVuc2V0IGBXQl9FTlZgIGlzIGEgaGFyZCBlcnJvciB3aGVuIGVudiBzb3VyY2VzIGV4aXN0OiB3b3JrZmxvd3MgbXVzdCBleHBvcnQgdGhlXG4gICAqICAgZW52aXJvbm1lbnQgZXhwbGljaXRseSBpbnN0ZWFkIG9mIHNpbGVudGx5IHJ1bm5pbmcgaW4gYW4gYW1iaWd1b3VzIG1vZGUuXG4gICAqIC0gVGhlIHZhbHVlIG11c3QgbmFtZSBhIHN0YW5kYXJkIG1vZGU7IGFuIHVua25vd24gdmFsdWUgKGUuZy4gYSB0eXBvIGxpa2UgYHByb2RjdXRpb25gKSB3b3VsZFxuICAgKiAgIG90aGVyd2lzZSBzaWxlbnRseSBzZWxlY3QgdGhlIGRldmVsb3BtZW50IGNhc2NhZGUsIHdoaWNoIGlzIHRoZSBmYWlsdXJlIHRoaXMgZ3VhcmRzIGFnYWluc3QuXG4gICAqIC0gYE5FWFRfUFVCTElDX1dCX0VOVmAgaXMgZGVyaXZlZCBmcm9tIGBXQl9FTlZgIGZvciBOZXh0LmpzL3ZpbmV4dCBhcHBzIHdoZW4gbWlzc2luZywgc28gYVxuICAgKiAgIHByb2R1Y3Rpb24gYnVpbGQgY2FuIG5vIGxvbmdlciBiYWtlIGEgc3RhbGUgZGV2ZWxvcG1lbnQgdmFsdWUgaW50byB0aGUgY2xpZW50IGJ1bmRsZS5cbiAgICogU2tpcHBlZCB3aGVuIGBXQl9TS0lQX0VOVl9DSEVDSz0xYCBpcyBzZXQuXG4gICAqL1xuICBwcml2YXRlIGNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudihoYXNFbnZpcm9ubWVudFNvdXJjZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBlbnYgPSB0aGlzLmVudkNhY2hlO1xuICAgIGlmICghZW52KSByZXR1cm47XG4gICAgaWYgKGVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJzEnIHx8IGVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJ3RydWUnKSByZXR1cm47XG5cbiAgICAvLyBPbiBDSSwgV0JfRU5WIG11c3QgYmUgRVhQT1JURUQgYnkgdGhlIHdvcmtmbG93IOKAlCBjaGVja2VkIGFnYWluc3QgcHJvY2Vzcy5lbnYsIG5vdCB0aGVcbiAgICAvLyBtZXJnZWQgZW52aXJvbm1lbnQ6IGEgY29tbWl0dGVkIGJhc2UgZGVmYXVsdCAoZS5nLiBmbm94J3MgZGV2ZWxvcG1lbnQgZW50cnkpIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHNhdGlzZnkgdGhlIGNoZWNrIGFuZCBzaWxlbnRseSBydW4gQ0kgaW4gZGV2ZWxvcG1lbnQgbW9kZS5cbiAgICBpZiAoaXNDSShlbnYuQ0kpICYmICFwcm9jZXNzLmVudi5XQl9FTlYgJiYgaGFzRW52aXJvbm1lbnRTb3VyY2VzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgJ1dCX0VOViBpcyBub3QgZXhwb3J0ZWQgb24gQ0kuIEV4cG9ydCBXQl9FTlYgZXhwbGljaXRseSAodGhlIHJldXNhYmxlIHdvcmtmbG93cyBwYXNzIGl0IHZpYSB0aGUgXCJlbnZpcm9ubWVudFwiIGlucHV0KSwgJyArXG4gICAgICAgICAgICAnb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKCFlbnYuV0JfRU5WKSB7XG4gICAgICAvLyBUaGUgc2hhcmVkIHJlc29sdmVyIGtlZXBzIHRoaXMgZmFsbGJhY2sgY29uc2lzdGVudCB3aXRoIHRoZSBjYXNjYWRlIHNlbGVjdGlvbiBBTkQgd2l0aFxuICAgICAgLy8gdGhlICR7V0JfRU5WfSBleHBhbnNpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzIGFscmVhZHkgcGVyZm9ybWVkOiB0aGUgZm9yY2VkIGNhc2NhZGVcbiAgICAgIC8vIChlLmcuIGB3YiB0ZXN0YCksIHRoZW4gdGhlIGNvbW1hbmQtbGV2ZWwgZGVmYXVsdCwgdGhlbiB0aGUgQU1CSUVOVC1OT0RFX0VOVi1kcml2ZW4gYXV0b1xuICAgICAgLy8gY2FzY2FkZSBjbGFtcGVkIHRvIGEgc3RhbmRhcmQgbW9kZSAoYW4gZXhwbGljaXQgLS1jYXNjYWRlLWVudiBrZWVwcyBpdHMgdmFsdWUgYW5kIGlzXG4gICAgICAvLyB2YWxpZGF0ZWQgYmVsb3cgbGlrZSBhbnkgb3RoZXIgV0JfRU5WKS5cbiAgICAgIGNvbnN0IG1vZGUgPSByZXNvbHZlRmFsbGJhY2tXYkVudih0aGlzLmFyZ3YpO1xuICAgICAgZW52LldCX0VOViA9IG1vZGU7XG4gICAgICBpZiAoaGFzRW52aXJvbm1lbnRTb3VyY2VzICYmICFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBXQl9FTlYgaXMgbm90IGRlZmluZWQ7IGRlZmF1bHRpbmcgdG8gXCIke21vZGV9XCIuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghUHJvamVjdC5zdGFuZGFyZFdiRW52TW9kZXMuaGFzKGVudi5XQl9FTlYpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYFdCX0VOViBtdXN0IGJlIG9uZSBvZiBkZXZlbG9wbWVudCwgdGVzdCwgc3RhZ2luZywgb3IgcHJvZHVjdGlvbiwgYnV0IGlzIFwiJHtlbnYuV0JfRU5WfVwiLiBgICtcbiAgICAgICAgICAgICdGaXggdGhlIHZhbHVlIGluIHRoZSBlbnYgc291cmNlIG9yIHRoZSBleHBvcnRlZCB2YXJpYWJsZSwgb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gQSBmb3JjZWQgbW9kZSAoYW4gZXhwbGljaXQvY29tbWFuZC1kZWZhdWx0IC0tY2FzY2FkZS1lbnYsIG9yIGFuIGV4cG9ydGVkIFdCX0VOViB3aG9zZVxuICAgIC8vIHByb2ZpbGUgdmFsdWVzIG1heSBvdmVycmlkZSBpdCBsb2NhbGx5IHBlciBpc3N1ZSAjOTMwKSBtdXN0IG5vdCBiZSBzaWxlbnRseSByZXBsYWNlZCBieVxuICAgIC8vIGFub3RoZXIgbW9kZSBhbiBlbnYgc291cmNlIGRlZmluZXM6IGB3YiB0ZXN0YCByZXNvbHZpbmcgV0JfRU5WPWRldmVsb3BtZW50IGZyb20gdGhlIGJhc2VcbiAgICAvLyBmbm94IHNlY3JldHMgd291bGQgcnVuIHRoZSB0ZXN0cyBhZ2FpbnN0IGRldmVsb3BtZW50IHZhbHVlcywgYW5kIGFuIGV4cG9ydGVkXG4gICAgLy8gV0JfRU5WPXByb2R1Y3Rpb24gb3ZlcnJpZGRlbiB0byBkZXZlbG9wbWVudCBieSB0aGUgcHJvZHVjdGlvbiBwcm9maWxlIHdvdWxkIGJ1aWxkL2RlcGxveVxuICAgIC8vIHRoZSB3cm9uZyBlbnZpcm9ubWVudCB3aGlsZSBsb29raW5nIHN1Y2Nlc3NmdWwuXG4gICAgLy8gLS1jYXNjYWRlLW5vZGUtZW52IGZvcmNlcyA8Tk9ERV9FTlYgfHwgZGV2ZWxvcG1lbnQ+IChwZXIgaXRzIG93biBkb2N1bWVudGF0aW9uKSwgcmVhZCBmcm9tXG4gICAgLy8gdGhlIEFNQklFTlQgZW52aXJvbm1lbnQgbGlrZSB0aGUgY2FzY2FkZSBzZWxlY3Rpb24uIE9ubHkgYSBTVEFOREFSRCBmb3JjZWQgbW9kZSBpcyBlbmZvcmNlZDpcbiAgICAvLyBhIG5vbi1zdGFuZGFyZCBvbmUgKGUuZy4gTk9ERV9FTlY9cWEpIGFscmVhZHkgaGFkIGl0cyBmYWxsYmFjayBjbGFtcGVkIHRvIGRldmVsb3BtZW50IGFib3ZlLFxuICAgIC8vIGFuZCBlcnJvcmluZyBvbiB0aGF0IGNsYW1wIHdvdWxkIGNvbnRyYWRpY3QgaXQuXG4gICAgY29uc3QgZm9yY2VkTW9kZSA9XG4gICAgICB0aGlzLmFyZ3YuY2FzY2FkZUVudiA/P1xuICAgICAgKHRoaXMuYXJndi5jYXNjYWRlTm9kZUVudiA/IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCcgOiBwcm9jZXNzLmVudi5XQl9FTlYgfHwgdW5kZWZpbmVkKTtcbiAgICAvLyBUaGUgQVVUTy1zZWxlY3RlZCBtb2RlIGNvdW50cyBhcyB0aGUgZXhwZWN0YXRpb24gdG9vOiB3aXRoIG5vdGhpbmcgc2V0IGFueXdoZXJlLCB0aGVcbiAgICAvLyBkZXZlbG9wbWVudCB2YWx1ZXMgYXJlIGxvYWRlZCwgc28gYW4gZW52IHNvdXJjZSBkZWNsYXJpbmcgV0JfRU5WPXByb2R1Y3Rpb24gd291bGRcbiAgICAvLyBvdGhlcndpc2UgcnVuIGRldmVsb3BtZW50IHNvdXJjZXMgbGFiZWxlZCBhcyBwcm9kdWN0aW9uLlxuICAgIGNvbnN0IGV4cGVjdGVkTW9kZSA9XG4gICAgICBmb3JjZWRNb2RlID8/ICh0aGlzLmFyZ3YuYXV0b0Nhc2NhZGVFbnYgIT09IGZhbHNlID8gcmVzb2x2ZUZhbGxiYWNrV2JFbnYodGhpcy5hcmd2KSA6IHVuZGVmaW5lZCk7XG4gICAgLy8gVGhlIGNvbW1hbmQtbGV2ZWwgZGVmYXVsdCBpcyBhIGxlZ2l0aW1hdGUgc2Vjb25kIGV4cGVjdGF0aW9uOiBgd2IgdGVzdCAtLWNhc2NhZGUtZW52PXN0YWdpbmdgXG4gICAgLy8gbG9hZHMgdGhlIHN0YWdpbmcgZmlsZXMgd2hpbGUgdGhlIGZhbGxiYWNrIGNvcnJlY3RseSBmaWxscyBXQl9FTlY9dGVzdC5cbiAgICBpZiAoXG4gICAgICBleHBlY3RlZE1vZGUgJiZcbiAgICAgIFByb2plY3Quc3RhbmRhcmRXYkVudk1vZGVzLmhhcyhleHBlY3RlZE1vZGUpICYmXG4gICAgICBlbnYuV0JfRU5WICE9PSBleHBlY3RlZE1vZGUgJiZcbiAgICAgIGVudi5XQl9FTlYgIT09IHRoaXMuYXJndi5jb21tYW5kRGVmYXVsdFdiRW52XG4gICAgKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYFdCX0VOViByZXNvbHZlcyB0byBcIiR7ZW52LldCX0VOVn1cIiBhbHRob3VnaCB0aGUgXCIke2V4cGVjdGVkTW9kZX1cIiBlbnZpcm9ubWVudCB3YXMgc2VsZWN0ZWQuIGAgK1xuICAgICAgICAgICAgYEZpeCB0aGUgV0JfRU5WIGRlZmluZWQgaW4gdGhlIG1vZGUncyBlbnYgc291cmNlIChlLmcuIHRoZSBmbm94IFwiJHtleHBlY3RlZE1vZGV9XCIgcHJvZmlsZSksIGAgK1xuICAgICAgICAgICAgJ29yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlcXVpcmVzTmV4dFB1YmxpY1diRW52ICYmIGVudi5ORVhUX1BVQkxJQ19XQl9FTlYgIT09IGVudi5XQl9FTlYpIHtcbiAgICAgIC8vIEFzc2lnbiB1bmNvbmRpdGlvbmFsbHksIG5vdCBgfHw9YDogdGhlIHBhaXIgbXVzdCBhZ3JlZSBieSBjb252ZW50aW9uLCBhbmQgYSBzdGFsZSB2YWx1ZVxuICAgICAgLy8gKGUuZy4gdGhlIGZub3ggYmFzZSBkZXZlbG9wbWVudCBkZWZhdWx0IHdoaWxlIENJIGV4cG9ydHMgV0JfRU5WPXRlc3QpIHdvdWxkIG90aGVyd2lzZVxuICAgICAgLy8gYmUgYmFrZWQgaW50byB0aGUgY2xpZW50IGJ1bmRsZSBldmVuIHRob3VnaCB0aGUgc2VydmVyIHNpZGUgcnVucyB3aXRoIHRoZSBjb3JyZWN0IFdCX0VOVi5cbiAgICAgIGlmIChlbnYuTkVYVF9QVUJMSUNfV0JfRU5WICYmICFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBPdmVycmlkaW5nIE5FWFRfUFVCTElDX1dCX0VOViAoXCIke2Vudi5ORVhUX1BVQkxJQ19XQl9FTlZ9XCIpIHdpdGggV0JfRU5WIChcIiR7ZW52LldCX0VOVn1cIikuYCk7XG4gICAgICB9XG4gICAgICBlbnYuTkVYVF9QVUJMSUNfV0JfRU5WID0gZW52LldCX0VOVjtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBwcml2YXRlIGdldCByZXF1aXJlc05leHRQdWJsaWNXYkVudigpOiBib29sZWFuIHtcbiAgICAvLyBPV04gZGVwZW5kZW5jaWVzIG9ubHk6IGEgcm9vdC1sZXZlbCBuZXh0L3ZpbmV4dCBkZXZEZXBlbmRlbmN5IGluIGEgbWl4ZWQgbW9ub3JlcG8gbXVzdCBub3RcbiAgICAvLyBmb3JjZSBORVhUX1BVQkxJQ19XQl9FTlYgb250byBldmVyeSBub24tTmV4dCB3b3Jrc3BhY2UgcGFja2FnZS5cbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCduZXh0JykgfHwgISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCd2aW5leHQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYHdyYW5nbGVyIHR5cGVzYCBzaG91bGQgZ2VuZXJhdGUgYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNgIGhlcmUuIEEgd3JhbmdsZXIgY29uZmlnXG4gICAqIGFuZCBhbiBvd24gd3JhbmdsZXIgZGVwZW5kZW5jeSBhcmUgYm90aCByZXF1aXJlZCDigJQgd3JhbmdsZXIgZXhpdHMgbm9uLXplcm8gd2l0aG91dCBhIGNvbmZpZyxcbiAgICogYW5kIGluIGEgbWl4ZWQgbW9ub3JlcG8gYSByb290LWxldmVsIHdyYW5nbGVyIGRldkRlcGVuZGVuY3kgbXVzdCBub3QgbWFrZSBldmVyeSB3b3Jrc3BhY2VcbiAgICogcGFja2FnZSBlbWl0IHR5cGVzIGl0IG5ldmVyIGNvbnN1bWVzLlxuICAgKlxuICAgKiBUaGUgcGFja2FnZSdzIG93biBjb21taXR0ZWQgZ2l0aWdub3JlIHJ1bGUgaXMgdGhlIHRoaXJkIHNpZ25hbCwgYW5kIHRoZSBvbmUgdGhhdCBzYXlzIHRoZVxuICAgKiBwYWNrYWdlIGFjdHVhbGx5IENPTlNVTUVTIHRoZSBmaWxlOiB3YmZ5IHdyaXRlcyB0aGF0IHJ1bGUgb25seSBmb3IgcGFja2FnZXMgd2hvc2Ugb3duIHRzY29uZmlnXG4gICAqIGNhbiByZWZlcmVuY2UgYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNgLCBhbmQgZGVsaWJlcmF0ZWx5IGxlYXZlcyBhbG9uZSBwYWNrYWdlcyB0aGF0XG4gICAqIGhhbmQtbWFpbnRhaW4gdGhlaXIgYEVudmAgaW5zdGVhZC4gV2l0aG91dCB0aGlzIGNoZWNrLCBzdWNoIGEgcGFja2FnZSB3b3VsZCBnYWluIGFuIHVudHJhY2tlZFxuICAgKiB+NTAwS0IgZ2VuZXJhdGVkIGZpbGUgb24gZXZlcnkgaW5zdGFsbC5cbiAgICovXG4gIEBtZW1vaXplT25lXG4gIGdldCBnZW5lcmF0ZXNXb3JrZXJUeXBlcygpOiBib29sZWFuIHtcbiAgICBpZiAoIWZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgodGhpcykgfHwgIXRoaXMuaGFzT3duRGVwZW5kZW5jeSgnd3JhbmdsZXInKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIERlZmVuc2UgaW4gZGVwdGggYWdhaW5zdCB3YmZ5J3MgZ2l0aWdub3JlIHJ1bGUgYW5kIHRoaXMgcHJlZGljYXRlIGRyaWZ0aW5nIGFwYXJ0OiBpZiB0aGUgcGFja2FnZSBzdGlsbFxuICAgIC8vIHJ1bnMgaXRzIG93biBvdXRwdXQtY2hhbmdpbmcgYHdyYW5nbGVyIHR5cGVzYCAoZS5nLiBgLS1zdHJpY3QtdmFycz1mYWxzZWApLCB0aGUgYmFyZSBpbnZvY2F0aW9uIGhlcmUgd291bGRcbiAgICAvLyBvdmVyd3JpdGUgdGhhdCBmaWxlIHdpdGggYSBkaWZmZXJlbnQgYEVudmAuXG4gICAgaWYgKGhhc091dHB1dENoYW5naW5nV3JhbmdsZXJUeXBlcyh0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge30sIHRoaXMuZGlyUGF0aCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gaGFzTWFuYWdlZEdpdGlnbm9yZVJ1bGUodGhpcy5kaXJQYXRoLCBXT1JLRVJfVFlQRVNfRklMRV9OQU1FKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbigncHJpc21hJyk7XG4gIH1cblxuICAvKiogQmxpdHogcmVwb3NpdG9yaWVzIGtlZXAgdGhlaXIgUHJpc21hIHNjaGVtYSBhbmQgU1FMaXRlIGRhdGFiYXNlcyB1bmRlciBkYi8gaW5zdGVhZCBvZiBwcmlzbWEvLiAqL1xuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJpc21hRGlyTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdkYicsICdzY2hlbWEucHJpc21hJykpID8gJ2RiJyA6ICdwcmlzbWEnO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RyaXp6bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignZHJpenpsZS1vcm0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkYXRhYmFzZU9ybSgpOiBEYXRhYmFzZU9ybSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJpc21hKSByZXR1cm4gJ3ByaXNtYSc7XG4gICAgaWYgKHRoaXMuaGFzRHJpenpsZSkgcmV0dXJuICdkcml6emxlJztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzVml0ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udml0ZXN0ID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aXRlc3QpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094bGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGxpbnQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNUeXBlQXdhcmVPeGxpbnQoKTogYm9vbGVhbiB7XG4gICAgLy8gT3hsaW50J3MgdHlwZS1hd2FyZSBtb2RlIHJlcXVpcmVzIHRoZSBveGxpbnQtdHNnb2xpbnQgYmluYXJ5LlxuICAgIHJldHVybiB0aGlzLmhhc094bGludCAmJiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludC10c2dvbGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094Zm10KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294Zm10Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJldHRpZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgncHJldHRpZXInKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQb2V0cnlMb2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwb2V0cnkubG9jaycpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncG9ldHJ5LmxvY2snKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1B1YnNwZWNZYW1sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSkgfHxcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwdWJzcGVjLnlhbWwnKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0NhcmdvVG9tbCgpOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IHRoZSBwcm9qZWN0J3Mgb3duIGRpcmVjdG9yeSBpcyBjaGVja2VkIGJlY2F1c2UgYGNhcmdvIGZtdCAtLWFsbGBcbiAgICAvLyBjb3ZlcnMgdGhlIHdob2xlIHdvcmtzcGFjZTsgbWF0Y2hpbmcgdGhlIHJvb3QgZGlyZWN0b3J5IHRvbyB3b3VsZCBtYWtlXG4gICAgLy8gZXZlcnkgZGVzY2VuZGFudCBwcm9qZWN0IHJ1biB0aGUgc2FtZSB3b3Jrc3BhY2Utd2lkZSBjb21tYW5kIGluXG4gICAgLy8gcGFyYWxsZWwuXG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ0NhcmdvLnRvbWwnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdveGxpbnQnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNPeGxpbnQpIHJldHVybiAnb3hsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBoYXNPd25EZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQbGF5d3JpZ2h0Q29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBQbGF5d3JpZ2h0IGNvbmZpZyBkZWNsYXJlcyBhIGB3ZWJTZXJ2ZXJgIGJsb2NrLCBpLmUuIFBsYXl3cmlnaHQgaXRzZWxmIGJ1aWxkcyBhbmRcbiAgICogc3RhcnRzIHRoZSBhcHAgdW5kZXIgdGVzdC4gVW5saWtlIHtAbGluayBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodH0gdGhpcyBpZ25vcmVzIENJLCBzb1xuICAgKiBpdCBhbHNvIGhvbGRzIGZvciBsaWJyYXJ5IGZpeHR1cmVzIHdob3NlIG9ubHkgc2VydmVyIGlzIHRoZSBvbmUgUGxheXdyaWdodCBtYW5hZ2VzLlxuICAgKi9cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWcoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgICAgcmV0dXJuIC9cXGJ3ZWJTZXJ2ZXJcXGIvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICAvLyBPbiBDSSB3YiBsYXVuY2hlcyB0aGUgYXBwIGl0c2VsZiBzbyB0aGUgcnVuIGRvZXMgbm90IGRlcGVuZCBvbiBQbGF5d3JpZ2h0J3MgYHJldXNlRXhpc3RpbmdTZXJ2ZXJgXG4gICAgLy8gKHdoaWNoIGlzIGRpc2FibGVkIG9uIENJKTsgbG9jYWxseSwgYSBgd2ViU2VydmVyYCBibG9jayBtZWFucyBQbGF5d3JpZ2h0IGFscmVhZHkgb3ducyB0aGUgc2VydmVyLlxuICAgIGlmIChpc0NJKHRoaXMuZW52LkNJKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWc7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIGNvbnN0IGRvY2tlcmZpbGVEaXJQYXRoID0gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSk7XG4gICAgcmV0dXJuIGRvY2tlcmZpbGVEaXJQYXRoID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiAoSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRvY2tlcmZpbGVEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCh0aGlzLmRpclBhdGgsIHRoaXMuZW52KTtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNEZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKSA/PyB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucm9vdFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXBlbmRlbmN5VmVyc2lvbih0aGlzLnBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCwgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBwcml2YXRlIGdldCByb290UGFja2FnZUpzb24oKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJvb3REaXJQYXRoID09PSB0aGlzLmRpclBhdGgpIHJldHVybiB0aGlzLnBhY2thZ2VKc29uO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW3diXSBGYWlsZWQgdG8gcmVhZCBvciBwYXJzZSAke3BhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyl9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd1BhdGggPSBkYlVybC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpLnJlcGxhY2UoL1s/I10uKiQvLCAnJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcmF3UGF0aC5zdGFydHNXaXRoKCcvLycpID8gcmF3UGF0aC5zbGljZSgyKSA6IHJhd1BhdGg7XG4gIHJldHVybiBub3JtYWxpemVkUGF0aCB8fCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+ICYgUGFydGlhbDxQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdyb290RGlyUGF0aCc+PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBpZiAocGF0aC5pc0Fic29sdXRlKGRiUGF0aCkpIHJldHVybiBkYlBhdGg7XG5cbiAgY29uc3QgYmFzZURpclBhdGggPSBwcm9qZWN0LnJvb3REaXJQYXRoID8/IHByb2plY3QuZGlyUGF0aDtcbiAgcmV0dXJuIGJhc2VEaXJQYXRoID8gcGF0aC5yZXNvbHZlKGJhc2VEaXJQYXRoLCBkYlBhdGgpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBwcm9qZWN0J3MgZW52IHNvdXJjZXMgYW5kIG1lcmdlcyB0aGVtIG92ZXIgcHJvY2Vzcy5lbnYsIHJlcG9ydGluZyBlYWNoIGxvYWRlZCBzb3VyY2UuXG4gKiBTaGFyZWQgYnkgUHJvamVjdC5lbnYgYW5kIGB3YiBydW5gJ3Mgc3RhbmRhbG9uZSAobWFuaWZlc3QtbGVzcykgZW52aXJvbm1lbnQgbG9hZGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRNZXJnZUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBkaXJQYXRoOiBzdHJpbmdcbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBbc3RyaW5nLCBzdHJpbmdbXV1bXV0ge1xuICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgZGlyUGF0aCwge1xuICAgIC8vIENhbGxlcnMgZmlsbCBhbiB1bnNldCBXQl9FTlYgd2l0aCB0aGUgc2FtZSBmYWxsYmFjayBhZnRlcndhcmRzLCBzbyBleHBhbmRpbmcgJHtXQl9FTlZ9XG4gICAgLy8gcmVmZXJlbmNlcyBhZ2FpbnN0IGl0IGtlZXBzIHRoZSBwYWlyIGNvbnNpc3RlbnQuXG4gICAgZXhwYW5kRmFsbGJhY2tXYkVudjogdHJ1ZSxcbiAgfSk7XG4gIGlmICghc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2KSkge1xuICAgIGZvciAoY29uc3QgW2VudlBhdGgsIG5hbWVzXSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYExvYWRlZCAke25hbWVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgfVxuICAvLyBTcHJlYWRpbmcgZW52VmFycyBsYXN0IGlzIHNhZmUgZm9yIGV4cG9ydGVkLXZhcmlhYmxlIHByZWNlZGVuY2U6IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlc1xuICAvLyBhbHJlYWR5IGV4Y2x1ZGVzIGtleXMgcHJlc2VudCBpbiBwcm9jZXNzLmVudiBmcm9tIC5lbnYvZm5veCBzb3VyY2VzIChyZXR1cm5pbmcgYSBrZXkgdGhhdFxuICAvLyBleGlzdHMgaW4gcHJvY2Vzcy5lbnYgb25seSBmb3IgZGVsaWJlcmF0ZSBmb3JjZWQtbW9kZSBvdmVycmlkZXMpLiBNaXNlIHZhbHVlcyB0aGF0XG4gIC8vIGRpZmZlciBmcm9tIHRoZSBhbWJpZW50IGFjdGl2YXRpb24gYXJlIGRlbGliZXJhdGVseSBrZXB0IHNvIHRoZSByZXF1ZXN0ZWQgY2FzY2FkZSBwcm9maWxlXG4gIC8vIChlLmcuIGAtLWNhc2NhZGUtZW52PXRlc3RgKSB3aW5zIG92ZXIgYSBzdGFsZSBgbWlzZSBhY3RpdmF0ZWAgZW52aXJvbm1lbnQuXG4gIHJldHVybiBbeyAuLi5wcm9jZXNzLmVudiwgLi4uZW52VmFycyB9LCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuLy8gUHJvamVjdCBjb25zdHJ1Y3Rpb24gcmUtcmVhZHMgbWFuaWZlc3RzIGFuZCBlbnYgc291cmNlcywgYW5kIGB3YiB2ZXJpZnlgIGNvbXBvc2VzIGNvbW1hbmRzXG4vLyAobGludCwgdHlwZWNoZWNrLCB0ZXN0KSB0aGF0IGVhY2ggcmVidWlsZCB0aGUgZ3JhcGgg4oCUIHNvIGluc3RhbmNlcyBhcmUgc2hhcmVkIHBlclxuLy8gKGRpcmVjdG9yeSwgbG9hZEVudiwgZW52LXJlbGV2YW50IGFyZ3YpIHdpdGhpbiBvbmUgaW52b2NhdGlvbi4gU2hhcmluZyBpcyBzYWZlIGJlY2F1c2UgYVxuLy8gUHJvamVjdCBpcyBpbW11dGFibGUgZXhjZXB0IGZvciBlbnYgbXV0YXRpb25zIChlLmcuIGBwcm9qZWN0LmVudi5QT1JUIHx8PSAuLi5gKSwgd2hpY2ggY2FsbGVyc1xuLy8gZGVsaWJlcmF0ZWx5IHJlbHkgb24gc3RheWluZyB2aXNpYmxlIHRvIGxhdGVyIHN0ZXBzLiBUaGUgY2FjaGVzIGxpdmUgZm9yIHRoZSB3aG9sZSBwcm9jZXNzIGFuZFxuLy8gbmV2ZXIgb2JzZXJ2ZSBsYXRlciBmaWxlc3lzdGVtIG11dGF0aW9ucywgc28gY29kZSB0aGF0IHJld3JpdGVzIGEgcHJvamVjdCBkaXJlY3RvcnkgYW5kIG5lZWRzIGFcbi8vIGZyZXNoIHZpZXcgKHRvZGF5IG9ubHkgdGVzdHMpIG11c3QgY2FsbCBjbGVhclByb2plY3RDYWNoZXMgZmlyc3QuXG5jb25zdCBzZWxmUHJvamVjdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb2plY3Q+KCk7XG5jb25zdCBkZXNjZW5kYW50UHJvamVjdHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPFByb2plY3RbXT4+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclByb2plY3RDYWNoZXMoKTogdm9pZCB7XG4gIHNlbGZQcm9qZWN0Q2FjaGUuY2xlYXIoKTtcbiAgZGVzY2VuZGFudFByb2plY3RzQ2FjaGUuY2xlYXIoKTtcbiAgY2xlYXJUZXN0U3RydWN0dXJlQ2FjaGUoKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm9qZWN0Q2FjaGVLZXkoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudjogYm9vbGVhbiwgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gT25seSB0aGUgaW5wdXRzIGEgUHJvamVjdCBhY3R1YWxseSByZWFkcyBwYXJ0aWNpcGF0ZTogdGhlIGVudiBjYXNjYWRlIHNlbGVjdGlvblxuICAvLyAocmVhZEVudmlyb25tZW50VmFyaWFibGVzIC8gcmVzb2x2ZUZhbGxiYWNrV2JFbnYgLyBjb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYpIGFuZCB0aGUgb3V0cHV0XG4gIC8vIHN3aXRjaGVzIChzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0LCBidWlsZENvbW1hbmQncyAtLXZlcmJvc2UpLiBUaGUgYW1iaWVudFxuICAvLyBXQl9FTlYgLyBOT0RFX0VOViAvIENJIHZhbHVlcyBmZWVkIHRoZSBzYW1lIGNhc2NhZGUgc2VsZWN0aW9uIGFuZCBhcmUgbXV0YXRlZCBtaWQtcnVuIGJ5XG4gIC8vIGNvbW1hbmRzIHN1Y2ggYXMgYHdiIGRiIHJlc2V0YCAod2hpY2ggZm9yY2VzIFdCX0VOVj10ZXN0IGFuZCByZS1yZXNvbHZlcyBwcm9qZWN0cyksIHNvIHRoZXlcbiAgLy8gbXVzdCBwYXJ0aWNpcGF0ZSB0b28gb3IgdGhlIHNlY29uZCByZXNvbHV0aW9uIHdvdWxkIHJldXNlIGEgUHJvamVjdCB3aXRoIHRoZSB3cm9uZyBlbnYuXG4gIGNvbnN0IHsgYXV0b0Nhc2NhZGVFbnYsIGNhc2NhZGVFbnYsIGNhc2NhZGVOb2RlRW52LCBjb21tYW5kRGVmYXVsdFdiRW52LCBxdWlldEVudiwgdmVyYm9zZSB9ID0gYXJndjtcbiAgY29uc3QgeyBzaWxlbnQgfSA9IGFyZ3YgYXMgeyBzaWxlbnQ/OiBib29sZWFuIH07XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgcGF0aC5yZXNvbHZlKGRpclBhdGgpLFxuICAgIGxvYWRFbnYsXG4gICAgYXV0b0Nhc2NhZGVFbnYsXG4gICAgY2FzY2FkZUVudixcbiAgICBjYXNjYWRlTm9kZUVudixcbiAgICBjb21tYW5kRGVmYXVsdFdiRW52LFxuICAgIHF1aWV0RW52LFxuICAgIHZlcmJvc2UsXG4gICAgc2lsZW50LFxuICAgIHByb2Nlc3MuZW52LldCX0VOVixcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOVixcbiAgICBwcm9jZXNzLmVudi5DSSxcbiAgXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgY2FjaGVLZXkgPSBidWlsZFByb2plY3RDYWNoZUtleShhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgbGV0IHByb2plY3QgPSBzZWxmUHJvamVjdENhY2hlLmdldChjYWNoZUtleSk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIHByb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICBzZWxmUHJvamVjdENhY2hlLnNldChjYWNoZUtleSwgcHJvamVjdCk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0OiBQcm9qZWN0LCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByb2plY3QuZW52LldCX0VOViA9PT0gbmFtZSB8fCBwcm9qZWN0LmVudi5NSVNFX0VOViA9PT0gbmFtZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmREZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBQcm9taXNlPEZvdW5kUHJvamVjdHMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgcm9vdEFuZFNlbGZQcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGxvYWRFbnYsIGRpclBhdGgpO1xuICBpZiAoIXJvb3RBbmRTZWxmUHJvamVjdHMpIHJldHVybjtcbiAgaWYgKHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCAhPT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmKSB7XG4gICAgcmV0dXJuIHsgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cywgZGVzY2VuZGFudHM6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdIH07XG4gIH1cblxuICBjb25zdCBjYWNoZUtleSA9IGJ1aWxkUHJvamVjdENhY2hlS2V5KGFyZ3YsIGxvYWRFbnYsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdC5kaXJQYXRoKTtcbiAgbGV0IGRlc2NlbmRhbnRzID0gZGVzY2VuZGFudFByb2plY3RzQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgaWYgKCFkZXNjZW5kYW50cykge1xuICAgIGRlc2NlbmRhbnRzID0gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudik7XG4gICAgZGVzY2VuZGFudFByb2plY3RzQ2FjaGUuc2V0KGNhY2hlS2V5LCBkZXNjZW5kYW50cyk7XG4gIH1cbiAgcmV0dXJuIHsgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cywgZGVzY2VuZGFudHM6IGF3YWl0IGRlc2NlbmRhbnRzIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IE9taXQ8Rm91bmRQcm9qZWN0cywgJ2Rlc2NlbmRhbnRzJz4gfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCB0aGlzUHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCF0aGlzUHJvamVjdCkgcmV0dXJuO1xuXG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIHJvb3RQcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIGxvYWRFbnYsIHJvb3REaXJQYXRoKSA/PyB0aGlzUHJvamVjdDtcbiAgfVxuICByZXR1cm4geyByb290OiByb290UHJvamVjdCwgc2VsZjogdGhpc1Byb2plY3QgfTtcbn1cblxuLyoqXG4gKiBUaGUgcm9vdCBwcm9qZWN0IGZvbGxvd2VkIGJ5IG9uZSBQcm9qZWN0IHBlciB3b3Jrc3BhY2UgZGlyZWN0b3J5IHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzXG4gKiBwYWNrYWdlIG1hbmFnZXIgd291bGQgbGluayAoaXNzdWUgIzEwMDgpOiBCdW4gcmVwb3MgdXNlIHRoZSBzaGFyZWQgQnVuLWV4YWN0IHJlc29sdmVyXG4gKiAobmVnYXRpb25zLCBwaW5uZWQgcG9zaXRpdmVzLCBhbmQgYmFzZWxpbmUtc2VlZGluZyBuZWdhdGlvbnMgaW5jbHVkZWQpLCB3aGlsZSBZYXJuIHJlcG9zIGtlZXBcbiAqIGdsb2Igc2VtYW50aWNzIOKAlCBCdW4tb25seSBydWxlcyBzdWNoIGFzIHRoZSBpbXBsaWNpdCBiYXNlbGluZSB3b3VsZCBpbnZlbnQgd29ya3NwYWNlcyBZYXJuXG4gKiBuZXZlciBsaW5rcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICByb290UHJvamVjdDogUHJvamVjdCxcbiAgbG9hZEVudjogYm9vbGVhblxuKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBhd2FpdCBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMocm9vdFByb2plY3QpO1xuICByZXR1cm4gW1xuICAgIHJvb3RQcm9qZWN0LFxuICAgIC4uLndvcmtzcGFjZURpclBhdGhzLm1hcChcbiAgICAgIC8vIFRoZSBmYWxsYmFjayBrZWVwcyBhIHdvcmtzcGFjZSB3aG9zZSBtYW5pZmVzdCB2YW5pc2hlZCBhZnRlciB0aGUgZ2xvYiAoZmluZFNlbGZQcm9qZWN0XG4gICAgICAvLyB3b3VsZCBkcm9wIGl0KSBkaXNjb3ZlcmVkLCBtYXRjaGluZyB0aGUgbG9uZy1zdGFuZGluZyBkaXJlY3QgY29uc3RydWN0aW9uLlxuICAgICAgKHdvcmtzcGFjZURpclBhdGgpID0+XG4gICAgICAgIGZpbmRTZWxmUHJvamVjdChhcmd2LCBsb2FkRW52LCB3b3Jrc3BhY2VEaXJQYXRoKSA/PyBuZXcgUHJvamVjdCh3b3Jrc3BhY2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KVxuICAgICksXG4gIF07XG59XG5cbi8qKlxuICogVGhlIGFic29sdXRlIGRpcmVjdG9yeSBvZiBldmVyeSB3b3Jrc3BhY2UgdGhlIHRhcmdldCByZXBvc2l0b3J5J3MgcGFja2FnZSBtYW5hZ2VyIHdvdWxkIGxpbmssXG4gKiBtYXRjaGluZyB0aGUgbWFuYWdlciB0aGUgd2F5IGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyBkZXNjcmliZXMuIEV4cG9ydGVkIGZvciB3YiByZWxlYXNlLCB3aG9zZVxuICogcGx1Z2luIGluc3BlY3Rpb24sIG5vZGVfbW9kdWxlcyBjbGVhbnVwLCBhbmQgbWFuaWZlc3QgcmV3cml0aW5nIG11c3Qgc2VlIHRoZSBzYW1lIHdvcmtzcGFjZSBzZXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uJyB8ICd1c2VzQnVuUGFja2FnZU1hbmFnZXInPlxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBpZiAocHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUJ1bldvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMocHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzLCBwcm9qZWN0LmRpclBhdGgpLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpXG4gICAgKTtcbiAgfVxuICAvLyBZYXJuIDEuMjIuMjIgcmVzb2x2ZXMgZWFjaCBkZWNsYXJlZCBwYXR0ZXJuIChhcnJheSBvciBgeyBwYWNrYWdlczogW+KApl0gfWAgZm9ybSkgaW5kZXBlbmRlbnRseVxuICAvLyBhbmQgdW5pb25zIHRoZSByZXN1bHRzLCBzbyBhIGxlYWRpbmctYCFgIHBhdHRlcm4gaXMgbm90IGFuIGV4Y2x1c2lvbiDigJQgYFtcInBhY2thZ2VzLypcIixcbiAgLy8gXCIhcGFja2FnZXMvYVwiXWAgc3RpbGwgbGlua3MgcGFja2FnZXMvYS4gWWFybiBhZGRpdGlvbmFsbHkgaWdub3JlcyBtYW5pZmVzdHMgbWlzc2luZyBhIG5hbWUgb3JcbiAgLy8gdmVyc2lvbiAoXCJNaXNzaW5nIHZlcnNpb24gaW4gd29ya3NwYWNlIOKApiwgaWdub3JpbmcuXCIpLCBidXQgdGhhdCBpcyBkZWxpYmVyYXRlbHkgTk9UIG1pcnJvcmVkOlxuICAvLyB3YidzIGRlc2NlbmRhbnQgZGlzY292ZXJ5IGV4aXN0cyB0byBydW4gY29tbWFuZHMgKGxpbnQsIHRlc3QsIHR5cGVjaGVjaywg4oCmKSBpbiBzdWItcGFja2FnZXMsXG4gIC8vIGFuZCB2ZXJzaW9uLWxlc3MgcHJpdmF0ZSBwYWNrYWdlcyBtdXN0IHN0YXkgZGlzY292ZXJlZCDigJQgdGhlIGxvbmctc3RhbmRpbmcgYmVoYXZpb3Igd2Inc1xuICAvLyBtb25vcmVwbyBmaXh0dXJlcyBlbmNvZGUuIEdsb2IgZm9yIHRoZSBtYW5pZmVzdHMgdGhlbXNlbHZlczogZ2xvYmJ5J3MgYG9ubHlEaXJlY3Rvcmllc2BcbiAgLy8gd291bGQgcmV0dXJuIGEgbGl0ZXJhbCBkaXJlY3RvcnkgcGF0dGVybidzIENISUxEUkVOIGluc3RlYWQgb2YgdGhlIGRpcmVjdG9yeS4gVGhlIHJlYWxwYXRoXG4gIC8vIGNvbnRhaW5tZW50IG1pcnJvcnMgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHM6IGEgd29ya3NwYWNlIHN5bWxpbmsgZXNjYXBpbmcgdGhlXG4gIC8vIHJlcG9zaXRvcnkgbXVzdCBub3QgbGV0IGNvbnN1bWVycyB0b3VjaCBhbm90aGVyIGNoZWNrb3V0LlxuICBjb25zdCBwb3NpdGl2ZVBhdHRlcm5zID0gZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpLmZpbHRlcihcbiAgICAocGF0dGVybikgPT4gIXBhdHRlcm4uc3RhcnRzV2l0aCgnIScpICYmIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybihwYXR0ZXJuKVxuICApO1xuICBpZiAocG9zaXRpdmVQYXR0ZXJucy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgLy8gZXhwYW5kRGlyZWN0b3JpZXM6IGZhbHNlIOKAlCBnbG9iYnkgd291bGQgb3RoZXJ3aXNlIGV4cGFuZCBhIGxpdGVyYWwgZGlyZWN0b3J5IHBhdHRlcm4gdG8gaXRzXG4gIC8vIENISUxEUkVOLCB0dXJuaW5nIGUuZy4gYHBhY2thZ2VzYCBpbnRvIG1hdGNoZXMgZm9yIGV2ZXJ5IHBhY2thZ2VzLyogc3ViZGlyZWN0b3J5LlxuICBjb25zdCBnbG9iYnlPcHRpb25zID0ge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGV4cGFuZERpcmVjdG9yaWVzOiBmYWxzZSxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gIH07XG4gIC8vIGZhc3QtZ2xvYiAoZ2xvYmJ5J3MgZW5naW5lKSByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgLy8gYHBhY2thZ2VzLz8vcGFja2FnZS5qc29uYCkgYWx0aG91Z2ggWWFybiBsaW5rcyBzdWNoIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnNcbiAgLy8gb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnkgZGlyZWN0b3J5IGluIHRoZSByZXBvc2l0b3J5KSwgZ2xvYmJpbmdcbiAgLy8gdGhlIGRpcmVjdG9yaWVzICh3aGVyZSBgP2Agd29ya3MpIGFuZCBjaGVja2luZyB0aGVpciBtYW5pZmVzdHMgY29tcGxlbWVudHMgdGhlIG1hbmlmZXN0IGdsb2IuXG4gIGNvbnN0IGdsb2JiZWRNYW5pZmVzdFBhdGhzID0gYXdhaXQgZ2xvYmJ5KFxuICAgIHBvc2l0aXZlUGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICBnbG9iYnlPcHRpb25zXG4gICk7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aFNldCA9IG5ldyBTZXQoZ2xvYmJlZE1hbmlmZXN0UGF0aHMpO1xuICBjb25zdCBxdWVzdGlvbk1hcmtQYXR0ZXJucyA9IHBvc2l0aXZlUGF0dGVybnMuZmlsdGVyKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLmluY2x1ZGVzKCc/JykpO1xuICBpZiAocXVlc3Rpb25NYXJrUGF0dGVybnMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBhd2FpdCBnbG9iYnkocXVlc3Rpb25NYXJrUGF0dGVybnMsIHsgLi4uZ2xvYmJ5T3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLnBvc2l4LmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgbWFuaWZlc3RQYXRoKSkpIG1hbmlmZXN0UGF0aFNldC5hZGQobWFuaWZlc3RQYXRoKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbWFuaWZlc3RQYXRocyA9IFsuLi5tYW5pZmVzdFBhdGhTZXRdO1xuICBjb25zdCByZWFsUm9vdERpclBhdGggPSBmcy5yZWFscGF0aFN5bmMocHJvamVjdC5kaXJQYXRoKTtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBtYW5pZmVzdFBhdGhzXG4gICAgLy8gQSBgKipgIHBhdHRlcm4gcmVhY2hlcyB0aGUgcm9vdCdzIG93biBtYW5pZmVzdCBhbmQgaW5zdGFsbGVkIHBhY2thZ2VzLCBidXQgbmVpdGhlciBpcyBhXG4gICAgLy8gd29ya3NwYWNlIHRvIFlhcm4gKHdoaWNoIG5ldmVyIGRlc2NlbmRzIGludG8gbm9kZV9tb2R1bGVzKS5cbiAgICAuZmlsdGVyKChtYW5pZmVzdFBhdGgpID0+IHtcbiAgICAgIGlmIChtYW5pZmVzdFBhdGggPT09ICdwYWNrYWdlLmpzb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlYWxSb290RGlyUGF0aCwgZnMucmVhbHBhdGhTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIG1hbmlmZXN0UGF0aCkpKTtcbiAgICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgbWFuaWZlc3QgdmFuaXNoZWQgYmV0d2VlbiB0aGUgZ2xvYiBhbmQgdGhlIHJlYWxwYXRoIGNhbGw6IG5vdCBhIHdvcmtzcGFjZS5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pXG4gICAgLm1hcCgobWFuaWZlc3RQYXRoKSA9PiBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBwYXRoLnBvc2l4LmRpcm5hbWUobWFuaWZlc3RQYXRoKSkpO1xuICByZXR1cm4gWy4uLm5ldyBTZXQod29ya3NwYWNlRGlyUGF0aHMpXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHBhY2thZ2UncyBvd24gY29tbWl0dGVkIC5naXRpZ25vcmUgY2FycmllcyB3YmZ5J3MgbWFuYWdlZCBydWxlIGZvciB0aGUgZmlsZS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGBnaXQgY2hlY2staWdub3JlYDogdGhhdCBhbHNvIGhvbm9ycyBgLmdpdC9pbmZvL2V4Y2x1ZGVgIGFuZCB0aGUgdXNlcidzIGdsb2JhbFxuICogZXhjbHVkZXMsIHdoaWNoIGEgZnJlc2ggY2xvbmUgYW5kIENJIGRvIG5vdCBoYXZlLiBBIGRldmVsb3BlciB3aXRoIGEgcGVyc29uYWxcbiAqIGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYCBleGNsdWRlIHdvdWxkIG90aGVyd2lzZSB0dXJuIGdlbmVyYXRpb24gb24gZm9yIGEgcGFja2FnZSB3YmZ5XG4gKiBkZWxpYmVyYXRlbHkgbGVmdCB1bm1hbmFnZWQsIGFuZCB0aGUgcmVzdWx0aW5nIGZpbGUgd291bGQgYmUgaW52aXNpYmxlIGluIGBnaXQgc3RhdHVzYC5cbiAqIGBwYWNrYWdlcy93YmZ5L3NyYy9maXhlcnMvd29ya2VyVHlwZXMudHNgIGdhdGVzIG9uIHRoZSBzYW1lIGNvbW1pdHRlZCBydWxlLlxuICovXG5mdW5jdGlvbiBoYXNNYW5hZ2VkR2l0aWdub3JlUnVsZShkaXJQYXRoOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnNcbiAgICAgIC5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICcuZ2l0aWdub3JlJyksICd1dGY4JylcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5zb21lKChsaW5lKSA9PiBsaW5lLnRyaW0oKSA9PT0gYC8ke2ZpbGVOYW1lfWApO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgcGFja2FnZSBzY3JpcHQgcnVucyBhIGB3cmFuZ2xlciB0eXBlc2AgdGhhdCB3b3VsZCB3cml0ZSBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGF0IHRoZSBiYXJlXG4gKiBpbnZvY2F0aW9uIHdyaXRlcy4gYC0tY2hlY2tgL2AtLWhlbHBgIHZhbGlkYXRlIG9yIHByaW50IGFuZCB3cml0ZSBub3RoaW5nLCBzbyB0aGV5IGRvIG5vdCBjb3VudC4gYC0tZW52LWZpbGVgXG4gKiBjb3VudHMgd2hlbmV2ZXIgYSBmaWxlIGl0IG5hbWVzIEVYSVNUUzogdGhlIGZsYWcgc2VsZWN0cyB3aGF0IHdyYW5nbGVyIHJlYWRzIHRvIGluZmVyIGxvY2FsIHZhcnMgYW5kIHNlY3JldHMsXG4gKiBzbyB0aGUgYmFyZSBpbnZvY2F0aW9uIGhlcmUgd291bGQgcmVnZW5lcmF0ZSBhIHNtYWxsZXIgYEVudmAuIE1pcnJvcnMgd2JmeSdzIGBoYXNDdXN0b21XcmFuZ2xlclR5cGVzSW52b2NhdGlvbmBcbiAqIChpbmNsdWRpbmcgaXRzIGBuYW1lc09ubHlNaXNzaW5nRW52RmlsZXNgIHJ1bGUpOyB0aGUgdHdvIG11c3QgYWdyZWUsIHNpbmNlIHdiZnkncyBhbnN3ZXIgZGVjaWRlcyB0aGVcbiAqIGdpdGlnbm9yZSBydWxlIHRoaXMgcHJlZGljYXRlIGtleXMgb24uXG4gKi9cbmZ1bmN0aW9uIGhhc091dHB1dENoYW5naW5nV3JhbmdsZXJUeXBlcyhzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgd3JhbmdsZXJUeXBlc1BhdHRlcm4gPSAvKD86XnxcXHMpd3JhbmdsZXJcXHMrdHlwZXMoPzpcXHN8JCkvdTtcbiAgY29uc3QgZW52RmlsZU9ubHlQYXR0ZXJuID0gL14oPzooPzpidW54fG5weClcXHMrfCg/Onlhcm58cG5wbSlcXHMrZGx4XFxzKyk/d3JhbmdsZXJcXHMrdHlwZXMoPzpcXHMrLS1lbnYtZmlsZVxccytcXFMrKSokL3U7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4ge1xuICAgIGlmICghc2NyaXB0IHx8ICF3cmFuZ2xlclR5cGVzUGF0dGVybi50ZXN0KHNjcmlwdCkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBDaGVja2VkIG9uIHRoZSBXSE9MRSBzY3JpcHQsIGJlZm9yZSBzcGxpdHRpbmc6IGBjZCBzdWIgJiYgd3JhbmdsZXIgdHlwZXNgIHJ1bnMgdGhlIGdlbmVyYXRvciBpbiBhbm90aGVyXG4gICAgLy8gZGlyZWN0b3J5IGFnYWluc3QgYW5vdGhlciBjb25maWcsIGJ1dCBpdHMgc2Vjb25kIHNlZ21lbnQgYWxvbmUgbG9va3MgbGlrZSBhIHBsYWluIGludm9jYXRpb24uIHdiZnlcbiAgICAvLyBjbGFzc2lmaWVzIGFueSBzY3JpcHQgY2FycnlpbmcgdGhpcyBzeW50YXggYXMgY3VzdG9tLCBhbmQgdGhlIHR3byBwcmVkaWNhdGVzIG11c3QgYWdyZWUuXG4gICAgaWYgKC9bO3w8PmAkJ1wiKCldfFxcYmNkXFxzL3UudGVzdChzY3JpcHQpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gc2NyaXB0XG4gICAgICAuc3BsaXQoJyYmJylcbiAgICAgIC5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJykpXG4gICAgICAuc29tZSgoc2VnbWVudCkgPT4ge1xuICAgICAgICBpZiAoIXdyYW5nbGVyVHlwZXNQYXR0ZXJuLnRlc3Qoc2VnbWVudCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKC8oPzpefFxccykoPzotLWhlbHB8LWgpKD86XFxzfD18JCkvdS50ZXN0KHNlZ21lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIGAtLWNoZWNrYCBjb21wYXJlcyB0aGUgcmVzdWx0IEZPUiBUSEUgU1VQUExJRUQgT1BUSU9OUywgc28gaXQgaXMgb25seSBoYXJtbGVzcyB3aGVuIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAvLyBpbnZvY2F0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJhcmUgb25lLlxuICAgICAgICBjb25zdCB3aXRob3V0Q2hlY2sgPSBzZWdtZW50XG4gICAgICAgICAgLnJlcGxhY2UoLyg/Ol58XFxzKS0tY2hlY2soPzpcXHN8PXwkKS91LCAnICcpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJylcbiAgICAgICAgICAudHJpbSgpO1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB3aXRob3V0Q2hlY2sgPT09IHNlZ21lbnQgPyBzZWdtZW50IDogd2l0aG91dENoZWNrO1xuICAgICAgICAvLyBOb3QgZXF1aXZhbGVudCB0byB0aGUgYmFyZSBpbnZvY2F0aW9uLCB3aXRoIG9yIHdpdGhvdXQgYC0tY2hlY2tgOiBgLS1jaGVja2AgY29tcGFyZXMgdGhlIHJlc3VsdCBGT1JcbiAgICAgICAgLy8gVEhFIFNVUFBMSUVEIE9QVElPTlMsIHNvIGAtLWNoZWNrIC0tc3RyaWN0LXZhcnM9ZmFsc2VgIHN0aWxsIGRlc2NyaWJlcyBhIGRpZmZlcmVudCBmaWxlLlxuICAgICAgICBpZiAoIWVudkZpbGVPbmx5UGF0dGVybi50ZXN0KGNhbmRpZGF0ZSkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gWy4uLmNhbmRpZGF0ZS5tYXRjaEFsbCgvLS1lbnYtZmlsZVxccysoXFxTKykvZ3UpXS5zb21lKFxuICAgICAgICAgIChtYXRjaCkgPT4gISFtYXRjaFsxXSAmJiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBtYXRjaFsxXSkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBCaW5hcnlMaWtlLCBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdCdWlsZCBvdXRwdXQgcGF0aHMgKHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSkgdGhhdCBtdXN0IGV4aXN0IGZvciB0aGUgY2FjaGUgdG8gYmUgdmFsaWQgKGRlZmF1bHQ6IGF1dG8tZGV0ZWN0ZWQgY29tbW9uIG91dHB1dCBkaXJlY3RvcmllcyknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBidWlsZElmTmVlZGVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdidWlsZElmTmVlZGVkJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBjb2RlIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgYnVpbGRJZk5lZWRlZChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZElmTmVlZGVkKFxuICAvLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYnVpbGRDb21tYW5kID1cbiAgICBhcmd2LmNvbW1hbmQgPz8gKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQgPyBgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyUnVuQ29tbWFuZH0gYnVpbGRgIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFidWlsZENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1NraXAgdG8gYnVpbGQgYmVjYXVzZSBubyBidWlsZCBjb21tYW5kIGlzIGRlZmluZWQuJykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBidWlsZENvbW1hbmQgfTtcblxuICAvLyBUaGUgY2FjaGUgcmVxdWlyZXMgdGhlIGdpdCByZXBvc2l0b3J5IHJvb3QgdG8gQkUgcm9vdERpclBhdGg6IHBvcmNlbGFpbiBwYXRocyBhbmQgZGlmZlxuICAvLyBwYXRoc3BlY3MgYmVsb3cgYXJlIGpvaW5lZC9leGVjdXRlZCBhZ2FpbnN0IHJvb3REaXJQYXRoLiBXaGVuIHRoZSByZXBvIHJvb3QgaXMgZWxzZXdoZXJlXG4gIC8vIChlLmcuIGEgc3VicHJvamVjdCBvZiBhIGxhcmdlciByZXBvc2l0b3J5KSwgYWx3YXlzIGJ1aWxkIGluc3RlYWQgb2YgbWlzLXJlc29sdmluZyBwYXRocy5cbiAgLy8gQSBmcmVzaGx5IGluaXRpYWxpemVkIHJlcG8gd2l0aG91dCBjb21taXRzICh1bmJvcm4gSEVBRCkgbGlrZXdpc2UgYnVpbGRzIHdpdGhvdXQgY2FjaGluZzpcbiAgLy8gcmVzb2x2aW5nIEhFQUQgd291bGQgZmFpbC5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpID8gZ2V0R2l0Q29tbWl0SGFzaChwcm9qZWN0KSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YsIGNvbW1pdEhhc2gpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IG91dHB1dFBhdGhzID0gZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBkZXRlY3RFeGlzdGluZ0RlZmF1bHRPdXRwdXRQYXRocyhwcm9qZWN0KTtcbiAgICBpZiAob3V0cHV0UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBXaXRoIG5vIHJlY29yZGVkIG91dHB1dHMsIGEgZGVsZXRlZCBidWlsZCBkaXJlY3RvcnkgY2FuIG5ldmVyIGludmFsaWRhdGUgdGhlIGNhY2hlOyBtYWtlXG4gICAgICAvLyB0aGUgaW5hY3RpdmUgcHJvdGVjdGlvbiB2aXNpYmxlIGluc3RlYWQgb2YgZmFpbGluZyBzaWxlbnRseSAoY2YuIGlzc3VlICM5ODEpLlxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay55ZWxsb3coJ05vIGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkgZGV0ZWN0ZWQ7IHBhc3MgLS1vdXRwdXQgdG8gZW5hYmxlIG1pc3Npbmctb3V0cHV0IGNhY2hlIGludmFsaWRhdGlvbi4nKVxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHsgaGFzaDogY29udGVudEhhc2gsIG91dHB1dFBhdGhzIH0pLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBDb21tb24gYnVpbGQgb3V0cHV0IGRpcmVjdG9yaWVzIHVzZWQgYWNyb3NzIG9yZyBwcm9qZWN0cyAodmluZXh0L2J1aWxkLXRzIGVtaXQgZGlzdCxcbi8vIE5leHQuanMgZW1pdHMgLm5leHQsIENSQS1zdHlsZSBhcHBzIGVtaXQgYnVpbGQsIGBuZXh0IGV4cG9ydGAgZW1pdHMgb3V0KS5cbmNvbnN0IGRlZmF1bHRPdXRwdXRDYW5kaWRhdGVzID0gWydkaXN0JywgJ2J1aWxkJywgJy5uZXh0JywgJ291dCddO1xuXG5mdW5jdGlvbiBnZXRFeHBsaWNpdE91dHB1dFBhdGhzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBhcmd2Lm91dHB1dD8ubGVuZ3RoID8gYXJndi5vdXRwdXQubWFwKFN0cmluZykgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRldGVjdEV4aXN0aW5nRGVmYXVsdE91dHB1dFBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FuZGlkYXRlcy5maWx0ZXIoKG91dHB1dFBhdGgpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgb3V0cHV0UGF0aCkpKTtcbn1cblxuLyoqIEFuIGAtLW91dHB1dGAgdmFsdWUgbWF5IG5hbWUgYSBmaWxlLCBzbyBtYXRjaCB0aGUgZXhhY3QgcGF0aCBhcyB3ZWxsIGFzIGRlc2NlbmRhbnRzLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc091dHB1dFBhdGgob3V0cHV0UGF0aHM6IHN0cmluZ1tdLCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBvdXRwdXRQYXRocy5zb21lKChvdXRwdXRQYXRoKSA9PiBmaWxlUGF0aCA9PT0gb3V0cHV0UGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke291dHB1dFBhdGh9L2ApKTtcbn1cblxuLyoqIFRoZSBIRUFEIGNvbW1pdCBoYXNoLCBvciB1bmRlZmluZWQgb24gYW4gdW5ib3JuIEhFQUQgKGEgcmVwbyB3aXRob3V0IGNvbW1pdHMpLiAqL1xuZnVuY3Rpb24gZ2V0R2l0Q29tbWl0SGFzaChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsncmV2LXBhcnNlJywgJy0tdmVyaWZ5JywgJ0hFQUQnXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgc3RkaW86ICdwaXBlJyxcbiAgfSk7XG4gIHJldHVybiByZXQuc3RhdHVzID09PSAwID8gcmV0LnN0ZG91dC50cmltKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgY29tbWl0SGFzaDogc3RyaW5nXG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICAvLyBUaGUgaW52b2tlZCBidWlsZCBjb21tYW5kIGlzIHBhcnQgb2YgdGhlIGNhY2hlIGlkZW50aXR5OiBgLWMgY29tbWFuZEJgIG11c3Qgbm90IHJldXNlIGFcbiAgLy8gY2FjaGUgcmVjb3JkZWQgZm9yIGNvbW1hbmRBIHdpdGggb3RoZXJ3aXNlIHVuY2hhbmdlZCBpbnB1dHMuXG4gIGhhc2gudXBkYXRlKGFyZ3YuY29tbWFuZCA/PyAnJyk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50ID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIGNvbnN0IGNhY2hlID0gcGFyc2VCdWlsZENhY2hlKGNhY2hlZENvbnRlbnQpO1xuICBpZiAoY2FjaGU/Lmhhc2ggIT09IGNvbnRlbnRIYXNoKSByZXR1cm4gW2ZhbHNlLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG5cbiAgLy8gVGhlIGNhY2hlIGlzIHZhbGlkIG9ubHkgd2hpbGUgdGhlIHJlY29yZGVkIChvciBleHBsaWNpdGx5IHJlcXVlc3RlZCkgYnVpbGQgb3V0cHV0cyBzdGlsbFxuICAvLyBleGlzdDogYSBkZWxldGVkIG91dHB1dCBkaXJlY3RvcnkgKGUuZy4gYHJtIC1yZiBkaXN0YCkgbXVzdCB0cmlnZ2VyIGEgcmVidWlsZCBldmVuIHdoZW4gdGhlXG4gIC8vIGlucHV0cyBhcmUgdW5jaGFuZ2VkIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85ODEpLlxuICBjb25zdCByZXF1aXJlZE91dHB1dFBhdGhzID0gZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBjYWNoZS5vdXRwdXRQYXRocztcbiAgY29uc3QgbWlzc2luZ091dHB1dFBhdGhzID0gcmVxdWlyZWRPdXRwdXRQYXRocy5maWx0ZXIoXG4gICAgKG91dHB1dFBhdGgpID0+ICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIG91dHB1dFBhdGgpKVxuICApO1xuICBpZiAobWlzc2luZ091dHB1dFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KGBSZWJ1aWxkaW5nIGJlY2F1c2UgYnVpbGQgb3V0cHV0cyBhcmUgbWlzc2luZzogJHttaXNzaW5nT3V0cHV0UGF0aHMuam9pbignLCAnKX1gKSk7XG4gICAgcmV0dXJuIFtmYWxzZSwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xuICB9XG4gIHJldHVybiBbdHJ1ZSwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5mdW5jdGlvbiBwYXJzZUJ1aWxkQ2FjaGUoY2FjaGVkQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogeyBoYXNoOiBzdHJpbmc7IG91dHB1dFBhdGhzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjYWNoZWRDb250ZW50KSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjYWNoZWRDb250ZW50KSBhcyB7IGhhc2g/OiB1bmtub3duOyBvdXRwdXRQYXRocz86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHBhcnNlZD8uaGFzaCAhPT0gJ3N0cmluZycpIHJldHVybjtcbiAgICBjb25zdCBvdXRwdXRQYXRocyA9IEFycmF5LmlzQXJyYXkocGFyc2VkLm91dHB1dFBhdGhzKVxuICAgICAgPyBwYXJzZWQub3V0cHV0UGF0aHMuZmlsdGVyKChwKSA9PiB0eXBlb2YgcCA9PT0gJ3N0cmluZycpXG4gICAgICA6IFtdO1xuICAgIHJldHVybiB7IGhhc2g6IHBhcnNlZC5oYXNoLCBvdXRwdXRQYXRocyB9O1xuICB9IGNhdGNoIHtcbiAgICAvLyBBIGxlZ2FjeSBjYWNoZSBmaWxlIGNvbnRhaW5zIGEgcmF3IGNvbnRlbnQgaGFzaCB3aXRob3V0IG91dHB1dCByZWNvcmRzLiBUcmVhdCBpdCBhcyBhIG1pc3M6XG4gICAgLy8gaG9ub3JpbmcgaXQgd291bGQgbGV0IGEgbWF0Y2hpbmcgaGFzaCBza2lwIGEgYnVpbGQgd2hvc2Ugb3V0cHV0cyB3ZXJlIGRlbGV0ZWQsIGFuZCBvbmVcbiAgICAvLyByZWJ1aWxkIHVwZ3JhZGVzIHRoZSByZWNvcmQgdG8gdGhlIEpTT04gZm9ybWF0LlxuICAgIHJldHVybjtcbiAgfVxufVxuXG4vLyBNYXRjaGVkIGFzIGNvbXBsZXRlIHBhdGggU0VHTUVOVFMgKG5vdCBzdWJzdHJpbmdzKTogYHNyYy9jb250ZXN0L2AgbXVzdCBub3QgYmUgZXhjbHVkZWQgYnlcbi8vIGB0ZXN0YCwgYW5kIGBteXNyYy9gIG11c3Qgbm90IGJlIGluY2x1ZGVkIGJ5IGBzcmNgLlxuY29uc3QgaW5jbHVkZURpck5hbWVzID0gbmV3IFNldChbJ3NyYycsICdwdWJsaWMnXSk7XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG4gICdidW4ubG9jaycsXG4gICdidW4ubG9ja2InLFxuXTtcbmNvbnN0IGV4Y2x1ZGVEaXJOYW1lcyA9IG5ldyBTZXQoWyd0ZXN0JywgJ3Rlc3RzJywgJ19fdGVzdHNfXycsICd0ZXN0LWZpeHR1cmVzJ10pO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAvLyBgLXVhbGxgIGxpc3RzIHVudHJhY2tlZCBmaWxlcyBpbmRpdmlkdWFsbHkgKG5vdCBqdXN0IHRoZWlyIGRpcmVjdG9yeSksIHNvIG5ldyBmaWxlcyBpbiBhXG4gICAgLy8gYnJhbmQtbmV3IHNvdXJjZSBkaXJlY3RvcnkgcGFydGljaXBhdGUgaW4gdGhlIGhhc2ggYmVsb3cuIGAtemAgeWllbGRzIE5VTC1kZWxpbWl0ZWQsXG4gICAgLy8gVU5RVU9URUQgcmVjb3Jkczogd2l0aG91dCBpdCBnaXQgQy1xdW90ZXMgbm9uLUFTQ0lJIHBhdGhzLCB3aGljaCB3b3VsZCBzaWxlbnRseSBkcm9wIHRob3NlXG4gICAgLy8gZmlsZXMgZnJvbSBib3RoIHRoZSB1bnRyYWNrZWQgaGFzaGluZyBhbmQgdGhlIGBnaXQgZGlmZmAgcGF0aHNwZWNzLlxuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ3N0YXR1cycsICctLXBvcmNlbGFpbicsICctdWFsbCcsICcteiddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCB0b2tlbnMgPSByZXQuc3Rkb3V0LnNwbGl0KCdcXDAnKS5maWx0ZXIoKHRva2VuKSA9PiB0b2tlbi5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBzdGF0dXNFbnRyaWVzOiB7IHVudHJhY2tlZDogYm9vbGVhbjsgZmlsZVBhdGg6IHN0cmluZyB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG9rZW5zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdITtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRva2VuLnNsaWNlKDAsIDIpO1xuICAgICAgc3RhdHVzRW50cmllcy5wdXNoKHsgdW50cmFja2VkOiBzdGF0dXMgPT09ICc/PycsIGZpbGVQYXRoOiB0b2tlbi5zbGljZSgzKSB9KTtcbiAgICAgIC8vIFJlbmFtZS9jb3B5IHJlY29yZHMgY2FycnkgdGhlIE9SSUdJTkFMIHBhdGggYXMgYW4gZXh0cmEgTlVMLWRlbGltaXRlZCBmaWVsZDsgaW5jbHVkZSBpdFxuICAgICAgLy8gc28gYSBmaWxlIHJlbmFtZWQgb3V0IG9mIHRoZSBidWlsZCBpbnB1dHMgc3RpbGwgaW52YWxpZGF0ZXMgdGhlIGNhY2hlLlxuICAgICAgaWYgKHN0YXR1cy5pbmNsdWRlcygnUicpIHx8IHN0YXR1cy5pbmNsdWRlcygnQycpKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUGF0aCA9IHRva2Vuc1srK2luZGV4XTtcbiAgICAgICAgaWYgKG9yaWdpbmFsUGF0aCkgc3RhdHVzRW50cmllcy5wdXNoKHsgdW50cmFja2VkOiBmYWxzZSwgZmlsZVBhdGg6IG9yaWdpbmFsUGF0aCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZEVudHJpZXMgPSBzdGF0dXNFbnRyaWVzLm1hcCgoZW50cnkpID0+ICh7XG4gICAgICAuLi5lbnRyeSxcbiAgICAgIGhhc2hQYXRoOlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0J1xuICAgICAgICAgID8gZW50cnkuZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC93YlxcL3Rlc3RcXC9maXh0dXJlc1xcL1teL10rXFwvLywgJycpXG4gICAgICAgICAgOiBlbnRyeS5maWxlUGF0aCxcbiAgICB9KSk7XG4gICAgLy8gQnVpbGQgT1VUUFVUUyBtdXN0IG5ldmVyIGNvdW50IGFzIGJ1aWxkIGlucHV0czogaGFzaGluZyBlLmcuIGFuIHVudHJhY2tlZCBkaXN0LyBmaWxlIHdvdWxkXG4gICAgLy8gY2hhbmdlIHRoZSBoYXNoIG9uIGV2ZXJ5IGJ1aWxkIGFuZCBkaXNhYmxlIHRoZSBjYWNoZSBwZXJtYW5lbnRseS5cbiAgICBjb25zdCBwcm9qZWN0UmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LnJvb3REaXJQYXRoLCBwcm9qZWN0LmRpclBhdGgpO1xuICAgIGNvbnN0IGV4cGxpY2l0T3V0cHV0UGF0aHMgPSAoZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBbXSkubWFwKChvdXRwdXRQYXRoKSA9PlxuICAgICAgcGF0aC5qb2luKHByb2plY3RSZWxhdGl2ZURpclBhdGgsIG91dHB1dFBhdGgpXG4gICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEVudHJpZXMgPSBub3JtYWxpemVkRW50cmllcy5maWx0ZXIoKHsgZmlsZVBhdGgsIGhhc2hQYXRoIH0pID0+IHtcbiAgICAgIGNvbnN0IGRpcmVjdG9yeVNlZ21lbnRzID0gaGFzaFBhdGguc3BsaXQoJy8nKS5zbGljZSgwLCAtMSk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoZGlyZWN0b3J5U2VnbWVudHMuc29tZSgoc2VnbWVudCkgPT4gaW5jbHVkZURpck5hbWVzLmhhcyhzZWdtZW50KSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gaGFzaFBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFkaXJlY3RvcnlTZWdtZW50cy5zb21lKChzZWdtZW50KSA9PiBleGNsdWRlRGlyTmFtZXMuaGFzKHNlZ21lbnQpKSAmJlxuICAgICAgICAvLyBPbmx5IEVYUExJQ0lUTFkgZGVjbGFyZWQgb3V0cHV0cyBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgaW5wdXQgaGFzaC4gRGVmYXVsdCBjYW5kaWRhdGVzXG4gICAgICAgIC8vIChkaXN0L2J1aWxkLy5uZXh0L291dCkgYXJlIE5PVDogZ2l0aWdub3JlZCBhcnRpZmFjdHMgbmV2ZXIgYXBwZWFyIGluIGBnaXQgc3RhdHVzYFxuICAgICAgICAvLyBhbnl3YXksIGFuZCBhIG5vbi1pZ25vcmVkIGZpbGUgdGhlcmUgbWF5IGJlIGdlbnVpbmUgc291cmNlIChlLmcuIGJ1aWxkLyBzY3JpcHRzKSwgd2hvc2VcbiAgICAgICAgLy8gY2hhbmdlcyBtdXN0IGludmFsaWRhdGUgdGhlIGNhY2hlIOKAlCBjb3JyZWN0bmVzcyBvdmVyIGNhY2hlIGhpdHMuIFByb2plY3RzIGtlZXBpbmdcbiAgICAgICAgLy8gbm9uLWlnbm9yZWQgYXJ0aWZhY3RzIGluIHRob3NlIGRpcmVjdG9yaWVzIHNob3VsZCBnaXRpZ25vcmUgdGhlbSBvciBwYXNzIC0tb3V0cHV0LlxuICAgICAgICAhbWF0Y2hlc091dHB1dFBhdGgoZXhwbGljaXRPdXRwdXRQYXRocywgZmlsZVBhdGgpXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkuaGFzaFBhdGgpLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gVW50cmFja2VkIGZpbGVzIG5ldmVyIGFwcGVhciBpbiBgZ2l0IGRpZmZgLCBzbyBoYXNoIHRoZWlyIGNvbnRlbnRzIGRpcmVjdGx5LlxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZmlsdGVyZWRFbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnVudHJhY2tlZCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhc2gudXBkYXRlKGVudHJ5Lmhhc2hQYXRoKTtcbiAgICAgICAgaGFzaC51cGRhdGUoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCBlbnRyeS5maWxlUGF0aCkpKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgZmlsZSBtYXkgdmFuaXNoIGNvbmN1cnJlbnRseTsgdGhlIHRyYWNrZWQtc3RhdGUgZGlmZiBiZWxvdyBpcyB1bmFmZmVjdGVkLlxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrZWRQYXRocyA9IGZpbHRlcmVkRW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiAhZW50cnkudW50cmFja2VkKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5oYXNoUGF0aCk7XG4gICAgaWYgKHRyYWNrZWRQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIGBnaXQgZGlmZiBIRUFEIC0tYCB3aXRoIG5vIHBhdGhzcGVjIHdvdWxkIGRpZmYgRVZFUlkgZmlsZSwgbGV0dGluZyBleGNsdWRlZCBjaGFuZ2VzXG4gICAgICAvLyAoZG9jcywgdGVzdHMpIGludmFsaWRhdGUgdGhlIGNhY2hlLlxuICAgICAgcmVzb2x2ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBgZ2l0IGRpZmYgSEVBRGAgKG5vdCBwbGFpbiBgZ2l0IGRpZmZgKSBzbyBzdGFnZWQtb25seSBjaGFuZ2VzIGludmFsaWRhdGUgdGhlIGNhY2hlIHRvbztcbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGguXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICdIRUFEJywgJy0tJywgLi4udHJhY2tlZFBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgb25TaWduYWw/OiAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHZvaWQ7XG4gIG9taXRTaWxlbnRTdGFydD86IGJvb2xlYW47XG4gIHByZXNlcnZlQ29sb3I/OiBib29sZWFuO1xuICBwcm9jZXNzU2lsZW50T3V0cHV0PzogKG91dHB1dDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHByaW50UmF3T3V0cHV0PzogYm9vbGVhbjtcbiAgcHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5PzogYm9vbGVhbjtcbiAgc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zPzogbnVtYmVyO1xuICBzaWxlbnRTdWNjZXNzTWVzc2FnZT86IHN0cmluZztcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gIGV4aXRJZkZhaWxlZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVmZmVyZWRSdW5SZXN1bHQge1xuICBleGl0Q29kZTogbnVtYmVyO1xuICBvdXRwdXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+ICYgeyBzaWxlbnQ/OiBib29sZWFuIH0sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBpZiAoIShhcmd2LnNpbGVudCAmJiBvcHRzLm9taXRTaWxlbnRTdGFydCAmJiAhYXJndi5kcnlSdW4pKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgYXJndi5zaWxlbnQgPyAnQ29tbWFuZCcgOiAnU3RhcnQnKTtcbiAgfVxuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3Qgc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCA9IEJvb2xlYW4oXG4gICAgYXJndi5zaWxlbnQgJiYgKG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dCA/PyBvcHRzLnByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSlcbiAgKTtcbiAgbGV0IHdyb3RlU2lsZW50UHJvZ3Jlc3MgPSBmYWxzZTtcbiAgY29uc3QgcHJvZ3Jlc3NUaW1lciA9XG4gICAgYXJndi5zaWxlbnQgJiYgb3B0cy5zaWxlbnRQcm9ncmVzc0ludGVydmFsTXNcbiAgICAgID8gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcuJyk7XG4gICAgICAgICAgd3JvdGVTaWxlbnRQcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIH0sIG9wdHMuc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IChhcmd2LnNpbGVudCA/IHRydWUgOiB1bmRlZmluZWQpIH0pLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiBhcmd2LnNpbGVudCA/ICdwaXBlJyA6ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgbWVyZ2VPdXRBbmRFcnJvcjogc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHByaW50aW5nU3Rkb3V0OiBhcmd2LnNpbGVudCAmJiAhc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgb21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nOiBhcmd2LnNpbGVudCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgIGlmIChwcm9ncmVzc1RpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHByb2dyZXNzVGltZXIpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICBpZiAod3JvdGVTaWxlbnRQcm9ncmVzcykge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxuICBpZiAoc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCAmJiAoIW9wdHMucHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5IHx8IGV4aXRDb2RlICE9PSAwKSkge1xuICAgIGNvbnN0IG91dHB1dCA9IChvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQgPyBvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQocmV0LnN0ZG91dCkgOiByZXQuc3Rkb3V0KS50cmltKCk7XG4gICAgaWYgKG91dHB1dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFyZ3Yuc2lsZW50ICYmIGV4aXRDb2RlID09PSAwICYmIG9wdHMuc2lsZW50U3VjY2Vzc01lc3NhZ2UpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4ob3B0cy5zaWxlbnRTdWNjZXNzTWVzc2FnZSkpO1xuICB9XG4gIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgZXhpdENvZGUsIG9wdHMsIHsgc2lsZW50U3VjY2VzczogYXJndi5zaWxlbnQgfSk7XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChwYXJhbGxlbCknLCB0cnVlKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IHRydWUgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHByaW50aW5nU3Rkb3V0OiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgcHJpbnRpbmdTdGRlcnI6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSByZXQuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAob3V0ICYmICFvcHRzLnByaW50UmF3T3V0cHV0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8QnVmZmVyZWRSdW5SZXN1bHQ+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICAgIG91dHB1dDogJycsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyB0cnVlIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICByZXR1cm4ge1xuICAgICAgZXhpdENvZGU6IHJldC5zdGF0dXMgPz8gMSxcbiAgICAgIG91dHB1dDogcmV0LnN0ZG91dCxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHsgcHJpbnRhYmxlOiBzdHJpbmc7IHJ1bm5hYmxlOiBzdHJpbmcgfSB7XG4gIC8vIE5vIGAtLWJ1bmA6IGl0cyBub2RlLT5idW4gUEFUSCBzaGltIGxlYWtzIGludG8gZXZlcnkgY2hpbGQgcHJvY2VzcyBhbmQgYnJlYWtzIHRvb2xzIHJlcXVpcmluZ1xuICAvLyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpLlxuICBjb25zdCBwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVuID0gcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKC9QUklTTUEgZ2VuZXJhdGUoPyFcXHMrLS1uby1oaW50cykoPz1cXHN8JCkvZ3UsICdQUklTTUEgZ2VuZXJhdGUgLS1uby1oaW50cycpXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOIHJ1biAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiBydW4gJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1bikgcnVuYC5cbiAgICAucmVwbGFjZUFsbCgnWUFSTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ3lhcm4gcnVuICcpO1xuICBpZiAocHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIpIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIGJ1aWxkLXRzIHJ1bicsICdidW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdidW4gcnVuIGJ1biBydW4nLCAnYnVuIHJ1bicpXG4gICAgICAvLyBCZWNhdXNlIGJ1biBjYW4gcnVuIHNyYy9pbmRleC50cyBkaXJlY3RseS5cbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGApO1xuICBjb25zdCBydW5uYWJsZVNjcmlwdCA9IG5ld1NjcmlwdFxuICAgIC8vIEtlZXAgUGxheXdyaWdodCBhcyBhIHBhY2thZ2UtbWFuYWdlciBjb21tYW5kIGluc3RlYWQgb2YgcmVzb2x2aW5nIGl0IHRocm91Z2ggbm9kZV9tb2R1bGVzLy5iaW4uXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIXByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKTtcbiAgcmV0dXJuIHtcbiAgICBwcmludGFibGU6IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiAtLSAke3ByaW50YWJsZVNjcmlwdH1gLFxuICAgIHJ1bm5hYmxlOiBydW5uYWJsZVNjcmlwdCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPixcbiAgcHJpbnRPcHRpb25zOiB7IHNpbGVudFN1Y2Nlc3M/OiBib29sZWFuIH0gPSB7fVxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGlmIChwcmludE9wdGlvbnMuc2lsZW50U3VjY2VzcykgcmV0dXJuO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVFbnYoXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgb3B0czogT3B0aW9uc1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5ld0VudiA9IHsgLi4uZW52IH07XG4gIGlmIChvcHRzLmNpKSB7XG4gICAgbmV3RW52LkNJID0gJzEnO1xuICB9XG4gIGNvbmZpZ3VyZUNvbG9yRW52KG5ld0Vudiwgb3B0cy5wcmVzZXJ2ZUNvbG9yKTtcbiAgcmV0dXJuIG5ld0Vudjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIGNoaWxkLXByb2Nlc3MgY29sb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB3Yi1tYW5hZ2VkIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gZW52IFRoZSBjaGlsZC1wcm9jZXNzIGVudmlyb25tZW50IHRvIG11dGF0ZS5cbiAqIEBwYXJhbSBwcmVzZXJ2ZUNvbG9yIFdoZXRoZXIgd2Igc2hvdWxkIHByZXNlcnZlIGNvbG9ycyBmb3Igb3V0cHV0IHRoYXQgaXQgY2FwdHVyZXMgYW5kIHJlcHJpbnRzIHRvIGFuIGludGVyYWN0aXZlIFRUWS5cbiAqL1xuZnVuY3Rpb24gY29uZmlndXJlQ29sb3JFbnYoZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBwcmVzZXJ2ZUNvbG9yPzogYm9vbGVhbik6IHZvaWQge1xuICBpZiAoZW52Lk5PX0NPTE9SICE9PSB1bmRlZmluZWQgfHwgcHJlc2VydmVDb2xvciA9PT0gZmFsc2UpIHtcbiAgICAvLyBOT19DT0xPUiBhbmQgcHJlc2VydmVDb2xvcj1mYWxzZSBhcmUgZXhwbGljaXQgbm8tY29sb3IgY2hvaWNlcywgc28gaW5oZXJpdGVkIEZPUkNFX0NPTE9SIG11c3Qgbm90IGxlYWsgdGhyb3VnaC5cbiAgICBkZWxldGUgZW52LkZPUkNFX0NPTE9SO1xuICB9IGVsc2UgaWYgKHByZXNlcnZlQ29sb3IgJiYgcHJvY2Vzcy5zdGRvdXQuaXNUVFkpIHtcbiAgICBlbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGNoZWNrRW52QnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgY2hlY2tFbnZDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBjaGVja0VudkJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY2hlY2stZW52JyxcbiAgZGVzY3JpYmU6XG4gICAgJ1ZlcmlmeSB0aGF0IGV2ZXJ5IGZub3gtZGVjbGFyZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHNlY3JldCByZXNvbHZlcyBmb3IgdGhlIGN1cnJlbnQgV0JfRU5WLiBQcmVmaXggc2NyaXB0cyB0aGF0IHdyaXRlIHRvIHJlbW90ZSBlbnZpcm9ubWVudHMgd2l0aCB0aGlzIGNvbW1hbmQgdG8gZmFpbCBmYXN0IG9uIG1pc3Npbmcgc2VjcmV0cy4nLFxuICBidWlsZGVyOiBjaGVja0VudkJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGNoZWNrRW52KGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrRW52KFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgY2hlY2tFbnZCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICBjb25zb2xlLmluZm8oJ05vIGZub3gudG9tbCBmb3VuZDsgbm90aGluZyB0byBjaGVjay4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSZWFkaW5nIHByb2plY3QuZW52IHJlc29sdmVzIGFuZCB2YWxpZGF0ZXMgV0JfRU5WIChjb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYpLCBzbyB0aGUgcHJvZmlsZVxuICAvLyBiZWxvdyBpcyB0aGUgc2FtZSBvbmUgZXZlcnkgb3RoZXIgd2IgY29tbWFuZCB3b3VsZCBsb2FkLlxuICBjb25zdCBwcm9maWxlID0gcHJvamVjdC5lbnYuV0JfRU5WIHx8ICdkZXZlbG9wbWVudCc7XG4gIC8vIGAtLWlmLW1pc3NpbmcgZXJyb3JgIG1ha2VzIHVucmVzb2x2YWJsZSBzZWNyZXRzIChlLmcuIGEgbWlzc2luZyBhZ2UgaWRlbnRpdHkpIGEgaGFyZCBmYWlsdXJlLFxuICAvLyB1bmxpa2UgdGhlIHRvbGVyYW50IGRlZmF1bHQgdXNlZCBmb3Igb3JkaW5hcnkgZW52IGxvYWRpbmcuXG4gIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgIGBmbm94IGV4cG9ydCAtLWFsbCAtLWZvcm1hdCBqc29uIC0tbm8tZGFlbW9uIC0taWYtbWlzc2luZyBlcnJvciAtLXByb2ZpbGUgJHtwcm9maWxlfSA+IC9kZXYvbnVsbGAsXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBGYWlsZWQgdG8gcmVzb2x2ZSBmbm94LWRlY2xhcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgcHJvZmlsZSBcIiR7cHJvZmlsZX1cIi5gKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICBjb25zb2xlLmluZm8oYEFsbCBmbm94LWRlY2xhcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyByZXNvbHZlIGZvciBwcm9maWxlIFwiJHtwcm9maWxlfVwiLmApO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYsIG5vcm1hbGl6ZVNjcmlwdCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBGT1JDRV9LSUxMX0RFTEFZX01TID0gNTAwMDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2tpbGwtb3RoZXJzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGV4aXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdraWxsLW90aGVycy1vbi1mYWlsJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGZhaWxzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHN1Y2Nlc3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RlZmluZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gY3JpdGVyaWEnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFsnYWxsJywgJ2ZpcnN0J10sXG4gICAgZGVmYXVsdDogJ2FsbCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ29tbWFuZHMgdG8gcnVuIGNvbmN1cnJlbnRseScsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmludGVyZmFjZSBSdW5Db25jdXJyZW50bHlPcHRpb25zIHtcbiAgY29tbWFuZHM6IHN0cmluZ1tdO1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBraWxsT3RoZXJzOiBib29sZWFuO1xuICBraWxsT3RoZXJzT25GYWlsOiBib29sZWFuO1xuICBzdWNjZXNzOiAnYWxsJyB8ICdmaXJzdCc7XG4gIGNpPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmN1cnJlbnRseUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdjb25jdXJyZW50bHkgPGNvbW1hbmRzLi4uPicsXG4gIGRlc2NyaWJlOiAnUnVuIGNvbW1hbmRzIGNvbmN1cnJlbnRseScsXG4gIGJ1aWxkZXI6IHsgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsIC4uLmJ1aWxkZXIsIC4uLmFyZ3VtZW50c0J1aWxkZXIgfSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1hbmRzID0gKGFyZ3YuY29tbWFuZHMgPz8gW10pLm1hcChTdHJpbmcpLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAoY29tbWFuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gY29tbWFuZHMgcHJvdmlkZWQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bkNvbmN1cnJlbnRseSh7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBraWxsT3RoZXJzOiBhcmd2LmtpbGxPdGhlcnMgPz8gZmFsc2UsXG4gICAgICAgIGtpbGxPdGhlcnNPbkZhaWw6IGFyZ3Yua2lsbE90aGVyc09uRmFpbCA/PyBmYWxzZSxcbiAgICAgICAgc3VjY2VzczogYXJndi5zdWNjZXNzLFxuICAgICAgICBjaTogdHlwZW9mIGFyZ3YuY2kgPT09ICdib29sZWFuJyA/IGFyZ3YuY2kgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Db25jdXJyZW50bHkob3B0aW9uczogUnVuQ29uY3VycmVudGx5T3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGNoaWxkcmVuID0gb3B0aW9ucy5jb21tYW5kcy5tYXAoKGNvbW1hbmQpID0+XG4gICAgY2hpbGRfcHJvY2Vzcy5zcGF3bihub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgb3B0aW9ucy5wcm9qZWN0KS5ydW5uYWJsZSwge1xuICAgICAgY3dkOiBvcHRpb25zLnByb2plY3QuZGlyUGF0aCxcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYob3B0aW9ucy5wcm9qZWN0LmVudiwgeyBjaTogb3B0aW9ucy5jaSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KVxuICApO1xuXG4gIGxldCBzdG9wcGluZyA9IGZhbHNlO1xuICBsZXQgaW50ZXJydXB0ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBsZXQgZmlyc3RSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0b3BSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZm9yY2VLaWxsUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBjb25zdCByZXN1bHRzID0gQXJyYXkuZnJvbTxudW1iZXIgfCB1bmRlZmluZWQ+KHsgbGVuZ3RoOiBjaGlsZHJlbi5sZW5ndGggfSk7XG4gIGNvbnN0IHdhaXRGb3JFeGl0UHJvbWlzZXMgPSBjaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHNldHRsZSA9IChleGl0Q29kZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG5cbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0gZXhpdENvZGU7XG4gICAgICAgIGZpcnN0UmVzdWx0ID8/PSBleGl0Q29kZTtcblxuICAgICAgICBpZiAoIXN0b3BwaW5nICYmIHNob3VsZFN0b3BPdGhlcnMoZXhpdENvZGUsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgc3RvcFJlc3VsdCA9IGV4aXRDb2RlO1xuICAgICAgICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICAgICAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCAnU0lHVEVSTScpKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgICAgIHNldHRsZSgxKTtcbiAgICAgIH0pO1xuICAgICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgc2V0dGxlKGdldEV4aXRDb2RlKGNvZGUgPz8gdW5kZWZpbmVkLCBzaWduYWwgPz8gdW5kZWZpbmVkKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3Qgc3RvcEFsbCA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgaW50ZXJydXB0ZWRTaWduYWwgPz89IHNpZ25hbDtcbiAgICBpZiAoc3RvcHBpbmcpIHJldHVybjtcblxuICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCBzaWduYWwpKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lnaW50ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR0lOVCcpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWd0ZXJtID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1RFUk0nKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lncXVpdCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdRVUlUJyk7XG4gIH07XG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgcHJvY2Vzcy5vbignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB0cnkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3JFeGl0UHJvbWlzZXMpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGZvcmNlS2lsbFByb21pc2VzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIH1cblxuICBpZiAoaW50ZXJydXB0ZWRTaWduYWwpIHtcbiAgICByZXR1cm4gZ2V0RXhpdENvZGUodW5kZWZpbmVkLCBpbnRlcnJ1cHRlZFNpZ25hbCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnKSB7XG4gICAgcmV0dXJuIGZpcnN0UmVzdWx0ID8/IDE7XG4gIH1cbiAgaWYgKHN0b3BSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdG9wUmVzdWx0O1xuICB9XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpdENvZGUoY29kZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjb2RlO1xuICB9XG4gIGlmIChzaWduYWwgJiYgc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSB7XG4gICAgcmV0dXJuIDEyOCArIGNvbnN0YW50cy5zaWduYWxzW3NpZ25hbF07XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN0b3BPdGhlcnMoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIG9wdGlvbnM6IFBpY2s8UnVuQ29uY3VycmVudGx5T3B0aW9ucywgJ2tpbGxPdGhlcnMnIHwgJ2tpbGxPdGhlcnNPbkZhaWwnIHwgJ3N1Y2Nlc3MnPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcgfHwgb3B0aW9ucy5raWxsT3RoZXJzIHx8IChvcHRpb25zLmtpbGxPdGhlcnNPbkZhaWwgJiYgZXhpdENvZGUgIT09IDApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmb3JjZUtpbGxQaWRzID0gc2lnbmFsUGlkcyh0b0NoaWxkUGlkcyhjaGlsZHJlbiksIHNpZ25hbCk7XG4gIGlmIChmb3JjZUtpbGxQaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGlmIChhd2FpdCB3YWl0Rm9yRm9yY2VLaWxsKGZvcmNlS2lsbFBpZHMpKSB7XG4gICAgc2lnbmFsUGlkcyhmb3JjZUtpbGxQaWRzLCAnU0lHS0lMTCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRQaWRzKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdKTogbnVtYmVyW10ge1xuICByZXR1cm4gY2hpbGRyZW4uZmxhdE1hcCgoY2hpbGQpID0+IChjaGlsZC5waWQgPT09IHVuZGVmaW5lZCA/IFtdIDogW2NoaWxkLnBpZF0pKTtcbn1cblxuZnVuY3Rpb24gc2lnbmFsUGlkcyhwaWRzOiByZWFkb25seSBudW1iZXJbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IG51bWJlcltdIHtcbiAgY29uc3Qgc2lnbmFsZWRQaWRzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBpZCBvZiBwaWRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICgha2lsbFByb2Nlc3NHcm91cChwaWQsIHNpZ25hbCkpIGNvbnRpbnVlO1xuXG4gICAgICBzaWduYWxlZFBpZHMucHVzaChwaWQpO1xuICAgICAgdHJlZUtpbGwocGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBraWxsIGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2lnbmFsZWRQaWRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yRm9yY2VLaWxsKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEZPUkNFX0tJTExfREVMQVlfTVM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICBpZiAocGlkcy5ldmVyeShpc1Byb2Nlc3NHcm91cEdvbmUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCBzbGVlcChNYXRoLm1pbigxMDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSkpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1Byb2Nlc3NHcm91cEdvbmUocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgMCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG5mdW5jdGlvbiBraWxsUHJvY2Vzc0dyb3VwKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsIHNpZ25hbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5jb25zdCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUgPSAnbGl0ZXN0cmVhbS55bWwnO1xuY29uc3QgREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4sIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnUGF0aCkgcmV0dXJuIGAtY29uZmlnIFwiJHtjb25maWdQYXRofVwiYDtcblxuICBjb25zdCBsb2NhbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbENvbmZpZ1BhdGgpKSByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xuICBpZiAoZnMuZXhpc3RzU3luYyhERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgpKSByZXR1cm4gYC1jb25maWcgJHtERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEh9YDtcbiAgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aCwgaXNQcm9qZWN0RW52aXJvbm1lbnQsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgeyBidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQsIGdldEQxRGF0YWJhc2VOYW1lLCBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgeyBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uIH0gZnJvbSAnLi9saXRlc3RyZWFtLmpzJztcblxuY2xhc3MgRHJpenpsZVNjcmlwdHMge1xuICBjbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0LCAnY2xlYW51cC1saXRlc3RyZWFtJyk7XG4gICAgY29uc3Qgd2FsQ2hlY2twb2ludENvbW1hbmQgPSBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF0gJiYgY29tbWFuZCAtdiBzcWxpdGUzID4vZGV2L251bGw7IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBzcWxpdGUzIFwiJHtkYlBhdGh9XCI7IGZpYDtcbiAgICByZXR1cm4gYCR7d2FsQ2hlY2twb2ludENvbW1hbmR9OyBybSAtZiBcIiR7ZGJQYXRofVwiLiogXCIke2RiUGF0aH1cIi0qOyBybSAtUmYgXCIke3BhdGguZGlybmFtZShkYlBhdGgpfS8uJHtwYXRoLmJhc2VuYW1lKGRiUGF0aCl9XCIqIHx8IHRydWVgO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3QgZDFEYXRhYmFzZU5hbWUgPSBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0KTtcbiAgICBpZiAoZDFEYXRhYmFzZU5hbWUpIHtcbiAgICAgIC8vIFJlbW92ZSBvbmx5IHRoZSBEMSBzdWJ0cmVlIHNvIHRoYXQgb3RoZXIgbG9jYWxseS1wZXJzaXN0ZWQgYmluZGluZ3MgKEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzKSBzdXJ2aXZlLFxuICAgICAgLy8gdGhlbiByZS1tYXRlcmlhbGl6ZSB0aGUgRDEgU1FMaXRlIGZpbGUuIEl0cyBwYXRoIGlzIGRldGVybWluaXN0aWMsIHNvIGEgREFUQUJBU0VfVVJMIGV4cG9ydGVkXG4gICAgICAvLyBiZWZvcmUgdGhlIHJlbW92YWwgc3RheXMgdmFsaWQuXG4gICAgICByZXR1cm4gYHJtIC1SZiBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfS92My9kMVwiICYmICR7YnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kKHByb2plY3QsIGQxRGF0YWJhc2VOYW1lKX0gJiYgJHt0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcmVtb3ZlQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpO1xuICAgIGlmICghcmVtb3ZlQ29tbWFuZCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgcmVzZXQgc3VwcG9ydHMgRHJpenpsZSBvbmx5IHdoZW4gZmlsZTogREFUQUJBU0VfVVJMIGlzIHNldC4nICYmIGV4aXQgMVwiO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtyZW1vdmVDb21tYW5kfSAmJiAke3RoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyl9YDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VlZENvbW1hbmQgPSB0aGlzLnNlZWQocHJvamVjdCk7XG4gICAgY29uc3QgbWlncmF0ZUNvbW1hbmQgPSB0aGlzLmRlcGxveShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gICAgcmV0dXJuIHNlZWRDb21tYW5kID09PSAndHJ1ZScgPyBtaWdyYXRlQ29tbWFuZCA6IGAke21pZ3JhdGVDb21tYW5kfSAmJiAke3NlZWRDb21tYW5kfWA7XG4gIH1cblxuICBtaWdyYXRlRm9yU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgaWYgKGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgJiYgKGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpIHx8IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzZXQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIGRlcGxveShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgbWlncmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdkZXBsb3ktZm9yY2UnKTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiRmFtaWx5Q29tbWFuZChkYlBhdGgpO1xuICAgIGNvbnN0IGxpdGVzdHJlYW1Db25maWdPcHRpb24gPSBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QpO1xuICAgIC8vIFRoZSBlbnZpcm9ubWVudCBhc3NpZ25tZW50IG11c3QgZ28gdGhyb3VnaCBidWlsZERyaXp6bGVLaXRDb21tYW5kOiBwcmVmaXhpbmcgaXRzXG4gICAgLy8gcG9zc2libHktcGFyZW50aGVzaXplZCByZXN1bHQgd2l0aCBgQUxMT1dfVE9fU0tJUF9TRUVEPTBgIHdvdWxkIGJlIGEgc2hlbGwgc3ludGF4IGVycm9yLlxuICAgIGNvbnN0IG1pZ3JhdGVXaXRoU2VlZENvbW1hbmQgPSBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsICdtaWdyYXRlJywgJ0FMTE9XX1RPX1NLSVBfU0VFRD0wJyk7XG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07ICR7dGhpcy5kZXBsb3kocHJvamVjdCl9ICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlICR7bGl0ZXN0cmVhbUNvbmZpZ09wdGlvbn0gLW8gXCIke2RiUGF0aH1cIiBcIiR7ZGJQYXRofVwiICYmIGxzIC1haGwgXCIke2RiUGF0aH1cIiAmJiAke21pZ3JhdGVXaXRoU2VlZENvbW1hbmR9YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdsaXN0LWJhY2t1cHMnKTtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4ICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gXCIke2RiUGF0aH1cImA7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZywgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ3Jlc3RvcmUnKTtcbiAgICByZXR1cm4gYCR7YnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKG91dHB1dFBhdGgpfTsgbGl0ZXN0cmVhbSByZXN0b3JlICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gLW8gXCIke291dHB1dFBhdGh9XCIgXCIke2RiUGF0aH1cImA7XG4gIH1cblxuICBnZW5lcmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgZ2VuZXJhdGUgJHthZGRpdGlvbmFsT3B0aW9uc31gLnRyaW0oKSk7XG4gIH1cblxuICBtaWdyYXRlRGV2KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5zZWVkKSByZXR1cm4gJ1lBUk4gcnVuIHNlZWQnO1xuICAgIGNvbnN0IGRlZmF1bHRTZWVkUGF0aCA9IHBhdGguam9pbignZGInLCAnc2VlZC50cycpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRlZmF1bHRTZWVkUGF0aCkpKSB7XG4gICAgICByZXR1cm4gcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgQlVOICR7ZGVmYXVsdFNlZWRQYXRofWAgOiBgQlVOIGJ1aWxkLXRzIHJ1biAke2RlZmF1bHRTZWVkUGF0aH1gO1xuICAgIH1cbiAgICByZXR1cm4gJ3RydWUnO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHJldHVybiBcImVjaG8gJ3diIGRiIHN0dWRpbyBmb3IgRHJpenpsZSBkb2VzIG5vdCBzdXBwb3J0IGRiLXVybC1vci1wYXRoLicgJiYgZXhpdCAxXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgYHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0OiBQcm9qZWN0LCBhcmdzOiBzdHJpbmcsIGVudmlyb25tZW50QXNzaWdubWVudCA9ICcnKTogc3RyaW5nIHtcbiAgY29uc3QgY29tbWFuZCA9IGAke2Vudmlyb25tZW50QXNzaWdubWVudCAmJiBgJHtlbnZpcm9ubWVudEFzc2lnbm1lbnR9IGB9WUFSTiBkcml6emxlLWtpdCAke2FyZ3N9YDtcbiAgLy8gQSBjYWxsZXItc3VwcGxpZWQgLS1jb25maWcgcmVzb2x2ZXMgYWdhaW5zdCB0aGUgcHJvamVjdCBkaXJlY3RvcnksIHNvIHRoZSBjd2QgbXVzdCBzdGF5IHRoZXJlLlxuICByZXR1cm4gYXJncy5pbmNsdWRlcygnLS1jb25maWcnKSA/IGNvbW1hbmQgOiB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdCwgY29tbWFuZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdDogUHJvamVjdCwgY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29uZmlnID0gZmluZERyaXp6bGVDb25maWcocHJvamVjdCk7XG4gIC8vIGRyaXp6bGUta2l0IHJlc29sdmVzIHJlbGF0aXZlIHBhdGhzIGluIGl0cyBjb25maWcgYWdhaW5zdCB0aGUgY3dkLCBzbyB0aGUgY29tbWFuZCBtdXN0IHJ1blxuICAvLyBpbiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgZHJpenpsZS5jb25maWcuKiBldmVuIHdoZW4gbW9ub3JlcG8gcGFja2FnZXMgc2hhcmUgaXQgYXQgdGhlIHJvb3QuXG4gIHJldHVybiBjb25maWcgJiYgY29uZmlnLmRpclBhdGggIT09IHByb2plY3QuZGlyUGF0aFxuICAgID8gYCgke2J1aWxkU2hlbGxDb21tYW5kKFsnY2QnLCBjb25maWcuZGlyUGF0aF0pfSAmJiAke2NvbW1hbmR9KWBcbiAgICA6IGNvbW1hbmQ7XG59XG5cbi8qKlxuICogV2hldGhlciBkcml6emxlLWtpdCBpcyB0aGUgcHJvamVjdCdzIEQxIG1pZ3JhdGlvbiBtZWNoYW5pc20uIEEgZHJpenpsZS1vcm0gZGVwZW5kZW5jeSBhbG9uZSBpc1xuICogbm90IGEgcmVsaWFibGUgbWFya2VyOiBhIFdvcmtlciBtYXkgdXNlIEQxIG9ubHkgZm9yIGNhY2hpbmcgd2hpbGUgaXRzIGRyaXp6bGUgY29uZmlnIHRhcmdldHMgYW5cbiAqIHVucmVsYXRlZCBkYXRhYmFzZSAoZS5nLiBQb3N0Z3JlU1FMIHZpYSBIeXBlcmRyaXZlKSwgYW5kIHJ1bm5pbmcgYGRyaXp6bGUta2l0IG1pZ3JhdGVgIGFnYWluc3RcbiAqIHRoYXQgZGF0YWJhc2UgZHVyaW5nIGEgRDEgZGVwbG95IHdvdWxkIGJlIHdyb25nIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NDIpLlxuICogU28gcmVxdWlyZSBhbiBleHBsaWNpdCBtYXJrZXI6IGEgZHJpenpsZSBjb25maWcgd2hvc2UgZGlhbGVjdC9kcml2ZXIgdGFyZ2V0cyBzcWxpdGUsIGQxLWh0dHAsIG9yXG4gKiBkdXJhYmxlLXNxbGl0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXNEcml6emxlS2l0Rm9yRDEocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICBpZiAoIXByb2plY3QuaGFzRHJpenpsZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGNvbmZpZyA9IGZpbmREcml6emxlQ29uZmlnKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZykgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IHN0cmlwSnNDb21tZW50cyhmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCBjb25maWcuZmlsZU5hbWUpLCAndXRmOCcpKTtcbiAgICAvLyBTY2FuIG9ubHkgdGhlIGV4cG9ydGVkIGNvbmZpZydzIG9iamVjdCBsaXRlcmFsOiBkcml6emxlLWtpdCBjb25zdW1lcyB0aGUgZGVmYXVsdCBleHBvcnQsXG4gICAgLy8gYW5kIG1hdGNoaW5nIG90aGVyIHRleHQgKGFuIHVudXNlZCBzcWxpdGUtc2hhcGVkIGNvbnN0YW50IGFib3ZlIHRoZSBleHBvcnQsIG9yIG1hcmtlci1saWtlXG4gICAgLy8gc3RyaW5nIGNvbnRlbnQgaW4gc3RhdGVtZW50cyBhZnRlciBpdCkgd291bGQgc2VsZWN0IHRoZSB3cm9uZyBtaWdyYXRpb24gbWVjaGFuaXNtLlxuICAgIC8vIFBPU0lUSU9OUyAoZXhwb3J0IG1hcmtlcnMsIGRlY2xhcmF0aW9ucykgYXJlIGxvY2F0ZWQgb24gYSBzdHJpbmctbWFza2VkIHZpZXcgb2YgdGhlIHNhbWVcbiAgICAvLyBsZW5ndGgsIHNvIGBleHBvcnQgZGVmYXVsdGAgaW5zaWRlIGEgc3RyaW5nIGxpdGVyYWwgY2Fubm90IG1pc2xlYWQgdGhlIHNlYXJjaC5cbiAgICBjb25zdCBtYXNrZWRDb250ZW50ID0gbWFza1N0cmluZ0NvbnRlbnRzKGNvbnRlbnQpO1xuICAgIGNvbnN0IGV4cG9ydEluZGljZXMgPSBbJ2V4cG9ydCBkZWZhdWx0JywgJ21vZHVsZS5leHBvcnRzJ11cbiAgICAgIC5tYXAoKG1hcmtlcikgPT4gbWFza2VkQ29udGVudC5pbmRleE9mKG1hcmtlcikpXG4gICAgICAuZmlsdGVyKChpbmRleCkgPT4gaW5kZXggIT09IC0xKTtcbiAgICBjb25zdCBleHBvcnRTdGFydEluZGV4ID0gZXhwb3J0SW5kaWNlcy5sZW5ndGggPiAwID8gTWF0aC5taW4oLi4uZXhwb3J0SW5kaWNlcykgOiAwO1xuICAgIGNvbnN0IG9iamVjdFNwYW4gPSBleHRyYWN0RXhwb3J0ZWRDb25maWdPYmplY3QoY29udGVudCwgbWFza2VkQ29udGVudCwgZXhwb3J0U3RhcnRJbmRleCk7XG4gICAgcmV0dXJuIG9iamVjdFNwYW4gIT09IHVuZGVmaW5lZCAmJiBkZWNsYXJlc1NxbGl0ZVRhcmdldChvYmplY3RTcGFuKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGhlIG9iamVjdCBsaXRlcmFsIHRoZSBleHBvcnQgYWN0dWFsbHkgZXZhbHVhdGVzIHRvOiBmb3IgYGV4cG9ydCBkZWZhdWx0IHsuLi59YCBvclxuICogYGV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7Li4ufSlgIHRoZSBmaXJzdCBiYWxhbmNlZCBvYmplY3QgYWZ0ZXIgdGhlIG1hcmtlciwgYW5kIGZvclxuICogYGV4cG9ydCBkZWZhdWx0IGNvbmZpZztgIHRoZSBpbml0aWFsaXplciBvZiB0aGF0IGlkZW50aWZpZXIncyBkZWNsYXJhdGlvbiDigJQgbmV2ZXIgdGhlIHdob2xlXG4gKiBmaWxlLCBzaW5jZSBhbiB1bnJlbGF0ZWQgb2JqZWN0IChlLmcuIGFuIHVudXNlZCBzcWxpdGUtc2hhcGVkIGNvbnN0YW50KSBtdXN0IG5vdCBiZSBzZWxlY3RlZC5cbiAqIFVuZGVmaW5lZCB3aGVuIHRoZSBleHByZXNzaW9uIGNhbm5vdCBiZSByZXNvbHZlZDsgd2IgZGVwbG95J3MgdW5tYW5hZ2VkLUQxIHdhcm5pbmcgY292ZXJzIHRoYXQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RFeHBvcnRlZENvbmZpZ09iamVjdChcbiAgY29udGVudDogc3RyaW5nLFxuICBtYXNrZWRDb250ZW50OiBzdHJpbmcsXG4gIGV4cG9ydFN0YXJ0SW5kZXg6IG51bWJlclxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZXhwb3J0ZWRFeHByZXNzaW9uID0gbWFza2VkQ29udGVudFxuICAgIC5zbGljZShleHBvcnRTdGFydEluZGV4KVxuICAgIC5yZXBsYWNlKC9eKD86ZXhwb3J0XFxzK2RlZmF1bHR8bW9kdWxlXFwuZXhwb3J0c1xccyo9KVxccyovLCAnJyk7XG4gIC8vIEFuIGlkZW50aWZpZXIgZXhwb3J0IG1heSBjYXJyeSBhIFR5cGVTY3JpcHQgdHlwZSBwb3N0Zml4IChgY29uZmlnIHNhdGlzZmllcyBDb25maWc7YCAvXG4gIC8vIGBjb25maWcgYXMgQ29uZmlnO2ApOyB0aGUgaWRlbnRpZmllciBpcyByZWNvZ25pemVkIEZJUlNUIHNvIGEgcG9zdGZpeCBjb250YWluaW5nIGEgVFlQRVxuICAvLyBsaXRlcmFsIChgc2F0aXNmaWVzIHsgZGlhbGVjdDogJ3NxbGl0ZScgfCAuLi4gfWApIGlzIG5ldmVyIG1pc3Rha2VuIGZvciB0aGUgcnVudGltZSBjb25maWcuXG4gIGNvbnN0IGlkZW50aWZpZXJNYXRjaCA9IC9eKFtBLVphLXpfJF1bXFx3JF0qKVxccyooPzpzYXRpc2ZpZXNcXGJ8YXNcXGJ8O3xcXG58JCkvLmV4ZWMoZXhwb3J0ZWRFeHByZXNzaW9uKTtcbiAgaWYgKCFpZGVudGlmaWVyTWF0Y2gpIHtcbiAgICBjb25zdCBicmFjZU9mZnNldCA9IG1hc2tlZENvbnRlbnQuc2xpY2UoZXhwb3J0U3RhcnRJbmRleCkuaW5kZXhPZigneycpO1xuICAgIGlmIChicmFjZU9mZnNldCA9PT0gLTEpIHJldHVybjtcbiAgICByZXR1cm4gZXh0cmFjdEZpcnN0QmFsYW5jZWRPYmplY3QoY29udGVudC5zbGljZShleHBvcnRTdGFydEluZGV4ICsgYnJhY2VPZmZzZXQpKTtcbiAgfVxuXG4gIC8vIGAkYCBpcyBsZWdhbCBpbiBpZGVudGlmaWVycyBidXQgYSByZWdleCBhbmNob3IsIHNvIGl0IG11c3QgYmUgZXNjYXBlZCBiZWZvcmUgaW50ZXJwb2xhdGlvbjtcbiAgLy8gYCg/IVtcXHckXSlgIChub3QgYFxcYmApIGVuZHMgdGhlIG1hdGNoIGJlY2F1c2UgYFxcYmAgbmV2ZXIgZmlyZXMgYWZ0ZXIgYSB0cmFpbGluZyBgJGAuXG4gIGNvbnN0IGVzY2FwZWRJZGVudGlmaWVyID0gaWRlbnRpZmllck1hdGNoWzFdIS5yZXBsYWNlQWxsKCckJywgU3RyaW5nLnJhd2BcXCRgKTtcbiAgY29uc3QgZGVjbGFyYXRpb25FbmRJbmRleCA9IGZpbmRNb2R1bGVTY29wZURlY2xhcmF0aW9uRW5kKG1hc2tlZENvbnRlbnQsIGVzY2FwZWRJZGVudGlmaWVyKTtcbiAgaWYgKGRlY2xhcmF0aW9uRW5kSW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAvLyBUaGUgaW5pdGlhbGl6ZXIgbXVzdCBiZWxvbmcgdG8gVEhJUyBkZWNsYXJhdGlvbiAoYSB0eXBlIGFubm90YXRpb24gbWF5IHByZWNlZGUgdGhlIGA9YCk7IGFuXG4gIC8vIHVuaW5pdGlhbGl6ZWQgYGxldCBjb25maWc7YCBzdGF5cyB1bnJlc29sdmVkIGluc3RlYWQgb2YgZ3JhYmJpbmcgYSBsYXRlciBzdGF0ZW1lbnQncyBgPWAuXG4gIGNvbnN0IGFzc2lnbm1lbnRNYXRjaCA9IC9eXFxzKig/OjpbXj07XFxuXSopPz0vLmV4ZWMobWFza2VkQ29udGVudC5zbGljZShkZWNsYXJhdGlvbkVuZEluZGV4KSk7XG4gIGlmICghYXNzaWdubWVudE1hdGNoKSByZXR1cm47XG4gIHJldHVybiBleHRyYWN0Rmlyc3RCYWxhbmNlZE9iamVjdChjb250ZW50LnNsaWNlKGRlY2xhcmF0aW9uRW5kSW5kZXggKyBhc3NpZ25tZW50TWF0Y2hbMF0ubGVuZ3RoKSk7XG59XG5cbi8qKlxuICogVGhlIGVuZCBpbmRleCBvZiB0aGUgaWRlbnRpZmllcidzIGRlY2xhcmF0aW9uIGF0IGJyYWNlIGRlcHRoIFpFUk8gKG1vZHVsZSBzY29wZSk6IGEgc2FtZS1uYW1lZFxuICogZGVjbGFyYXRpb24gaW5zaWRlIGEgZnVuY3Rpb24gYm9keSBtdXN0IG5vdCBzaGFkb3cgdGhlIGJpbmRpbmcgdGhlIGV4cG9ydCByZWZlcmVuY2VzLCBhbmRcbiAqIGluZGVudGF0aW9uIGlzIG5vIHNjb3BlIHNpZ25hbCDigJQgZGVwdGggb3ZlciB0aGUgc3RyaW5nLW1hc2tlZCBjb250ZW50IGlzLlxuICovXG5mdW5jdGlvbiBmaW5kTW9kdWxlU2NvcGVEZWNsYXJhdGlvbkVuZChtYXNrZWRDb250ZW50OiBzdHJpbmcsIGVzY2FwZWRJZGVudGlmaWVyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWNsYXJhdGlvblJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICBTdHJpbmcucmF3YCg/PCFbXFx3JF0pKD86ZXhwb3J0XFxzKyk/KD86Y29uc3R8bGV0fHZhcilcXHMrJHtlc2NhcGVkSWRlbnRpZmllcn0oPyFbXFx3JF0pYCxcbiAgICAnZydcbiAgKTtcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IHNjYW5JbmRleCA9IDA7XG4gIGZvciAobGV0IG1hdGNoID0gZGVjbGFyYXRpb25SZWdleC5leGVjKG1hc2tlZENvbnRlbnQpOyBtYXRjaDsgbWF0Y2ggPSBkZWNsYXJhdGlvblJlZ2V4LmV4ZWMobWFza2VkQ29udGVudCkpIHtcbiAgICBmb3IgKDsgc2NhbkluZGV4IDwgbWF0Y2guaW5kZXg7IHNjYW5JbmRleCsrKSB7XG4gICAgICBjb25zdCBjaGFyID0gbWFza2VkQ29udGVudFtzY2FuSW5kZXhdO1xuICAgICAgaWYgKGNoYXIgPT09ICd7JykgZGVwdGgrKztcbiAgICAgIGVsc2UgaWYgKGNoYXIgPT09ICd9JykgZGVwdGgtLTtcbiAgICB9XG4gICAgaWYgKGRlcHRoID09PSAwKSByZXR1cm4gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgdGhlIENPTlRFTlRTIG9mIHN0cmluZyBsaXRlcmFscyB3aXRoIHNwYWNlcyAoc2FtZSBsZW5ndGgsIG5ld2xpbmVzIGtlcHQpLCBzbyBwb3NpdGlvblxuICogc2VhcmNoZXMgb3ZlciB0aGUgcmVzdWx0IGNhbm5vdCBtYXRjaCB0ZXh0IGluc2lkZSBzdHJpbmdzIHdoaWxlIGFsbCBpbmRleGVzIHN0aWxsIG1hcCAxOjEgdG9cbiAqIHRoZSBvcmlnaW5hbCBjb250ZW50LlxuICovXG5mdW5jdGlvbiBtYXNrU3RyaW5nQ29udGVudHMoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgc3RyaW5nRGVsaW1pdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgaWYgKHN0cmluZ0RlbGltaXRlcikge1xuICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykge1xuICAgICAgICByZXN1bHQgKz0gJyAgJztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gc3RyaW5nRGVsaW1pdGVyIHx8IChzdHJpbmdEZWxpbWl0ZXIgIT09ICdgJyAmJiBjaGFyID09PSAnXFxuJykpIHtcbiAgICAgICAgc3RyaW5nRGVsaW1pdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gY2hhciA9PT0gJ1xcbicgPyAnXFxuJyA6ICcgJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHN0cmluZ0RlbGltaXRlciA9IGNoYXI7XG4gICAgcmVzdWx0ICs9IGNoYXI7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdHJpbmctYXdhcmUgc2NhbiBmb3IgdGhlIG1hcmtlcnMgaW5kaWNhdGluZyB0aGUgY29uZmlnIG1hbmFnZXMgYSAoQ2xvdWRmbGFyZSBEMSBjb21wYXRpYmxlKVxuICogU1FMaXRlIGRhdGFiYXNlIOKAlCBhIGBkaWFsZWN0OiAnc3FsaXRlJ2AsIGBkcml2ZXI6ICdkMS1odHRwJ2AsIG9yIGBkcml2ZXI6ICdkdXJhYmxlLXNxbGl0ZSdgXG4gKiBQUk9QRVJUWSAocGxhaW4gb3IgcXVvdGVkIGtleSkuIEtleXMgYXJlIG9ubHkgcmVjb2duaXplZCBpbiBjb2RlIHBvc2l0aW9uLCBzbyBtYXJrZXItbGlrZSB0ZXh0XG4gKiBlbWJlZGRlZCBpbiB1bnJlbGF0ZWQgc3RyaW5nIHZhbHVlcyAoZS5nLiBhIHNjaGVtYSBwYXRoKSBjYW5ub3QgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVzU3FsaXRlVGFyZ2V0KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZ3MoY29udGVudCk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0b2tlbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdITtcbiAgICBsZXQga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHZhbHVlVG9rZW5JbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0b2tlbi50eXBlID09PSAnY29kZScpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gLyg/Ol58W1xcc3ssKF0pKGRpYWxlY3R8ZHJpdmVyKVxccyo6XFxzKiQvLmV4ZWModG9rZW4udmFsdWUpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGtleSA9IG1hdGNoWzFdO1xuICAgICAgICB2YWx1ZVRva2VuSW5kZXggPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0b2tlbi52YWx1ZSA9PT0gJ2RpYWxlY3QnIHx8IHRva2VuLnZhbHVlID09PSAnZHJpdmVyJykge1xuICAgICAgLy8gQSBxdW90ZWQga2V5OiB0aGUgc3Vycm91bmRpbmcgY29kZSB0b2tlbnMgbXVzdCBmb3JtIGEgcHJvcGVydHkgcG9zaXRpb24gKGB7YC9gLGAgYmVmb3JlLFxuICAgICAgLy8gYDpgIGFmdGVyKS5cbiAgICAgIGNvbnN0IHByZXZpb3VzVG9rZW4gPSB0b2tlbnNbaW5kZXggLSAxXTtcbiAgICAgIGNvbnN0IG5leHRUb2tlbiA9IHRva2Vuc1tpbmRleCArIDFdO1xuICAgICAgaWYgKFxuICAgICAgICBwcmV2aW91c1Rva2VuPy50eXBlID09PSAnY29kZScgJiZcbiAgICAgICAgL1t7LChdXFxzKiQvLnRlc3QocHJldmlvdXNUb2tlbi52YWx1ZSkgJiZcbiAgICAgICAgbmV4dFRva2VuPy50eXBlID09PSAnY29kZScgJiZcbiAgICAgICAgL15cXHMqOlxccyokLy50ZXN0KG5leHRUb2tlbi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBrZXkgPSB0b2tlbi52YWx1ZTtcbiAgICAgICAgdmFsdWVUb2tlbkluZGV4ID0gaW5kZXggKyAyO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwgdmFsdWVUb2tlbkluZGV4ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgdmFsdWVUb2tlbiA9IHRva2Vuc1t2YWx1ZVRva2VuSW5kZXhdO1xuICAgIGlmICh2YWx1ZVRva2VuPy50eXBlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgaWYgKGtleSA9PT0gJ2RpYWxlY3QnICYmIHZhbHVlVG9rZW4udmFsdWUgPT09ICdzcWxpdGUnKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoa2V5ID09PSAnZHJpdmVyJyAmJiAodmFsdWVUb2tlbi52YWx1ZSA9PT0gJ2QxLWh0dHAnIHx8IHZhbHVlVG9rZW4udmFsdWUgPT09ICdkdXJhYmxlLXNxbGl0ZScpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU3BsaXQgaW50byBhbHRlcm5hdGluZyBjb2RlIGFuZCBzdHJpbmctbGl0ZXJhbC1jb250ZW50IHRva2VucyAocXVvdGVzIGV4Y2x1ZGVkKS4gVGhlIGlucHV0IGlzXG4gKiBhbHJlYWR5IGNvbW1lbnQtZnJlZSDigJQgdXNlc0RyaXp6bGVLaXRGb3JEMSBydW5zIHN0cmlwSnNDb21tZW50cyBiZWZvcmUgYW55IHNjYW5uaW5nIOKAlCBzb1xuICogY29tbWVudCBkZWxpbWl0ZXJzIG5lZWQgbm8gaGFuZGxpbmcgaGVyZSAoYSBjb21tZW50ZWQtb3V0IGAvLyBkaWFsZWN0OiAnc3FsaXRlJ2AgY2FuIG5ldmVyXG4gKiByZWFjaCB0aGlzIHRva2VuaXplcikuXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplU3RyaW5ncyhjb250ZW50OiBzdHJpbmcpOiB7IHR5cGU6ICdjb2RlJyB8ICdzdHJpbmcnOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gIGNvbnN0IHRva2VuczogeyB0eXBlOiAnY29kZScgfCAnc3RyaW5nJzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcbiAgbGV0IGNvZGUgPSAnJztcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvbnRlbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaW5kZXhdITtcbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHtcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogJ2NvZGUnLCB2YWx1ZTogY29kZSB9KTtcbiAgICAgIGNvZGUgPSAnJztcbiAgICAgIGxldCB2YWx1ZSA9ICcnO1xuICAgICAgaW5kZXgrKztcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQubGVuZ3RoICYmIGNvbnRlbnRbaW5kZXhdICE9PSBjaGFyKSB7XG4gICAgICAgIGlmIChjb250ZW50W2luZGV4XSA9PT0gJ1xcXFwnKSBpbmRleCsrO1xuICAgICAgICB2YWx1ZSArPSBjb250ZW50W2luZGV4XSA/PyAnJztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogJ3N0cmluZycsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvZGUgKz0gY2hhcjtcbiAgfVxuICB0b2tlbnMucHVzaCh7IHR5cGU6ICdjb2RlJywgdmFsdWU6IGNvZGUgfSk7XG4gIHJldHVybiB0b2tlbnM7XG59XG5cbi8qKiBUaGUgZmlyc3QgYHsgLi4uIH1gIHNwYW4gKHN0cmluZy1hd2FyZSBicmFjZSBtYXRjaGluZyksIG9yIHVuZGVmaW5lZCB3aGVuIG5vbmUgZXhpc3RzLiAqL1xuZnVuY3Rpb24gZXh0cmFjdEZpcnN0QmFsYW5jZWRPYmplY3QoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhcnRJbmRleCA9IGNvbnRlbnQuaW5kZXhPZigneycpO1xuICBpZiAoc3RhcnRJbmRleCA9PT0gLTEpIHJldHVybjtcblxuICBsZXQgZGVwdGggPSAwO1xuICBsZXQgc3RyaW5nRGVsaW1pdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGluZGV4ID0gc3RhcnRJbmRleDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgaWYgKHN0cmluZ0RlbGltaXRlcikge1xuICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykgaW5kZXgrKztcbiAgICAgIGVsc2UgaWYgKGNoYXIgPT09IHN0cmluZ0RlbGltaXRlciB8fCAoc3RyaW5nRGVsaW1pdGVyICE9PSAnYCcgJiYgY2hhciA9PT0gJ1xcbicpKSBzdHJpbmdEZWxpbWl0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09ICdcIicgfHwgY2hhciA9PT0gJ2AnKSBzdHJpbmdEZWxpbWl0ZXIgPSBjaGFyO1xuICAgIGVsc2UgaWYgKGNoYXIgPT09ICd7JykgZGVwdGgrKztcbiAgICBlbHNlIGlmIChjaGFyID09PSAnfScgJiYgLS1kZXB0aCA9PT0gMCkgcmV0dXJuIGNvbnRlbnQuc2xpY2Uoc3RhcnRJbmRleCwgaW5kZXggKyAxKTtcbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogUmVtb3ZlIGJsb2NrIGFuZCBsaW5lIGNvbW1lbnRzIHNvIGNvbW1lbnRlZC1vdXQgbWFya2VycyAoZS5nLiBgLy8gZGlhbGVjdDogJ3NxbGl0ZSdgIGluIGFcbiAqIFBvc3RncmVTUUwgY29uZmlnKSBjYW5ub3QgbWlzY2xhc3NpZnkgdGhlIGNvbmZpZy4gVGhlIHNjYW5uZXIgdHJhY2tzIHN0cmluZyBzdGF0ZSwgc28gYC8vYFxuICogaW5zaWRlIHN0cmluZyBsaXRlcmFscyAoVVJMcyBzdWNoIGFzIGBodHRwczovLy4uLmAgaW4gY29ubmVjdGlvbiBzdHJpbmdzKSBzdXJ2aXZlcyB3aGlsZVxuICogY29tbWVudHMgZGlyZWN0bHkgYWZ0ZXIgYSBzdHJpbmcgbGl0ZXJhbCBhcmUgc3RpbGwgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBKc0NvbW1lbnRzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgbGV0IHN0cmluZ0RlbGltaXRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29udGVudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyID0gY29udGVudFtpbmRleF0hO1xuICAgIGNvbnN0IG5leHRDaGFyID0gY29udGVudFtpbmRleCArIDFdO1xuICAgIGlmIChzdHJpbmdEZWxpbWl0ZXIpIHtcbiAgICAgIGlmIChjaGFyID09PSAnXFxcXCcpIHtcbiAgICAgICAgcmVzdWx0ICs9IGNoYXIgKyAobmV4dENoYXIgPz8gJycpO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBzdHJpbmdEZWxpbWl0ZXIgfHwgKHN0cmluZ0RlbGltaXRlciAhPT0gJ2AnICYmIGNoYXIgPT09ICdcXG4nKSkge1xuICAgICAgICBzdHJpbmdEZWxpbWl0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHtcbiAgICAgIHN0cmluZ0RlbGltaXRlciA9IGNoYXI7XG4gICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gJy8nICYmIG5leHRDaGFyID09PSAnLycpIHtcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQubGVuZ3RoICYmIGNvbnRlbnRbaW5kZXhdICE9PSAnXFxuJykgaW5kZXgrKztcbiAgICAgIHJlc3VsdCArPSAnXFxuJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gJy8nICYmIG5leHRDaGFyID09PSAnKicpIHtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICB3aGlsZSAoaW5kZXggPCBjb250ZW50Lmxlbmd0aCAmJiAhKGNvbnRlbnRbaW5kZXhdID09PSAnKicgJiYgY29udGVudFtpbmRleCArIDFdID09PSAnLycpKSBpbmRleCsrO1xuICAgICAgaW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXN1bHQgKz0gY2hhcjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZERyaXp6bGVDb25maWcocHJvamVjdDogUHJvamVjdCk6IHsgZGlyUGF0aDogc3RyaW5nOyBmaWxlTmFtZTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gWydkcml6emxlLmNvbmZpZy50cycsICdkcml6emxlLmNvbmZpZy5tdHMnLCAnZHJpenpsZS5jb25maWcuanMnLCAnZHJpenpsZS5jb25maWcubWpzJ107XG4gIGZvciAoY29uc3QgZGlyUGF0aCBvZiBbcHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnJvb3REaXJQYXRoXSkge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gY2FuZGlkYXRlcy5maW5kKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZU5hbWUpKSk7XG4gICAgaWYgKGZpbGVOYW1lKSByZXR1cm4geyBkaXJQYXRoLCBmaWxlTmFtZSB9O1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSA/IGRiUGF0aCA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRiUGF0aCk7XG4gIHJldHVybiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZEZvclBhdGgoYWJzb2x1dGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBybSAtZiBcIiR7ZGJQYXRofVwiIFwiJHtkYlBhdGh9LXdhbFwiIFwiJHtkYlBhdGh9LXNobVwiYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkZhbWlseUNvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1SZiBcIiR7ZGJQYXRofVwiKmA7XG59XG5cbmZ1bmN0aW9uIGdldFNxbGl0ZURiUGF0aE9yRXJyb3IocHJvamVjdDogUHJvamVjdCwgY29tbWFuZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdiIGRiICR7Y29tbWFuZE5hbWV9IHN1cHBvcnRzIERyaXp6bGUgb25seSB3aGVuIGZpbGU6IERBVEFCQVNFX1VSTCBpcyBzZXQuYCk7XG4gIH1cbiAgcmV0dXJuIGRiUGF0aDtcbn1cblxuZnVuY3Rpb24gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdDogUHJvamVjdCwgY29tbWFuZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aE9yRXJyb3IocHJvamVjdCwgY29tbWFuZE5hbWUpO1xuICByZXR1cm4gcGF0aC5pc0Fic29sdXRlKGRiUGF0aCkgPyBkYlBhdGggOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkYlBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZXRTcWxpdGVEYlBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG59XG5cbmV4cG9ydCBjb25zdCBkcml6emxlU2NyaXB0cyA9IG5ldyBEcml6emxlU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuL3dyYW5nbGVyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBXcmFuZ2xlckQxRGF0YWJhc2Uge1xuICBiaW5kaW5nPzogc3RyaW5nO1xuICBkYXRhYmFzZV9uYW1lPzogc3RyaW5nO1xuICBkYXRhYmFzZV9pZD86IHN0cmluZztcbiAgbWlncmF0aW9uc19kaXI/OiBzdHJpbmc7XG4gIG1pZ3JhdGlvbnNfcGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBEMSBiaW5kaW5nIHVzZXMgd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgdGhhdCBgd3JhbmdsZXIgZDEgbWlncmF0aW9ucyBhcHBseWBcbiAqIHdvdWxkIGFjdHVhbGx5IGRpc2NvdmVyOiBhbiBleHBsaWNpdCBgbWlncmF0aW9uc19wYXR0ZXJuYCBvcHRzIGluLCBvdGhlcndpc2UgdGhlIG1pZ3JhdGlvbnNcbiAqIGRpcmVjdG9yeSBtdXN0IGNvbnRhaW4gZmxhdCBgKi5zcWxgIGZpbGVzICh3cmFuZ2xlcidzIGRlZmF1bHQgcGF0dGVybikuIEEgZHJpenpsZS1raXQgYG91dGBcbiAqIGRpcmVjdG9yeSB3aXRoIG5lc3RlZCBgPG5hbWU+L21pZ3JhdGlvbi5zcWxgIGZpbGVzIGFuZCBubyBwYXR0ZXJuIHdvdWxkIG1hdGNoIG5vdGhpbmcgYW5kXG4gKiBzaWxlbnRseSBhcHBseSB6ZXJvIG1pZ3JhdGlvbnMsIHNvIGl0IG11c3QgZmFsbCB0aHJvdWdoIHRvIHRoZSBkcml6emxlLWtpdCBtZWNoYW5pc20uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VzV3JhbmdsZXJOYXRpdmVNaWdyYXRpb25zKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPiwgZGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSk6IGJvb2xlYW4ge1xuICAvLyBBbiBleHBsaWNpdCBwYXR0ZXJuIG9wdHMgaW50byB0aGUgd3JhbmdsZXItbmF0aXZlIG1lY2hhbmlzbSBldmVuIGJlZm9yZSB0aGUgZGlyZWN0b3J5XG4gIC8vIGV4aXN0czsgd3JhbmdsZXIgdGhlbiBmYWlscyBzYWZlbHkgd2l0aCBcIk5vIG1pZ3JhdGlvbnMgZm9sZGVyIGZvdW5kXCIgaW5zdGVhZCBvZiB3YlxuICAvLyBzaWxlbnRseSBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgbWlncmF0aW9uIGVuZ2luZS5cbiAgaWYgKGRhdGFiYXNlLm1pZ3JhdGlvbnNfcGF0dGVybikgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGF0YWJhc2UubWlncmF0aW9uc19kaXIgPz8gJ21pZ3JhdGlvbnMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZnMucmVhZGRpclN5bmMobWlncmF0aW9uc0RpclBhdGgpLnNvbWUoKGZpbGVOYW1lKSA9PiBmaWxlTmFtZS5lbmRzV2l0aCgnLnNxbCcpKTtcbn1cblxuY29uc3QgTkFNRV9LRVlFRF9CSU5ESU5HX1BBUkVOVFMgPSBuZXcgU2V0KFsnYmluZGluZ3MnLCAnc2VuZF9lbWFpbCcsICdyYXRlbGltaXRzJ10pO1xuY29uc3QgUkVDT1JEX0tFWUVEX0JJTkRJTkdfS0VZUyA9IG5ldyBTZXQoWyd3YXNtX21vZHVsZXMnLCAndGV4dF9ibG9icycsICdkYXRhX2Jsb2JzJ10pO1xuXG4vKipcbiAqIENvbGxlY3QgZXZlcnkgYmluZGluZyBuYW1lIGRlY2xhcmVkIGluIHRoZSAoZW52aXJvbm1lbnQtcmVzb2x2ZWQpIGNvbmZpZyBzdWJ0cmVlOiBgYmluZGluZ2BcbiAqIHByb3BlcnRpZXMgYW55d2hlcmUgKEQxLCBLViwgUjIsIHNlcnZpY2VzLCBhc3NldHMsIHF1ZXVlcywgZXRjLiksIHRoZSBgbmFtZWAta2V5ZWQgYmluZGluZ3NcbiAqIChgZHVyYWJsZV9vYmplY3RzLmJpbmRpbmdzYCwgYGxvZ2Z3ZHIuYmluZGluZ3NgLCBgc2VuZF9lbWFpbGAsIGByYXRlbGltaXRzYCksIGFuZCB0aGVcbiAqIHJlY29yZC1rZXllZCBsZWdhY3kgbW9kdWxlIGJpbmRpbmdzIChgd2FzbV9tb2R1bGVzYCwgYHRleHRfYmxvYnNgLCBgZGF0YV9ibG9ic2ApLiBBIHNlY3JldFxuICogc2hhcmluZyBhIGJpbmRpbmcncyBuYW1lIHdvdWxkIHNpbGVudGx5IHJlcGxhY2UgdGhhdCBiaW5kaW5nIHdpdGggYSBwbGFpbiBzdHJpbmcgb24gZGVwbG95LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEJpbmRpbmdOYW1lcyh2YWx1ZTogdW5rbm93biwgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKSwgcGFyZW50S2V5ID0gJycpOiBTZXQ8c3RyaW5nPiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkgY29sbGVjdEJpbmRpbmdOYW1lcyhpdGVtLCBuYW1lcywgcGFyZW50S2V5KTtcbiAgICByZXR1cm4gbmFtZXM7XG4gIH1cbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gbmFtZXM7XG4gIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGlmIChrZXkgPT09ICdiaW5kaW5nJyAmJiB0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lcy5hZGQoY2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbmFtZScgJiYgdHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyAmJiBOQU1FX0tFWUVEX0JJTkRJTkdfUEFSRU5UUy5oYXMocGFyZW50S2V5KSkge1xuICAgICAgbmFtZXMuYWRkKGNoaWxkKTtcbiAgICB9IGVsc2UgaWYgKFJFQ09SRF9LRVlFRF9CSU5ESU5HX0tFWVMuaGFzKGtleSkgJiYgY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcbiAgICAgIGZvciAoY29uc3QgYmluZGluZ05hbWUgb2YgT2JqZWN0LmtleXMoY2hpbGQpKSBuYW1lcy5hZGQoYmluZGluZ05hbWUpO1xuICAgIH0gZWxzZSBpZiAoa2V5ICE9PSAnZW52JyAmJiBrZXkgIT09ICd2YXJzJyAmJiBrZXkgIT09ICdtZXRhZGF0YScgJiYga2V5ICE9PSAnb3B0aW9ucycpIHtcbiAgICAgIC8vIE5lc3RlZCBgZW52YCBzdWJ0cmVlcyBiZWxvbmcgdG8gb3RoZXIgZW52aXJvbm1lbnRzOyBgdmFyc2AgdmFsdWVzLCBgdW5zYWZlLm1ldGFkYXRhYCxcbiAgICAgIC8vIGFuZCBgdW5zYWZlLmJpbmRpbmdzW10uZGV2Lm9wdGlvbnNgIGFyZSBhcmJpdHJhcnkgSlNPTiB3aG9zZSBwcm9wZXJ0aWVzIChlLmcuIGFcbiAgICAgIC8vIFwiYmluZGluZ1wiIGZpZWxkKSBhcmUgZGF0YSwgbm90IFdvcmtlciBiaW5kaW5ncy5cbiAgICAgIGNvbGxlY3RCaW5kaW5nTmFtZXMoY2hpbGQsIG5hbWVzLCBrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmFtZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB7XG4gIC8qKiBUaGUgV29ya2VyIG5hbWUgZm9yIHRoZSBkZXBsb3kgZW52aXJvbm1lbnQgKHdyYW5nbGVyIGFwcGVuZHMgYC08ZW52PmAgd2hlbiB0aGUgZW52IHNlY3Rpb24gaGFzIG5vIG93biBuYW1lKS4gKi9cbiAgd29ya2VyTmFtZT86IHN0cmluZztcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICB2YXJLZXlzOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBlbnZpcm9ubWVudCdzIGB2YXJzYCB2YWx1ZXMgKG5lZWRlZCBmb3IgQ2xvdWRmbGFyZSdzIGNvbWJpbmVkIGNvdW50L3NpemUgbGltaXRzKS4gKi9cbiAgdmFyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBTZWNyZXRzIGRlY2xhcmVkIGFzIHJlcXVpcmVkIHZpYSB3cmFuZ2xlcidzIGBzZWNyZXRzLnJlcXVpcmVkYCAodmFsaWRhdGVkIGF0IGRlcGxveSB0aW1lKS4gKi9cbiAgcmVxdWlyZWRTZWNyZXROYW1lczogc3RyaW5nW107XG4gIC8qKiBOYW1lcyBvZiBhbGwgbm9uLXZhciBiaW5kaW5ncyAoRDEsIEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzLCBzZW5kX2VtYWlsLCBzZXJ2aWNlcywgLi4uKS4gKi9cbiAgYmluZGluZ05hbWVzOiBzdHJpbmdbXTtcbiAgZDFEYXRhYmFzZXM6IFdyYW5nbGVyRDFEYXRhYmFzZVtdO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZW52aXJvbm1lbnQgY29tZXMgZnJvbSBhbiBgZW52LjxuYW1lPmAgc2VjdGlvbiAodGhlbiB3cmFuZ2xlciBjb21tYW5kcyBuZWVkXG4gICAqIGAtLWVudiA8bmFtZT5gIC8gYENMT1VERkxBUkVfRU5WPTxuYW1lPmApLiBgcHJvZHVjdGlvbmAgbWF5IGJlIGVpdGhlciB0aGUgdG9wIGxldmVsIG9yIGFcbiAgICogbmFtZWQgYGVudi5wcm9kdWN0aW9uYCBzZWN0aW9uOyB0aGUgc2VjdGlvbiB3aW5zIHdoZW4gaXQgZXhpc3RzLlxuICAgKi9cbiAgdXNlc0VudlNlY3Rpb246IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBSYXdXcmFuZ2xlckNvbmZpZyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZDFfZGF0YWJhc2VzPzogV3JhbmdsZXJEMURhdGFiYXNlW107XG4gIGFzc2V0cz86IHVua25vd247XG4gIGxvZ2Z3ZHI/OiB1bmtub3duO1xuICB3YXNtX21vZHVsZXM/OiB1bmtub3duO1xuICB0ZXh0X2Jsb2JzPzogdW5rbm93bjtcbiAgZGF0YV9ibG9icz86IHVua25vd247XG4gIHNpdGU/OiB1bmtub3duO1xuICBzZWNyZXRzPzogeyByZXF1aXJlZD86IHN0cmluZ1tdIH07XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIFJhd1dyYW5nbGVyQ29uZmlnPjtcbn1cblxuLy8gV29ya2VycyBTaXRlcyBpbXBsaWNpdGx5IGJpbmRzIGl0cyBLViBuYW1lc3BhY2UgYXMgX19TVEFUSUNfQ09OVEVOVC5cbmZ1bmN0aW9uIHNpdGVCaW5kaW5nTmFtZXMoY29uZmlnOiBSYXdXcmFuZ2xlckNvbmZpZywgZW52Q29uZmlnPzogUmF3V3JhbmdsZXJDb25maWcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoZW52Q29uZmlnPy5zaXRlID8/IGNvbmZpZy5zaXRlKSA/IFsnX19TVEFUSUNfQ09OVEVOVCddIDogW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgd3JhbmdsZXIgY29uZmlnIHZhbHVlcyBuZWVkZWQgZm9yIGRlcGxveWluZyB0byB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuXG4gKiBGb2xsb3dzIHdyYW5nbGVyJ3MgaW5oZXJpdGFuY2UgcnVsZXM6IGBhY2NvdW50X2lkYCBpcyBpbmhlcml0ZWQgYnkgbmFtZWQgZW52aXJvbm1lbnRzLFxuICogd2hpbGUgYHZhcnNgIGFuZCBgZDFfZGF0YWJhc2VzYCBhcmUgbm90IGFuZCBtdXN0IGJlIHJlZGVjbGFyZWQgcGVyIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdyYW5nbGVyQ29uZmlnRm9yRW52KFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4sXG4gIGVudk5hbWU6IHN0cmluZ1xuKTogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcbiAgaWYgKHBhdGguZXh0bmFtZShjb25maWdQYXRoKSA9PT0gJy50b21sJykge1xuICAgIHRocm93IG5ldyBFcnJvcignd2IgZGVwbG95IHN1cHBvcnRzIHdyYW5nbGVyLmpzb25jL3dyYW5nbGVyLmpzb24gY29uZmlncyBvbmx5OyBtaWdyYXRlIHdyYW5nbGVyLnRvbWwgZmlyc3QuJyk7XG4gIH1cblxuICAvLyBqc29uYy1wYXJzZXIgaXMgZmF1bHQgdG9sZXJhbnQgYW5kIHdvdWxkIHJldHVybiBhIHBhcnRpYWwgb2JqZWN0IGZvciBtYWxmb3JtZWQgaW5wdXQsXG4gIC8vIHdoaWNoIGNvdWxkIG1pZ3JhdGUgYSByZW1vdGUgZGF0YWJhc2UgZnJvbSBhIGhhbGYtcmVhZCBjb25maWc7IHJlamVjdCBhbnkgcGFyc2UgZXJyb3IuXG4gIGNvbnN0IHBhcnNlRXJyb3JzOiBQYXJzZUVycm9yW10gPSBbXTtcbiAgY29uc3QgY29uZmlnID0gcGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JyksIHBhcnNlRXJyb3JzLCB7XG4gICAgYWxsb3dUcmFpbGluZ0NvbW1hOiB0cnVlLFxuICB9KSBhcyBSYXdXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgaWYgKHBhcnNlRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSAke2NvbmZpZ1BhdGh9OiAke3BhcnNlRXJyb3JzLmxlbmd0aH0gSlNPTkMgc3ludGF4IGVycm9yKHMpLmApO1xuICB9XG4gIGlmICghY29uZmlnKSByZXR1cm47XG5cbiAgY29uc3QgZW52Q29uZmlnID0gY29uZmlnLmVudj8uW2Vudk5hbWVdO1xuICBpZiAoIWVudkNvbmZpZyAmJiBlbnZOYW1lICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB3cmFuZ2xlciBjb25maWcgaGFzIG5vIFwiZW52XCI6IHsgXCIke2Vudk5hbWV9XCI6IC4uLiB9IHNlY3Rpb24uYCk7XG4gIH1cbiAgcmV0dXJuIGVudkNvbmZpZ1xuICAgID8ge1xuICAgICAgICB3b3JrZXJOYW1lOiBlbnZDb25maWcubmFtZSA/PyAoY29uZmlnLm5hbWUgPyBgJHtjb25maWcubmFtZX0tJHtlbnZOYW1lfWAgOiB1bmRlZmluZWQpLFxuICAgICAgICBhY2NvdW50SWQ6IGVudkNvbmZpZy5hY2NvdW50X2lkID8/IGNvbmZpZy5hY2NvdW50X2lkLFxuICAgICAgICB2YXJLZXlzOiBPYmplY3Qua2V5cyhlbnZDb25maWcudmFycyA/PyB7fSksXG4gICAgICAgIHZhcnM6IGVudkNvbmZpZy52YXJzID8/IHt9LFxuICAgICAgICAvLyBNb3N0IGJpbmRpbmdzIGFyZSBub24taW5oZXJpdGFibGUgYW5kIG11c3QgYmUgcmVkZWNsYXJlZCBwZXIgZW52aXJvbm1lbnQsIHNvIG9ubHkgdGhlXG4gICAgICAgIC8vIGVudmlyb25tZW50J3Mgb3duIG5hbWVzIGNvdW50IOKAlCBwbHVzIHRoZSBnZW51aW5lbHkgaW5oZXJpdGVkIHNoYXBlcyAoYXNzZXRzLCBsb2dmd2RyKSxcbiAgICAgICAgLy8gd2hpY2ggd3JhbmdsZXIgcmVzb2x2ZXMgYXMgd2hvbGUgZmllbGRzOiB0aGUgZW52aXJvbm1lbnQncyBvd24gZmllbGQgb3ZlcnJpZGVzIHRoZVxuICAgICAgICAvLyB0b3AgbGV2ZWwgZW50aXJlbHksIHNvIG9ubHkgdGhlIGVmZmVjdGl2ZSB2YWx1ZSdzIG5hbWVzIGNvdW50LlxuICAgICAgICBiaW5kaW5nTmFtZXM6IFtcbiAgICAgICAgICAuLi5jb2xsZWN0QmluZGluZ05hbWVzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhc3NldHM6IGVudkNvbmZpZy5hc3NldHMgPz8gY29uZmlnLmFzc2V0cyxcbiAgICAgICAgICAgICAgbG9nZndkcjogZW52Q29uZmlnLmxvZ2Z3ZHIgPz8gY29uZmlnLmxvZ2Z3ZHIsXG4gICAgICAgICAgICAgIHdhc21fbW9kdWxlczogZW52Q29uZmlnLndhc21fbW9kdWxlcyA/PyBjb25maWcud2FzbV9tb2R1bGVzLFxuICAgICAgICAgICAgICB0ZXh0X2Jsb2JzOiBlbnZDb25maWcudGV4dF9ibG9icyA/PyBjb25maWcudGV4dF9ibG9icyxcbiAgICAgICAgICAgICAgZGF0YV9ibG9iczogZW52Q29uZmlnLmRhdGFfYmxvYnMgPz8gY29uZmlnLmRhdGFfYmxvYnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29sbGVjdEJpbmRpbmdOYW1lcyhlbnZDb25maWcpXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5zaXRlQmluZGluZ05hbWVzKGNvbmZpZywgZW52Q29uZmlnKSxcbiAgICAgICAgXSxcbiAgICAgICAgZDFEYXRhYmFzZXM6IGVudkNvbmZpZy5kMV9kYXRhYmFzZXMgPz8gW10sXG4gICAgICAgIC8vIGBzZWNyZXRzYCBpcyBub24taW5oZXJpdGFibGU6IGEgdG9wLWxldmVsIHJlcXVpcmVtZW50IG11c3Qgbm90IGZvcmNlIChvciB1cGxvYWQpXG4gICAgICAgIC8vIGEgc2VjcmV0IGludG8gYSBuYW1lZCBlbnZpcm9ubWVudC5cbiAgICAgICAgcmVxdWlyZWRTZWNyZXROYW1lczogZW52Q29uZmlnLnNlY3JldHM/LnJlcXVpcmVkID8/IFtdLFxuICAgICAgICB1c2VzRW52U2VjdGlvbjogdHJ1ZSxcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgd29ya2VyTmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgIGFjY291bnRJZDogY29uZmlnLmFjY291bnRfaWQsXG4gICAgICAgIHZhcktleXM6IE9iamVjdC5rZXlzKGNvbmZpZy52YXJzID8/IHt9KSxcbiAgICAgICAgdmFyczogY29uZmlnLnZhcnMgPz8ge30sXG4gICAgICAgIGJpbmRpbmdOYW1lczogWy4uLmNvbGxlY3RCaW5kaW5nTmFtZXMoY29uZmlnKSwgLi4uc2l0ZUJpbmRpbmdOYW1lcyhjb25maWcpXSxcbiAgICAgICAgZDFEYXRhYmFzZXM6IGNvbmZpZy5kMV9kYXRhYmFzZXMgPz8gW10sXG4gICAgICAgIHJlcXVpcmVkU2VjcmV0TmFtZXM6IGNvbmZpZy5zZWNyZXRzPy5yZXF1aXJlZCA/PyBbXSxcbiAgICAgICAgdXNlc0VudlNlY3Rpb246IGZhbHNlLFxuICAgICAgfTtcbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcywgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZERyaXp6bGVLaXRDb21tYW5kLCB1c2VzRHJpenpsZUtpdEZvckQxIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQsIHNoZWxsRXNjYXBlQXJndW1lbnQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnLCBXcmFuZ2xlckQxRGF0YWJhc2UgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlckNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlV3JhbmdsZXJDb25maWdGb3JFbnYsIHVzZXNXcmFuZ2xlck5hdGl2ZU1pZ3JhdGlvbnMgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlckNvbmZpZy5qcyc7XG5cbi8qKlxuICogS2V5cyB0aGF0IGRyaXZlIHRoZSBkZXBsb3kgaXRzZWxmIChvciBhcmUgbWVhbmluZ2Z1bCBvbmx5IGxvY2FsbHkpIGFuZCB0aHVzIG11c3QgbmV2ZXIgYmVcbiAqIHB1c2hlZCB0byB0aGUgV29ya2VyIGFzIHNlY3JldHMuIGBXQl9FTlZgIC8gYE5FWFRfUFVCTElDX1dCX0VOVmAgYmVsb25nIGluIHdyYW5nbGVyIGB2YXJzYC5cbiAqL1xuY29uc3QgTk9OX1NFQ1JFVF9LRVlTID0gbmV3IFNldChbXG4gICdDSScsXG4gIC8vIFdyYW5nbGVyIHN5c3RlbS9hdXRoZW50aWNhdGlvbiB2YXJpYWJsZXMgKGh0dHBzOi8vZGV2ZWxvcGVycy5jbG91ZGZsYXJlLmNvbS93b3JrZXJzL3dyYW5nbGVyL3N5c3RlbS1lbnZpcm9ubWVudC12YXJpYWJsZXMvKSxcbiAgLy8gaW5jbHVkaW5nIGxlZ2FjeSBhbGlhc2VzOyBhcHAtc3BlY2lmaWMgbmFtZXMgc3VjaCBhcyBDTE9VREZMQVJFX1IyX0FDQ0VTU19LRVlfSUQgc3RheSBlbGlnaWJsZS5cbiAgJ0NGX0FDQ09VTlRfSUQnLFxuICAnQ0ZfQVBJX0JBU0VfVVJMJyxcbiAgJ0NGX0FQSV9FTUFJTCcsXG4gICdDRl9BUElfS0VZJyxcbiAgJ0NGX0FQSV9UT0tFTicsXG4gICdDRl9FTUFJTCcsXG4gICdDTE9VREZMQVJFX0FDQ0VTU19DTElFTlRfSUQnLFxuICAnQ0xPVURGTEFSRV9BQ0NFU1NfQ0xJRU5UX1NFQ1JFVCcsXG4gICdDTE9VREZMQVJFX0FDQ09VTlRfSUQnLFxuICAnQ0xPVURGTEFSRV9BUElfQkFTRV9VUkwnLFxuICAnQ0xPVURGTEFSRV9BUElfS0VZJyxcbiAgJ0NMT1VERkxBUkVfQVBJX1RPS0VOJyxcbiAgJ0NMT1VERkxBUkVfQVVUSF9VU0VfS0VZUklORycsXG4gICdDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEJyxcbiAgJ0NMT1VERkxBUkVfRU1BSUwnLFxuICAnQ0xPVURGTEFSRV9FTlYnLFxuICAnQ0xPVURGTEFSRV9JTkNMVURFX1BST0NFU1NfRU5WJyxcbiAgJ0NMT1VERkxBUkVfTE9BRF9ERVZfVkFSU19GUk9NX0RPVF9FTlYnLFxuICAnRE9DS0VSX0hPU1QnLFxuICAnSFRUUF9QUk9YWScsXG4gICdIVFRQU19QUk9YWScsXG4gICdodHRwX3Byb3h5JyxcbiAgJ2h0dHBzX3Byb3h5JyxcbiAgJ0ZPUkNFX0NPTE9SJyxcbiAgJ01JTklGTEFSRV9DQUNIRV9ESVInLFxuICAnTUlTRV9FTlYnLFxuICAnTk9fQ09MT1InLFxuICAnTkVYVF9QVUJMSUNfV0JfRU5WJyxcbiAgJ05FWFRfUFVCTElDX1dCX1ZFUlNJT04nLFxuICAnTk9ERV9FTlYnLFxuICAnUE9SVCcsXG4gICdXQl9FTlYnLFxuICAnV0JfVkVSU0lPTicsXG5dKTtcblxuY29uc3QgTk9OX1NFQ1JFVF9LRVlfUFJFRklYRVMgPSBbJ1dSQU5HTEVSXycsICdDTE9VREZMQVJFX0hZUEVSRFJJVkVfTE9DQUxfQ09OTkVDVElPTl9TVFJJTkdfJywgJ0NMT1VERkxBUkVfQ0ZfRkVUQ0hfJ107XG5cbmZ1bmN0aW9uIGlzTm9uU2VjcmV0S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBOT05fU0VDUkVUX0tFWVMuaGFzKGtleSkgfHwgTk9OX1NFQ1JFVF9LRVlfUFJFRklYRVMuc29tZSgocHJlZml4KSA9PiBrZXkuc3RhcnRzV2l0aChwcmVmaXgpKTtcbn1cblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIERlcGxveUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIERlcGxveUNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPERlcGxveUNvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgRGVwbG95Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6XG4gICAgJ0RlcGxveSBhIENsb3VkZmxhcmUgV29ya2VycyBhcHAgKHZpbmV4dCBvciBwbGFpbiBXb3JrZXIpIHRvIHRoZSBXQl9FTlYgZW52aXJvbm1lbnQ6IHZhbGlkYXRlIHNlY3JldHMsIGJ1aWxkLCBhcHBseSByZW1vdGUgRDEgbWlncmF0aW9ucywgdGhlbiBkZXBsb3kgY29kZSBhbmQgc2VjcmV0cyBhdG9taWNhbGx5LicsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4geWFyZ3MgYXMgdW5rbm93biBhcyBBcmd2PERlcGxveUNvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2OiBEZXBsb3lDb21tYW5kQXJndikge1xuICAgIC8vIEEgc3RyYXkgZXhwb3J0ZWQgQ0xPVURGTEFSRV9FTlYgd291bGQgYmFrZSB0aGUgd3JvbmcgZW52aXJvbm1lbnQgaW50byB0aGUgYnVpbGQgYW5kXG4gICAgLy8gYXBwbHkgdGhlIGVudmlyb25tZW50IHN1ZmZpeCB0d2ljZSBvbiBkZXBsb3k7IGl0IGlzIHJlLXNldCBleHBsaWNpdGx5IHdoZXJlIG5lZWRlZC5cbiAgICAvLyBBIGRvdGVudiBmaWxlIGRlZmluaW5nIGl0IHN0aWxsIHN1cmZhY2VzIHRocm91Z2ggcHJvamVjdC5lbnYsIHdoaWNoIHRoZSBleHBsaWNpdCBgLS1lbnZgXG4gICAgLy8gZmxhZ3MgYmVsb3cgb3ZlcnJpZGUuXG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNMT1VERkxBUkVfRU5WO1xuXG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3Qgd3JhbmdsZXJDb25maWdQYXRoID0gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgICBpZiAoIXdyYW5nbGVyQ29uZmlnUGF0aCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ3diIGRlcGxveSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwcyAobm8gd3JhbmdsZXIgY29uZmlnIGZvdW5kKS4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGVudk5hbWUgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgaWYgKCFlbnZOYW1lIHx8IGVudk5hbWUgPT09ICdkZXZlbG9wbWVudCcgfHwgZW52TmFtZSA9PT0gJ3Rlc3QnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoYFdCX0VOViBtdXN0IG5hbWUgYSBkZXBsb3kgZW52aXJvbm1lbnQgKGUuZy4gc3RhZ2luZyBvciBwcm9kdWN0aW9uKSwgYnV0IGlzICR7ZW52TmFtZX0uYClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHZhbHVlcyBnbyBpbnRvIGJvdGggcHJvY2Vzcy5lbnYgKGluaGVyaXRlZCBieSBldmVyeXRoaW5nIHdiIHNwYXducykgYW5kIHByb2plY3QuZW52XG4gICAgLy8gKHRoZSBlbnZpcm9ubWVudCB3YiBpdHNlbGYgcmVhZHMgYW5kIHBhc3NlcyBleHBsaWNpdGx5KTsgdGhlIGxhdHRlciBpcyBhIGNhY2hlZCBzbmFwc2hvdFxuICAgIC8vIHRha2VuIGJlZm9yZSB0aGlzIHBvaW50LCBzbyB3cml0aW5nIG9ubHkgdG8gcHJvY2Vzcy5lbnYgd291bGQgbGVhdmUgd2IncyBvd24gcHJlZmxpZ2h0IOKAlFxuICAgIC8vIGFuZCBhbnkgY29tbWFuZCBzcGF3bmVkIHdpdGggcHJvamVjdC5lbnYg4oCUIHdpdGhvdXQgdGhlIHRva2VuLlxuICAgIGNvbnN0IGNsb3VkZmxhcmVFbnZWYXJzID0gcmVhZENsb3VkZmxhcmVFbnZGaWxlcyhwcm9qZWN0LmRpclBhdGgsIHByb2plY3Qucm9vdERpclBhdGgpO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNsb3VkZmxhcmVFbnZWYXJzKSkge1xuICAgICAgLy8gPz89IHNvIHRoYXQgYW4gZXhwbGljaXRseSBleHBvcnRlZCBlbXB0eSB2YWx1ZSBzdGlsbCB3aW5zIG92ZXIgdGhlIGZpbGUuXG4gICAgICBwcm9jZXNzLmVudltrZXldID8/PSB2YWx1ZTtcbiAgICAgIHByb2plY3QuZW52W2tleV0gPz89IHZhbHVlO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgcmVzb2x2ZWRDb25maWcgPSByZXNvbHZlV3JhbmdsZXJDb25maWdGb3JFbnYocHJvamVjdCwgZW52TmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFN0cmluZyhlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBpZiAoIXJlc29sdmVkQ29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIHBhcnNlICR7d3JhbmdsZXJDb25maWdQYXRofS5gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGFjY291bnRJZCA9IHJlc29sdmVkQ29uZmlnLmFjY291bnRJZCA/PyBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FDQ09VTlRfSUQ7XG4gICAgLy8gUHJlZmVyIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIHdoZW5ldmVyIHRoZSByZXNvbHZlZCBlbnZpcm9ubWVudCdzIEQxIGJpbmRpbmdzIGhhdmUgYW5cbiAgICAvLyBleGlzdGluZyBtaWdyYXRpb25zIGRpcmVjdG9yeS4gQSBkcml6emxlLW9ybSBkZXBlbmRlbmN5IGFsb25lIGRvZXMgbm90IGltcGx5IHRoZSBwcm9qZWN0XG4gICAgLy8gbWlncmF0ZXMgRDEgd2l0aCBkcml6emxlLWtpdCdzIGQxLWh0dHAgZHJpdmVyOiB0aGUgZXhwbGljaXQgbWFya2VyIGlzIGEgZHJpenpsZSBjb25maWdcbiAgICAvLyB3aG9zZSBkaWFsZWN0L2RyaXZlciB0YXJnZXRzIHNxbGl0ZSAvIGQxLWh0dHAgLyBkdXJhYmxlLXNxbGl0ZSAoc2VlIHVzZXNEcml6emxlS2l0Rm9yRDE7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTQyKS4gQSBkcml6emxlIGNvbmZpZyB0YXJnZXRpbmcgYW5vdGhlclxuICAgIC8vIGRhdGFiYXNlIChlLmcuIFBvc3RncmVTUUwgdmlhIEh5cGVyZHJpdmUpIGxlYXZlcyB0aGUgRDEgYmluZGluZ3MgdW5tYW5hZ2VkIGJ5IHdiIGRlcGxveS5cbiAgICBjb25zdCB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzID0gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMuZmlsdGVyKChkYXRhYmFzZSkgPT5cbiAgICAgIHVzZXNXcmFuZ2xlck5hdGl2ZU1pZ3JhdGlvbnMocHJvamVjdCwgZGF0YWJhc2UpXG4gICAgKTtcbiAgICBjb25zdCBkcml6emxlS2l0TWFuYWdlc0QxID0gdXNlc0RyaXp6bGVLaXRGb3JEMShwcm9qZWN0KTtcbiAgICBpZiAoXG4gICAgICBkcml6emxlS2l0TWFuYWdlc0QxICYmXG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoIDwgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoXG4gICAgKSB7XG4gICAgICAvLyBNaWdyYXRpbmcgb25seSB0aGUgd3JhbmdsZXItbmF0aXZlIHN1YnNldCB3b3VsZCBzaWxlbnRseSBkZXBsb3kgY29kZSBhZ2FpbnN0IHRoZVxuICAgICAgLy8gb3RoZXIsIHVubWlncmF0ZWQgZGF0YWJhc2VzLlxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKCd3YiBkZXBsb3kgZG9lcyBub3Qgc3VwcG9ydCBtaXhpbmcgd3JhbmdsZXItbmF0aXZlIGFuZCBub24tbmF0aXZlIEQxIG1pZ3JhdGlvbiBsYXlvdXRzLicpXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBkcml6emxlRDFEYXRhYmFzZSA9XG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMCAmJiBkcml6emxlS2l0TWFuYWdlc0QxID8gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXNbMF0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoID09PSAwICYmIGRyaXp6bGVLaXRNYW5hZ2VzRDEgJiYgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKCd3YiBkZXBsb3kgc3VwcG9ydHMgZHJpenpsZS1raXQgbWlncmF0aW9ucyBvbmx5IGZvciBhIHNpbmdsZSBEMSBiaW5kaW5nOyBmb3VuZCBtdWx0aXBsZS4nKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgbWFuYWdlZEQxRGF0YWJhc2VzID0gbmV3IFNldCh3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzKTtcbiAgICBpZiAoZHJpenpsZUQxRGF0YWJhc2UpIG1hbmFnZWREMURhdGFiYXNlcy5hZGQoZHJpenpsZUQxRGF0YWJhc2UpO1xuICAgIGNvbnN0IHVubWFuYWdlZEQxRGF0YWJhc2VzID0gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMuZmlsdGVyKChkYXRhYmFzZSkgPT4gIW1hbmFnZWREMURhdGFiYXNlcy5oYXMoZGF0YWJhc2UpKTtcbiAgICBpZiAodW5tYW5hZ2VkRDFEYXRhYmFzZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gU2F5IHNvIG91dCBsb3VkIGluc3RlYWQgb2Ygc2lsZW50bHkgZGVwbG95aW5nIGNvZGUgYWdhaW5zdCB1bm1pZ3JhdGVkIGRhdGFiYXNlczogdGhlXG4gICAgICAvLyBkcml6emxlIG1hcmtlciBkZXRlY3Rpb24gaXMgaGV1cmlzdGljICh0ZXh0IHNjYW4gb2YgZHJpenpsZS5jb25maWcuKiksIHNvIGEgcHJvamVjdCB0aGF0XG4gICAgICAvLyBnZW51aW5lbHkgbWlncmF0ZXMgRDEgbXVzdCBiZSBhYmxlIHRvIG5vdGljZSB3aGVuIG5vIG1lY2hhbmlzbSB3YXMgc2VsZWN0ZWQuIFRoaXMgYWxzb1xuICAgICAgLy8gY292ZXJzIHBhcnRpYWwgbGF5b3V0cyAoc29tZSBiaW5kaW5ncyB3cmFuZ2xlci1uYXRpdmUsIG90aGVycyB1bm1hbmFnZWQpLlxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgYE5vIEQxIG1pZ3JhdGlvbiBtZWNoYW5pc20gZGV0ZWN0ZWQgZm9yICR7dW5tYW5hZ2VkRDFEYXRhYmFzZXNcbiAgICAgICAgICAgIC5tYXAoKGRhdGFiYXNlKSA9PiBkYXRhYmFzZS5iaW5kaW5nID8/IGRhdGFiYXNlLmRhdGFiYXNlX25hbWUgPz8gJ3VubmFtZWQgYmluZGluZycpXG4gICAgICAgICAgICAuam9pbignLCAnKX0gYCArXG4gICAgICAgICAgICAnKG5vIHdyYW5nbGVyIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IGFuZCBubyBkcml6emxlIGNvbmZpZyB0YXJnZXRpbmcgc3FsaXRlL2QxLWh0dHAvZHVyYWJsZS1zcWxpdGUpOyB3YiBkZXBsb3kgd2lsbCBub3QgcnVuIEQxIG1pZ3JhdGlvbnMgZm9yIHRoZW0uJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBEcnkgcnVucyBleGVjdXRlIG5vdGhpbmcgYXV0aGVudGljYXRlZCwgc28gdGhleSBza2lwIHRoZSBjcmVkZW50aWFsIHByZWZsaWdodCBlbnRpcmVseS5cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICAvLyBBIGRyaXp6bGUtc2VsZWN0ZWQgRDEgZGF0YWJhc2Ugcm91dGVzIGJvdGggdGhlIG1pZ3JhdGlvbiBpbiBzdGVwIDMgYW5kIGFueSBkZXBsb3kvcG9zdFxuICAgICAgLy8gaG9vayB0aHJvdWdoIGRyaXp6bGUta2l0J3MgZDEtaHR0cCBkcml2ZXIsIHdoaWNoIG5lZWRzIENMT1VERkxBUkVfQVBJX1RPS0VOIGV2ZW4gZm9yXG4gICAgICAvLyBsb2NhbCwgd3JhbmdsZXItT0F1dGggZGVwbG95cy4gRmFpbGluZyBoZXJlIGtlZXBzIHRoZSBmYWlsLWZhc3Qgb3JkZXJpbmc6IGEgbWlzc2luZyB0b2tlblxuICAgICAgLy8gbXVzdCBhYm9ydCBiZWZvcmUgdGhlIGRlcGxveSBnb2VzIGxpdmUsIG5vdCBkdXJpbmcgbWlncmF0aW9uIG9yIGRlcGxveS9wb3N0XG4gICAgICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTU2KS4gV3JhbmdsZXItbmF0aXZlIHByb2plY3RzICh3aXRoIG9yXG4gICAgICAvLyB3aXRob3V0IGhvb2tzKSBtdXN0IG5vdCByZXF1aXJlIHRoZSB0b2tlbjogYSBsb2NhbCB3cmFuZ2xlciBPQXV0aCBsb2dpbiBzdWZmaWNlcyB0aGVyZSxcbiAgICAgIC8vIGV2ZW4gdGhvdWdoIHN0ZXAgNSBzdGlsbCBleHBvcnRzIENMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQgdG8gdGhlaXIgaG9va3MuXG4gICAgICBpZiAoZHJpenpsZUQxRGF0YWJhc2UgJiYgIXByb2plY3QuZW52LkNMT1VERkxBUkVfQVBJX1RPS0VOKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdDTE9VREZMQVJFX0FQSV9UT0tFTiBpcyByZXF1aXJlZCBmb3IgcmVtb3RlIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMuJykpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNXcmFuZ2xlckF1dGhlbnRpY2F0aW9uID1cbiAgICAgICAgISFwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9UT0tFTiB8fFxuICAgICAgICAhIXByb2plY3QuZW52LkNGX0FQSV9UT0tFTiB8fFxuICAgICAgICAhIShwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9LRVkgJiYgcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9FTUFJTCkgfHxcbiAgICAgICAgISEocHJvamVjdC5lbnYuQ0ZfQVBJX0tFWSAmJiBwcm9qZWN0LmVudi5DRl9FTUFJTCk7XG4gICAgICBpZiAoaXNDSShwcm9qZWN0LmVudi5DSSkgJiYgIWhhc1dyYW5nbGVyQXV0aGVudGljYXRpb24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1dyYW5nbGVyIGF1dGhlbnRpY2F0aW9uIChlLmcuIENMT1VERkxBUkVfQVBJX1RPS0VOKSBpcyByZXF1aXJlZCB0byBkZXBsb3kgb24gQ0kuJykpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwLXNwZWNpZmljIHZhbGlkYXRpb24gaG9vayAoZS5nLiBzZWNyZXQgcGFpcnMgdGhhdCBtdXN0IGJlIGJvdGgtc2V0LW9yLWJvdGgtZW1wdHkpLlxuICAgIC8vIFRoZSByZXVzYWJsZSBkZXBsb3kueW1sIGFscmVhZHkgcnVucyBpdCBvbiBDSTsgcnVuIGl0IGhlcmUgZm9yIGxvY2FsIGRlcGxveXMuXG4gICAgaWYgKCFpc0NJKHByb2plY3QuZW52LkNJKSAmJiBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGVwbG95L2NpLXNldHVwJ10pIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZGVwbG95L2NpLXNldHVwJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgLy8gMS4gUmVzb2x2ZSBhbmQgdmFsaWRhdGUgYWxsIHNlY3JldHMgYmVmb3JlIGFueSBidWlsZCBvciByZW1vdGUgbXV0YXRpb24sIHNvIGEgbWlzc2luZ1xuICAgIC8vICAgIHNlY3JldCBhYm9ydHMgdGhlIGRlcGxveSBpbnN0ZWFkIG9mIGxlYXZpbmcgYSBtaWdyYXRlZCBkYXRhYmFzZSBiZWhpbmQgYW4gb2xkIFdvcmtlci5cbiAgICBjb25zdCBbZW52VmFycywgZW52U291cmNlc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gUmVzdHJpY3QgdGhlIHNlY3JldHMgZG9tYWluIHRvIGtleXMgdGhlIHByb2plY3QncyBmbm94IGNvbmZpZ3VyYXRpb24gZGVjbGFyZXM6IGBtaXNlIGVudmBcbiAgICAvLyBvdXRwdXQgKHJlcG9ydGVkIGFzIGEgcHNldWRvLXNvdXJjZSkgbWl4ZXMgaW4gaG9zdC90b29sIHZhcmlhYmxlcyBzdWNoIGFzIENBUkdPX0hPTUUsXG4gICAgLy8gd2hpY2ggbXVzdCBuZXZlciBiZSB1cGxvYWRlZCBhcyBXb3JrZXIgc2VjcmV0cy5cbiAgICBjb25zdCBmbm94S2V5cyA9IG5ldyBTZXQoXG4gICAgICBlbnZTb3VyY2VzLmZpbHRlcigoW3NvdXJjZV0pID0+ICFzb3VyY2Uuc3RhcnRzV2l0aCgnbWlzZSBlbnYnKSkuZmxhdE1hcCgoWywga2V5c10pID0+IGtleXMpXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgaWYgKCFmbm94S2V5cy5oYXMoa2V5KSkgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gICAgLy8gTmFtZXMgZGVjbGFyZWQgdmlhIHdyYW5nbGVyIGBzZWNyZXRzLnJlcXVpcmVkYCBtYXkgbGlrZXdpc2UgYmUgc3VwcGxpZWQgcHVyZWx5IGFzXG4gICAgLy8gZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuIENJIHdvcmtmbG93IGVudikgaW5zdGVhZCBvZiBmbm94IHZhbHVlcy5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZXNvbHZlZENvbmZpZy5yZXF1aXJlZFNlY3JldE5hbWVzKSB7XG4gICAgICBjb25zdCBleHBvcnRlZFZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlbnZWYXJzW2tleV0gPT09IHVuZGVmaW5lZCAmJiBleHBvcnRlZFZhbHVlICE9PSB1bmRlZmluZWQpIGVudlZhcnNba2V5XSA9IGV4cG9ydGVkVmFsdWU7XG4gICAgfVxuICAgIC8vIEV4cGxpY2l0bHkgZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3Qgd2luIG92ZXIgZG90ZW52IHZhbHVlcyAocHJvamVjdC5lbnYgYWxyZWFkeVxuICAgIC8vIGFwcGxpZXMgdGhhdCBwcmVjZWRlbmNlKSwgb3IgYEFVVEhfU0VDUkVUPS4uLiB3YiBkZXBsb3lgIHdvdWxkIHB1c2ggdGhlIHN0YWxlIGZpbGUgdmFsdWUuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlZmZlY3RpdmVWYWx1ZSAhPT0gdW5kZWZpbmVkKSBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG4gICAgY29uc3Qgc2VjcmV0cyA9IHNlbGVjdFdvcmtlclNlY3JldHMoZW52VmFycywgWy4uLnJlc29sdmVkQ29uZmlnLnZhcktleXMsIC4uLnJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lc10pO1xuICAgIC8vIGAtLXZhciBXQl9WRVJTSU9OOi4uLmAgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIG9uIGRlcGxveSwgc28gYVxuICAgIC8vIHJlc291cmNlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIHdvdWxkIHNpbGVudGx5IGJlY29tZSBhIHN0cmluZyB2YXJpYWJsZS5cbiAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTiAmJiByZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMoJ1dCX1ZFUlNJT04nKSkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1dCX1ZFUlNJT04gY29sbGlkZXMgd2l0aCBhIFdvcmtlciBiaW5kaW5nIG5hbWU7IHJlbmFtZSB0aGUgYmluZGluZy4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGJpbmRpbmdDb2xsaXNpb25zID0gT2JqZWN0LmtleXMoZW52VmFycykuZmlsdGVyKChrZXkpID0+IHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lcy5pbmNsdWRlcyhrZXkpKTtcbiAgICBpZiAoYmluZGluZ0NvbGxpc2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVXBsb2FkaW5nIGEgc2VjcmV0IG5hbWVkIGxpa2UgYSBiaW5kaW5nIHdvdWxkIHJlcGxhY2UgdGhlIGJpbmRpbmcgd2l0aCBhIHBsYWluIHN0cmluZy5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGBTa2lwcGluZyBlbnYga2V5cyB0aGF0IGNvbGxpZGUgd2l0aCBXb3JrZXIgYmluZGluZyBuYW1lczogJHtiaW5kaW5nQ29sbGlzaW9ucy5qb2luKCcsICcpfWApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBXcmFuZ2xlciB2YWxpZGF0ZXMgYHNlY3JldHMucmVxdWlyZWRgIG9ubHkgZHVyaW5nIHRoZSByZWFsIHVwbG9hZCDigJQgYWZ0ZXIgbWlncmF0aW9ucyDigJRcbiAgICAvLyBzbyB3YiBjaGVja3MgdXBmcm9udDogZWFjaCByZXF1aXJlZCBuYW1lIG11c3QgYmUgYSBrZXkgaW4gdGhlIG91dGdvaW5nIHBheWxvYWQgKHByZXNlbmNlLFxuICAgIC8vIG5vdCB0cnV0aGluZXNzIOKAlCBhbiBleHBsaWNpdCBlbXB0eSBjbGVhcnMgYSBzdGFsZSB2YWx1ZSkgb3IgYW4gZWZmZWN0aXZlIHZhci9iaW5kaW5nLlxuICAgIGNvbnN0IHVuc2F0aXNmaWVkUmVxdWlyZWRTZWNyZXROYW1lcyA9IHJlc29sdmVkQ29uZmlnLnJlcXVpcmVkU2VjcmV0TmFtZXMuZmlsdGVyKFxuICAgICAgKG5hbWUpID0+XG4gICAgICAgICFPYmplY3QuaGFzT3duKHNlY3JldHMsIG5hbWUpICYmXG4gICAgICAgICFyZXNvbHZlZENvbmZpZy52YXJLZXlzLmluY2x1ZGVzKG5hbWUpICYmXG4gICAgICAgICFyZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMobmFtZSlcbiAgICApO1xuICAgIGlmICh1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBTZWNyZXRzIHJlcXVpcmVkIGJ5IHRoZSB3cmFuZ2xlciBjb25maWcgYXJlIG5vdCBwcm92aWRlZDogJHt1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMuam9pbignLCAnKX1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IHNlY3JldEtleXMgPSBPYmplY3Qua2V5cyhzZWNyZXRzKS50b1NvcnRlZCgpO1xuICAgIC8vIENsb3VkZmxhcmUgbGltaXRzIGEgYnVsayB1cGxvYWQgdG8gMTAwIHNlY3JldHMsIGVhY2ggdmFyaWFibGUvc2VjcmV0IHZhbHVlIHRvIDUgS0IsIGFuZFxuICAgIC8vIHRoZSBjb21iaW5lZCB2YXJpYWJsZStzZWNyZXQgY291bnQgdG8gMTI4ICg2NCBvbiB0aGUgRnJlZSBwbGFuLCB3aGljaCBjYW5ub3QgYmUgZGV0ZWN0ZWRcbiAgICAvLyBoZXJlIOKAlCBoZW5jZSBhIHdhcm5pbmcpLiBGYWlsaW5nIGJlZm9yZSBhbnkgYnVpbGQgb3IgbWlncmF0aW9uIGtlZXBzIGFuIG92ZXJzaXplZCBwYXlsb2FkXG4gICAgLy8gZnJvbSBhYm9ydGluZyB0aGUgZGVwbG95IGFmdGVyIHJlbW90ZSBtaWdyYXRpb25zIGFscmVhZHkgcmFuLlxuICAgIGlmIChzZWNyZXRLZXlzLmxlbmd0aCA+IDEwMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKGBDbG91ZGZsYXJlIGFjY2VwdHMgYXQgbW9zdCAxMDAgc2VjcmV0cyBwZXIgZGVwbG95LCBidXQgJHtzZWNyZXRLZXlzLmxlbmd0aH0gd2VyZSBzZWxlY3RlZC5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gVGhlIENMSS1wcm92aWRlZCBXQl9WRVJTSU9OIG92ZXJsYXlzIGEgY29uZmlndXJlZCB2YXIgb2YgdGhlIHNhbWUgbmFtZSBvbiBkZXBsb3ksXG4gICAgLy8gc28gb25seSB0aGUgZWZmZWN0aXZlIHZhbHVlIHBhcnRpY2lwYXRlcyBpbiB0aGUgbGltaXQgY2hlY2tzLlxuICAgIGNvbnN0IGVmZmVjdGl2ZVZhcnMgPSBuZXcgTWFwKE9iamVjdC5lbnRyaWVzPHVua25vd24+KHJlc29sdmVkQ29uZmlnLnZhcnMpKTtcbiAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTikgZWZmZWN0aXZlVmFycy5zZXQoJ1dCX1ZFUlNJT04nLCBwcm9qZWN0LmVudi5XQl9WRVJTSU9OKTtcbiAgICBjb25zdCB2YXJFbnRyaWVzID0gWy4uLmVmZmVjdGl2ZVZhcnNdO1xuICAgIGNvbnN0IG92ZXJzaXplZEtleXMgPSBbXG4gICAgICAuLi5zZWNyZXRLZXlzLmZpbHRlcigoa2V5KSA9PiBCdWZmZXIuYnl0ZUxlbmd0aChzZWNyZXRzW2tleV0gPz8gJycsICd1dGY4JykgPiA1ICogMTAyNCksXG4gICAgICAuLi52YXJFbnRyaWVzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKFssIHZhbHVlXSkgPT4gQnVmZmVyLmJ5dGVMZW5ndGgodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpLCAndXRmOCcpID4gNSAqIDEwMjRcbiAgICAgICAgKVxuICAgICAgICAubWFwKChba2V5XSkgPT4ga2V5KSxcbiAgICBdO1xuICAgIGlmIChvdmVyc2l6ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBWYXJpYWJsZSBvciBzZWNyZXQgdmFsdWVzIGV4Y2VlZCBDbG91ZGZsYXJlJ3MgNSBLQiBsaW1pdDogJHtvdmVyc2l6ZWRLZXlzLmpvaW4oJywgJyl9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBgLS1zZWNyZXRzLWZpbGVgIGlzIGFkZGl0aXZlOiByZW1vdGUgc2VjcmV0cyBhYnNlbnQgZnJvbSB0aGUgcGF5bG9hZCBzdGF5IGF0dGFjaGVkIHRvIHRoZVxuICAgIC8vIG5ldyB2ZXJzaW9uLCBzbyB0aGV5IGNvdW50IGFnYWluc3QgdGhlIGNvbWJpbmVkIGxpbWl0IHRvby4gTGlzdGluZyB0aGVtIG5lZWRzIGFuXG4gICAgLy8gYXV0aGVudGljYXRlZCByZW1vdGUgcm91bmQtdHJpcCwgd2hpY2ggZHJ5IHJ1bnMgc2tpcDsgd2hlbiB0aGUgbGlzdGluZyBmYWlscyBmb3IgYW55XG4gICAgLy8gcmVhc29uIG90aGVyIHRoYW4gYSBub3QteWV0LWNyZWF0ZWQgV29ya2VyLCBkZWdyYWRlIHRvIHRoZSBsb2NhbC1vbmx5IGNvdW50IGluc3RlYWQgb2ZcbiAgICAvLyBibG9ja2luZyBhIGRlcGxveSB0aGF0IHdyYW5nbGVyIGl0c2VsZiBtaWdodCBhY2NlcHQuXG4gICAgY29uc3QgcmVtb3RlU2VjcmV0TmFtZXMgPSBhcmd2LmRyeVJ1blxuICAgICAgPyBbXVxuICAgICAgOiBhd2FpdCBsaXN0UmVtb3RlV29ya2VyU2VjcmV0TmFtZXMocHJvamVjdCwgYXJndiwgd3JhbmdsZXJDb25maWdQYXRoLCByZXNvbHZlZENvbmZpZywgZW52TmFtZSk7XG4gICAgY29uc3QgaW5oZXJpdGVkU2VjcmV0TmFtZXMgPSBzZWxlY3RJbmhlcml0ZWRSZW1vdGVTZWNyZXROYW1lcyhcbiAgICAgIHJlbW90ZVNlY3JldE5hbWVzID8/IFtdLFxuICAgICAgc2VjcmV0cyxcbiAgICAgIHZhckVudHJpZXMubWFwKChba2V5XSkgPT4ga2V5KSxcbiAgICAgIHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lc1xuICAgICk7XG4gICAgY29uc3QgY29tYmluZWRDb3VudCA9XG4gICAgICBuZXcgU2V0KFsuLi5zZWNyZXRLZXlzLCAuLi52YXJFbnRyaWVzLm1hcCgoW2tleV0pID0+IGtleSldKS5zaXplICsgaW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RoO1xuICAgIGNvbnN0IGluaGVyaXRlZE5vdGUgPVxuICAgICAgaW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RoID4gMFxuICAgICAgICA/IGAgKGluY2x1ZGluZyAke2luaGVyaXRlZFNlY3JldE5hbWVzLmxlbmd0aH0gcmVtb3RlIHNlY3JldHMga2VwdCBmcm9tIHRoZSBwcmV2aW91cyB2ZXJzaW9uOiAke2luaGVyaXRlZFNlY3JldE5hbWVzLmpvaW4oJywgJyl9KWBcbiAgICAgICAgOiAnJztcbiAgICBpZiAoY29tYmluZWRDb3VudCA+IDEyOCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBDbG91ZGZsYXJlIGFsbG93cyBhdCBtb3N0IDEyOCB2YXJpYWJsZXMgYW5kIHNlY3JldHMgY29tYmluZWQsIGJ1dCAke2NvbWJpbmVkQ291bnR9IHdlcmUgc2VsZWN0ZWQke2luaGVyaXRlZE5vdGV9LmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKGNvbWJpbmVkQ291bnQgPiA2NCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coYCR7Y29tYmluZWRDb3VudH0gdmFyaWFibGVzIGFuZCBzZWNyZXRzJHtpbmhlcml0ZWROb3RlfSBleGNlZWQgdGhlIEZyZWUgcGxhbidzIGxpbWl0IG9mIDY0LmApXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5jeWFuKFxuICAgICAgICBgRGVwbG95aW5nICR7cmVzb2x2ZWRDb25maWcud29ya2VyTmFtZSA/PyBwcm9qZWN0Lm5hbWV9ICgke2Vudk5hbWV9KSB3aXRoICR7c2VjcmV0S2V5cy5sZW5ndGh9IHNlY3JldHM6ICR7c2VjcmV0S2V5cy5qb2luKCcsICcpfWBcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gMi4gQnVpbGQgKHZpbmV4dCBlbWJlZHMgdGhlIGVudmlyb25tZW50LWFwcGxpZWQgd3JhbmdsZXIgY29uZmlnIGludG8gZGlzdC9zZXJ2ZXIvd3JhbmdsZXIuanNvbikuXG4gICAgLy8gICAgQnVpbGRpbmcgYmVmb3JlIG1pZ3JhdGluZyBrZWVwcyBhIGJ1aWxkIGZhaWx1cmUgZnJvbSBsZWF2aW5nIGEgbWlncmF0ZWQgc2NoZW1hIGJlaGluZFxuICAgIC8vICAgIHRoZSBvbGQgV29ya2VyLiBQbGFpbiBXb3JrZXJzIGhhdmUgbm8gYnVpbGQgc3RlcDsgd3JhbmdsZXIgYnVuZGxlcyB0aGUgZW50cnkgaXRzZWxmLlxuICAgIGNvbnN0IGlzVmluZXh0ID0gISEocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpbmV4dCA/PyBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udmluZXh0KTtcbiAgICBjb25zdCBkZXBsb3lDb25maWdQYXRoID0gaXNWaW5leHQgPyBwYXRoLmpvaW4oJ2Rpc3QnLCAnc2VydmVyJywgJ3dyYW5nbGVyLmpzb24nKSA6IHdyYW5nbGVyQ29uZmlnUGF0aDtcbiAgICBjb25zdCBjbG91ZGZsYXJlRW52QXNzaWdubWVudCA9IHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uXG4gICAgICA/IGAke2J1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQoJ0NMT1VERkxBUkVfRU5WJywgZW52TmFtZSl9IGBcbiAgICAgIDogJyc7XG4gICAgaWYgKGlzVmluZXh0KSB7XG4gICAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTikge1xuICAgICAgICBwcm9qZWN0LmVudi5ORVhUX1BVQkxJQ19XQl9WRVJTSU9OIHx8PSBwcm9qZWN0LmVudi5XQl9WRVJTSU9OO1xuICAgICAgfVxuICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZ2VuLWNvZGUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtjbG91ZGZsYXJlRW52QXNzaWdubWVudH1ZQVJOIHZpbmV4dCBidWlsZGAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgLy8gT24gZHJ5IHJ1bnMgdGhlIHZpbmV4dCBidWlsZCBhYm92ZSBpcyBhIHByaW50ZWQgbm8tb3AsIHNvIHRoZSBidWlsdCBjb25maWcgaXNcbiAgICAgIC8vIGxlZ2l0aW1hdGVseSBhYnNlbnQgYW5kIG11c3Qgbm90IGFib3J0IHRoZSBydW4uXG4gICAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRlcGxveUNvbmZpZ1BhdGgpKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgJHtkZXBsb3lDb25maWdQYXRofSBub3QgZm91bmQ7IHRoZSB2aW5leHQgYnVpbGQgZGlkIG5vdCBwcm9kdWNlIGEgZGVwbG95IGNvbmZpZy5gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIC8vIFdyYW5nbGVyIHZhbGlkYXRlcyBpdHMgY29uZmlnIHNjaGVtYSBvbmx5IHdoZW4gaXQgcnVucywgc28gYSBkcnkgcnVuIG9mIHRoZSBidWlsdFxuICAgICAgLy8gY29uZmlnIHN1cmZhY2VzIGNvbmZpZyBhbmQgYnVuZGxlIGVycm9ycyBCRUZPUkUgdGhlIHJlbW90ZSBtaWdyYXRpb25zIGJlbG93IG11dGF0ZVxuICAgICAgLy8gdGhlIGRhdGFiYXNlLCBtaXJyb3JpbmcgdGhlIHBsYWluLVdvcmtlciBkcnkgcnVuLiBObyAtLWVudjogdGhlIGJ1aWx0IGNvbmZpZyBhbHJlYWR5XG4gICAgICAvLyBoYXMgdGhlIGVudmlyb25tZW50IGFwcGxpZWQuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBZQVJOIHdyYW5nbGVyIGRlcGxveSAtLWRyeS1ydW4gLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGRlcGxveUNvbmZpZ1BhdGgpfWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBsYWluIFdvcmtlcnMgYXJlIGZpcnN0IGNvbXBpbGVkIGJ5IHdyYW5nbGVyIGR1cmluZyB0aGUgZGVwbG95IGl0c2VsZjsgYSBkcnkgcnVuXG4gICAgICAvLyBzdXJmYWNlcyBjb21waWxlIGVycm9ycyAoZS5nLiBhIG1pc3NpbmcgZW50cnkgcG9pbnQpIEJFRk9SRSB0aGUgcmVtb3RlIG1pZ3JhdGlvbnNcbiAgICAgIC8vIGJlbG93IG11dGF0ZSB0aGUgZGF0YWJhc2UuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBZQVJOIHdyYW5nbGVyIGRlcGxveSAtLWRyeS1ydW4gLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KHdyYW5nbGVyQ29uZmlnUGF0aCl9JHtyZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IGAgLS1lbnYgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGVudk5hbWUpfWAgOiAnJ31gLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIEFwcGx5IEQxIG1pZ3JhdGlvbnMgdG8gdGhlIHJlbW90ZSBkYXRhYmFzZSB3aXRoIHRoZSBwcm9qZWN0J3Mgc2luZ2xlIG1pZ3JhdGlvblxuICAgIC8vICAgIG1lY2hhbmlzbSAod3JhbmdsZXItbmF0aXZlIHdoZW4gYSBtaWdyYXRpb25zIGRpcmVjdG9yeSBleGlzdHMsIGVsc2UgZHJpenpsZS1raXQgd2hlblxuICAgIC8vICAgIHRoZSBkcml6emxlIGNvbmZpZyB0YXJnZXRzIHNxbGl0ZS9kMS1odHRwL2R1cmFibGUtc3FsaXRlKS4gTWlncmF0aW9ucyBtdXN0IGJlIGJhY2t3YXJkXG4gICAgLy8gICAgY29tcGF0aWJsZTogdGhlIG9sZCBXb3JrZXIgc2VydmVzXG4gICAgLy8gICAgdHJhZmZpYyB1bnRpbCB0aGUgZGVwbG95IGJlbG93LlxuICAgIGNvbnN0IGVudk9wdGlvbiA9IHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gYCAtLWVudiAke3NoZWxsRXNjYXBlQXJndW1lbnQoZW52TmFtZSl9YCA6ICcnO1xuICAgIGZvciAoY29uc3QgZGF0YWJhc2Ugb2Ygd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcykge1xuICAgICAgY29uc3QgZGF0YWJhc2VOYW1lID0gZGF0YWJhc2UuZGF0YWJhc2VfbmFtZSA/PyBkYXRhYmFzZS5iaW5kaW5nO1xuICAgICAgaWYgKCFkYXRhYmFzZU5hbWUpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBgQ0k9dHJ1ZSBZQVJOIHdyYW5nbGVyIGQxIG1pZ3JhdGlvbnMgYXBwbHkgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGRhdGFiYXNlTmFtZSl9IC0tcmVtb3RlIC0tY29uZmlnICR7c2hlbGxFc2NhcGVBcmd1bWVudCh3cmFuZ2xlckNvbmZpZ1BhdGgpfSR7ZW52T3B0aW9ufWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkcml6emxlRDFEYXRhYmFzZSkge1xuICAgICAgaWYgKCFkcml6emxlRDFEYXRhYmFzZS5kYXRhYmFzZV9pZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgVGhlICR7ZW52TmFtZX0gRDEgYmluZGluZyBoYXMgbm8gZGF0YWJhc2VfaWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZy5gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGlmICghYWNjb3VudElkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgJ0NMT1VERkxBUkVfQUNDT1VOVF9JRCAob3IgYWNjb3VudF9pZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnKSBpcyByZXF1aXJlZCBmb3IgcmVtb3RlIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMuJ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBidWlsZERyaXp6bGVLaXRDb21tYW5kKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgJ21pZ3JhdGUnLFxuICAgICAgICAgIGBDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEPSR7ZHJpenpsZUQxRGF0YWJhc2UuZGF0YWJhc2VfaWR9IENMT1VERkxBUkVfQUNDT1VOVF9JRD0ke2FjY291bnRJZH1gXG4gICAgICAgICksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gNC4gRGVwbG95IGNvZGUgYW5kIHNlY3JldHMgYXRvbWljYWxseSAobm8gcG9zdC1kZXBsb3kgc2VjcmV0IHB1c2ggdGhhdCBjb3VsZCBsZWF2ZSB0aGVcbiAgICAvLyAgICBuZXcgdmVyc2lvbiBydW5uaW5nIHdpdGhvdXQg4oCUIG9yIHdpdGggc3RhbGUg4oCUIHNlY3JldHMpLiBUaGUgc2VjcmV0cyBKU09OIGdvZXMgdGhyb3VnaFxuICAgIC8vICAgIGEgbW9kZS0wNjAwIGZpbGUgaW4gYSBwcml2YXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgZGVsZXRlZCByaWdodCBhZnRlciB0aGUgZGVwbG95OlxuICAgIC8vICAgIC9kZXYvc3RkaW4gaXMgTk9UIHJlbGlhYmxlIGhlcmUgYmVjYXVzZSB3cmFuZ2xlciByZWFkcyB0aGUgc2VjcmV0cyBmaWxlIG9ubHkgYWZ0ZXJcbiAgICAvLyAgICB1cGxvYWRpbmcgYXNzZXRzLCBieSB3aGljaCBwb2ludCB0aGUgcGlwZWQgc3RkaW4gbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNvbnN1bWVkIOKAlFxuICAgIC8vICAgIG9ic2VydmVkIGFzIGEgZmxha3kgYENvdWxkIG5vdCByZWFkIGZpbGU6IC9kZXYvc3RkaW5gIG9uIENJLiBFeHBsaWNpdGx5IGVtcHR5IHZhbHVlc1xuICAgIC8vICAgIHN0YXkgaW4gdGhlIHBheWxvYWQ6IC0tc2VjcmV0cy1maWxlIGlzIGFkZGl0aXZlLCBzbyBwdXNoaW5nICcnIGlzIHRoZSBvbmx5IHdheSB0b1xuICAgIC8vICAgIGNsZWFyIGEgc3RhbGUgc2VjcmV0LlxuICAgIGNvbnN0IGRlcGxveUFyZ3MgPSBbXG4gICAgICAnZGVwbG95JyxcbiAgICAgICctLWNvbmZpZycsXG4gICAgICBkZXBsb3lDb25maWdQYXRoLFxuICAgICAgLy8gdmluZXh0J3MgYnVpbHQgY29uZmlnIGFscmVhZHkgaGFzIHRoZSBlbnZpcm9ubWVudCBhcHBsaWVkOyBwYXNzaW5nIC0tZW52IHRoZXJlIHdvdWxkXG4gICAgICAvLyBhcHBseSB0aGUgZW52aXJvbm1lbnQgc3VmZml4IHR3aWNlLlxuICAgICAgLi4uKCFpc1ZpbmV4dCAmJiByZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IFsnLS1lbnYnLCBlbnZOYW1lXSA6IFtdKSxcbiAgICAgIC4uLihwcm9qZWN0LmVudi5XQl9WRVJTSU9OID8gWyctLXZhcicsIGBXQl9WRVJTSU9OOiR7cHJvamVjdC5lbnYuV0JfVkVSU0lPTn1gXSA6IFtdKSxcbiAgICAgICctLXNlY3JldHMtZmlsZScsXG4gICAgXTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgUnVubmluZzogd3JhbmdsZXIgJHtkZXBsb3lBcmdzLmpvaW4oJyAnKX0gPHRlbXBvcmFyeSBzZWNyZXRzIGZpbGU+YCkpO1xuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdCk7XG4gICAgICBjb25zdCBkZXBsb3lFbnYgPSB7IC4uLnByb2plY3QuZW52IH07XG4gICAgICBkZWxldGUgZGVwbG95RW52LkNMT1VERkxBUkVfRU5WO1xuICAgICAgLy8gMG83MDAgZGlyZWN0b3J5ICsgMG82MDAgZmlsZTogcmVhZGFibGUgb25seSBieSB0aGUgZGVwbG95aW5nIHVzZXIsIGxpa2UgdGhlIGRvdGVudlxuICAgICAgLy8gZmlsZXMgdGhlIENJIHdvcmtmbG93IGFscmVhZHkgd3JpdGVzIG5leHQgdG8gaXQuIHdyYW5nbGVyIHJ1bnMgdGhyb3VnaCBhbiBhc3luYyBzcGF3blxuICAgICAgLy8gKHNwYXduU3luYyB3b3VsZCBibG9jayB0aGUgZXZlbnQgbG9vcCwgc28gYSBzaHV0ZG93biBzaWduYWwgd291bGQga2lsbCB0aGUgcHJvY2Vzc1xuICAgICAgLy8gYmVmb3JlIGFueSBjbGVhbnVwKSBhbmQgdGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkIGluIGEgZmluYWxseSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgICAgIC8vIGRlcGxveSBjYW5ub3QgbGVhdmUgdGhlIHBsYWludGV4dCBzZWNyZXRzIGJlaGluZC4gU2h1dGRvd24gaGFuZGxpbmcgZGV0YWlsczpcbiAgICAgIC8vIC0gSGFuZGxlcnMgKGluY2x1ZGluZyBTSUdIVVAsIG9uIHdoaWNoIE5vZGUgYWxzbyB0ZXJtaW5hdGVzIGJ5IGRlZmF1bHQpIGFyZSBpbnN0YWxsZWRcbiAgICAgIC8vICAgQkVGT1JFIHRoZSBmaWxlIGlzIHdyaXR0ZW4gYW5kIHVzZSBwcm9jZXNzLm9uLCBub3Qgb25jZSwgc28gYSByZXBlYXRlZCBzaWduYWwgY2Fubm90XG4gICAgICAvLyAgIGZhbGwgYmFjayB0byBkZWZhdWx0IHRlcm1pbmF0aW9uIGFuZCBieXBhc3MgdGhlIGZpbmFsbHkgY2xlYW51cC5cbiAgICAgIC8vIC0gU0lHSFVQL1NJR1FVSVQgYXJlIGZvcndhcmRlZCB0byB3cmFuZ2xlciBhcyBTSUdURVJNOiB3cmFuZ2xlcidzIGxhdW5jaGVyIHJlbGF5cyBvbmx5XG4gICAgICAvLyAgIFNJR0lOVC9TSUdURVJNIHRvIGl0cyBpbm5lciBOb2RlIHByb2Nlc3MsIGFuZCBhbnl0aGluZyBlbHNlIHdvdWxkIG9ycGhhbiBhIGRlcGxveW1lbnRcbiAgICAgIC8vICAgdGhhdCBrZWVwcyBtdXRhdGluZyB0aGUgcmVtb3RlIFdvcmtlciBhZnRlciB3YiBleGl0cy5cbiAgICAgIC8vIC0gVGhlIHJlLXJhaXNlIGJlbG93IHVzZXMgdGhlIHNpZ25hbCB3YiBpdHNlbGYgcmVjZWl2ZWQ6IHdyYW5nbGVyIGNhdGNoZXMgU0lHSU5UIGFuZFxuICAgICAgLy8gICBleGl0cyBudW1lcmljYWxseSAoZS5nLiAxNDMpLCB3aGljaCBtdXN0IG5vdCBtYXNxdWVyYWRlIGFzIGFuIG9yZGluYXJ5IGZhaWx1cmUuXG4gICAgICBjb25zdCBzZWNyZXRzRGlyUGF0aCA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diLWRlcGxveS0nKSk7XG4gICAgICBjb25zdCBzaHV0ZG93blNpZ25hbHMgPSBbJ1NJR0hVUCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10gYXMgY29uc3Q7XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBsZXQgd3JhbmdsZXJQcm9jZXNzOiBSZXR1cm5UeXBlPHR5cGVvZiBzcGF3bj4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgcmVjZWl2ZWRTaHV0ZG93blNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaHV0ZG93blNpZ25hbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICByZWNlaXZlZFNodXRkb3duU2lnbmFsID8/PSBzaWduYWw7XG4gICAgICAgICAgaWYgKHdyYW5nbGVyUHJvY2Vzcykge1xuICAgICAgICAgICAgd3JhbmdsZXJQcm9jZXNzLmtpbGwoc2lnbmFsID09PSAnU0lHSU5UJyB8fCBzaWduYWwgPT09ICdTSUdURVJNJyA/IHNpZ25hbCA6ICdTSUdURVJNJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3NodXRkb3duU2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcy5ybVN5bmMoc2VjcmV0c0RpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIC8vIFdpdGggdGhlIGhhbmRsZXJzIHJlbW92ZWQsIHJlLXJhaXNpbmcgdHJpZ2dlcnMgdGhlIGRlZmF1bHQgYmVoYXZpb3IuXG4gICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgfVxuICAgICAgbGV0IGRlcGxveVN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VjcmV0c0ZpbGVQYXRoID0gcGF0aC5qb2luKHNlY3JldHNEaXJQYXRoLCAnc2VjcmV0cy5qc29uJyk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2VjcmV0c0ZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZWNyZXRzKSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgICAgICAgZGVwbG95U3RhdHVzID0gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2VzcyA9IHNwYXduKCd3cmFuZ2xlcicsIFsuLi5kZXBsb3lBcmdzLCBzZWNyZXRzRmlsZVBhdGhdLCB7XG4gICAgICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgICAgIGVudjogZGVwbG95RW52IGFzIE5vZGVKUy5Qcm9jZXNzRW52LFxuICAgICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2Vzcy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmVzb2x2ZSgxKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB3cmFuZ2xlclByb2Nlc3Mub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHNpZ25hbCA/IDEgOiAoY29kZSA/PyB1bmRlZmluZWQpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBwcm9jZXNzLmV4aXQgc2tpcHMgZmluYWxseSBibG9ja3MsIHNvIHRoZSBleGl0LW9uLWZhaWx1cmUgYmVsb3cgc3RheXMgb3V0c2lkZS5cbiAgICAgICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5vZmYoc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhzZWNyZXRzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlY2VpdmVkU2h1dGRvd25TaWduYWwpIHtcbiAgICAgICAgLy8gUmUtcmFpc2Ugc28gdGhlIGNhbGxlciBvYnNlcnZlcyB0aGUgc2FtZSBzaWduYWwtZGVyaXZlZCBleGl0IHN0YXR1cy5cbiAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCByZWNlaXZlZFNodXRkb3duU2lnbmFsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRlcGxveVN0YXR1cyAhPT0gMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgd3JhbmdsZXIgZGVwbG95IGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2RlcGxveVN0YXR1cyA/PyAndW5rbm93bid9LmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGRlcGxveVN0YXR1cyA/PyAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA1LiBPcHRpb25hbCBwb3N0LWRlcGxveSBob29rIChlLmcuIHNlZWRpbmcgdGhlIHJlbW90ZSBEMSB2aWEgZHJpenpsZSdzIGQxLWh0dHAgZHJpdmVyKS5cbiAgICAvLyAgICBBc3NpZ24gdGhlIHJlc29sdmVkIGlkcyB1bmNvbmRpdGlvbmFsbHk6IGEgc3RhbGUgZXhwb3J0ZWQgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRFxuICAgIC8vICAgIG11c3Qgbm90IHJlZGlyZWN0IHRoZSBob29rIHRvIGFub3RoZXIgZGF0YWJhc2UuXG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkZXBsb3kvcG9zdCddKSB7XG4gICAgICAvLyBUaGUgaWQgaXMgdW5hbWJpZ3VvdXMgb25seSB3aXRoIGEgc2luZ2xlIEQxIGJpbmRpbmc7IHdpdGggbXVsdGlwbGUsIHRoZSBob29rIG11c3RcbiAgICAgIC8vIHJlc29sdmUgaXRzIHRhcmdldCBpdHNlbGYuIENsZWFyIGZpcnN0IGVpdGhlciB3YXk6IGEgc3RhbGUgaW5oZXJpdGVkIGlkIG11c3Qgbm90XG4gICAgICAvLyByZWRpcmVjdCB0aGUgaG9vayB0byBhbm90aGVyIGRhdGFiYXNlLlxuICAgICAgY29uc3QgaG9va0QxRGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMSA/IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgZGVsZXRlIHByb2plY3QuZW52LkNMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQ7XG4gICAgICBpZiAocmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KCdNdWx0aXBsZSBEMSBiaW5kaW5ncyBleGlzdDsgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCBpcyBub3Qgc2V0IGZvciBkZXBsb3kvcG9zdC4nKSk7XG4gICAgICB9XG4gICAgICBpZiAoaG9va0QxRGF0YWJhc2U/LmRhdGFiYXNlX2lkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEID0gaG9va0QxRGF0YWJhc2UuZGF0YWJhc2VfaWQ7XG4gICAgICBpZiAoYWNjb3VudElkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FDQ09VTlRfSUQgPSBhY2NvdW50SWQ7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ1lBUk4gcnVuIGRlcGxveS9wb3N0JywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBSZWFkIHRoZSBDbG91ZGZsYXJlIEFQSSB0b2tlbiB0aGF0IENJIGRyb3BzIGluIGEgYC5lbnYuY2xvdWRmbGFyZWAgZmlsZSAoZS5nLiB0aGUgcmV1c2FibGVcbiAqIGRlcGxveSB3b3JrZmxvdydzIGBmaWxlX3BhdGhfMWApLCBsb29raW5nIGJlc2lkZSB0aGUgV29ya2VyJ3Mgd3JhbmdsZXIgY29uZmlnIGFuZCBhdCB0aGVcbiAqIG1vbm9yZXBvIHJvb3Qg4oCUIGBmaWxlX3BhdGhfMWAgaXMgcmVwby1yZWxhdGl2ZSwgc28gYm90aCBzcGVsbGluZ3Mgb2NjdXIgaW4gcHJhY3RpY2UuXG4gKiBOZWFyZXIgZmlsZXMgd2luOiBhIHdvcmtzcGFjZSBtYXkgb3ZlcnJpZGUgdGhlIHJvb3QgdG9rZW4sIG5ldmVyIHRoZSByZXZlcnNlLlxuICogYENMT1VERkxBUkVfRU5WYCBpcyBkcm9wcGVkOyBpdCB3b3VsZCBkb3VibGUtYXBwbHkgdGhlIGVudmlyb25tZW50IHN1ZmZpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRDbG91ZGZsYXJlRW52RmlsZXMoZGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBjdXJyZW50RGlyUGF0aCBvZiBuZXcgU2V0KHJvb3REaXJQYXRoID8gW2RpclBhdGgsIHJvb3REaXJQYXRoXSA6IFtkaXJQYXRoXSkpIHtcbiAgICBjb25zdCBjbG91ZGZsYXJlRW52UGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJy5lbnYuY2xvdWRmbGFyZScpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhjbG91ZGZsYXJlRW52UGF0aCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IGNsb3VkZmxhcmVFbnZQYXRoLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdDTE9VREZMQVJFX0VOVicpIGNvbnRpbnVlO1xuICAgICAgZW52VmFyc1trZXldID8/PSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogU2VsZWN0IHRoZSBzZWNyZXRzIHRvIHB1c2ggdG8gdGhlIFdvcmtlciBmcm9tIHRoZSBkb3RlbnYtbG9hZGVkIGVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIGV2ZXJ5IGV4cGxpY2l0bHkgc2V0IHZhbHVlIOKAlCBpbmNsdWRpbmcgZW1wdHkgc3RyaW5ncywgd2hpY2ggY2xlYXIgc3RhbGUgcmVtb3RlIHNlY3JldHNcbiAqIHNpbmNlIGB3cmFuZ2xlciBkZXBsb3kgLS1zZWNyZXRzLWZpbGVgIGlzIGFkZGl0aXZlIOKAlCBleGNlcHQgd3JhbmdsZXIgYHZhcnNgIChhIHNlY3JldCBtYXlcbiAqIG5vdCBzaGFyZSBhIG5hbWUgd2l0aCBhIHZhciksIGRlcGxveS1jb250cm9sIGtleXMsIGFuZCBsb2NhbCBgZmlsZTpgIERBVEFCQVNFX1VSTHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RXb3JrZXJTZWNyZXRzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGNvbmZpZ1ZhcktleXM6IHN0cmluZ1tdKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNvbmZpZ0tleXMgPSBuZXcgU2V0KGNvbmZpZ1ZhcktleXMpO1xuICBjb25zdCBzZWNyZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIC8vIE5vIHJ1bnRpbWUgdW5kZWZpbmVkIGNoZWNrIG9uIGB2YWx1ZWA6IGVudlZhcnMgaXMgYnVpbHQgZXhjbHVzaXZlbHkgZnJvbSBkb3RlbnYtcGFyc2VkXG4gIC8vIHN0cmluZ3MsIGFuZCBldmVyeSBjYWxsZXItc2lkZSBtZXJnZSBlaXRoZXIgY29hbGVzY2VzIHdpdGggYD8/ICcnYCBvciBndWFyZHMgYWdhaW5zdFxuICAvLyB1bmRlZmluZWQgYmVmb3JlIGFzc2lnbmluZywgc28gdGhlIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gdHlwZSBob2xkcyBhdCBydW50aW1lIHRvby5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICBpZiAoY29uZmlnS2V5cy5oYXMoa2V5KSB8fCBpc05vblNlY3JldEtleShrZXkpKSBjb250aW51ZTtcbiAgICBpZiAoa2V5ID09PSAnREFUQUJBU0VfVVJMJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdmaWxlOicpKSBjb250aW51ZTtcbiAgICBzZWNyZXRzW2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gc2VjcmV0cztcbn1cblxuLyoqXG4gKiBMaXN0IHRoZSBzZWNyZXQgbmFtZXMgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoZSBkZXBsb3kgdGFyZ2V0IFdvcmtlci4gUmV0dXJucyB1bmRlZmluZWQgd2hlblxuICogdGhlIGxpc3RpbmcgZmFpbHMgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiB0aGUgV29ya2VyIG5vdCBleGlzdGluZyB5ZXQgKGZpcnN0IGRlcGxveSksIHNvXG4gKiB0aGUgY2FsbGVyIGNhbiBkZWdyYWRlIHRvIHRoZSBsb2NhbC1vbmx5IGxpbWl0IGNoZWNrcyBpbnN0ZWFkIG9mIGJsb2NraW5nIGEgZGVwbG95IHRoYXRcbiAqIHdyYW5nbGVyIGl0c2VsZiBtaWdodCBhY2NlcHQuIEZhaWxpbmcgY2xvc2VkIGluc3RlYWQgd291bGQgdHVybiBldmVyeSB0cmFuc2llbnQgbGlzdGluZ1xuICogZmFpbHVyZSAobmV0d29yaywgYSB0b2tlbiB3aXRob3V0IHNlY3JldC1yZWFkIHBlcm1pc3Npb24pIGludG8gYSBkZXBsb3kgYmxvY2tlciwgYW5kIOKAlCBzaW5jZVxuICogd3JhbmdsZXIgNC54IHJlcG9ydHMgYSBtaXNzaW5nIFdvcmtlciBvbmx5IHZpYSBhbiBlcnJvci1tZXNzYWdlIGhpbnQg4oCUIGFueSB1bnJlY29nbml6ZWRcbiAqIG5vdC1mb3VuZCBzaGFwZSB3b3VsZCB0aGVuIGJsb2NrIGZpcnN0IGRlcGxveXMgZW50aXJlbHk7IHRoaXMgcHJlZmxpZ2h0IG11c3Qgb25seSBldmVyIGFkZFxuICogZmFpbHVyZXMgdGhhdCB3cmFuZ2xlciBpdHNlbGYgd291bGQgcmFpc2UgYWZ0ZXIgdGhlIG1pZ3JhdGlvbnMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RSZW1vdGVXb3JrZXJTZWNyZXROYW1lcyhcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogRGVwbG95Q29tbWFuZEFyZ3YsXG4gIHdyYW5nbGVyQ29uZmlnUGF0aDogc3RyaW5nLFxuICByZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyxcbiAgZW52TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB7XG4gIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdCk7XG4gIGNvbnN0IGxpc3RBcmdzID0gW1xuICAgICdzZWNyZXQnLFxuICAgICdsaXN0JyxcbiAgICAnLS1mb3JtYXQnLFxuICAgICdqc29uJyxcbiAgICAnLS1jb25maWcnLFxuICAgIHdyYW5nbGVyQ29uZmlnUGF0aCxcbiAgICAuLi4ocmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBbJy0tZW52JywgZW52TmFtZV0gOiBbXSksXG4gIF07XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiB3cmFuZ2xlciAke2xpc3RBcmdzLmpvaW4oJyAnKX1gKSk7XG4gIGxldCByZXQ7XG4gIHRyeSB7XG4gICAgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYygnd3JhbmdsZXInLCBsaXN0QXJncywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52IGFzIE5vZGVKUy5Qcm9jZXNzRW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICBgRmFpbGVkIHRvIHJ1biB3cmFuZ2xlciB0byBsaXN0IHJlbW90ZSBzZWNyZXRzOyBjaGVja2luZyBvbmx5IHRoZSBsb2NhbCBwYXlsb2FkIGFnYWluc3QgQ2xvdWRmbGFyZSdzIGxpbWl0cy5cXG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChyZXQuc3RhdHVzID09PSAwKSB7XG4gICAgLy8gQ3V0IHRoZSBKU09OIGFycmF5IG91dCBvZiB0aGUgc3Vycm91bmRpbmcgb3V0cHV0OiB3cmFuZ2xlciBtYXkgcHJpbnQgaXRzIGJhbm5lciBhbmRcbiAgICAvLyBcIk11bHRpcGxlIGVudmlyb25tZW50c1wiIHdhcm5pbmdzIGFyb3VuZCB0aGUgcGF5bG9hZC5cbiAgICBjb25zdCBqc29uU3RhcnQgPSByZXQuc3Rkb3V0LmluZGV4T2YoJ1snKTtcbiAgICBjb25zdCBqc29uRW5kID0gcmV0LnN0ZG91dC5sYXN0SW5kZXhPZignXScpO1xuICAgIGlmIChqc29uU3RhcnQgIT09IC0xICYmIGpzb25FbmQgIT09IC0xICYmIGpzb25TdGFydCA8IGpzb25FbmQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmV0LnN0ZG91dC5zbGljZShqc29uU3RhcnQsIGpzb25FbmQgKyAxKSkgYXMgeyBuYW1lPzogdW5rbm93biB9W107XG4gICAgICAgIHJldHVybiBwYXJzZWQubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSkuZmlsdGVyKChuYW1lKTogbmFtZSBpcyBzdHJpbmcgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gdGhlIHdhcm5pbmcgYmVsb3cuXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKC9cXFtjb2RlOiAxMDAoMDd8OTApXFxdfElmIHRoaXMgaXMgYSBuZXcgV29ya2VyLy50ZXN0KHJldC5zdGRvdXQgKyByZXQuc3RkZXJyKSkge1xuICAgIC8vIFRoZSBXb3JrZXIgZG9lcyBub3QgZXhpc3QgeWV0LCBzbyBhIGZpcnN0IGRlcGxveSBpbmhlcml0cyBub3RoaW5nLiBXcmFuZ2xlciA0LnggY2F0Y2hlc1xuICAgIC8vIHRoZSBDbG91ZGZsYXJlIEFQSSBlcnJvcnMgMTAwMDcgKHdvcmtlcnMuYXBpLmVycm9yLnNlcnZpY2Vfbm90X2ZvdW5kKSBhbmQgMTAwOTBcbiAgICAvLyAod29ya2Vycy5hcGkuZXJyb3Iuc2NyaXB0X25vdF9mb3VuZCkgYW5kIHJldGhyb3dzIHRoZW0gYXMgYSBVc2VyRXJyb3IgY29udGFpbmluZyB0aGVcbiAgICAvLyAnSWYgdGhpcyBpcyBhIG5ldyBXb3JrZXIsIHJ1biBgd3JhbmdsZXIgZGVwbG95YCBmaXJzdCcgaGludCB3aXRob3V0IHRoZSBudW1lcmljIGNvZGUsXG4gICAgLy8gc28gbWF0Y2ggYm90aCBzaGFwZXMuXG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnNvbGUud2FybihcbiAgICBjaGFsay55ZWxsb3coXG4gICAgICBgRmFpbGVkIHRvIGxpc3QgdGhlIHJlbW90ZSBXb3JrZXIgc2VjcmV0czsgY2hlY2tpbmcgb25seSB0aGUgbG9jYWwgcGF5bG9hZCBhZ2FpbnN0IENsb3VkZmxhcmUncyBsaW1pdHMuXFxuJHsocmV0LnN0ZGVyciB8fCByZXQuc3Rkb3V0KS50cmltKCl9YFxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZW1vdGUgc2VjcmV0cyB0aGF0IHN0YXkgYXR0YWNoZWQgdG8gdGhlIG5ldyB2ZXJzaW9uOiBgd3JhbmdsZXIgZGVwbG95IC0tc2VjcmV0cy1maWxlYCBpc1xuICogYWRkaXRpdmUsIHNvIGV2ZXJ5IHJlbW90ZSBzZWNyZXQgdGhlIG91dGdvaW5nIHBheWxvYWQgZG9lcyBub3Qgb3ZlcndyaXRlIGtlZXBzIGNvdW50aW5nXG4gKiBhZ2FpbnN0IENsb3VkZmxhcmUncyBjb21iaW5lZCB2YXJpYWJsZStzZWNyZXQgbGltaXQg4oCUIGV4Y2VwdCBuYW1lcyB0aGF0IGFuIGVmZmVjdGl2ZSB2YXIgb3JcbiAqIGJpbmRpbmcgcmVwbGFjZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJbmhlcml0ZWRSZW1vdGVTZWNyZXROYW1lcyhcbiAgcmVtb3RlU2VjcmV0TmFtZXM6IHN0cmluZ1tdLFxuICBvdXRnb2luZ1NlY3JldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGVmZmVjdGl2ZVZhcktleXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBiaW5kaW5nTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJlcGxhY2VkTmFtZXMgPSBuZXcgU2V0KFsuLi5lZmZlY3RpdmVWYXJLZXlzLCAuLi5iaW5kaW5nTmFtZXNdKTtcbiAgcmV0dXJuIHJlbW90ZVNlY3JldE5hbWVzLmZpbHRlcigobmFtZSkgPT4gIU9iamVjdC5oYXNPd24ob3V0Z29pbmdTZWNyZXRzLCBuYW1lKSAmJiAhcmVwbGFjZWROYW1lcy5oYXMobmFtZSkpO1xufVxuXG4vKipcbiAqIFJlYWRpbmcgYmluRXhpc3RzIHByZXBlbmRzIG5vZGVfbW9kdWxlcy8uYmluIGRpcmVjdG9yaWVzIHRvIHByb2plY3QuZW52LlBBVEgsXG4gKiBzbyB0aGUgZGlyZWN0IChub24tc2hlbGwpIHdyYW5nbGVyIHNwYXducyByZXNvbHZlIHRoZSBsb2NhbCBiaW5hcnkuXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBpZiAoIXByb2plY3QuYmluRXhpc3RzKSB7XG4gICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdygnbm9kZV9tb2R1bGVzLy5iaW4gbm90IGZvdW5kOyByZWx5aW5nIG9uIFBBVEggdG8gcmVzb2x2ZSB3cmFuZ2xlci4nKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRGbm94RW52aXJvbm1lbnRWYXJpYWJsZXMsIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCB9IGZyb20gJy4uL3V0aWxzL2JpblBhdGguanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuaW50ZXJmYWNlIFBhcnNlZERvdGVudkFyZ3Mge1xuICBjb21tYW5kOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIENvbW1hbmRFbnZpcm9ubWVudCB7XG4gIGN3ZDogc3RyaW5nO1xuICBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52O1xufVxuXG5jb25zdCBzaHV0ZG93blNpZ25hbHMgPSBuZXcgU2V0PE5vZGVKUy5TaWduYWxzPihbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSk7XG5cbmV4cG9ydCBjb25zdCBkb3RlbnZDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAnZG90ZW52IFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6ICdMb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGZub3ggYW5kIHJ1biBhIGNvbW1hbmQuJyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PiB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBydW5QYXJzZWREb3RlbnZDb21tYW5kKGdldFBhcnNlZERvdGVudkFyZ3NGcm9tWWFyZ3MoYXJndikpO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFyc2VkRG90ZW52Q29tbWFuZCh7IGNvbW1hbmQgfTogUGFyc2VkRG90ZW52QXJncyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5Db21tYW5kV2l0aEVudmlyb25tZW50KGNvbW1hbmQsICd3YiBkb3RlbnYgLS0gPGNvbW1hbmQ+IFthcmdzLi4uXScpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ29tbWFuZFdpdGhFbnZpcm9ubWVudChcbiAgY29tbWFuZDogc3RyaW5nW10sXG4gIHVzYWdlOiBzdHJpbmcsXG4gIGNvbW1hbmRFbnZpcm9ubWVudD86IENvbW1hbmRFbnZpcm9ubWVudFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjb21tYW5kLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYFVzYWdlOiAke3VzYWdlfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGN3ZCA9IHBhdGgucmVzb2x2ZShjb21tYW5kRW52aXJvbm1lbnQ/LmN3ZCA/PyBwcm9jZXNzLmN3ZCgpKTtcbiAgY29uc3QgZW52ID0gY29tbWFuZEVudmlyb25tZW50Py5lbnYgPz8gcHJvY2Vzcy5lbnY7XG4gIGlmICghY29tbWFuZEVudmlyb25tZW50KSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QpO1xuICBjb25zdCBiZXJyeUJpbkZvbGRlclBhdGggPSBlbnYuQkVSUllfQklOX0ZPTERFUjtcbiAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudik7XG4gIC8vIFN0cmlwcGluZyB5YXJuJ3MgZW52aXJvbm1lbnQgYWxzbyByZW1vdmVzIGl0cyB0ZW1wb3JhcnkgYmluIGZvbGRlciDigJQgdGhlIE9OTFkgcGxhY2VcbiAgLy8geWFybiBCZXJyeSBleHBvc2VzIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMg4oCUIHNvIHJlc3RvcmUgdGhlIHByb2plY3QncyBvd25cbiAgLy8gbm9kZV9tb2R1bGVzLy5iaW4gZGlyZWN0b3JpZXMgdG8ga2VlcCBiYXJlIGJpbmFyeSBuYW1lcyByZXNvbHZhYmxlLiBQbHVnJ24nUGxheSBpbnN0YWxsc1xuICAvLyBjcmVhdGUgbm8gbm9kZV9tb2R1bGVzIGF0IGFsbDsgdGhlIHRlbXBvcmFyeSBiaW4gZm9sZGVyIGlzIHRoZW4gdGhlIHNvbGUgc291cmNlIG9mXG4gIC8vIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMsIHNvIHJlc3RvcmUgaXQgaW5zdGVhZC5cbiAgLy8gVGhlIHRlbXBvcmFyeSBmb2xkZXIgaXMgZGVsaWJlcmF0ZWx5IE5PVCByZXN0b3JlZCB3aGVuIC5iaW4gZGlyZWN0b3JpZXMgZXhpc3Q6IGl0IGFsc29cbiAgLy8gY29udGFpbnMgbm9kZS95YXJuIHNoaW1zLCBhbmQgYSBsZWFrZWQgbm9kZSBzaGltIHdvdWxkIHZpb2xhdGUgd2IncyByZWFsLU5vZGUgZ3VhcmFudGVlXG4gIC8vIGZvciB0b29scyBsaWtlIHdyYW5nbGVyL3ZpbmV4dC4gQ2hpbGQgYHlhcm5gIGludm9jYXRpb25zIHN0YXkgcmVzb2x2YWJsZSB0aHJvdWdoIHRoZVxuICAvLyBsYXVuY2hlciBvbiB0aGUgYmFzZSBQQVRIIChtaXNlL2NvcmVwYWNrKSwgd2hpY2ggZXZlcnkgc3VwcG9ydGVkIGVudmlyb25tZW50IGhhcyDigJRcbiAgLy8gbm90aGluZyBjb3VsZCBoYXZlIHN0YXJ0ZWQgYHlhcm4gcnVuYC9gd2IgZG90ZW52YCB3aXRob3V0IGl0LlxuICBpZiAoIXByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aChjd2QsIGVudikgJiYgYmVycnlCaW5Gb2xkZXJQYXRoKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSCA/IGAke2JlcnJ5QmluRm9sZGVyUGF0aH06JHtlbnYuUEFUSH1gIDogYmVycnlCaW5Gb2xkZXJQYXRoO1xuICB9XG5cbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGNvbW1hbmRbMF0hLCBjb21tYW5kLnNsaWNlKDEpLCB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH0pO1xuICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNodXRkb3duU2lnbmFscykge1xuICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY2hpbGQua2lsbChzaWduYWwpO1xuICAgICAgfTtcbiAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgfVxuICAgIGNoaWxkLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgIHByb2Nlc3Mub2ZmKHNodXRkb3duU2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgLy8gUmUtcmFpc2UgZXZlbiBmb3IgZm9yd2FyZGVkIHNodXRkb3duIHNpZ25hbHMgc28gY2FsbGVycyBvYnNlcnZlIHRoZSBjb252ZW50aW9uYWxcbiAgICAgICAgLy8gc2lnbmFsIGV4aXQgc3RhdHVzIChlLmcuIDEzMCBmb3IgU0lHSU5UKSBpbnN0ZWFkIG9mIGEgbWlzbGVhZGluZyBzdWNjZXNzLlxuICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBjb2RlID8/IDE7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJzZWREb3RlbnZBcmdzRnJvbVlhcmdzKGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZSk6IFBhcnNlZERvdGVudkFyZ3Mge1xuICByZXR1cm4ge1xuICAgIGNvbW1hbmQ6IFtcbiAgICAgIC4uLigoYXJndi5hcmdzIGFzIHVua25vd25bXSB8IHVuZGVmaW5lZCkgPz8gW10pLm1hcChTdHJpbmcpLFxuICAgICAgLi4uKChhcmd2WyctLSddIGFzIHVua25vd25bXSB8IHVuZGVmaW5lZCkgPz8gW10pLm1hcChTdHJpbmcpLFxuICAgIF0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhbmRhcmRXYkVudih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBmaXhUYXJnZXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoXG4gICAgIXZhbHVlIHx8XG4gICAgWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddLmluY2x1ZGVzKHZhbHVlKSB8fFxuICAgIHByb2Nlc3MuZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAnMScgfHxcbiAgICBwcm9jZXNzLmVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJ3RydWUnXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLmVycm9yKFxuICAgIGBXQl9FTlYgbXVzdCBiZSBvbmUgb2YgZGV2ZWxvcG1lbnQsIHRlc3QsIHN0YWdpbmcsIG9yIHByb2R1Y3Rpb24sIGJ1dCBpcyBcIiR7dmFsdWV9XCIuIGAgK1xuICAgICAgYEZpeCAke2ZpeFRhcmdldH0sIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay5gXG4gICk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuLy8gTk9URTogYHdiIGRvdGVudmAgZGVsaWJlcmF0ZWx5IHNraXBzIFByb2plY3QuZW52J3MgZnVsbCB2YWxpZGF0aW9uOiBpdCBpcyBhIGdlbmVyaWMgcnVubmVyIGFsc29cbi8vIHVzZWQgYmVmb3JlIGVudiBzb3VyY2VzIGV4aXN0IChib290c3RyYXApIGFuZCBtdXN0IG5vdCBmYWlsIGZhc3QgZm9yIHJlcG9zaXRvcmllcyB0aGF0IGhhdmUgbm90XG4vLyBhZG9wdGVkIHRoZSBvcmcgZW52IHN0YW5kYXJkLiBBIE5PTi1FTVBUWSBXQl9FTlYgaXMgc3RpbGwgdmFsaWRhdGVkIGFnYWluc3QgdGhlIHN0YW5kYXJkIG1vZGVzLFxuLy8gdGhvdWdoIOKAlCBhIHR5cG8gbGlrZSBgcHJvZGN1dGlvbmAgd291bGQgb3RoZXJ3aXNlIHNpbGVudGx5IHNlbGVjdCB0aGUgYmFzZSAoZGV2ZWxvcG1lbnQpIHZhbHVlcy5cbmZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIFRoZSBtb2RlIGlzIEZPUkNFRCBvbmx5IHdoZW4gV0JfRU5WIGlzIGV4cGxpY2l0bHkgZXhwb3J0ZWQ7IGl0IGRyaXZlcyB0aGUgZm9yY2VkLW1vZGUgb3ZlcnJpZGVcbiAgLy8gYmVsb3cgYW5kIHRoZSB2YWxpZGF0aW9uIGF0IHRoZSBlbmQuXG4gIGNvbnN0IG1vZGUgPSBwcm9jZXNzLmVudi5XQl9FTlY7XG4gIC8vIFRoZSBmbm94IGAtLXByb2ZpbGVgIHNlbGVjdG9yLCBkZWZhdWx0aW5nIHRvIGRldmVsb3BtZW50IGxpa2Ugd2IncyBtYWluIGxvYWRlciAoYFdCX0VOViB8fFxuICAvLyBOT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnYCwgc2VlIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcykgc28gYSByZXBvIGtlZXBpbmcgZGV2LW9ubHkgc2VjcmV0c1xuICAvLyBpbiBgW3Byb2ZpbGVzLmRldmVsb3BtZW50LnNlY3JldHNdYCBsb2FkcyB0aGVtIHdoZW4gV0JfRU5WIGlzIHVuc2V0IGluc3RlYWQgb2Ygb25seSB0aGUgYmFzZVxuICAvLyB0YWJsZS4gSXQgYWRkaXRpb25hbGx5IGhvbm9ycyBhbiBleHBsaWNpdCBGTk9YX1BST0ZJTEUsIGJlY2F1c2UgZm5veCBob25vcnMgaXQgYW5kIGB3YiBkb3RlbnZgXG4gIC8vIHdpdGhvdXQgV0JfRU5WIGlzIGRvY3VtZW50ZWQgdG8gYXMgd2VsbCAoc2VlIHJ1bkZub3hFeHBvcnQncyBpZ25vcmVQcm9maWxlRW52VmFyIG5vdGUpLlxuICAvLyBOT0RFX0VOViBpcyByZWFkIHRocm91Z2ggdGhlIGBydW50aW1lRW52YCBhbGlhcywgbmV2ZXIgYXMgdGhlIGBwcm9jZXNzLmVudi5OT0RFX0VOVmAgbWVtYmVyXG4gIC8vIGV4cHJlc3Npb24gdGhhdCB0aGUgYnVuZGxlciBpbmxpbmVzIHRvICdwcm9kdWN0aW9uJyAod2hpY2ggd291bGQgd3JvbmdseSBzZWxlY3QgcHJvZHVjdGlvbikuXG4gIGNvbnN0IHJ1bnRpbWVFbnYgPSBwcm9jZXNzLmVudjtcbiAgY29uc3QgZm5veENhc2NhZGUgPSBtb2RlIHx8IHJ1bnRpbWVFbnYuRk5PWF9QUk9GSUxFIHx8IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50JztcbiAgLy8gV0JfRU5WIGluIHByb2Nlc3MuZW52IG1lYW5zIHRoZSBtb2RlIGlzIGV4cGxpY2l0bHkgZm9yY2VkLCBzbyB2YWx1ZXMgZnJvbSB0aGUgbW9kZSdzIG93biBmbm94XG4gIC8vIHByb2ZpbGUgd2luIG92ZXIgdmFyaWFibGVzIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQgc2hlbGwg4oCUIGV4Y2VwdCBvbiBDSSwgd2hlcmUgaW5qZWN0ZWQgZW52XG4gIC8vIHZhcnMgbXVzdCBrZWVwIG92ZXJyaWRpbmcgY29tbWl0dGVkIHZhbHVlc1xuICAvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzkzMCkuXG4gIGNvbnN0IG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiA9ICEhbW9kZSAmJiAhaXNDSShwcm9jZXNzLmVudi5DSSk7XG4gIGNvbnN0IFtwYXJzZWRdID0gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGZub3hDYXNjYWRlLCB7IG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiB9KTtcbiAgLy8gRXhwYW5kICR7Li4ufSByZWZlcmVuY2VzIGFnYWluc3QgZXhwb3J0ZWQgdmFyaWFibGVzIHdob3NlIGZub3ggdmFsdWUgbG9zZXMgdG8gdGhlIHNoZWxsXG4gIC8vIChtaXJyb3JpbmcgcmVhZEVudmlyb25tZW50VmFyaWFibGVzJyBlZmZlY3RpdmUtdmFsdWUgc2VtYW50aWNzKTogYSByZWZlcmVuY2UgbXVzdCByZXNvbHZlIHRvXG4gIC8vIHRoZSB2YWx1ZSB0aGUgY2hpbGQgd2lsbCBhY3R1YWxseSBzZWUuIHJlYWRGbm94RW52aXJvbm1lbnRWYXJpYWJsZXMgcmV0dXJucyBhXG4gIC8vIHByb2Nlc3MuZW52LXNoYWRvd2VkIGtleSBvbmx5IHdoZW4gdGhlIGZvcmNlZCBwcm9maWxlIG92ZXJyaWRlcyBpdCwgc28gZXZlcnkgcGFyc2VkIGtleSdzIG93blxuICAvLyB2YWx1ZSB3aW5zIGFuZCBpcyBleGNsdWRlZCBmcm9tIHRoZSByZWZlcmVuY2Ugc2V0LlxuICBjb25zdCByZWZlcmVuY2VFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvY2Vzcy5lbnYpKSB7XG4gICAgLy8gRXNjYXBlIGRvbGxhciBzaWducyBzbyBleHBvcnRlZCB2YWx1ZXMgc3Vic3RpdHV0ZSBsaXRlcmFsbHkgKHBhJHdvcmQgc3RheXMgcGEkd29yZCkuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gcGFyc2VkKSkge1xuICAgICAgcmVmZXJlbmNlRW52W2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKCckJywgU3RyaW5nLnJhd2BcXCRgKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZW52VmFycyA9IGV4cGFuZCh7IHBhcnNlZCwgcHJvY2Vzc0VudjogcmVmZXJlbmNlRW52IH0pLnBhcnNlZCA/PyBwYXJzZWQ7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudltrZXldID09PSB2YWx1ZSkgY29udGludWU7XG4gICAgLy8gQSBwcm9jZXNzLmVudi1zaGFkb3dlZCBrZXkgcmVhY2hlcyBoZXJlIG9ubHkgd2hlbiB0aGUgZm9yY2VkIHByb2ZpbGUgb3ZlcnJpZGVzIGl0IChzZWVcbiAgICAvLyByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzKTsgb24gQ0kgc3VjaCBrZXlzIGFyZSBuZXZlciByZXR1cm5lZCwgc28gbm8gYnJhbmNoIGlzIG5lZWRlZC5cbiAgICBpZiAobW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBXYXJuaW5nOiAke2tleX0gaW4gdGhlIFwiJHttb2RlfVwiIG1vZGUncyBlbnYgc291cmNlcyBvdmVycmlkZXMgdGhlIHZhbHVlIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQgZW52aXJvbm1lbnQgYmVjYXVzZSBXQl9FTlYgaXMgZXhwbGljaXRseSBzZXQuYFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgLy8gVmFsaWRhdGUgb25seSBBRlRFUiBhcHBseWluZyB0aGUgc291cmNlcywgc28gYSBXQl9TS0lQX0VOVl9DSEVDSyBkZWZpbmVkIGluIGFuIGVudiBTT1VSQ0UgaXNcbiAgLy8gaG9ub3JlZDogYm90aCB0aGUgY2FwdHVyZWQgZXhwb3J0ZWQgbW9kZSAoaXQgc2VsZWN0ZWQgdGhlIHByb2ZpbGUpIGFuZCB0aGUgRklOQUwgdmFsdWUgdGhlXG4gIC8vIGNoaWxkIHdpbGwgc2VlIOKAlCB0aGUgZm5veCBwcm9maWxlIG1heSBkZWZpbmUgYSBicm9rZW4gV0JfRU5WIChlLmcuIGBwcm9kY3V0aW9uYCksIGFuZCBhIGZvcmNlZFxuICAvLyBtb2RlJ3MgcHJvZmlsZSBtYXkgZXZlbiBvdmVycmlkZSBhIFZBTElEIGV4cG9ydGVkIHZhbHVlLlxuICB2YWxpZGF0ZVN0YW5kYXJkV2JFbnYobW9kZSwgJ3RoZSBleHBvcnRlZCB2YXJpYWJsZScpO1xuICB2YWxpZGF0ZVN0YW5kYXJkV2JFbnYocHJvY2Vzcy5lbnYuV0JfRU5WLCAndGhlIGVudiBzb3VyY2Ugb3IgdGhlIGV4cG9ydGVkIHZhcmlhYmxlJyk7XG4gIC8vIFRoZSBzZWxlY3RlZCBlbnZpcm9ubWVudCBpcyB3aGF0IGFuIGVudiBzb3VyY2Ugc2lsZW50bHkgcmVzb2x2aW5nIFdCX0VOViB0byBhIERJRkZFUkVOVCB2YWx1ZVxuICAvLyBtdXN0IGFncmVlIHdpdGgsIGVsc2UgdGhlIGNoaWxkIHJ1bnMgbGFiZWxlZCBvbmUgZW52aXJvbm1lbnQgd2hpbGUgY2FycnlpbmcgYW5vdGhlcidzIHNlY3JldHMuXG4gIC8vIE9ubHkgYSBTVEFOREFSRCBjYXNjYWRlIGlzIGVuZm9yY2VkIChtaXJyb3JpbmcgUHJvamVjdC5jb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYpOiBhIGN1c3RvbVxuICAvLyBzZWxlY3RvciBzdWNoIGFzIGBOT0RFX0VOVj1xYWAgbGVnaXRpbWF0ZWx5IHNlbGVjdHMgdGhlIGBxYWAgcHJvZmlsZSB3aGlsZSBXQl9FTlYgc3RheXMgYVxuICAvLyBzdGFuZGFyZCBtb2RlLlxuICBjb25zdCBleHBlY3RlZENhc2NhZGUgPSBmbm94Q2FzY2FkZTtcbiAgaWYgKFxuICAgIHByb2Nlc3MuZW52LldCX0VOViAmJlxuICAgIFsnZGV2ZWxvcG1lbnQnLCAndGVzdCcsICdzdGFnaW5nJywgJ3Byb2R1Y3Rpb24nXS5pbmNsdWRlcyhleHBlY3RlZENhc2NhZGUpICYmXG4gICAgcHJvY2Vzcy5lbnYuV0JfRU5WICE9PSBleHBlY3RlZENhc2NhZGUgJiZcbiAgICBwcm9jZXNzLmVudi5XQl9TS0lQX0VOVl9DSEVDSyAhPT0gJzEnICYmXG4gICAgcHJvY2Vzcy5lbnYuV0JfU0tJUF9FTlZfQ0hFQ0sgIT09ICd0cnVlJ1xuICApIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYFdCX0VOViByZXNvbHZlcyB0byBcIiR7cHJvY2Vzcy5lbnYuV0JfRU5WfVwiIGFsdGhvdWdoIHRoZSBcIiR7ZXhwZWN0ZWRDYXNjYWRlfVwiIGVudmlyb25tZW50IHdhcyBzZWxlY3RlZC4gYCArXG4gICAgICAgIGBGaXggdGhlIFdCX0VOViBkZWZpbmVkIGluIHRoZSBlbnYgc291cmNlcywgb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLmBcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBGSUxFX1NDSEVNQSwgZ2V0RmlsZURhdGFiYXNlVXJsUGF0aCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiB9IGZyb20gJy4vbGl0ZXN0cmVhbS5qcyc7XG5cbmNvbnN0IFBPU1NJQkxFX1BSSVNNQV9QQVRIUyA9IFtcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ3ByaXNtYScgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSwgZGJQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbignZGInLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdkYicgfSxcbl07XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgXG4gKiBhbmQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFByaXNtYVNjcmlwdHMge1xuICBjbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0TW91bnREaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNsZWFuVXBDb21tYW5kID0gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICAvLyBDbGVhbnVwIGV4aXN0aW5nIGFydGlmYWN0cyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBMaXRlc3RyZWFtIHJlcGxpY2F0aW9uLlxuICAgIC8vIE5vdGUgdGhhdCBkb24ndCBtZXJnZSBtdWx0aXBsZSBybSBjb21tYW5kcyBpbnRvIG9uZSwgYmVjYXVzZSBpZiBvbmUgZmFpbHMsIHRoZSBzdWJzZXF1ZW50IG9uZXMgd29uJ3QgcnVuLlxuICAgIHJldHVybiBgJHtjbGVhblVwQ29tbWFuZH07IHJtIC1SZiAke2RpclBhdGh9Ly5wcm9kLnNxbGl0ZTMqIHx8IHRydWVgO1xuICB9XG5cbiAgZGVwbG95KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIGdlbmVyYXRlKF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBbJ1BSSVNNQSBnZW5lcmF0ZScsIGFkZGl0aW9uYWxPcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldE1vdW50RGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnT3B0aW9uID0gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0KTtcbiAgICAvLyBgcHJpc21hIG1pZ3JhdGUgcmVzZXRgIGNhbiBmYWlsIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGV4aXN0aW5nIGRhdGFiYXNlLCBzbyB3ZSByZW1vdmUgaXQgZmlyc3QuXG4gICAgLy8gRG9uJ3Qgc2tpcCBcIm1pZ3JhdGUgZGVwbG95XCIgYmVjYXVzZSByZXN0b3JlZCBkYXRhYmFzZSBtYXkgYmUgb2xkZXIgdGhhbiB0aGUgY3VycmVudCBzY2hlbWEuXG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07IFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQgJiYgJHtyZW1vdmVEYkNvbW1hbmR9XG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgJHtsaXRlc3RyZWFtQ29uZmlnT3B0aW9ufSAtbyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBscyAtYWhsICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXN0QmFja3Vwcyhwcm9qZWN0OiBQcm9qZWN0LCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0TW91bnREaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgbGl0ZXN0cmVhbSBsdHggJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9ICYmICR7dGhpcy5nZW5lcmF0ZShwcm9qZWN0KX0gJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXYgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgY29uc3Qgc3RlcHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgY2xlYW51cENvbW1hbmQgPSBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0KTtcbiAgICBpZiAoY2xlYW51cENvbW1hbmQpIHN0ZXBzLnB1c2goY2xlYW51cENvbW1hbmQpO1xuICAgIGNvbnN0IHJlc2V0Q29tbWFuZCA9IFsnUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZScsIGFkZGl0aW9uYWxPcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIHN0ZXBzLnB1c2gocmVzZXRDb21tYW5kKTtcbiAgICByZXR1cm4gc3RlcHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nLCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0TW91bnREaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgcm0gLVJmICR7b3V0cHV0UGF0aH0qOyBsaXRlc3RyZWFtIHJlc3RvcmUgJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSAtbyAke291dHB1dFBhdGh9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gQmxpdHogc2VlZCBtb2R1bGVzIGRlZmF1bHQtZXhwb3J0IHRoZSBzZWVkIGZ1bmN0aW9uIHdpdGhvdXQgY2FsbGluZyBpdCwgc28gb25seVxuICAgIC8vIGBibGl0eiBkYiBzZWVkYCAod2hvc2UgbG9hZGVyIGludm9rZXMgdGhlIGV4cG9ydCkgYWN0dWFsbHkgcG9wdWxhdGVzIHRoZSBkYXRhYmFzZS5cbiAgICAvLyBCdW4tZXJhIEJsaXR6IHJlcG9zaXRvcmllcyBkZWNsYXJlIHByaXNtYS5zZWVkIGluc3RlYWQgYW5kIG11c3QgYXZvaWQgdGhlIGJsaXR6IENMSSxcbiAgICAvLyB3aGljaCBwYXRjaGVzIHRoZSBpbnN0YWxsZWQgbmV4dCBwYWNrYWdlIGluc2lkZSBCdW4ncyBzaGFyZWQgZ2xvYmFsIHN0b3JlLlxuICAgIGlmICghcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgJiYgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdibGl0eicpKSB7XG4gICAgICByZXR1cm4gYFlBUk4gYmxpdHogZGIgc2VlZCR7c2NyaXB0UGF0aCA/IGAgLWYgJHtzY3JpcHRQYXRofWAgOiAnJ31gO1xuICAgIH1cbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgY29uc3Qgc2VlZHNQYXRoID0gYCR7cHJvamVjdC5wcmlzbWFEaXJOYW1lfS9zZWVkcy50c2A7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwiJHtzZWVkc1BhdGh9XCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuICR7c2VlZHNQYXRofTsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gICAgICBpZiAoYmFzZURpcikge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyLCBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKSk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG4vKiogV2hlcmUgdGhlIExpdGVzdHJlYW0tcmVwbGljYXRlZCBTUUxpdGUgZGF0YWJhc2UgaXMgbW91bnRlZCwgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QgZGlyZWN0b3J5LiAqL1xuZnVuY3Rpb24gZ2V0TW91bnREaXJQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7cHJvamVjdC5wcmlzbWFEaXJOYW1lfS9tb3VudGA7XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF07IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBQUklTTUEgZGIgZXhlY3V0ZSAtLXN0ZGluIC0tdXJsIFwiJHtGSUxFX1NDSEVNQX0ke2RiUGF0aH1cIjsgZmkgJiYgcm0gLWYgXCIke2RiUGF0aH1cIi4qIFwiJHtkYlBhdGh9XCItKmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3RGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFyYXdEYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKHJhd0RiUGF0aClcbiAgICA/IHJhd0RiUGF0aFxuICAgIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciA/PyAnLicsIHJhd0RiUGF0aCk7XG5cbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IHsgbm9ybWFsaXplQnVuTG9ja2ZpbGUgYXMgbm9ybWFsaXplU2hhcmVkQnVuTG9ja2ZpbGUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG4vKipcbiAqIFN0cmlwIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGBidW4ubG9ja2AgYW5kIHJlcG9ydCBhIGNoYW5nZS5cbiAqXG4gKiBidW4gcmVjb3JkcyBhbiBhYnNvbHV0ZSBgcmVzb2x2ZWRgIFVSTCBmb3IgYW4gYWxyZWFkeS1sb2NrZWQgcGFja2FnZSB3aGVuZXZlciB0aGUgY29uZmlndXJlZFxuICogcmVnaXN0cnkgZG9lcyBub3Qgc2VydmUgdGhlIHRhcmJhbGwgaG9zdCBuYW1lZCBpbiB0aGUgcGFja2FnZSBtZXRhZGF0YSDigJQgd2hpY2ggaXMgZXhhY3RseSB3aGF0XG4gKiB0aGUgVGFrdW1pIEd1YXJkIHByb3h5IGRvZXMuIFNvIGFueSBpbnN0YWxsIHJ1biB3aXRoIEd1YXJkIGFzIHRoZSBERUZBVUxUIHJlZ2lzdHJ5IChDSSwgb3IgYVxuICogZGV2ZWxvcGVyIHdobyBwdXQgaXQgaW4gfi8ubnBtcmMpIGJha2VzIG5wbS5mbGF0dC50ZWNoIFVSTHMgaW50byB0aGUgbG9ja2ZpbGUsIGFuZCBjb21taXR0aW5nXG4gKiB0aGVtIHBpbnMgYSBTSEFSRUQgbG9ja2ZpbGUgdG8gb25lIGVudmlyb25tZW50J3MgbWlycm9yOiBldmVyeSBsYXRlciBpbnN0YWxsIGRvd25sb2FkcyB0aHJvdWdoXG4gKiB0aGUgcHJveHksIGFuZCBhIGNvbGQtY2FjaGUgaW5zdGFsbCBmYWlscyBvdXRyaWdodCB3aXRoIDQwMSBmb3IgYW55b25lIHdob3NlIG5wbXJjIGNhcnJpZXMgYVxuICogcmVnaXN0cnkubnBtanMub3JnIHRva2VuLCBiZWNhdXNlIGJ1biBzZW5kcyB0aGUgZGVmYXVsdCByZWdpc3RyeSdzIGNyZWRlbnRpYWxzIHRvIHdoYXRldmVyIGhvc3RcbiAqIHRoZSBsb2NrZmlsZSBuYW1lcy4gR3VhcmQgY292ZXJhZ2UgZG9lcyBub3QgZGVwZW5kIG9uIHRoZXNlIFVSTHMg4oCUIHdpdGggYW4gZW1wdHkgYHJlc29sdmVkYCwgYnVuXG4gKiBkZXJpdmVzIHRoZSBkb3dubG9hZCBVUkwgZnJvbSB0aGUgY29uZmlndXJlZCByZWdpc3RyeSDigJQgc28gdGhleSBhcmUgcHVyZSBkYW1hZ2UuXG4gKlxuICogd2JmeSBnZW5lcmF0ZXMgYSBwcmUtY29tbWl0IGhvb2sgdGhhdCBzdHJpcHMgdGhlIHNhbWUgVVJMcywgYnV0IHRoYXQgb25seSBmaXJlcyBhdCBgZ2l0IGNvbW1pdGAuXG4gKiBSdW5uaW5nIHRoaXMgcmlnaHQgYWZ0ZXIgYW4gaW5zdGFsbCBjbG9zZXMgdGhlIHdpbmRvdyBpbiBiZXR3ZWVuLCB3aGVyZSB0aGUgcmV3cml0dGVuIGxvY2tmaWxlIGlzXG4gKiBzaW1wbHkgdGhlIHdvcmtpbmcgdHJlZSdzIHN0YXRlOiBhIGJ5cGFzc2VkIGhvb2ssIGEgY29tbWl0IGZyb20gYSB0b29sIHRoYXQgZG9lcyBub3QgcnVuIGhvb2tzLFxuICogb3IgYSBkaWZmIHJlYWQgYnkgYSBodW1hbiBvciBhbiBhZ2VudCBhbGwgc2VlIGl0LiBPbmx5IHRoZSBHdWFyZCBob3N0IGlzIHN0cmlwcGVkOyBhIHNjb3BlZFxuICogcmVnaXN0cnkgc3VjaCBhcyBWZXJkYWNjaW8gbGVnaXRpbWF0ZWx5IHJlY29yZHMgaXRzIG93biBVUkwgZm9yIHByaXZhdGUgcGFja2FnZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdW5Mb2NrZmlsZShyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGxvY2tmaWxlUGF0aCA9IG5vcm1hbGl6ZVNoYXJlZEJ1bkxvY2tmaWxlKHJvb3REaXJQYXRoKTtcbiAgaWYgKCFsb2NrZmlsZVBhdGgpIHJldHVybjtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSZW1vdmVkIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gJHtsb2NrZmlsZVBhdGh9IHRvIGtlZXAgaXQgcmVnaXN0cnktYWdub3N0aWMuYCkpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlVG9tbCB9IGZyb20gJ3Ntb2wtdG9tbCc7XG5cbi8qKlxuICogV3JpdGUgdGhlIGtleS1vbmx5IHN0dWIgdGhhdCBgd3JhbmdsZXIgdHlwZXMgLS1lbnYtZmlsZWAgcmVhZHMgdG8gdHlwZSB0aGUgQ2xvdWRmbGFyZSBgRW52YC5cbiAqXG4gKiBgd3JhbmdsZXIgdHlwZXNgIGRlcml2ZXMgZWFjaCBgRW52YCBtZW1iZXIgZnJvbSBhIGtleSdzIG1lcmUgcHJlc2VuY2UgaW4gdGhlIGZpbGUg4oCUIG5ldmVyIGZyb20gaXRzXG4gKiB2YWx1ZSwgYW5kIG5ldmVyIGZyb20gcHJvY2Vzcy5lbnYg4oCUIGFuZCBgLS1lbnYtZmlsZWAgUkVQTEFDRVMgd3JhbmdsZXIncyBuYXRpdmUgYC5lbnZgL2AuZGV2LnZhcnNgXG4gKiByZWFkaW5nLiBUaGUgc3R1YiB0aGVyZWZvcmUgY2FycmllcyBldmVyeSBkZWNsYXJlZCBiaW5kaW5nIGtleSB3aXRoIGEgY29uc3RhbnQgcGxhY2Vob2xkZXIgdmFsdWVcbiAqIChgMWAsIG5vdCBlbXB0eSwgc28gaXQgY2Fubm90IG92ZXJyaWRlIGEgd3JhbmdsZXIgYHZhcnNgIGJpbmRpbmcgd2l0aCBhbiBlbXB0eSBzdHJpbmcpLiBJdCB3cml0ZXMgbm9cbiAqIHJlYWwgc2VjcmV0IGFuZCBuZWVkcyBubyBkZWNyeXB0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVXb3JrZXJUeXBlc0VudlN0dWIocHJvamVjdERpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZywgb3V0cHV0UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGtleU5hbWVzID0gY29sbGVjdFdvcmtlckJpbmRpbmdLZXlOYW1lcyhwcm9qZWN0RGlyUGF0aCwgcm9vdERpclBhdGgpO1xuICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKG91dHB1dFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICBvdXRwdXRQYXRoLFxuICAgIGtleU5hbWVzLm1hcCgoa2V5TmFtZSkgPT4gYCR7a2V5TmFtZX09MWApLmpvaW4oJ1xcbicpICsgKGtleU5hbWVzLmxlbmd0aCA+IDAgPyAnXFxuJyA6ICcnKVxuICApO1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCAke291dHB1dFBhdGh9IHdpdGggJHtrZXlOYW1lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzLmApKTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IHRoZSBkZWNsYXJlZCBXb3JrZXIgYmluZGluZyBrZXkgTkFNRVMgZnJvbSB0aGUgY29tbWl0dGVkIGBmbm94LnRvbWxgIGZpbGVzIHdpdGhvdXRcbiAqIGRlY3J5cHRpbmcgYW55dGhpbmcgb3IgaW52b2tpbmcgdGhlIGVudmlyb25tZW50IHJlYWRlci4gVGhpcyBkZWxpYmVyYXRlbHkgYXZvaWRzIHByb2Nlc3MuZW52LFxuICogYG1pc2UgZW52YCBob3N0L3Rvb2wgdmFyaWFibGVzLCBhbmQgY2FzY2FkZS9wcm9maWxlIHNlbGVjdGlvbiwgYWxsIG9mIHdoaWNoIHdvdWxkIG90aGVyd2lzZVxuICogcG9sbHV0ZSBvciBuYXJyb3cgdGhlIGdlbmVyYXRlZCBgRW52YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RXb3JrZXJCaW5kaW5nS2V5TmFtZXMocHJvamVjdERpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qga2V5TmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gZm5veCBtZXJnZXMgdGhlIHdob2xlIGFuY2VzdG9yIGNvbmZpZyBjaGFpbiAoYSBuZXN0ZWQgV29ya2VyIGluaGVyaXRzIHRoZSBtb25vcmVwbyByb290J3NcbiAgLy8gc2VjcmV0cyksIHNvIHVuaW9uIGV2ZXJ5IGZub3gudG9tbCBmcm9tIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSB1cCB0byB0aGUgcmVwb3NpdG9yeSByb290LlxuICBmb3IgKGNvbnN0IGNvbmZpZ1BhdGggb2YgZmluZEFuY2VzdG9yRm5veENvbmZpZ1BhdGhzKHByb2plY3REaXJQYXRoLCByb290RGlyUGF0aCkpIHtcbiAgICBmb3IgKGNvbnN0IGtleU5hbWUgb2YgcGFyc2VGbm94U2VjcmV0S2V5TmFtZXMoY29uZmlnUGF0aCkpIGtleU5hbWVzLmFkZChrZXlOYW1lKTtcbiAgfVxuICByZXR1cm4gWy4uLmtleU5hbWVzXS50b1NvcnRlZCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbn1cblxuLyoqIEV2ZXJ5IGBmbm94LnRvbWxgIGZyb20gYHByb2plY3REaXJQYXRoYCB1cCB0byAoYW5kIGluY2x1ZGluZykgYHJvb3REaXJQYXRoYCwgbmVhcmVzdCBmaXJzdC4gKi9cbmZ1bmN0aW9uIGZpbmRBbmNlc3RvckZub3hDb25maWdQYXRocyhwcm9qZWN0RGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBjb25maWdQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgpO1xuICBmb3IgKGxldCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3REaXJQYXRoKTsgOyBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpKSB7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAnZm5veC50b21sJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIGNvbmZpZ1BhdGhzLnB1c2goY29uZmlnUGF0aCk7XG4gICAgLy8gU3RvcCBhdCB0aGUgcmVwb3NpdG9yeSByb290IChpdHMgcGFyZW50J3Mgc2VjcmV0cyBhcmUgbm90IHBhcnQgb2YgdGhpcyByZXBvKSBvciwgZGVmZW5zaXZlbHksXG4gICAgLy8gYXQgdGhlIGZpbGVzeXN0ZW0gcm9vdCB3aGVuIHJvb3REaXJQYXRoIGlzIG5vdCBhY3R1YWxseSBhbiBhbmNlc3Rvci5cbiAgICBpZiAoZGlyUGF0aCA9PT0gcm9vdFBhdGggfHwgcGF0aC5kaXJuYW1lKGRpclBhdGgpID09PSBkaXJQYXRoKSBicmVhaztcbiAgfVxuICByZXR1cm4gY29uZmlnUGF0aHM7XG59XG5cbmludGVyZmFjZSBGbm94U2VjcmV0c1RhYmxlIHtcbiAgW2tleU5hbWU6IHN0cmluZ106IHVua25vd247XG59XG5pbnRlcmZhY2UgRm5veENvbmZpZyB7XG4gIHNlY3JldHM/OiBGbm94U2VjcmV0c1RhYmxlO1xuICBwcm9maWxlcz86IFJlY29yZDxzdHJpbmcsIHsgc2VjcmV0cz86IEZub3hTZWNyZXRzVGFibGUgfSB8IHVuZGVmaW5lZD47XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIGtleSBuYW1lcyB1bmRlciBgZm5veC50b21sYCdzIGBbc2VjcmV0c11gIGFuZCBldmVyeSBgW3Byb2ZpbGVzLjxuYW1lPi5zZWNyZXRzXWAgdGFibGUuXG4gKiBmbm94IHN0b3JlcyBrZXkgbmFtZXMgaW4gcGxhaW50ZXh0IChvbmx5IHZhbHVlcyBhcmUgZW5jcnlwdGVkKSwgc28gdGhpcyBuZWVkcyBubyBhZ2Uga2V5LiBFdmVyeVxuICogcHJvZmlsZSdzIHNlY3JldHMgYXJlIHVuaW9uZWQgc28gdGhlIEVudiBpcyBhIGRldGVybWluaXN0aWMgc3VwZXJzZXQgY292ZXJpbmcgYWxsIGVudmlyb25tZW50c1xuICogKGxpa2UgdGhlIGZvcm1lciBjb21taXR0ZWQgLmVudi5leGFtcGxlKSwgaW5kZXBlbmRlbnQgb2YgdGhlIHByb2ZpbGUgYSBnaXZlbiBydW4gcmVzb2x2ZXMuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRm5veFNlY3JldEtleU5hbWVzKGNvbmZpZ1BhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29uZmlnID0gcGFyc2VUb21sKGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpKSBhcyBGbm94Q29uZmlnO1xuICBjb25zdCBrZXlOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgY29sbGVjdCA9IChzZWNyZXRzOiBGbm94U2VjcmV0c1RhYmxlIHwgdW5kZWZpbmVkKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBba2V5TmFtZSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHNlY3JldHMgPz8ge30pKSB7XG4gICAgICAvLyBTa2lwIHNlY3JldHMgZm5veCBkb2VzIG5vdCBleHBvcnQgYXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIChgZW52ID0gZmFsc2VgIC8gYFwiZXhlY1wiYCk6IHRoZXlcbiAgICAgIC8vIGFyZSBuZXZlciBXb3JrZXIgYmluZGluZ3MsIG1hdGNoaW5nIGBmbm94IGV4cG9ydGAncyBkZWZhdWx0LlxuICAgICAgY29uc3QgZW52ID0gdHlwZW9mIGVudHJ5ID09PSAnb2JqZWN0JyAmJiBlbnRyeSAhPT0gbnVsbCA/IChlbnRyeSBhcyB7IGVudj86IHVua25vd24gfSkuZW52IDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGVudiA9PT0gZmFsc2UgfHwgZW52ID09PSAnZXhlYycpIGNvbnRpbnVlO1xuICAgICAga2V5TmFtZXMucHVzaChrZXlOYW1lKTtcbiAgICB9XG4gIH07XG4gIGNvbGxlY3QoY29uZmlnLnNlY3JldHMpO1xuICBmb3IgKGNvbnN0IHByb2ZpbGUgb2YgT2JqZWN0LnZhbHVlcyhjb25maWcucHJvZmlsZXMgPz8ge30pKSBjb2xsZWN0KHByb2ZpbGU/LnNlY3JldHMpO1xuICByZXR1cm4ga2V5TmFtZXM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREcml6emxlQ29uZmlnLCB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQnVuTG9ja2ZpbGUgfSBmcm9tICcuLi91dGlscy9idW5Mb2NrZmlsZS5qcyc7XG5pbXBvcnQgeyB3cml0ZVdvcmtlclR5cGVzRW52U3R1YiB9IGZyb20gJy4uL3V0aWxzL3dvcmtlclR5cGVzRW52LmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG4vLyBgd3JhbmdsZXIgdHlwZXNgIGRlcml2ZXMgdGhlIENsb3VkZmxhcmUgYEVudmAncyBzZWNyZXQvdmFyIG1lbWJlcnMgb25seSBmcm9tIHRoZSBLRVkgTkFNRVMgaW4gYVxuLy8gLmRldi52YXJzLy5lbnYgZmlsZSAobmV2ZXIgZnJvbSBwcm9jZXNzLmVudiksIGFuZCBgLS1lbnYtZmlsZWAgUkVQTEFDRVMgdGhhdCBkZWZhdWx0IGZpbGUgc2V0LiBTb1xuLy8gZ2VuLWNvZGUgdHlwZXMgYSBXb3JrZXIgYWdhaW5zdCBhIHRocm93YXdheSBrZXktb25seSBzdHViIHdyaXR0ZW4gaGVyZSBmcm9tIGNvbW1pdHRlZCBzb3VyY2VzLlxuY29uc3Qgd29ya2VyVHlwZXNFbnZQYXRoID0gcGF0aC5qb2luKCcud3JhbmdsZXInLCAnd29ya2VyLXR5cGVzLmVudicpO1xuXG5leHBvcnQgY29uc3QgZ2VuQ29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdnZW4tY29kZScsXG4gIGRlc2NyaWJlOiAnR2VuZXJhdGUgY29kZSBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gQmVmb3JlIHRoZSBlYXJseSByZXR1cm4gYmVsb3c6IGBnZW4tY29kZWAgaXMgdGhlIGBwb3N0aW5zdGFsbGAgc2NyaXB0IHdiZnkgZ2VuZXJhdGVzLCBtYWtpbmdcbiAgICAvLyB0aGlzIHRoZSBmaXJzdCB3YiBjb2RlIHRoYXQgcnVucyBhZnRlciBidW4gbWF5IGhhdmUgcmV3cml0dGVuIHRoZSBsb2NrZmlsZSwgYW5kIGEgcmVwb3NpdG9yeVxuICAgIC8vIHdpdGggbm90aGluZyB0byBnZW5lcmF0ZSBuZWVkcyB0aGUgbm9ybWFsaXphdGlvbiBqdXN0IGFzIG11Y2guIGByb290RGlyUGF0aGAgcmF0aGVyIHRoYW5cbiAgICAvLyBgcHJvamVjdHMucm9vdC5kaXJQYXRoYDogYnVuIHJ1bnMgYSB3b3Jrc3BhY2UgcGFja2FnZSdzIHBvc3RpbnN0YWxsIGZyb20gdGhhdCBwYWNrYWdlJ3NcbiAgICAvLyBkaXJlY3RvcnksIGFuZCBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyBvbmx5IGNsaW1icyBvdXQgb2YgYHBhY2thZ2VzLypgLCBzbyBhIHdvcmtzcGFjZSBzdWNoXG4gICAgLy8gYXMgYGFwcHMvd2ViYCB3b3VsZCBvdGhlcndpc2UgbG9vayBmb3IgYGFwcHMvd2ViL2J1bi5sb2NrYCBpbnN0ZWFkIG9mIHRoZSByZXBvc2l0b3J5J3MuXG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgbm9ybWFsaXplQnVuTG9ja2ZpbGUocHJvamVjdHMuc2VsZi5yb290RGlyUGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VuQ29kZVRhcmdldHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1xuICAgICAgLm1hcCgocHJvamVjdCkgPT4gKHsgcHJvamVjdCwgc2NyaXB0czogZ2V0R2VuQ29kZVNjcmlwdHMocHJvamVjdCkgfSkpXG4gICAgICAuZmlsdGVyKCh7IHNjcmlwdHMgfSkgPT4gc2NyaXB0cy5sZW5ndGggPiAwKTtcbiAgICBpZiAoZ2VuQ29kZVRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ05vIGNvZGUgZ2VuZXJhdGlvbiBuZWVkZWQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCwgc2NyaXB0cyB9IG9mIGdlbkNvZGVUYXJnZXRzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJnZW4tY29kZVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG4gICAgICAvLyBXcml0ZSB0aGUga2V5IHN0dWIgdGhlIGZpcnN0IHNjcmlwdCdzIGB3cmFuZ2xlciB0eXBlcyAtLWVudi1maWxlYCBjb25zdW1lcy4gSXQgaXMgZGVyaXZlZCBmcm9tXG4gICAgICAvLyBjb21taXR0ZWQgc291cmNlcyAoZm5veC50b21sIGtleSBuYW1lcyksIHNvIGl0IG5lZWRzIG5vIGFnZSBrZXksIG5ldmVyIHB1bGxzIGluXG4gICAgICAvLyBwcm9jZXNzLmVudiAvIGBtaXNlIGVudmAgaG9zdCB2YXJpYWJsZXMsIGFuZCBkb2VzIG5vdCBkZXBlbmQgb24gd2hpY2ggcHJvZmlsZSBhIHJ1biByZXNvbHZlcy5cbiAgICAgIGlmICghYXJndi5kcnlSdW4gJiYgZ2V0V3JhbmdsZXJUeXBlc1NjcmlwdChwcm9qZWN0KSkge1xuICAgICAgICB3cml0ZVdvcmtlclR5cGVzRW52U3R1YihcbiAgICAgICAgICBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgICAgcHJvamVjdC5yb290RGlyUGF0aCxcbiAgICAgICAgICBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCB3b3JrZXJUeXBlc0VudlBhdGgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBzY3JpcHRzKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5Db2RlU2NyaXB0cyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBzY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICAvLyBGaXJzdDogYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNgIGlzIGdpdGlnbm9yZWQsIHNvIG9uIGEgZnJlc2ggY2hlY2tvdXQgaXQgZG9lcyBub3QgZXhpc3QgeWV0LFxuICAvLyBhbmQgdGhlIGdlbmVyYXRvcnMgYmVsb3cgdHlwZS1jaGVjayBhZ2FpbnN0IHRoZSBDbG91ZGZsYXJlIGBFbnZgIGl0IGRlY2xhcmVzLlxuICBjb25zdCB3cmFuZ2xlclR5cGVzU2NyaXB0ID0gZ2V0V3JhbmdsZXJUeXBlc1NjcmlwdChwcm9qZWN0KTtcbiAgaWYgKHdyYW5nbGVyVHlwZXNTY3JpcHQpIHtcbiAgICAvLyBgLS1lbnYtZmlsZWAgcG9pbnRzIHdyYW5nbGVyIGF0IHRoZSBrZXkgc3R1YiB0aGUgaGFuZGxlciB3cml0ZXMgKHNlZSB3cml0ZVdvcmtlclR5cGVzRW52U3R1YiksXG4gICAgLy8gc28gYSBmcmVzaCBjaGVja291dCB3aXRoIG5vIHJ1bnRpbWUgLmRldi52YXJzIChlLmcuIENJKSBzdGlsbCB0eXBlcyBldmVyeSBzZWNyZXQuIFdpdGhvdXQgaXQgYVxuICAgIC8vIGJhcmUgYHdyYW5nbGVyIHR5cGVzYCB5aWVsZHMgYW4gYEVudmAgbWlzc2luZyBldmVyeSBzZWNyZXQgYW5kIHRoZSB0eXBlLWF3YXJlIGdlbmVyYXRvcnMvbGludGVyc1xuICAgIC8vIGJlbG93IGZhaWwgKGUuZy4gXCJQcm9wZXJ0eSAnQVVUSF9TRUNSRVQnIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0VudidcIikuXG4gICAgc2NyaXB0cy5wdXNoKGAke3dyYW5nbGVyVHlwZXNTY3JpcHR9IC0tZW52LWZpbGUgJHt3b3JrZXJUeXBlc0VudlBhdGh9YCk7XG4gIH1cbiAgLy8gWWFybi1lcmEgQmxpdHogcmVwb3NpdG9yaWVzIG5lZWQgYGJsaXR6IGNvZGVnZW5gIGZvciB0aGUgcm91dGUgbWFuaWZlc3QgKG5vZGVfbW9kdWxlcy8uYmxpdHopXG4gIC8vIHRoYXQgQGJsaXR6anMvbmV4dCdzIHR5cGUgZGVjbGFyYXRpb25zIHJlLWV4cG9ydDsgaW5zdGFsbCBzY3JpcHRzIGRvIG5vdCBydW4gaXRcbiAgLy8gKGVuYWJsZVNjcmlwdHM6IGZhbHNlKS4gTmV2ZXIgdW5kZXIgQnVuOiB0aGUgYmxpdHogQ0xJIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW5cbiAgLy8gcGxhY2UsIHdoaWNoIG11c3Qgbm90IGhhcHBlbiBpbiBCdW4ncyBzaGFyZWQgZ2xvYmFsIHN0b3JlIChCdW4tZXJhIEJsaXR6IHJlcG9zaXRvcmllcyBnZW5lcmF0ZVxuICAvLyB0aGUgbWFuaWZlc3Qgd2l0aCB0aGVpciBvd24gc2NyaXB0cyBpbnN0ZWFkKS4gT24gYSBmcmVzaCBpbnN0YWxsIGBibGl0eiBjb2RlZ2VuYCBhbHNvXG4gIC8vIGdlbmVyYXRlcyB0aGUgUHJpc21hIGNsaWVudCBpdHNlbGYsIG1ha2luZyB0aGUgUFJJU01BIGdlbmVyYXRlIHN0ZXAgYmVsb3cgcmVkdW5kYW50IG9uY2Ug4oCUXG4gIC8vIGtlZXBpbmcgYm90aCBpcyBkZWxpYmVyYXRlOiBhZnRlciBzY2hlbWEtb25seSBjaGFuZ2VzIGJsaXR6J3MgYWxyZWFkeS1nZW5lcmF0ZWQgZ3VhcmQgc2tpcHNcbiAgLy8gaXRzIGludGVybmFsIGdlbmVyYXRlLCBzbyB0aGUgZXhwbGljaXQgc3RlcCBpcyBzdGlsbCB3aGF0IHJlZ2VuZXJhdGVzIHRoZSBjbGllbnQuXG4gIGlmICghcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgJiYgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdibGl0eicpICYmIHByb2plY3QuaGFzU291cmNlQ29kZSkge1xuICAgIHNjcmlwdHMucHVzaCgnWUFSTiBibGl0eiBjb2RlZ2VuJyk7XG4gIH1cbiAgY29uc3QgcHJpc21hR2VuZXJhdGVTY3JpcHQgPSBnZXRQcmlzbWFHZW5lcmF0ZVNjcmlwdChwcm9qZWN0KTtcbiAgaWYgKHByaXNtYUdlbmVyYXRlU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKHByaXNtYUdlbmVyYXRlU2NyaXB0KTtcbiAgfVxuICBjb25zdCBjaGFrcmFUeXBlZ2VuU2NyaXB0ID0gZ2V0Q2hha3JhU2NyaXB0KHByb2plY3QpO1xuICBpZiAoY2hha3JhVHlwZWdlblNjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChjaGFrcmFUeXBlZ2VuU2NyaXB0KTtcbiAgfVxuICBjb25zdCBkcml6emxlQ2hlY2tTY3JpcHQgPSBnZXREcml6emxlQ2hlY2tTY3JpcHQocHJvamVjdCk7XG4gIGlmIChkcml6emxlQ2hlY2tTY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goZHJpenpsZUNoZWNrU2NyaXB0KTtcbiAgfVxuICBjb25zdCBnZW5JMThuVHNTY3JpcHQgPSBnZXRHZW5JMThuVHNTY3JpcHQocHJvamVjdCk7XG4gIGlmIChnZW5JMThuVHNTY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goZ2VuSTE4blRzU2NyaXB0KTtcbiAgfVxuICByZXR1cm4gc2NyaXB0cztcbn1cblxuLyoqXG4gKiBgWUFSTiB3cmFuZ2xlcmAgcmF0aGVyIHRoYW4gYGJ1bnggd3JhbmdsZXJgOiB3cmFuZ2xlciBuZWVkcyByZWFsIE5vZGUuanMsIGFuZCBgYnVueGAgbWF5IHJlc29sdmVcbiAqIGEgdmVyc2lvbiBvdGhlciB0aGFuIHRoZSBsb2NrZmlsZSdzLiBSZXR1cm5zIHRoZSBiYXNlIGNvbW1hbmQ7IHRoZSBjYWxsZXIgYXBwZW5kcyBgLS1lbnYtZmlsZWBcbiAqIHBvaW50aW5nIGF0IGEgZ2VuZXJhdGVkIGtleS1vbmx5IHN0dWIgKHNlZSBnZXRHZW5Db2RlU2NyaXB0cykgYmVjYXVzZSBmbm94IHJlcG9zaXRvcmllcyBoYXZlIG5vXG4gKiBgLmVudmAgZmlsZSBmb3Igd3JhbmdsZXIgdG8gaW5mZXIgdGhlIHNlY3JldCBiaW5kaW5ncyBmcm9tLiBgLS1zdHJpY3QtdmFyc2AgaXMgZGVsaWJlcmF0ZWx5IGxlZnRcbiAqIG91dCDigJQgaXQgaXMgYSBwZXItcmVwb3NpdG9yeSB0eXBlLXN0cmljdG5lc3MgY2hvaWNlIHRoYXQgYmVsb25ncyBpbiB0aGUgd3JhbmdsZXIgY29uZmlnLlxuICovXG5mdW5jdGlvbiBnZXRXcmFuZ2xlclR5cGVzU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuZ2VuZXJhdGVzV29ya2VyVHlwZXMpIHJldHVybjtcbiAgcmV0dXJuICdZQVJOIHdyYW5nbGVyIHR5cGVzJztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuSTE4blRzU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHtcbiAgICBpZiAoIXByb2plY3QuaGFzU291cmNlQ29kZSkgcmV0dXJuO1xuICAgIHJldHVybiAnWUFSTiBydW4gZ2VuLWkxOG4tdHMnO1xuICB9XG4gIGlmIChcbiAgICBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ2dlbi1pMThuLXRzJykgJiZcbiAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdpMThuJykpXG4gICkge1xuICAgIHJldHVybiAnWUFSTiBnZW4taTE4bi10cyAtaSBpMThuIC1vIHNyYy9fX2dlbmVyYXRlZF9fL2kxOG4udHMgLWQgamEtSlAnO1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gZ2V0UHJpc21hR2VuZXJhdGVTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcHJvamVjdC5oYXNQcmlzbWEpIHJldHVybjtcbiAgaWYgKCFoYXNQcmlzbWFTY2hlbWEocHJvamVjdCkpIHJldHVybjtcbiAgcmV0dXJuIHByaXNtYVNjcmlwdHMuZ2VuZXJhdGUocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIGdldENoYWtyYVNjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ0BjaGFrcmEtdWkvY2xpJykpIHJldHVybjtcbiAgaWYgKCFmaWxlRXhpc3RzKHByb2plY3QsICdzcmMvdGhlbWUudHMnKSkgcmV0dXJuO1xuICByZXR1cm4gJ1lBUk4gY2hha3JhIHR5cGVnZW4gc3JjL3RoZW1lLnRzIC0tc3RyaWN0Jztcbn1cblxuZnVuY3Rpb24gZ2V0RHJpenpsZUNoZWNrU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuaGFzRHJpenpsZSkgcmV0dXJuO1xuICBjb25zdCBjb25maWcgPSBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0KTtcbiAgaWYgKCFjb25maWcpIHJldHVybjtcbiAgLy8gS2VlcCB0aGUgZXhwbGljaXQgLS1jb25maWcgYmVjYXVzZSBkcml6emxlLWtpdCdzIGRlZmF1bHQgbG9va3VwIG1pc3NlcyBzb21lIGV4dGVuc2lvbnMgKGUuZy4gLm10cykuXG4gIHJldHVybiBgJHt3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdCwgYFlBUk4gZHJpenpsZS1raXQgY2hlY2sgLS1jb25maWcgJHtjb25maWcuZmlsZU5hbWV9YCl9IHx8IHRydWVgO1xufVxuXG5mdW5jdGlvbiBmaWxlRXhpc3RzKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZmlsZVBhdGgpKTtcbn1cblxuZnVuY3Rpb24gaGFzUHJpc21hU2NoZW1hKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsncHJpc21hL3NjaGVtYS5wcmlzbWEnLCAncHJpc21hL3NjaGVtYScsICdkYi9zY2hlbWEucHJpc21hJ10uc29tZSgoZmlsZVBhdGgpID0+XG4gICAgZmlsZUV4aXN0cyhwcm9qZWN0LCBmaWxlUGF0aClcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZURvdGVudiB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG4vLyBDbG91ZGZsYXJlIFdvcmtlcnMgZG9uJ3Qgc2VlIHRoZSBwcm9jZXNzIGVudmlyb25tZW50OyB3cmFuZ2xlciBkZXYgcmVhZHMgdmFycyBmcm9tIGEgLmRldi52YXJzXG4vLyBmaWxlIG5leHQgdG8gaXRzIGNvbmZpZyBmaWxlIGluc3RlYWQuIFRoaXMgY29tbWFuZCBicmlkZ2VzIHRoZSBmbm94LW1hbmFnZWQgdmFsdWVzIHRvIHRoYXQgZmlsZS5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgR2VuRGV2VmFyc0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucyAmIHsgcGF0aD86IHN0cmluZyB9PjtcblxuZXhwb3J0IGNvbnN0IGdlbkRldlZhcnNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdnZW4tZGV2LXZhcnMgW3BhdGhdJyxcbiAgZGVzY3JpYmU6XG4gICAgJ0dlbmVyYXRlIGEgLmRldi52YXJzIGZpbGUgZm9yIGB3cmFuZ2xlciBkZXZgIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBsb2FkZWQgZnJvbSBmbm94IChwbHVzIFdCX0VOViBhbmQgTkVYVF9QVUJMSUNfV0JfRU5WKS4nLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+XG4gICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIGdlbmVyYXRlZCAuZGV2LnZhcnMgZmlsZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnLmRldi52YXJzJyxcbiAgICB9KSBhcyB1bmtub3duIGFzIEFyZ3Y8R2VuRGV2VmFyc0NvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2OiBHZW5EZXZWYXJzQ29tbWFuZEFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIFJlc3RyaWN0IHRvIHZhcmlhYmxlcyBsb2FkZWQgZnJvbSB0aGUgcHJvamVjdCdzIGRlY2xhcmVkIGVudmlyb25tZW50IHNvdXJjZXMgc28gdGhhdFxuICAgIC8vIHVucmVsYXRlZCBwcm9jZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyBuZXZlciBsZWFrIGludG8gdGhlIGdlbmVyYXRlZCBmaWxlLiBJZ25vcmVcbiAgICAvLyBwcm9jZXNzLmVudiBiZWNhdXNlIHRoZSBwYXJlbnQgd2IgcHJvY2VzcyBpbmplY3RzIHRoZSBmbm94IHZhbHVlcyBpbnRvIGl0LCB3aGljaCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzdXBwcmVzcyBsb2FkaW5nIHRoZW0gaGVyZS4gd2JmeSBkZWNsYXJlcyB0aGUgV0JfRU5WLWZhbWlseSBrZXlzIGluIGZub3gsIHNvXG4gICAgLy8gdGhleSBhcmUgYWxyZWFkeSBpbmNsdWRlZDsgcHJvY2Vzcy1vbmx5IGtleXMgYXJlIGludGVudGlvbmFsbHkgb3V0c2lkZSB0aGlzIGFsbG93bGlzdC5cbiAgICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gRXhwbGljaXRseSBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCB3aW4gb3ZlciBmbm94IHZhbHVlcyBmb3IgY29uZmlndXJlZCBrZXlzXG4gICAgLy8gKHByb2plY3QuZW52IGFwcGxpZXMgdGhhdCBwcmVjZWRlbmNlKSwgb3IgYEFVVEhfU0VDUkVUPS4uLiB3YiBzdGFydGAgd291bGQgc2VydmUgdGhlXG4gICAgLy8gc3RhbGUgY29uZmlndXJlZCB2YWx1ZS4gQW4gZXhwb3J0IHRoYXQgZW1wdGllcyBhIG5vbi1lbXB0eSBjb25maWd1cmVkIHZhbHVlIGlzIGRlbGliZXJhdGVcbiAgICAvLyBhbmQgbXVzdCBzdXJ2aXZlIHRoZSBlbXB0eS12YWx1ZSBmaWx0ZXIgYmVsb3cgKHVubGlrZSBgS0VZPWAgcGxhY2Vob2xkZXJzLCB3aGljaCBzdGF5XG4gICAgLy8gb21pdHRlZCBzbyB0aGV5IGNhbm5vdCBvdmVycmlkZSB3cmFuZ2xlciBgdmFyc2Agd2l0aCBlbXB0eSBzdHJpbmdzKS5cbiAgICBjb25zdCBleHBsaWNpdGx5RW1wdGllZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSAnJyAmJiBlbnZWYXJzW2tleV0gIT09ICcnKSBleHBsaWNpdGx5RW1wdGllZEtleXMuYWRkKGtleSk7XG4gICAgICBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgbGluZXMgPSBPYmplY3QuZW50cmllcyhlbnZWYXJzKVxuICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gJycgfHwgZXhwbGljaXRseUVtcHRpZWRLZXlzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PSR7cXVvdGVEb3RlbnZWYWx1ZShrZXksIHZhbHVlKX1gKTtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYXJndi5wYXRoID8/ICcuZGV2LnZhcnMnKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBXb3VsZCBnZW5lcmF0ZSAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShvdXRwdXRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nKTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gIH0sXG59O1xuXG4vKipcbiAqIFF1b3RlIGEgdmFsdWUgZm9yIGRvdGVudiAod2hpY2ggd3JhbmdsZXIgdXNlcyBmb3IgLmRldi52YXJzKS4gRXZlcnkgY2FuZGlkYXRlIHJlcHJlc2VudGF0aW9uXG4gKiBpcyB2ZXJpZmllZCBieSBhY3R1YWxseSBwYXJzaW5nIGl0IGJhY2sgKG91ciBkb3RlbnYgcGFyc2VyIG1hdGNoZXMgd3JhbmdsZXIncyBidW5kbGVkIGRvdGVudlxuICogMTYgZm9yIHRoZXNlIGNvbnN0cnVjdHMpLCBzbyBhIHZhbHVlIGlzIGVpdGhlciBzZXJpYWxpemVkIGxvc3NsZXNzbHkgb3IgcmVqZWN0ZWQg4oCUIG5ldmVyXG4gKiBzaWxlbnRseSBjb3JydXB0ZWQuIENhbmRpZGF0ZXM6IHNpbmdsZSBxdW90ZXMgKGxpdGVyYWwgc3BhbjsgY2xvc2VkIGVhcmx5IGJ5IGFuIGFwb3N0cm9waGUpLFxuICogYmFja3RpY2tzIChlcXVhbGx5IGxpdGVyYWwpLCB0aGVuIGRvdWJsZSBxdW90ZXMgd2l0aCBlc2NhcGVkIG5ld2xpbmVzL0NScyAoZG90ZW52IGRvZXMgbm90XG4gKiB1bmVzY2FwZSBpbm5lciBcXFwiIOKAlCBhIGAjYCBhZnRlciBhbiBlbWJlZGRlZCBxdW90ZSBzdGFydHMgYSBjb21tZW50LCB3aGljaCB0aGUgcm91bmQtdHJpcFxuICogY2hlY2sgY2F0Y2hlcyBhbmQgcmVqZWN0cykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZURvdGVudlZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZG91YmxlUXVvdGVkQm9keSA9IHZhbHVlLnJlcGxhY2VBbGwoJ1xcbicsIFN0cmluZy5yYXdgXFxuYCkucmVwbGFjZUFsbCgnXFxyJywgU3RyaW5nLnJhd2BcXHJgKTtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtgJyR7dmFsdWV9J2AsIGBcXGAke3ZhbHVlfVxcYGAsIGBcIiR7ZG91YmxlUXVvdGVkQm9keX1cImBdO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKHBhcnNlRG90ZW52KGAke2tleX09JHtjYW5kaWRhdGV9YClba2V5XSA9PT0gdmFsdWUpIHJldHVybiBjYW5kaWRhdGU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdmFsdWUgb2YgJHtrZXl9IGNhbm5vdCBiZSBsb3NzbGVzc2x5IHNlcmlhbGl6ZWQgaW50byAuZGV2LnZhcnM7IHNpbXBsaWZ5IGl0cyBxdW90aW5nLmApO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG5jb25zdCBraWxsUG9ydElmTm9uQ2lCdWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBraWxsUG9ydElmTm9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2tpbGwtcG9ydC1pZi1ub24tY2knLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIHBvcnQgc3BlY2lmaWVkIGJ5IFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgbm9uLUNJLicsXG4gIGJ1aWxkZXI6IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGtpbGxQb3J0SWZOb25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydElmTm9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwIGtpbGxpbmcgcG9ydCBkdWUgdG8gQ0k6ICR7cHJvamVjdC5lbnYuQ0l9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9ydEVudiA9IHByb2plY3QuZW52LlBPUlQ7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhgS2lsbGluZyB0aGUgcG9ydDogJHtwb3J0fWApO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIXNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGUsIG91dHB1dCkpIHJldHVybjtcblxuICBjb25zdCBub3JtYWxpemVkT3V0cHV0ID0gbm9ybWFsaXplQnVmZmVyZWRPdXRwdXQob3V0cHV0KTtcbiAgaWYgKG5vcm1hbGl6ZWRPdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShub3JtYWxpemVkT3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV4aXRDb2RlICE9PSAwIHx8IGhhc1dhcm5pbmdPdXRwdXQob3V0cHV0KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQnVmZmVyZWRPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gb3V0cHV0LnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzV2FybmluZ091dHB1dChvdXRwdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL1xcYndhcm4oPzppbmcpP3M/XFxiL2kudGVzdChvdXRwdXQucmVwbGFjZUFsbCgvXFxiKD86MHxubykgd2FybmluZ3M/XFxiL2dpLCAnJykpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgQnVmZmVyZWRSdW5SZXN1bHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVTY3JpcHQsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmludEJ1ZmZlcmVkT3V0cHV0LCBzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0IH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHsgcmVwb3J0VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMgfSBmcm9tICcuLi91dGlscy90ZXN0U3RydWN0dXJlLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHF1aWV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZXBvcnQgZXJyb3JzIG9ubHknLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdQcmludCBvbmx5IGZhaWxlZCBvciB3YXJuaW5nIGNvbW1hbmQgb3V0cHV0JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBMaW50Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPjtcbmV4cG9ydCB0eXBlIExpbnRDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxMaW50Q29tbWFuZE9wdGlvbnM+ICYge1xuICAnLS0nPzogdW5rbm93bltdO1xuICBfOiB1bmtub3duW107XG4gIHByaW50QWxsT3V0cHV0PzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IG94bGludEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddKTtcbmNvbnN0IHB5dGhvbkV4dGVuc2lvbnMgPSBuZXcgU2V0KFsncHknXSk7XG5jb25zdCBkYXJ0RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydkYXJ0J10pO1xuY29uc3QgcnVzdEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsncnMnXSk7XG5jb25zdCBveGZtdEV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgLi4ub3hsaW50RXh0ZW5zaW9ucyxcbiAgJ2NzcycsXG4gICdncWwnLFxuICAnZ3JhcGhxbCcsXG4gICdoYnMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdsZXNzJyxcbiAgJ21kJyxcbiAgJ21keCcsXG4gICdzY3NzJyxcbiAgJ3RvbWwnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllckV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgJ2NqcycsXG4gICdjc3MnLFxuICAnY3RzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2phdmEnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWQnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzY3NzJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllck9ubHlFeHRlbnNpb25zID0gbmV3IFNldChbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5maWx0ZXIoKGV4dCkgPT4gIW94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0KSkpO1xuY29uc3QgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybiA9ICchKiovdGVzdHstLC99Zml4dHVyZXMvKionO1xuXG50eXBlIEJ1ZmZlcmVkTGludFJ1blJlc3VsdCA9IEJ1ZmZlcmVkUnVuUmVzdWx0ICYgeyBjb21tYW5kOiBzdHJpbmc7IGN3ZDogc3RyaW5nIH07XG50eXBlIExpbnRSdW5SZXN1bHQgPSBCdWZmZXJlZExpbnRSdW5SZXN1bHQgfCB7IGV4aXRDb2RlOiBudW1iZXIgfTtcbmludGVyZmFjZSBMaW50UnVuQ29tbWFuZCB7XG4gIGNvbW1hbmQ6IHN0cmluZztcbiAgcHJvamVjdDogUHJvamVjdDtcbn1cblxuZXhwb3J0IGNvbnN0IGxpbnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIExpbnRDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdsaW50IFtmaWxlcy4uLl0nLFxuICBkZXNjcmliZTogJ0xpbnQgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgbGludChhcmd2IGFzIExpbnRDb21tYW5kQXJndik7XG4gICAgaWYgKGV4aXRDb2RlKSBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpbnQoYXJndjogTGludENvbW1hbmRBcmd2KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgZmlsZXMgPSBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndik7XG4gIGNvbnN0IHNob3VsZFJ1bkZvcm1hdHRlcnMgPSBCb29sZWFuKGFyZ3YuZm9ybWF0KTtcbiAgY29uc3Qgc2hvdWxkUnVuTGludGVycyA9ICFhcmd2LmZvcm1hdCB8fCBhcmd2LmZpeDtcbiAgLy8gVGhlIHRlc3QgbGF5b3V0IGlzIGEgc3RhdGljIHN0cnVjdHVyYWwgcnVsZSwgc28gYHdiIGxpbnRgIGlzIGl0cyBob21lOiBgd2IgdmVyaWZ5YCAodmlhIGl0c1xuICAvLyBjbGVhbnVwIHN0ZXApIGFuZCBDSSdzIGxpbnQgam9iIHRoZW4gZW5mb3JjZSBpdCB3aXRoIG5vIGV4dHJhIHdpcmluZywgYW5kIGEgc3RyYXkgdGVzdCBmaWxlXG4gIC8vIHN1cmZhY2VzIGhlcmUgaW5zdGVhZCBvZiBhdCBgd2IgdGVzdGAsIHdoZXJlIGAtLXBhc3NXaXRoTm9UZXN0c2Agd291bGQgb3RoZXJ3aXNlIGxldCB0aGUgc3VpdGVcbiAgLy8gcGFzcyB3aGlsZSBzaWxlbnRseSBydW5uaW5nIG5vbmUgb2YgaXQuIFJlcG9ydGVkIGJlZm9yZSB0aGUgbGludGVycyBydW4gc28gdGhlIGRpYWdub3NpcyBsZWFkc1xuICAvLyB0aGUgb3V0cHV0LCBidXQgbmV2ZXIgc2hvcnQtY2lyY3VpdHMgdGhlbTogYC0tZml4IC0tZm9ybWF0YCBtdXN0IHN0aWxsIGNsZWFuIHVwIHdoYXQgaXQgY2FuLFxuICAvLyBiZWNhdXNlIGEgbGF5b3V0IHZpb2xhdGlvbiBpcyBub3QgYXV0by1maXhhYmxlIGFuZCB3b3VsZCBvdGhlcndpc2UgYmxvY2sgZXZlcnkgb3RoZXIgZml4LlxuICAvLyBUaHJlZSBydW4gc2hhcGVzIG9wdCBvdXQuIEV4cGxpY2l0LXBhdGggcnVucyAoZS5nLiB0aGUgbGVmdGhvb2sgcHJlLWNvbW1pdCBob29rKSBza2lwIGl0IHNvIGFcbiAgLy8gcHJlLWV4aXN0aW5nIHZpb2xhdGlvbiBpbiBhbiB1bnRvdWNoZWQgcGFja2FnZSBjYW5ub3QgYmxvY2sgYW4gdW5yZWxhdGVkIGNvbW1pdC4gYC0tZHJ5LXJ1bmBcbiAgLy8gc2tpcHMgaXQgc28gdGhpcyBzdGF5cyB0aGUgb25lIHN0ZXAgdGhhdCBjb3VsZCBmYWlsIGEgcnVuIHdob3NlIHdob2xlIGNvbnRyYWN0IGlzIHRvIGV4ZWN1dGVcbiAgLy8gbm90aGluZy4gRm9ybWF0dGVyLW9ubHkgcnVucyAoYC0tZm9ybWF0YCB3aXRob3V0IGAtLWZpeGApIHNraXAgaXQgYmVjYXVzZSB0aGV5IGxpbnQgbm90aGluZyBhdFxuICAvLyBhbGwsIGFuZCB3YmZ5IGNoYWlucyB0aGF0IHNjcmlwdCBhcyBgYnVuIHdiIGxpbnQgLS1mb3JtYXQgJiYgYnVuIHJ1biBmb3JtYXQtY29kZWAgZm9yIERhcnQgYW5kXG4gIC8vIFB5dGhvbiByZXBvc2l0b3JpZXMg4oCUIGZhaWxpbmcgaXQgdGhlcmUgd291bGQgc2lsZW50bHkgc3RyaXAgdGhlaXIgb25seSBmb3JtYXR0aW5nIHBhc3MuXG4gIGNvbnN0IHZpb2xhdGVzVGVzdFN0cnVjdHVyZSA9XG4gICAgc2hvdWxkUnVuTGludGVycyAmJiAhYXJndi5kcnlSdW4gJiYgZmlsZXMubGVuZ3RoID09PSAwICYmIHJlcG9ydFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3RzLmRlc2NlbmRhbnRzKTtcbiAgY29uc3QgbGludEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgZGFydEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIC8vIGBjYXJnbyBmbXQgLS1hbGxgIGFsd2F5cyBmb3JtYXRzIHRoZSB3aG9sZSB3b3Jrc3BhY2UsIHNvIHdlIHRyYWNrIHRhcmdldFxuICAvLyBwcm9qZWN0cyByYXRoZXIgdGhhbiBpbmRpdmlkdWFsIGZpbGUgcGF0aHMuIEV2ZXJ5IHByb2plY3Qgd2l0aCBpdHMgb3duXG4gIC8vIGBDYXJnby50b21sYCBydW5zIGl0cyBvd24gYGNhcmdvIGZtdCAtLWFsbGA7IHdlIGludGVudGlvbmFsbHkgZG8gbm90IGRlZHVwXG4gIC8vIGJ5IGRpcmVjdG9yeS4gQSBuZXN0ZWQgb3Igc2libGluZyBjcmF0ZSBjYW4gYmUgYW4gaW5kZXBlbmRlbnQgQ2FyZ29cbiAgLy8gd29ya3NwYWNlIHRoYXQgYSBwYXJlbnQncyBgY2FyZ28gZm10IC0tYWxsYCBuZXZlciByZWFjaGVzLCBzbyBza2lwcGluZyBpdFxuICAvLyB3b3VsZCBsZWF2ZSBpdCB1bmZvcm1hdHRlZCwgd2hpbGUgYW55IGdlbnVpbmVseSBvdmVybGFwcGluZyBydW5zIGFyZVxuICAvLyBoYXJtbGVzcyBiZWNhdXNlIHJ1c3RmbXQgaXMgZGV0ZXJtaW5pc3RpYyBhbmQgaWRlbXBvdGVudC4gRGVkdXBpbmcgYnkgcmVhbFxuICAvLyB3b3Jrc3BhY2UgbWVtYmVyc2hpcCB3b3VsZCByZXF1aXJlIGludm9raW5nIGBjYXJnbyBsb2NhdGUtcHJvamVjdGAuXG4gIGNvbnN0IGNhcmdvRm9ybWF0UHJvamVjdHMgPSBuZXcgU2V0PFByb2plY3Q+KCk7XG4gIGNvbnN0IHByZXR0aWVyRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSBmYWxzZTtcbiAgbGV0IHByZXR0aWVyQXJnczogc3RyaW5nW107XG4gIGxldCBzb3J0UGFja2FnZUpzb25BcmdzOiBzdHJpbmdbXTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW50VGFyZ2V0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpO1xuICAgICAgICBjb25zdCBmaWxlS2luZCA9IGF3YWl0IGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9O1xuICAgICAgfSlcbiAgICApO1xuICAgIGZvciAoY29uc3QgeyBmaWxlS2luZCwgZmlsZVBhdGggfSBvZiBsaW50VGFyZ2V0cykge1xuICAgICAgaWYgKFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKC4uLmdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSk7XG5cbiAgICAgIGZvciAoY29uc3QgeyBsaW50UGF0aCwgcHJvamVjdCB9IG9mIGdldEV4cGxpY2l0TGludFRhcmdldHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jayAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgcHl0aG9uRmlsZVBhdGhzID0gcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBweXRob25GaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgZGFydEZpbGVQYXRocyA9IGRhcnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGRhcnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgZGFydEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgZGFydEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzQ2FyZ29Ub21sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgcnVzdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY2FyZ29Gb3JtYXRQcm9qZWN0cy5hZGQocHJvamVjdCk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRGaWxlUGF0aHMgPSBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4obGludFBhdGgpLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZm9ybWF0dGVyUGF0aCBvZiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhwcm9qZWN0LCBsaW50UGF0aCwgZmlsZUtpbmQsIGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYXJndi5mb3JtYXQgJiYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQgJiYgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb24pICYmICFwcm9qZWN0LnByZWZlcnJlZExpbnRlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBObyBsaW50ZXIgZm91bmQgZm9yICR7cHJvamVjdC5uYW1lfS4gSW5zdGFsbCBPeGxpbnQuYCkpO1xuICAgICAgICAgIG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByZXR0aWVyQXJncyA9IFsuLi5uZXcgU2V0KHByZXR0aWVyRmlsZVBhdGhzKV07XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IFsuLi5uZXcgU2V0KHBhY2thZ2VKc29uRmlsZVBhdGhzKV07XG4gIH0gZWxzZSB7XG4gICAgcHJldHRpZXJBcmdzID0gYnVpbGRQcmV0dGllckFyZ3MocHJvamVjdHMuc2VsZi5kaXJQYXRoLCBwcm9qZWN0cy5kZXNjZW5kYW50cyk7XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gcC5wYWNrYWdlSnNvblBhdGgpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyQ29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10gPSBbXTtcbiAgY29uc3QgbGludGVyQ29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10gPSBbXTtcbiAgY29uc3QgbGludFJ1bk9wdGlvbnMgPSB7IGV4aXRJZkZhaWxlZDogZmFsc2UsIHByZXNlcnZlQ29sb3I6ICFhcmd2LnByaW50QWxsT3V0cHV0IH0gYXMgY29uc3Q7XG4gIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgW3Byb2plY3QsIGxpbnRGaWxlUGF0aHNdIG9mIGxpbnRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICBpZiAoIWxpbnRDb21tYW5kKSBjb250aW51ZTtcblxuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogbGludENvbW1hbmQsIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIHB5dGhvbkZpbGVQYXRoc10gb2YgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2LCBweXRob25GaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZChweXRob25GaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzXSBvZiBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0TGludENvbW1hbmQoZGFydEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZChkYXJ0RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBjYXJnb0Zvcm1hdFByb2plY3RzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBbcHJvamVjdCwgb3hmbXRGaWxlUGF0aHNdIG9mIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZE94Zm10Q29tbWFuZChveGZtdEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzT3duU291cmNlQ29kZSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBpZiAobGludENvbW1hbmQpIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBsaW50Q29tbWFuZCwgcHJvamVjdCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2KSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwpIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRMaW50Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZE94Zm10Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrKSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sKSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNDYXJnb1RvbWwpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBsaW50RXhpdENvZGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgY29uc3QgZm9ybWF0dGVyUmVzdWx0cyA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kcyhmb3JtYXR0ZXJDb21tYW5kcywgYXJndiwgbGludFJ1bk9wdGlvbnMpO1xuICAgIHByaW50U2lsZW50TGludE91dHB1dHMoZm9ybWF0dGVyUmVzdWx0cywgYXJndik7XG4gICAgbGludEV4aXRDb2Rlcy5wdXNoKC4uLmZvcm1hdHRlclJlc3VsdHMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5leGl0Q29kZSkpO1xuXG4gICAgaWYgKGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgaWYgKG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgaWYgKHByZXR0aWVyQXJncy5sZW5ndGggPiAwICYmIHByb2plY3RzLnNlbGYuaGFzUHJldHRpZXIpIHtcbiAgICAgIGNvbnN0IHByZXR0aWVyUmVzdWx0ID0gYXdhaXQgcnVuTGludENvbW1hbmQoXG4gICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgICAnWUFSTicsXG4gICAgICAgICAgJ3ByZXR0aWVyJyxcbiAgICAgICAgICAnLS1jYWNoZScsXG4gICAgICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgICAgICctLXdyaXRlJyxcbiAgICAgICAgICAnLS0nLFxuICAgICAgICAgIC4uLnByZXR0aWVyQXJncyxcbiAgICAgICAgXSksXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIGxpbnRSdW5PcHRpb25zXG4gICAgICApO1xuICAgICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhbcHJldHRpZXJSZXN1bHRdLCBhcmd2KTtcbiAgICAgIGxpbnRFeGl0Q29kZXMucHVzaChwcmV0dGllclJlc3VsdC5leGl0Q29kZSk7XG4gICAgfVxuICAgIGlmIChzb3J0UGFja2FnZUpzb25BcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNvcnRQYWNrYWdlSnNvblJlc3VsdCA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kKFxuICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ1lBUk4nLCAnc29ydC1wYWNrYWdlLWpzb24nLCAnLS0nLCAuLi5zb3J0UGFja2FnZUpzb25BcmdzXSksXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIGxpbnRSdW5PcHRpb25zXG4gICAgICApO1xuICAgICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhbc29ydFBhY2thZ2VKc29uUmVzdWx0XSwgYXJndik7XG4gICAgICBsaW50RXhpdENvZGVzLnB1c2goc29ydFBhY2thZ2VKc29uUmVzdWx0LmV4aXRDb2RlKTtcbiAgICB9XG5cbiAgICBpZiAobGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgIGNvbnN0IGxpbnRlclJlc3VsdHMgPSBhd2FpdCBydW5MaW50Q29tbWFuZHMobGludGVyQ29tbWFuZHMsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKTtcbiAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKGxpbnRlclJlc3VsdHMsIGFyZ3YpO1xuICAgIGxpbnRFeGl0Q29kZXMucHVzaCguLi5saW50ZXJSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUpKTtcbiAgfVxuXG4gIHJldHVybiBsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkgfHwgdmlvbGF0ZXNUZXN0U3RydWN0dXJlID8gMSA6IDA7XG59XG5cbmZ1bmN0aW9uIHJ1bkxpbnRDb21tYW5kcyhcbiAgY29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10sXG4gIGFyZ3Y6IExpbnRDb21tYW5kQXJndixcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduSW5QYXJhbGxlbD5bM11cbik6IFByb21pc2U8TGludFJ1blJlc3VsdFtdPiB7XG4gIHJldHVybiBQcm9taXNlLmFsbChjb21tYW5kcy5tYXAoKHsgY29tbWFuZCwgcHJvamVjdCB9KSA9PiBydW5MaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKSkpO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHQ+IHtcbiAgaWYgKGFyZ3Yuc2lsZW50KSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKHJlc3VsdCkgPT4gKHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIGNvbW1hbmQ6IG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLFxuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgfSkpO1xuICB9XG4gIHJldHVybiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKGV4aXRDb2RlKSA9PiAoeyBleGl0Q29kZSB9KSk7XG59XG5cbmZ1bmN0aW9uIHByaW50U2lsZW50TGludE91dHB1dHMoXG4gIHJlc3VsdHM6IExpbnRSdW5SZXN1bHRbXSxcbiAgYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICdwcmludEFsbE91dHB1dCcgfCAnc2lsZW50Jz5cbik6IHZvaWQge1xuICBjb25zdCBwcmludGFibGVSZXN1bHRzID1cbiAgICBhcmd2LnNpbGVudCAmJiAhYXJndi5wcmludEFsbE91dHB1dFxuICAgICAgPyByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiAnb3V0cHV0JyBpbiByZXN1bHQgJiYgc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dChyZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5vdXRwdXQpKVxuICAgICAgOiByZXN1bHRzO1xuICBpZiAocHJpbnRhYmxlUmVzdWx0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBwcmludGFibGVSZXN1bHRzKSB7XG4gICAgaWYgKCEoJ291dHB1dCcgaW4gcmVzdWx0KSkgY29udGludWU7XG5cbiAgICBpZiAoYXJndi5wcmludEFsbE91dHB1dCkge1xuICAgICAgcHJpbnRDb21tYW5kT3V0cHV0KHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhcmd2LnNpbGVudCkge1xuICAgICAgICBwcmludENvbW1hbmRIZWFkZXIocmVzdWx0LmNvbW1hbmQsIHJlc3VsdC5jd2QpO1xuICAgICAgfVxuICAgICAgcHJpbnRCdWZmZXJlZE91dHB1dChyZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5vdXRwdXQpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRPdXRwdXQocmVzdWx0OiBCdWZmZXJlZExpbnRSdW5SZXN1bHQpOiB2b2lkIHtcbiAgcHJpbnRDb21tYW5kSGVhZGVyKHJlc3VsdC5jb21tYW5kLCByZXN1bHQuY3dkKTtcblxuICBpZiAocmVzdWx0LmV4aXRDb2RlID09PSAwICYmIHNob3VsZFN1cHByZXNzU3VjY2Vzc2Z1bFZlcmlmeU91dHB1dChyZXN1bHQuY29tbWFuZCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dC50cmltKCk7XG4gIGlmIChvdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRIZWFkZXIoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3VwcHJlc3NTdWNjZXNzZnVsVmVyaWZ5T3V0cHV0KGNvbW1hbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnIG94Zm10ICcpIHx8IGNvbW1hbmQuaW5jbHVkZXMoJyBzb3J0LXBhY2thZ2UtanNvbiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTGludENvbW1hbmQoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzVHlwZUF3YXJlT3hsaW50Jz4sXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAnZml4JyB8ICdmb3JtYXQnPiAmIFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PixcbiAgZmlsZXM/OiBzdHJpbmdbXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50Jykge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnb3hsaW50JyxcbiAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgIC8vIFR5cGUtYXdhcmUgbW9kZSBtYWtlcyBveGxpbnQgcmVwb3J0IHR5cGUtY2hlY2sgZGlhZ25vc3RpY3MuIFBhc3MgdGhlIGZsYWdzIGV4cGxpY2l0bHlcbiAgICAgIC8vIGJlY2F1c2Ugb3hsaW50IHJlamVjdHMgdGhlIGVxdWl2YWxlbnQgb3B0aW9ucyBpbiBub24tcm9vdCBjb25maWdzLCBzbyBwZXItcGFja2FnZSBydW5zXG4gICAgICAvLyBpbiBtb25vcmVwb3Mgd291bGQgb3RoZXJ3aXNlIG1pc3MgdHlwZSBlcnJvcnMuXG4gICAgICAuLi4ocHJvamVjdC5oYXNUeXBlQXdhcmVPeGxpbnQgPyBbJy0tdHlwZS1hd2FyZScsICctLXR5cGUtY2hlY2snXSA6IFtdKSxcbiAgICAgIC4uLihhcmd2LnF1aWV0ID8gWyctLXF1aWV0J10gOiBbXSksXG4gICAgICAuLi4oYXJndi5maXggPyBbJy0tZml4J10gOiBbXSksXG4gICAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgIF0pO1xuICB9XG4gIHJldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT3hmbXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICdZQVJOJyxcbiAgICAnb3hmbXQnLFxuICAgICctLXdyaXRlJyxcbiAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgLi4uKGZpbGVzID8/IFsnLiddKSxcbiAgICAnISoqL3BhY2thZ2UuanNvbicsXG4gIF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gdG9MaW50VGFyZ2V0cyhmaWxlcyk7XG4gIHJldHVybiBbXG4gICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2lzb3J0JywgJy0tcHJvZmlsZScsICdibGFjaycsICctLWZpbHRlci1maWxlcycsIC4uLnRhcmdldHNdKSxcbiAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnYmxhY2snLCAuLi50YXJnZXRzXSksXG4gIF0uam9pbignICYmICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2OiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sIGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2ZsYWtlOCcsIC4uLihhcmd2LnF1aWV0ID8gWyctcSddIDogW10pLCAuLi50b0xpbnRUYXJnZXRzKGZpbGVzKV0pO1xufVxuXG5mdW5jdGlvbiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpOiBzdHJpbmcge1xuICAvLyBGb3JtYXR0aW5nIG11c3QgZ28gdGhyb3VnaCBjYXJnbyAobm90IHJ1c3RmbXQgb24gaW5kaXZpZHVhbCBmaWxlcykgc28gZWFjaFxuICAvLyBjcmF0ZSdzIGVkaXRpb24gYW5kIHJ1c3RmbXQgY29uZmlndXJhdGlvbiBhcmUgcmVzcGVjdGVkOyBgLS1hbGxgIGNvdmVyc1xuICAvLyBldmVyeSB3b3Jrc3BhY2UgbWVtYmVyIGFuZCBpcyBhIG5vLW9wIHN1ZmZpeCBmb3Igc2luZ2xlLWNyYXRlIHByb2plY3RzLlxuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydjYXJnbycsICdmbXQnLCAnLS1hbGwnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERhcnRGb3JtYXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2Zvcm1hdCcsIC4uLnRvTGludFRhcmdldHMoZmlsZXMpXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERhcnRMaW50Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnZGFydCcsICdhbmFseXplJywgLi4udG9MaW50VGFyZ2V0cyhmaWxlcyldKTtcbn1cblxuZnVuY3Rpb24gdG9MaW50VGFyZ2V0cyhmaWxlczogc3RyaW5nW10gfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJBcmdzKFxuICBzZWxmRGlyUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJncyA9IG5ldyBTZXQ8c3RyaW5nPihbYCoqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19YCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl0pO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoIW5lZWRzUHJldHRpZXIocHJvamVjdCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcHJvamVjdFBhdHRlcm4gPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnKiovey4qLyx9Ki57JyArIFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmpvaW4oJywnKSArICd9Jyk7XG4gICAgYXJncy5hZGQocGF0aC5yZWxhdGl2ZShzZWxmRGlyUGF0aCwgcHJvamVjdFBhdHRlcm4pIHx8IHByb2plY3RQYXR0ZXJuKTtcbiAgfVxuICByZXR1cm4gWy4uLmFyZ3NdO1xufVxuXG5mdW5jdGlvbiBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0czogUHJvamVjdFtdLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGxldCBvd25pbmdQcm9qZWN0OiBQcm9qZWN0IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoXG4gICAgICAoZmlsZVBhdGggPT09IHByb2plY3QuZGlyUGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3Byb2plY3QuZGlyUGF0aH0vYCkpICYmXG4gICAgICAoIW93bmluZ1Byb2plY3QgfHwgcHJvamVjdC5kaXJQYXRoLmxlbmd0aCA+IG93bmluZ1Byb2plY3QuZGlyUGF0aC5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBvd25pbmdQcm9qZWN0ID0gcHJvamVjdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG93bmluZ1Byb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICctLScgfCAnXycgfCAnZmlsZXMnPik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGludFRhcmdldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBbLi4uKGFyZ3YuZmlsZXMgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSksIC4uLihhcmd2WyctLSddID8/IFtdKV0pIHtcbiAgICBsaW50VGFyZ2V0cy5hZGQoU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW50VGFyZ2V0c107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8J2RpcmVjdG9yeScgfCAnb3RoZXInPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkgcmV0dXJuICdkaXJlY3RvcnknO1xuICB9IGNhdGNoIHtcbiAgICAvLyBNaXNzaW5nIHBhdGhzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkb3duc3RyZWFtIHRvb2xzLlxuICB9XG5cbiAgcmV0dXJuICdvdGhlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5oYXNPeGZtdCkgcmV0dXJuIG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgaWYgKG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gcHJldHRpZXJPbmx5RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcicsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgcHJvamVjdC5oYXNPeGZtdCkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgbmVlZHNQcmV0dGllcihwcm9qZWN0KSkge1xuICAgIHJldHVybiBbZmlsZVBhdGgsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dO1xuICB9XG4gIGlmIChzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKGZpbGVQYXRoLCBgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uUGF0aCc+W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgcmV0dXJuIFtdO1xuICByZXR1cm4gcHJvamVjdHNcbiAgICAuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoID09PSBwYXRoLmpvaW4oZmlsZVBhdGgsICdwYWNrYWdlLmpzb24nKSB8fFxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgIClcbiAgICAubWFwKChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdExpbnRUYXJnZXRzKFxuICBwcm9qZWN0czogUHJvamVjdFtdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiB7IGxpbnRQYXRoOiBzdHJpbmc7IHByb2plY3Q6IFByb2plY3QgfVtdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5Jykge1xuICAgIGNvbnN0IGRlc2NlbmRhbnRQcm9qZWN0cyA9IHByb2plY3RzLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LmRpclBhdGggPT09IGZpbGVQYXRoIHx8IHByb2plY3QuZGlyUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgICk7XG4gICAgaWYgKGRlc2NlbmRhbnRQcm9qZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZGVzY2VuZGFudFByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gKHsgbGludFBhdGg6IHByb2plY3QuZGlyUGF0aCwgcHJvamVjdCB9KSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzLCBmaWxlUGF0aCk7XG4gIHJldHVybiBwcm9qZWN0ID8gW3sgbGludFBhdGg6IGZpbGVQYXRoLCBwcm9qZWN0IH1dIDogW107XG59XG5cbmZ1bmN0aW9uIGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBweXRob25FeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IGRhcnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4sIGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5lZWRzUHJldHRpZXIocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+KTogYm9vbGVhbiB7XG4gIHJldHVybiAhcHJvamVjdC5oYXNPeGZtdCAmJiBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCc7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tICdub2RlOm5ldCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQgeyBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCB9IGZyb20gJy4vcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBnaXZlbiBwb3J0IGFuZCBraWxscyBhbnkgcHJvY2VzcyB1c2luZyBpdC5cbiAqIE5vdGUgd2IgYWx3YXlzIHJlcXVpcmVzIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyhyYXdQb3J0OiB1bmtub3duLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihyYXdQb3J0KTtcbiAgaWYgKCFwb3J0KSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBnaXZlbiBwb3J0ICgke3BvcnR9KSBpcyBpbnZhbGlkLmApO1xuXG4gIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQsIHByb2plY3QpO1xuICByZXR1cm4gcG9ydDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3J0IGlzIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBwb3J0IGlzIGF2YWlsYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1BvcnRBdmFpbGFibGUocG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIENoZWNrIGJvdGggc3RhY2tzIHRvIGNhdGNoIHByb2Nlc3NlcyBib3VuZCBvbmx5IG9uIElQdjYgb3IgSVB2NC5cbiAgZm9yIChjb25zdCBob3N0IG9mIFsnMTI3LjAuMC4xJywgJzo6J10pIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBwcm9iZVBvcnQoaG9zdCwgcG9ydCk7XG4gICAgaWYgKCFhdmFpbGFibGUpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvYmVQb3J0KGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuXG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFGTk9TVVBQT1JUJykge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsIGhvc3QpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IGV4ZWNGaWxlU3luYywgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCwgcHJpbnRTdGFydCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuaW1wb3J0IHsgaXNQb3J0QXZhaWxhYmxlIH0gZnJvbSAnLi9wb3J0LmpzJztcblxuY29uc3Qga2lsbGVkID0gbmV3IFNldDxudW1iZXIgfCBzdHJpbmc+KCk7XG5jb25zdCBzdGFsZVByb2Nlc3NQb2xsSW50ZXJ2YWxNcyA9IDEwMDtcbmNvbnN0IHN0YWxlUHJvY2Vzc01heFBvbGxzID0gMTA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQpO1xuICBpZiAoIWF2YWlsYWJsZSkge1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfVxuXG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHBvcnQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHBvcnQpO1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0LCBwcm9qZWN0KTtcbiAga2lsbExpc3RlbmluZ1Byb2Nlc3Nlc0J5UG9ydChwb3J0KTtcbn1cblxuZnVuY3Rpb24ga2lsbExpc3RlbmluZ1Byb2Nlc3Nlc0J5UG9ydChwb3J0OiBudW1iZXIpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBwaWQgb2YgbGlzdExpc3RlbmluZ1Byb2Nlc3NJZHMocG9ydCkpIHtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgJ1NJR0tJTEwnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbGlzdExpc3RlbmluZ1Byb2Nlc3NJZHMocG9ydDogbnVtYmVyKTogbnVtYmVyW10ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGV4ZWNGaWxlU3luYygnbHNvZicsIFsnLXRpJywgYHRjcDoke3BvcnR9YCwgJy1zVENQOkxJU1RFTiddLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICAgIHJldHVybiBzdGRvdXRcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAubWFwKChwaWQpID0+IE51bWJlcihwaWQudHJpbSgpKSlcbiAgICAgIC5maWx0ZXIoKHBpZCkgPT4gTnVtYmVyLmlzSW50ZWdlcihwaWQpICYmIHBpZCA+IDAgJiYgcGlkICE9PSBwcm9jZXNzLnBpZCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlU3RhbGVQcm9jZXNzKHBpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhbGVQcm9jZXNzTWF4UG9sbHM7IGkrKykge1xuICAgIGF3YWl0IHNldFRpbWVvdXQoc3RhbGVQcm9jZXNzUG9sbEludGVydmFsTXMpO1xuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFU1JDSCcpIHJldHVybjtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwaWQsICdTSUdLSUxMJyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgcHVibGlzaD0ke3BvcnR9YF0sIHByb2plY3QpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJDb250YWluZXJzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGFpbmVySWRzID0gYXdhaXQgbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzLCBwcm9qZWN0KTtcbiAgICBpZiAoY29udGFpbmVySWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydybScsICctZicsIC4uLmNvbnRhaW5lcklkc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3BzJywgJy1xJywgLi4uZmlsdGVyQXJnc10sIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IHByb2plY3QuZW52LFxuICB9KTtcbiAgcmV0dXJuIHN0ZG91dFxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoaWQpID0+IGlkLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzLCByZW1vdmVTdGFsZVByb2Nlc3MgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2RlbGF5LW1zJzoge1xuICAgIGRlZmF1bHQ6IDUwMDAsXG4gICAgZGVzY3JpYmU6ICdEZWxheSBiZWZvcmUgc3RhcnRpbmcgdGhlIG1haW50ZW5hbmNlIHBhZ2Ugc2VydmVyLicsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xudHlwZSBNYWludGVuYW5jZUFyZ3YgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPiAmIHtcbiAgYWN0aW9uOiAnc3RhcnQnIHwgJ3N0b3AnO1xufTtcbmNvbnN0IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHMgPSA1O1xuY29uc3QgbWFpbnRlbmFuY2VMaXN0ZW5SZXRyeURlbGF5TXMgPSAxMDA7XG5jb25zdCBtYXhUaW1lb3V0RGVsYXlNcyA9IDJfMTQ3XzQ4M182NDc7XG5jb25zdCBtYWludGVuYW5jZVBpZERpcmVjdG9yeU5hbWUgPSAnLndiJztcbmNvbnN0IG1haW50ZW5hbmNlSHRtbCA9IGA8IWRvY3R5cGUgaHRtbD5cbjxodG1sIGxhbmc9XCJqYVwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIj5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTFcIj5cbiAgICA8dGl0bGU+44Oh44Oz44OG44OK44Oz44K55LitPC90aXRsZT5cbiAgICA8c3R5bGU+XG4gICAgICBib2R5IHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgICAgY29sb3I6ICMxMTE4Mjc7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiU2Vnb2UgVUlcIiwgc2Fucy1zZXJpZjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgbWluLWhlaWdodDogMTAwdmg7XG4gICAgICB9XG5cbiAgICAgIG1haW4ge1xuICAgICAgICBwYWRkaW5nOiAyNHB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIGgxIHtcbiAgICAgICAgZm9udC1zaXplOiAyOHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS40O1xuICAgICAgICBtYXJnaW46IDAgMCAxNnB4O1xuICAgICAgfVxuXG4gICAgICBwIHtcbiAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS44O1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8bWFpbj5cbiAgICAgIDxoMT7nj77lnKjjg6Hjg7Pjg4bjg4rjg7PjgrnkuK3jgafjgZk8L2gxPlxuICAgICAgPHA+55qG5qeY44Gr44Gv44GU5LiN5L6/44KS44GK44GL44GR44GX44G+44GZ44GM44CB44Oh44Oz44OG44OK44Oz44K557WC5LqG44G+44Gn44GX44Gw44KJ44GP44GK5b6F44Gh44GP44Gg44GV44GE44CCPC9wPlxuICAgIDwvbWFpbj5cbiAgPC9ib2R5PlxuPC9odG1sPmA7XG5cbmV4cG9ydCBjb25zdCBtYWludGVuYW5jZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTWFpbnRlbmFuY2VBcmd2PiA9IHtcbiAgY29tbWFuZDogJ21haW50ZW5hbmNlIDxhY3Rpb24+JyxcbiAgZGVzY3JpYmU6ICdTdGFydCBvciBzdG9wIGEgbGlnaHR3ZWlnaHQgbWFpbnRlbmFuY2UgcGFnZSBzZXJ2ZXIuIEV4YW1wbGU6IHdiIG1haW50ZW5hbmNlIHN0YXJ0JyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzXG4gICAgICAucG9zaXRpb25hbCgnYWN0aW9uJywge1xuICAgICAgICBjaG9pY2VzOiBbJ3N0YXJ0JywgJ3N0b3AnXSBhcyBjb25zdCxcbiAgICAgICAgZGVzY3JpYmU6ICdNYWludGVuYW5jZSBzZXJ2ZXIgYWN0aW9uJyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbnMoYnVpbGRlcikgYXMgdW5rbm93biBhcyBBcmd2PE1haW50ZW5hbmNlQXJndj4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uID0gYXJndi5hY3Rpb247XG4gICAgaWYgKHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFNraXAgbWFpbnRlbmFuY2UgJHthY3Rpb259IGJlY2F1c2UgV0JfRU5WIGlzIHRlc3QuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IHBhcnNlUG9ydChwcm9qZWN0LmVudi5QT1JUKTtcbiAgICBpZiAoYWN0aW9uID09PSAnc3RhcnQnKSB7XG4gICAgICBhd2FpdCBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQsIGFyZ3YuZGVsYXlNcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhY3Rpb24gPT09ICdzdG9wJykge1xuICAgICAgYXdhaXQgc3RvcE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtYWludGVuYW5jZSBhY3Rpb246ICR7YWN0aW9ufWApO1xuICB9LFxufTtcblxuZnVuY3Rpb24gcGFyc2VQb3J0KHBvcnRFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGFzc2VydC5vayhOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpICYmIHBvcnQgPiAwLCBgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCk7XG4gIHJldHVybiBwb3J0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlciwgZGVsYXlNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGFzc2VydC5vayhcbiAgICBOdW1iZXIuaXNGaW5pdGUoZGVsYXlNcykgJiYgZGVsYXlNcyA+PSAwICYmIGRlbGF5TXMgPD0gbWF4VGltZW91dERlbGF5TXMsXG4gICAgYGRlbGF5LW1zIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAke21heFRpbWVvdXREZWxheU1zfTogJHtkZWxheU1zfWBcbiAgKTtcblxuICBjb25zdCBwaWRGaWxlUGF0aCA9IGF3YWl0IHdyaXRlTWFpbnRlbmFuY2VQaWRGaWxlKHByb2plY3QsIHBvcnQpO1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IGNsZWFudXAgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoLCBwcm9jZXNzLnBpZCk7XG4gIH07XG4gIGNvbnN0IGhhbmRsZVNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfTtcbiAgY29uc3QgcmVtb3ZlU2lnbmFsSGFuZGxlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR0lOVCcsIGhhbmRsZVNpZ25hbCk7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR1RFUk0nLCBoYW5kbGVTaWduYWwpO1xuICAgIHByb2Nlc3Mub2ZmKCdTSUdRVUlUJywgaGFuZGxlU2lnbmFsKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIGhhbmRsZVNpZ25hbCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIGhhbmRsZVNpZ25hbCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHUVVJVCcsIGhhbmRsZVNpZ25hbCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBzZXRUaW1lb3V0KGRlbGF5TXMsIHVuZGVmaW5lZCwgeyBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwgfSk7XG4gICAgcmVtb3ZlU2lnbmFsSGFuZGxlcnMoKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBjcmVhdGVBbmRMaXN0ZW5NYWludGVuYW5jZVNlcnZlcihwb3J0KTtcbiAgICBpZiAoIXNlcnZlcikgcmV0dXJuO1xuXG4gICAgY29uc29sZS5pbmZvKGBTdGFydGVkIG1haW50ZW5hbmNlIHNlcnZlciBvbiBwb3J0ICR7cG9ydH0uYCk7XG4gICAgYXdhaXQgd2FpdEZvclNodXRkb3duKHNlcnZlcik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICByZW1vdmVTaWduYWxIYW5kbGVycygpO1xuICAgIGF3YWl0IGNsZWFudXAoKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBbmRMaXN0ZW5NYWludGVuYW5jZVNlcnZlcihwb3J0OiBudW1iZXIpOiBQcm9taXNlPGh0dHAuU2VydmVyIHwgdW5kZWZpbmVkPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZU1haW50ZW5hbmNlU2VydmVyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpc3Rlbk1haW50ZW5hbmNlU2VydmVyKHNlcnZlciwgcG9ydCwgaGFuZGxlUnVudGltZU1haW50ZW5hbmNlU2VydmVyRXJyb3IpO1xuICAgICAgcmV0dXJuIHNlcnZlcjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgY2xvc2VNYWludGVuYW5jZVNlcnZlcihzZXJ2ZXIpO1xuICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uO1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScgJiYgYXR0ZW1wdCA8IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dChtYWludGVuYW5jZUxpc3RlblJldHJ5RGVsYXlNcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBTa2lwIG1haW50ZW5hbmNlIHNlcnZlciBiZWNhdXNlIHBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZS5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGhhbmRsZU1haW50ZW5hbmNlU3RhcnR1cEVycm9yKHBvcnQsIGVycik7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdVbnJlYWNoYWJsZSBtYWludGVuYW5jZSBzZXJ2ZXIgc3RhcnR1cCBzdGF0ZS4nKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlTWFpbnRlbmFuY2VTdGFydHVwRXJyb3IocG9ydDogbnVtYmVyLCBlcnJvcjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKTogbmV2ZXIge1xuICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZS5gKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE1haW50ZW5hbmNlIHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApKTtcbiAgfVxuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJ1bnRpbWVNYWludGVuYW5jZVNlcnZlckVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgTWFpbnRlbmFuY2Ugc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCkpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0b3BNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga2lsbE1haW50ZW5hbmNlUHJvY2Vzcyhwcm9qZWN0LCBwb3J0KTtcbiAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICBjb25zb2xlLmluZm8oYFN0b3BwZWQgbWFpbnRlbmFuY2Ugc2VydmVyIG9uIHBvcnQgJHtwb3J0fS5gKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFpbnRlbmFuY2VTZXJ2ZXIoKTogaHR0cC5TZXJ2ZXIge1xuICByZXR1cm4gaHR0cC5jcmVhdGVTZXJ2ZXIoKF9yZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDMsIHtcbiAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLXN0b3JlJyxcbiAgICAgICdjb250ZW50LXR5cGUnOiAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JyxcbiAgICB9KTtcbiAgICByZXNwb25zZS5lbmQobWFpbnRlbmFuY2VIdG1sKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3Rlbk1haW50ZW5hbmNlU2VydmVyKFxuICBzZXJ2ZXI6IGh0dHAuU2VydmVyLFxuICBwb3J0OiBudW1iZXIsXG4gIG9uUnVudGltZUVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG9uU3RhcnR1cEVycm9yID0gKGVycm9yOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgICAgc2VydmVyLm9mZignbGlzdGVuaW5nJywgb25MaXN0ZW5pbmcpO1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uTGlzdGVuaW5nID0gKCk6IHZvaWQgPT4ge1xuICAgICAgc2VydmVyLm9mZignZXJyb3InLCBvblN0YXJ0dXBFcnJvcik7XG4gICAgICBzZXJ2ZXIub24oJ2Vycm9yJywgb25SdW50aW1lRXJyb3IpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgb25TdGFydHVwRXJyb3IpO1xuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCBvbkxpc3RlbmluZyk7XG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAnMC4wLjAuMCcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvclNodXRkb3duKHNlcnZlcjogaHR0cC5TZXJ2ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzaHV0ZG93biA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdJTlQnLCBzaHV0ZG93bik7XG4gICAgICBwcm9jZXNzLm9mZignU0lHVEVSTScsIHNodXRkb3duKTtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdRVUlUJywgc2h1dGRvd24pO1xuICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNsb3NlTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIGNsb3NlIG1haW50ZW5hbmNlIHNlcnZlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9O1xuICAgIHByb2Nlc3Mub25jZSgnU0lHSU5UJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uY2UoJ1NJR1FVSVQnLCBzaHV0ZG93bik7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbG9zZU1haW50ZW5hbmNlU2VydmVyKHNlcnZlcjogaHR0cC5TZXJ2ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNlcnZlci5jbG9zZSgoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VSUl9TRVJWRVJfTk9UX1JVTk5JTkcnKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgc2VydmVyLmNsb3NlQWxsQ29ubmVjdGlvbnMoKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTWFpbnRlbmFuY2VQaWRGaWxlKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHBpZEZpbGVQYXRoID0gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LCBwb3J0KTtcbiAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHBpZEZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShwaWRGaWxlUGF0aCwgYCR7cHJvY2Vzcy5waWR9XFxuYCwgJ3V0ZjgnKTtcbiAgcmV0dXJuIHBpZEZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsTWFpbnRlbmFuY2VQcm9jZXNzKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwaWRGaWxlUGF0aCA9IG1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdCwgcG9ydCk7XG4gIGNvbnN0IHBpZCA9IGF3YWl0IHJlYWRNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgpO1xuICBpZiAocGlkICE9PSB1bmRlZmluZWQgJiYgcGlkICE9PSBwcm9jZXNzLnBpZCkge1xuICAgIHRyeSB7XG4gICAgICB0cmVlS2lsbChwaWQsICdTSUdURVJNJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGF3YWl0IHJlbW92ZVN0YWxlUHJvY2VzcyhwaWQpO1xuICB9XG4gIGF3YWl0IHJlbW92ZU1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCwgcGlkKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoOiBzdHJpbmcsIGV4cGVjdGVkUGlkPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChleHBlY3RlZFBpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcGlkID0gYXdhaXQgcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCk7XG4gICAgaWYgKHBpZCAhPT0gZXhwZWN0ZWRQaWQpIHJldHVybjtcbiAgfVxuICBhd2FpdCBmcy5ybShwaWRGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaWRUZXh0ID0gYXdhaXQgZnMucmVhZEZpbGUocGlkRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgcGlkID0gTnVtYmVyKHBpZFRleHQudHJpbSgpKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwaWQpICYmIHBpZCA+IDAgPyBwaWQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0TWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LnJvb3REaXJQYXRoLCBwb3J0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1haW50ZW5hbmNlUGlkRmlsZVBhdGgocm9vdERpclBhdGg6IHN0cmluZywgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihyb290RGlyUGF0aCwgbWFpbnRlbmFuY2VQaWREaXJlY3RvcnlOYW1lLCBgbWFpbnRlbmFuY2UtJHtwb3J0fS5waWRgKTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbi8qKlxuICogTWF0ZXJpYWxpemF0aW9uIG9mIGBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qYCByZWdpc3RyeSAoVmVyZGFjY2lvKSBkZXBlbmRlbmNpZXMgZm9yIERvY2tlciBidWlsZHM6XG4gKiB0aGUgcGFja2FnZXMgYXJlIGRvd25sb2FkZWQgb24gdGhlIGhvc3QgKGF1dGggdmlhIH4vLm5wbXJjIGxvY2FsbHksIG9yIGEgdGVtcG9yYXJ5IC5ucG1yYyBwbHVzXG4gKiBWRVJEQUNDSU9fVE9LRU4gb24gQ0kpIGFuZCBleHRyYWN0ZWQgbmV4dCB0byB0aGUgcmVwb3NpdG9yeSBzbyBpbWFnZSBidWlsZHMgbmVlZCBubyByZWdpc3RyeSBjcmVkZW50aWFsc1xuICogKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk2NCkuXG4gKi9cbmV4cG9ydCBjb25zdCBQUklWQVRFX1JFR0lTVFJZX1NDT1BFID0gJ0B3aWxsYm9vc3Rlci1wcml2YXRlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhY2thZ2VOYW1lLnJlcGxhY2UoL15Ad2lsbGJvb3N0ZXIoPzotcHJpdmF0ZSk/XFwvLywgJycpO1xufVxuXG4vLyBgZ2l0OmAvYGdpdCtgL2BnaXRAYCAobm90IHRoZSBiYXJlIHdvcmQgYGdpdGApOiBucG0gYWxsb3dzIGFyYml0cmFyeSBkaXN0LXRhZ3MsIHNvIGEgdGFnIG5hbWVkXG4vLyBgZ2l0YCBvciBgZ2l0LW5leHRgIG11c3Qgc3RpbGwgYmUgdHJlYXRlZCBhcyBhIHJlZ2lzdHJ5IHNwZWNpZmllci5cbmNvbnN0IG5vblJlZ2lzdHJ5U3BlY2lmaWVyUHJlZml4ZXMgPSBbXG4gICdnaXQ6JyxcbiAgJ2dpdCsnLFxuICAnZ2l0QCcsXG4gICdmaWxlOicsXG4gICdsaW5rOicsXG4gICd3b3Jrc3BhY2U6JyxcbiAgJ2h0dHA6JyxcbiAgJ2h0dHBzOicsXG4gICdwb3J0YWw6JyxcbiAgJ3BhdGNoOicsXG5dO1xuXG4vLyBUaGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3Igd2hpY2ggZ2l0IHNwZWNpZmllcnMgdGhlIHByaXZhdGUtcGFja2FnZSB0b29saW5nIHN1cHBvcnRzOlxuLy8gYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIG1hdGVyaWFsaXplcyBleGFjdGx5IHRoZXNlLCBhbmQgYHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGRgIG11c3Rcbi8vIHJld3JpdGUgZXhhY3RseSB0aGVzZSAocmV3cml0aW5nIG90aGVyIG9yZ3MnIFNTSCBVUkxzIHdvdWxkIHBvaW50IGF0IG5ldmVyLW1hdGVyaWFsaXplZCBwYXRocykuXG5jb25zdCBwcml2YXRlR2l0RGVwZW5kZW5jeVBhdHRlcm4gPSAvXmdpdEBnaXRodWJcXC5jb206KD86V2lsbEJvb3N0ZXJ8V2lsbEJvb3N0ZXJMYWIpXFwvW14vI10rKD86XFwuZ2l0KT8oPzojLiopPyQvO1xuXG4vLyBSZXR1cm5zIGJvb2xlYW4gKG5vdCBhIGB2YWx1ZSBpcyBzdHJpbmdgIHByZWRpY2F0ZSk6IGEgcHJlZGljYXRlIHdvdWxkIG5hcnJvdyB0aGUgbmVnYXRpdmVcbi8vIGJyYW5jaCB0byBgdW5kZWZpbmVkYCBhbmQgYnJlYWsgYGVsc2UgaWZgIGNoYWlucyBvdmVyIGBzdHJpbmcgfCB1bmRlZmluZWRgIGRlcGVuZGVuY3kgdmFsdWVzLlxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgcHJpdmF0ZUdpdERlcGVuZGVuY3lQYXR0ZXJuLnRlc3QodmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIG5hbWUuc3RhcnRzV2l0aChgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfS9gKSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAhbm9uUmVnaXN0cnlTcGVjaWZpZXJQcmVmaXhlcy5zb21lKChwcmVmaXgpID0+IHZhbHVlLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcml2YXRlUmVnaXN0cnlBdXRoIHtcbiAgcmVnaXN0cnlVcmw6IHN0cmluZztcbiAgYXV0aFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgcmVnaXN0cnkgVVJMIGFuZCBhdXRoIHRva2VuIGZvciB0aGUgcHJpdmF0ZSBzY29wZSBmcm9tIH4vLm5wbXJjIGxvY2FsbHkuIENJIG1heSBhbHNvXG4gKiBzdXBwbHkgYSB0ZW1wb3JhcnkgcHJvamVjdCAubnBtcmM7IFZFUkRBQ0NJT19UT0tFTiBzZXJ2ZXMgYXMgaXRzIGZhbGxiYWNrIHRva2VuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVByaXZhdGVSZWdpc3RyeUF1dGgocm9vdERpclBhdGg6IHN0cmluZyk6IFByaXZhdGVSZWdpc3RyeUF1dGggfCB1bmRlZmluZWQge1xuICBjb25zdCBlbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IG5wbXJjUGF0aHMgPSBbcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5ucG1yYycpXTtcbiAgaWYgKHByb2Nlc3MuZW52LkNJKSBucG1yY1BhdGhzLnB1c2gocGF0aC5qb2luKHJvb3REaXJQYXRoLCAnLm5wbXJjJykpO1xuICBmb3IgKGNvbnN0IG5wbXJjUGF0aCBvZiBucG1yY1BhdGhzKSB7XG4gICAgdHJ5IHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZW50cmllcywgcGFyc2VOcG1yYyhmcy5yZWFkRmlsZVN5bmMobnBtcmNQYXRoLCAndXRmOCcpKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG5wbXJjIGZpbGVzIGFyZSBmaW5lOyB0aGUgb3RoZXIgZmlsZSBvciBWRVJEQUNDSU9fVE9LRU4gbWF5IHN0aWxsIHByb3ZpZGUgYXV0aC5cbiAgICB9XG4gIH1cblxuICBjb25zdCByZWdpc3RyeVVybCA9IGVudHJpZXNbYCR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX06cmVnaXN0cnlgXT8ucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gIGlmICghcmVnaXN0cnlVcmwpIHJldHVybjtcblxuICAvLyBucG0tc3R5bGUgVVJJIG1hdGNoaW5nOiBub3JtYWxpemUgYm90aCBzaWRlcyB0byBhIHRyYWlsaW5nIHNsYXNoIHNvIGEgdG9rZW4gZm9yXG4gIC8vIGAvL3ZlcmRhY2Npby5leGFtcGxlLmNvbS9gIGNhbiBuZXZlciBtYXRjaCBgLy92ZXJkYWNjaW8uZXhhbXBsZS5jb20tb3RoZXIub3JnL2AsIGFuZCBwaWNrIHRoZVxuICAvLyBNT1NUIFNQRUNJRklDIChsb25nZXN0KSBtYXRjaGluZyBwcmVmaXggc28gYC8vaG9zdC9wcml2YXRlL2AgYmVhdHMgYC8vaG9zdC9gLlxuICBjb25zdCBub3JtYWxpemVkUmVnaXN0cnlVcmwgPSBgJHtyZWdpc3RyeVVybC5yZXBsYWNlKC9eaHR0cHM/Oi8sICcnKS5yZXBsYWNlKC9cXC8rJC8sICcnKX0vYDtcbiAgbGV0IG1hdGNoZWRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgbWF0Y2hlZFByZWZpeExlbmd0aCA9IC0xO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzKSkge1xuICAgIC8vIFNraXAgZW1wdHkgdG9rZW5zIChhbiB1bnNldCBgJHtWQVJ9YCBleHBhbmRzIHRvICcnKTogYW4gZW1wdHkgbWF0Y2ggbXVzdCBub3QgZGVmZWF0IHRoZVxuICAgIC8vIFZFUkRBQ0NJT19UT0tFTiBmYWxsYmFjayBiZWxvdy5cbiAgICBpZiAoIWtleS5lbmRzV2l0aCgnOl9hdXRoVG9rZW4nKSB8fCAhdmFsdWUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHByZWZpeCA9IGAke2tleS5zbGljZSgwLCAtJzpfYXV0aFRva2VuJy5sZW5ndGgpLnJlcGxhY2UoL1xcLyskLywgJycpfS9gO1xuICAgIGlmIChub3JtYWxpemVkUmVnaXN0cnlVcmwuc3RhcnRzV2l0aChwcmVmaXgpICYmIHByZWZpeC5sZW5ndGggPiBtYXRjaGVkUHJlZml4TGVuZ3RoKSB7XG4gICAgICBtYXRjaGVkUHJlZml4TGVuZ3RoID0gcHJlZml4Lmxlbmd0aDtcbiAgICAgIG1hdGNoZWRUb2tlbiA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICAvLyBObyBQcm9qZWN0IGluc3RhbmNlIGV4aXN0cyBhdCB0aGlzIGxheWVyLCBzbyBwcm9jZXNzLmVudiBpcyB0aGUgb25seSBzb3VyY2UgZm9yIHRoZVxuICAvLyBDSS1pbmplY3RlZCBmYWxsYmFjayB0b2tlbi5cbiAgY29uc3QgYXV0aFRva2VuID0gbWF0Y2hlZFRva2VuID8/IHByb2Nlc3MuZW52LlZFUkRBQ0NJT19UT0tFTjtcbiAgcmV0dXJuIHsgcmVnaXN0cnlVcmwsIGF1dGhUb2tlbiB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VOcG1yYyhjb250ZW50OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgZW50cmllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IHJhd0xpbmUgb2YgY29udGVudC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBsaW5lID0gcmF3TGluZS50cmltKCk7XG4gICAgaWYgKCFsaW5lIHx8IGxpbmUuc3RhcnRzV2l0aCgnIycpIHx8IGxpbmUuc3RhcnRzV2l0aCgnOycpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gbGluZS5pbmRleE9mKCc9Jyk7XG4gICAgaWYgKHNlcGFyYXRvckluZGV4IDw9IDApIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qga2V5ID0gbGluZS5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCkudHJpbSgpO1xuICAgIGNvbnN0IHZhbHVlID0gbGluZVxuICAgICAgLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSlcbiAgICAgIC50cmltKClcbiAgICAgIC5yZXBsYWNlQWxsKC9cXCRcXHsoW159XSspXFx9L2csIChfLCB2YXJpYWJsZU5hbWU6IHN0cmluZykgPT4gcHJvY2Vzcy5lbnZbdmFyaWFibGVOYW1lXSA/PyAnJyk7XG4gICAgZW50cmllc1trZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qKlxuICogRG93bmxvYWQgYW5kIGV4dHJhY3Qgb25lIHJlZ2lzdHJ5IHBhY2thZ2UgaW50byBgdGFyZ2V0RGlyUGF0aGAuIFRoZSBzcGVjaWZpZXIgbWF5IGJlIGFuIGV4YWN0XG4gKiBzZW12ZXIgdmVyc2lvbiAodGhlIG9yZydzIGNvbW1vbiBjYXNlIHZpYSBidW5maWcgYGV4YWN0ID0gdHJ1ZWApLCBhbnkgc2VtdmVyIHJhbmdlIChyZXNvbHZlZFxuICogbWF4LXNhdGlzZnlpbmcgYWdhaW5zdCB0aGUgcmVnaXN0cnkncyBwdWJsaXNoZWQgdmVyc2lvbnMsIG1hdGNoaW5nIGBucG0gaW5zdGFsbGApLCBvciBhXG4gKiBkaXN0LXRhZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZShcbiAgYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgdmVyc2lvblNwZWNpZmllcjogc3RyaW5nLFxuICB0YXJnZXREaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgcmVzb2x2ZVZlcnNpb24oYXV0aCwgcGFja2FnZU5hbWUsIHZlcnNpb25TcGVjaWZpZXIpO1xuICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGZldGNoUmVnaXN0cnlKc29uPHsgZGlzdD86IHsgdGFyYmFsbD86IHN0cmluZyB9IH0+KFxuICAgIGF1dGgsXG4gICAgYCR7YXV0aC5yZWdpc3RyeVVybH0vJHtlbmNvZGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSl9LyR7dmVyc2lvbn1gXG4gICk7XG4gIGNvbnN0IHRhcmJhbGxVcmwgPSBtZXRhZGF0YS5kaXN0Py50YXJiYWxsO1xuICBpZiAoIXRhcmJhbGxVcmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRhcmJhbGwgVVJMIGZvciAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb259IGluICR7YXV0aC5yZWdpc3RyeVVybH0uYCk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoRnJvbVJlZ2lzdHJ5KGF1dGgsIHRhcmJhbGxVcmwpO1xuICBjb25zdCB0YXJiYWxsUGF0aCA9IHBhdGguam9pbihcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diLXByaXZhdGUtcGFja2FnZS0nKSksXG4gICAgJ3BhY2thZ2UudGd6J1xuICApO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh0YXJiYWxsUGF0aCwgQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSkpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0YXJnZXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAvLyBucG0gdGFyYmFsbHMgcGxhY2UgdGhlIGNvbnRlbnQgdW5kZXIgYSB0b3AtbGV2ZWwgYHBhY2thZ2UvYCBkaXJlY3RvcnkuXG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ3RhcicsIFsnLXh6ZicsIHRhcmJhbGxQYXRoLCAnLUMnLCB0YXJnZXREaXJQYXRoLCAnLS1zdHJpcC1jb21wb25lbnRzPTEnXSwge1xuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb259ICgke3RhcmJhbGxVcmx9KS5gKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5kaXJuYW1lKHRhcmJhbGxQYXRoKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVWZXJzaW9uKFxuICBhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICB2ZXJzaW9uU3BlY2lmaWVyOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIFByZXJlbGVhc2UgYW5kIGArYnVpbGRgIG1ldGFkYXRhIGFyZSBib3RoIHBhcnQgb2YgdmFsaWQgZXhhY3QgU2VtVmVyIHZlcnNpb25zLCBzbyBhbiBleGFjdFxuICAvLyBzcGVjaWZpZXIgcmVzb2x2ZXMgdG8gaXRzZWxmIHdpdGhvdXQgYSBwYWNrdW1lbnQgZmV0Y2guXG4gIGlmIChpc0V4YWN0VmVyc2lvbih2ZXJzaW9uU3BlY2lmaWVyKSkgcmV0dXJuIHZlcnNpb25TcGVjaWZpZXI7XG5cbiAgY29uc3QgcGFja3VtZW50ID0gYXdhaXQgZmV0Y2hSZWdpc3RyeUpzb248UGFja3VtZW50PihhdXRoLCBgJHthdXRoLnJlZ2lzdHJ5VXJsfS8ke2VuY29kZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKX1gKTtcbiAgY29uc3QgdmVyc2lvbiA9IHNlbGVjdFZlcnNpb25Gcm9tUGFja3VtZW50KHZlcnNpb25TcGVjaWZpZXIsIHBhY2t1bWVudCk7XG4gIGlmICghdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3QgcmVzb2x2ZSAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb25TcGVjaWZpZXJ9IGFnYWluc3QgJHthdXRoLnJlZ2lzdHJ5VXJsfTsgdXNlIGFuIGV4YWN0IHZlcnNpb24sIGEgc2VtdmVyIHJhbmdlLCBvciBhIGRpc3QtdGFnLmBcbiAgICApO1xuICB9XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5pbnRlcmZhY2UgUGFja3VtZW50IHtcbiAgJ2Rpc3QtdGFncyc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB2ZXJzaW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIG5wbSdzIHNwZWNpZmllciBjbGFzc2lmaWNhdGlvbjogYCpgIGFuZCBkaXN0LXRhZyBuYW1lcyByZXNvbHZlIHZpYSBkaXN0LXRhZ3MgKG5wbSByZXNvbHZlcyBgKmBcbiAqIHRvIHRoZSBgbGF0ZXN0YCB0YWcpLCB3aGlsZSBhbnkgb3RoZXIgdmFsaWQgc2VtdmVyIHJhbmdlIHJlc29sdmVzIHRvIHRoZSBoaWdoZXN0IHB1Ymxpc2hlZFxuICogdmVyc2lvbiBzYXRpc2Z5aW5nIGl0LCBtYXRjaGluZyBgbnBtIGluc3RhbGxgJ3MgbWF4LXNhdGlzZnlpbmcgc2VtYW50aWNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0VmVyc2lvbkZyb21QYWNrdW1lbnQodmVyc2lvblNwZWNpZmllcjogc3RyaW5nLCBwYWNrdW1lbnQ6IFBhY2t1bWVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh2ZXJzaW9uU3BlY2lmaWVyICE9PSAnKicgJiYgc2VtdmVyLnZhbGlkUmFuZ2UodmVyc2lvblNwZWNpZmllcikpIHtcbiAgICByZXR1cm4gc2VtdmVyLm1heFNhdGlzZnlpbmcoT2JqZWN0LmtleXMocGFja3VtZW50LnZlcnNpb25zID8/IHt9KSwgdmVyc2lvblNwZWNpZmllcikgPz8gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBwYWNrdW1lbnRbJ2Rpc3QtdGFncyddPy5bdmVyc2lvblNwZWNpZmllciA9PT0gJyonID8gJ2xhdGVzdCcgOiB2ZXJzaW9uU3BlY2lmaWVyXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZWdpc3RyeUpzb248VD4oYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCwgdXJsOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEZyb21SZWdpc3RyeShhdXRoLCB1cmwpO1xuICByZXR1cm4gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgVDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hGcm9tUmVnaXN0cnkoYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCwgdXJsOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIC8vIFRhcmJhbGwgVVJMcyBjb21lIGZyb20gcmVnaXN0cnktY29udHJvbGxlZCBtZXRhZGF0YTsgYXR0YWNoIHRoZSB0b2tlbiBvbmx5IHRvIHRoZSBjb25maWd1cmVkXG4gIC8vIHJlZ2lzdHJ5J3Mgb3duIG9yaWdpbiBzbyBhIG1hbGljaW91cyBvciBtaXNjb25maWd1cmVkIHJlZ2lzdHJ5IGNhbm5vdCByZWRpcmVjdCB0aGUgY3JlZGVudGlhbFxuICAvLyB0byBhIHRoaXJkLXBhcnR5IGhvc3QuXG4gIGNvbnN0IHNlbmRBdXRoVG9rZW4gPSAhIWF1dGguYXV0aFRva2VuICYmIGlzU2FtZU9yaWdpbih1cmwsIGF1dGgucmVnaXN0cnlVcmwpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIGhlYWRlcnM6IHNlbmRBdXRoVG9rZW4gPyB7IGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthdXRoLmF1dGhUb2tlbn1gIH0gOiB7fSxcbiAgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH06ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVPcmlnaW4odXJsOiBzdHJpbmcsIHJlZ2lzdHJ5VXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTCh1cmwpLm9yaWdpbiA9PT0gbmV3IFVSTChyZWdpc3RyeVVybCkub3JpZ2luO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5jb2RlUGFja2FnZU5hbWUocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYWNrYWdlTmFtZS5yZXBsYWNlKCcvJywgJyUyRicpO1xufVxuXG4vLyBUaGUgb2ZmaWNpYWwgU2VtVmVyIDIuMC4wIGdyYW1tYXIgKHNlbXZlci5vcmcpLCBhbmNob3JlZDogbnVtZXJpYy1sb29raW5nIGRpc3QtdGFncyBzdWNoIGFzXG4vLyBgMS4yLjNsYXRlc3RgLCBsZWFkaW5nLXplcm8gdmVyc2lvbnMgKGAwMS4yLjNgKSwgYW5kIHVuZGVyc2NvcmUgaWRlbnRpZmllcnMgYXJlIE5PVCB2ZXJzaW9ucyDigJRcbi8vIHJlc29sdmVWZXJzaW9uIHRyZWF0cyB0aGVtIGFzIHRhZ3MsIG1hdGNoaW5nIG5vZGUtc2VtdmVyJ3MgY2xhc3NpZmljYXRpb24uXG5jb25zdCBleGFjdFNlbXZlclBhdHRlcm4gPVxuICAvXig/OjB8WzEtOV1cXGQqKVxcLig/OjB8WzEtOV1cXGQqKVxcLig/OjB8WzEtOV1cXGQqKSg/Oi0oPzowfFsxLTldXFxkKnxcXGQqW2EtekEtWi1dWzAtOWEtekEtWi1dKikoPzpcXC4oPzowfFsxLTldXFxkKnxcXGQqW2EtekEtWi1dWzAtOWEtekEtWi1dKikpKik/KD86XFwrWzAtOWEtekEtWi1dKyg/OlxcLlswLTlhLXpBLVotXSspKik/JC87XG5cbi8qKiBXaGV0aGVyIHRoZSBzcGVjaWZpZXIgaXMgYW4gZXhhY3QgU2VtVmVyIHZlcnNpb24gKG5vdCBhIHJhbmdlLCB0YWcsIG9yIGdpdCBVUkwpLiAqL1xuZnVuY3Rpb24gaXNFeGFjdFZlcnNpb24oc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhc3BlY2lmaWVyICYmIGV4YWN0U2VtdmVyUGF0dGVybi50ZXN0KHNwZWNpZmllcik7XG59XG5cbi8qKlxuICogV2hldGhlciBFVkVSWSB2ZXJzaW9uIGBzcGVjaWZpZXJgIGNhbiByZXNvbHZlIHRvIGFsc28gc2F0aXNmaWVzIGByZXF1aXJlbWVudGAgKGV4YWN0IHZlcnNpb25zXG4gKiBjb3VudCBhcyBzaW5nbGUtdmVyc2lvbiByYW5nZXMpLiBDb25mbGljdCBjaGVja3MgdXNlIHRoaXMgYmVjYXVzZSB0aGUgYWN0dWFsbHkgcmVzb2x2ZWQgdmVyc2lvblxuICogaXMgdW5rbm93biBiZWZvcmUgdGhlIHJlZ2lzdHJ5IGlzIGNvbnN1bHRlZDogYSBzdWJzZXQgc3BlY2lmaWVyJ3MgbWF4LXNhdGlzZnlpbmcgcmVzb2x1dGlvbiBpc1xuICogZ3VhcmFudGVlZCB0byBzYXRpc2Z5IHRoZSB3aWRlciByZXF1aXJlbWVudC4gTm9uLXJhbmdlIHNwZWNpZmllcnMgKGRpc3QtdGFncywgZ2l0IFVSTHMpIGFyZSBub3RcbiAqIGNvbXBhcmFibGUgYW5kIHJldHVybiBmYWxzZSDigJQgY2FsbGVycyBhY2NlcHQgdGhvc2Ugb25seSBvbiBleGFjdCBzdHJpbmcgZXF1YWxpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGVjaWZpZXJTdWJzZXQoc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQsIHJlcXVpcmVtZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKHNwZWNpZmllciA9PT0gdW5kZWZpbmVkIHx8IHJlcXVpcmVtZW50ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgLy8gYCpgIHJlc29sdmVzIHRocm91Z2ggdGhlIGBsYXRlc3RgIGRpc3QtdGFnIChzZWxlY3RWZXJzaW9uRnJvbVBhY2t1bWVudCksIG5vdCBhcyBhIHJhbmdlLCBzb1xuICAvLyBpdCBpcyBub3Qgc3RhdGljYWxseSBjb21wYXJhYmxlIGluIGVpdGhlciBwb3NpdGlvbi5cbiAgaWYgKHNwZWNpZmllciA9PT0gJyonIHx8IHJlcXVpcmVtZW50ID09PSAnKicpIHJldHVybiBmYWxzZTtcbiAgLy8gQnVpbGQgbWV0YWRhdGEgZGlzdGluZ3Vpc2hlcyByZWdpc3RyeSBhcnRpZmFjdHMgKHJlc29sdmVWZXJzaW9uIGZldGNoZXMgYW4gZXhhY3Qgc3BlY2lmaWVyXG4gIC8vIHZlcmJhdGltKSBidXQgc2VtdmVyIGNvbXBhcmlzb25zIGlnbm9yZSBpdCwgc28gdHdvIGV4YWN0IHZlcnNpb25zIG11c3QgbWF0Y2ggYXMgc3RyaW5ncy5cbiAgaWYgKGlzRXhhY3RWZXJzaW9uKHNwZWNpZmllcikgJiYgaXNFeGFjdFZlcnNpb24ocmVxdWlyZW1lbnQpKSByZXR1cm4gc3BlY2lmaWVyID09PSByZXF1aXJlbWVudDtcbiAgaWYgKCFzZW12ZXIudmFsaWRSYW5nZShzcGVjaWZpZXIpIHx8ICFzZW12ZXIudmFsaWRSYW5nZShyZXF1aXJlbWVudCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHNlbXZlci5zdWJzZXQoc3BlY2lmaWVyLCByZXF1aXJlbWVudCk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgbWF0ZXJpYWxpemVkIGB2ZXJzaW9uYCBjYW4gYmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIHJlZ2lzdHJ5IGBzcGVjaWZpZXJgLlxuICogRGlzdC10YWdzIChpbnZhbGlkIHJhbmdlcykgYXJlIG5vdCBzdGF0aWNhbGx5IGNoZWNrYWJsZSBhbmQgcGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGVyaWFsaXplZFZlcnNpb25TYXRpc2ZpZXMoc3BlY2lmaWVyOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBCdWlsZCBtZXRhZGF0YSBkaXN0aW5ndWlzaGVzIHJlZ2lzdHJ5IGFydGlmYWN0cywgc28gYW4gZXhhY3Qgc3BlY2lmaWVyIGFkbWl0cyBvbmx5IHRoZVxuICAvLyBpZGVudGljYWwgdmVyc2lvbiBzdHJpbmcuXG4gIGlmIChpc0V4YWN0VmVyc2lvbihzcGVjaWZpZXIpKSByZXR1cm4gc3BlY2lmaWVyID09PSB2ZXJzaW9uO1xuICBpZiAoIXNlbXZlci52YWxpZFJhbmdlKHNwZWNpZmllcikpIHJldHVybiB0cnVlO1xuICByZXR1cm4gc2VtdmVyLnNhdGlzZmllcyh2ZXJzaW9uLCBzcGVjaWZpZXIpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGluc3RhbGxlZCBgdmVyc2lvbmAgaXMgc3RhdGljYWxseSBLTk9XTiB0byBzYXRpc2Z5IHRoZSByZWdpc3RyeSBgc3BlY2lmaWVyYC5cbiAqIERpc3QtdGFncyAoaW52YWxpZCByYW5nZXMpIGFyZSBub3Qgc3RhdGljYWxseSBjaGVja2FibGUgYW5kIHJldHVybiBmYWxzZSDigJQgdW5saWtlXG4gKiBtYXRlcmlhbGl6ZWRWZXJzaW9uU2F0aXNmaWVzLCBjYWxsZXJzIHVzZSB0aGlzIHRvIGRlY2lkZSB3aGV0aGVyIGFuIGluc3RhbGxlZCBjb3B5IGNhbiByZXBsYWNlXG4gKiBhIHJlZ2lzdHJ5IGRvd25sb2FkLCBzbyB1bmNlcnRhaW50eSBtdXN0IGZhbGwgYmFjayB0byBkb3dubG9hZGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxlZFZlcnNpb25TYXRpc2ZpZXMoc3BlY2lmaWVyOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBgKmAgcmVzb2x2ZXMgdGhyb3VnaCB0aGUgYGxhdGVzdGAgZGlzdC10YWcgKHNlbGVjdFZlcnNpb25Gcm9tUGFja3VtZW50KSwgc28gbGlrZSBhbnkgb3RoZXJcbiAgLy8gZGlzdC10YWcgaXQgaXMgbm90IHN0YXRpY2FsbHkgY2hlY2thYmxlIGFnYWluc3QgYW4gaW5zdGFsbGVkIHZlcnNpb24uXG4gIGlmIChzcGVjaWZpZXIgPT09ICcqJykgcmV0dXJuIGZhbHNlO1xuICAvLyByZXNvbHZlVmVyc2lvbiBmZXRjaGVzIGFuIGV4YWN0IHNwZWNpZmllciB2ZXJiYXRpbSAoYnVpbGQgbWV0YWRhdGEgaW5jbHVkZWQpLCBzbyBhbiBpbnN0YWxsZWRcbiAgLy8gY29weSBtYXkgcmVwbGFjZSB0aGUgZG93bmxvYWQgb25seSB3aGVuIHRoZSB2ZXJzaW9uIHN0cmluZ3MgbWF0Y2ggZXhhY3RseS5cbiAgaWYgKGlzRXhhY3RWZXJzaW9uKHNwZWNpZmllcikpIHJldHVybiBzcGVjaWZpZXIgPT09IHZlcnNpb247XG4gIHJldHVybiAhIXNlbXZlci52YWxpZFJhbmdlKHNwZWNpZmllcikgJiYgc2VtdmVyLnNhdGlzZmllcyh2ZXJzaW9uLCBzcGVjaWZpZXIpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMsIGZpbmRSb290QW5kU2VsZlByb2plY3RzLCB0eXBlIEZvdW5kUHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJpdmF0ZVJlZ2lzdHJ5QXV0aCB9IGZyb20gJy4uL3V0aWxzL3ByaXZhdGVSZWdpc3RyeS5qcyc7XG5pbXBvcnQge1xuICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UsXG4gIGluc3RhbGxlZFZlcnNpb25TYXRpc2ZpZXMsXG4gIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3ksXG4gIGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeSxcbiAgcmVzb2x2ZVByaXZhdGVSZWdpc3RyeUF1dGgsXG4gIHNwZWNpZmllclN1YnNldCxcbiAgdG9VbnNjb3BlZFBhY2thZ2VOYW1lLFxufSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuXG5pbnRlcmZhY2UgUHJpdmF0ZVBhY2thZ2Uge1xuICBuYW1lOiBzdHJpbmc7XG4gIGtpbmQ6ICdnaXQnIHwgJ3JlZ2lzdHJ5JztcbiAgLyoqXG4gICAqIFVuZGVmaW5lZCBmb3IgcmVnaXN0cnkgcGFja2FnZXMgdGhhdCBtdXN0IGJlIGRvd25sb2FkZWQ7IHNldCBmb3IgZ2l0IHBhY2thZ2VzIGFuZCBmb3JcbiAgICogcmVnaXN0cnkgcGFja2FnZXMgd2hvc2UgaW5zdGFsbGVkIGNvcHkgaW4gbm9kZV9tb2R1bGVzIGFscmVhZHkgc2F0aXNmaWVzIHRoZSBzcGVjaWZpZXJcbiAgICogKHNvIENJIHN0ZXBzIHdpdGhvdXQgcmVnaXN0cnkgY3JlZGVudGlhbHMgY2FuIHN0aWxsIG1hdGVyaWFsaXplIHRoZW0pLlxuICAgKi9cbiAgc291cmNlRGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0YXJnZXREaXJQYXRoOiBzdHJpbmc7XG4gIHZlcnNpb25TcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSBtYXRlcmlhbGl6ZWQgdmVyc2lvbiBvbmNlIGFuIGluc3RhbGxlZCBjb3B5IGlzIHNlbGVjdGVkIG9yIGEgZG93bmxvYWQgaXMgZXh0cmFjdGVkLiAqL1xuICByZXNvbHZlZFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgZGVwZW5kZW5jeUtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAnb3V0LWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RpcmVjdG9yeSB0byBjb3B5IHByaXZhdGUgcGFja2FnZXMgaW50bycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJ0B3aWxsYm9vc3RlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBQcml2YXRlUGFja2FnZXNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHsgZHJ5UnVuPzogYm9vbGVhbiB9LCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZXR1cC1wcml2YXRlLXBhY2thZ2VzJyxcbiAgZGVzY3JpYmU6XG4gICAgJ01hdGVyaWFsaXplIHByaXZhdGUgZGVwZW5kZW5jaWVzIGZvciBEb2NrZXIgYnVpbGRzOiBjb3B5IGdpdCBkZXBlbmRlbmNpZXMsIHJldXNlIGluc3RhbGxlZCBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qIHJlZ2lzdHJ5IHBhY2thZ2VzIHdob3NlIGV4YWN0LXZlcnNpb24gb3Igc2VtdmVyLXJhbmdlIHNwZWNpZmllciB0aGUgaW5zdGFsbGVkIGNvcHkgc2F0aXNmaWVzLCBhbmQgZG93bmxvYWQgdGhlIHJlc3QgKGF1dGggdmlhIC5ucG1yYyAvIH4vLm5wbXJjIGxvY2FsbHksIG9yIFZFUkRBQ0NJT19UT0tFTiBvbiBDSTsgZGlzdC10YWcgc3BlY2lmaWVycyBzdWNoIGFzIGBsYXRlc3RgIGFsd2F5cyBkb3dubG9hZCkuICcgK1xuICAgICdUaGUgRG9ja2VyZmlsZSBtdXN0IENPUFkgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyAoZS5nLiBgQ09QWSBAd2lsbGJvb3N0ZXIvIEB3aWxsYm9vc3Rlci9gIGFuZCBgQ09QWSBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8gQHdpbGxib29zdGVyLXByaXZhdGUvYCkgc28gdGhlIGluLWltYWdlIGluc3RhbGwgcmVzb2x2ZXMgdGhlIHJld3JpdHRlbiBmaWxlOiBwYXRocy4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCByb290QW5kU2VsZiA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXJvb3RBbmRTZWxmKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIFJlc29sdmUgdGhlIGRlc2NlbmRhbnQgc2V0IGZyb20gdGhlIHJlcG9zaXRvcnkgUk9PVCAobm90IHRoZSBjdXJyZW50IGRpcmVjdG9yeSkgc28gdGhlXG4gICAgLy8gY29tbWFuZCBzY2FucyB0aGUgcm9vdCBtYW5pZmVzdCBhbmQgZXZlcnkgd29ya3NwYWNlIG1hbmlmZXN0IHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgaXQgcnVuczpcbiAgICAvLyBmaW5kRGVzY2VuZGFudFByb2plY3RzIHJldHVybnMgb25seSB0aGUgY3VycmVudCBwcm9qZWN0IHdoZW4gaW52b2tlZCBmcm9tIGEgd29ya3NwYWNlLlxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcm9vdEFuZFNlbGYucm9vdC5kaXJQYXRoKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gU2NhbiB0aGUgcm9vdCBtYW5pZmVzdCBhbmQgZXZlcnkgd29ya3NwYWNlIG1hbmlmZXN0OiBhIHByaXZhdGUgZGVwZW5kZW5jeSBtYXkgYmUgZGVjbGFyZWQgaW5cbiAgICAvLyBhIHN1Yi1wYWNrYWdlIChlLmcuIHBhY2thZ2VzL3NlcnZlcikgcmF0aGVyIHRoYW4gdGhlIHJvb3QsIHlldCBpdCBzdGlsbCBtYXRlcmlhbGl6ZXMgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290IHNvIGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkYCByZXNvbHZlcyBpdCB1bmlmb3JtbHkuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1hdGVyaWFsaXplUHJpdmF0ZVBhY2thZ2VzKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgY29sbGVjdE1hbmlmZXN0cyhwcm9qZWN0cyksIHtcbiAgICAgICAgb3V0RGlyOiBhcmd2Lm91dERpcixcbiAgICAgICAgZHJ5UnVuOiBCb29sZWFuKGFyZ3YuZHJ5UnVuKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuXG5pbnRlcmZhY2UgTWF0ZXJpYWxpemVQcml2YXRlUGFja2FnZXNPcHRpb25zIHtcbiAgLyoqIERpcmVjdG9yeSAocmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdCkgdGhhdCBnaXQgZGVwZW5kZW5jaWVzIGFyZSBjb3BpZWQgaW50by4gKi9cbiAgb3V0RGlyPzogc3RyaW5nO1xuICBkcnlSdW4/OiBib29sZWFuO1xufVxuXG4vKiogVGhlIHJvb3QgbWFuaWZlc3QgZm9sbG93ZWQgYnkgZWFjaCBkaXN0aW5jdCB3b3Jrc3BhY2UgbWFuaWZlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdE1hbmlmZXN0cyhwcm9qZWN0czogRm91bmRQcm9qZWN0cyk6IFBhY2thZ2VKc29uW10ge1xuICBjb25zdCBtYW5pZmVzdHNCeURpclBhdGggPSBuZXcgTWFwPHN0cmluZywgUGFja2FnZUpzb24+KCk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBbcHJvamVjdHMucm9vdCwgLi4ucHJvamVjdHMuZGVzY2VuZGFudHNdKSB7XG4gICAgaWYgKCFtYW5pZmVzdHNCeURpclBhdGguaGFzKHByb2plY3QuZGlyUGF0aCkpIG1hbmlmZXN0c0J5RGlyUGF0aC5zZXQocHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnBhY2thZ2VKc29uKTtcbiAgfVxuICByZXR1cm4gWy4uLm1hbmlmZXN0c0J5RGlyUGF0aC52YWx1ZXMoKV07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlcyhcbiAgcm9vdFByb2plY3REaXJQYXRoOiBzdHJpbmcsXG4gIG1hbmlmZXN0UGFja2FnZUpzb25zOiBQYWNrYWdlSnNvbltdLFxuICBvcHRpb25zOiBNYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgb3V0RGlyID0gJ0B3aWxsYm9vc3RlcicsIGRyeVJ1biA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gIC8vIE91dHB1dCBwYXRocyBhcmUgcmVjdXJzaXZlbHkgREVMRVRFRCBiZWZvcmUgYmVpbmcgcmVjcmVhdGVkLCBzbyBub25lIG9mIHRoZW0gbWF5IGNvbnRhaW4gYVxuICAvLyBzeW1saW5rIGNvbXBvbmVudDogYSBzeW1saW5rIChlLmcuIGBlc2NhcGUgLT4gbm9kZV9tb2R1bGVzYCwgb3IgYEB3aWxsYm9vc3Rlci1wcml2YXRlYFxuICAvLyBpdHNlbGYgbGlua2luZyBlbHNld2hlcmUpIHdvdWxkIGVpdGhlciBzbXVnZ2xlIHRoZSBkZWxldGUgcGFzdCB0aGUgbGV4aWNhbCBvdmVybGFwIGd1YXJkc1xuICAvLyBvciBkZXN0cm95IHRoZSBzeW1saW5rJ3MgdGFyZ2V0LiBSZWplY3RpbmcgY2Fub25pY2FsL2xleGljYWwgbWlzbWF0Y2hlcyBrZWVwcyBldmVyeVxuICAvLyBkZXN0cnVjdGl2ZSBvcGVyYXRpb24gb24gdGhlIGludGVuZGVkIGxleGljYWwgbG9jYXRpb24uIFRoZXNlIGd1YXJkcyBUSFJPVyAobm90IHByb2Nlc3MuZXhpdClcbiAgLy8gc28gdGhlIGF1dG9tYXRpYyBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVgIGNhbGxlciBjYW4gY2F0Y2ggdGhlbSBhbmQgY29udGludWVcbiAgLy8gbm9uLWZhdGFsbHk7IHRoZSBleHBsaWNpdCBjb21tYW5kJ3MgaGFuZGxlciBjYXRjaGVzIGFuZCBleGl0cy5cbiAgY29uc3Qgcm9vdERpclBhdGggPSBjYW5vbmljYWxpemVQYXRoKHJvb3RQcm9qZWN0RGlyUGF0aCk7XG4gIGNvbnN0IHJlc29sdmVPdXRwdXREaXJQYXRoID0gKHJlbGF0aXZlT3JBYnNvbHV0ZVBhdGg6IHN0cmluZywgbGFiZWw6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgbGV4aWNhbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIHJlbGF0aXZlT3JBYnNvbHV0ZVBhdGgpO1xuICAgIGNvbnN0IGNhbm9uaWNhbFBhdGggPSBjYW5vbmljYWxpemVQYXRoKGxleGljYWxQYXRoKTtcbiAgICBpZiAoY2Fub25pY2FsUGF0aCAhPT0gbGV4aWNhbFBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtsYWJlbH0gbXVzdCBub3QgY29udGFpbiBzeW1saW5rcyAoJHtsZXhpY2FsUGF0aH0gcmVzb2x2ZXMgdG8gJHtjYW5vbmljYWxQYXRofSkuYCk7XG4gICAgfVxuICAgIHJldHVybiBsZXhpY2FsUGF0aDtcbiAgfTtcbiAgY29uc3Qgb3V0RGlyUGF0aCA9IHJlc29sdmVPdXRwdXREaXJQYXRoKG91dERpciwgJy0tb3V0LWRpcicpO1xuICBhc3NlcnRTdWJkaXJlY3Rvcnkocm9vdERpclBhdGgsIG91dERpclBhdGgpO1xuICAvLyBSZWdpc3RyeSBwYWNrYWdlcyBhbHdheXMgbWF0ZXJpYWxpemUgYXQgdGhlIHJlcG9zaXRvcnkgcm9vdDogYHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGRgXG4gIC8vIHJlc29sdmVzIHRoZW0gZnJvbSBgPHJvb3Q+L0B3aWxsYm9vc3Rlci1wcml2YXRlYCByZWdhcmRsZXNzIG9mIGAtLW91dC1kaXJgLlxuICBjb25zdCByZWdpc3RyeU91dERpclBhdGggPSByZXNvbHZlT3V0cHV0RGlyUGF0aChcbiAgICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICAgIGBUaGUgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfSBvdXRwdXQgZGlyZWN0b3J5YFxuICApO1xuICBpZiAocGF0aHNPdmVybGFwKG91dERpclBhdGgsIHJlZ2lzdHJ5T3V0RGlyUGF0aCkpIHtcbiAgICAvLyBlLmcuIGAtLW91dC1kaXIgQHdpbGxib29zdGVyLXByaXZhdGVgIG9yIGAtLW91dC1kaXIgQHdpbGxib29zdGVyLXByaXZhdGUvc3ViYDogdGhlXG4gICAgLy8gcmVnaXN0cnkgc3RlcCByZWN1cnNpdmVseSBkZWxldGVzIHJlZ2lzdHJ5T3V0RGlyUGF0aCwgd2hpY2ggd291bGQgZGVzdHJveSB0aGUgZ2l0XG4gICAgLy8gcGFja2FnZXMgY29waWVkIGludG8gYW4gZXF1YWwgb3IgTkVTVEVEIGRpcmVjdG9yeSBtb21lbnRzIGVhcmxpZXIuXG4gICAgdGhyb3cgbmV3IEVycm9yKGAtLW91dC1kaXIgbXVzdCBub3Qgb3ZlcmxhcCB0aGUgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfSByZWdpc3RyeSBvdXRwdXQgZGlyZWN0b3J5LmApO1xuICB9XG4gIGNvbnN0IHN0YWdpbmdSb290RGlyUGF0aCA9IHJlc29sdmVPdXRwdXREaXJQYXRoKHBhdGguam9pbignLnRtcCcsICd3Yi1wcml2YXRlLXN0YWdpbmcnKSwgJ1RoZSBzdGFnaW5nIGRpcmVjdG9yeScpO1xuICBjb25zdCBiYWNrdXBSb290RGlyUGF0aCA9IHJlc29sdmVPdXRwdXREaXJQYXRoKHBhdGguam9pbignLnRtcCcsICd3Yi1wcml2YXRlLWJhY2t1cCcpLCAnVGhlIGJhY2t1cCBkaXJlY3RvcnknKTtcbiAgaWYgKHBhdGhzT3ZlcmxhcChvdXREaXJQYXRoLCBjYW5vbmljYWxpemVQYXRoKHBhdGguam9pbihyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycpKSkpIHtcbiAgICAvLyBUaGUgcmVjdXJzaXZlIGRlbGV0ZSBvZiBvdXREaXJQYXRoIHdvdWxkIGRlc3Ryb3kgdGhlIGluc3RhbGxlZCBzb3VyY2VzIHRoZSBjb3BpZXMgcmVhZC5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJy0tb3V0LWRpciBtdXN0IG5vdCBvdmVybGFwIG5vZGVfbW9kdWxlcy4nKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtsYWJlbCwgdGVtcG9yYXJ5RGlyUGF0aF0gb2YgW1xuICAgIFsnc3RhZ2luZycsIHN0YWdpbmdSb290RGlyUGF0aF0sXG4gICAgWydiYWNrdXAnLCBiYWNrdXBSb290RGlyUGF0aF0sXG4gIF0gYXMgY29uc3QpIHtcbiAgICBpZiAocGF0aHNPdmVybGFwKG91dERpclBhdGgsIHRlbXBvcmFyeURpclBhdGgpIHx8IHBhdGhzT3ZlcmxhcChyZWdpc3RyeU91dERpclBhdGgsIHRlbXBvcmFyeURpclBhdGgpKSB7XG4gICAgICAvLyBCb3RoIGRpcmVjdG9yaWVzIGFyZSByZWN1cnNpdmVseSByZWNyZWF0ZWQsIHNpbGVudGx5IGRpc2NhcmRpbmcgYW55dGhpbmcgbWF0ZXJpYWxpemVkIGludG9cbiAgICAgIC8vIGFuIGVxdWFsIG9yIG5lc3RlZCBvdXRwdXQgZGlyZWN0b3J5IG1vbWVudHMgZWFybGllci5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgT3V0cHV0IGRpcmVjdG9yaWVzIG11c3Qgbm90IG92ZXJsYXAgdGhlICR7bGFiZWx9IGRpcmVjdG9yeSAoJHt0ZW1wb3JhcnlEaXJQYXRofSkuYCk7XG4gICAgfVxuICB9XG4gIC8vIFN0YWdpbmcgTUlSUk9SUyBlYWNoIG91dHB1dCB0cmVlJ3MgcmVwb3NpdG9yeS1yb290LXJlbGF0aXZlIGxvY2F0aW9uIChlLmcuXG4gIC8vIGA8cm9vdD4vQHdpbGxib29zdGVyLXByaXZhdGUvYWAgc3RhZ2VzIGF0IGA8c3RhZ2luZz4vQHdpbGxib29zdGVyLXByaXZhdGUvYWApLCBzbyB0aGUgcmVsYXRpdmVcbiAgLy8gZGlzdGFuY2UgYmV0d2VlbiBhbnkgdHdvIHN0YWdlZCB0cmVlcyBlcXVhbHMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlaXIgZmluYWwgbG9jYXRpb25zLiBUaGF0XG4gIC8vIG1ha2VzIGNyb3NzLXRyZWUgYGZpbGU6YCByZXdyaXRlcyAoZS5nLiBgLi4vLi4vQHdpbGxib29zdGVyLzxuYW1lPmApIGNvbXB1dGVkIGFnYWluc3Qgc3RhZ2luZ1xuICAvLyBjb3JyZWN0IGFmdGVyIHRoZSBzd2FwLCB3aGljaCBsZXRzIGV2ZXJ5IGZhaWx1cmUtcHJvbmUgc3RlcCDigJQgZG93bmxvYWQsIGV4dHJhY3Rpb24sIG5lc3RlZFxuICAvLyBkaXNjb3ZlcnksIHJld3JpdGluZyDigJQgZmluaXNoIGJlZm9yZSBlaXRoZXIgbGl2ZSB0cmVlIGlzIHRvdWNoZWQuXG4gIGNvbnN0IHRvU3RhZ2VkUGF0aCA9IChmaW5hbFBhdGg6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIHBhdGguam9pbihzdGFnaW5nUm9vdERpclBhdGgsIHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIGZpbmFsUGF0aCkpO1xuICBpZiAocGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgb3V0RGlyUGF0aCkgIT09ICdAd2lsbGJvb3N0ZXInKSB7XG4gICAgLy8gUHJlLWV4aXN0aW5nIGxpbWl0YXRpb24gb2YgdGhlIG9wdGlvbjogdGhlIERvY2tlciBtYW5pZmVzdCByZXdyaXRlIGhhcyBubyBhY2Nlc3MgdG8gaXQuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAnTm90ZTogd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCByZXdyaXRlcyBnaXQgZGVwZW5kZW5jaWVzIHRvIDxyb290Pi9Ad2lsbGJvb3N0ZXI7IGEgY3VzdG9tIC0tb3V0LWRpciByZXF1aXJlcyBhIG1hdGNoaW5nIERvY2tlcmZpbGUgbGF5b3V0LidcbiAgICAgIClcbiAgICApO1xuICB9XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlcyA9IGF3YWl0IGNvbGxlY3RQcml2YXRlUGFja2FnZXMoXG4gICAgcm9vdERpclBhdGgsXG4gICAgbWFuaWZlc3RQYWNrYWdlSnNvbnMsXG4gICAgb3V0RGlyUGF0aCxcbiAgICByZWdpc3RyeU91dERpclBhdGhcbiAgKTtcblxuICBpZiAoZHJ5UnVuKSB7XG4gICAgcHJpbnREcnlSdW5SZXN1bHQob3V0RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2VzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSZWdpc3RyeSBwYWNrYWdlcyB3aG9zZSBpbnN0YWxsZWQgY29weSBzYXRpc2ZpZXMgdGhlIHNwZWNpZmllciBhcmUgY29waWVkIGZyb21cbiAgLy8gbm9kZV9tb2R1bGVzOyBvbmx5IHRoZSByZXN0IGFyZSBkb3dubG9hZGVkLCBzbyByZWdpc3RyeSBjcmVkZW50aWFscyBhcmUgbmVlZGVkIG9ubHkgd2hlbiBhXG4gIC8vIGRvd25sb2FkIGFjdHVhbGx5IGhhcHBlbnMgKENJIHRlc3Qgc3RlcHMgZGVsaWJlcmF0ZWx5IHJlY2VpdmUgbm8gVmVyZGFjY2lvIHRva2VuKS5cbiAgY29uc3QgZG93bmxvYWRlZFBhY2thZ2VzID0gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV0uZmlsdGVyKChwKSA9PiBwLmtpbmQgPT09ICdyZWdpc3RyeScgJiYgIXAuc291cmNlRGlyUGF0aCk7XG4gIC8vIFJlc29sdmUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBCRUZPUkUgZGVsZXRpbmcgdGhlIGV4aXN0aW5nIG1hdGVyaWFsaXphdGlvbnMsIHNvIGEgbWlzc2luZ1xuICAvLyByZWdpc3RyeSBjb25maWd1cmF0aW9uIGNhbm5vdCBkZXN0cm95IGEgcHJldmlvdXNseSB1c2FibGUgb3V0cHV0IHRyZWUuIFRocm93IChyYXRoZXIgdGhhblxuICAvLyBleGl0KSBzbyBjYWxsZXJzIGNhbiBkZWNpZGU6IGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCByZXBvcnRzIGl0IGFuZCBleGl0cywgd2hpbGUgdGhlXG4gIC8vIGF1dG9tYXRpYyBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVgIHN0ZXAgY2F0Y2hlcyBpdCBhbmQgY29udGludWVzLCBsZWF2aW5nIHRoZVxuICAvLyBleGlzdGluZyBvdXRwdXQgdW50b3VjaGVkIChub3RoaW5nIGhhcyBiZWVuIGRlbGV0ZWQgeWV0IGF0IHRoaXMgcG9pbnQpLlxuICBjb25zdCBhdXRoID0gZG93bmxvYWRlZFBhY2thZ2VzLmxlbmd0aCA+IDAgPyByZXNvbHZlUHJpdmF0ZVJlZ2lzdHJ5QXV0aChyb290RGlyUGF0aCkgOiB1bmRlZmluZWQ7XG4gIGlmIChkb3dubG9hZGVkUGFja2FnZXMubGVuZ3RoID4gMCAmJiAhYXV0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3QgZG93bmxvYWQgJHtkb3dubG9hZGVkUGFja2FnZXMubWFwKChwKSA9PiBwLm5hbWUpLmpvaW4oJywgJyl9OiBubyByZWdpc3RyeSBjb25maWd1cmVkIGZvciB0aGUgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfSBzY29wZTsgYCArXG4gICAgICAgIGBhZGQgXCIke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9OnJlZ2lzdHJ5PS4uLlwiIHRvIH4vLm5wbXJjLiBPbmx5IGluc3RhbGxlZCBjb3BpZXMgc2F0aXNmeWluZyBhbiBleGFjdCB2ZXJzaW9uIG9yIGAgK1xuICAgICAgICAnc2VtdmVyIHJhbmdlIGFyZSByZXVzZWQgd2l0aG91dCByZWdpc3RyeSBhY2Nlc3M7IGRpc3QtdGFnIHNwZWNpZmllcnMgKGUuZy4gYGxhdGVzdGApIGFsd2F5cyByZXF1aXJlIGl0LidcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29waWVkUGFja2FnZXMgPSBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXS5maWx0ZXIoKHApID0+IHAua2luZCA9PT0gJ2dpdCcpO1xuICBjb25zdCByZWdpc3RyeVBhY2thZ2VzID0gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV0uZmlsdGVyKChwKSA9PiBwLmtpbmQgPT09ICdyZWdpc3RyeScpO1xuXG4gIC8vIE1hdGVyaWFsaXplIEJPVEggdHJlZXMgaW50byBzdGFnaW5nIGFuZCBzd2FwIHRoZW0gaW4gb25seSBhZnRlciBldmVyeSBmYWlsdXJlLXByb25lIHN0ZXBcbiAgLy8gc3VjY2VlZGVkOiBhIHJlZ2lzdHJ5IGZldGNoL2V4dHJhY3Rpb24vbmVzdGVkLWRpc2NvdmVyeS9yZXdyaXRlIGZhaWx1cmUgbXVzdCBsZWF2ZSBib3RoIGxpdmVcbiAgLy8gdHJlZXMgZXhhY3RseSBhcyB0aGV5IHdlcmUuIE90aGVyd2lzZSB0aGUgYXV0b21hdGljIGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZWBcbiAgLy8gY2FsbGVyIOKAlCB3aGljaCBjYXRjaGVzIHRoZSBmYWlsdXJlIGFuZCBjb250aW51ZXMg4oCUIHdvdWxkIHJld3JpdGUgZGVwZW5kZW5jaWVzIGFnYWluc3RcbiAgLy8gaW5jb25zaXN0ZW50IHRyZWVzIChlLmcuIGEgcmVnaXN0cnkgbWFuaWZlc3QgcG9pbnRpbmcgYXQgYSBkZWxldGVkIGBAd2lsbGJvb3N0ZXIvPG5hbWU+YCkuXG4gIGF3YWl0IGZzLnByb21pc2VzLnJtKHN0YWdpbmdSb290RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB0cnkge1xuICAgIC8vIEJvdGggb3V0cHV0IGRpcmVjdG9yaWVzIGFsd2F5cyBleGlzdCBhZnRlcndhcmRzOiBEb2NrZXJmaWxlcyBDT1BZIHRoZW0gdW5jb25kaXRpb25hbGx5LCBhbmRcbiAgICAvLyBhIG1pc3Npbmcgc291cmNlIHBhdGggZmFpbHMgdGhlIGJ1aWxkLlxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHRvU3RhZ2VkUGF0aChvdXREaXJQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodG9TdGFnZWRQYXRoKHJlZ2lzdHJ5T3V0RGlyUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcHJpdmF0ZVBhY2thZ2Ugb2YgY29waWVkUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGNvcHlJbnN0YWxsZWRQYWNrYWdlKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZSwgdG9TdGFnZWRQYXRoKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiByZWdpc3RyeVBhY2thZ2VzKSB7XG4gICAgICBpZiAocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCkge1xuICAgICAgICBhd2FpdCBjb3B5SW5zdGFsbGVkUGFja2FnZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UsIHRvU3RhZ2VkUGF0aChwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlKFxuICAgICAgICAvLyBkb3dubG9hZGVkUGFja2FnZXMgaXMgbm9uLWVtcHR5IG9uIHRoaXMgcGF0aCwgc28gdGhlIGF1dGggY2hlY2sgYWJvdmUgcGFzc2VkLlxuICAgICAgICBhdXRoISxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UubmFtZSxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UudmVyc2lvblNwZWNpZmllciA/PyAnbGF0ZXN0JyxcbiAgICAgICAgdG9TdGFnZWRQYXRoKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpXG4gICAgICApO1xuICAgICAgcHJpdmF0ZVBhY2thZ2UucmVzb2x2ZWRWZXJzaW9uID0gcmVhZEluc3RhbGxlZFZlcnNpb24oXG4gICAgICAgIHRvU3RhZ2VkUGF0aChwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKSxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UubmFtZVxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRG93bmxvYWRlZCAke3ByaXZhdGVQYWNrYWdlLm5hbWV9IHRvICR7cGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCl9YCk7XG4gICAgICAvLyBBIGRvd25sb2FkZWQgcGFja2FnZSBtYXkgaXRzZWxmIGRlcGVuZCBvbiBwcml2YXRlIHBhY2thZ2VzIHRoYXQgd2VyZSBub3QgdmlzaWJsZSBiZWZvcmVcbiAgICAgIC8vIGV4dHJhY3Rpb247IG1hdGVyaWFsaXplIHRoZW0gdG9vLiBJbnN0YWxsZWQgY29waWVzIHdlcmUgYWxyZWFkeSBkZWVwLXNjYW5uZWQgYnlcbiAgICAgIC8vIGNvbGxlY3RQcml2YXRlUGFja2FnZXMuXG4gICAgICBhd2FpdCBjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKFxuICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgYXV0aCEsXG4gICAgICAgIHByaXZhdGVQYWNrYWdlLFxuICAgICAgICBwcml2YXRlUGFja2FnZXMsXG4gICAgICAgIG91dERpclBhdGgsXG4gICAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aCxcbiAgICAgICAgdG9TdGFnZWRQYXRoXG4gICAgICApO1xuICAgIH1cblxuICAgIGF3YWl0IHJlcGxhY2VQcml2YXRlRGVwZW5kZW5jaWVzKHN0YWdpbmdSb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2VzLCB0b1N0YWdlZFBhdGgpO1xuICAgIGF3YWl0IHN3YXBNYXRlcmlhbGl6ZWRUcmVlcyhbb3V0RGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoXSwgdG9TdGFnZWRQYXRoLCBiYWNrdXBSb290RGlyUGF0aCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oc3RhZ2luZ1Jvb3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKFxuICAgIGBFbnN1cmUgdGhlIERvY2tlcmZpbGUgQ09QWXMgJHtwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBvdXREaXJQYXRoKX0vIGFuZCAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9LyBpbnRvIHRoZSBpbWFnZSBiZWZvcmUgaW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuYFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBtYW5pZmVzdFBhY2thZ2VKc29uczogUGFja2FnZUpzb25bXSxcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICByZWdpc3RyeU91dERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4+IHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPigpO1xuICAvLyBTZWVkIGZyb20gZXZlcnkgbWFuaWZlc3QgKHJvb3QgKyB3b3Jrc3BhY2VzKTsgb25lIHByaXZhdGUgcGFja2FnZSBtYXkgYmUgcmVxdWVzdGVkIGJ5IHNldmVyYWxcbiAgLy8gbWFuaWZlc3RzLCBzbyBtZXJnZSBkdXBsaWNhdGVzIHRoZSBzYW1lIHdheSBuZXN0ZWQgZGlzY292ZXJ5IGRvZXMg4oCUIGtlZXAgdGhlIG5hcnJvd2VyXG4gIC8vIGNvbXBhdGlibGUgcmVxdWlyZW1lbnQgYW5kIGZhaWwgbG91ZGx5IG9uIGEgZ2VudWluZSBjb25mbGljdC5cbiAgY29uc3QgcGFja2FnZXNUb1Byb2Nlc3M6IFByaXZhdGVQYWNrYWdlW10gPSBbXTtcbiAgY29uc3QgcXVldWVkUGFja2FnZXMgPSBuZXcgTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+KCk7XG4gIGZvciAoY29uc3QgcGFja2FnZUpzb24gb2YgbWFuaWZlc3RQYWNrYWdlSnNvbnMpIHtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RlZCBvZiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhwYWNrYWdlSnNvbiwgb3V0RGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoKSkge1xuICAgICAgY29uc3QgcXVldWVkID0gcXVldWVkUGFja2FnZXMuZ2V0KHJlcXVlc3RlZC5uYW1lKTtcbiAgICAgIGlmICghcXVldWVkKSB7XG4gICAgICAgIHF1ZXVlZFBhY2thZ2VzLnNldChyZXF1ZXN0ZWQubmFtZSwgcmVxdWVzdGVkKTtcbiAgICAgICAgcGFja2FnZXNUb1Byb2Nlc3MucHVzaChyZXF1ZXN0ZWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5hcnJvd2VyID0gbmFycm93ZXJDb21wYXRpYmxlUmVxdWlyZW1lbnQocXVldWVkLCByZXF1ZXN0ZWQpO1xuICAgICAgaWYgKG5hcnJvd2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QocXVldWVkLCByZXF1ZXN0ZWQsIHBhY2thZ2VKc29uLm5hbWUgPz8gJ2Egd29ya3NwYWNlIG1hbmlmZXN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZWQudmVyc2lvblNwZWNpZmllciA9IG5hcnJvd2VyLnZlcnNpb25TcGVjaWZpZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHBhY2thZ2VzVG9Qcm9jZXNzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHByaXZhdGVQYWNrYWdlID0gcGFja2FnZXNUb1Byb2Nlc3NbaW5kZXhdO1xuICAgIGlmICghcHJpdmF0ZVBhY2thZ2UpIGNvbnRpbnVlO1xuICAgIGlmIChwcml2YXRlUGFja2FnZXMuaGFzKHByaXZhdGVQYWNrYWdlLm5hbWUpKSBjb250aW51ZTtcblxuICAgIGlmIChwcml2YXRlUGFja2FnZS5raW5kID09PSAnZ2l0Jykge1xuICAgICAgcHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCA9IGZpbmRJbnN0YWxsZWRQYWNrYWdlRGlyKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZS5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5zdGFsbGVkID0gZmluZEluc3RhbGxlZFJlZ2lzdHJ5UGFja2FnZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UpO1xuICAgICAgcHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCA9IGluc3RhbGxlZD8uZGlyUGF0aDtcbiAgICAgIHByaXZhdGVQYWNrYWdlLnJlc29sdmVkVmVyc2lvbiA9IGluc3RhbGxlZD8udmVyc2lvbjtcbiAgICB9XG4gICAgLy8gU2VsZWN0ZWQgQkVGT1JFIHRoZSBkZWVwIHNjYW46IGEgbWFuaWZlc3QgaW5zaWRlIHRoZSBwYWNrYWdlIG1heSByZWZlciBiYWNrIHRvIHRoZSBwYWNrYWdlXG4gICAgLy8gaXRzZWxmLCBhbmQgdGhhdCByZXF1aXJlbWVudCBtdXN0IGJlIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBzZWxlY3Rpb24gKGFzc2VydE5vVmVyc2lvbkNvbmZsaWN0XG4gICAgLy8gYmVsb3cpLCBuZXZlciBuYXJyb3cgdGhlIGFscmVhZHktc2VsZWN0ZWQgc3BlY2lmaWVyLlxuICAgIHByaXZhdGVQYWNrYWdlcy5zZXQocHJpdmF0ZVBhY2thZ2UubmFtZSwgcHJpdmF0ZVBhY2thZ2UpO1xuICAgIC8vIE5lc3RlZCBwcml2YXRlIGRlcGVuZGVuY2llcyBvZiBhbiBpbnN0YWxsZWQgcGFja2FnZSBhcmUgZGlzY292ZXJhYmxlIHJpZ2h0IGF3YXk7IHJlZ2lzdHJ5XG4gICAgLy8gcGFja2FnZXMgd2l0aG91dCBhIHVzYWJsZSBpbnN0YWxsZWQgY29weSBhcmUgaW5zcGVjdGVkIGFmdGVyIGRvd25sb2FkIGluc3RlYWRcbiAgICAvLyAoY29sbGVjdE5lc3RlZFByaXZhdGVQYWNrYWdlcykuXG4gICAgaWYgKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGgpIHtcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIGZpbmRQcml2YXRlRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uLCBvdXREaXJQYXRoLCByZWdpc3RyeU91dERpclBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgcXVldWVkID0gcXVldWVkUGFja2FnZXMuZ2V0KG5lc3RlZC5uYW1lKTtcbiAgICAgICAgICBpZiAoIXF1ZXVlZCkge1xuICAgICAgICAgICAgcXVldWVkUGFja2FnZXMuc2V0KG5lc3RlZC5uYW1lLCBuZXN0ZWQpO1xuICAgICAgICAgICAgcGFja2FnZXNUb1Byb2Nlc3MucHVzaChuZXN0ZWQpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcml2YXRlUGFja2FnZXMuaGFzKG5lc3RlZC5uYW1lKSkge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBtYXRlcmlhbGl6ZWQgKG9yIHNlbGVjdGVkKTogdGhlIHJlcXVpcmVtZW50IG11c3QgYWRtaXQgdGhhdCBzZWxlY3Rpb24uXG4gICAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChxdWV1ZWQsIG5lc3RlZCwgcHJpdmF0ZVBhY2thZ2UubmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFN0aWxsIHF1ZXVlZDoga2VlcCB0aGUgTkFSUk9XRVIgY29tcGF0aWJsZSByZXF1aXJlbWVudCBzbyBkaXNjb3Zlcnkgb3JkZXIgY2Fubm90XG4gICAgICAgICAgICAvLyB0dXJuIGNvbXBhdGlibGUgY29uc3RyYWludHMgKGUuZy4gYF4xLjAuMGAgYW5kIGAxLjIuM2ApIGludG8gYSBzcHVyaW91cyBjb25mbGljdC5cbiAgICAgICAgICAgIGNvbnN0IG5hcnJvd2VyID0gbmFycm93ZXJDb21wYXRpYmxlUmVxdWlyZW1lbnQocXVldWVkLCBuZXN0ZWQpO1xuICAgICAgICAgICAgaWYgKG5hcnJvd2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QocXVldWVkLCBuZXN0ZWQsIHByaXZhdGVQYWNrYWdlLm5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcXVldWVkLnZlcnNpb25TcGVjaWZpZXIgPSBuYXJyb3dlci52ZXJzaW9uU3BlY2lmaWVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcml2YXRlUGFja2FnZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3ROZXN0ZWRQcml2YXRlUGFja2FnZXMoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIGF1dGg6IFByaXZhdGVSZWdpc3RyeUF1dGgsXG4gIGV4dHJhY3RlZFBhY2thZ2U6IFByaXZhdGVQYWNrYWdlLFxuICBwcml2YXRlUGFja2FnZXM6IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPixcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICByZWdpc3RyeU91dERpclBhdGg6IHN0cmluZyxcbiAgdG9TdGFnZWRQYXRoOiAodGFyZ2V0RGlyUGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBFdmVyeSBtYXRlcmlhbGl6ZWQgcGFja2FnZSDigJQgaW5jbHVkaW5nIGEgbGF0ZS1kaXNjb3ZlcmVkIG5lc3RlZCBnaXQgZGVwZW5kZW5jeSDigJQgbGl2ZXMgaW5cbiAgLy8gc3RhZ2luZyB1bnRpbCB0aGUgYXRvbWljIHN3YXAsIHNvIGl0cyBtYW5pZmVzdHMgbXVzdCBiZSByZWFkIHRoZXJlLlxuICBjb25zdCBleHRyYWN0ZWREaXJQYXRoID0gdG9TdGFnZWRQYXRoKGV4dHJhY3RlZFBhY2thZ2UudGFyZ2V0RGlyUGF0aCk7XG4gIC8vIFNjYW4gRVZFUlkgbWFuaWZlc3Qgb2YgdGhlIG1hdGVyaWFsaXplZCBwYWNrYWdlIChvcmcgZ2l0IGRlcGVuZGVuY2llcyBhcmUgd2hvbGUgbW9ub3JlcG9cbiAgLy8gY2hlY2tvdXRzIHdpdGggcGFja2FnZXMvKi9wYWNrYWdlLmpzb24pLCBtaXJyb3JpbmcgY29sbGVjdFByaXZhdGVQYWNrYWdlcycgZGVlcCBzY2FuIOKAlCB0aGVcbiAgLy8gZGVwZW5kZW5jeS1yZXdyaXRlIHN0ZXAgd2Fsa3MgdGhlIHNhbWUgc2V0LCBzbyBhbnl0aGluZyBkZWNsYXJlZCB0aGVyZSBtdXN0IGJlIG1hdGVyaWFsaXplZC5cbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMoZXh0cmFjdGVkRGlyUGF0aCkpIHtcbiAgICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgICAgIGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpLFxuICAgICAgb3V0RGlyUGF0aCxcbiAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aFxuICAgICkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcHJpdmF0ZVBhY2thZ2VzLmdldChuZXN0ZWQubmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgaWYgKGV4aXN0aW5nLmtpbmQgPT09ICdyZWdpc3RyeScgJiYgIWV4aXN0aW5nLnNvdXJjZURpclBhdGggJiYgZXhpc3RpbmcucmVzb2x2ZWRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBTdGlsbCBhd2FpdGluZyBpdHMgZG93bmxvYWQgKG5vIGluc3RhbGxlZCBjb3B5IHNlbGVjdGVkLCBub3RoaW5nIGV4dHJhY3RlZCB5ZXQpOiBrZWVwXG4gICAgICAgICAgLy8gdGhlIE5BUlJPV0VSIGNvbXBhdGlibGUgcmVxdWlyZW1lbnQsIGV4YWN0bHkgYXMgY29sbGVjdFByaXZhdGVQYWNrYWdlcyBkb2VzIGZvclxuICAgICAgICAgIC8vIHF1ZXVlZCBwYWNrYWdlcywgc28gbGF0ZS1kaXNjb3ZlcmVkIG5lc3RlZCBjb25zdHJhaW50cyBjYW5ub3QgZmFicmljYXRlIGNvbmZsaWN0cy5cbiAgICAgICAgICBjb25zdCBuYXJyb3dlciA9IG5hcnJvd2VyQ29tcGF0aWJsZVJlcXVpcmVtZW50KGV4aXN0aW5nLCBuZXN0ZWQpO1xuICAgICAgICAgIGlmIChuYXJyb3dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZywgbmVzdGVkLCBleHRyYWN0ZWRQYWNrYWdlLm5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID0gbmFycm93ZXIudmVyc2lvblNwZWNpZmllcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ29sbGFwc2luZyBkaWZmZXJlbnQgcmVxdWVzdGVkIHZlcnNpb25zIGludG8gb25lIG1hdGVyaWFsaXphdGlvbiB3b3VsZCBzaWxlbnRseVxuICAgICAgICAgIC8vIHZpb2xhdGUgdGhlIGRlcGVuZGVudCdzIHJlcXVpcmVtZW50LCBzbyBjb25mbGljdHMgbXVzdCBmYWlsIGxvdWRseS5cbiAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZywgbmVzdGVkLCBleHRyYWN0ZWRQYWNrYWdlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVzdGVkLmtpbmQgPT09ICdnaXQnKSB7XG4gICAgICAgIG5lc3RlZC5zb3VyY2VEaXJQYXRoID0gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGgsIG5lc3RlZC5uYW1lKTtcbiAgICAgICAgYXdhaXQgY29weUluc3RhbGxlZFBhY2thZ2Uocm9vdERpclBhdGgsIG5lc3RlZCwgdG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbnN0YWxsZWQgPSBmaW5kSW5zdGFsbGVkUmVnaXN0cnlQYWNrYWdlKHJvb3REaXJQYXRoLCBuZXN0ZWQpO1xuICAgICAgICBuZXN0ZWQuc291cmNlRGlyUGF0aCA9IGluc3RhbGxlZD8uZGlyUGF0aDtcbiAgICAgICAgbmVzdGVkLnJlc29sdmVkVmVyc2lvbiA9IGluc3RhbGxlZD8udmVyc2lvbjtcbiAgICAgICAgaWYgKG5lc3RlZC5zb3VyY2VEaXJQYXRoKSB7XG4gICAgICAgICAgYXdhaXQgY29weUluc3RhbGxlZFBhY2thZ2Uocm9vdERpclBhdGgsIG5lc3RlZCwgdG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlKFxuICAgICAgICAgICAgYXV0aCxcbiAgICAgICAgICAgIG5lc3RlZC5uYW1lLFxuICAgICAgICAgICAgbmVzdGVkLnZlcnNpb25TcGVjaWZpZXIgPz8gJ2xhdGVzdCcsXG4gICAgICAgICAgICB0b1N0YWdlZFBhdGgobmVzdGVkLnRhcmdldERpclBhdGgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBuZXN0ZWQucmVzb2x2ZWRWZXJzaW9uID0gcmVhZEluc3RhbGxlZFZlcnNpb24odG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKSwgbmVzdGVkLm5hbWUpO1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRG93bmxvYWRlZCAke25lc3RlZC5uYW1lfSAobmVzdGVkIGRlcGVuZGVuY3kpIHRvICR7bmVzdGVkLnRhcmdldERpclBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByaXZhdGVQYWNrYWdlcy5zZXQobmVzdGVkLm5hbWUsIG5lc3RlZCk7XG4gICAgICBhd2FpdCBjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKFxuICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgYXV0aCxcbiAgICAgICAgbmVzdGVkLFxuICAgICAgICBwcml2YXRlUGFja2FnZXMsXG4gICAgICAgIG91dERpclBhdGgsXG4gICAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aCxcbiAgICAgICAgdG9TdGFnZWRQYXRoXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKiogYGRlc3RpbmF0aW9uRGlyUGF0aGAgbWF5IGRpZmZlciBmcm9tIGB0YXJnZXREaXJQYXRoYCB3aGlsZSByZWdpc3RyeSBwYWNrYWdlcyBzdGFnZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvcHlJbnN0YWxsZWRQYWNrYWdlKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBwcml2YXRlUGFja2FnZTogUHJpdmF0ZVBhY2thZ2UsXG4gIGRlc3RpbmF0aW9uRGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQSByZWdpc3RyeSBwYWNrYWdlJ3MgdGFyYmFsbCBtYXkgbGVnaXRpbWF0ZWx5IGNvbnRhaW4gbm9kZV9tb2R1bGVzLyBjb250ZW50IHZpYVxuICAvLyBidW5kbGVkRGVwZW5kZW5jaWVzOyB0aG9zZSBmaWxlcyBhcmUgcGFydCBvZiB0aGUgYXJ0aWZhY3QgYW5kIG11c3Qgc3Vydml2ZSB0aGUgY29weS4gR2l0XG4gIC8vIGNoZWNrb3V0cyAoYW5kIG5vbi1idW5kbGVkIG5hbWVzKSBzdGlsbCBleGNsdWRlIG5vZGVfbW9kdWxlcywgd2hpY2ggaG9sZHMgbG9jYWxseSBpbnN0YWxsZWRcbiAgLy8gZGVwZW5kZW5jaWVzIHRoZXJlLlxuICBjb25zdCBidW5kbGVkRGVwZW5kZW5jeU5hbWVzID1cbiAgICBwcml2YXRlUGFja2FnZS5raW5kID09PSAncmVnaXN0cnknID8gcmVhZEJ1bmRsZWREZXBlbmRlbmN5TmFtZXMocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCEpIDogW107XG4gIGF3YWl0IGZzLnByb21pc2VzLmNwKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGghLCBkZXN0aW5hdGlvbkRpclBhdGgsIHtcbiAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgZm9yY2U6IHRydWUsXG4gICAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIGV4cG9zZXMgaW5zdGFsbGVkIHBhY2thZ2VzIHRocm91Z2ggc3ltbGlua3M7IHRoZSBtYXRlcmlhbGl6ZWQgdHJlZVxuICAgIC8vIG11c3QgY29udGFpbiByZWFsIGZpbGVzIChhIGNvcGllZCBhYnNvbHV0ZSBzeW1saW5rIHdvdWxkIGRhbmdsZSBpbnNpZGUgdGhlIERvY2tlciBpbWFnZSxcbiAgICAvLyBhbmQgbGF0ZXIgZGVwZW5kZW5jeSByZXdyaXRpbmcgd291bGQgd3JpdGUgdGhyb3VnaCBpdCBpbnRvIHRoZSBzaGFyZWQgc3RvcmUpLlxuICAgIGRlcmVmZXJlbmNlOiB0cnVlLFxuICAgIGZpbHRlcjogKHNyYykgPT4ge1xuICAgICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnJlbGF0aXZlKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGghLCBzcmMpLnNwbGl0KHBhdGguc2VwKTtcbiAgICAgIGlmIChzZWdtZW50cy5pbmNsdWRlcygnLmdpdCcpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBub2RlTW9kdWxlc0luZGV4ID0gc2VnbWVudHMuaW5kZXhPZignbm9kZV9tb2R1bGVzJyk7XG4gICAgICBpZiAobm9kZU1vZHVsZXNJbmRleCA9PT0gLTEpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGJ1bmRsZWREZXBlbmRlbmN5TmFtZXMgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGJ1bmRsZWREZXBlbmRlbmN5TmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBUaGUgbm9kZV9tb2R1bGVzIChhbmQgQHNjb3BlKSBkaXJlY3RvcmllcyB0aGVtc2VsdmVzIG11c3QgY29weSBzbyBidW5kbGVkIHN1YnRyZWVzIGNhbjtcbiAgICAgIC8vIG9ubHkgdGhlIGZpcnN0IG5vZGVfbW9kdWxlcyBsZXZlbCBmaWx0ZXJzIOKAlCBhbnl0aGluZyBpbnNpZGUgYSBidW5kbGVkIHN1YnRyZWUgYmVsb25ncyB0b1xuICAgICAgLy8gdGhlIGFydGlmYWN0LCBpbmNsdWRpbmcgaXRzIG93biBuZXN0ZWQgbm9kZV9tb2R1bGVzLlxuICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gc2VnbWVudHMuc2xpY2Uobm9kZU1vZHVsZXNJbmRleCArIDEpO1xuICAgICAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGZpcnN0LnN0YXJ0c1dpdGgoJ0AnKSAmJiBzZWNvbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYnVuZGxlZERlcGVuZGVuY3lOYW1lcy5zb21lKChuYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgoYCR7Zmlyc3R9L2ApKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gZmlyc3Quc3RhcnRzV2l0aCgnQCcpID8gYCR7Zmlyc3R9LyR7c2Vjb25kfWAgOiBmaXJzdDtcbiAgICAgIHJldHVybiBidW5kbGVkRGVwZW5kZW5jeU5hbWVzLmluY2x1ZGVzKHBhY2thZ2VOYW1lKTtcbiAgICB9LFxuICB9KTtcbiAgY29uc29sZS5pbmZvKGBDb3BpZWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfSB0byAke3BhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpfWApO1xufVxuXG4vKiogRGVjbGFyZWQgYnVuZGxlZCBkZXBlbmRlbmN5IG5hbWVzIG9mIHRoZSBpbnN0YWxsZWQgcGFja2FnZTsgYHRydWVgIGJ1bmRsZXMgZXZlcnkgZGVwZW5kZW5jeS4gKi9cbmZ1bmN0aW9uIHJlYWRCdW5kbGVkRGVwZW5kZW5jeU5hbWVzKHNvdXJjZURpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHwgdHJ1ZSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgICBidW5kbGVEZXBlbmRlbmNpZXM/OiBzdHJpbmdbXSB8IGJvb2xlYW47XG4gICAgICBidW5kbGVkRGVwZW5kZW5jaWVzPzogc3RyaW5nW10gfCBib29sZWFuO1xuICAgIH07XG4gICAgY29uc3QgYnVuZGxlZCA9IHBhY2thZ2VKc29uLmJ1bmRsZURlcGVuZGVuY2llcyA/PyBwYWNrYWdlSnNvbi5idW5kbGVkRGVwZW5kZW5jaWVzO1xuICAgIGlmIChidW5kbGVkID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShidW5kbGVkKSA/IGJ1bmRsZWQuZmlsdGVyKChuYW1lKSA9PiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIDogW107XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBtYXRlcmlhbGl6YXRpb24gZm9yIGBleGlzdGluZ2AgaXMgYWxyZWFkeSBzZWxlY3RlZCAoYSByYW5nZSByZXNvbHZlcyBtYXgtc2F0aXNmeWluZyBhZ2FpbnN0XG4gKiB0aGUgcmVnaXN0cnkg4oCUIHNlZSBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UpLCBzbyBhY2NlcHQgYHJlcXVlc3RlZGAgb25seSB3aGVuIGl0IGlzXG4gKiBndWFyYW50ZWVkIHNhdGlzZmllZDogYGV4aXN0aW5nYCBtdXN0IGJlIGEgc3Vic2V0IG9mIGl0IChldmVyeSBwb3NzaWJsZSByZXNvbHV0aW9uIG9mIGBleGlzdGluZ2BcbiAqIHRoZW4gc2F0aXNmaWVzIGByZXF1ZXN0ZWRgKS4gTm9uLXJhbmdlIHNwZWNpZmllcnMgKGRpc3QtdGFncywgZ2l0IFVSTHMvcmV2aXNpb25zKSBtdXN0IG1hdGNoXG4gKiBleGFjdGx5LlxuICovXG5mdW5jdGlvbiBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZzogUHJpdmF0ZVBhY2thZ2UsIHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2UsIGRlcGVuZGVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXhpc3Rpbmcua2luZCA9PT0gcmVxdWVzdGVkLmtpbmQpIHtcbiAgICBpZiAoZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA9PT0gcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIpIHJldHVybjtcbiAgICBpZiAoc3BlY2lmaWVyU3Vic2V0KGV4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIsIHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyKSkgcmV0dXJuO1xuICAgIC8vIE9uY2UgdGhlIGNvbmNyZXRlIG1hdGVyaWFsaXplZCB2ZXJzaW9uIGlzIGtub3duIChpbnN0YWxsZWQgY29weSBvciBleHRyYWN0ZWQgZG93bmxvYWQpLCBhXG4gICAgLy8gcmVxdWlyZW1lbnQgaXQgc2F0aXNmaWVzIGlzIGNvbXBhdGlibGUgZXZlbiB3aGVuIHRoZSBvcmlnaW5hbCBzcGVjaWZpZXJzIGFyZSBub3Qgc3Vic2V0c1xuICAgIC8vIChlLmcuIGBeMS4wLjBgIHJlc29sdmVkIHRvIDEuMi4zIGFsc28gc2F0aXNmaWVzIGEgbGF0ZXIgZXhhY3QgYDEuMi4zYCkuXG4gICAgaWYgKFxuICAgICAgZXhpc3RpbmcucmVzb2x2ZWRWZXJzaW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGluc3RhbGxlZFZlcnNpb25TYXRpc2ZpZXMocmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIsIGV4aXN0aW5nLnJlc29sdmVkVmVyc2lvbilcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYENvbmZsaWN0aW5nIHJlcXVpcmVtZW50cyBmb3IgJHtleGlzdGluZy5uYW1lfTogYCArXG4gICAgICBgJHtleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID8/IGV4aXN0aW5nLmtpbmR9IGlzIGFscmVhZHkgc2VsZWN0ZWQsIGJ1dCAke2RlcGVuZGVudE5hbWV9IHJlcXVpcmVzIGAgK1xuICAgICAgYCR7cmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIgPz8gcmVxdWVzdGVkLmtpbmR9LiBPbmx5IGEgc2luZ2xlIHZlcnNpb24gcGVyIHByaXZhdGUgcGFja2FnZSBpcyBzdXBwb3J0ZWQuYFxuICApO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHN5bWxpbmtzIGluIHRoZSBkZWVwZXN0IEVYSVNUSU5HIGFuY2VzdG9yIG9mIHRoZSBwYXRoIGFuZCByZWF0dGFjaGVzIHRoZSBub3QteWV0XG4gKiBleGlzdGluZyByZW1haW5kZXIsIHNvIGxleGljYWwgY29udGFpbm1lbnQvb3ZlcmxhcCBjaGVja3Mgb3BlcmF0ZSBvbiBwaHlzaWNhbCBsb2NhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZVBhdGgodGFyZ2V0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGV4aXN0aW5nUGF0aCA9IHBhdGgucmVzb2x2ZSh0YXJnZXRQYXRoKTtcbiAgY29uc3QgcmVtYWluZGVyU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhleGlzdGluZ1BhdGgpKSB7XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShleGlzdGluZ1BhdGgpO1xuICAgIGlmIChwYXJlbnRQYXRoID09PSBleGlzdGluZ1BhdGgpIGJyZWFrO1xuICAgIHJlbWFpbmRlclNlZ21lbnRzLnVuc2hpZnQocGF0aC5iYXNlbmFtZShleGlzdGluZ1BhdGgpKTtcbiAgICBleGlzdGluZ1BhdGggPSBwYXJlbnRQYXRoO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihmcy5yZWFscGF0aFN5bmMoZXhpc3RpbmdQYXRoKSwgLi4ucmVtYWluZGVyU2VnbWVudHMpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRhcmdldFBhdGgpO1xuICB9XG59XG5cbi8qKiBXaGV0aGVyIHRoZSB0d28gcGF0aHMgYXJlIGVxdWFsIG9yIG9uZSBjb250YWlucyB0aGUgb3RoZXIuICovXG5mdW5jdGlvbiBwYXRoc092ZXJsYXAoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzRXF1YWxPckFuY2VzdG9yUGF0aChhLCBiKSB8fCBpc0VxdWFsT3JBbmNlc3RvclBhdGgoYiwgYSk7XG59XG5cbmZ1bmN0aW9uIGlzRXF1YWxPckFuY2VzdG9yUGF0aChhbmNlc3RvclBhdGg6IHN0cmluZywgZGVzY2VuZGFudFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGFuY2VzdG9yUGF0aCwgZGVzY2VuZGFudFBhdGgpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoID09PSAnJyB8fCAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFN1YmRpcmVjdG9yeShyb290RGlyUGF0aDogc3RyaW5nLCBvdXREaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgb3V0RGlyUGF0aCk7XG4gIGlmIChyZWxhdGl2ZVBhdGggJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKSkgcmV0dXJuO1xuXG4gIHRocm93IG5ldyBFcnJvcihgT3V0cHV0IGRpcmVjdG9yeSBtdXN0IGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0IHJvb3Q6ICR7b3V0RGlyUGF0aH1gKTtcbn1cblxuZnVuY3Rpb24gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVuc2NvcGVkTmFtZSA9IHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7XG4gIC8vIHJlYWxwYXRoU3luYyByZXNvbHZlcyB0aGUgaXNvbGF0ZWQgbGlua2VyJ3Mgc3ltbGluayBzbyBjb3BpZXMgcmVhZCAoYW5kIHRoZSBjb3B5IGZpbHRlclxuICAvLyBjb21wdXRlcyByZWxhdGl2ZSBwYXRocyBhZ2FpbnN0KSB0aGUgYWN0dWFsIHBhY2thZ2UgZGlyZWN0b3J5LlxuICBjb25zdCBkaXJlY3REaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJ0B3aWxsYm9vc3RlcicsIHVuc2NvcGVkTmFtZSk7XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJlY3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcmV0dXJuIGZzLnJlYWxwYXRoU3luYyhkaXJlY3REaXJQYXRoKTtcbiAgfVxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIga2VlcHMgdHJhbnNpdGl2ZS1vbmx5IGRlcGVuZGVuY2llcyBvdXQgb2YgdGhlIHJvb3Qgbm9kZV9tb2R1bGVzO1xuICAvLyBzZWFyY2ggdGhlIC5idW4gc3RvcmUgZm9yIHRoZSBwYWNrYWdlIGJlZm9yZSBnaXZpbmcgdXAuIFRoZSBzdG9yZSBtYXkgbGVnaXRpbWF0ZWx5IGhvbGRcbiAgLy8gTVVMVElQTEUgcmVzb2x1dGlvbnMgb2Ygb25lIHBhY2thZ2UgKGRpZmZlcmVudCB2ZXJzaW9ucy9yZXZpc2lvbnMpLCBhbmQgcGlja2luZyBhbiBhcmJpdHJhcnlcbiAgLy8gb25lIGNvdWxkIHNpbGVudGx5IG1hdGVyaWFsaXplIHRoZSB3cm9uZyBjb250ZW50IOKAlCBzbyBhbWJpZ3VpdHkgZmFpbHMgbG91ZGx5LlxuICBjb25zdCBidW5TdG9yZURpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJ1bicpO1xuICBjb25zdCBjYW5kaWRhdGVEaXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGZzLnJlYWRkaXJTeW5jKGJ1blN0b3JlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVEaXJQYXRoID0gcGF0aC5qb2luKGJ1blN0b3JlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdub2RlX21vZHVsZXMnLCAnQHdpbGxib29zdGVyJywgdW5zY29wZWROYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjYW5kaWRhdGVEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgIGNhbmRpZGF0ZURpclBhdGhzLmFkZChmcy5yZWFscGF0aFN5bmMoY2FuZGlkYXRlRGlyUGF0aCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gLmJ1biBzdG9yZSAoaG9pc3RlZCBpbnN0YWxsKTsgZmFsbCB0aHJvdWdoIHRvIHRoZSBlcnJvciBiZWxvdy5cbiAgfVxuICBpZiAoY2FuZGlkYXRlRGlyUGF0aHMuc2l6ZSA9PT0gMSkgcmV0dXJuIFsuLi5jYW5kaWRhdGVEaXJQYXRoc11bMF0hO1xuICBpZiAoY2FuZGlkYXRlRGlyUGF0aHMuc2l6ZSA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTXVsdGlwbGUgaW5zdGFsbGVkIHJlc29sdXRpb25zIGZvdW5kIGZvciAke3BhY2thZ2VOYW1lfTogJHtbLi4uY2FuZGlkYXRlRGlyUGF0aHNdLmpvaW4oJywgJyl9LiBgICtcbiAgICAgICAgJ0RlZHVwbGljYXRlIHRoZSBkZXBlbmRlbmN5IHNvIGEgc2luZ2xlIHJlc29sdXRpb24gcmVtYWlucy4nXG4gICAgKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFByaXZhdGUgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkOiAke3BhY2thZ2VOYW1lfSAoJHtkaXJlY3REaXJQYXRofSlgKTtcbn1cblxuLyoqXG4gKiBUaGUgaW5zdGFsbGVkIG1hdGVyaWFsaXphdGlvbiBvZiBhIHJlZ2lzdHJ5IHBhY2thZ2UsIHdoZW4gaXRzIHZlcnNpb24gaXMgc3RhdGljYWxseSBrbm93biB0b1xuICogc2F0aXNmeSB0aGUgc3BlY2lmaWVyIOKAlCBzdGVwcyB3aXRob3V0IHJlZ2lzdHJ5IGNyZWRlbnRpYWxzIChlLmcuIENJIHRlc3Qgc3RlcHMsIHdoaWNoXG4gKiBkZWxpYmVyYXRlbHkgcmVjZWl2ZSBubyBWZXJkYWNjaW8gdG9rZW4pIHJldXNlIGl0IGluc3RlYWQgb2YgZG93bmxvYWRpbmcuIFJldHVybnMgdW5kZWZpbmVkXG4gKiAoZmFsbGluZyBiYWNrIHRvIGEgZG93bmxvYWQpIHdoZW4gbm8gdW5hbWJpZ3VvdXNseSBjb3JyZWN0IGluc3RhbGxlZCBjb3B5IGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gZmluZEluc3RhbGxlZFJlZ2lzdHJ5UGFja2FnZShcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcHJpdmF0ZVBhY2thZ2U6IFByaXZhdGVQYWNrYWdlXG4pOiB7IGRpclBhdGg6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBzcGVjaWZpZXIgPSBwcml2YXRlUGFja2FnZS52ZXJzaW9uU3BlY2lmaWVyID8/ICdsYXRlc3QnO1xuICBjb25zdCByZWxhdGl2ZURpclBhdGggPSBwYXRoLmpvaW4oJ25vZGVfbW9kdWxlcycsIC4uLnByaXZhdGVQYWNrYWdlLm5hbWUuc3BsaXQoJy8nKSk7XG4gIGNvbnN0IGFkZENhbmRpZGF0ZSA9IChjYW5kaWRhdGVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+LCBkaXJQYXRoOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmVhZEluc3RhbGxlZFZlcnNpb24oZGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UubmFtZSk7XG4gICAgaWYgKHZlcnNpb24gJiYgaW5zdGFsbGVkVmVyc2lvblNhdGlzZmllcyhzcGVjaWZpZXIsIHZlcnNpb24pKSBjYW5kaWRhdGVzLnNldChmcy5yZWFscGF0aFN5bmMoZGlyUGF0aCksIHZlcnNpb24pO1xuICB9O1xuICAvLyBBIHJvb3QtbGV2ZWwgaW5zdGFsbGF0aW9uIGlzIFRIRSBsb2NrZmlsZSByZXNvbHV0aW9uIGZvciB0aGUgcm9vdCBkZXBlbmRlbmN5OyB0aGUgLmJ1biBzdG9yZVxuICAvLyBpcyBjb25zdWx0ZWQgb25seSBmb3IgdHJhbnNpdGl2ZS1vbmx5IHBhY2thZ2VzLCB3aGVyZSBtdWx0aXBsZSBzYXRpc2Z5aW5nIHJlc29sdXRpb25zIG1heVxuICAvLyBjb2V4aXN0IGFuZCBwaWNraW5nIG9uZSBhcmJpdHJhcmlseSBjb3VsZCBtYXRlcmlhbGl6ZSB0aGUgd3JvbmcgY29udGVudC5cbiAgY29uc3QgZGlyZWN0Q2FuZGlkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGFkZENhbmRpZGF0ZShkaXJlY3RDYW5kaWRhdGVzLCBwYXRoLmpvaW4ocm9vdERpclBhdGgsIHJlbGF0aXZlRGlyUGF0aCkpO1xuICBpZiAoZGlyZWN0Q2FuZGlkYXRlcy5zaXplID09PSAxKSByZXR1cm4gdG9TaW5nbGVDYW5kaWRhdGUoZGlyZWN0Q2FuZGlkYXRlcyk7XG5cbiAgY29uc3Qgc3RvcmVDYW5kaWRhdGVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBmcy5yZWFkZGlyU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJ1bicpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAgIGFkZENhbmRpZGF0ZShzdG9yZUNhbmRpZGF0ZXMsIHBhdGguam9pbihyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYnVuJywgZGlyZW50Lm5hbWUsIHJlbGF0aXZlRGlyUGF0aCkpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gLmJ1biBzdG9yZSAoaG9pc3RlZCBpbnN0YWxsKTsgZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nLlxuICB9XG4gIHJldHVybiB0b1NpbmdsZUNhbmRpZGF0ZShzdG9yZUNhbmRpZGF0ZXMpO1xufVxuXG5mdW5jdGlvbiB0b1NpbmdsZUNhbmRpZGF0ZShjYW5kaWRhdGVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogeyBkaXJQYXRoOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgW2VudHJ5XSA9IGNhbmRpZGF0ZXM7XG4gIHJldHVybiBjYW5kaWRhdGVzLnNpemUgPT09IDEgJiYgZW50cnkgPyB7IGRpclBhdGg6IGVudHJ5WzBdLCB2ZXJzaW9uOiBlbnRyeVsxXSB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZWFkSW5zdGFsbGVkVmVyc2lvbihkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm5hbWUgPT09IHBhY2thZ2VOYW1lICYmIHR5cGVvZiBwYWNrYWdlSnNvbi52ZXJzaW9uID09PSAnc3RyaW5nJ1xuICAgICAgPyBwYWNrYWdlSnNvbi52ZXJzaW9uXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIHJlZ2lzdHJ5T3V0RGlyUGF0aDogc3RyaW5nXG4pOiBQcml2YXRlUGFja2FnZVtdIHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPigpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5S2V5cykge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uW2tleV07XG4gICAgaWYgKCFkZXBlbmRlbmNpZXMpIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcGVuZGVuY2llcykpIHtcbiAgICAgIGNvbnN0IGlzR2l0ID0gaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZSk7XG4gICAgICBpZiAoIWlzR2l0ICYmICFpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGlmIChpc0dpdCAmJiAhbmFtZS5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcml2YXRlIGdpdCBkZXBlbmRlbmN5IG11c3QgYmUgYW4gQHdpbGxib29zdGVyIHBhY2thZ2U6ICR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVuc2NvcGVkTmFtZSA9IHRvVW5zY29wZWRQYWNrYWdlTmFtZShuYW1lKTtcbiAgICAgIC8vIERlcGVuZGVuY3kgbmFtZXMgYmVjb21lIGV4dGVybmFsIGRhdGEgb25jZSBuZXN0ZWQgbWFuaWZlc3RzIGNvbWUgZnJvbSBkb3dubG9hZGVkXG4gICAgICAvLyB0YXJiYWxsczsgcmVqZWN0IGFueXRoaW5nIChwYXRoIHNlcGFyYXRvcnMsIGAuLmAsIGhpZGRlbi1maWxlIHByZWZpeGVzKSB0aGF0IGNvdWxkXG4gICAgICAvLyBlc2NhcGUgdGhlIG91dHB1dCBkaXJlY3RvcnkgdGhlIG5hbWUgaXMgam9pbmVkIGludG8gYmVmb3JlIGl0IGlzIHJlY3Vyc2l2ZWx5IGRlbGV0ZWQuXG4gICAgICBpZiAoIS9eW1xcdy4tXSskLy50ZXN0KHVuc2NvcGVkTmFtZSkgfHwgdW5zY29wZWROYW1lLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJpdmF0ZSBwYWNrYWdlIG5hbWU6ICR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2UgPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGtpbmQ6IGlzR2l0ID8gJ2dpdCcgOiAncmVnaXN0cnknLFxuICAgICAgICBzb3VyY2VEaXJQYXRoOiB1bmRlZmluZWQsXG4gICAgICAgIHJlc29sdmVkVmVyc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICB0YXJnZXREaXJQYXRoOiBwYXRoLmpvaW4oaXNHaXQgPyBvdXREaXJQYXRoIDogcmVnaXN0cnlPdXREaXJQYXRoLCB1bnNjb3BlZE5hbWUpLFxuICAgICAgICAvLyBUaGUgZnVsbCBnaXQgc3BlY2lmaWVyIGlzIHByZXNlcnZlZCBzbyBkaXZlcmdlbnQgVVJMcy9yZXZpc2lvbnMgKCNhYmMgdnMgI2RlZikgYXJlXG4gICAgICAgIC8vIGRldGVjdGVkIGFzIGNvbmZsaWN0cyBpbnN0ZWFkIG9mIHNpbGVudGx5IGNvbGxhcHNpbmcgaW50byBvbmUgY29waWVkIHBhY2thZ2UuXG4gICAgICAgIHZlcnNpb25TcGVjaWZpZXI6IHZhbHVlIGFzIHN0cmluZyxcbiAgICAgIH07XG4gICAgICBjb25zdCBleGlzdGluZyA9IHByaXZhdGVQYWNrYWdlcy5nZXQobmFtZSk7XG4gICAgICBwcml2YXRlUGFja2FnZXMuc2V0KG5hbWUsIGV4aXN0aW5nID8gbWVyZ2VTYW1lTWFuaWZlc3RSZXF1aXJlbWVudChleGlzdGluZywgcmVxdWVzdGVkKSA6IHJlcXVlc3RlZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXTtcbn1cblxuLyoqXG4gKiBBIG1hbmlmZXN0IG1heSBsZWdpdGltYXRlbHkgcmVxdWVzdCBvbmUgcGFja2FnZSBmcm9tIHNldmVyYWwgZGVwZW5kZW5jeSBzZWN0aW9ucyAoZS5nLiBhbiBleGFjdFxuICogZGV2RGVwZW5kZW5jaWVzIHBpbiBhbG9uZ3NpZGUgYSBwZWVyRGVwZW5kZW5jaWVzIHJhbmdlKS4gS2VlcCB0aGUgTkFSUk9XRVIgcmVxdWlyZW1lbnQg4oCUIGl0c1xuICogbWF4LXNhdGlzZnlpbmcgcmVzb2x1dGlvbiBzYXRpc2ZpZXMgdGhlIHdpZGVyIG9uZSBieSBkZWZpbml0aW9uIChhbiBleGFjdCBwaW4gaXMgdGhlIG5hcnJvd2VzdFxuICogcmFuZ2UpIOKAlCBhbmQgZmFpbCBsb3VkbHkgd2hlbiB0aGUgcmVxdWlyZW1lbnRzIGdlbnVpbmVseSBkaXZlcmdlLlxuICovXG5mdW5jdGlvbiBtZXJnZVNhbWVNYW5pZmVzdFJlcXVpcmVtZW50KGV4aXN0aW5nOiBQcml2YXRlUGFja2FnZSwgcmVxdWVzdGVkOiBQcml2YXRlUGFja2FnZSk6IFByaXZhdGVQYWNrYWdlIHtcbiAgY29uc3QgbmFycm93ZXIgPSBuYXJyb3dlckNvbXBhdGlibGVSZXF1aXJlbWVudChleGlzdGluZywgcmVxdWVzdGVkKTtcbiAgaWYgKG5hcnJvd2VyKSByZXR1cm4gbmFycm93ZXI7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgQ29uZmxpY3RpbmcgcmVxdWlyZW1lbnRzIGZvciAke2V4aXN0aW5nLm5hbWV9IHdpdGhpbiBvbmUgbWFuaWZlc3Q6IGAgK1xuICAgICAgYCR7ZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA/PyBleGlzdGluZy5raW5kfSB2cyAke3JlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyID8/IHJlcXVlc3RlZC5raW5kfS5gXG4gICk7XG59XG5cbi8qKlxuICogVGhlIHJlcXVpcmVtZW50IHdob3NlIG1heC1zYXRpc2Z5aW5nIHJlc29sdXRpb24gaXMgZ3VhcmFudGVlZCB0byBzYXRpc2Z5IHRoZSBvdGhlciAoYW4gZXhhY3RcbiAqIHBpbiBpcyB0aGUgbmFycm93ZXN0IHJhbmdlKSwgb3IgdW5kZWZpbmVkIHdoZW4gbmVpdGhlciBzdWJzdW1lcyB0aGUgb3RoZXIuXG4gKi9cbmZ1bmN0aW9uIG5hcnJvd2VyQ29tcGF0aWJsZVJlcXVpcmVtZW50KFxuICBleGlzdGluZzogUHJpdmF0ZVBhY2thZ2UsXG4gIHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2Vcbik6IFByaXZhdGVQYWNrYWdlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGV4aXN0aW5nLmtpbmQgIT09IHJlcXVlc3RlZC5raW5kKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA9PT0gcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIpIHJldHVybiBleGlzdGluZztcbiAgaWYgKHNwZWNpZmllclN1YnNldChleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyLCByZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllcikpIHJldHVybiBleGlzdGluZztcbiAgaWYgKHNwZWNpZmllclN1YnNldChyZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllciwgZXhpc3RpbmcudmVyc2lvblNwZWNpZmllcikpIHJldHVybiByZXF1ZXN0ZWQ7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VQcml2YXRlRGVwZW5kZW5jaWVzKFxuICBzdGFnaW5nUm9vdERpclBhdGg6IHN0cmluZyxcbiAgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4sXG4gIHRvU3RhZ2VkUGF0aDogKHRhcmdldERpclBhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiBwcml2YXRlUGFja2FnZXMudmFsdWVzKCkpIHtcbiAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBhd2FpdCBmaW5kUGFja2FnZUpzb25QYXRocyh0b1N0YWdlZFBhdGgocHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCkpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgaWYgKCFyZXBsYWNlUGFja2FnZUpzb25EZXBlbmRlbmNpZXMocGFja2FnZUpzb25QYXRoLCBwYWNrYWdlSnNvbiwgcHJpdmF0ZVBhY2thZ2VzLCB0b1N0YWdlZFBhdGgpKSBjb250aW51ZTtcblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhY2thZ2VKc29uUGF0aCwgYCR7SlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIHVuZGVmaW5lZCwgMil9XFxuYCwgJ3V0ZjgnKTtcbiAgICAgIC8vIFN0YWdpbmcgbWlycm9ycyB0aGUgcm9vdC1yZWxhdGl2ZSBsYXlvdXQsIHNvIHRoaXMgaXMgdGhlIG1hbmlmZXN0J3MgcG9zdC1zd2FwIGxvY2F0aW9uLlxuICAgICAgY29uc29sZS5pbmZvKGBSZXdyb3RlIHByaXZhdGUgZGVwZW5kZW5jaWVzIGluICR7cGF0aC5yZWxhdGl2ZShzdGFnaW5nUm9vdERpclBhdGgsIHBhY2thZ2VKc29uUGF0aCl9YCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25QYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4sXG4gIHRvU3RhZ2VkUGF0aDogKHRhcmdldERpclBhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeUtleXMpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIGlmICghZGVwZW5kZW5jaWVzKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICBpZiAoIWlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWUpICYmICFpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHRhcmdldFBhY2thZ2UgPSBwcml2YXRlUGFja2FnZXMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKCF0YXJnZXRQYWNrYWdlKSBjb250aW51ZTtcblxuICAgICAgLy8gQm90aCBzaWRlcyBhcmUgc3RhZ2VkIHBhdGhzOiBzdGFnaW5nIG1pcnJvcnMgdGhlIHJvb3QtcmVsYXRpdmUgbGF5b3V0LCBzbyB0aGUgcmVsYXRpdmVcbiAgICAgIC8vIHNwZWNpZmllciBpcyBpZGVudGljYWwgdG8gdGhlIG9uZSB0aGUgZmluYWwgbG9jYXRpb25zIHdvdWxkIHByb2R1Y2UuXG4gICAgICBkZXBlbmRlbmNpZXNbbmFtZV0gPVxuICAgICAgICBgZmlsZToke3BhdGgucmVsYXRpdmUocGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCksIHRvU3RhZ2VkUGF0aCh0YXJnZXRQYWNrYWdlLnRhcmdldERpclBhdGgpKX1gO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VkO1xufVxuXG4vKipcbiAqIE1vdmUgZXZlcnkgc3RhZ2VkIHRyZWUgb250byBpdHMgZmluYWwgbG9jYXRpb24gYXMgb25lIHRyYW5zYWN0aW9uOiBlYWNoIGxpdmUgdHJlZSBpcyBzZXQgYXNpZGVcbiAqIGZpcnN0IHNvIGEgZmFpbGluZyByZW5hbWUgY2FuIHJlc3RvcmUgdGhlIHByZXZpb3VzIHN0YXRlIGluc3RlYWQgb2YgbGVhdmluZyBvbmUgdHJlZSByZXBsYWNlZFxuICogYW5kIHRoZSBvdGhlciBzdGFsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN3YXBNYXRlcmlhbGl6ZWRUcmVlcyhcbiAgb3V0RGlyUGF0aHM6IHN0cmluZ1tdLFxuICB0b1N0YWdlZFBhdGg6ICh0YXJnZXREaXJQYXRoOiBzdHJpbmcpID0+IHN0cmluZyxcbiAgYmFja3VwUm9vdERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEEgVU5JUVVFIGRpcmVjdG9yeSBwZXIgaW52b2NhdGlvbjogd2hlbiBhIHJvbGxiYWNrIGZhaWxzIGl0cyBiYWNrdXAgaXMgcmV0YWluZWQgZm9yIG1hbnVhbFxuICAvLyByZWNvdmVyeSwgYW5kIGEgZml4ZWQgcGF0aCB3b3VsZCBsZXQgdGhlIG5leHQgcnVuIGRlbGV0ZSB0aGUgb25seSByZW1haW5pbmcgY29weS5cbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGJhY2t1cFJvb3REaXJQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGJhY2t1cERpclJvb3QgPSBhd2FpdCBmcy5wcm9taXNlcy5ta2R0ZW1wKGAke2JhY2t1cFJvb3REaXJQYXRofS1gKTtcbiAgLy8gUmVjb3JkZWQgQkVGT1JFIHRoZSBzdGFnZWQgdHJlZSBpcyByZW5hbWVkIGluOiBiZXR3ZWVuIHNldHRpbmcgdGhlIGxpdmUgdHJlZSBhc2lkZSBhbmRcbiAgLy8gaW5zdGFsbGluZyBpdHMgcmVwbGFjZW1lbnQgdGhlIHByZXZpb3VzIG1hdGVyaWFsaXphdGlvbiBleGlzdHMgb25seSBpbiB0aGUgYmFja3VwLCBhbmQgYSByZWNvcmRcbiAgLy8gYWRkZWQgYWZ0ZXIgdGhlIHJlbmFtZSB3b3VsZCBsZWF2ZSB0aGF0IHdpbmRvdyB1bnJlY292ZXJhYmxlLlxuICBjb25zdCBzd2FwcGVkRGlyczogeyBvdXREaXJQYXRoOiBzdHJpbmc7IGJhY2t1cERpclBhdGg6IHN0cmluZzsgaGFkUHJldmlvdXNUcmVlOiBib29sZWFuIH1bXSA9IFtdO1xuICBsZXQgcmVzdG9yZUZhaWxlZCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgW2luZGV4LCBvdXREaXJQYXRoXSBvZiBvdXREaXJQYXRocy5lbnRyaWVzKCkpIHtcbiAgICAgIC8vIEluZGV4ZWQgKG5vdCBuYW1lZCBhZnRlciB0aGUgZGlyZWN0b3J5KSBzbyB0d28gb3V0cHV0IHRyZWVzIHNoYXJpbmcgYSBiYXNlbmFtZSBjYW5ub3RcbiAgICAgIC8vIG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgYmFja3VwLlxuICAgICAgY29uc3QgYmFja3VwRGlyUGF0aCA9IHBhdGguam9pbihiYWNrdXBEaXJSb290LCBTdHJpbmcoaW5kZXgpKTtcbiAgICAgIGNvbnN0IGhhZFByZXZpb3VzVHJlZSA9IGZzLmV4aXN0c1N5bmMob3V0RGlyUGF0aCk7XG4gICAgICBpZiAoaGFkUHJldmlvdXNUcmVlKSBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob3V0RGlyUGF0aCwgYmFja3VwRGlyUGF0aCk7XG4gICAgICBzd2FwcGVkRGlycy5wdXNoKHsgb3V0RGlyUGF0aCwgYmFja3VwRGlyUGF0aCwgaGFkUHJldmlvdXNUcmVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKG91dERpclBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZSh0b1N0YWdlZFBhdGgob3V0RGlyUGF0aCksIG91dERpclBhdGgpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBSZXZlcnNlIG9yZGVyOiB1bmRvIHRoZSBtb3N0IHJlY2VudCBzd2FwIGZpcnN0LlxuICAgIGZvciAoY29uc3Qgc3dhcHBlZCBvZiBzd2FwcGVkRGlycy50b1JldmVyc2VkKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHN3YXBwZWQub3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICBpZiAoc3dhcHBlZC5oYWRQcmV2aW91c1RyZWUpIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShzd2FwcGVkLmJhY2t1cERpclBhdGgsIHN3YXBwZWQub3V0RGlyUGF0aCk7XG4gICAgICB9IGNhdGNoIChyb2xsYmFja0Vycm9yKSB7XG4gICAgICAgIC8vIFJlcG9ydGluZyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBtYXR0ZXJzIG1vcmUsIGJ1dCBhIGZhaWxlZCByb2xsYmFjayBsZWF2ZXMgdGhlIHRyZWVcbiAgICAgICAgLy8gbWlzc2luZywgc28gaXQgbXVzdCBub3QgcGFzcyBzaWxlbnRseSDigJQgYW5kIGl0cyBiYWNrdXAgaXMgdGhlbiB0aGUgT05MWSByZW1haW5pbmcgY29weS5cbiAgICAgICAgcmVzdG9yZUZhaWxlZCA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZXN0b3JlICR7c3dhcHBlZC5vdXREaXJQYXRofTogJHtTdHJpbmcocm9sbGJhY2tFcnJvcil9XFxuYCArXG4gICAgICAgICAgICAgIGBUaGUgcHJldmlvdXMgbWF0ZXJpYWxpemF0aW9uIGlzIGtlcHQgYXQgJHtzd2FwcGVkLmJhY2t1cERpclBhdGh9OyBtb3ZlIGl0IGJhY2sgYnkgaGFuZC5gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBPbmx5IHdoZW4gbm90aGluZyBpcyBsZWZ0IHRvIHJlY292ZXI6IGRlbGV0aW5nIHRoZSBiYWNrdXBzIGFmdGVyIGEgZmFpbGVkIHJlc3RvcmUgd291bGRcbiAgICAvLyBkZXN0cm95IHRoZSBsYXN0IGNvcHkgb2YgdGhlIHByZXZpb3VzIG1hdGVyaWFsaXphdGlvbi4gQW5kIGJ5IHRoaXMgcG9pbnQgYm90aCB0cmVlcyBhcmVcbiAgICAvLyBhbHJlYWR5IGNvbW1pdHRlZCwgc28gYSBjbGVhbnVwIGZhaWx1cmUgKGUuZy4gYSByZWFkLW9ubHkgZGlyZWN0b3J5IGBmcy5jcGAgcHJlc2VydmVkKSBtdXN0XG4gICAgLy8gbm90IHR1cm4gYSBzdWNjZXNzZnVsIG1hdGVyaWFsaXphdGlvbiBpbnRvIGEgcmVwb3J0ZWQgZmFpbHVyZS5cbiAgICBpZiAoIXJlc3RvcmVGYWlsZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGJhY2t1cERpclJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KGBGYWlsZWQgdG8gcmVtb3ZlICR7YmFja3VwRGlyUm9vdH06ICR7U3RyaW5nKGNsZWFudXBFcnJvcil9YCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUGFja2FnZUpzb25QYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKGRpcmVudC5uYW1lID09PSAnbm9kZV9tb2R1bGVzJyB8fCBkaXJlbnQubmFtZSA9PT0gJy5naXQnKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBwYWNrYWdlSnNvblBhdGhzLnB1c2goLi4uKGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKGNoaWxkUGF0aCkpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lID09PSAncGFja2FnZS5qc29uJykge1xuICAgICAgcGFja2FnZUpzb25QYXRocy5wdXNoKGNoaWxkUGF0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYWNrYWdlSnNvblBhdGhzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoOiBzdHJpbmcpOiBQcm9taXNlPFBhY2thZ2VKc29uPiB7XG4gIHJldHVybiBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG59XG5cbmZ1bmN0aW9uIHByaW50RHJ5UnVuUmVzdWx0KG91dERpclBhdGg6IHN0cmluZywgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4pOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKGBbZHJ5LXJ1bl0gV291bGQgcmVjcmVhdGUgJHtvdXREaXJQYXRofWApO1xuICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIHByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKSkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGhcbiAgICAgICAgPyBgW2RyeS1ydW5dIFdvdWxkIGNvcHkgJHtwcml2YXRlUGFja2FnZS5uYW1lfTogJHtwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRofWBcbiAgICAgICAgOiBwcml2YXRlUGFja2FnZS5raW5kID09PSAnZ2l0J1xuICAgICAgICAgID8gYFtkcnktcnVuXSBXb3VsZCBjb3B5ICR7cHJpdmF0ZVBhY2thZ2UubmFtZX06IChpbnN0YWxsZWQgdW5kZXIgbm9kZV9tb2R1bGVzKWBcbiAgICAgICAgICA6IGBbZHJ5LXJ1bl0gV291bGQgZG93bmxvYWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfUAke3ByaXZhdGVQYWNrYWdlLnZlcnNpb25TcGVjaWZpZXJ9IHRvICR7cHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aH1gXG4gICAgKTtcbiAgfVxuICBjb25zb2xlLmluZm8oYFtkcnktcnVuXSBXb3VsZCByZXdyaXRlIGNvcGllZCBwcml2YXRlIGRlcGVuZGVuY2llcyB0byBmaWxlOi4uLzxuYW1lPmApO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQge1xuICBmaW5kRGVzY2VuZGFudFByb2plY3RzLFxuICBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgsXG4gIGdldEZpbGVEYXRhYmFzZVVybFBhdGgsXG4gIHR5cGUgUHJvamVjdCxcbn0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBpc0RvY2tlckVuYWJsZWQgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmltcG9ydCB7XG4gIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsXG4gIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3ksXG4gIGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeSxcbiAgbWF0ZXJpYWxpemVkVmVyc2lvblNhdGlzZmllcyxcbiAgdG9VbnNjb3BlZFBhY2thZ2VOYW1lLFxufSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5pbXBvcnQgeyBjb2xsZWN0TWFuaWZlc3RzLCBtYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlcyB9IGZyb20gJy4vc2V0dXBQcml2YXRlUGFja2FnZXMuanMnO1xuXG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuY29uc3Qgc3FsaXRlRmlsZVBhdHRlcm4gPSAvXFwuKD86c3FsaXRlMz98ZGIpKD86Wy0uXSg/OmpvdXJuYWx8c2htfHdhbCkpPyQvaTtcbmNvbnN0IGRvY2tlckJ1aWxkQ2FjaGVQYXRocyA9IFtcbiAgJy5jYWNoZScsXG4gICcubXlweV9jYWNoZScsXG4gICcubmV4dC9jYWNoZScsXG4gICcucGFyY2VsLWNhY2hlJyxcbiAgJy5weXRlc3RfY2FjaGUnLFxuICAnLnJ1ZmZfY2FjaGUnLFxuICAnLnRveCcsXG4gICcudHVyYm8nLFxuICAnLnZlbnYnLFxuICAnLnlhcm4vY2FjaGUnLFxuICAnLnlhcm4vaW5zdGFsbC1zdGF0ZS5neicsXG4gICdfX3B5Y2FjaGVfXycsXG4gICdjb3ZlcmFnZScsXG4gICdub2RlX21vZHVsZXMvLmNhY2hlJyxcbiAgJ3BsYXl3cmlnaHQtcmVwb3J0JyxcbiAgJ3N0b3J5Ym9vay1zdGF0aWMnLFxuICAndGFyZ2V0JyxcbiAgJ3Rlc3QtcmVzdWx0cycsXG5dO1xuY29uc3QgZG9ja2VyQnVpbGRDYWNoZVBhdHRlcm5zID0gWycqKi8qLnB5YycsICcqKi8qLnRzYnVpbGRpbmZvJywgJyoqL19fcHljYWNoZV9fJ107XG5jb25zdCBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcyA9IFsncHJpc21hJywgJ2RiJywgJ2RyaXp6bGUnXSBhcyBjb25zdDtcbmNvbnN0IGRvY2tlckdlbmVyYXRlZERhdGFEaXJQYXRocyA9IFsnL2RhdGEnXSBhcyBjb25zdDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBNYXRlcmlhbGl6ZSBwcml2YXRlIGRlcGVuZGVuY2llcyBvbiB0aGUgaG9zdCBmaXJzdCBzbyB0aGUgcGVyLXByb2plY3QgcmV3cml0ZSBiZWxvdyByZXNvbHZlc1xuICAgIC8vIHRoZW0gdG8gZmlsZTogcGF0aHMgYW5kIHRoZSBEb2NrZXIgYnVpbGQgbmVlZHMgbm8gcmVnaXN0cnkgY3JlZGVudGlhbHMuIE9ubHkgaW4gLS1vdXRzaWRlXG4gICAgLy8gbW9kZSAodGhlIGluLWltYWdlIHNlY29uZCBwYXNzIGhhcyBubyBub2RlX21vZHVsZXMvcmVnaXN0cnkgdG8gbWF0ZXJpYWxpemUgZnJvbSkgYW5kIG9ubHlcbiAgICAvLyB3aGVuIGEgcHJpdmF0ZSBkZXBlbmRlbmN5IGlzIGFjdHVhbGx5IGRlY2xhcmVkLCBzbyByZXBvcyB3aXRob3V0IG9uZSBhcmUgdW50b3VjaGVkIOKAlCBubyBlbXB0eVxuICAgIC8vIG91dHB1dCBkaXJlY3Rvcmllcywgbm8gc3B1cmlvdXMgXCJDT1BZXCIgaGludC4gRmFpbHVyZXMgYXJlIG5vbi1mYXRhbCBhbmQgbm9uLWRlc3RydWN0aXZlOlxuICAgIC8vIG1hdGVyaWFsaXplIHRocm93cyBiZWZvcmUgZGVsZXRpbmcgYW55IGV4aXN0aW5nIG91dHB1dCAoYW5kIGNsZWFucyB1cCBpdHMgc3RhZ2luZyBvbiBhIGZhaWxlZFxuICAgIC8vIGRvd25sb2FkKSwgc28gYSByZXBvIGxhY2tpbmcgcmVnaXN0cnkgY3JlZGVudGlhbHMga2VlcHMgYnVpbGRpbmcgZXhhY3RseSBhcyBiZWZvcmUsIHdpdGggdGhlXG4gICAgLy8gcGVyLXByb2plY3QgcmV3cml0ZSBiZWxvdyBlbWl0dGluZyB0aGUgZXhpc3RpbmcgXCJydW4gd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc1wiIGhpbnQuIFRoaXNcbiAgICAvLyBrZWVwcyB0aGUgc3RlcCBhIHB1cmUgY29udmVuaWVuY2UgdGhhdCBsZXRzIHJlcG9zaXRvcmllcyBkcm9wIHRoZSBleHBsaWNpdCBjb21tYW5kLlxuICAgIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgd29ya3NwYWNlIHNldCBmcm9tIHRoZSByZXBvc2l0b3J5IHJvb3Qgc28gYSBwcml2YXRlIGRlcGVuZGVuY3kgZGVjbGFyZWQgaW5cbiAgICAgIC8vIGFueSBzaWJsaW5nIHdvcmtzcGFjZSBpcyBtYXRlcmlhbGl6ZWQgZXZlbiB3aGVuIG9wdGltaXplIHJ1bnMgZnJvbSBhIHN1YnBhY2thZ2UgZGlyZWN0b3J5LlxuICAgICAgY29uc3Qgcm9vdFByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdHMucm9vdC5kaXJQYXRoKTtcbiAgICAgIGNvbnN0IG1hbmlmZXN0cyA9IGNvbGxlY3RNYW5pZmVzdHMocm9vdFByb2plY3RzID8/IHByb2plY3RzKTtcbiAgICAgIGlmIChtYW5pZmVzdHMuc29tZShkZWNsYXJlc1ByaXZhdGVEZXBlbmRlbmN5KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG1hdGVyaWFsaXplUHJpdmF0ZVBhY2thZ2VzKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgbWFuaWZlc3RzLCB7IGRyeVJ1bjogQm9vbGVhbihhcmd2LmRyeVJ1bikgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgQ291bGQgbm90IGF1dG8tbWF0ZXJpYWxpemUgcHJpdmF0ZSBwYWNrYWdlcyAoJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9KTsgYCArXG4gICAgICAgICAgICAgICAgJ3J1biBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgaWYgdGhlIERvY2tlciBidWlsZCBuZWVkcyB0aGVtLiBDb250aW51aW5nLidcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW1pemVkUHJvamVjdHM6IFByb2plY3RbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gICAgICByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llcyhwcm9qZWN0LCBwYWNrYWdlSnNvbik7XG4gICAgICBjb25zdCByZW1vdmVkRGV2RGVwZW5kZW5jaWVzID0gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24sIHtcbiAgICAgICAgcmVtb3ZlV2JQb3N0aW5zdGFsbDogIWFyZ3Yub3V0c2lkZSAmJiByZW1vdmVkRGV2RGVwZW5kZW5jaWVzLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvd2InKSxcbiAgICAgIH0pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgICAgaWYgKGFyZ3Yub3V0c2lkZSkge1xuICAgICAgICBhd2FpdCB3cml0ZURvY2tlclNoZWxsU2NyaXB0cyhwYXRoLmpvaW4oZGlzdERpclBhdGgsICdiYXNoJykpO1xuICAgICAgfVxuICAgICAgb3B0aW1pemVkUHJvamVjdHMucHVzaChwcm9qZWN0KTtcbiAgICB9XG4gICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhYXJndi5vdXRzaWRlKSB7XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwcm9qZWN0cy5yb290LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZCwgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5pbmZvKCdJbnN0YWxsZWQgZGVwZW5kZW5jaWVzLicpO1xuICAgICAgYXdhaXQgY2xlYW51cERvY2tlckJ1aWxkQXJ0aWZhY3RzKG9wdGltaXplZFByb2plY3RzKTtcbiAgICB9XG4gIH0sXG59O1xuXG4vKiogV2hldGhlciBhbnkgZGVwZW5kZW5jeSBzZWN0aW9uIGRlY2xhcmVzIGEgcHJpdmF0ZSBnaXQgb3IgYEB3aWxsYm9vc3Rlci1wcml2YXRlLypgIHJlZ2lzdHJ5IGRlcGVuZGVuY3kuICovXG5mdW5jdGlvbiBkZWNsYXJlc1ByaXZhdGVEZXBlbmRlbmN5KHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICByZXR1cm4gZGVwZW5kZW5jeVNlY3Rpb25LZXlzLnNvbWUoKGtleSkgPT4ge1xuICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIHJldHVybiAoXG4gICAgICBkZXBzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIE9iamVjdC5lbnRyaWVzKGRlcHMpLnNvbWUoXG4gICAgICAgIChbbmFtZSwgdmFsdWVdKSA9PiBpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlKSB8fCBpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzKHByb2plY3Q6IFByb2plY3QsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzRm9yRGlyKHByb2plY3Qucm9vdERpclBhdGgsIHByb2plY3QuZGlyUGF0aCwgcGFja2FnZUpzb24pO1xufVxuXG5mdW5jdGlvbiByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llc0ZvckRpcihcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJld3JpdHRlbkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gPz8ge307XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICBpZiAoaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gRG9ja2VyIGJ1aWxkcyBjYW5ub3QgYWNjZXNzIHByaXZhdGUgU1NIIFVSTHMgdW5sZXNzIGNyZWRlbnRpYWxzIGFyZSBmb3J3YXJkZWQuXG4gICAgICAgIC8vIFRoZSBEb2NrZXJmaWxlIGNvcGllcyB0aG9zZSB3b3Jrc3BhY2UgcGFja2FnZXMgaW50byB0aGUgaW1hZ2UgaW5zdGVhZC4gT25seSB0aGUgb3JnJ3NcbiAgICAgICAgLy8gb3duIGdpdCBkZXBlbmRlbmNpZXMgYXJlIHJld3JpdHRlbiDigJQgdGhlIHNoYXJlZCBwcmVkaWNhdGUgbWF0Y2hlcyBleGFjdGx5IHdoYXRcbiAgICAgICAgLy8gYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIG1hdGVyaWFsaXplcywgc28gb3RoZXIgU1NIIFVSTHMgYXJlIGxlZnQgdW5jaGFuZ2VkIGluc3RlYWRcbiAgICAgICAgLy8gb2YgYmVpbmcgcG9pbnRlZCBhdCBuZXZlci1tYXRlcmlhbGl6ZWQgbG9jYWwgcGF0aHMuXG4gICAgICAgIGRlcHNbbmFtZV0gPSBnZXRQcml2YXRlUGFja2FnZURvY2tlclNwZWNpZmllcihyb290RGlyUGF0aCwgcGFja2FnZURpclBhdGgsICdAd2lsbGJvb3N0ZXInLCBuYW1lKTtcbiAgICAgICAgcmV3cml0dGVuRGVwZW5kZW5jaWVzLnB1c2goYCR7a2V5fS4ke25hbWV9YCk7XG4gICAgICB9IGVsc2UgaWYgKGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeShuYW1lLCB2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgbWF0ZXJpYWxpemVkVmVyc2lvbiA9IHJlYWRNYXRlcmlhbGl6ZWRQYWNrYWdlVmVyc2lvbihyb290RGlyUGF0aCwgbmFtZSk7XG4gICAgICAgIGlmIChtYXRlcmlhbGl6ZWRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBMZWF2aW5nIHRoZSByZWdpc3RyeSBzcGVjaWZpZXIgbWVhbnMgdGhlIGluLWltYWdlIGluc3RhbGwgbmVlZHMgVmVyZGFjY2lvXG4gICAgICAgICAgLy8gY3JlZGVudGlhbHMg4oCUIHRoZSBmYWlsdXJlIHRoaXMgZmVhdHVyZSBleGlzdHMgdG8gYXZvaWQg4oCUIHNvIHNheSBzbyBvdXQgbG91ZC5cbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGAke25hbWV9IGlzIG5vdCBtYXRlcmlhbGl6ZWQgdW5kZXIgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfS87IHJ1biBcXGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzXFxgIHNvIHRoZSBEb2NrZXIgYnVpbGQgZG9lcyBub3QgbmVlZCByZWdpc3RyeSBjcmVkZW50aWFscy5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgbWF0ZXJpYWxpemVkIHZlcnNpb24gaXMgc3RhbGUgd2hlbiB0aGUgc3BlY2lmaWVyIChhbiBleGFjdCB2ZXJzaW9uIG9yIGFueSBzZW12ZXJcbiAgICAgICAgLy8gcmFuZ2UgYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIHJlc29sdmVzIG1heC1zYXRpc2Z5aW5nIGFnYWluc3QgdGhlIHJlZ2lzdHJ5KSBkb2VzXG4gICAgICAgIC8vIG5vdCBhZG1pdCBpdC4gRGlzdC10YWcgc3BlY2lmaWVycyAoZS5nLiBgMjAyNi1zdGFibGVgKSBza2lwIHRoZSBzdGFsZW5lc3MgY2hlY2suXG4gICAgICAgIGlmICghbWF0ZXJpYWxpemVkVmVyc2lvblNhdGlzZmllcyh2YWx1ZSwgbWF0ZXJpYWxpemVkVmVyc2lvbikpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgICBgTWF0ZXJpYWxpemVkICR7bmFtZX0gaXMgJHttYXRlcmlhbGl6ZWRWZXJzaW9ufSBidXQgcGFja2FnZS5qc29uIHJlcXVpcmVzICR7dmFsdWV9OyByZXJ1biBcXGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzXFxgLmBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWdpc3RyeSBwYWNrYWdlcyB0aGF0IGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCBtYXRlcmlhbGl6ZWQgb24gdGhlIGhvc3QgYXJlIHVzZWQgYXNcbiAgICAgICAgLy8gbG9jYWwgcGF0aHMgc28gaW1hZ2UgYnVpbGRzIG5lZWQgbm8gVmVyZGFjY2lvIGNyZWRlbnRpYWxzOyB0aGUgQ09NTUlUVEVEIHBhY2thZ2UuanNvblxuICAgICAgICAvLyBrZWVwcyB0aGUgcmVnaXN0cnkgc3BlY2lmaWVyIOKAlCBvbmx5IHRoZSBnZW5lcmF0ZWQgKGRpc3QvKXBhY2thZ2UuanNvbiBpcyByZXdyaXR0ZW5cbiAgICAgICAgLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk2NCkuXG4gICAgICAgIGRlcHNbbmFtZV0gPSBnZXRQcml2YXRlUGFja2FnZURvY2tlclNwZWNpZmllcihyb290RGlyUGF0aCwgcGFja2FnZURpclBhdGgsIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsIG5hbWUpO1xuICAgICAgICByZXdyaXR0ZW5EZXBlbmRlbmNpZXMucHVzaChgJHtrZXl9LiR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZXdyb3RlIHByaXZhdGUgZGVwZW5kZW5jaWVzOicsIHJld3JpdHRlbkRlcGVuZGVuY2llcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG4gIHJldHVybiByZXdyaXR0ZW5EZXBlbmRlbmNpZXM7XG59XG5cbmZ1bmN0aW9uIGdldFByaXZhdGVQYWNrYWdlRG9ja2VyU3BlY2lmaWVyKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBzY29wZURpck5hbWU6IHN0cmluZyxcbiAgcGFja2FnZU5hbWU6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCBzY29wZURpck5hbWUsIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSkpO1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhY2thZ2VEaXJQYXRoLCBwcml2YXRlUGFja2FnZURpclBhdGgpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSA/IHJlbGF0aXZlUGF0aCA6IGAuLyR7cmVsYXRpdmVQYXRofWA7XG59XG5cbi8qKiBVbmRlZmluZWQgd2hlbiB0aGUgcGFja2FnZSBpcyBub3QgbWF0ZXJpYWxpemVkIChvciBpdHMgbWFuaWZlc3QgaXMgdW5yZWFkYWJsZS92ZXJzaW9ubGVzcykuICovXG5mdW5jdGlvbiByZWFkTWF0ZXJpYWxpemVkUGFja2FnZVZlcnNpb24ocm9vdERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihcbiAgICByb290RGlyUGF0aCxcbiAgICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICAgIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSksXG4gICAgJ3BhY2thZ2UuanNvbidcbiAgKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb24pLnZlcnNpb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZURpclBhdGggPSBmaW5kRG9ja2VyU2hlbGxTY3JpcHRzRGlyUGF0aCgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihzb3VyY2VEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0ZpbGUoKSB8fCAhZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5zaCcpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHRhcmdldEZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5jb3B5RmlsZShwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCB0YXJnZXRGaWxlUGF0aCk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuY2htb2QodGFyZ2V0RmlsZVBhdGgsIDBvNzU1KTtcbiAgfVxuICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCBEb2NrZXIgc2hlbGwgc2NyaXB0czogJHtwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGRpclBhdGgpIHx8IGRpclBhdGh9YCk7XG59XG5cbmZ1bmN0aW9uIGZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoKCk6IHN0cmluZyB7XG4gIGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAnZG9ja2VyJywgJ2Jhc2gnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvY2tlciBzaGVsbCBzY3JpcHRzIGRpcmVjdG9yeSBub3QgZm91bmQuJyk7XG4gICAgfVxuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5vdXRzaWRlKSB7XG4gICAgLy8gT3V0c2lkZSBvcHRpbWl6YXRpb24gd3JpdGVzIGRpc3QvcGFja2FnZS5qc29uIGJlZm9yZSBEb2NrZXIgYnVpbGRzIHRoZSBhcHAuXG4gICAgLy8gS2VlcCBidWlsZC10aW1lIGRlcGVuZGVuY2llcyBhbmQgcmVtb3ZlIG9ubHkga25vd24gbm9uLWJ1aWxkIHRvb2xpbmcuXG4gICAgcmV0dXJuIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIC8vIEluc2lkZSBEb2NrZXIsIGNvZGVnZW4vYnVpbGQgaGFzIGFscmVhZHkgZmluaXNoZWQsIHNvIHByb2R1Y3Rpb24gaW5zdGFsbCBzaG91bGQgbm90IHNlZSBkZXYgdG9vbGluZy5cbiAgY29uc3QgcmVtb3ZlZERlcGVuZGVuY2llcyA9IE9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fSk7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xuICByZXR1cm4gcmVtb3ZlZERlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyBJbiAtLW91dHNpZGUgbW9kZSwgRG9ja2VyIHN0aWxsIHJ1bnMgY29kZWdlbi9idWlsZCBiZWZvcmUgYSBzZWNvbmQgaW4taW1hZ2Ugb3B0aW1pemF0aW9uLlxuICAvLyBSZW1vdmUgb25seSB0b29saW5nIHRoYXQgaXMgbm90IG5lZWRlZCBmb3IgdGhhdCBidWlsZCBwaGFzZS5cbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2Jpb21lJyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAnb3hmbXQnLFxuICAgICdveGxpbnQnLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAvLyBTaGFyZWQgY29uZmlnIHBhY2thZ2VzIGFyZSBuZWVkZWQgb25seSBmb3IgbGludC9mb3JtYXQvdGVzdCBjb21tYW5kcywgbm90IERvY2tlciBidWlsZHMuXG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG4gIHJldHVybiByZW1vdmVkRGVwcztcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgb3B0aW9uczogeyByZW1vdmVXYlBvc3RpbnN0YWxsOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgKG9wdGlvbnMucmVtb3ZlV2JQb3N0aW5zdGFsbCAmJiBuYW1lID09PSAncG9zdGluc3RhbGwnICYmIGNvbnRlbnQudHJpbSgpID09PSAnd2IgZ2VuLWNvZGUnKSB8fFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwRG9ja2VyQnVpbGRBcnRpZmFjdHMocHJvamVjdHM6IFByb2plY3RbXSk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBhd2FpdCByZW1vdmVQcm9qZWN0Q2FjaGVzKHByb2plY3QpO1xuICAgIGF3YWl0IHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0KTtcbiAgICBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3QpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVByb2plY3RDYWNoZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gW1xuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0aHMocHJvamVjdCkpLFxuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0dGVybnMocHJvamVjdCkpLFxuICBdO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgRG9ja2VyIGJ1aWxkIGNhY2hlczonLCByZWxhdGl2ZVBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQnVpbGRDYWNoZVBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgZG9ja2VyQnVpbGRDYWNoZVBhdGhzKSB7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSBjb250aW51ZTtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICByZW1vdmVkUGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpO1xuICB9XG4gIHJldHVybiByZW1vdmVkUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gYXdhaXQgZ2xvYmJ5KGRvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucywge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzJywgJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ueWFybicsICcqKi8ueWFybi8qKicsICcqKi8uZ2l0JywgJyoqLy5naXQvKionXSxcbiAgICBvbmx5RmlsZXM6IGZhbHNlLFxuICB9KTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcmVsYXRpdmVQYXRocy5tYXAoKHJlbGF0aXZlUGF0aCkgPT5cbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoR3JvdXBzID0gYXdhaXQgUHJvbWlzZS5hbGwoW3JlbW92ZUdlbmVyYXRlZE1vdW50RGlycyhwcm9qZWN0KSwgcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCldKTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzID0gcmVtb3ZlZFBhdGhHcm91cHMuZmxhdCgpO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZ2VuZXJhdGVkIGxvY2FsIGRhdGE6JywgcmVtb3ZlZFBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkTW91bnREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aHMgPSBnZXRHZW5lcmF0ZWRNb3VudERpclBhdGhzKHByb2plY3QpO1xuICBjb25zdCByZW1vdmVkUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIHJlbGF0aXZlUGF0aHMpIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0UGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJlbW92ZWRQYXRocy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRQYXRocztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkTW91bnREaXJQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBkZWZhdWx0UGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihkaXJOYW1lLCAnbW91bnQnKSk7XG4gIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybiBkZWZhdWx0UGF0aHM7XG5cbiAgY29uc3QgYWJzb2x1dGVEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRiUGF0aCk7XG4gIGlmIChwYXRoLmJhc2VuYW1lKGFic29sdXRlRGlyUGF0aCkgIT09ICdtb3VudCcgfHwgIWlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgYWJzb2x1dGVEaXJQYXRoKSkge1xuICAgIHJldHVybiBkZWZhdWx0UGF0aHM7XG4gIH1cbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIGFic29sdXRlRGlyUGF0aCk7XG4gIGlmICghcmVsYXRpdmVQYXRoKSByZXR1cm4gZGVmYXVsdFBhdGhzO1xuXG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uZGVmYXVsdFBhdGhzLCByZWxhdGl2ZVBhdGhdKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGVmYXVsdERpcnMocHJvamVjdCksXG4gICAgcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCksXG4gIF0pO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRlZmF1bHREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpclBhdGhzID0gYXdhaXQgZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0LCBkaXJQYXRoKSkpO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGlyUGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUpKTtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gaXNEaXJlY3RvcnkoZGlyUGF0aCkpKTtcbiAgcmV0dXJuIGRpclBhdGhzLmZpbHRlcigoXywgaW5kZXgpID0+IHJlc3VsdHNbaW5kZXhdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGJGaWxlUGF0aHMgPSBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkYkZpbGVQYXRoIG9mIGRiRmlsZVBhdGhzKSB7XG4gICAgZm9yIChjb25zdCB0YXJnZXRQYXRoIG9mIGdldFNxbGl0ZUZpbGVGYW1pbHlQYXRocyhkYkZpbGVQYXRoKSkge1xuICAgICAgaWYgKCEoYXdhaXQgaXNGaWxlKHRhcmdldFBhdGgpKSkgY29udGludWU7XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICByZW1vdmVkUGF0aHMucHVzaChwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgdGFyZ2V0UGF0aCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVtb3ZlZFBhdGhzO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVEYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoIHx8ICFhYnNvbHV0ZURiUGF0aCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGZpbGVQYXRocyA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpXG4gICAgPyBbZGJQYXRoXVxuICAgIDogW2Fic29sdXRlRGJQYXRoLCAuLi5nZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUsIGRiUGF0aCkpXTtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGZpbGVQYXRocyldLmZpbHRlcigoZmlsZVBhdGgpID0+IGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3QsIGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgZmlsZVBhdGgpIHx8IGlzRG9ja2VyR2VuZXJhdGVkRGF0YUZpbGVQYXRoKHByb2plY3QsIGZpbGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJHZW5lcmF0ZWREYXRhRmlsZVBhdGgocHJvamVjdDogUHJvamVjdCwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzRG9ja2VyRW5hYmxlZChwcm9qZWN0KSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkb2NrZXJHZW5lcmF0ZWREYXRhRGlyUGF0aHMuc29tZSgoZGlyUGF0aCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcnICYmIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRmlsZUZhbWlseVBhdGhzKGRiRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBkYkZpbGVQYXRoLFxuICAgIGAke2RiRmlsZVBhdGh9LWpvdXJuYWxgLFxuICAgIGAke2RiRmlsZVBhdGh9LXNobWAsXG4gICAgYCR7ZGJGaWxlUGF0aH0td2FsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5qb3VybmFsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5zaG1gLFxuICAgIGAke2RiRmlsZVBhdGh9LndhbGAsXG4gIF07XG59XG5cbmZ1bmN0aW9uIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdDogUHJvamVjdCwgdGFyZ2V0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCB0YXJnZXRQYXRoKTtcbiAgLy8gYHN0YXJ0c1dpdGgoJy4uJylgIHdvdWxkIHJlamVjdCBwcm9qZWN0LWxvY2FsIG5hbWVzIHN1Y2ggYXMgYC4uY2FjaGVgLlxuICByZXR1cm4gcmVsYXRpdmVQYXRoID09PSAnJyB8fCAocmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChgLi4ke3BhdGguc2VwfWApKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChmaWxlUGF0aCk7XG4gICAgcmV0dXJuIHN0YXQuaXNGaWxlKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpc0RpcmVjdG9yeShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChkaXJQYXRoKTtcbiAgICByZXR1cm4gc3RhdC5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0OiBQcm9qZWN0LCBkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgc3FsaXRlRmlsZU5hbWVzID0gZGlyZW50c1xuICAgIC5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIHNxbGl0ZUZpbGVQYXR0ZXJuLnRlc3QoZGlyZW50Lm5hbWUpKVxuICAgIC5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpO1xuICBhd2FpdCBQcm9taXNlLmFsbChzcWxpdGVGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuXG4gIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBkaXJQYXRoKTtcbiAgcmV0dXJuIHNxbGl0ZUZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLmpvaW4ocmVsYXRpdmVEaXJQYXRoLCBmaWxlTmFtZSkpO1xufVxuXG5mdW5jdGlvbiBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgaWYgKCFpc0RvY2tlckVuYWJsZWQocHJvamVjdCkpIHJldHVybjtcblxuICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Jhc2gnLCAnY2xlYW51cC5zaCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc2NyaXB0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCByZXN1bHQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnYmFzaCcsIFtzY3JpcHRQYXRoLCAnLS1rZWVwLXNjcmlwdHMnXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAke3BhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBzY3JpcHRQYXRoKX1gKTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZU9ybSwgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cywgZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoLCBpc1Byb2plY3RFbnZpcm9ubWVudCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGREcml6emxlS2l0Q29tbWFuZCwgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0RvY2tlckVuYWJsZWQgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7IHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHByaXNtYUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdwcmlzbWEnLFxuICBhbGlhc2VzOiBbJ2RiJ10sXG4gIGRlc2NyaWJlOlxuICAgIFwiUnVuIGRhdGFiYXNlIGNvbW1hbmRzLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIFByaXNtYS4gRHJpenpsZSBwcm9qZWN0cyB1c2UgZHJpenpsZS1raXQuIEV4YW1wbGU6IHdiIHByaXNtYSBtaWdyYXRlLWRldiAtLSAtLW5hbWUgaW5pdFwiLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHtcbiAgICByZXR1cm4geWFyZ3NcbiAgICAgIC5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pXG4gICAgICAuY29tbWFuZChjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChnZW5lcmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXN0QmFja3Vwc0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKClcbiAgICAgIC5zdHJpY3QoZmFsc2UpOyAvLyBBbGxvdyB1bmtub3duIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRocm91Z2hcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY2xlYW51cC1saXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdDbGVhbiB1cCB0ZW1wb3JhbCBMaXRlc3RyZWFtIGZpbGVzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGNsZWFudXAtbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnL2V0Yy9saXRlc3RyZWFtLnltbCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUnLFxuICBidWlsZGVyOiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoYWxsUHJvamVjdHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ3JlYXRpbmcgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZvciBtdWx0aXBsZSBwcm9qZWN0cyBhdCBvbmNlIGlzIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSB0aGV5IHdvdWxkIG92ZXJ3cml0ZSBlYWNoIG90aGVyLidcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3QsIG9ybSwgYXJndi5vdXRwdXQpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aG91dCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZGVwbG95JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlJyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZ2VuZXJhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2dlbmVyYXRlJyxcbiAgZGVzY3JpYmU6ICdHZW5lcmF0ZSBPUk0gY2xpZW50IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZ2VuZXJhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5nZW5lcmF0ZShwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGxpdGVzdHJlYW1Db25maWdCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBjb25maWc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBsaXN0QmFja3Vwc0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgbGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyOiBsaXRlc3RyZWFtQ29uZmlnQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGxpc3QtYmFja3VwcycsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmxpc3RCYWNrdXBzKHByb2plY3QsIGFyZ3YuY29uZmlnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdjaGVjay1pZGVtcG90ZW5jeSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1J1biB0aGUgbWlncmF0aW9uIGNvbW1hbmQgdHdpY2UgdG8gY29uZmlybSBpdCBpcyBpZGVtcG90ZW50LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgbWlncmF0ZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXI6IG1pZ3JhdGVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnY2hlY2staWRlbXBvdGVuY3knXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvcm1TY3JpcHRzID0gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24od2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIG9ybVNjcmlwdHMubWlncmF0ZShwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGlmIChzaG91bGRDaGVja0lkZW1wb3RlbmN5KHByb2plY3QsIGFyZ3YuY2hlY2tJZGVtcG90ZW5jeSkpIHtcbiAgICAgICAgaWYgKGlzUHJvZHVjdGlvbkVudmlyb25tZW50KHByb2plY3QpKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdyhgU2tpcHBpbmcgaWRlbXBvdGVuY3kgY2hlY2sgZm9yICR7cHJvamVjdC5uYW1lfSBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50LmApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgb3JtU2NyaXB0cy5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIHNob3VsZENoZWNrSWRlbXBvdGVuY3kocHJvamVjdDogUHJvamVjdCwgY2hlY2tJZGVtcG90ZW5jeTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hlY2tJZGVtcG90ZW5jeSA/PyBpc0RvY2tlckVuYWJsZWQocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIGlzUHJvZHVjdGlvbkVudmlyb25tZW50KHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICdwcm9kdWN0aW9uJyk7XG59XG5cbmNvbnN0IG1pZ3JhdGVEZXZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUtZGV2JyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgYSBtaWdyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBtaWdyYXRlLWRldicsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLm1pZ3JhdGVEZXYocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gICAgICAgICdXQl9FTlY9dGVzdCBkYiByZXNldCcsXG4gICAgICAgIGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpXG4gICAgICApKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3ZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXN0b3JlQnVpbGRlciA9IHtcbiAgLi4ubGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxkcml6emxlfHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlM1wiLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCByZXN0b3JlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiByZXN0b3JlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzdG9yZScsXG4gIGRlc2NyaWJlOiBcIlJlc3RvcmUgREIgZnJvbSBMaXRlc3RyZWFtJ3MgYmFja3VwXCIsXG4gIGJ1aWxkZXI6IHJlc3RvcmVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgcmVzdG9yZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXJndi5vdXRwdXQgPz8gZ2V0RGVmYXVsdFJlc3RvcmVPdXRwdXQocHJvamVjdCwgb3JtKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXN0b3JlKHByb2plY3QsIG91dHB1dCwgYXJndi5jb25maWcpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzZWVkQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgZmlsZToge1xuICAgIGFsaWFzOiAnZicsXG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBzZWVkIHNjcmlwdC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc2VlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2VlZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NlZWQnLFxuICBkZXNjcmliZTogJ1BvcHVsYXRlIERCIHdpdGggc2VlZCBkYXRhJyxcbiAgYnVpbGRlcjogc2VlZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBzZWVkJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSkpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBkYXRhYmFzZSBzdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc3R1ZGlvJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICAvLyBSZXNvbHZlZCBhZ2FpbnN0IHRoZSBwcm9qZWN0IGRpcmVjdG9yeSBiZWNhdXNlIHByaXNtYVNjcmlwdHMuc3R1ZGlvIHJlc29sdmVzIGEgcmVsYXRpdmVcbiAgICAgIC8vIHBhdGggYWdhaW5zdCB0aGUgQ0xJIHByb2Nlc3MgZGlyZWN0b3J5LCB3aGljaCBkaWZmZXJzIGZvciB3b3Jrc3BhY2UgZGVzY2VuZGFudHMuXG4gICAgICBjb25zdCBkYlVybE9yUGF0aCA9IGFyZ3YucmVzdG9yZWRcbiAgICAgICAgPyBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnByaXNtYURpck5hbWUsICdyZXN0b3JlZC5zcWxpdGUzJylcbiAgICAgICAgOiBhcmd2LmRiVXJsT3JQYXRoPy50b1N0cmluZygpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoLCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOlxuICAgIFwiUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHRoZSBkZXRlY3RlZCBPUk0gYXMgaXMuIEFkZGl0aW9uYWwgUHJpc21hIGZsYWdzIGNhbiBhbHNvIGJlIGZvcndhcmRlZCBhZnRlciAnLS0nLlwiLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gKGFyZ3YuYXJncz8uam9pbignICcpID8/ICcnKS50cmltRW5kKCk7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydhcmdzJ10pO1xuICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gW3NjcmlwdCwgdW5rbm93bk9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKGBkYiAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgY29tbWFuZCA9IG9ybSA9PT0gJ3ByaXNtYScgPyBgUFJJU01BICR7ZnVsbENvbW1hbmR9YCA6IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgZnVsbENvbW1hbmQpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBjb21tYW5kKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBNYWtlIERyaXp6bGUgY29tbWFuZHMgd29yayBvbiBDbG91ZGZsYXJlIEQxIHByb2plY3RzIGJ5IHBvaW50aW5nIERBVEFCQVNFX1VSTFxuICogYXQgdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZS5cbiAqL1xuZnVuY3Rpb24gd2l0aExvY2FsRDFJZk5lZWRlZChvcm06IERhdGFiYXNlT3JtLCBwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBvcm0gPT09ICdkcml6emxlJyA/IHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsKHByb2plY3QsIHNjcmlwdCkgOiBzY3JpcHQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdDogUHJvamVjdCwgb3JtOiBEYXRhYmFzZU9ybSwgY29uZmlnUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldExpdGVzdHJlYW1EYlBhdGgocHJvamVjdCwgb3JtKTtcbiAgY29uc3QgcmVxdWlyZWRFbnZWYXJzID0ge1xuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUU6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVksXG4gIH0gYXMgY29uc3Q7XG4gIGNvbnN0IG1pc3NpbmdFbnZWYXJzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRFbnZWYXJzKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIXZhbHVlKVxuICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZ0VudlZhcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExpdGVzdHJlYW06ICR7bWlzc2luZ0VudlZhcnMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IGxpdGVzdHJlYW1Db25maWcgPSBgc25hcHNob3Q6XG4gIGludGVydmFsOiAyNGggICMgQ3JlYXRlIGEgYmFja3VwIHBlciBkYXlcbiAgcmV0ZW50aW9uOiA3MmggIyBLZWVwIGJhY2t1cHMgZm9yIDMgZGF5c1xuZGJzOlxuICAtIHBhdGg6ICR7ZGJQYXRofVxuICAgIGJ1c3ktdGltZW91dDogNXNcbiAgICBjaGVja3BvaW50LWludGVydmFsOiAxbVxuICAgIHJlcGxpY2E6XG4gICAgICB0eXBlOiBzM1xuICAgICAgZW5kcG9pbnQ6IGh0dHBzOi8vJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUR9LnIyLmNsb3VkZmxhcmVzdG9yYWdlLmNvbVxuICAgICAgYnVja2V0OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUV9XG4gICAgICBhY2Nlc3Mta2V5LWlkOiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRH1cbiAgICAgIHNlY3JldC1hY2Nlc3Mta2V5OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVl9XG4gICAgICBzeW5jLWludGVydmFsOiAxbVxuYDtcblxuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gLCB7XG4gICAgICBjYXVzZTogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFJlc3RvcmVPdXRwdXQocHJvamVjdDogUHJvamVjdCwgb3JtOiBEYXRhYmFzZU9ybSk6IHN0cmluZyB7XG4gIGlmIChvcm0gPT09ICdwcmlzbWEnKSByZXR1cm4gYCR7cHJvamVjdC5wcmlzbWFEaXJOYW1lfS9yZXN0b3JlZC5zcWxpdGUzYDtcbiAgcmV0dXJuICdkcml6emxlL3Jlc3RvcmVkLnNxbGl0ZTMnO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtRGJQYXRoKHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0pOiBzdHJpbmcge1xuICBpZiAob3JtID09PSAncHJpc21hJykge1xuICAgIHJldHVybiBgJHtwcm9qZWN0LnByaXNtYURpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3YiBkYiBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcgZm9yIERyaXp6bGUgcmVxdWlyZXMgZmlsZTogREFUQUJBU0VfVVJMLicpO1xuICB9XG4gIHJldHVybiBkYlBhdGg7XG59XG5cbmludGVyZmFjZSBEYXRhYmFzZU9ybVByb2plY3Qge1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBvcm06IERhdGFiYXNlT3JtO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcm0/OiBEYXRhYmFzZU9ybSk6IFByb21pc2U8RGF0YWJhc2VPcm1Qcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuZGVzY2VuZGFudHNcbiAgICAubWFwKChwcm9qZWN0KSA9PiAocHJvamVjdC5kYXRhYmFzZU9ybSA/IHsgcHJvamVjdCwgb3JtOiBwcm9qZWN0LmRhdGFiYXNlT3JtIH0gOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoKHByb2plY3QpOiBwcm9qZWN0IGlzIERhdGFiYXNlT3JtUHJvamVjdCA9PiAhIXByb2plY3QgJiYgKCFvcm0gfHwgcHJvamVjdC5vcm0gPT09IG9ybSkpO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQob3JtID8gYE5vICR7b3JtfSBwcm9qZWN0IGZvdW5kLmAgOiAnTm8gc3VwcG9ydGVkIGRhdGFiYXNlIE9STSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtOiBEYXRhYmFzZU9ybSk6IHR5cGVvZiBwcmlzbWFTY3JpcHRzIHwgdHlwZW9mIGRyaXp6bGVTY3JpcHRzIHtcbiAgcmV0dXJuIG9ybSA9PT0gJ3ByaXNtYScgPyBwcmlzbWFTY3JpcHRzIDogZHJpenpsZVNjcmlwdHM7XG59XG5cbmZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgY29tbWFuZE5hbWU6IHN0cmluZyxcbiAgcHJvamVjdHM6IERhdGFiYXNlT3JtUHJvamVjdFtdXG4pOiBHZW5lcmF0b3I8RGF0YWJhc2VPcm1Qcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGNvbnN0IG9ybVByb2plY3RCeVByb2plY3QgPSBuZXcgTWFwKHByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gW3Byb2plY3QucHJvamVjdCwgcHJvamVjdF0pKTtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChcbiAgICBjb21tYW5kTmFtZSxcbiAgICBwcm9qZWN0cy5tYXAoKHsgcHJvamVjdCB9KSA9PiBwcm9qZWN0KVxuICApKSB7XG4gICAgY29uc3Qgb3JtUHJvamVjdCA9IG9ybVByb2plY3RCeVByb2plY3QuZ2V0KHByb2plY3QpO1xuICAgIGlmICghb3JtUHJvamVjdCkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGV0ZWN0IGRhdGFiYXNlIE9STSBmb3IgJHtwcm9qZWN0Lm5hbWV9LmApO1xuXG4gICAgeWllbGQgb3JtUHJvamVjdDtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgdW5rbm93biBvcHRpb25zIGZyb20gYXJndiB0byBwYXNzIHRvIE9STSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnLS0nLFxuICAgICdfJyxcbiAgICAnJDAnLFxuICBdKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcmd2KSkge1xuICAgIGlmICghYWxsS25vd25PcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9ucyBvZiBrZWJhYi1jYXNlIG9wdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRpb25cbiAgICAgIC8vIElmIHdlIGhhdmUgYm90aCAnY3JlYXRlLW9ubHknIGFuZCAnY3JlYXRlT25seScsIHByZWZlciB0aGUga2ViYWItY2FzZSB2ZXJzaW9uXG4gICAgICBjb25zdCBrZWJhYkNhc2VLZXkgPSBrZXkucmVwbGFjZUFsbCgvW0EtWl0vZywgKG1hdGNoKSA9PiBgLSR7bWF0Y2gudG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgIGlmIChrZWJhYkNhc2VLZXkgIT09IGtleSAmJiBhcmd2W2tlYmFiQ2FzZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbiBpZiBrZWJhYi1jYXNlIGV4aXN0c1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiBmbGFnc1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbHVlKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgc3RyaW5nL251bWJlciB2YWx1ZXNcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGFycmF5c1xuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcoaXRlbSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFzc3Rocm91Z2hBcmdzID0gQXJyYXkuaXNBcnJheShhcmd2WyctLSddKSA/IGFyZ3ZbJy0tJ10ubWFwKFN0cmluZykgOiBbXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi51bmtub3duT3B0aW9ucywgLi4ucGFzc3Rocm91Z2hBcmdzXSk7XG59XG4iLCJpbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsIHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc2VsZWN0Rm5veFNvdXJjZWRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvZW52U291cmNlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG4vLyBSYWlsd2F5IGluamVjdHMgaXRzIG93biBzeXN0ZW0gdmFyaWFibGVzIGFuZCBwbGF0Zm9ybS1tYW5hZ2VkIHZhbHVlczsgbmV2ZXIgbWlycm9yIHRob3NlIGJhY2ssXG4vLyBhbmQgc2tpcCBsb2NhbC1vbmx5IGtleXMuIEFwcCB2YXJpYWJsZXMgKGluY2x1ZGluZyBEQVRBQkFTRV9VUkwsIFBPUlQpIHN0YXkgZWxpZ2libGUgYmVjYXVzZVxuLy8gZm5veCBpcyB0aGUgc291cmNlIG9mIHRydXRoIOKAlCBhIHJlcG8gdGhhdCBtdXN0IE5PVCBvd24gYSB2YWx1ZSAoZS5nLiBhIFJhaWx3YXkgcmVmZXJlbmNlXG4vLyB2YXJpYWJsZSBwb2ludGluZyBhdCBhIGxpbmtlZCBkYXRhYmFzZSBzZXJ2aWNlKSBzaW1wbHkga2VlcHMgaXQgb3V0IG9mIGZub3guXG5jb25zdCBOT05fUkFJTFdBWV9LRVlTID0gbmV3IFNldChbJ0NJJ10pO1xuY29uc3QgTk9OX1JBSUxXQVlfS0VZX1BSRUZJWEVTID0gWydSQUlMV0FZXycsICdOSVhQQUNLU18nXTtcblxuZnVuY3Rpb24gaXNOb25SYWlsd2F5S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBOT05fUkFJTFdBWV9LRVlTLmhhcyhrZXkpIHx8IE5PTl9SQUlMV0FZX0tFWV9QUkVGSVhFUy5zb21lKChwcmVmaXgpID0+IGtleS5zdGFydHNXaXRoKHByZWZpeCkpO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIHZhcmlhYmxlcyB0byBwdXNoIHRvIFJhaWx3YXkgZnJvbSBhIHJlc29sdmVkIGVudmlyb25tZW50OiBkcm9wIGVtcHR5L3VuZGVmaW5lZCB2YWx1ZXNcbiAqIChzbyBhIGBLRVk9YCBwbGFjZWhvbGRlciBuZXZlciBibGFua3MgYSByZWFsIFJhaWx3YXkgdmFyaWFibGUpIGFuZCBSYWlsd2F5LW1hbmFnZWQga2V5cywgc29ydGVkXG4gKiBmb3IgYSBzdGFibGUgY29tbWFuZCBhbmQgbG9nIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RSYWlsd2F5VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBbc3RyaW5nLCBzdHJpbmddW10ge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZW52VmFycylcbiAgICAuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIFtzdHJpbmcsIHN0cmluZ10gPT4ge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSAhPT0gJycgJiYgIWlzTm9uUmFpbHdheUtleShrZXkpO1xuICAgIH0pXG4gICAgLnRvU29ydGVkKChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbn1cblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xudHlwZSBSYWlsd2F5RW52Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8UmFpbHdheUVudkNvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHJhaWx3YXlFbnZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdyYWlsd2F5LWVudicsXG4gIGRlc2NyaWJlOlxuICAgICdTeW5jIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVjbGFyZWQgZm9yIHRoZSBjdXJyZW50IFdCX0VOViAocmVzb2x2ZWQgZnJvbSBmbm94KSB0byB0aGUgUmFpbHdheSBzZXJ2aWNlLCBrZWVwaW5nIGZub3ggdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGguIFJhaWx3YXktbWFuYWdlZCBrZXlzIChSQUlMV0FZXyosIE5JWFBBQ0tTXyosIENJKSBhcmUgbmV2ZXIgcHVzaGVkLicsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4geWFyZ3MgYXMgdW5rbm93biBhcyBBcmd2PFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndjogUmFpbHdheUVudkNvbW1hbmRBcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgZW52TmFtZSA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBpZiAoIWVudk5hbWUgfHwgZW52TmFtZSA9PT0gJ2RldmVsb3BtZW50JyB8fCBlbnZOYW1lID09PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgV0JfRU5WIG11c3QgbmFtZSBhIGRlcGxveSBlbnZpcm9ubWVudCAoZS5nLiBzdGFnaW5nIG9yIHByb2R1Y3Rpb24pLCBidXQgaXMgJHtlbnZOYW1lfS5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBSZXN0cmljdCB0byB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhlIHByb2plY3QncyBmbm94IHNvdXJjZXM7IGlnbm9yZSBwcm9jZXNzLmVudiBzb1xuICAgIC8vIFJhaWx3YXkncyBvd24gaW5qZWN0ZWQgdmFyaWFibGVzIG5ldmVyIGxlYWsgaW4uIFRoZSBlZmZlY3RpdmUgdmFsdWVzIGNvbWUgZnJvbSBwcm9qZWN0LmVudlxuICAgIC8vIChmbm94LXJlc29sdmVkIGZvciBXQl9FTlYpLiBNaXJyb3JzIHdiIGRlcGxveS5cbiAgICBjb25zdCBbZW52VmFycywgZW52U291cmNlc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gYG1pc2UgZW52YCBpcyByZXBvcnRlZCBhcyBhIHBzZXVkby1zb3VyY2UgdGhhdCBtaXhlcyBpbiBob3N0L3Rvb2wgdmFyaWFibGVzIHN1Y2ggYXMgUEFUSCBhbmRcbiAgICAvLyBDQVJHT19IT01FOyB0aG9zZSBtdXN0IG5ldmVyIGJlIHB1c2hlZCB0byBSYWlsd2F5LCBzbyBrZWVwIG9ubHkgZm5veC1kZWNsYXJlZCBrZXlzLlxuICAgIGNvbnN0IGZub3hLZXlzID0gc2VsZWN0Rm5veFNvdXJjZWRLZXlzKGVudlNvdXJjZXMpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgICBpZiAoIWZub3hLZXlzLmhhcyhrZXkpKSBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgICAvLyBFeHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2luIG92ZXIgY29uZmlndXJlZCB2YWx1ZXMgKG1hdGNoZXMgd2IgZGVwbG95IC8gZ2VuLWRldi12YXJzKS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlICE9PSB1bmRlZmluZWQpIGVudlZhcnNba2V5XSA9IGVmZmVjdGl2ZVZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJpZXMgPSBzZWxlY3RSYWlsd2F5VmFyaWFibGVzKGVudlZhcnMpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnTm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHN5bmMgdG8gUmFpbHdheS4nKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5TmFtZXMgPSBlbnRyaWVzLm1hcCgoW2tleV0pID0+IGtleSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oYFdvdWxkIHN5bmMgJHtlbnRyaWVzLmxlbmd0aH0gdmFyaWFibGUocykgdG8gUmFpbHdheSAoJHtlbnZOYW1lfSk6ICR7a2V5TmFtZXMuam9pbignLCAnKX1gKVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgUmFpbHdheSBDTEkgcmVhZHMgYXV0aCAoUkFJTFdBWV9BUElfVE9LRU4pIGFuZCBkZWZhdWx0cyBmcm9tIHRoZSBlbnZpcm9ubWVudDsgcGFzcyB0aGVcbiAgICAvLyBwcm9qZWN0L3NlcnZpY2UvZW52aXJvbm1lbnQgZXhwbGljaXRseSB3aGVuIGF2YWlsYWJsZSBzbyB0aGUgY29tbWFuZCB3b3JrcyB1bmF0dGVuZGVkIGluIENJLlxuICAgIGNvbnN0IGNvbnRleHRBcmdzOiBzdHJpbmdbXSA9IFsnLS1za2lwLWRlcGxveXMnXTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuUkFJTFdBWV9QUk9KRUNUX0lEKSBjb250ZXh0QXJncy5wdXNoKGAtLXByb2plY3Q9JHtwcm9jZXNzLmVudi5SQUlMV0FZX1BST0pFQ1RfSUR9YCk7XG4gICAgaWYgKHByb2Nlc3MuZW52LlJBSUxXQVlfU0VSVklDRV9JRCkgY29udGV4dEFyZ3MucHVzaChgLS1zZXJ2aWNlPSR7cHJvY2Vzcy5lbnYuUkFJTFdBWV9TRVJWSUNFX0lEfWApO1xuICAgIGNvbnRleHRBcmdzLnB1c2goYC0tZW52aXJvbm1lbnQ9JHtlbnZOYW1lfWApO1xuICAgIGNvbnN0IHNldEFyZ3MgPSBlbnRyaWVzLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4gWyctLXNldCcsIGAke2tleX09JHt2YWx1ZX1gXSk7XG5cbiAgICAvLyBzdGRpbzogJ3BpcGUnIGtlZXBzIHRoZSBSYWlsd2F5IENMSSdzIHZhcmlhYmxlIGxpc3RpbmcgKHdoaWNoIGVjaG9lcyB2YWx1ZXMpIG91dCBvZiBDSSBsb2dzO1xuICAgIC8vIHRoaXMgY29tbWFuZCBvbmx5IGV2ZXIgcHJpbnRzIGtleSBuYW1lcywgbmV2ZXIgdmFsdWVzLlxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMoJ2J1bngnLCBbJ0ByYWlsd2F5L2NsaScsICd2YXJpYWJsZXMnLCAuLi5jb250ZXh0QXJncywgLi4uc2V0QXJnc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoYEZhaWxlZCB0byBzeW5jIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBSYWlsd2F5IChleGl0ICR7cmV0LnN0YXR1c30pLiBLZXlzOiAke2tleU5hbWVzLmpvaW4oJywgJyl9YClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQocmV0LnN0YXR1cyA/PyAxKTtcbiAgICB9XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTeW5jZWQgJHtlbnRyaWVzLmxlbmd0aH0gdmFyaWFibGUocykgdG8gUmFpbHdheSAoJHtlbnZOYW1lfSk6ICR7a2V5TmFtZXMuam9pbignLCAnKX1gKSk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cywgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoIH0gZnJvbSAnLi4vdXRpbHMvYmluUGF0aC5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG50eXBlIFJlbGVhc2VBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gIGFyZ3M/OiB1bmtub3duW107XG4gICctLSc/OiB1bmtub3duW107XG59O1xuXG5leHBvcnQgY29uc3QgcmVsZWFzZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdyZWxlYXNlIFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgJ1J1biBzZW1hbnRpYy1yZWxlYXNlIChvciBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlKSBzbyB0aGF0IHJlcG9zaXRvcmllcyB1c2luZyBCdW4gaXNvbGF0ZWQgaW5zdGFsbHMgY2FuIHB1Ymxpc2ggdG8gbnBtOiAnICtcbiAgICBcInJlaW5zdGFsbCB3aXRoIHRoZSBob2lzdGVkIGxpbmtlciAobnBtIGNhbm5vdCB3YWxrIEJ1bidzIGlzb2xhdGVkIG5vZGVfbW9kdWxlcyBsYXlvdXQpLCBcIiArXG4gICAgJ3Jld3JpdGUgYHdvcmtzcGFjZTpgIHJhbmdlcyBucG0gY2Fubm90IHBhcnNlLCBydW4gdGhlIHJlbGVhc2UsIHRoZW4gcmVzdG9yZSB0aGUgbW9kaWZpZWQgZmlsZXMuICcgK1xuICAgICdFeHRyYSBhcmd1bWVudHMgKGUuZy4gYC0tZGVidWdgLCBhZnRlciBgLS1gKSBhcmUgZm9yd2FyZGVkIHRvIHRoZSByZWxlYXNlIGNvbW1hbmQuJyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PiB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCByZWxlYXNlKGFyZ3YgYXMgUmVsZWFzZUFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2UoYXJndjogUmVsZWFzZUFyZ3YsIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICAvLyBzZW1hbnRpYy1yZWxlYXNlIG11c3QgcnVuIGF0IHRoZSByZXBvc2l0b3J5IHJvb3Q6IGl0IHJlYWRzIHRoZSBnaXQgcmVwbyBhbmQsIGZvciBtb25vcmVwb3MsXG4gIC8vIG11bHRpLXNlbWFudGljLXJlbGVhc2Ugd2Fsa3MgdGhlIHdvcmtzcGFjZXMgaXRzZWxmLlxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMucm9vdDtcblxuICAvLyBNYXBzIGEgbXV0YXRlZCBmaWxlIHRvIGl0cyBwcmUtcmVsZWFzZSBjb250ZW50IChyYXcgYnl0ZXMg4oCUIGJ1bi5sb2NrYiBpcyBiaW5hcnkpOyBgdW5kZWZpbmVkYFxuICAvLyBtYXJrcyBhIGZpbGUgdGhhdCBkaWQgbm90IGV4aXN0IGFuZCBtdXN0IGJlIGRlbGV0ZWQgb24gcmVzdG9yZSAoZS5nLiBhIGNyZWF0ZWQgbG9ja2ZpbGUpLlxuICBjb25zdCBtb2RpZmllZEZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIEJ1ZmZlciB8IHVuZGVmaW5lZD4oKTtcbiAgLy8gV2l0aCBhIGhhbmRsZXIgaW5zdGFsbGVkLCBTSUdJTlQvU0lHVEVSTSBubyBsb25nZXIgdGVybWluYXRlIHRoaXMgcHJvY2Vzcywgc28gdGhlXG4gIC8vIGZpbmFsbHktcmVzdG9yZSBhbHdheXMgZXhlY3V0ZXMgYW5kIHRoZSBzaWduYWwgaXMgcmUtcmFpc2VkIGFmdGVyd2FyZHMuIFRoZSBoYW5kbGVyIGFsc29cbiAgLy8gRk9SV0FSRFMgdGhlIHNpZ25hbCB0byB0aGUgcnVubmluZyBjaGlsZDogY2hpbGRyZW4gYXJlIHNwYXduZWQgYXN5bmNocm9ub3VzbHkgKG5ldmVyXG4gIC8vIHNwYXduU3luYywgd2hpY2ggd291bGQgYmxvY2sgdGhlIGV2ZW50IGxvb3AgYW5kIGRlZmVyIHRoZSBoYW5kbGVyIHVudGlsIGFmdGVyIHRoZSBjaGlsZCDigJRcbiAgLy8gYW5kIGEgcHVibGlzaCDigJQgY29tcGxldGVkKSwgc28gYSBzaWduYWwgdGFyZ2V0ZWQgYXQgdGhpcyBwcm9jZXNzIGFsb25lIHN0aWxsIGNhbmNlbHMgdGhlXG4gIC8vIGNoaWxkIHByb21wdGx5LlxuICBsZXQgcmVjZWl2ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBjb25zdCBhY3RpdmVDaGlsZDogQWN0aXZlQ2hpbGRSZWYgPSB7IGN1cnJlbnQ6IHVuZGVmaW5lZCB9O1xuICBjb25zdCBzaWduYWxIYW5kbGVyID0gKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkID0+IHtcbiAgICByZWNlaXZlZFNpZ25hbCA9IHNpZ25hbDtcbiAgICAvLyB0cmVlS2lsbCAobm90IGNoaWxkLmtpbGwpOiBzZW1hbnRpYy1yZWxlYXNlIGFuZCBidW4gaW5zdGFsbCBzcGF3biB0aGVpciBvd24gc3VicHJvY2Vzc2VzXG4gICAgLy8gKG5wbSBwdWJsaXNoLCBnaXQgcHVzaCwgLi4uKSwgd2hpY2ggbXVzdCBub3Qga2VlcCBwdWJsaXNoaW5nIGFmdGVyIHdiIHJlcG9ydHMgY2FuY2VsbGF0aW9uLlxuICAgIC8vIHRyZWVLaWxsIFRIUk9XUyAobWlzc2luZy90aW1pbmctb3V0IGBwc2AsIEVQRVJNKSwgYW5kIGFuIGV4Y2VwdGlvbiBlc2NhcGluZyBhIHNpZ25hbFxuICAgIC8vIGxpc3RlbmVyIHdvdWxkIHRlcm1pbmF0ZSB0aGUgcHJvY2VzcyBhbmQgc2tpcCB0aGUgcmVzdG9yaW5nIGZpbmFsbHkg4oCUIHNvIGRlZ3JhZGUgdG9cbiAgICAvLyBraWxsaW5nIHRoZSBkaXJlY3QgY2hpbGQgaW5zdGVhZC5cbiAgICB0cnkge1xuICAgICAgaWYgKGFjdGl2ZUNoaWxkLmN1cnJlbnQ/LnBpZCkgdHJlZUtpbGwoYWN0aXZlQ2hpbGQuY3VycmVudC5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBGYWlsZWQgdG8gdGVybWluYXRlIHRoZSByZWxlYXNlIGNoaWxkIHByb2Nlc3MgdHJlZTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQ/LmtpbGwoc2lnbmFsKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGd1YXJkZWRTaWduYWxzOiBOb2RlSlMuU2lnbmFsc1tdID0gWydTSUdJTlQnLCAnU0lHVEVSTSddO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBndWFyZGVkU2lnbmFscykgcHJvY2Vzcy5vbihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuXG4gIGxldCBleGl0Q29kZSA9IDA7XG4gIGxldCByZWxlYXNlUmFuU3VjY2Vzc2Z1bGx5ID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IHJlbGVhc2VQdWJsaXNoZXNUb05wbShwcm9qZWN0KSkge1xuICAgICAgYXdhaXQgcHJlcGFyZU5wbUNvbXBhdGlibGVMYXlvdXQocHJvamVjdCwgYXJndiwgbW9kaWZpZWRGaWxlcywgYWN0aXZlQ2hpbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgaG9pc3RlZCByZWluc3RhbGwgYW5kIHdvcmtzcGFjZS1yYW5nZSByZXdyaXRlIGV4aXN0IHNvbGVseSBzbyBucG0gKHdoaWNoIHRoZVxuICAgICAgLy8gQHNlbWFudGljLXJlbGVhc2UvbnBtIHBsdWdpbiBzaGVsbHMgb3V0IHRvKSBjYW4gZGlnZXN0IHRoZSBjaGVja291dDsgd2l0aG91dCB0aGF0IHBsdWdpblxuICAgICAgLy8gdGhlIHJlbGVhc2UgcnVucyBkaXJlY3RseSBvbiB0aGUgaXNvbGF0ZWQgbGF5b3V0IChpc3N1ZSAjMTAwMCkuXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgJ1NraXBwaW5nIHRoZSBob2lzdGVkIHJlaW5zdGFsbCBiZWNhdXNlIHRoZSBzZW1hbnRpYy1yZWxlYXNlIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgaW5jbHVkZSBAc2VtYW50aWMtcmVsZWFzZS9ucG0uJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBBIHNpZ25hbCBtYXkgaGF2ZSBhcnJpdmVkIGJldHdlZW4gY2hpbGRyZW4gKG5vdGhpbmcgdG8gZm9yd2FyZCB0byBhdCB0aGF0IGluc3RhbnQpLCBzbyBpdFxuICAgIC8vIG11c3QgYmUgY2hlY2tlZCBleHBsaWNpdGx5IGJlZm9yZSBhbnl0aGluZyBwdWJsaXNoZXMuXG4gICAgaWYgKHJlY2VpdmVkU2lnbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFib3J0ZWQgYnkgJHtyZWNlaXZlZFNpZ25hbH0gYmVmb3JlIHJ1bm5pbmcgdGhlIHJlbGVhc2UuYCk7XG4gICAgfVxuICAgIGV4aXRDb2RlID0gYXdhaXQgcnVuU2VtYW50aWNSZWxlYXNlKHByb2plY3QsIGFyZ3YsIGFjdGl2ZUNoaWxkKTtcbiAgICAvLyBSZWNvcmRlZCBzZXBhcmF0ZWx5IGZyb20gcmVjZWl2ZWRTaWduYWw6IGEgc2lnbmFsIGFycml2aW5nIEFGVEVSIGEgc3VjY2Vzc2Z1bCBwdWJsaXNoIG11c3RcbiAgICAvLyBub3QgZGVtb3RlIHRoZSByZXN0b3JlIHRvIGJ5dGUtZm9yLWJ5dGUgKHRoYXQgd291bGQgcmV2ZXJ0IHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBidW1wcykuXG4gICAgcmVsZWFzZVJhblN1Y2Nlc3NmdWxseSA9IGV4aXRDb2RlID09PSAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEVycm9ycyBtdXN0IHVud2luZCB0aHJvdWdoIHRoaXMgdHJ5IChuZXZlciBgcHJvY2Vzcy5leGl0YCBpbnNpZGUgaXQpOiB0aGUgcmVzdG9yZSBiZWxvdyBpc1xuICAgIC8vIHRoZSBvbmx5IHRoaW5nIHRoYXQgdW5kb2VzIHRoZSBidW5maWcvcGFja2FnZS5qc29uIG11dGF0aW9ucy5cbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChTdHJpbmcoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcikpKTtcbiAgICBleGl0Q29kZSA9IDE7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gT24gZmFpbHVyZSBvciBpbnRlcnJ1cHRpb24sIHJlc3RvcmUgYnl0ZS1mb3ItYnl0ZTogc2VtYW50aWMtcmVsZWFzZSBtYXkgaGF2ZSBsZWZ0IFBBUlRJQUxcbiAgICAvLyBlZGl0cyAoZS5nLiBhIHZlcnNpb24gYnVtcCB3aXRob3V0IGEgcHVibGlzaCksIHdoaWNoIG11c3Qgbm90IHN1cnZpdmUuIFRoZSBzZW1hbnRpY1xuICAgIC8vIHdvcmtzcGFjZS1yYW5nZSByZXN0b3JlIGlzIHJlc2VydmVkIGZvciBhIHN1Y2Nlc3NmdWwgcmVsZWFzZS5cbiAgICBjb25zdCByZXN0b3JlZEZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgY29udGVudF0gb2YgbW9kaWZpZWRGaWxlcykge1xuICAgICAgaWYgKHJlc3RvcmVNb2RpZmllZEZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHJlbGVhc2VSYW5TdWNjZXNzZnVsbHkpKSByZXN0b3JlZEZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgaWYgKHJlc3RvcmVkRmlsZVBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihgUmVzdG9yZWQgJHtyZXN0b3JlZEZpbGVQYXRocy5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBwKSkuam9pbignLCAnKX0uYClcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIFRoZSBoaW50IGFwcGxpZXMgb25seSB3aGVuIHRoZSBob2lzdGVkIHJlaW5zdGFsbCBhY3R1YWxseSByYW47IGJ1bmZpZy50b21sIGlzIHNuYXBzaG90dGVkXG4gICAgLy8gZXhhY3RseSBpbiB0aGF0IGJyYW5jaC5cbiAgICBjb25zdCByZWluc3RhbGxlZFdpdGhIb2lzdGVkTGlua2VyID0gWy4uLm1vZGlmaWVkRmlsZXMua2V5cygpXS5zb21lKFxuICAgICAgKGZpbGVQYXRoKSA9PiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSA9PT0gJ2J1bmZpZy50b21sJ1xuICAgICk7XG4gICAgaWYgKHJlaW5zdGFsbGVkV2l0aEhvaXN0ZWRMaW5rZXIgJiYgIWlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAnbm9kZV9tb2R1bGVzIG5vdyB1c2VzIHRoZSBob2lzdGVkIGxheW91dDsgcnVuIGEgY2xlYW4gcmVpbnN0YWxsIChgcm0gLXJmIG5vZGVfbW9kdWxlcyBwYWNrYWdlcy8qL25vZGVfbW9kdWxlcyAmJiBidW4gaW5zdGFsbGApIHRvIHJlc3RvcmUgdGhlIGlzb2xhdGVkIGxheW91dC4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGd1YXJkZWRTaWduYWxzKSBwcm9jZXNzLm9mZihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICB9XG4gIGlmIChyZWNlaXZlZFNpZ25hbCkge1xuICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgcmVjZWl2ZWRTaWduYWwpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG59XG5cbmludGVyZmFjZSBBY3RpdmVDaGlsZFJlZiB7XG4gIGN1cnJlbnQ6IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNwYXduIGFzeW5jaHJvbm91c2x5IGFuZCBhd2FpdCB0aGUgZXhpdCBzdGF0dXMuIFRoZSBldmVudCBsb29wIHN0YXlzIGZyZWUsIHNvIHBhcmVudC1vbmx5XG4gKiBzaWduYWxzIGFyZSBoYW5kbGVkIHByb21wdGx5IGFuZCBmb3J3YXJkZWQgdG8gdGhlIGNoaWxkIGJ5IHJlbGVhc2UoKSdzIHNpZ25hbCBoYW5kbGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBzcGF3bkFuZFdhaXQoXG4gIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZixcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogY2hpbGRfcHJvY2Vzcy5TcGF3bk9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxudW1iZXI+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsIGFyZ3MsIG9wdGlvbnMpO1xuICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSBjaGlsZDtcbiAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChTdHJpbmcoZXJyb3IpKSk7XG4gICAgICByZXNvbHZlKDEpO1xuICAgIH0pO1xuICAgIGNoaWxkLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlKGNvZGUgPz8gMSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlbGVhc2UgY2FuIHB1Ymxpc2ggdG8gbnBtLiBUcnVlIHVubGVzcyBhIHBsdWdpbiBsaXN0IGlzIGV4cGxpY2l0bHkgY29uZmlndXJlZFxuICogKGluIGEgSlNPTi1wYXJzZWFibGUgc291cmNlKSBhbmQgb21pdHMgYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgZXZlcnl3aGVyZSBpbiBzY29wZSDigJQgdGhlIHJvb3RcbiAqIGFuZCwgZm9yIG11bHRpLXNlbWFudGljLXJlbGVhc2UgbW9ub3JlcG9zLCBlYWNoIHdvcmtzcGFjZSBwYWNrYWdlIChhIHBhY2thZ2UtbGV2ZWwgcGx1Z2luIGxpc3RcbiAqIG92ZXJyaWRlcyB0aGUgcm9vdCdzKS4gc2VtYW50aWMtcmVsZWFzZSdzIERFRkFVTFQgcGx1Z2luIGxpc3QgaW5jbHVkZXMgdGhlIG5wbSBwbHVnaW4sIHNvIGFcbiAqIG1pc3NpbmcgcGx1Z2luIGxpc3QsIGEgbm9uLUpTT04gY29uZmlnIGZpbGUsIG9yIGFuIGBleHRlbmRzYCBwcmVzZXQgY29uc2VydmF0aXZlbHkga2VlcHMgdGhlXG4gKiBucG0gcHJlcGFyYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxlYXNlUHVibGlzaGVzVG9OcG0oXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uJyB8ICd1c2VzQnVuUGFja2FnZU1hbmFnZXInPlxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHJvb3RQbHVnaW5zID0gcmVhZEV4cGxpY2l0U2VtYW50aWNSZWxlYXNlUGx1Z2lucyhwcm9qZWN0LmRpclBhdGgsIHByb2plY3QucGFja2FnZUpzb24pO1xuICAvLyBXaXRob3V0IGFuIGV4cGxpY2l0IHJvb3QgcGx1Z2luIGxpc3QsIHNlbWFudGljLXJlbGVhc2UncyBkZWZhdWx0IGxpc3QgKG5wbSBpbmNsdWRlZCkgYXBwbGllcy5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHJvb3RQbHVnaW5zKSB8fCBwbHVnaW5zSW5jbHVkZU5wbShyb290UGx1Z2lucykpIHJldHVybiB0cnVlO1xuXG4gIGZvciAoY29uc3QgcGFja2FnZURpclBhdGggb2YgYXdhaXQgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzKHByb2plY3QpKSB7XG4gICAgY29uc3QgcGx1Z2lucyA9IHJlYWRFeHBsaWNpdFNlbWFudGljUmVsZWFzZVBsdWdpbnMocGFja2FnZURpclBhdGgsIHVuZGVmaW5lZCk7XG4gICAgLy8gQSB3b3Jrc3BhY2UgcGFja2FnZSB3aXRob3V0IGl0cyBvd24gcGx1Z2luIGxpc3QgaW5oZXJpdHMgdGhlIHJvb3QncyAobnBtLWZyZWUpIGRlY2lzaW9uLlxuICAgIGlmIChwbHVnaW5zID09PSAndW5rbm93bicgfHwgKEFycmF5LmlzQXJyYXkocGx1Z2lucykgJiYgcGx1Z2luc0luY2x1ZGVOcG0ocGx1Z2lucykpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBsdWdpbnNJbmNsdWRlTnBtKHBsdWdpbnM6IHJlYWRvbmx5IHVua25vd25bXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGx1Z2lucy5zb21lKChwbHVnaW4pID0+IChBcnJheS5pc0FycmF5KHBsdWdpbikgPyBwbHVnaW5bMF0gOiBwbHVnaW4pID09PSAnQHNlbWFudGljLXJlbGVhc2UvbnBtJyk7XG59XG5cbi8qKlxuICogY29zbWljb25maWcgOSdzIGRlZmF1bHQgc2VhcmNoUGxhY2VzIG9yZGVyIGZvciBtb2R1bGUgXCJyZWxlYXNlXCIgKHdoYXQgc2VtYW50aWMtcmVsZWFzZSAyNVxuICogZGVsZWdhdGVzIHRvKSwgbWludXMgdGhlIGxlYWRpbmcgcGFja2FnZS5qc29uIGVudHJ5LCB3aGljaCB0aGUgY2FsbGVyIGNoZWNrcyBmaXJzdC4gVGhlIEZJUlNUXG4gKiBleGlzdGluZyBwbGFjZSB3aW5zOyBwbGFjZXMgd2hvc2UgZm9ybWF0IEpTT04ucGFyc2UgY2Fubm90IHJlYWQgbWFrZSB0aGUgZWZmZWN0aXZlIHBsdWdpblxuICogbGlzdCAndW5rbm93bicuXG4gKi9cbmNvbnN0IHNlbWFudGljUmVsZWFzZUNvbmZpZ1NlYXJjaFBsYWNlczogeyBmaWxlTmFtZTogc3RyaW5nOyBqc29uUGFyc2VhYmxlOiBib29sZWFuIH1bXSA9IFtcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMnLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzb24nLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnlhbWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy55bWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnRzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMubWpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuY2pzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjJywganNvblBhcnNlYWJsZTogdHJ1ZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMuanNvbicsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLnlhbWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMueW1sJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLnRzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLm1qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcuY29uZmlnL3JlbGVhc2VyYy5janMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcuanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcudHMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcubWpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJ3JlbGVhc2UuY29uZmlnLmNqcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG5dO1xuXG5mdW5jdGlvbiByZWFkRXhwbGljaXRTZW1hbnRpY1JlbGVhc2VQbHVnaW5zKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZFxuKTogcmVhZG9ubHkgdW5rbm93bltdIHwgdW5kZWZpbmVkIHwgJ3Vua25vd24nIHtcbiAgLy8gY29zbWljb25maWcgc2VhcmNoZXMgcGFja2FnZS5qc29uJ3MgYHJlbGVhc2VgIGtleSBCRUZPUkUgYW55IHJjL2NvbmZpZyBmaWxlOyBhIG1pc3Npbmcgb3JcbiAgLy8gdW5yZWFkYWJsZSBwYWNrYWdlLmpzb24ganVzdCBmYWxscyB0aHJvdWdoIHRvIHRoZSBmaWxlIHNlYXJjaCBwbGFjZXMuXG4gIGlmIChwYWNrYWdlSnNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgfSBjYXRjaCB7XG4gICAgICBwYWNrYWdlSnNvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgbGV0IGNvbmZpZyA9IChwYWNrYWdlSnNvbiBhcyB7IHJlbGVhc2U/OiB7IHBsdWdpbnM/OiB1bmtub3duOyBleHRlbmRzPzogdW5rbm93biB9IH0gfCB1bmRlZmluZWQpPy5yZWxlYXNlO1xuICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHsgZmlsZU5hbWUsIGpzb25QYXJzZWFibGUgfSBvZiBzZW1hbnRpY1JlbGVhc2VDb25maWdTZWFyY2hQbGFjZXMpIHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSBjb250aW51ZTtcbiAgICAgIGlmICghanNvblBhcnNlYWJsZSkgcmV0dXJuICd1bmtub3duJztcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpIGFzIHR5cGVvZiBjb25maWc7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuICd1bmtub3duJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoIWNvbmZpZyB8fCB0eXBlb2YgY29uZmlnICE9PSAnb2JqZWN0JykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLnBsdWdpbnMpKSByZXR1cm4gY29uZmlnLnBsdWdpbnM7XG4gIC8vIEFuIGBleHRlbmRzYCBwcmVzZXQgbWF5IGNvbnRyaWJ1dGUgaXRzIG93biBwbHVnaW4gbGlzdCwgd2hpY2ggY2Fubm90IGJlIHJlc29sdmVkIHN0YXRpY2FsbHkuXG4gIHJldHVybiBjb25maWcuZXh0ZW5kcyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogJ3Vua25vd24nO1xufVxuXG4vKipcbiAqIE1ha2UgdGhlIGNoZWNrb3V0IGRpZ2VzdGlibGUgZm9yIG5wbSwgd2hpY2ggc2VtYW50aWMtcmVsZWFzZSdzIG5wbSBwbHVnaW4gc2hlbGxzIG91dCB0byBmb3JcbiAqIGBucG0gdmVyc2lvbmAgLyBgbnBtIHB1Ymxpc2hgOlxuICogMS4gbnBtJ3MgYXJib3Jpc3QgY2Fubm90IHdhbGsgQnVuJ3MgSVNPTEFURUQgbm9kZV9tb2R1bGVzIGxheW91dCAodGhlIGAuYnVuYCBzeW1saW5rIGZhcm0pLCBzb1xuICogICAgY2xlYW4tcmVpbnN0YWxsIHdpdGggdGhlIGhvaXN0ZWQgbGlua2VyIGZpcnN0LiBBIG5vbi1jbGVhbiBsaW5rZXIgc3dpdGNoIHdvdWxkIGxlYXZlIHN0YWxlXG4gKiAgICBnbG9iYWwtc3RvcmUgc3ltbGlua3MgYmVoaW5kIChwYWNrYWdlcyB0aGVuIHJlc29sdmUgZnJvbSB+Ly5idW4vaW5zdGFsbC9jYWNoZS9saW5rcyB3aGVyZVxuICogICAgcGhhbnRvbSBkZXBlbmRlbmNpZXMgYXJlIHVucmVhY2hhYmxlKSwgc28gZXZlcnkgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBpcyB3aXBlZCBmaXJzdC5cbiAqIDIuIG5wbSBjYW5ub3QgcGFyc2UgYHdvcmtzcGFjZTpgIHNwZWNpZmllcnMsIHdoaWxlIEJ1biBSRVFVSVJFUyB0aGUgcHJvdG9jb2wgc28gYSBjb2xkIGluc3RhbGxcbiAqICAgIGxpbmtzIHRoZSB3b3Jrc3BhY2Ug4oCUIHNvIHJld3JpdGUgdGhlIHJhbmdlcyB0byBgKmAgQUZURVIgdGhlIHJlaW5zdGFsbCAoQnVuIG11c3Qgc3RpbGwgc2VlXG4gKiAgICB0aGUgcHJvdG9jb2wgd2hpbGUgaW5zdGFsbGluZzsgbnBtIG9ubHkgbmVlZHMgdGhlIG1hbmlmZXN0IFRFWFQgdG8gYmUgcGFyc2VhYmxlKS4gVGhlXG4gKiAgICBhZmZlY3RlZCBtYW5pZmVzdHMgYXJlIHByaXZhdGUvdW5wdWJsaXNoZWQgb3IgcmV3cml0dGVuIGJ5IHRoZSBucG0gcGx1Z2luIG9uIHB1Ymxpc2guXG4gKiBBbGwgbXV0YXRpb25zIGFyZSByZXN0b3JlZCBieSB0aGUgY2FsbGVyIGFmdGVyIHRoZSByZWxlYXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBwcmVwYXJlTnBtQ29tcGF0aWJsZUxheW91dChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUmVsZWFzZUFyZ3YsXG4gIG1vZGlmaWVkRmlsZXM6IE1hcDxzdHJpbmcsIEJ1ZmZlciB8IHVuZGVmaW5lZD4sXG4gIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJ1bmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgY29uc3QgYnVuZmlnID0gZnMuZXhpc3RzU3luYyhidW5maWdQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhidW5maWdQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICBjb25zdCBob2lzdGVkQnVuZmlnID0gYnVuZmlnID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBidWlsZEhvaXN0ZWRCdW5maWcoYnVuZmlnKTtcbiAgaWYgKGJ1bmZpZyAhPT0gdW5kZWZpbmVkICYmIGhvaXN0ZWRCdW5maWcgIT09IGJ1bmZpZykge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKCdDbGVhbi1yZWluc3RhbGxpbmcgd2l0aCB0aGUgaG9pc3RlZCBsaW5rZXIgc28gbnBtIGNhbiB3YWxrIG5vZGVfbW9kdWxlcy4uLicpKTtcbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICBtb2RpZmllZEZpbGVzLnNldChidW5maWdQYXRoLCBCdWZmZXIuZnJvbShidW5maWcsICd1dGY4JykpO1xuICAgICAgLy8gVGhlIGhvaXN0ZWQgcmVpbnN0YWxsIG1heSByZXdyaXRlIChvciBjcmVhdGUpIHRoZSBsb2NrZmlsZTsgc25hcHNob3QgdGhlIHJhdyBieXRlcyBzbyBhXG4gICAgICAvLyBzdWNjZXNzZnVsIHJlbGVhc2UgbGVhdmVzIG5vIHRyYWNrZWQgb3IgdW50cmFja2VkIGxvY2tmaWxlIGNoYW5nZXMgYmVoaW5kLlxuICAgICAgZm9yIChjb25zdCBsb2NrRmlsZU5hbWUgb2YgWydidW4ubG9jaycsICdidW4ubG9ja2InXSkge1xuICAgICAgICBjb25zdCBsb2NrRmlsZVBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBsb2NrRmlsZU5hbWUpO1xuICAgICAgICBtb2RpZmllZEZpbGVzLnNldChsb2NrRmlsZVBhdGgsIGZzLmV4aXN0c1N5bmMobG9ja0ZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhsb2NrRmlsZVBhdGgpIDogdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoYnVuZmlnUGF0aCwgaG9pc3RlZEJ1bmZpZyA/PyAnJywgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5vZGVNb2R1bGVzRGlyUGF0aHMgPSBbcHJvamVjdC5kaXJQYXRoLCAuLi4oYXdhaXQgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzKHByb2plY3QpKV0ubWFwKChkaXJQYXRoKSA9PlxuICAgICAgICBwYXRoLmpvaW4oZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycpXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBub2RlTW9kdWxlc0RpclBhdGggb2Ygbm9kZU1vZHVsZXNEaXJQYXRocykge1xuICAgICAgICBmcy5ybVN5bmMobm9kZU1vZHVsZXNEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICAvLyBSZXNvbHZlIGFuZCBkb3dubG9hZCB3aXRoIGxpZmVjeWNsZSBzY3JpcHRzIERJU0FCTEVEIHdoaWxlIHRoZSByZWxlYXNlIGNyZWRlbnRpYWxzXG4gICAgICAvLyAoVkVSREFDQ0lPX1RPS0VOLCBOUE1fVE9LRU4sIEdJVEhVQl9UT0tFTiwgRk5PWF9BR0VfS0VZLCAuLi4pIGFyZSBpbiB0aGUgZW52aXJvbm1lbnQsXG4gICAgICAvLyBzbyByZXBvc2l0b3J5LSBvciBkZXBlbmRlbmN5LWRlZmluZWQgcHJlaW5zdGFsbC9wb3N0aW5zdGFsbCBjYW4gbmV2ZXIgcmVhZCB0aGVtIOKAlFxuICAgICAgLy8gbWlycm9yaW5nIHJldXNhYmxlLXdvcmtmbG93cycgdHdvLXN0ZXAgcmVsZWFzZSBpbnN0YWxsIChpc3N1ZSAjMTAwMykuXG4gICAgICBjb25zdCBpbnN0YWxsU3RhdHVzID0gYXdhaXQgc3Bhd25BbmRXYWl0KGFjdGl2ZUNoaWxkLCAnYnVuJywgWydpbnN0YWxsJywgJy0taWdub3JlLXNjcmlwdHMnXSwge1xuICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgaWYgKGluc3RhbGxTdGF0dXMgIT09IDApIHtcbiAgICAgICAgLy8gVGhyb3dpbmcgKGluc3RlYWQgb2YgcHJvY2Vzcy5leGl0LCB3aGljaCB3b3VsZCBza2lwIHRoZSBjYWxsZXIncyBmaW5hbGx5KSBsZXRzIHRoZVxuICAgICAgICAvLyByZXN0b3JlIHJ1biBiZWZvcmUgdGhlIHByb2Nlc3MgdGVybWluYXRlcy5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdidW4gaW5zdGFsbCBmYWlsZWQgd2hpbGUgcHJlcGFyaW5nIHRoZSByZWxlYXNlLicpO1xuICAgICAgfVxuICAgICAgLy8gUmVwbGF5IHRoZSBza2lwcGVkIGxpZmVjeWNsZSBzY3JpcHRzIGluIGEgY3JlZGVudGlhbC1zY3J1YmJlZCBlbnZpcm9ubWVudC4gQSByZXBlYXRlZFxuICAgICAgLy8gYGJ1biBpbnN0YWxsYCBpcyBhIG5vLW9wIHRoYXQgZG9lcyBub3QgcmVwbGF5IHRoZW0sIHNvIG5vZGVfbW9kdWxlcyBpcyB3aXBlZCBhZ2FpbjtcbiAgICAgIC8vIGV2ZXJ5IHBhY2thZ2UgaXMgYWxyZWFkeSBpbiBidW4ncyBjYWNoZSBmcm9tIHRoZSBjcmVkZW50aWFsZWQgc3RlcCwgc28gdGhpcyByZS1saW5rXG4gICAgICAvLyBuZWVkcyBubyByZWdpc3RyeSBjcmVkZW50aWFscy5cbiAgICAgIGZvciAoY29uc3Qgbm9kZU1vZHVsZXNEaXJQYXRoIG9mIG5vZGVNb2R1bGVzRGlyUGF0aHMpIHtcbiAgICAgICAgZnMucm1TeW5jKG5vZGVNb2R1bGVzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVwbGF5U3RhdHVzID0gYXdhaXQgc3Bhd25BbmRXYWl0KGFjdGl2ZUNoaWxkLCAnYnVuJywgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgIGVudjogYnVpbGRDcmVkZW50aWFsRnJlZUVudihwcm9qZWN0LmVudiksXG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXBsYXlTdGF0dXMgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdidW4gaW5zdGFsbCBmYWlsZWQgd2hpbGUgcmVwbGF5aW5nIGxpZmVjeWNsZSBzY3JpcHRzIGZvciB0aGUgcmVsZWFzZS4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB3b3Jrc3BhY2VQYWNrYWdlRGlycyA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyhwcm9qZWN0KTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgW1xuICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoLFxuICAgIC4uLndvcmtzcGFjZVBhY2thZ2VEaXJzLm1hcCgoZGlyUGF0aCkgPT4gcGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gIF0pIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgY29udGludWU7XG5cbiAgICBjb25zdCBvcmlnaW5hbCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgLy8gU25hcHNob3QgRVZFUlkgbWFuaWZlc3QgKG5vdCBvbmx5IHJld3JpdHRlbiBvbmVzKTogc2VtYW50aWMtcmVsZWFzZSBhbHNvIGVkaXRzIG1hbmlmZXN0c1xuICAgIC8vIHdpdGhvdXQgd29ya3NwYWNlOiByYW5nZXMgKHZlcnNpb24gYnVtcHMpLCBhbmQgYSBmYWlsZWQgcmVsZWFzZSBtdXN0IHJlc3RvcmUgdGhvc2UgdG9vLlxuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIG1vZGlmaWVkRmlsZXMuc2V0KHBhY2thZ2VKc29uUGF0aCwgQnVmZmVyLmZyb20ob3JpZ2luYWwsICd1dGY4JykpO1xuICAgIH1cbiAgICBjb25zdCByZXdyaXR0ZW4gPSByZXdyaXRlV29ya3NwYWNlUmFuZ2VzKG9yaWdpbmFsKTtcbiAgICBpZiAocmV3cml0dGVuID09PSBvcmlnaW5hbCkgY29udGludWU7XG5cbiAgICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgUmV3cml0aW5nIHdvcmtzcGFjZTogcmFuZ2VzIGluICR7cGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIHBhY2thZ2VKc29uUGF0aCl9Li4uYCkpO1xuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCByZXdyaXR0ZW4sICd1dGY4Jyk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBjcmVkZW50aWFscyB0aGUgcmVsZWFzZSB3b3JrZmxvdyBpbmplY3RzIChjZi4gcmV1c2FibGUtd29ya2Zsb3dzJyByZWxlYXNlLnltbCBzZWNyZXRzIGFuZFxuLy8gbnBtJ3Mgb3duIHRva2VuIHZhcmlhYmxlcykuIFRoZSByZWxlYXNlIGNvbW1hbmQgbG9hZHMgdGhlIHByb2plY3Qgd2l0aCBsb2FkRW52OiBmYWxzZSwgc28gbm9cbi8vIHdiLWxvYWRlci1pbmplY3RlZCBrZXlzIGV4aXN0IHRvIHNjcnViIGJleW9uZCB0aGVzZS4gQSBkZW55bGlzdCAobm90IGFuIGFsbG93bGlzdCkgaXNcbi8vIGRlbGliZXJhdGU6IGluIHRoZSBzdXBwb3J0ZWQgZW50cnkgcG9pbnQg4oCUIHJldXNhYmxlLXdvcmtmbG93cycgcmVsZWFzZSBqb2Ig4oCUIHRoZXNlIGVudW1lcmF0ZWRcbi8vIHZhcmlhYmxlcyBhcmUgdGhlIE9OTFkgc2VjcmV0cyBpbiB0aGUgYW1iaWVudCBlbnZpcm9ubWVudCAoZm5veCBzZWNyZXRzIHN0YXkgZW5jcnlwdGVkIGJlY2F1c2Vcbi8vIEZOT1hfQUdFX0tFWSBpcyBzY3J1YmJlZCBhbmQgbmV2ZXIgZXhwb3J0ZWQgYXMgcGxhaW50ZXh0IHRoZXJlKSwgd2hpbGUgYW4gYWxsb3dsaXN0IHdvdWxkXG4vLyBicmVhayBsaWZlY3ljbGUgc2NyaXB0cyB0aGF0IGxlZ2l0aW1hdGVseSByZWFkIG9wZXJhdGlvbmFsIHZhcmlhYmxlcyAoUEFUSCwgSE9NRSwgQ0ksIC4uLikuXG4vLyBBIGxvY2FsIGB3YiByZWxlYXNlYCBpbmhlcml0cyB3aGF0ZXZlciB0aGUgZGV2ZWxvcGVyJ3Mgc2hlbGwgYWxyZWFkeSBleHBvc2VzIHRvIGV2ZXJ5XG4vLyBgYnVuIGluc3RhbGxgLCB3aGljaCB0aGlzIHJlcGxheSBkb2VzIG5vdCB3aWRlbi5cbmNvbnN0IGNyZWRlbnRpYWxFbnZWYXJOYW1lcyA9IFtcbiAgJ1ZFUkRBQ0NJT19UT0tFTicsXG4gICdOUE1fVE9LRU4nLFxuICAnTk9ERV9BVVRIX1RPS0VOJyxcbiAgJ0dJVEhVQl9UT0tFTicsXG4gICdHSF9UT0tFTicsXG4gICdHSF9QQUNLQUdFU19UT0tFTicsXG4gICdHSF9QS0dfUkVBRF9UT0tFTicsXG4gICdGTk9YX0FHRV9LRVknLFxuXTtcblxuLyoqXG4gKiBBIGNvcHkgb2YgYGVudmAgc2FmZSB0byBleHBvc2UgdG8gZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cy4gQ3JlZGVudGlhbCB2YXJpYWJsZXMgYXJlXG4gKiBFTVBUSUVEIHJhdGhlciB0aGFuIGRlbGV0ZWQgc28gYCR7VkVSREFDQ0lPX1RPS0VOfWAtc3R5bGUgcmVmZXJlbmNlcyBpbiAubnBtcmMga2VlcCBleHBhbmRpbmdcbiAqIHRvICcnIGluc3RlYWQgb2YgY3Jhc2hpbmcgdGhlIGluc3RhbGwgKHRoZSBwYXR0ZXJuIHJldXNhYmxlLXdvcmtmbG93cyByZWxpZXMgb24pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDcmVkZW50aWFsRnJlZUVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc2NydWJiZWRFbnYgPSB7IC4uLmVudiB9O1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgY3JlZGVudGlhbEVudlZhck5hbWVzKSB7XG4gICAgaWYgKG5hbWUgaW4gc2NydWJiZWRFbnYpIHNjcnViYmVkRW52W25hbWVdID0gJyc7XG4gIH1cbiAgcmV0dXJuIHNjcnViYmVkRW52O1xufVxuXG4vKipcbiAqIFVuZG8gdGhlIHRlbXBvcmFyeSByZWxlYXNlLXRpbWUgbXV0YXRpb25zIG9mIG9uZSBmaWxlLiBgcGFja2FnZS5qc29uYCBmaWxlcyBhcmUgcmVzdG9yZWRcbiAqIHNlbWFudGljYWxseSBpbnN0ZWFkIG9mIGJ5dGUtZm9yLWJ5dGU6IHNlbWFudGljLXJlbGVhc2UncyBucG0gcGx1Z2luIHdyaXRlcyB0aGUgcmVsZWFzZWRcbiAqIHZlcnNpb24gaW50byBtYW5pZmVzdHMgd2hpbGUgdGhleSBob2xkIHRoZSByZXdyaXR0ZW4gcmFuZ2VzLCBhbmQgYSBieXRlIHJlc3RvcmUgd291bGQgc2lsZW50bHlcbiAqIHJldmVydCB0aGF0IGJ1bXAg4oCUIHNvIHdoZW4gdGhlIGZpbGUgY2hhbmdlZCBkdXJpbmcgdGhlIHJlbGVhc2UsIG9ubHkgdGhlIGB3b3Jrc3BhY2U6YFxuICogc3BlY2lmaWVycyBhcmUgd3JpdHRlbiBiYWNrIGludG8gdGhlIENVUlJFTlQgY29udGVudC5cbiAqL1xuLyoqIFJldHVybnMgd2hldGhlciB0aGUgb24tZGlzayBjb250ZW50IGFjdHVhbGx5IGNoYW5nZWQgKGRyaXZlcyB0aGUgXCJSZXN0b3JlZCAuLi5cIiBtZXNzYWdlKS4gKi9cbmZ1bmN0aW9uIHJlc3RvcmVNb2RpZmllZEZpbGUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG9yaWdpbmFsQ29udGVudDogQnVmZmVyIHwgdW5kZWZpbmVkLFxuICByZWxlYXNlU3VjY2VlZGVkOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgaWYgKG9yaWdpbmFsQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZXhpc3RlZCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpO1xuICAgIGZzLnJtU3luYyhmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZXhpc3RlZDtcbiAgfVxuICBpZiAocmVsZWFzZVN1Y2NlZWRlZCAmJiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSA9PT0gJ3BhY2thZ2UuanNvbicgJiYgZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBvcmlnaW5hbENvbnRlbnQudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICBpZiAoY3VycmVudENvbnRlbnQgIT09IHJld3JpdGVXb3Jrc3BhY2VSYW5nZXMob3JpZ2luYWxUZXh0KSkge1xuICAgICAgY29uc3QgcmVzdG9yZWRDb250ZW50ID0gcmVzdG9yZVdvcmtzcGFjZVJhbmdlcyhjdXJyZW50Q29udGVudCwgb3JpZ2luYWxUZXh0KTtcbiAgICAgIGlmIChyZXN0b3JlZENvbnRlbnQgPT09IGN1cnJlbnRDb250ZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCByZXN0b3JlZENvbnRlbnQsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgY3VycmVudEJ1ZmZlciA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGN1cnJlbnRCdWZmZXI/LmVxdWFscyhvcmlnaW5hbENvbnRlbnQpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFdyaXRlIHRoZSBzbmFwc2hvdCBieXRlcyB2ZXJiYXRpbTogYnVuLmxvY2tiIGlzIGJpbmFyeSwgc28gYW55IHRleHQgZGVjb2RlL2VuY29kZSByb3VuZCB0cmlwXG4gIC8vIHdvdWxkIGNvcnJ1cHQgaXQuXG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIG9yaWdpbmFsQ29udGVudCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRIb2lzdGVkQnVuZmlnKGJ1bmZpZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1bmZpZ1xuICAgIC5yZXBsYWNlKC9eKFxccypsaW5rZXJcXHMqPVxccyopW1wiJ11pc29sYXRlZFtcIiddL211LCAnJDFcImhvaXN0ZWRcIicpXG4gICAgLnJlcGxhY2UoL15cXHMqZ2xvYmFsU3RvcmVcXHMqPVxccyp0cnVlW15cXG5dKlxcbj8vbXUsICcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJld3JpdGVXb3Jrc3BhY2VSYW5nZXMocGFja2FnZUpzb25Db250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBPcGVyYXRlIG9ubHkgaW5zaWRlIHRoZSBkZXBlbmRlbmN5IHNlY3Rpb25zOiBhIGJsYW5rZXQgYFwid29ya3NwYWNlOi4uLlwiYCByZXBsYWNlbWVudCB3b3VsZFxuICAvLyBhbHNvIGNvcnJ1cHQgdW5yZWxhdGVkIHN0cmluZyB2YWx1ZXMgKGUuZy4gYSBkZXNjcmlwdGlvbiBzdGFydGluZyB3aXRoIGB3b3Jrc3BhY2U6YCksIGFuZCBhXG4gIC8vIG5hbWUta2V5ZWQgZ2xvYmFsIHJlcGxhY2VtZW50IHdvdWxkIHRvdWNoIHNhbWUtbmFtZWQga2V5cyBpbiBvdGhlciBzZWN0aW9ucyAoZS5nLiBvdmVycmlkZXMpLlxuICByZXR1cm4gcmVwbGFjZUluRGVwZW5kZW5jeVNlY3Rpb25zKHBhY2thZ2VKc29uQ29udGVudCwgKHNlY3Rpb24pID0+XG4gICAgc2VjdGlvbi5yZXBsYWNlQWxsKC8oXCJbXlwiXFxuXStcIlxccyo6XFxzKilcIndvcmtzcGFjZTpbXlwiXSpcIi9ndSwgJyQxXCIqXCInKVxuICApO1xufVxuXG4vKipcbiAqIFJlLWFwcGx5IHRoZSBvcmlnaW5hbCBgd29ya3NwYWNlOmAgc3BlY2lmaWVycyB0byB0aGUgQ1VSUkVOVCBtYW5pZmVzdCBjb250ZW50LiBNYXRjaGluZyBrZXlzXG4gKiBvZmYgdGhlIGRlcGVuZGVuY3kgTkFNRSAobm90IHRoZSBgXCIqXCJgIHBsYWNlaG9sZGVyKSBpcyBkZWxpYmVyYXRlOiBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ3NcbiAqIHByZXBhcmUgc3RlcCBvdmVyd3JpdGVzIGxvY2FsIGRlcGVuZGVuY3kgc3BlY2lmaWVycyB3aXRoIGNvbmNyZXRlIHJlbGVhc2VkIHZlcnNpb25zLCBhbmQgdGhlXG4gKiBjb21taXR0ZWQgbWFuaWZlc3QgbXVzdCBnZXQgaXRzIGB3b3Jrc3BhY2U6YCBwcm90b2NvbCBiYWNrIHJlZ2FyZGxlc3Mg4oCUIEJ1biByZXF1aXJlcyB0aGVcbiAqIHByb3RvY29sIHNvIGEgY29sZCBpbnN0YWxsIGxpbmtzIHRoZSB3b3Jrc3BhY2UgaW5zdGVhZCBvZiByZXNvbHZpbmcgYSByZWdpc3RyeSBjb3B5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzdG9yZVdvcmtzcGFjZVJhbmdlcyhjdXJyZW50Q29udGVudDogc3RyaW5nLCBvcmlnaW5hbENvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmtzcGFjZURlcGVuZGVuY2llcyA9IGNvbGxlY3RXb3Jrc3BhY2VEZXBlbmRlbmNpZXMob3JpZ2luYWxDb250ZW50KTtcbiAgLy8gUmVzdG9yZSBwZXIgKHNlY3Rpb24sIG5hbWUpOiBhIHNhbWUtbmFtZWQgZGVwZW5kZW5jeSBpbiBhbm90aGVyIHNlY3Rpb24gbWF5IGxlZ2l0aW1hdGVseVxuICAvLyBob2xkIGEgbm9uLXdvcmtzcGFjZSByYW5nZSAoZS5nLiBhIHBlZXJEZXBlbmRlbmNpZXMgYD49MS4wLjBgIG5leHQgdG8gYSBkZXZEZXBlbmRlbmNpZXNcbiAgLy8gYHdvcmtzcGFjZToqYCkgb3IgYSBkaWZmZXJlbnQgd29ya3NwYWNlIHJhbmdlLCBhbmQgbXVzdCBrZWVwIGl0cyBvd24gdmFsdWUuXG4gIHJldHVybiByZXBsYWNlSW5EZXBlbmRlbmN5U2VjdGlvbnMoY3VycmVudENvbnRlbnQsIChzZWN0aW9uLCBzZWN0aW9uS2V5KSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9IHNlY3Rpb247XG4gICAgZm9yIChjb25zdCB7IHNlY3Rpb246IGRlcGVuZGVuY3lTZWN0aW9uLCBuYW1lLCBzcGVjaWZpZXIgfSBvZiB3b3Jrc3BhY2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgIGlmIChkZXBlbmRlbmN5U2VjdGlvbiAhPT0gc2VjdGlvbktleSkgY29udGludWU7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbChcbiAgICAgICAgbmV3IFJlZ0V4cChgKFwiJHtlc2NhcGVSZWdFeHAobmFtZSl9XCJcXFxccyo6XFxcXHMqKVwiW15cIl0qXCJgLCAnZ3UnKSxcbiAgICAgICAgLy8gQSByZXBsYWNlciBmdW5jdGlvbiwgbm90IGEgcmVwbGFjZW1lbnQgc3RyaW5nOiBzcGVjaWZpZXJzIGNvbnRhaW5pbmcgYCRgIG11c3QgYmVcbiAgICAgICAgLy8gaW5zZXJ0ZWQgbGl0ZXJhbGx5IGluc3RlYWQgb2YgYmVpbmcgaW50ZXJwcmV0ZWQgYXMgc3Vic3RpdHV0aW9uIHBhdHRlcm5zLlxuICAgICAgICAoX21hdGNoLCBwcmVmaXg6IHN0cmluZykgPT4gYCR7cHJlZml4fSR7SlNPTi5zdHJpbmdpZnkoc3BlY2lmaWVyKX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbn1cblxuLyoqIERlcGVuZGVuY3kgc2VjdGlvbnMgY29udGFpbiBvbmx5IGBcIm5hbWVcIjogXCJzcGVjaWZpZXJcImAgc3RyaW5nIHBhaXJzLCBzbyBgW157fV0qYCBzcGFucyB0aGVtLiAqL1xuZnVuY3Rpb24gcmVwbGFjZUluRGVwZW5kZW5jeVNlY3Rpb25zKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIHJlcGxhY2VTZWN0aW9uOiAoc2VjdGlvbjogc3RyaW5nLCBzZWN0aW9uS2V5OiBzdHJpbmcpID0+IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZUFsbChcbiAgICAvKFwiKGRlcGVuZGVuY2llc3xkZXZEZXBlbmRlbmNpZXN8b3B0aW9uYWxEZXBlbmRlbmNpZXN8cGVlckRlcGVuZGVuY2llcylcIlxccyo6XFxzKlxceykoW157fV0qKShcXH0pL2d1LFxuICAgIChfbWF0Y2gsIHByZWZpeDogc3RyaW5nLCBzZWN0aW9uS2V5OiBzdHJpbmcsIGJvZHk6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpID0+XG4gICAgICBgJHtwcmVmaXh9JHtyZXBsYWNlU2VjdGlvbihib2R5LCBzZWN0aW9uS2V5KX0ke3N1ZmZpeH1gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RXb3Jrc3BhY2VEZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uQ29udGVudDogc3RyaW5nXG4pOiB7IHNlY3Rpb246IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzcGVjaWZpZXI6IHN0cmluZyB9W10ge1xuICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uO1xuICB0cnkge1xuICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvbkNvbnRlbnQpIGFzIFBhY2thZ2VKc29uO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jaWVzOiB7IHNlY3Rpb246IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzcGVjaWZpZXI6IHN0cmluZyB9W10gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdCkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlSnNvbltrZXldID8/IHt9KSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHsgc2VjdGlvbjoga2V5LCBuYW1lLCBzcGVjaWZpZXI6IHZhbHVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvWyQoKSorLj9bXFxcXFxcXV57fH1dL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZW1hbnRpY1JlbGVhc2UocHJvamVjdDogUHJvamVjdCwgYXJndjogUmVsZWFzZUFyZ3YsIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGZvcndhcmRlZEFyZ3MgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2WyctLSddID8/IFtdKV0ubWFwKFN0cmluZyk7XG4gIC8vIFRoZSBQQUNLQUdFIG5hbWUgKGZvciBgYnVueGAvYHlhcm4gZGx4YCwgd2hpY2ggZmV0Y2ggYSBwYWNrYWdlKSBhbmQgdGhlIEJJTiBuYW1lIChmb3IgdGhlXG4gIC8vIGxvY2FsIG5vZGVfbW9kdWxlcy8uYmluIGxvb2t1cCkgZGlmZmVyIGZvciB0aGUgc2NvcGVkIGZvcmtzOiBgYnVueCBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlYFxuICAvLyB3b3VsZCBmZXRjaCB0aGUgdW5yZWxhdGVkIHVuc2NvcGVkIG5wbSBwYWNrYWdlIGluc3RlYWQgb2YgZS5nLiBAYW5vbGlsYWIncyBmb3JrLlxuICBjb25zdCByZWxlYXNlUGFja2FnZU5hbWUgPSAoXG4gICAgWydAYW5vbGlsYWIvbXVsdGktc2VtYW50aWMtcmVsZWFzZScsICdtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJywgJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXSBhcyBjb25zdFxuICApLmZpbmQoKHBhY2thZ2VOYW1lKSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSk7XG4gIGNvbnN0IHJlbGVhc2VCaW4gPSByZWxlYXNlUGFja2FnZU5hbWUgPyAnbXVsdGktc2VtYW50aWMtcmVsZWFzZScgOiAnc2VtYW50aWMtcmVsZWFzZSc7XG5cbiAgLy8gVGhlIHByb2plY3QgaXMgbG9hZGVkIHdpdGggbG9hZEVudjogZmFsc2UgKHNlbWFudGljLXJlbGVhc2UgcnVucyB3aXRoIHRoZSBhbWJpZW50L0NJXG4gIC8vIGVudmlyb25tZW50IGJ5IGRlc2lnbiksIHNvIHByb2plY3QuZW52IGFsaWFzZXMgcHJvY2Vzcy5lbnYgaGVyZTsgdXNpbmcgaXQga2VlcHMgdGhlXG4gIC8vIHByb2plY3QuZW52IGNvbnZlbnRpb24gYW5kIHBpY2tzIHVwIGVudiBsb2FkaW5nIGlmIHRoYXQgZGVzaWduIGV2ZXIgY2hhbmdlcy5cbiAgY29uc3QgZW52ID0geyAuLi5wcm9qZWN0LmVudiB9O1xuICBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGgocHJvamVjdC5kaXJQYXRoLCBlbnYpO1xuICBjb25zdCBoYXNMb2NhbEJpbiA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJywgcmVsZWFzZUJpbikpO1xuICBjb25zdCBmYWxsYmFja1BhY2thZ2VOYW1lID0gcmVsZWFzZVBhY2thZ2VOYW1lID8/ICdzZW1hbnRpYy1yZWxlYXNlJztcbiAgY29uc3QgY29tbWFuZCA9IGhhc0xvY2FsQmluXG4gICAgPyBbcmVsZWFzZUJpbiwgLi4uZm9yd2FyZGVkQXJnc11cbiAgICA6IHByb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kID09PSAnYnVuJ1xuICAgICAgPyBbJ2J1bngnLCBmYWxsYmFja1BhY2thZ2VOYW1lLCAuLi5mb3J3YXJkZWRBcmdzXVxuICAgICAgOiBbJ3lhcm4nLCAnZGx4JywgZmFsbGJhY2tQYWNrYWdlTmFtZSwgLi4uZm9yd2FyZGVkQXJnc107XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiAke2NvbW1hbmQuam9pbignICcpfWApKTtcbiAgaWYgKGFyZ3YuZHJ5UnVuKSByZXR1cm4gMDtcblxuICByZXR1cm4gYXdhaXQgc3Bhd25BbmRXYWl0KGFjdGl2ZUNoaWxkLCBjb21tYW5kWzBdISwgY29tbWFuZC5zbGljZSgxKSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudixcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgcmV0cnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbWF4aW11bSByZXRyeSBjb3VudCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgYWxpYXM6ICdyJyxcbiAgICBkZWZhdWx0OiAzLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBvblNpZ25hbDogKHNpZ25hbCkgPT4ge1xuICAgICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZXNvbHZlRmFsbGJhY2tXYkVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBnZXRSdW5TY3JpcHRBcmdzIH0gZnJvbSAnLi4vLi4vYmluL3J1bkFyZ3MuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCByZWFkQW5kTWVyZ2VFbnZpcm9ubWVudFZhcmlhYmxlcywgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB1c2VzQnVuUnVudGltZSB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHsgcnVuQ29tbWFuZFdpdGhFbnZpcm9ubWVudCB9IGZyb20gJy4vZG90ZW52LmpzJztcblxuZXhwb3J0IGNvbnN0IHJ1bkNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdydW4gW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ0xvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBydW4gYSBzY3JpcHQgd2l0aCB0aGUgcHJvamVjdCBydW50aW1lLicsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT5cbiAgICB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHtcbiAgICAgICdwYXJzZS1wb3NpdGlvbmFsLW51bWJlcnMnOiBmYWxzZSxcbiAgICAgICdwb3B1bGF0ZS0tJzogdHJ1ZSxcbiAgICAgICd1bmtub3duLW9wdGlvbnMtYXMtYXJncyc6IHRydWUsXG4gICAgfSksXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFyZ3MgPSBnZXRSdW5TY3JpcHRBcmdzKHByb2Nlc3MuYXJndik7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdVc2FnZTogd2IgcnVuIDxzY3JpcHQ+IFthcmdzLi4uXScpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgY3dkKTtcbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0Py5lbnYgPz8gcmVhZFN0YW5kYWxvbmVFbnZpcm9ubWVudChhcmd2LCBjd2QpO1xuICAgIGNvbnN0IGNvbW1hbmQgPSBidWlsZFJ1bkNvbW1hbmQoY3dkLCBhcmdzLCBlbnYsIHByb2plY3QpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgY29uc29sZS5pbmZvKGBXb3VsZCBydW46ICR7Y29tbWFuZC5qb2luKCcgJyl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHJ1bkNvbW1hbmRXaXRoRW52aXJvbm1lbnQoY29tbWFuZCwgJ3diIHJ1biA8c2NyaXB0PiBbYXJncy4uLl0nLCB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgfSk7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBidWlsZFJ1bkNvbW1hbmQoY3dkOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52LCBwcm9qZWN0PzogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgaWYgKCF1c2VzQnVuUnVudGltZShjd2QpKSByZXR1cm4gWydub2RlJywgLi4uYXJnc107XG4gIC8vIGBidW4gcnVuYCByZXNvbHZlcyBwYWNrYWdlLmpzb24gc2NyaXB0cyBiZWZvcmUgbG9jYWwgYmluYXJpZXMsIHNvIGEgc2NyaXB0IHRoYXQgaW52b2tlc1xuICAvLyBgd2IgcnVuIDxpdHMgb3duIG5hbWU+YCAoZS5nLiBcInZpdGVzdFwiOiBcIndiIHJ1biB2aXRlc3QgcnVuXCIpIHdvdWxkIHJlc3Bhd24gaXRzZWxmIGZvcmV2ZXIuXG4gIC8vIEJ5cGFzcyBzY3JpcHQgcmVzb2x1dGlvbiBvbmx5IGZvciBnZW51aW5lIHNlbGYtcmVjdXJzaW9uOiB0aGUgdGFyZ2V0IG5hbWVzIHRoZSBsaWZlY3ljbGVcbiAgLy8gc2NyaXB0IHRoYXQgc3Bhd25lZCB0aGlzIHByb2Nlc3MgQU5EIHRoZSBjdXJyZW50IHBhY2thZ2UgZGVjbGFyZXMgdGhhdCB2ZXJ5IHNjcmlwdCB0ZXh0IOKAlFxuICAvLyBhIGNyb3NzLXBhY2thZ2UgZGVsZWdhdGlvbiB2aWEgLS13b3JraW5nLWRpciByZWFjaGVzIGEgZGlmZmVyZW50IHNjcmlwdCB0ZXh0LCBzbyBpdCBzdGlsbFxuICAvLyBydW5zIHRoZSBkZXN0aW5hdGlvbidzIHNjcmlwdC4gcnVuQ29tbWFuZFdpdGhFbnZpcm9ubWVudCBwcmVwZW5kcyBub2RlX21vZHVsZXMvLmJpbiB0b1xuICAvLyBQQVRILCByZXNvbHZpbmcgdGhlIGRpcmVjdCBleGVjdXRpb24gdG8gdGhlIGxvY2FsIGJpbmFyeS5cbiAgY29uc3QgdGFyZ2V0ID0gYXJnc1swXTtcbiAgaWYgKHRhcmdldCAmJiB0YXJnZXQgPT09IGVudi5ucG1fbGlmZWN5Y2xlX2V2ZW50KSB7XG4gICAgY29uc3Qgc2NyaXB0ID0gcHJvamVjdCA/IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uW3RhcmdldF0gOiByZWFkUGFja2FnZVNjcmlwdChjd2QsIHRhcmdldCk7XG4gICAgaWYgKHNjcmlwdCAhPT0gdW5kZWZpbmVkICYmIHNjcmlwdCA9PT0gZW52Lm5wbV9saWZlY3ljbGVfc2NyaXB0KSByZXR1cm4gWy4uLmFyZ3NdO1xuICB9XG4gIHJldHVybiBbJ2J1bicsICdydW4nLCAuLi5hcmdzXTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VTY3JpcHQoY3dkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIGBidW4gcnVuYCByZXNvbHZlcyBzY3JpcHRzIGZyb20gdGhlIG5lYXJlc3QgYW5jZXN0b3IgcGFja2FnZS5qc29uLCBzbyBtYXRjaCB0aGF0IHNjb3BlXG4gIC8vIChlLmcuIC0td29ya2luZy1kaXIgbWF5IHBvaW50IHRvIGEgbWFuaWZlc3QtbGVzcyBzdWJkaXJlY3Rvcnkgb2YgdGhlIHJlY3Vyc2luZyBwYWNrYWdlKS5cbiAgZm9yIChsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoY3dkKTsgOyBjdXJyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCkpIHtcbiAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgICAgIHNjcmlwdHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcGFja2FnZUpzb24uc2NyaXB0cz8uW25hbWVdO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpID09PSBjdXJyZW50UGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkU3RhbmRhbG9uZUVudmlyb25tZW50KGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZSwgY3dkOiBzdHJpbmcpOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIGNvbnN0IFtlbnZdID0gcmVhZEFuZE1lcmdlRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZW52LldCX0VOViB8fD0gcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndik7XG4gIHZhbGlkYXRlU3RhbmRhbG9uZVdiRW52KGFyZ3YsIGVudik7XG4gIHJldHVybiBlbnY7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhbmRhbG9uZVdiRW52KGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZSwgZW52OiBOb2RlSlMuUHJvY2Vzc0Vudik6IHZvaWQge1xuICBpZiAoZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAnMScgfHwgZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAndHJ1ZScpIHJldHVybjtcbiAgY29uc3Qgc3RhbmRhcmRNb2RlcyA9IG5ldyBTZXQoWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddKTtcbiAgaWYgKGVudi5XQl9FTlYgJiYgIXN0YW5kYXJkTW9kZXMuaGFzKGVudi5XQl9FTlYpKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGBXQl9FTlYgbXVzdCBiZSBvbmUgb2YgZGV2ZWxvcG1lbnQsIHRlc3QsIHN0YWdpbmcsIG9yIHByb2R1Y3Rpb24sIGJ1dCBpcyBcIiR7ZW52LldCX0VOVn1cIi4gYCArXG4gICAgICAgICdGaXggdGhlIGVudiBzb3VyY2Ugb3IgdGhlIGV4cG9ydGVkIHZhcmlhYmxlLCBvciBzZXQgV0JfU0tJUF9FTlZfQ0hFQ0s9MSB0byBza2lwIHRoaXMgY2hlY2suJ1xuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBzZWxlY3RlZENhc2NhZGUgPVxuICAgIHR5cGVvZiBhcmd2LmNhc2NhZGVFbnYgPT09ICdzdHJpbmcnXG4gICAgICA/IGFyZ3YuY2FzY2FkZUVudlxuICAgICAgOiBhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICAgID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudiAhPT0gZmFsc2VcbiAgICAgICAgICA/IHJ1bnRpbWVFbnYuV0JfRU5WIHx8IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICBpZiAoZW52LldCX0VOViAmJiBzZWxlY3RlZENhc2NhZGUgJiYgc3RhbmRhcmRNb2Rlcy5oYXMoc2VsZWN0ZWRDYXNjYWRlKSAmJiBlbnYuV0JfRU5WICE9PSBzZWxlY3RlZENhc2NhZGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYFdCX0VOViByZXNvbHZlcyB0byBcIiR7ZW52LldCX0VOVn1cIiBhbHRob3VnaCB0aGUgXCIke3NlbGVjdGVkQ2FzY2FkZX1cIiBlbnZpcm9ubWVudCB3YXMgc2VsZWN0ZWQuIGAgK1xuICAgICAgICAnRml4IHRoZSBXQl9FTlYgZGVmaW5lZCBpbiB0aGUgZW52IHNvdXJjZXMsIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay4nXG4gICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3QgbG9hZGVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIChkLm5hbWUgPT09ICdtaXNlLnRvbWwnIHx8IGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignbWlzZSBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIC8vIGBtaXNlIHdoaWNoIHB5dGhvbmAgcmVzb2x2ZXMgdGhlIHByb2plY3QncyBBQ1RJVkUgaW50ZXJwcmV0ZXIgdG8gYSBzaW5nbGUgYWJzb2x1dGUgcGF0aCxcbiAgICAgIC8vIHVubGlrZSBgbWlzZSBjdXJyZW50IHB5dGhvbmAsIHdoaWNoIHByaW50cyBldmVyeSBjb25maWd1cmVkIHZlcnNpb24gKG1pc2Ugc3VwcG9ydHNcbiAgICAgIC8vIG11bHRpLXZlcnNpb24gcGlucykgYW5kIHdvdWxkIHBhc3MgZXh0cmEgcG9zaXRpb25hbCBhcmd1bWVudHMgdG8gYHBvZXRyeSBlbnYgdXNlYC5cbiAgICAgIGxldCBweXRob25QYXRoID0gJyc7XG4gICAgICB0cnkge1xuICAgICAgICBweXRob25QYXRoID0gY2hpbGRfcHJvY2Vzc1xuICAgICAgICAgIC5leGVjU3luYygnbWlzZSB3aGljaCBweXRob24nLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSB9KVxuICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgLnRyaW0oKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBtaXNlIG1pc3Npbmcgb3IgcHl0aG9uIHVuY29uZmlndXJlZDsgbGV0IHBvZXRyeSBwaWNrIGl0cyBkZWZhdWx0IGludGVycHJldGVyLlxuICAgICAgfVxuICAgICAgaWYgKHB5dGhvblBhdGgpIHtcbiAgICAgICAgLy8gVGhlIGNvbW1hbmQgcnVucyB0aHJvdWdoIGEgc2hlbGw7IFBPU0lYIHNpbmdsZSBxdW90ZXMga2VlcCB0aGUgcGF0aCBvbmUgbGl0ZXJhbCBhcmd1bWVudFxuICAgICAgICAvLyBldmVuIHdoZW4gYSByZWxvY2F0ZWQgbWlzZSBkYXRhIGRpciBwdXRzIG1ldGFjaGFyYWN0ZXJzIGludG8gaXQuXG4gICAgICAgIGNvbnN0IHF1b3RlZFB5dGhvblBhdGggPSBgJyR7cHl0aG9uUGF0aC5yZXBsYWNlQWxsKFwiJ1wiLCBTdHJpbmcucmF3YCdcXCcnYCl9J2A7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7cXVvdGVkUHl0aG9uUGF0aH1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290IHx8ICFwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkgJiZcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddXG4gICAgKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmR9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmR9IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICAnLS0nPzogc3RyaW5nW107XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xuICBzaWxlbnQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHsgJy0tJz86IHN0cmluZ1tdIH1cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSlcbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIERvY2tlciBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgRG9ja2VyU2NyaXB0cyB7XG4gIGJ1aWxkSW1hZ2UocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBlLmcuIGNvZGluZy1ib29zdGVyIHVzZXMgYFwiZG9ja2VyL2J1aWxkL3ByZXBhcmVcIjogXCJ0b3VjaCBkcmlsbC11c2Vycy5jc3ZcIixgXG4gICAgY29uc3QgcHJlZml4ID0gcHJvamVjdC5kb2NrZXJQYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RvY2tlci9idWlsZC9wcmVwYXJlJ11cbiAgICAgID8gJ1lBUk4gcnVuIGRvY2tlci9idWlsZC9wcmVwYXJlICYmICdcbiAgICAgIDogJyc7XG4gICAgY29uc3QgbWlzZUFnZUtleVNlY3JldE9wdGlvbiA9IHByb2plY3QuZW52Lk1JU0VfQUdFX0tFWVxuICAgICAgPyAnXFxuICAgICAgICAtLXNlY3JldCBpZD1taXNlX2FnZV9rZXksZW52PU1JU0VfQUdFX0tFWSdcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBjZCAke3BhdGguZGlybmFtZShwcm9qZWN0LmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpfVxuICAgICYmICR7cHJlZml4fVlBUk4gd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVcbiAgICAmJiBZQVJOIHdiIHJldHJ5IC0tIGRvY2tlciBidWlsZCAtdCAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfVxuICAgICAgICAtLWJ1aWxkLWFyZyBBUkNIPSQoWyAkKHVuYW1lIC1tKSA9ICdhcm02NCcgXSAmJiBlY2hvIGFybTY0IHx8IGVjaG8geDg2XzY0KVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9XG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX1ZFUlNJT049JHt2ZXJzaW9ufSR7bWlzZUFnZUtleVNlY3JldE9wdGlvbn0gLmA7XG4gIH1cblxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zLCBhZGRpdGlvbmFsQXJncyl9YDtcbiAgfVxuXG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIGNvbnN0IGFsbG9jYXRlVHR5ID0gYWRkaXRpb25hbEFyZ3MuaW5jbHVkZXMoJy9iaW4vYmFzaCcpO1xuICAgIGNvbnN0IG1pc2VBZ2VLZXlFbnZPcHRpb24gPSBwcm9qZWN0LmVudi5NSVNFX0FHRV9LRVkgPyAnLS1lbnYgTUlTRV9BR0VfS0VZICcgOiAnJztcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAke2FsbG9jYXRlVHR5ID8gJy1pdCAnIDogJyd9JHttaXNlQWdlS2V5RW52T3B0aW9ufSR7c2VsZWN0Q29udGFpbmVyRW52T3B0aW9ucyhwcm9qZWN0KX0tLXB1Ymxpc2ggJHtwcm9qZWN0LmVudi5QT1JUfTo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZG9ja2VyIHJtIC1mICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ID4gL2Rldi9udWxsIDI+JjEgfHwgdHJ1ZWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG5cbi8vIFZhcmlhYmxlcyB0aGUgSU1BR0UgaXRzZWxmIG93bnM6IGEgRG9ja2VyZmlsZSBwaW5zIHRoZSBjb250YWluZXIgcG9ydCAodGhlIHB1Ymxpc2hlZCBtYXBwaW5nXG4vLyB0YXJnZXRzIDgwODAsIG5vdCB0aGUgaG9zdC1zaWRlIFBPUlQpIGFuZCB0aGUgcnVudGltZSBtb2RlIGl0IHdhcyBidWlsdCBmb3IsIGFuZCBiZWZvcmUgZm5veCB0aGVcbi8vIGJha2VkIC5lbnYgZmlsZXMgbG9zdCB0byB0aG9zZSBgRU5WYCB2YWx1ZXMgdG9vIGJlY2F1c2UgcHJvY2Vzcy5lbnYgd2lucyBvdmVyIGVudiBzb3VyY2VzLlxuY29uc3QgSU1BR0VfT1dORURfS0VZUyA9IG5ldyBTZXQoWydOT0RFX0VOVicsICdQT1JUJ10pO1xuXG4vKipcbiAqIGBkb2NrZXIgcnVuIC0tZW52IEtFWWAgb3B0aW9ucyBmb3IgZXZlcnkgdmFyaWFibGUgdGhlIHByb2plY3QgZGVjbGFyZXMsIHNvIGEgY29udGFpbmVyIGdldHMgdGhlXG4gKiBhcHAncyBlbnZpcm9ubWVudC4gU2luY2UgZm5veCByZXBsYWNlZCB0aGUgLmVudiBmaWxlcyB0aGF0IGltYWdlcyB1c2VkIHRvIGJha2UgaW4g4oCUIHRoZSBhZ2Uga2V5XG4gKiB0aGF0IGRlY3J5cHRzIHRoZW0gbXVzdCBuZXZlciBlbnRlciBhIGNvbnRhaW5lciDigJQgYSBjb250YWluZXIgd291bGQgb3RoZXJ3aXNlIHN0YXJ0IHdpdGggbm9cbiAqIGNvbmZpZ3VyYXRpb24gYXQgYWxsLiBPbmx5IE5BTUVTIGFyZSBwYXNzZWQ6IGRvY2tlciB0aGVuIGZvcndhcmRzIGVhY2ggdmFsdWUgZnJvbSB3YidzIG93blxuICogZW52aXJvbm1lbnQsIGtlZXBpbmcgc2VjcmV0cyBvdXQgb2YgdGhlIGNvbW1hbmQgbGluZSAodmlzaWJsZSBpbiBgcHNgIG91dHB1dCBhbmQgQ0kgbG9ncykuXG4gKi9cbmZ1bmN0aW9uIHNlbGVjdENvbnRhaW5lckVudk9wdGlvbnMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gIGNvbnN0IG9wdGlvbnMgPSBzZWxlY3RDb250YWluZXJFbnZLZXlzKHByb2plY3QuZGVjbGFyZWRFbnZLZXlzLCBwcm9qZWN0LmVudikubWFwKChrZXkpID0+IGAtLWVudiAke2tleX1gKTtcbiAgcmV0dXJuIG9wdGlvbnMubGVuZ3RoID4gMCA/IGAke29wdGlvbnMuam9pbignICcpfSBgIDogJyc7XG59XG5cbi8qKiBUaGUgZGVjbGFyZWQgdmFyaWFibGVzIHRvIGZvcndhcmQgaW50byBhIGNvbnRhaW5lciwgc29ydGVkIGZvciBhIHN0YWJsZSBjb21tYW5kLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdENvbnRhaW5lckVudktleXMoXG4gIGRlY2xhcmVkRW52S2V5czogUmVhZG9ubHlTZXQ8c3RyaW5nPixcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+XG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uZGVjbGFyZWRFbnZLZXlzXVxuICAgIC5maWx0ZXIoKGtleSkgPT4gIUlNQUdFX09XTkVEX0tFWVMuaGFzKGtleSkgJiYgZW52W2tleV0gIT09IHVuZGVmaW5lZClcbiAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQge1xuICBmaW5kRDFNaWdyYXRpb25zRGlyUGF0aCxcbiAgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxuICB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybCxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVPcHRpb25zIHtcbiAgLyoqICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJyAqL1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xuICAvKiogUmF3IFBsYXl3cmlnaHQgYXJncyBmb3J3YXJkZWQgYWZ0ZXIgYHdiIHRlc3QgLS0gLi4uYCAqL1xuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHAgPSBzaG91bGRXYWl0QW5kT3BlbkFwcDtcbiAgfVxuXG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGRJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogc3RhcnQgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIGFzeW5jIHN0YXJ0RGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgXSk7XG4gIH1cbiAgYXN5bmMgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhc3luYyBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAnd2InLFxuICAgICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgICAgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKSxcbiAgICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICAgIF0pfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcbiAgcHJvdGVjdGVkIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBjdXN0b21TdGFydFNjcmlwdFBhdGggPSBmaW5kQ3VzdG9tUHJvZHVjdGlvblN0YXJ0U2NyaXB0UGF0aChwcm9qZWN0KTtcbiAgICBpZiAoY3VzdG9tU3RhcnRTY3JpcHRQYXRoKSB7XG4gICAgICBjb25zdCBzdGFydENvbW1hbmQgPVxuICAgICAgICBgJHtidWlsZFNoZWxsQ29tbWFuZChbJ2Jhc2gnLCBjdXN0b21TdGFydFNjcmlwdFBhdGhdKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgICAgIC8vIEEgc3RhcnQgc2NyaXB0IGZvdW5kIGF0IHRoZSBtb25vcmVwbyByb290IChjZi4gUHJvamVjdC5maW5kRmlsZSkgaXMgd3JpdHRlbiB0byBydW4gZnJvbVxuICAgICAgLy8gdGhlIHJvb3QsIGxpa2UgRG9ja2VyJ3MgV09SS0RJUiwgc28gaXRzIGN3ZCBtdXN0IGJlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBzY3JpcHRzLy5cbiAgICAgIGNvbnN0IHNjcmlwdFJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShjdXN0b21TdGFydFNjcmlwdFBhdGgpKTtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdCwgYXJndiwgW1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgc2NyaXB0Um9vdERpclBhdGggPT09IHByb2plY3QuZGlyUGF0aFxuICAgICAgICAgID8gc3RhcnRDb21tYW5kXG4gICAgICAgICAgOiBgKCR7YnVpbGRTaGVsbENvbW1hbmQoWydjZCcsIHNjcmlwdFJvb3REaXJQYXRoXSl9ICYmICR7c3RhcnRDb21tYW5kfSlgLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgY29uc3QgZWNvc3lzdGVtQ29uZmlnUGF0aCA9IGZpbmRFY29zeXN0ZW1Db25maWdQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gZWNvc3lzdGVtQ29uZmlnUGF0aFxuICAgICAgPyBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBwbTItcnVudGltZSBzdGFydCAtLW5vLWF1dG9yZXN0YXJ0ICR7ZWNvc3lzdGVtQ29uZmlnUGF0aH1gXVxuICAgICAgOiB0aGlzLmJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3QsIGFyZ3YpO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0LCBhcmd2LCBjb21tYW5kcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBgJHtwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1bicgOiAnbm9kZSd9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKSxcbiAgICBdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgY29tbWFuZHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBtaWdyYXRpb25Db21tYW5kcyA9IHRoaXMuYnVpbGRNaWdyYXRpb25Db21tYW5kcyhwcm9qZWN0KTtcbiAgICAvLyBTcGxpdHRpbmcgbWF5IGN1dCB0aHJvdWdoIGEgYChjZCDigKYgJiYg4oCmKWAgc3Vic2hlbGwsIGJ1dCByZWpvaW5pbmcgd2l0aCAnICYmICcgYW5kIHBlci1waWVjZVxuICAgIC8vIHJlZGlyZWN0cyBrZWVwcyB0aGUgc2NyaXB0IHZhbGlkLCBhbmQgd2ItZ2VuZXJhdGVkIHBhdGhzIG5ldmVyIGNvbnRhaW4gJyYmJy5cbiAgICByZXR1cm4gWy4uLm1pZ3JhdGlvbkNvbW1hbmRzLmZsYXRNYXAoKGNtZCkgPT4gY21kLnNwbGl0KCcmJicpKSwgLi4uY29tbWFuZHNdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKChjbWQpID0+IGAke2NtZH0gJHt0b0Rldk51bGwoYXJndil9YC50cmltKCkpXG4gICAgICAuam9pbignICYmICcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkTWlncmF0aW9uQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgICAvLyBUZXN0LWVudmlyb25tZW50IHdyYW5nbGVyIHN0YXRlIGlzIGRpc3Bvc2FibGU7IHdpcGUgaXQgZW50aXJlbHkgKG5vdCBqdXN0IEQxKSBiZWZvcmVcbiAgICAvLyBtaWdyYXRpbmcsIHNpbmNlIHN0YWxlIEtWIGNhY2hlIGVudHJpZXMgb3IgRHVyYWJsZSBPYmplY3Qgc3RvcmFnZSBjYW4gYnJlYWsgZTJlIHRlc3RzLlxuICAgIGNvbnN0IHdyYW5nbGVyU3RhdGVXaXBlQ29tbWFuZHMgPVxuICAgICAgaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSAmJiBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpXG4gICAgICAgID8gW2BybSAtUmYgXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cImBdXG4gICAgICAgIDogW107XG4gICAgLy8gQSBwcm9qZWN0IHdob3NlIEQxIGJpbmRpbmdzIGNhcnJ5IHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIGFwcGxpZXMgdGhlbSB3aXRoIHdyYW5nbGVyXG4gICAgLy8gKHNlZSBXb3JrZXJzU2NyaXB0cyAvIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKS4gUnVubmluZyBkcml6emxlLWtpdCBtaWdyYXRlIGFnYWluc3RcbiAgICAvLyB0aGUgc2FtZSBsb2NhbCBEMSB3b3VsZCBhcHBseSB0aGUgc2FtZSBTUUwgdHdpY2Ug4oCUIGRyaXp6bGUncyBnZW5lcmF0ZWQgc3RhdGVtZW50cyBhcmUgbm90XG4gICAgLy8gaWRlbXBvdGVudCAoYENSRUFURSBJTkRFWGAgd2l0aG91dCBJRiBOT1QgRVhJU1RTKSDigJQgc28gZHJpenpsZSBzdGF5cyBPUk0tb25seSB0aGVyZS5cbiAgICBjb25zdCBtaWdyYXRlc0QxV2l0aFdyYW5nbGVyID0gISFmaW5kRDFNaWdyYXRpb25zRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gW1xuICAgICAgLi4ud3JhbmdsZXJTdGF0ZVdpcGVDb21tYW5kcyxcbiAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IFtwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCldIDogW10pLFxuICAgICAgLi4uKHByb2plY3QuaGFzRHJpenpsZSAmJiAhbWlncmF0ZXNEMVdpdGhXcmFuZ2xlclxuICAgICAgICA/IFt3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybChwcm9qZWN0LCBkcml6emxlU2NyaXB0cy5taWdyYXRlRm9yU3RhcnQocHJvamVjdCkpXVxuICAgICAgICA6IFtdKSxcbiAgICBdO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0KSwgb3B0aW9ucyk7XG4gIH1cbiAgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBJbiB0aGUgdGVzdCBlbnZpcm9ubWVudCB0aGUgZGV2IHNlcnZlciBydW5zIGFnYWluc3QgZnJlc2gsIGRpc3Bvc2FibGUgc3RhdGUgKGUuZy4gYW4gZW1wdHlcbiAgICAvLyBsb2NhbCBEMSksIHNvIHRoZSBzY2hlbWEgbXVzdCBiZSBtaWdyYXRlZCBmaXJzdCDigJQgYW4gYXBwIHdob3NlIHBhZ2VzIHF1ZXJ5IHRoZSBkYXRhYmFzZVxuICAgIC8vIHdvdWxkIG90aGVyd2lzZSBhbnN3ZXIgNTAwIGFuZCB0aGUgc3RhcnR1cCBjaGVjayB3b3VsZCBuZXZlciBzZWUgYSAyeHguXG4gICAgY29uc3QgbWlncmF0aW9uQ29tbWFuZHMgPSBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpID8gdGhpcy5idWlsZE1pZ3JhdGlvbkNvbW1hbmRzKHByb2plY3QpIDogW107XG4gICAgLy8gVXNlIGVtcHR5IE5PREVfRU5WIHRvIGF2b2lkIFwicHJvZHVjdGlvblwiIG1vZGUgaW4gc29tZSBmcmFtZXdvcmtzLlxuICAgIGNvbnN0IHN0YXJ0dXBDaGVja0NvbW1hbmQgPSBgJHtidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KCdOT0RFX0VOVicsICcnKX0gJHtidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QXBwKHByb2plY3QpLFxuICAgIF0pfWA7XG4gICAgcmV0dXJuIFsuLi5taWdyYXRpb25Db21tYW5kcywgc3RhcnR1cENoZWNrQ29tbWFuZF0uam9pbignICYmICcpO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBwbGF5d3JpZ2h0Q29tbWFuZCA9IHRoaXMuYnVpbGRQbGF5d3JpZ2h0T25seUNvbW1hbmQocHJvamVjdCwgYXJndiwgb3B0aW9ucyk7XG4gICAgaWYgKHByb2plY3Quc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQpIHtcbiAgICAgIHJldHVybiBwbGF5d3JpZ2h0Q29tbWFuZDtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYCR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDYwMDAwMCAtaSAyMDAwJyl9XG4gICAgICAgICYmICR7cGxheXdyaWdodENvbW1hbmR9YCxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKdXN0IHJ1bnMgUGxheXdyaWdodCAocGx1cyB0aGUgb3B0aW9uYWwgYHRlc3QvZTJlLWFkZGl0aW9uYWxgIHNjcmlwdCksIHdpdGhvdXQgbGF1bmNoaW5nIHRoZSBhcHAuXG4gICAqIFVzZSB3aGVuIFBsYXl3cmlnaHQncyBvd24gYHdlYlNlcnZlcmAgY29uZmlnIGJ1aWxkcyBhbmQgc3RhcnRzIHRoZSBhcHAgdW5kZXIgdGVzdC5cbiAgICovXG4gIHByb3RlY3RlZCBidWlsZFBsYXl3cmlnaHRPbmx5Q29tbWFuZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBbXSwgcGxheXdyaWdodEFyZ3MgPSBbJ3Rlc3QnLCAndGVzdC9lMmUvJ10gfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgcmV0dXJuIGAke2J1aWxkUGxheXdyaWdodENvbW1hbmQocGxheXdyaWdodEFyZ3MsIGFyZ3YudGFyZ2V0cywgYXJndi5iYWlsLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyl9JHtzdWZmaXh9YDtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiB0ZXN0IChlMmUpIGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIHRlc3RVbml0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICBpZiAocHJvamVjdC5oYXNWaXRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIHRoaXMgY29tbWFuZCBpcyByZWZlcnJlZCBmcm9tIG90aGVyIGNvbW1hbmRzLCB3ZSBoYXZlIHRvIHVzZSBcInZpdGVzdCBydW5cIiAobm9uLWludGVyYWN0aXZlIG1vZGUpLlxuICAgICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAndml0ZXN0JyxcbiAgICAgICAgJ3J1bicsXG4gICAgICAgIC4uLih0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L3VuaXQvJ10pLFxuICAgICAgICAnLS1wYXNzV2l0aE5vVGVzdHMnLFxuICAgICAgICAnLS1hbGxvd09ubHknLFxuICAgICAgICAnLS13YXRjaD1mYWxzZScsXG4gICAgICAgIC4uLihhcmd2LmJhaWwgPyBbJy0tYmFpbD0xJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9IGVsc2UgaWYgKHByb2plY3QuaXNCdW5BdmFpbGFibGUpIHtcbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdidW4nLFxuICAgICAgICAndGVzdCcsXG4gICAgICAgIC4uLih0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L3VuaXQvJ10pLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWwnXSA6IFtdKSxcbiAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gJ2VjaG8gXCJObyB0ZXN0cy5cIic7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYCR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDEwMDAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgMTAwMDAgLWkgNTAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgMTAwMDAgLWkgMTAwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDEwMDAwIC1pIDIwMDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCAyMDAwMCAtaSA0MDAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgNjAwMDAgLWkgNTAwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDkwMDAwIC1pIDEwMDAwJyl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QW5kT3BlbkFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYCR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdFxuICAgICl9IHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCl9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHdhaXQtb24gYm9vdCBjaGVjayBmb3IgYSBsaXN0ZW5pbmcgbG9vcGJhY2sgcG9ydC4gQSBUQ1AgY2hlY2sgdHJlYXRzIHJlZGlyZWN0cyBhbmRcbiAqIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlcyBhcyBhIHN1Y2Nlc3NmdWxseSBzdGFydGVkIHNlcnZlcjsgYW4gSFRUUCBzdGF0dXMgY2hlY2sgd291bGQga2VlcFxuICogd2FpdGluZyBldmVuIHRob3VnaCBQbGF5d3JpZ2h0IGNhbiBhbHJlYWR5IHVzZSB0aGUgYXBwLiBgbG9jYWxob3N0YCBsZXRzIE5vZGUgdHJ5IGJvdGggYWRkcmVzc1xuICogZmFtaWxpZXMgd2hlbiBhIGRldiBzZXJ2ZXIgYmluZHMgb25seSBJUHY0IG9yIElQdjYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0OiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQsIHdhaXRPbkFyZ3M/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocG9ydCA9PT0gdW5kZWZpbmVkIHx8IHBvcnQgPT09ICcnKSB0aHJvdyBuZXcgRXJyb3IoJ1BvcnQgaXMgcmVxdWlyZWQgZm9yIHRoZSBsb29wYmFjayByZWFkaW5lc3MgY2hlY2suJyk7XG4gIHJldHVybiBgd2FpdC1vbiAke3dhaXRPbkFyZ3MgPyBgJHt3YWl0T25BcmdzfSBgIDogJyd9dGNwOmxvY2FsaG9zdDoke3BvcnR9YDtcbn1cblxuZnVuY3Rpb24gZmluZEN1c3RvbVByb2R1Y3Rpb25TdGFydFNjcmlwdFBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ3NjcmlwdHMvc3RhcnQtcHJvZHVjdGlvbi5zaCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRDb21tYW5kKFxuICBwbGF5d3JpZ2h0QXJnczogc3RyaW5nW10sXG4gIHRhcmdldHM6IFRlc3RBcmd2Wyd0YXJnZXRzJ10sXG4gIGJhaWw/OiBib29sZWFuLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IFsnQlVOJywgJ3BsYXl3cmlnaHQnXTtcbiAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgaWYgKHBsYXl3cmlnaHRBcmdzWzBdICE9PSAndGVzdCcgfHwgIW5vcm1hbGl6ZWRUYXJnZXRzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oWy4uLmJhc2UsIC4uLnBsYXl3cmlnaHRBcmdzLCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sIGJhaWwpO1xuICB9XG5cbiAgY29uc3QgcmVzdCA9IHBsYXl3cmlnaHRBcmdzLnNsaWNlKDEpO1xuICBjb25zdCBleHBsaWNpdFRhcmdldEluZGV4ZXMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhyZXN0KTtcbiAgY29uc3QgcmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCA9XG4gICAgZXhwbGljaXRUYXJnZXRJbmRleGVzLmxlbmd0aCA9PT0gMCA/IHJlc3QgOiByZXN0LmZpbHRlcigoXywgaW5kZXgpID0+ICFleHBsaWNpdFRhcmdldEluZGV4ZXMuaW5jbHVkZXMoaW5kZXgpKTtcbiAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKFxuICAgIFsuLi5iYXNlLCAndGVzdCcsIC4uLm5vcm1hbGl6ZWRUYXJnZXRzLCAuLi5yZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0LCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sXG4gICAgYmFpbFxuICApO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihjb21tYW5kQXJnczogc3RyaW5nW10sIGJhaWw/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcGxheXdyaWdodEluZGV4ID0gY29tbWFuZEFyZ3MuaW5kZXhPZigncGxheXdyaWdodCcpO1xuICBjb25zdCBpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCA9IHBsYXl3cmlnaHRJbmRleCAhPT0gLTEgJiYgY29tbWFuZEFyZ3NbcGxheXdyaWdodEluZGV4ICsgMV0gPT09ICd0ZXN0JztcbiAgaWYgKCFiYWlsIHx8ICFpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgaWYgKGNvbW1hbmRBcmdzLnNvbWUoKGFyZykgPT4gYXJnID09PSAnLS1tYXgtZmFpbHVyZXMnIHx8IGFyZy5zdGFydHNXaXRoKCctLW1heC1mYWlsdXJlcz0nKSkpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoY29tbWFuZEFyZ3MpO1xuICB9XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4uY29tbWFuZEFyZ3MsICctLW1heC1mYWlsdXJlcz0xJ10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMoYXJnczogc3RyaW5nW10pOiBudW1iZXJbXSB7XG4gIGxldCBwZW5kaW5nVmFsdWVNb2RlOiAnb3B0aW9uYWwnIHwgJ3JlcXVpcmVkJyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0SW5kZXhlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgYXJnXSBvZiBhcmdzLmVudHJpZXMoKSkge1xuICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlKSB7XG4gICAgICBpZiAocGVuZGluZ1ZhbHVlTW9kZSA9PT0gJ3JlcXVpcmVkJyB8fCAhYXJnLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gdW5kZWZpbmVkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgcmV0dXJuIFsuLi50YXJnZXRJbmRleGVzLCAuLi5hcmdzLnNsaWNlKGluZGV4ICsgMSkubWFwKChfLCBvZmZzZXQpID0+IGluZGV4ICsgMSArIG9mZnNldCldO1xuICAgIH1cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgIGlmIChhcmcuaW5jbHVkZXMoJz0nKSkgY29udGludWU7XG4gICAgICBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9IGVsc2UgaWYgKFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTLmhhcyhhcmcpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAnb3B0aW9uYWwnO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLScpICYmIGFyZyAhPT0gJy0nKSB7XG4gICAgICBjb25zdCBzaG9ydE9wdGlvbiA9IGFyZy5zbGljZSgwLCAyKTtcbiAgICAgIGlmIChhcmcubGVuZ3RoID09PSAyICYmIFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTLmhhcyhzaG9ydE9wdGlvbikpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdGFyZ2V0SW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRJbmRleGVzO1xufVxuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1icm93c2VyJyxcbiAgJy0tY29uZmlnJyxcbiAgJy0tZ3JlcCcsXG4gICctLWdyZXAtaW52ZXJ0JyxcbiAgJy0tZ2xvYmFsLXRpbWVvdXQnLFxuICAnLS1tYXgtZmFpbHVyZXMnLFxuICAnLS1vdXRwdXQnLFxuICAnLS1wcm9qZWN0JyxcbiAgJy0tcmVwZWF0LWVhY2gnLFxuICAnLS1yZXBvcnRlcicsXG4gICctLXJldHJpZXMnLFxuICAnLS1zaGFyZCcsXG4gICctLXRlc3QtbGlzdCcsXG4gICctLXRlc3QtbGlzdC1pbnZlcnQnLFxuICAnLS10aW1lb3V0JyxcbiAgJy0tdHJhY2UnLFxuICAnLS10c2NvbmZpZycsXG4gICctLXVpLWhvc3QnLFxuICAnLS11aS1wb3J0JyxcbiAgJy0tdWktdGl0bGUnLFxuICAnLS13b3JrZXJzJyxcbl0pO1xuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1vbmx5LWNoYW5nZWQnLFxuICAnLS11cGRhdGUtc25hcHNob3RzJyxcbiAgJy0tdXBkYXRlLXNvdXJjZS1tZXRob2QnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbJy1jJywgJy1nJywgJy1qJ10pO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMsIGJ1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kLCB0eXBlIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBjbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRDb25maWcpIHtcbiAgICAgIHJldHVybiBzdXBlci50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHN0YXJ0Q29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L2UyZS8nXTtcbiAgICBjb25zdCB0ZXN0Q29tbWFuZCA9IHRoaXMudGVzdFVuaXQocHJvamVjdCwgeyAuLi5hcmd2LCB0YXJnZXRzOiBub3JtYWxpemVkVGFyZ2V0cyB9KTtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYCR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDYwMDAwMCAtaSAyMDAwJyl9ICYmICR7dGVzdENvbW1hbmR9JHtzdWZmaXh9YCxcbiAgICBdKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImV4cG9ydCBjb25zdCBTRVJWRVJfTE9HX0ZJTEUgPSAnc2VydmVyLmxvZyc7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IFNFUlZFUl9MT0dfRklMRSB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUGxhaW5BcHBTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnREZXZQcm90ZWN0ZWQoXzE6IFByb2plY3QsIF8yOiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkLicpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREZXYoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YFxuICAgICk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgJHtwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biBydW4nIDogJ25vZGUnfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9IHwgdGVlICR7U0VSVkVSX0xPR19GSUxFfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0VGVzdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICAgICl9YFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVdpdGhQbGF5d3JpZ2h0TWFuYWdlZFNlcnZlcihwcm9qZWN0LCBhcmd2LCBvcHRpb25zKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVXaXRoUGxheXdyaWdodE1hbmFnZWRTZXJ2ZXIocHJvamVjdCwgYXJndiwgb3B0aW9ucyk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRURvY2tlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbGlicmFyeSBoYXMgbm8gc2VydmVyIG9mIGl0cyBvd24sIGJ1dCBpdCBtYXkgc2hpcCBhIHNlbGYtY29udGFpbmVkIFBsYXl3cmlnaHQgZml4dHVyZSB3aG9zZVxuICAgKiBjb25maWcgYnVpbGRzIGFuZCBzdGFydHMgdGhlIGFwcCB1bmRlciB0ZXN0IHZpYSBhIGB3ZWJTZXJ2ZXJgIGJsb2NrIChlLmcuIGEgTmV4dC5qcyBmaXh0dXJlIHRoYXRcbiAgICogdmVyaWZpZXMgdGhlIHB1Ymxpc2hlZCBwYWNrYWdlIGltcG9ydHMgY2xlYW5seSkuIFJ1biBQbGF5d3JpZ2h0IGRpcmVjdGx5IGluIHRoYXQgY2FzZSDigJQgaW5jbHVkaW5nXG4gICAqIG9uIENJLCB3aGVyZSBQbGF5d3JpZ2h0J3Mgb3duIGB3ZWJTZXJ2ZXJgIHN0YXJ0cyB0aGUgZml4dHVyZSDigJQgb3RoZXJ3aXNlIHRoZXJlIGlzIG5vdGhpbmcgdG8gcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSB0ZXN0RTJFV2l0aFBsYXl3cmlnaHRNYW5hZ2VkU2VydmVyKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgcHJvamVjdC5oYXNQbGF5d3JpZ2h0V2ViU2VydmVyQ29uZmlnXG4gICAgICAgID8gdGhpcy5idWlsZFBsYXl3cmlnaHRPbmx5Q29tbWFuZChwcm9qZWN0LCBhcmd2LCBvcHRpb25zKVxuICAgICAgICA6IGBlY2hvICdkbyBub3RoaW5nLidgXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0U3RhcnQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5BcHBTY3JpcHRzID0gbmV3IFBsYWluQXBwU2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgLy8gQmxpdHoncyB3aXRoQmxpdHogd2lyZXMgaXRzIFJQQyBsYXllciB0aHJvdWdoIGEgd2VicGFjayBsb2FkZXIsIHdoaWNoIFR1cmJvcGFjayBpZ25vcmVzLFxuICAgIC8vIHNvIEJsaXR6IGFwcHMgbXVzdCBydW4gdGhlIHdlYnBhY2sgZGV2IHNlcnZlciAoVHVyYm9wYWNrIGRpZXMgd2l0aCByZXNvbHZlIGVycm9ycykuXG4gICAgLy8gUGFzc2luZyBubyBidW5kbGVyIGZsYWcgc2VsZWN0cyB3ZWJwYWNrIG9ubHkgb24gTmV4dC5qcyAxNTsgTmV4dC5qcyAxNiBkZWZhdWx0cyB0b1xuICAgIC8vIFR1cmJvcGFjayBhbmQgbmVlZHMgYW4gZXhwbGljaXQgLS13ZWJwYWNrLCBhIGZsYWcgTmV4dC5qcyAxNSdzIENMSSByZWplY3RzIGFzIHVua25vd24uXG4gICAgbGV0IGJ1bmRsZXJPcHRpb24gPSAnLS10dXJib3BhY2sgJztcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6KSB7XG4gICAgICBidW5kbGVyT3B0aW9uID0gZ2V0TmV4dE1ham9yVmVyc2lvbihwcm9qZWN0KSA+PSAxNiA/ICctLXdlYnBhY2sgJyA6ICcnO1xuICAgIH1cbiAgICByZXR1cm4gYFlBUk4gbmV4dCBkZXYgJHtidW5kbGVyT3B0aW9ufSR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBZQVJOIG5leHQgc3RhcnQgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG5cbi8qKlxuICogUHJlZmVycyB0aGUgaW5zdGFsbGVkIHBhY2thZ2Ugb3ZlciB0aGUgZGVjbGFyZWQgc3BlY2lmaWVyIGJlY2F1c2UgdGhlIGRlY2xhcmVkIG9uZSBtYXkgYmUgYVxuICogcmFuZ2U7IGZhbGxzIGJhY2sgdG8gMTUgKHdlYnBhY2stYnktZGVmYXVsdCBiZWhhdmlvcikgd2hlbiBuZWl0aGVyIGlzIHJlYWRhYmxlLlxuICovXG5mdW5jdGlvbiBnZXROZXh0TWFqb3JWZXJzaW9uKHByb2plY3Q6IFByb2plY3QpOiBudW1iZXIge1xuICB0cnkge1xuICAgIGNvbnN0IGluc3RhbGxlZCA9IEpTT04ucGFyc2UoXG4gICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICduZXh0JywgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfTtcbiAgICBjb25zdCBtYWpvciA9IHNlbXZlci5jb2VyY2UoaW5zdGFsbGVkLnZlcnNpb24pPy5tYWpvcjtcbiAgICBpZiAobWFqb3IgIT09IHVuZGVmaW5lZCkgcmV0dXJuIG1ham9yO1xuICB9IGNhdGNoIHtcbiAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGRlY2xhcmVkIHNwZWNpZmllclxuICB9XG4gIHJldHVybiBzZW12ZXIuY29lcmNlKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5uZXh0KT8ubWFqb3IgPz8gMTU7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQge1xuICBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZCxcbiAgYnVpbGRHZW5EZXZWYXJzQ29tbWFuZCxcbiAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQsXG4gIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyB2aW5leHQgKE5leHQuanMgb24gVml0ZSkgYXBwcyB0YXJnZXRpbmcgQ2xvdWRmbGFyZSBXb3JrZXJzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBWaW5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgLy8gVW5saWtlIGBuZXh0IGRldmAsIFZpdGUtYmFzZWQgdmluZXh0IGRvZXMgbm90IHJlYWQgdGhlIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gICAgY29uc3QgZGV2Q29tbWFuZCA9IGBZQVJOIHZpbmV4dCBkZXYgLS1wb3J0ICR7cHJvamVjdC5lbnYuUE9SVH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgICAvLyBUaGUgQ2xvdWRmbGFyZSB2aXRlIHBsdWdpbiAobWluaWZsYXJlKSByZWFkcyBydW50aW1lIHZhcnMgb25seSBmcm9tIGEgLmRldi52YXJzIGZpbGUsXG4gICAgLy8gc28gaXQgbXVzdCBiZSByZWdlbmVyYXRlZCBmcm9tIHRoZSBmbm94LW1hbmFnZWQgdmFsdWVzIGJlZm9yZSBzZXJ2aW5nLlxuICAgIGNvbnN0IGNvbW1hbmRzID0gW2J1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndiwgJy5kZXYudmFycycpXTtcbiAgICAvLyBgdmluZXh0IGRldmAgKG1pbmlmbGFyZSkgc3RhcnRzIHdpdGggYW4gZW1wdHkgbG9jYWwgRDEgYW5kIGFwcGxpZXMgbm8gbWlncmF0aW9ucyBpdHNlbGY7XG4gICAgLy8gdGhlIHRlc3QgZW52aXJvbm1lbnQgd2lwZXMgaXRzIHN0YXRlIGRpcmVjdG9yeSwgc28gZXZlcnkgcGFnZSB3b3VsZCA1MDAgd2l0aG91dCB0aGlzLlxuICAgIGNvbnN0IG1pZ3JhdGlvbkNvbW1hbmQgPSBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpID8gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKG1pZ3JhdGlvbkNvbW1hbmQpIGNvbW1hbmRzLnB1c2gobWlncmF0aW9uQ29tbWFuZCk7XG4gICAgcmV0dXJuIFsuLi5jb21tYW5kcywgZGV2Q29tbWFuZF0uam9pbignICYmICcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIC8vIFNlcnZpbmcgdGhlIGJ1aWx0IHdvcmtlciBzdGFydHMgZnJvbSBhbiBlbXB0eSAob3Igd2lwZWQpIGxvY2FsIEQxLCBzbyB3cmFuZ2xlci1uYXRpdmVcbiAgICAvLyBtaWdyYXRpb25zIChpZiBhbnkpIG11c3QgYmUgYXBwbGllZCBmaXJzdDsgZHJpenpsZS9wcmlzbWEgbWlncmF0aW9ucyBhcmUgaGFuZGxlZCBieVxuICAgIC8vIGJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQuXG4gICAgY29uc3QgZDFNaWdyYXRpb25zQ29tbWFuZCA9IGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3QpO1xuICAgIC8vIGB2aW5leHQgYnVpbGRgIGVtaXRzIGEgd29ya2VyIGJ1bmRsZSBhbmQgaXRzIHdyYW5nbGVyIGNvbmZpZyB1bmRlciBkaXN0L3NlcnZlciwgc28gdGhlXG4gICAgLy8gLmRldi52YXJzIGZpbGUgZXhwb3Npbmcgd2ItbWFuYWdlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCBiZSBnZW5lcmF0ZWQgYWZ0ZXIgYnVpbGRpbmcuXG4gICAgLy8gYC0tbG9jYWwtdXBzdHJlYW1gIGtlZXBzIHJlcXVlc3QgVVJMcyBvbiB0aGUgbG9jYWwgaG9zdDsgb3RoZXJ3aXNlLCB3cmFuZ2xlciBkZXYgc2ltdWxhdGVzXG4gICAgLy8gdGhlIHByb2R1Y3Rpb24gY3VzdG9tIGRvbWFpbiBkZWNsYXJlZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnIHJvdXRlcy5cbiAgICByZXR1cm4gW1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3YsICdkaXN0L3NlcnZlci8uZGV2LnZhcnMnKSxcbiAgICAgIC4uLihkMU1pZ3JhdGlvbnNDb21tYW5kID8gW2QxTWlncmF0aW9uc0NvbW1hbmRdIDogW10pLFxuICAgICAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQoXG4gICAgICAgIGBkZXYgLS1jb25maWcgZGlzdC9zZXJ2ZXIvd3JhbmdsZXIuanNvbiAtLWlwIDEyNy4wLjAuMSAtLXBvcnQgJHtwb3J0fSAtLXBlcnNpc3QtdG8gXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cIiAtLWxvY2FsLXVwc3RyZWFtIGxvY2FsaG9zdDoke3BvcnR9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKClcbiAgICAgICksXG4gICAgXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdmluZXh0U2NyaXB0cyA9IG5ldyBWaW5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgVml0ZS1iYXNlZCBhcHBzIHdpdGggUGxheXdyaWdodCBlMmUgdGVzdHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpdGVTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gdml0ZSBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBZQVJOIHZpdGUgcHJldmlldyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aXRlU2NyaXB0cyA9IG5ldyBWaXRlU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQge1xuICBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZCxcbiAgYnVpbGRHZW5EZXZWYXJzQ29tbWFuZCxcbiAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQsXG4gIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBwbGFpbiBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwcyAoZGV0ZWN0ZWQgdmlhIGEgd3JhbmdsZXJcbiAqIGNvbmZpZyBmaWxlIHdoZW4gbm8gb3RoZXIgZnJhbWV3b3JrIG1hdGNoZXM7IHZpbmV4dCBhcHBzIGhhdmUgdGhlaXIgb3duIHNjcmlwdHMpLlxuICogRXh0ZW5kcyBIdHRwU2VydmVyU2NyaXB0cyBzbyB0aGF0IGUyZSB0ZXN0cyBydW4gdmlhIHRoZSB1bml0LXRlc3QgcnVubmVyIGFnYWluc3QgdGhlIHJ1bm5pbmdcbiAqIHdvcmtlciB3aGVuIHRoZSBwcm9qZWN0IGhhcyBubyBQbGF5d3JpZ2h0IGNvbmZpZy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgV29ya2Vyc1NjcmlwdHMgZXh0ZW5kcyBIdHRwU2VydmVyU2NyaXB0cyB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFdyYW5nbGVyRGV2Q29tbWFuZHMocHJvamVjdCwgYXJndikuam9pbignICYmICcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgLy8gd3JhbmdsZXIgZGV2IGJ1bmRsZXMgdGhlIHdvcmtlciBpdHNlbGYsIHNvIG5vIHNlcGFyYXRlIGJ1aWxkIHN0ZXAgaXMgbmVlZGVkLlxuICAgIHJldHVybiB0aGlzLmJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kcyhwcm9qZWN0LCBhcmd2KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzg3ODcnO1xuICAgIGNvbnN0IHN0YXRlRGlyID0gZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpO1xuXG4gICAgLy8gVGhlc2UgaGVscGVycyByZWFkIHRoZSBkZWZhdWx0LW5hbWVkIHdyYW5nbGVyIGNvbmZpZzsgdGhhdCBpcyBzYWZlIGJlY2F1c2Ugd29ya2Vyc1NjcmlwdHNcbiAgICAvLyBpdHNlbGYgaXMgb25seSBzZWxlY3RlZCB3aGVuIHN1Y2ggYSBjb25maWcgZmlsZSBleGlzdHMgaW4gdGhlIHByb2plY3QgZGlyZWN0b3J5LlxuICAgIGNvbnN0IGNvbW1hbmRzID0gW2J1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndiwgJy5kZXYudmFycycpXTtcbiAgICAvLyBBcHBseSB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyAoaWYgYW55KSBzbyB0aGUgbG9jYWwgZGF0YWJhc2UgbWF0Y2hlcyB0aGUgZGVwbG95ZWQgb25lLlxuICAgIGNvbnN0IGQxTWlncmF0aW9uc0NvbW1hbmQgPSBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0KTtcbiAgICBpZiAoZDFNaWdyYXRpb25zQ29tbWFuZCkge1xuICAgICAgY29tbWFuZHMucHVzaChkMU1pZ3JhdGlvbnNDb21tYW5kKTtcbiAgICB9XG4gICAgY29tbWFuZHMucHVzaChcbiAgICAgIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kKFxuICAgICAgICBgZGV2IC0taXAgMTI3LjAuMC4xIC0tcG9ydCAke3Byb2plY3QuZW52LlBPUlR9IC0tcGVyc2lzdC10byBcIiR7c3RhdGVEaXJ9XCIgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGNvbW1hbmRzO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB3b3JrZXJzU2NyaXB0cyA9IG5ldyBXb3JrZXJzU2NyaXB0cygpO1xuIiwiaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdmluZXh0U2NyaXB0cyB9IGZyb20gJy4vdmluZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgd29ya2Vyc1NjcmlwdHMgfSBmcm9tICcuL3dvcmtlcnNTY3JpcHRzLmpzJztcblxuLyoqIFBpY2tzIHRoZSBzY3JpcHRzIGltcGxlbWVudGF0aW9uIGZvciB0aGUgcHJvamVjdCAodGhlIHNlbGVjdGlvbiBgd2IgdGVzdGAvYHdiIHRlc3Qtb24tY2lgIHNoYXJlKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RTY3JpcHRzKHByb2plY3Q6IFByb2plY3QpOiBCYXNlU2NyaXB0cyB7XG4gIHJldHVybiBzZWxlY3RGcmFtZXdvcmtTY3JpcHRzKHByb2plY3QpID8/IChkZXBlbmRzT25IdHRwU2VydmVyUGFja2FnZShwcm9qZWN0KSA/IGh0dHBTZXJ2ZXJTY3JpcHRzIDogcGxhaW5BcHBTY3JpcHRzKTtcbn1cblxuLyoqIFRoZSBmcmFtZXdvcmstZGV0ZWN0aW9uIHByZWZpeCBldmVyeSBjb25zdW1lciBzaGFyZXM7IGB3YiBzdGFydGAgY29tcG9zZXMgaXRzIG93biB0YWlsIGFyb3VuZCBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RGcmFtZXdvcmtTY3JpcHRzKHByb2plY3Q6IFByb2plY3QpOiBCYXNlU2NyaXB0cyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyB2aW5leHQgYXBwcyBhbHNvIGRlcGVuZCBvbiBuZXh0LCBzbyB0aGlzIGNoZWNrIG11c3QgY29tZSBmaXJzdC5cbiAgaWYgKGRlcHMudmluZXh0IHx8IGRldkRlcHMudmluZXh0KSByZXR1cm4gdmluZXh0U2NyaXB0cztcbiAgaWYgKGRlcHMubmV4dCkgcmV0dXJuIG5leHRTY3JpcHRzO1xuICBpZiAoZGV2RGVwcy52aXRlKSByZXR1cm4gdml0ZVNjcmlwdHM7XG4gIC8vIFBsYWluIENsb3VkZmxhcmUgV29ya2VycyBhcHA7IHZpbmV4dCBhcHBzIGFyZSBkZXRlY3RlZCBhYm92ZS5cbiAgaWYgKGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCkpIHJldHVybiB3b3JrZXJzU2NyaXB0cztcbiAgcmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVwZW5kc09uSHR0cFNlcnZlclBhY2thZ2UocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gIHJldHVybiBodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXJncywgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IGRlcGVuZHNPbkh0dHBTZXJ2ZXJQYWNrYWdlLCBzZWxlY3RGcmFtZXdvcmtTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vc2VsZWN0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlN0YXJ0IGFwcC4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byB0aGUgdW5kZXJseWluZyBhcHAgY29tbWFuZC4gRXhhbXBsZTogd2Igc3RhcnQgLS0gLS1ob3N0IDAuMC4wLjBcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSkub3B0aW9ucyhidWlsZGVyKSBhcyBBcmd2PFxuICAgICAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbiAgICA+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cyB8IHVuZGVmaW5lZCA9IHNlbGVjdEZyYW1ld29ya1NjcmlwdHMocHJvamVjdCk7XG4gICAgICBpZiAoIXNjcmlwdHMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRlcGVuZHNPbkh0dHBTZXJ2ZXJQYWNrYWdlKHByb2plY3QpIHx8XG4gICAgICAgICAgKHByb2plY3QuaGFzRG9ja2VyZmlsZSAmJiAvRVhQT1NFXFxzKzgwODAvLnRlc3QocHJvamVjdC5kb2NrZXJmaWxlKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgICB9IGVsc2UgaWYgKGRlcHNbJ2J1aWxkLXRzJ10gfHwgZGV2RGVwc1snYnVpbGQtdHMnXSkge1xuICAgICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnZGV2ZWxvcG1lbnQnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RGV2KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGF3YWl0IHNjcmlwdHMuc3RhcnRUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IHNlbGVjdFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9zZWxlY3RTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBmaW5kVGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMsIHByaW50VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMgfSBmcm9tICcuLi91dGlscy90ZXN0U3RydWN0dXJlLmpzJztcblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfTE9PS0JBQ0tfTElORV9DT1VOVCA9IDIwMDtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU8gPSAwLjA1O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0hvdyB0byBydW4gRTJFIHRlc3RzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBiYWlsOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdG9wIHRlc3RzIGFmdGVyIHRoZSBmaXJzdCBmYWlsdXJlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBhcnJheTogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ1VuaXQgb3IgRTJFIHRlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVGVzdENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPjtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCB0eXBlIFRlc3RDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUZXN0Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogc3RyaW5nW10gfTtcblxuaW50ZXJmYWNlIFRlc3RSdW5PcHRpb25zIHtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IHRlc3RDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFRlc3RDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0IFt0YXJnZXRzLi4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiVGVzdCBwcm9qZWN0LiBJZiB5b3UgcGFzcyBubyBhcmd1bWVudHMsIGl0IHdpbGwgcnVuIGFsbCB0ZXN0cy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGZsYWdzIHRvIFBsYXl3cmlnaHQuIEV4YW1wbGU6IHdiIHRlc3QgLS0gLS1ncmVwICd1cGxvYWRlZCBpbWFnZSBhc3NldCdcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KTogQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+ID0+XG4gICAgeWFyZ3NcbiAgICAgIC5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pXG4gICAgICAub3B0aW9ucyhidWlsZGVyKVxuICAgICAgLnBvc2l0aW9uYWwoJ3RhcmdldHMnLCBhcmd1bWVudHNCdWlsZGVyLnRhcmdldHMpIGFzIEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcHJvY2Vzcy5leGl0KGF3YWl0IHRlc3QoYXJndiBhcyBUZXN0Q29tbWFuZEFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0KGFyZ3Y6IFRlc3RDb21tYW5kQXJndiwgb3B0aW9uczogVGVzdFJ1bk9wdGlvbnMgPSB7fSk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHRlc3RBcmd2ID0gd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudihhcmd2KTtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKHRlc3RBcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIC8vIEdldCB0ZXN0IHRhcmdldHMgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICBjb25zdCB0ZXN0VGFyZ2V0cyA9ICh0ZXN0QXJndi50YXJnZXRzID8/IFtdKSBhcyBzdHJpbmdbXTtcbiAgY29uc3QgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSB0ZXN0QXJndlsnLS0nXSA/PyBbXTtcbiAgY29uc3QgeyBzaG91bGRSdW5FMmUsIHNob3VsZFJ1blVuaXQgfSA9IHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyh0ZXN0VGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIC8vIFJlc29sdmUgdGhlIGVudmlyb25tZW50IGVhZ2VybHk6IHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYgZm9yY2VzIHRoZSB0ZXN0IGNhc2NhZGUgYW5kXG4gICAgLy8gUHJvamVjdC5jb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYgZmFsbHMgYmFjayBXQl9FTlYgdG8gdGhhdCBtb2RlIOKAlCBidXQgdGhlIGVudiBnZXR0ZXIgaXNcbiAgICAvLyBsYXp5LCBzbyBhIHByb2plY3Qgd2l0aCBubyBydW5uYWJsZSB0ZXN0cyB3b3VsZCBvdGhlcndpc2Ugc2tpcCB0aGUgdmFsaWRhdGlvbiBlbnRpcmVseS5cbiAgICB2b2lkIHByb2plY3QuZW52O1xuXG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBzY3JpcHRzID0gc2VsZWN0U2NyaXB0cyhwcm9qZWN0KTtcblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgY29uc3Qgc3RydWN0dXJlVmlvbGF0aW9ucyA9IGZpbmRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyhwcm9qZWN0KTtcbiAgICBpZiAoc3RydWN0dXJlVmlvbGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBwcmludFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QubmFtZSwgc3RydWN0dXJlVmlvbGF0aW9ucyk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBjb25zdCBkZWZhdWx0VW5pdFRhcmdldHMgPSBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdCk7XG4gICAgY29uc3QgZXhwbGljaXRVbml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiAhaXNFMmVUYXJnZXQodGFyZ2V0KSk7XG4gICAgY29uc3QgdW5pdFRhcmdldHMgPSBleHBsaWNpdFVuaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyBleHBsaWNpdFVuaXRUYXJnZXRzIDogZGVmYXVsdFVuaXRUYXJnZXRzO1xuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIHVuaXRUYXJnZXRzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgdW5pdEFyZ3YgPSB7IC4uLnRlc3RBcmd2LCB0YXJnZXRzOiB1bml0VGFyZ2V0cyB9O1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Vbml0VGVzdENvbW1hbmQoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIHRlc3RBcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gICAgICAgIHRpbWVvdXQ6IHRlc3RBcmd2LnVuaXRUaW1lb3V0LFxuICAgICAgfSk7XG4gICAgICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gaXNFMmVUYXJnZXQodGFyZ2V0KSk7XG4gICAgY29uc3QgZTJlQXJndiA9IHsgLi4udGVzdEFyZ3YsIHRhcmdldHM6IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMgOiB1bmRlZmluZWQgfTtcblxuICAgIHN3aXRjaCAodGVzdEFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0ZXN0T25Eb2NrZXIoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBlMmVBcmd2LFxuICAgICAgICAgIHNjcmlwdHMsXG4gICAgICAgICAgYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlcHMubmV4dCB8fCBkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHN3aXRjaCAodGVzdEFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlYnVnJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBbJ2NvZGVnZW4nLCBgaHR0cDovL2xvY2FsaG9zdDoke3Byb2plY3QuZW52LlBPUlR9YF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0cmFjZSc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgdGVzdEFyZ3YsIHtcbiAgICAgICAgICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KGFyZ3Y6IFRlc3RDb21tYW5kQXJndik6IFRlc3RDb21tYW5kQXJndiB7XG4gIGlmIChhcmd2LmNhc2NhZGVFbnYgfHwgYXJndi5jYXNjYWRlTm9kZUVudiB8fCBhcmd2LmF1dG9DYXNjYWRlRW52ID09PSBmYWxzZSkge1xuICAgIC8vIEV4cGxpY2l0IGVudiBmbGFncyBrZWVwIHRoZWlyIHByb2ZpbGUtc2VsZWN0aW9uIHNlbWFudGljcywgYnV0IHRoZSBzcGF3bmVkIHRlc3RzIG11c3Qgc3RpbGxcbiAgICAvLyBydW4gYXMgYHRlc3RgIHdoZW4gdGhlIHNlbGVjdGVkIHByb2ZpbGUgZGVmaW5lcyBubyBXQl9FTlYgKHRoZSBwcmUtMTUgYHx8PSAndGVzdCdgIGJlaGF2aW9yKS5cbiAgICByZXR1cm4geyAuLi5hcmd2LCBjb21tYW5kRGVmYXVsdFdiRW52OiAndGVzdCcgfTtcbiAgfVxuICByZXR1cm4geyAuLi5hcmd2LCBjYXNjYWRlRW52OiAndGVzdCcgfTtcbn1cblxuLyoqXG4gKiBVbml0IHRlc3RzIGxpdmUgb25seSB1bmRlciBgdGVzdC91bml0L2A7IGB0ZXN0L2RlYnVnL2AgcnVucyBvbmx5IHdoZW4gZXhwbGljaXRseSB0YXJnZXRlZC4gQm90aFxuICogdml0ZXN0IGFuZCBgYnVuIHRlc3RgIHRyZWF0IGEgYmFyZSBgdGVzdGAgYXMgYSBmaWxlbmFtZSBmaWx0ZXIsIHdoaWNoIGFsc28gbWF0Y2hlcyBlLmcuXG4gKiBgc3JjL2Zvby50ZXN0LnRzYCwgc28gdGhlIHRyYWlsaW5nIHNsYXNoIHRoYXQgbGltaXRzIHRoZSB0YXJnZXQgdG8gdGhlIGRpcmVjdG9yeSBpcyByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRVbml0VGFyZ2V0cyhwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4pOiBzdHJpbmdbXSB8IGZhbHNlIHtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSA/IFsnLi90ZXN0L3VuaXQvJ10gOiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgY29uc3QgYnVpbGRFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndiwge1xuICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gIH0pO1xuICBpZiAoYnVpbGRFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiBidWlsZEV4aXRDb2RlO1xuICB9XG4gIGNvbnN0IHRlc3RFeGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBjb25zdCBzdG9wRXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgfSk7XG4gIGlmICh0ZXN0RXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gdGVzdEV4aXRDb2RlO1xuICB9XG4gIHJldHVybiBzdG9wRXhpdENvZGU7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgcHJvY2Vzc1NpbGVudE91dHB1dDogZGVkdXBlTm9pc3lUZXN0T3V0cHV0LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuVW5pdFRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgb21pdFNpbGVudFN0YXJ0OiB0cnVlLFxuICAgIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seTogdHJ1ZSxcbiAgICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM6IDEwXzAwMCxcbiAgICBzaWxlbnRTdWNjZXNzTWVzc2FnZTogJ1VuaXQgdGVzdHMgcGFzc2VkLicsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWNlbnRQcmludGVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlZHVwZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGl0ZXJhdGVMaW5lcyhvdXRwdXQpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZExpbmUgPSBub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eShsaW5lKTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVTZXQuaGFzKG5vcm1hbGl6ZWRMaW5lKSkgY29udGludWU7XG4gICAgaWYgKHJlY2VudFByaW50ZWRMaW5lcy5zb21lKChwcmludGVkTGluZSkgPT4gYXJlTGluZXNTaW1pbGFyKHByaW50ZWRMaW5lLCBub3JtYWxpemVkTGluZSkpKSBjb250aW51ZTtcblxuICAgIHB1c2hSZWNlbnRQcmludGVkTGluZShyZWNlbnRQcmludGVkTGluZXMsIHJlY2VudFByaW50ZWRMaW5lU2V0LCBub3JtYWxpemVkTGluZSk7XG4gICAgZGVkdXBlZExpbmVzLnB1c2gobGluZSk7XG4gIH1cbiAgcmV0dXJuIGRlZHVwZWRMaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24qIGl0ZXJhdGVMaW5lcyhvdXRwdXQ6IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgbGV0IGxpbmVTdGFydEluZGV4ID0gMDtcbiAgd2hpbGUgKGxpbmVTdGFydEluZGV4IDw9IG91dHB1dC5sZW5ndGgpIHtcbiAgICBjb25zdCBsaW5lRW5kSW5kZXggPSBvdXRwdXQuaW5kZXhPZignXFxuJywgbGluZVN0YXJ0SW5kZXgpO1xuICAgIGlmIChsaW5lRW5kSW5kZXggPT09IC0xKSB7XG4gICAgICB5aWVsZCBvdXRwdXQuc2xpY2UobGluZVN0YXJ0SW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCwgbGluZUVuZEluZGV4KTtcbiAgICBsaW5lU3RhcnRJbmRleCA9IGxpbmVFbmRJbmRleCArIDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFJlY2VudFByaW50ZWRMaW5lKGxpbmVzOiBzdHJpbmdbXSwgbGluZVNldDogU2V0PHN0cmluZz4sIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBsaW5lcy5wdXNoKGxpbmUpO1xuICBsaW5lU2V0LmFkZChsaW5lKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQpIHJldHVybjtcblxuICBjb25zdCByZW1vdmVkTGluZSA9IGxpbmVzLnNoaWZ0KCk7XG4gIGlmIChyZW1vdmVkTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGluZVNldC5kZWxldGUocmVtb3ZlZExpbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsaW5lXG4gICAgLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKVxuICAgIC50cmltKClcbiAgICAucmVwbGFjZUFsbCgvXig/OlxcW1teXFxdXStcXF1cXHMqKSsvZywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcKG5vZGU6XFxkK1xcKS9nLCAnKG5vZGU6PG51bWJlcj4pJylcbiAgICAucmVwbGFjZUFsbCgvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQrKT9aP1xcYi9nLCAnPHRpbWVzdGFtcD4nKVxuICAgIC5yZXBsYWNlQWxsKC8oWz8mXWNhY2hlPSlcXGQrL2csICckMTxudW1iZXI+Jyk7XG59XG5cbmZ1bmN0aW9uIGFyZUxpbmVzU2ltaWxhcihhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICBpZiAobWF4TGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKE1hdGguYWJzKGEubGVuZ3RoIC0gYi5sZW5ndGgpID4gbWF4TGVuZ3RoICogU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTykgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkaXN0YW5jZShhLCBiKSAvIG1heExlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShcbiAgZTJlVGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdLFxuICBhZGRpdGlvbmFsQXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKS5sZW5ndGggPiAwO1xuICByZXR1cm4gWyd0ZXN0JywgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCB8fCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA/IFtdIDogWyd0ZXN0L2UyZS8nXSksIC4uLmFkZGl0aW9uYWxBcmdzXTtcbn1cblxuLy8gTWF0Y2ggdGhlIHRlc3QvZTJlIHBhdGggc2VnbWVudCwgbm90IHRoZSAnL2UyZScgc3Vic3RyaW5nOiBhIHVuaXQgdGFyZ2V0IHN1Y2ggYXNcbi8vIHRlc3QvdW5pdC9lMmVDb25maWcudGVzdC50cyBtdXN0IG5vdCBiZSBjbGFzc2lmaWVkIGFzIGFuIGUyZSB0YXJnZXQuXG5jb25zdCBFMkVfVEFSR0VUX1JFR0VYUCA9IC8oPzpefFxcLyl0ZXN0XFwvZTJlKD86XFwvfCQpLztcblxuZnVuY3Rpb24gaXNFMmVUYXJnZXQodGFyZ2V0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEUyRV9UQVJHRVRfUkVHRVhQLnRlc3QodGFyZ2V0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyhcbiAgdGVzdFRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogeyBzaG91bGRSdW5Vbml0OiBib29sZWFuOyBzaG91bGRSdW5FMmU6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IGlzRTJlVGFyZ2V0KHRhcmdldCkpO1xuICAvLyBOb24tZTJlIHRhcmdldHMgKHRlc3QvdW5pdC8gYW5kIHRlc3QvZGVidWcvKSBydW4gdGhyb3VnaCB0aGUgdW5pdC10ZXN0IHJ1bm5lci5cbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+ICFpc0UyZVRhcmdldCh0YXJnZXQpKTtcbiAgY29uc3Qgc2hvdWxkUnVuQWxsVGVzdHMgPSB0ZXN0VGFyZ2V0cy5sZW5ndGggPT09IDAgJiYgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MubGVuZ3RoID09PSAwO1xuXG4gIHJldHVybiB7XG4gICAgc2hvdWxkUnVuVW5pdDogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzVW5pdFRhcmdldHMsXG4gICAgc2hvdWxkUnVuRTJlOiBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNFMmVUYXJnZXRzIHx8IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA+IDAsXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IHNlbGVjdFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9zZWxlY3RTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGZpbmRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucywgcHJpbnRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyB9IGZyb20gJy4uL3V0aWxzL3Rlc3RTdHJ1Y3R1cmUuanMnO1xuXG5pbXBvcnQgeyBnZXREZWZhdWx0VW5pdFRhcmdldHMgfSBmcm9tICcuL3Rlc3QuanMnO1xuXG5jb25zdCB0ZXN0T25DaUJ1aWxkZXIgPSB7XG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHRlc3RPbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3Qtb24tY2knLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCBvbiBDSSB3aXRoIG5vIG9wdGlvbnMuJyxcbiAgYnVpbGRlcjogdGVzdE9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0T25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0T25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gU3Bhd25lZCBjb21tYW5kcyByZS1kZXJpdmUgdGhlaXIgZW52IGNhc2NhZGUgZnJvbSB0aGUgZXhwb3J0ZWQgV0JfRU5WLCBzbyBhbiB1bmV4cG9ydGVkXG4gIC8vIFdCX0VOViB3b3VsZCBsZXQgYSBjb25maWd1cmVkIFdCX0VOViBkZWZhdWx0IChlLmcuIGRldmVsb3BtZW50KSBzZWxlY3QgdGhlIGRldmVsb3BtZW50XG4gIC8vIGVudmlyb25tZW50IOKAlCBydW5uaW5nIHRoZSBkZXN0cnVjdGl2ZSBlMmUgc3VpdGUgYWdhaW5zdCB0aGUgZGV2ZWxvcGVyJ3Mgb3duIGRhdGFiYXNlLlxuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgcHJvamVjdC5lbnYuQ0kgfHw9ICcxJztcbiAgICAvLyBPdmVyd3JpdGUsIG5vdCB8fD06IHByb2plY3QuZW52IGFscmVhZHkgY2FycmllcyB0aGUgZG90ZW52LWRlcml2ZWQgdmFsdWUuXG4gICAgcHJvamVjdC5lbnYuV0JfRU5WID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuXG4gICAgY29uc3Qgc2NyaXB0cyA9IHNlbGVjdFNjcmlwdHMocHJvamVjdCk7XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0LW9uLWNpXCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIGNvbnN0IHN0cnVjdHVyZVZpb2xhdGlvbnMgPSBmaW5kVGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMocHJvamVjdCk7XG4gICAgaWYgKHN0cnVjdHVyZVZpb2xhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgcHJpbnRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyhwcm9qZWN0Lm5hbWUsIHN0cnVjdHVyZVZpb2xhdGlvbnMpO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNEb2NrZXJmaWxlID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlO1xuICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgY29uc3QgZGVmYXVsdFVuaXRUYXJnZXRzID0gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3QpO1xuICAgIGlmIChkZWZhdWx0VW5pdFRhcmdldHMgIT09IGZhbHNlKSB7XG4gICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICBjb25zdCB1bml0QXJndiA9IHsgLi4uYXJndiwgdGFyZ2V0czogZGVmYXVsdFVuaXRUYXJnZXRzIH07XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgdW5pdEFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgLy8gQ29uZmlybSBkZXYgc2VydmVyIHN0YXJ0dXAgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBwcm9qZWN0cyB3aXRoIEUyRSB0ZXN0cy5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBoYXNEb2NrZXJmaWxlXG4gICAgICAgID8gYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHt9KVxuICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgLy8gUHJlc2VydmUgYSBub256ZXJvIGV4aXQgY29kZSBmcm9tIGFuIGVhcmxpZXIgcHJvamVjdCAoZS5nLiBhIGxheW91dCB2aW9sYXRpb24pOiBhIGxhdGVyXG4gICAgICAvLyBzdWNjZXNzZnVsIHByb2plY3QgbXVzdCBub3QgcmVzZXQgdGhlIGZhaWx1cmUuXG4gICAgICBjb25zdCBlMmVFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHQucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChlMmVFeGl0Q29kZSAhPT0gMCkge1xuICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gZTJlRXhpdENvZGU7XG4gICAgICB9XG4gICAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW50ZXJmYWNlIFRyZWVLaWxsQ29tbWFuZEFyZ3Mge1xuICBwaWQ6IG51bWJlcjtcbiAgc2lnbmFsOiBzdHJpbmc7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSAoeWFyZ3M6IEFyZ3YpOiBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0+XG4gIHlhcmdzXG4gICAgLnBvc2l0aW9uYWwoJ3BpZCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHByb2Nlc3MgSUQgdG8ga2lsbC4nLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgfSlcbiAgICAub3B0aW9uKCdzaWduYWwnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1NpZ25hbCB0byBzZW5kIHRvIHRoZSBwcm9jZXNzIHRyZWUuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVmYXVsdDogJ1NJR1RFUk0nLFxuICAgIH0pIGFzIEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz47XG5cbmV4cG9ydCBjb25zdCB0cmVlS2lsbENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8b2JqZWN0LCBUcmVlS2lsbENvbW1hbmRBcmdzPiA9IHtcbiAgY29tbWFuZDogJ3RyZWUta2lsbCA8cGlkPiBbc2lnbmFsXScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgZ2l2ZW4gcHJvY2VzcyBhbmQgYWxsIGRlc2NlbmRhbnRzJyxcbiAgYnVpbGRlcixcbiAgaGFuZGxlcihhcmd2KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGFyZ3Yuc2lnbmFsIGFzIE5vZGVKUy5TaWduYWxzO1xuICAgICAgaWYgKCEoc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2lnbmFsOiAke3NpZ25hbH1gKTtcbiAgICAgIH1cbiAgICAgIHRyZWVLaWxsKGFyZ3YucGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG5leHBvcnQgdHlwZSBUeXBlQ2hlY2tDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIEVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgbm90IGxvYWRlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdHlwZUNoZWNrKGFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0eXBlQ2hlY2soYXJndjogVHlwZUNoZWNrQ29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgbGV0IHJlbW92ZWROZXh0RGlyID0gZmFsc2UgYXMgYm9vbGVhbjtcbiAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcbiAgICBjb25zdCBjb21tYW5kcyA9IGJ1aWxkVHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdCk7XG4gICAgd2hpbGUgKGNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kcy5qb2luKCcgJiYgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgIGNpOiBwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxLFxuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBwcmVzZXJ2ZUNvbG9yOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlLXRyeSB0eXBlIGNoZWNraW5nIGFmdGVyIHJlbW92aW5nIGAubmV4dGAgZGlyZWN0b3J5XG4gICAgICBjb25zdCBuZXh0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcubmV4dCcpO1xuICAgICAgaWYgKGV4aXRDb2RlICYmIGZzLmV4aXN0c1N5bmMobmV4dERpclBhdGgpKSB7XG4gICAgICAgIGZzLnJtU3luYyhuZXh0RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdSZW1vdmVkIGAubmV4dGAgZGlyZWN0b3J5LiBXZSB3aWxsIHJlLXRyeSB0eXBlIGNoZWNraW5nLicpKTtcbiAgICAgICAgcmVtb3ZlZE5leHREaXIgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgbGV0IGZpbmFsRXhpdENvZGUgPSAwO1xuICBmb3IgKGNvbnN0IGV4aXRDb2RlIG9mIGV4aXRDb2Rlcykge1xuICAgIGlmIChleGl0Q29kZSkgZmluYWxFeGl0Q29kZSA9IGV4aXRDb2RlO1xuICB9XG4gIGlmICghZmluYWxFeGl0Q29kZSlcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgcmVtb3ZlZE5leHREaXJcbiAgICAgICAgICA/ICctLS0tLVxcbk5vIHR5cGUgZXJyb3JzIGZvdW5kLiBQbGVhc2UgaWdub3JlIHRoZSBwcmV2aW91cyB0eXBlIGVycm9ycywgYXMgdGhleSB3ZXJlIGNhdXNlZCBieSBvdXRkYXRlZCBOZXh0LmpzIGNhY2hlIGZpbGVzLidcbiAgICAgICAgICA6ICdObyB0eXBlIGVycm9ycyBmb3VuZC4nXG4gICAgICApXG4gICAgKTtcbiAgcmV0dXJuIGZpbmFsRXhpdENvZGU7XG59XG5cbi8qKlxuICogRXZlcnkgdHlwZS1jaGVjayBjb21tYW5kIHRoaXMgcHJvamVjdCBydW5zLCBhcyBgQlVOYC9gWUFSTmAtcHJlZml4ZWQgc2NyaXB0cy4gRXhwb3J0ZWQgc29cbiAqIGB3YiB2ZXJpZnlgJ3Mgc3RlcCByZWNhcCBjYW4gbmFtZSB0aGUgc2FtZSB0b29scyBpbnN0ZWFkIG9mIHJlLWRlcml2aW5nIHRoZSBjb25kaXRpb25zLCB3aGljaFxuICogd291bGQgc2lsZW50bHkgZ28gc3RhbGUgdGhlIG5leHQgdGltZSB0aGlzIGxpc3QgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChwcm9qZWN0Lmhhc093blNvdXJjZUNvZGUpIHtcbiAgICBjb21tYW5kcy5wdXNoKC4uLmJ1aWxkVHlwZVNjcmlwdFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3QpKTtcbiAgfVxuICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ3B5cmlnaHQnKSkge1xuICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICB9XG4gIHJldHVybiBjb21tYW5kcztcbn1cblxuZnVuY3Rpb24gYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgYHR5cGVzY3JpcHRgIChgdHNjYCk7IHdiZnkgcmVtb3ZlcyB0aGVcbiAgLy8gYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCAodHNnbykgcHJldmlldyBmcm9tIG5vbi1OZXh0LmpzIHJlcG9zIChOZXh0LmpzLWZhbWlseVxuICAvLyByZXBvcyBrZWVwIGl0IGZvciBgbmV4dCBidWlsZGApLCBzbyByZXBvcyBzdGlsbCBvbiB0aGUgcHJldmlldyBzaG91bGQgcnVuIHdiZnlcbiAgLy8gaW5zdGVhZCBvZiByZWx5aW5nIG9uIGEgdHNnbyBmYWxsYmFjayBoZXJlLlxuICBpZiAocHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCd0eXBlc2NyaXB0JykpIHtcbiAgICByZXR1cm4gWydCVU4gdHNjIC0tbm9FbWl0J107XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMsIGZpbmRSb290QW5kU2VsZlByb2plY3RzLCBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVCdW5Mb2NrZmlsZSB9IGZyb20gJy4uL3V0aWxzL2J1bkxvY2tmaWxlLmpzJztcblxuaW1wb3J0IHsgYnVpbGRMaW50Q29tbWFuZCwgbGludCwgdHlwZSBMaW50Q29tbWFuZEFyZ3YgfSBmcm9tICcuL2xpbnQuanMnO1xuaW1wb3J0IHsgdGVzdCwgdHlwZSBUZXN0Q29tbWFuZEFyZ3YsIHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYgfSBmcm9tICcuL3Rlc3QuanMnO1xuaW1wb3J0IHsgYnVpbGRUeXBlQ2hlY2tDb21tYW5kcywgdHlwZUNoZWNrLCB0eXBlIFR5cGVDaGVja0NvbW1hbmRBcmd2IH0gZnJvbSAnLi90eXBlY2hlY2suanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmdWxsOiB7XG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIGRlc2NyaWJlOiAnUnVuIHRlc3RzIGFmdGVyIHZlcmlmeWluZyBwcm9qZWN0IGNvZGUnLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucz47XG50eXBlIFBhY2thZ2VDb21tYW5kQXJndiA9IFBpY2s8VmVyaWZ5Q29kZUNvbW1hbmRBcmd2LCAnZHJ5UnVuJyB8ICd2ZXJib3NlJz47XG5cbi8qKiBBIGNvbXBsZXRlZCBgd2IgdmVyaWZ5YCBzdGVwLCByZWNvcmRlZCBzbyB0aGUgZmluYWwgc3VtbWFyeSBjYW4gcHJvdmUgZXZlcnkgc3RlcCBhY3R1YWxseSByYW4uICovXG5pbnRlcmZhY2UgVmVyaWZ5U3RlcCB7XG4gIC8qKlxuICAgKiBBIHNob3J0IGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIHN0ZXAgcmFuLCBlLmcuIGB0c2MgLS1ub0VtaXRgLiBBZ2dyZWdhdGVkIGFjcm9zcyB0aGUgZGVzY2VuZGFudFxuICAgKiBwcm9qZWN0cywgc28gYCArIGAgbWVhbnMgZWFjaCB0b29sIHJhbiBzb21ld2hlcmUsIG5vdCB0aGF0IG9uZSBjb21tYW5kIHJhbiB0aGVtIGFsbC4gT21pdHRlZCB3aGVuXG4gICAqIG5vdGhpbmcgYmV5b25kIHRoZSBzdGVwIG5hbWUgZGVzY3JpYmVzIGl0LlxuICAgKi9cbiAgZGV0YWlsPzogc3RyaW5nO1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IHZlcmlmeUNvZGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd2ZXJpZnknLFxuICBkZXNjcmliZTogJ1ZlcmlmeSBwcm9qZWN0IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RlcHM6IFZlcmlmeVN0ZXBbXSA9IFtdO1xuICAgIGlmIChhcmd2LmZ1bGwpIHtcbiAgICAgIGF3YWl0IHZlcmlmeUNvZGVGdWxseShwcm9qZWN0cy5zZWxmLCBhcmd2LCBzdGVwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHZlcmlmeUNvZGUocHJvamVjdHMuc2VsZiwgYXJndiwgc3RlcHMpO1xuICAgICAgcHJpbnRWZXJpZnlTdW1tYXJ5KHN0ZXBzLCBCb29sZWFuKGFyZ3YuZHJ5UnVuKSk7XG4gICAgfVxuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Q29kZUZ1bGx5KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndiwgc3RlcHM6IFZlcmlmeVN0ZXBbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXBvcnRlciA9IHN0YXJ0VmVyaWZ5RnVsbFJlcG9ydGVyKHByb2plY3QpO1xuICB0cnkge1xuICAgIGF3YWl0IHZlcmlmeUNvZGUocHJvamVjdCwgYXJndiwgc3RlcHMpO1xuICAgIGF3YWl0IHJ1blN0ZXAoc3RlcHMsIHsgbmFtZTogJ3Rlc3QnIH0sICgpID0+IHJ1blByb2plY3RUZXN0KHByb2plY3QsIGFyZ3YpKTtcbiAgICAvLyBQcmludGVkIGJlZm9yZSB0aGUgcmVwb3J0ZXIgZmluaXNoZXMgc28gdGhlIHN1bW1hcnkgbGFuZHMgaW4gdmVyaWZ5LWZ1bGwubG9nIHRvby5cbiAgICBwcmludFZlcmlmeVN1bW1hcnkoc3RlcHMsIEJvb2xlYW4oYXJndi5kcnlSdW4pKTtcbiAgICByZXBvcnRlci5zdWNjZWVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0ZXIuZmFpbChlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgcmVwb3J0ZXIuZmluaXNoKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Q29kZShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YsIHN0ZXBzOiBWZXJpZnlTdGVwW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaW5zdGFsbENvbW1hbmQgPSBgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZH0gaW5zdGFsbGA7XG4gIC8vIGBhbGxvd0ZhaWx1cmVgIHNvIGEgZmFpbGVkIGluc3RhbGwgc3RpbGwgcmVhY2hlcyB0aGUgbm9ybWFsaXphdGlvbiBiZWxvdzogYnVuIHJld3JpdGVzIHRoZVxuICAvLyBsb2NrZmlsZSBiZWZvcmUgcnVubmluZyBsaWZlY3ljbGUgc2NyaXB0cywgc28gYSBzY3JpcHQgZmFpbHVyZSB3b3VsZCBvdGhlcndpc2UgbGVhdmUgR3VhcmRcbiAgLy8gVVJMcyBpbiB0aGUgd29ya2luZyB0cmVlLiBUaGUgZmFpbHVyZSBpcyByZXBvcnRlZCBhbmQgZXhpdHMgZXhhY3RseSBhcyBydW5QYWNrYWdlQ29tbWFuZCB3b3VsZC5cbiAgY29uc3QgaW5zdGFsbEV4aXRDb2RlID0gYXdhaXQgcnVuU3RlcChzdGVwcywgeyBkZXRhaWw6IGluc3RhbGxDb21tYW5kLCBuYW1lOiAnaW5zdGFsbCcgfSwgKCkgPT5cbiAgICBydW5QYWNrYWdlQ29tbWFuZChpbnN0YWxsQ29tbWFuZCwgcHJvamVjdCwgYXJndiwgeyBhbGxvd0ZhaWx1cmU6IHRydWUgfSlcbiAgKTtcbiAgLy8gVGhlIHJlcG9zaXRvcnkgbWF5IGhhdmUgbm8gYGdlbi1jb2RlYCBzY3JpcHQgKHdoZXJlIHRoZSBzYW1lIG5vcm1hbGl6YXRpb24gcnVucyBhdCBwb3N0aW5zdGFsbCksXG4gIC8vIGFuZCBgdmVyaWZ5YCBpcyB0aGUgY29tbWFuZCBhIGRldmVsb3BlciBydW5zIGJlZm9yZSBjb21taXR0aW5nLlxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgbm9ybWFsaXplQnVuTG9ja2ZpbGUocHJvamVjdC5yb290RGlyUGF0aCk7XG4gIH1cbiAgaWYgKGluc3RhbGxFeGl0Q29kZSAhPT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtpbnN0YWxsRXhpdENvZGV9KTpgKSwgaW5zdGFsbENvbW1hbmQpKTtcbiAgICBwcm9jZXNzLmV4aXQoaW5zdGFsbEV4aXRDb2RlKTtcbiAgfVxuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pIHtcbiAgICBjb25zdCBnZW5Db2RlQ29tbWFuZCA9IGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kfSBnZW4tY29kZWA7XG4gICAgYXdhaXQgcnVuU3RlcChzdGVwcywgeyBkZXRhaWw6IGdlbkNvZGVDb21tYW5kLCBuYW1lOiAnZ2VuLWNvZGUnIH0sICgpID0+XG4gICAgICBydW5QYWNrYWdlQ29tbWFuZChnZW5Db2RlQ29tbWFuZCwgcHJvamVjdCwgYXJndilcbiAgICApO1xuICB9XG4gIC8vIFJlc29sdmVkIGFmdGVyIGBnZW4tY29kZWAgc28gYSBnZW5lcmF0ZWQgYHNyY2AgZGlyZWN0b3J5IGlzIGFscmVhZHkgdGhlcmUgZm9yIGBoYXNTb3VyY2VDb2RlYCxcbiAgLy8gd2hpY2ggaXMgYW4gZXhpc3RzU3luYyBjaGVjaywgYW5kIHJldXNlZCBieSBib3RoIHN0ZXAgZGV0YWlscyBiZWxvdy4gVGhlIHByb2plY3QgZmFjdG9yaWVzXG4gIC8vIHNoYXJlIGluc3RhbmNlcyBwZXIgKGRpcmVjdG9yeSwgbG9hZEVudiwgZW52LXJlbGV2YW50IGFyZ3YpLCBzbyBgdHlwZWNoZWNrYCByZXVzZXMgdGhpcyB2ZXJ5XG4gIC8vIGdyYXBoIHdoaWxlIGBsaW50YCAod2hpY2ggYWRkcyAtLXNpbGVudCkgcmVzb2x2ZXMgaXRzIG93bi5cbiAgY29uc3Qgc3RlcERldGFpbHMgPSBhd2FpdCBidWlsZFN0ZXBEZXRhaWxzKGFyZ3YpO1xuICAvLyBgbGludCAtLWZpeCAtLWZvcm1hdGAgcHJpbnRzIG5vdGhpbmcgb24gc3VjY2Vzcywgc28gd2l0aG91dCB0aGUgc3RlcCBzdW1tYXJ5IGEgcGFzc2luZyBgdmVyaWZ5YFxuICAvLyBsb29rcyBsaWtlIGl0IG5ldmVyIGxpbnRlZCBhdCBhbGwg4oCUIGFuZCBpdCBzaWxlbnRseSByZXdyb3RlIHRoZSB3b3JraW5nIHRyZWUgd2hpbGUgYXQgaXQuXG4gIGF3YWl0IHJ1blN0ZXAoc3RlcHMsIHsgZGV0YWlsOiBzdGVwRGV0YWlscy5jbGVhbnVwLCBuYW1lOiAnY2xlYW51cCcgfSwgKCkgPT5cbiAgICBydW5JblByb2Nlc3NDb21tYW5kKCdjbGVhbnVwJywgKCkgPT5cbiAgICAgIGxpbnQoe1xuICAgICAgICAuLi5hcmd2LFxuICAgICAgICBfOiBbJ2xpbnQnXSxcbiAgICAgICAgZml4OiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IHRydWUsXG4gICAgICAgIHNpbGVudDogdHJ1ZSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBMaW50Q29tbWFuZEFyZ3YpXG4gICAgKVxuICApO1xuICAvLyBUeXBlLWF3YXJlIGxpbnQgcmVwb3J0cyBUeXBlU2NyaXB0IGRpYWdub3N0aWNzIG9ubHkgZm9yIHRoZSBmaWxlcyBveGxpbnQgYWN0dWFsbHkgbGludHMsIGFuZFxuICAvLyB0aGUgc2hhcmVkIGNvbmZpZyBpZ25vcmVzIGRpcmVjdG9yaWVzIHRzYyBzdGlsbCBjb21waWxlcyAoZS5nLiBgX19nZW5lcmF0ZWRfX2AsIGBAdHlwZXNgLFxuICAvLyBgZGlzdGApLiBLZWVwIHRoZSB0eXBlY2hlY2sgY29tbWFuZCBzbyBgdmVyaWZ5YCBzdGF5cyBlcXVpdmFsZW50IHRvIFwidGhlIHJlcG9zaXRvcnkgY29tcGlsZXNcIi5cbiAgLy8gVGhlIG92ZXJsYXAgd2l0aCBsaW50IGlzIGRlbGliZXJhdGU6IGAtLXR5cGUtYXdhcmVgIGFsc28gcG93ZXJzIHR5cGUtYXdhcmUgbGludCBydWxlcywgYW5kXG4gIC8vIGRyb3BwaW5nIG9ubHkgYC0tdHlwZS1jaGVja2AgZnJvbSBsaW50IHNhdmVzIH4wLjFzLCBmYXIgbGVzcyB0aGFuIHRoZSBjb3ZlcmFnZSBpdCB3b3VsZCBjb3N0LlxuICBhd2FpdCBydW5TdGVwKHN0ZXBzLCB7IGRldGFpbDogc3RlcERldGFpbHMudHlwZWNoZWNrLCBuYW1lOiAndHlwZWNoZWNrJyB9LCAoKSA9PlxuICAgIHJ1bkluUHJvY2Vzc0NvbW1hbmQoJ3R5cGVjaGVjaycsICgpID0+IHR5cGVDaGVjayh7IC4uLmFyZ3YsIF86IFsndHlwZWNoZWNrJ10gfSBhcyB1bmtub3duIGFzIFR5cGVDaGVja0NvbW1hbmRBcmd2KSlcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHJvamVjdFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHRlc3RBcmd2ID0gd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudih7XG4gICAgLi4uYXJndixcbiAgICBfOiBbJ3Rlc3QnXSxcbiAgICBlMmU6ICdoZWFkbGVzcycsXG4gICAgc2lsZW50OiB0cnVlLFxuICB9IGFzIHVua25vd24gYXMgVGVzdENvbW1hbmRBcmd2KTtcbiAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0ZXN0KHRlc3RBcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkgcmV0dXJuO1xuXG4gIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RiLXJlc2V0J10pIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgJ3Rlc3QnKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhcbiAgICBjaGFsay55ZWxsb3coJ1Rlc3RzIGZhaWxlZC4gVGhpcyBwcm9qZWN0IGRlZmluZXMgXCJkYi1yZXNldFwiLCBzbyB3YiB3aWxsIHJlc2V0IHRoZSBkYXRhYmFzZSBvbmNlIGFuZCByZXRyeSB0ZXN0cy4nKVxuICApO1xuICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZChgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZH0gZGItcmVzZXRgLCBmaW5kVGVzdFByb2plY3QocHJvamVjdCwgdGVzdEFyZ3YpLCB0ZXN0QXJndiwge1xuICAgIHByaW50UmF3T3V0cHV0OiB0cnVlLFxuICB9KTtcblxuICBjb25zdCByZXRyeUV4aXRDb2RlID0gYXdhaXQgdGVzdCh0ZXN0QXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICBpZiAocmV0cnlFeGl0Q29kZSAhPT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtyZXRyeUV4aXRDb2RlfSk6YCksICd0ZXN0IGFmdGVyIGRiLXJlc2V0IHJldHJ5JykpO1xuICAgIHByb2Nlc3MuZXhpdChyZXRyeUV4aXRDb2RlKTtcbiAgfVxuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1Rlc3RzIHBhc3NlZCBhZnRlciBkYi1yZXNldCByZXRyeS4nKSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRUZXN0UHJvamVjdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0Q29tbWFuZEFyZ3YpOiBQcm9qZWN0IHtcbiAgY29uc3QgdGVzdFByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdC5kaXJQYXRoKTtcbiAgaWYgKCF0ZXN0UHJvamVjdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUHJvamVjdCBub3QgZm91bmQ6ICR7cHJvamVjdC5kaXJQYXRofWApO1xuICB9XG4gIHJldHVybiB0ZXN0UHJvamVjdDtcbn1cblxuLyoqXG4gKiBOYW1lcyB0aGUgdG9vbHMgYmVoaW5kIHRoZSBgY2xlYW51cGAgYW5kIGB0eXBlY2hlY2tgIHN0ZXBzLlxuICpcbiAqIEJvdGggc3RlcHMgdHlwZS1jaGVjaywgd2hpY2ggcmVhZHMgYXMgcmVkdW5kYW50IHVudGlsIHRoZSByZWNhcCBzYXlzIGhvdyB0aGV5IGRpZmZlcjogYGNsZWFudXBgXG4gKiB0eXBlLWNoZWNrcyB0aHJvdWdoIG94bGludCwgd2hpY2ggc2VlcyBvbmx5IHRoZSBmaWxlcyBpdCBsaW50cyAodGhlIHNoYXJlZCBjb25maWcgaWdub3Jlc1xuICogYF9fZ2VuZXJhdGVkX19gLCBgQHR5cGVzYCwgYGRpc3RgLCAuLi4pLCB3aGlsZSBgdHlwZWNoZWNrYCBydW5zIHRoZSBjb21waWxlciBvdmVyIHRoZSB3aG9sZVxuICogdHNjb25maWcgcHJvZ3JhbS4gRXZlcnkgbGFiZWwgaXMgZGVyaXZlZCBmcm9tIHRoZSByZXNvbHZlZCBwcm9qZWN0cyByYXRoZXIgdGhhbiBoYXJkLWNvZGVkLCBzbyBhXG4gKiByZXBvc2l0b3J5IHdob3NlIGBjbGVhbnVwYCBydW5zIGZsYWtlOCBvciBgZGFydCBhbmFseXplYCBpcyBuZXZlciB0b2xkIGl0IHJhbiBveGxpbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkU3RlcERldGFpbHMoYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx7IGNsZWFudXA6IHN0cmluZzsgdHlwZWNoZWNrPzogc3RyaW5nIH0+IHtcbiAgY29uc3QgY2xlYW51cCA9ICdsaW50IC0tZml4IC0tZm9ybWF0JztcbiAgLy8gRGVsaWJlcmF0ZWx5IHJlc29sdmVkIHdpdGggbm8gZXhwbGljaXQgZGlyUGF0aCwgZXhhY3RseSBhcyBgbGludGAgKGxpbnQudHMpIGFuZCBgdHlwZUNoZWNrYFxuICAvLyAodHlwZWNoZWNrLnRzKSByZXNvbHZlIHRoZWlycywgc28gdGhlIGxhYmVscyBhbHdheXMgZGVzY3JpYmUgdGhlIHZlcnkgcHJvamVjdCBzZXQgdGhvc2UgY29tbWFuZHNcbiAgLy8gcHJvY2Vzcy4gVGhyZWFkaW5nIGEgZGlyUGF0aCBpbiDigJQgdGhlIHNlbGYgcHJvamVjdCdzLCBzYXkg4oCUIHdvdWxkIGxldCB0aGUgdHdvIGRpdmVyZ2UsIHdoaWNoIGlzXG4gIC8vIHRoZSBkcmlmdCB0aGlzIGZ1bmN0aW9uIGV4aXN0cyB0byBwcmV2ZW50LlxuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSByZXR1cm4geyBjbGVhbnVwIH07XG5cbiAgLy8gQXNrcyB0aGUgcmVhbCBidWlsZGVycyB3aGF0IHRoZXkgd291bGQgcnVuIHJhdGhlciB0aGFuIHJlc3RhdGluZyB0aGVpciBjb25kaXRpb25zLCBzbyBhIGNoYW5nZVxuICAvLyB0byBlaXRoZXIgY29tbWFuZCBjYW5ub3QgbGVhdmUgdGhlc2UgbGFiZWxzIGRlc2NyaWJpbmcgc29tZXRoaW5nIGl0IHN0b3BwZWQgZG9pbmcuIE9ubHkgdGhlXG4gIC8vIHByb2plY3Qgc2VsZWN0aW9uIGlzIHJlc3RhdGVkOiBgbGludGAgYW5kIGB0eXBlQ2hlY2tgIGFwcGx5IGl0IGFyb3VuZCB0aGVpciBidWlsZGVycywgbm90XG4gIC8vIGluc2lkZSB0aGVtLlxuICBjb25zdCBydW5zVHlwZUF3YXJlTGludCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLnNvbWUoXG4gICAgKHByb2plY3QpID0+XG4gICAgICBwcm9qZWN0Lmhhc093blNvdXJjZUNvZGUgJiYgYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCB7IGZpeDogdHJ1ZSwgZm9ybWF0OiB0cnVlIH0pPy5pbmNsdWRlcygnLS10eXBlLWF3YXJlJylcbiAgKTtcbiAgY29uc3QgdHlwZUNoZWNrQ29tbWFuZHMgPSBbXG4gICAgLi4ubmV3IFNldChwcm9qZWN0cy5kZXNjZW5kYW50cy5mbGF0TWFwKChwcm9qZWN0KSA9PiBidWlsZFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3QpLm1hcCh0b0Rpc3BsYXlDb21tYW5kKSkpLFxuICBdO1xuICByZXR1cm4ge1xuICAgIGNsZWFudXA6IHJ1bnNUeXBlQXdhcmVMaW50ID8gYCR7Y2xlYW51cH0gKG94bGludCAtLXR5cGUtYXdhcmUgLS10eXBlLWNoZWNrKWAgOiBjbGVhbnVwLFxuICAgIHR5cGVjaGVjazogdHlwZUNoZWNrQ29tbWFuZHMubGVuZ3RoID4gMCA/IHR5cGVDaGVja0NvbW1hbmRzLmpvaW4oJyArICcpIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKiogRHJvcHMgdGhlIHBhY2thZ2UtbWFuYWdlciBwbGFjZWhvbGRlciBgcnVuV2l0aFNwYXduYCBleHBhbmRzLCBsZWF2aW5nIHRoZSB0b29sIGNhbGwgdG8gc2hvdy4gKi9cbmZ1bmN0aW9uIHRvRGlzcGxheUNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbW1hbmQucmVwbGFjZSgvXig/OkJVTnxZQVJOKSAvdSwgJycpO1xufVxuXG4vKiogVGltZXMgYSBzdGVwIGFuZCByZWNvcmRzIGl0IGZvciB0aGUgZmluYWwgc3VtbWFyeS4gU3RlcHMgdGhhdCBmYWlsIGV4aXQgdGhlIHByb2Nlc3MgaW5zdGVhZC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1blN0ZXA8VD4oXG4gIHN0ZXBzOiBWZXJpZnlTdGVwW10sXG4gIHN0ZXA6IE9taXQ8VmVyaWZ5U3RlcCwgJ2R1cmF0aW9uTXMnPixcbiAgcnVuOiAoKSA9PiBQcm9taXNlPFQ+XG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuKCk7XG4gIHN0ZXBzLnB1c2goeyAuLi5zdGVwLCBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0IH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJ1bnMgYSBzdGVwIHRoYXQgc3VjY2VlZHMgc2lsZW50bHk6IHRoZSByZWNhcCBpcyB0aGUgc2luZ2xlIHBsYWNlIGEgc3VjY2Vzc2Z1bCBzdGVwIGlzIGFubm91bmNlZCxcbiAqIHNvIHdyYXBwZXIgYFN0YXJ0YC9gRmluaXNoZWRgIGxpbmVzIHdvdWxkIG9ubHkgcmVwZWF0IGl0LiBGYWlsdXJlcyBzdGlsbCByZXBvcnQgYmVmb3JlIGV4aXRpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkluUHJvY2Vzc0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgY29tbWFuZDogKCkgPT4gUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgZXhpdENvZGUgPSAoYXdhaXQgY29tbWFuZCgpKSA/PyAwO1xuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgY29tbWFuZE5hbWUpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuLyoqXG4gKiBSZWNhcHMgZXZlcnkgY29tcGxldGVkIHN0ZXAuXG4gKlxuICogYHdiIHZlcmlmeWAgaXMgcHJpbWFyaWx5IGNvbnN1bWVkIGJ5IEFJIGNvZGluZyBhZ2VudHMsIGFuZCBpdHMgcGVyLWNvbW1hbmQgb3V0cHV0IGlzIHVuZXZlbjogYVxuICogc3VjY2Vzc2Z1bCBgY2xlYW51cGAgcHJpbnRzIG5vdGhpbmcgYXQgYWxsIHdoaWxlIGB0eXBlY2hlY2tgIHByaW50cyBwZXItcGFja2FnZSBwcm9ncmVzcy4gUmVhZGluZ1xuICogYSBwYXNzaW5nIHJ1biB0aGVyZWZvcmUgZ2F2ZSBubyBldmlkZW5jZSB0aGF0IGxpbnRpbmcgaGFwcGVuZWQsIHNvIHRoZSByZWNhcCBsaXN0cyBlYWNoIHN0ZXAgdGhhdFxuICogcmFuLCB3aGF0IGl0IHJhbiwgYW5kIGhvdyBsb25nIGl0IHRvb2suXG4gKi9cbmZ1bmN0aW9uIHByaW50VmVyaWZ5U3VtbWFyeShzdGVwczogVmVyaWZ5U3RlcFtdLCBkcnlSdW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKHN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IG5hbWVXaWR0aCA9IE1hdGgubWF4KC4uLnN0ZXBzLm1hcCgoc3RlcCkgPT4gc3RlcC5uYW1lLmxlbmd0aCkpO1xuICAvLyBgLS1kcnktcnVuYCBza2lwcyBjb21tYW5kIGV4ZWN1dGlvbiwgc28gZXZlcnkgc3RlcCB0b29rIG5vIHRpbWUgYW5kIHZlcmlmaWVkIG5vdGhpbmc6IGEgZ3JlZW5cbiAgLy8gXCJWZXJpZmllZFwiIHJlY2FwIHdvdWxkIGNsYWltIGV4YWN0bHkgdGhlIHdvcmsgdGhlIGZsYWcgc3VwcHJlc3NlZC4gTGlzdCB3aGF0IHdvdWxkIHJ1biBpbnN0ZWFkLlxuICBpZiAoZHJ5UnVuKSB7XG4gICAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuY3lhbihjaGFsay5ib2xkKCdEcnkgcnVuIOKAlCBub3RoaW5nIHdhcyBleGVjdXRlZC4gU3RlcHMgdGhhdCB3b3VsZCBydW46JykpKTtcbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHtcbiAgICAgIC8vIFBhZCBvbmx5IHdoZW4gYSBkZXRhaWwgZm9sbG93cywgc28gYSBkZXRhaWwtbGVzcyBzdGVwIGRvZXMgbm90IGVtaXQgdHJhaWxpbmcgd2hpdGVzcGFjZS5cbiAgICAgIGNvbnNvbGUuaW5mbyhgICAtICR7c3RlcC5kZXRhaWwgPyBzdGVwLm5hbWUucGFkRW5kKG5hbWVXaWR0aCkgKyBjaGFsay5ncmF5KGAgICR7c3RlcC5kZXRhaWx9YCkgOiBzdGVwLm5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGR1cmF0aW9ucyA9IHN0ZXBzLm1hcCgoc3RlcCkgPT4gZm9ybWF0U3RlcER1cmF0aW9uKHN0ZXAuZHVyYXRpb25NcykpO1xuICBjb25zdCBkdXJhdGlvbldpZHRoID0gTWF0aC5tYXgoLi4uZHVyYXRpb25zLm1hcCgoZHVyYXRpb24pID0+IGR1cmF0aW9uLmxlbmd0aCkpO1xuICBjb25zdCB0b3RhbER1cmF0aW9uTXMgPSBzdGVwcy5yZWR1Y2UoKHRvdGFsLCBzdGVwKSA9PiB0b3RhbCArIHN0ZXAuZHVyYXRpb25NcywgMCk7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoYFZlcmlmaWVkIGluICR7Zm9ybWF0U3RlcER1cmF0aW9uKHRvdGFsRHVyYXRpb25Ncyl9OmApKSk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBzdGVwXSBvZiBzdGVwcy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBkdXJhdGlvbiA9IChkdXJhdGlvbnNbaW5kZXhdIGFzIHN0cmluZykucGFkU3RhcnQoZHVyYXRpb25XaWR0aCk7XG4gICAgY29uc3QgZGV0YWlsID0gc3RlcC5kZXRhaWwgPyBgICAke3N0ZXAuZGV0YWlsfWAgOiAnJztcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJyAg4pyUICcpICsgc3RlcC5uYW1lLnBhZEVuZChuYW1lV2lkdGgpICsgY2hhbGsuZ3JheShgICAke2R1cmF0aW9ufSR7ZGV0YWlsfWApKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QYWNrYWdlQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYWNrYWdlQ29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgcHJpbnRSYXdPdXRwdXQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcHJpbnRDb21tYW5kKGNvbW1hbmQsIHByb2plY3QuZGlyUGF0aCk7XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhjb21tYW5kLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyBwcmVzZXJ2ZUNvbG9yOiBmYWxzZSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ3BpcGUnLFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKCFvcHRpb25zLnByaW50UmF3T3V0cHV0KSB7XG4gICAgcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kLCBleGl0Q29kZSwgcmV0LnN0ZG91dCk7XG4gIH1cblxuICBpZiAoZXhpdENvZGUgIT09IDAgJiYgIW9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksIGNvbW1hbmQpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuLyoqXG4gKiBQcmludHMgcGFja2FnZSBjb21tYW5kIG91dHB1dCBmb3IgYHdiIHZlcmlmeWAuXG4gKlxuICogYHdiIHZlcmlmeWAgaXMgcHJpbWFyaWx5IGNvbnN1bWVkIGJ5IEFJIGNvZGluZyBhZ2VudHMsIHNvIHN1Y2Nlc3NmdWwgbm9pc3lcbiAqIGNvbW1hbmRzIGFyZSBzdW1tYXJpemVkIHdoaWxlIGZhaWx1cmUgb3V0cHV0IHJlbWFpbnMgYXZhaWxhYmxlIGZvciBkaWFnbm9zaXMuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgVGhlIGV4ZWN1dGVkIGNvbW1hbmQuXG4gKiBAcGFyYW0gZXhpdENvZGUgVGhlIGNvbW1hbmQgZXhpdCBjb2RlLlxuICogQHBhcmFtIG91dHB1dCBUaGUgbWVyZ2VkIHN0ZG91dCBhbmQgc3RkZXJyIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICovXG5mdW5jdGlvbiBwcmludFBhY2thZ2VDb21tYW5kT3V0cHV0KGNvbW1hbmQ6IHN0cmluZywgZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwICYmIC9eKD86YnVufHlhcm4pICg/Omluc3RhbGx8Z2VuLWNvZGUpJC91LnRlc3QoY29tbWFuZCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGlmICh0cmltbWVkT3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUodHJpbW1lZE91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnQ29tbWFuZDonKSwgY29tbWFuZCkgKyBjaGFsay5ncmF5KGAgYXQgJHtjd2R9YCkpO1xufVxuXG5mdW5jdGlvbiBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0OiBQcm9qZWN0KToge1xuICBmYWlsOiAoZXJyb3I/OiB1bmtub3duKSA9PiB2b2lkO1xuICBmaW5pc2g6ICgpID0+IHZvaWQ7XG4gIHN1Y2NlZWQ6ICgpID0+IHZvaWQ7XG59IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgd2JEaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy53YicpO1xuICBmcy5ta2RpclN5bmMod2JEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBsb2dGaWxlUGF0aCA9IHBhdGguam9pbih3YkRpclBhdGgsICd2ZXJpZnktZnVsbC5sb2cnKTtcbiAgY29uc3QgbG9nRmlsZSA9IGZzLm9wZW5TeW5jKGxvZ0ZpbGVQYXRoLCAndycpO1xuICBjb25zdCBvcmlnaW5hbFN0ZG91dFdyaXRlID0gcHJvY2Vzcy5zdGRvdXQud3JpdGUuYmluZChwcm9jZXNzLnN0ZG91dCk7XG4gIGNvbnN0IG9yaWdpbmFsU3RkZXJyV3JpdGUgPSBwcm9jZXNzLnN0ZGVyci53cml0ZS5iaW5kKHByb2Nlc3Muc3RkZXJyKTtcbiAgbGV0IHN1Y2NlZWRlZCA9IGZhbHNlO1xuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IHRlZVdyaXRlKG9yaWdpbmFsU3Rkb3V0V3JpdGUsIGxvZ0ZpbGUpIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbiAgcHJvY2Vzcy5zdGRlcnIud3JpdGUgPSB0ZWVXcml0ZShvcmlnaW5hbFN0ZGVycldyaXRlLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRlcnIud3JpdGU7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0Z1bGwgbG9nOicpLCBsb2dGaWxlUGF0aCkpO1xuXG4gIGNvbnN0IGZpbmlzaCA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoZmluaXNoZWQpIHJldHVybjtcbiAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IG9yaWdpbmFsU3Rkb3V0V3JpdGUgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xuICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gb3JpZ2luYWxTdGRlcnJXcml0ZSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRlcnIud3JpdGU7XG5cbiAgICBjb25zdCBlbGFwc2VkVGltZSA9IGZvcm1hdEVsYXBzZWRUaW1lKERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWRlZCA/ICdTdWNjZWVkZWQnIDogJ0ZhaWxlZCc7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGAke3N0YXR1c30gaW4gJHtlbGFwc2VkVGltZX0uIEZ1bGwgbG9nOiAke2xvZ0ZpbGVQYXRofVxcbmA7XG4gICAgY29uc3QgY29sb3JlZFN1bW1hcnkgPSBzdWNjZWVkZWQgPyBjaGFsay5ncmVlbihzdW1tYXJ5KSA6IGNoYWxrLnJlZChzdW1tYXJ5KTtcbiAgICBvcmlnaW5hbFN0ZG91dFdyaXRlKGNvbG9yZWRTdW1tYXJ5KTtcbiAgICBmcy53cml0ZVN5bmMobG9nRmlsZSwgc3VtbWFyeSk7XG4gICAgZnMuY2xvc2VTeW5jKGxvZ0ZpbGUpO1xuICB9O1xuXG4gIHByb2Nlc3Mub25jZSgnZXhpdCcsIGZpbmlzaCk7XG5cbiAgcmV0dXJuIHtcbiAgICBmYWlsOiAoZXJyb3IpID0+IHtcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZmluaXNoOiAoKSA9PiB7XG4gICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdleGl0JywgZmluaXNoKTtcbiAgICAgIGZpbmlzaCgpO1xuICAgIH0sXG4gICAgc3VjY2VlZDogKCkgPT4ge1xuICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB0ZWVXcml0ZShvcmlnaW5hbFdyaXRlOiB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGUsIGxvZ0ZpbGU6IG51bWJlcik6IHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZSB7XG4gIHJldHVybiAoKFxuICAgIGNodW5rOiBVaW50OEFycmF5IHwgc3RyaW5nLFxuICAgIGVuY29kaW5nT3JDYWxsYmFjaz86IEJ1ZmZlckVuY29kaW5nIHwgKChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZCksXG4gICAgY2FsbGJhY2s/OiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWRcbiAgKSA9PiB7XG4gICAgY29uc3QgYnVmZmVyID1cbiAgICAgIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBCdWZmZXIuZnJvbShjaHVuaywgdHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ3N0cmluZycgPyBlbmNvZGluZ09yQ2FsbGJhY2sgOiAndXRmOCcpXG4gICAgICAgIDogY2h1bms7XG4gICAgZnMud3JpdGVTeW5jKGxvZ0ZpbGUsIGJ1ZmZlcik7XG4gICAgLy8gV3JpdGUgdG8gdGhlIHRlcm1pbmFsIHZpYSB0aGUgb3JpZ2luYWwgc3RyZWFtIG1ldGhvZDogYSBzeW5jaHJvbm91cyBmcy53cml0ZVN5bmMgb24gdGhlXG4gICAgLy8gc3Rkb3V0L3N0ZGVyciBmZCB0aHJvd3MgRUFHQUlOIG9uIENJJ3Mgbm9uLWJsb2NraW5nIHBpcGVzIHdoZW4gbGFyZ2Ugb3V0cHV0IGZsdXNoZXMgYXQgb25jZSxcbiAgICAvLyB3aGlsZSB0aGUgc3RyZWFtIG1ldGhvZCBidWZmZXJzIGludGVybmFsbHkgYW5kIGhhbmRsZXMgYmFja3ByZXNzdXJlLlxuICAgIHJldHVybiBvcmlnaW5hbFdyaXRlKGJ1ZmZlciwgdHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IGVuY29kaW5nT3JDYWxsYmFjayA6IGNhbGxiYWNrKTtcbiAgfSkgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xufVxuXG4vKiogU3ViLW1pbnV0ZSBzdGVwcyBrZWVwIG9uZSBkZWNpbWFsIHNvIGEgZmFzdCBzdGVwIGlzIG5vdCBmbGF0dGVuZWQgdG8gYSBtaXNsZWFkaW5nIGAwc2AuICovXG5mdW5jdGlvbiBmb3JtYXRTdGVwRHVyYXRpb24obWlsbGlzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobWlsbGlzZWNvbmRzIDwgNjBfMDAwKSB7XG4gICAgcmV0dXJuIGAkeyhtaWxsaXNlY29uZHMgLyAxMDAwKS50b0ZpeGVkKDEpfXNgO1xuICB9XG4gIHJldHVybiBmb3JtYXRFbGFwc2VkVGltZShtaWxsaXNlY29uZHMpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRFbGFwc2VkVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHNlY29uZHMgPSBNYXRoLnJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICBjb25zdCByZW1haW5pbmdTZWNvbmRzID0gc2Vjb25kcyAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBgJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xuICB9XG4gIHJldHVybiBgJHttaW51dGVzfW0gJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzLCB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHByb3RlY3RSdW5TY3JpcHRBcmdzIH0gZnJvbSAnLi4vYmluL3J1bkFyZ3MuanMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYnVpbGRJZk5lZWRlZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQuanMnO1xuaW1wb3J0IHsgY2hlY2tFbnZDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9jaGVja0Vudi5qcyc7XG5pbXBvcnQgeyBjb25jdXJyZW50bHlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9jb25jdXJyZW50bHkuanMnO1xuaW1wb3J0IHsgZGVwbG95Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZGVwbG95LmpzJztcbmltcG9ydCB7IGRvdGVudkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2RvdGVudi5qcyc7XG5pbXBvcnQgeyBnZW5Db2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZ2VuQ29kZS5qcyc7XG5pbXBvcnQgeyBnZW5EZXZWYXJzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZ2VuRGV2VmFycy5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgbWFpbnRlbmFuY2VDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9tYWludGVuYW5jZS5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmFpbHdheUVudkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JhaWx3YXlFbnYuanMnO1xuaW1wb3J0IHsgcmVsZWFzZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JlbGVhc2UuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBydW5Db21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9ydW4uanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzZXR1cFByaXZhdGVQYWNrYWdlc0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwUHJpdmF0ZVBhY2thZ2VzLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGVzdE9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0T25DaS5qcyc7XG5pbXBvcnQgeyB0cmVlS2lsbENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3RyZWVLaWxsLmpzJztcbmltcG9ydCB7IHRjQ29tbWFuZCwgdHlwZUNoZWNrQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHlwZWNoZWNrLmpzJztcbmltcG9ydCB7IHZlcmlmeUNvZGVDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy92ZXJpZnlDb2RlLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbnByb3RlY3RSdW5TY3JpcHRBcmdzKHByb2Nlc3MuYXJndik7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ3diJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5taWRkbGV3YXJlKChhcmd2KSA9PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGFyZ3ZbJ3dvcmtpbmctZGlyJ107XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUod29ya2luZ0Rpcik7XG4gICAgICBwcm9jZXNzLmNoZGlyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIC8vIFdhcm4gb25seSB3aGVuIGEgc2hpbSBhY3R1YWxseSB3aW5zIGBub2RlYCByZXNvbHV0aW9uOiBvdmVuL2J1biBpbWFnZXMgYXBwZW5kIGEgaGFybWxlc3NcbiAgICAvLyAvdXNyL2xvY2FsL2J1bi1ub2RlLWZhbGxiYWNrLWJpbiAobm9kZSAtPiBidW4pIGF0IHRoZSBFTkQgb2YgUEFUSCwgc28gYSBQQVRIIHN1YnN0cmluZ1xuICAgIC8vIGNoZWNrIGZhbHNlLXBvc2l0aXZlcyB3aGVuZXZlciBhIHJlYWwgbm9kZSBwcmVjZWRlcyBpdC5cbiAgICBjb25zdCBub2RlT25QYXRoID0gZmluZEZpcnN0Tm9kZU9uUGF0aCgpO1xuICAgIGlmIChub2RlT25QYXRoICYmIGlzQnVuTm9kZVNoaW0obm9kZU9uUGF0aCkpIHtcbiAgICAgIC8vIE5vdCBmaXhlZCB1cCBoZXJlOiB0b29scyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KSBtYXkgaGFuZyBvclxuICAgICAgLy8gY3Jhc2ggdW5kZXIgdGhlIHNoaW0sIGFuZCBzb21lICh3cmFuZ2xlciBkZXYpIGZhaWwgc2lsZW50bHksIHNvIHN1cmZhY2UgdGhlIGNhdXNlIHVwZnJvbnQuXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBXYXJuaW5nOiBcXGBub2RlXFxgIG9uIFBBVEggaXMgYSBCdW4gc2hpbSAoJHtub2RlT25QYXRofSk7IGAgK1xuICAgICAgICAgICdydW4gd2Igd2l0aG91dCBgLS1idW5gIGFuZCByZW1vdmUgYFtydW5dIGJ1bmAgZnJvbSBidW5maWcudG9tbC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhcmd2Ll9bMF0gIT09ICdydW4nKSByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZCh2ZXJpZnlDb2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGNoZWNrRW52Q29tbWFuZClcbiAgLmNvbW1hbmQoY29uY3VycmVudGx5Q29tbWFuZClcbiAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgLmNvbW1hbmQoZG90ZW52Q29tbWFuZClcbiAgLmNvbW1hbmQoZ2VuQ29kZUNvbW1hbmQpXG4gIC5jb21tYW5kKGdlbkRldlZhcnNDb21tYW5kKVxuICAuY29tbWFuZChraWxsUG9ydElmTm9uQ2lDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQobWFpbnRlbmFuY2VDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmFpbHdheUVudkNvbW1hbmQpXG4gIC5jb21tYW5kKHJlbGVhc2VDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHJ1bkNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBQcml2YXRlUGFja2FnZXNDb21tYW5kKVxuICAuY29tbWFuZChzdGFydENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0T25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKHRyZWVLaWxsQ29tbWFuZClcbiAgLmNvbW1hbmQodHlwZUNoZWNrQ29tbWFuZClcbiAgLmNvbW1hbmQodGNDb21tYW5kKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuLyoqIFRoZSBmaXJzdCBleGVjdXRhYmxlIGBub2RlYCBvbiBQQVRILCBpLmUuIHRoZSBvbmUgY2hpbGQgcHJvY2Vzc2VzIHdpbGwgcnVuLiAqL1xuZnVuY3Rpb24gZmluZEZpcnN0Tm9kZU9uUGF0aCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGRpciBvZiAocHJvY2Vzcy5lbnYuUEFUSCA/PyAnJykuc3BsaXQocGF0aC5kZWxpbWl0ZXIpKSB7XG4gICAgaWYgKCFkaXIpIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qgbm9kZVBhdGggPSBwYXRoLmpvaW4oZGlyLCAnbm9kZScpO1xuICAgIHRyeSB7XG4gICAgICBmcy5hY2Nlc3NTeW5jKG5vZGVQYXRoLCBmcy5jb25zdGFudHMuWF9PSyk7XG4gICAgICAvLyBYX09LIGFsc28gcGFzc2VzIGZvciBzZWFyY2hhYmxlIGRpcmVjdG9yaWVzLCB3aGljaCBleGVjdnAgc2tpcHMuXG4gICAgICBpZiAoZnMuc3RhdFN5bmMobm9kZVBhdGgpLmlzRmlsZSgpKSByZXR1cm4gbm9kZVBhdGg7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBOb3QgcHJlc2VudCBvciBub3QgZXhlY3V0YWJsZSBpbiB0aGlzIGRpcmVjdG9yeTsga2VlcCBzZWFyY2hpbmcuXG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQnVuTm9kZVNoaW0obm9kZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBgYnVuIC0tYnVuYCBhbmQgYnVuZmlnJ3MgYHJ1bi5idW5gIHByZXBlbmQgYSBidW4tbm9kZS08dmVyc2lvbj4gZGlyZWN0b3J5IHdob3NlIGBub2RlYCBsaW5rc1xuICAvLyB0byBidW4sIGFuZCBvdmVuL2J1biBpbWFnZXMgc3ltbGluayBub2RlIC0+IGJ1biBpbiBidW4tbm9kZS1mYWxsYmFjay1iaW4sIHNvIHRoZSBnaXZlYXdheSBpc1xuICAvLyBlaXRoZXIgYSBidW4tbm9kZS0gcGF0aCBzZWdtZW50IG9yIGEgcmVzb2x1dGlvbiB0byB0aGUgYnVuIGJpbmFyeSBpdHNlbGYuXG4gIC8vIFNoaW1zIGxpdmUgZGlyZWN0bHkgaW4gYSBidW4tbm9kZS08dmVyc2lvbj4gZGlyZWN0b3J5LCBzbyBjaGVjayBvbmx5IHRoZSBpbW1lZGlhdGUgcGFyZW50XG4gIC8vIChyZWxhdGl2ZSBQQVRIIGVudHJpZXMgaW5jbHVkZWQpOiBtYXRjaGluZyBhbmNlc3RvcnMgd291bGQgZmFsc2UtcG9zaXRpdmUgb24gZS5nLiBhIHJlYWwgbm9kZVxuICAvLyBpbnNpZGUgYSBidW4tbm9kZS13b3Jrc3BhY2UgY2hlY2tvdXQuXG4gIGlmIChwYXRoLmJhc2VuYW1lKHBhdGguZGlybmFtZShub2RlUGF0aCkpLnN0YXJ0c1dpdGgoJ2J1bi1ub2RlLScpKSByZXR1cm4gdHJ1ZTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShmcy5yZWFscGF0aFN5bmMobm9kZVBhdGgpKSA9PT0gJ2J1bic7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5sZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcblxuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jZXNzLnBpZH0pIGR1cmluZyBzaHV0ZG93bjpgLCBlcnJvcik7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbOSwxMCwxMSwxMiwxM10sIm1hcHBpbmdzIjoiODJCQWVBLFNBQWdCLEVBQW9DLEVBQW1DLEVBQStCLENBQ3BILE9BQU8sR0FDTCxFQUF1QyxDQUFVLENBQUMsQ0FBQyxPQUFRLEdBQ3pELEdBQStCLENBQWdCLENBQ2pELEVBQ0EsQ0FDRixDQUNGLENBOEJBLFNBQWdCLEdBQWlDLEVBQTZCLEVBQStCLENBUzNHLElBQU0sRUFBcUIsR0FBOEIsQ0FNdkQsSUFBTSxFQUFzQixFQUFHLGlCQUFpQixDQUFPLEVBQ2pELEVBQWMsQ0FBRSxJQUFLLEVBQWEsb0JBQXFCLEdBQU8sT0FBUSxDQUFDLG9CQUFvQixDQUFFLEVBTzdGLEVBQWdCLElBQUksSUFBSSxFQUFHLFNBQVMsRUFBSyxNQUFNLEtBQUssRUFBUyxjQUFjLEVBQUcsQ0FBVyxDQUFDLEVBQ2hHLEdBQUksRUFBUSxTQUFTLEdB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V0FBVyxFQUFFLEVBQUVDLEdBQUUsSUFBSSxXQUFXLEVBQUUsRUFBRUMsR0FBRSxJQUFJLFlBQVksSUFBSSxFQUFFLElBQUksV0FBVyxJQUFJLEVBQUUsR0FBRSxJQUFJLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHLElBQUksV0FBVyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLElBQUksWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLFVBQVUsRUFBRSxFQUFFLEdBQUUsRUFBRSxDQUFDLElBQUksRUFBRUEsR0FBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFRixHQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRUMsR0FBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssV0FBVyxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBR0gsRUFBRSxFQUFFLEtBQUtBLEVBQUUsR0FBRyxFQUFFLEtBQUtBLEVBQUUsR0FBRyxHQUFHLEtBQUtBLEVBQUUsSUFBSSxJQUFJQSxFQUFFLEVBQUUsS0FBS0EsRUFBRSxHQUFHLEVBQUUsS0FBS0EsRUFBRSxHQUFHLEdBQUcsS0FBS0EsRUFBRSxJQUFJLElBQUlBLEVBQUUsRUFBRSxLQUFLQSxFQUFFLEdBQUcsRUFBRSxLQUFLQSxFQUFFLEdBQUcsR0FBRyxLQUFLQSxFQUFFLElBQUksSUFBSUEsRUFBRSxFQUFFLEtBQUtBLEVBQUUsR0FBRyxFQUFFLEtBQUtBLEVBQUUsR0FBRyxHQUFHLEtBQUtBLEVBQUUsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsR0FBRyxFQUFHLEVBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFFLEdBQUUsRUFBRSxHQUFFLEVBQUcsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEVBQUcsRUFBRyxHQUFFLEVBQUUsR0FBRSxHQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUcsRUFBRSxHQUFFLEdBQUUsRUFBRSxHQUFFLEdBQUcsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUcsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUcsRUFBRSxHQUFFLEdBQUUsRUFBRSxFQUFHLEdBQUcsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUksRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFLLElBQUksSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLEdBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLElBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUksR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsR0FBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxHQUFHLEVBQUUsSUFBRyxFQUFFLEdBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUUsRUFBRSxHQUFFLEdBQUcsSUFBRyxFQUFFLEtBQUksR0FBRyxHQUFHLElBQUcsRUFBRSxLQUFJLEdBQUcsRUFBRyxHQUFHLEVBQUUsS0FBSSxHQUFHLEVBQUcsSUFBRyxFQUFFLElBQUksR0FBRyxFQUFHLElBQUcsRUFBRSxLQUFJLEdBQUcsR0FBRyxJQUFHLEVBQUUsS0FBSSxHQUFHLEdBQUcsR0FBSSxHQUFHLElBQUssR0FBRyxHQUFHLEdBQUksR0FBRyxJQUFLLEdBQUcsRUFBRyxJQUFHLEVBQUUsS0FBSyxHQUFHLEdBQUcsSUFBSSxFQUFFLEtBQUksR0FBRyxFQUFFLElBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRyxHQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxHQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsRUFBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEVBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxHQUFHLElBQUksRUFBRSxLQUFLLEdBQUcsR0FBRyxJQUFJLEVBQUUsS0FBSyxHQUFHLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxHQUFHLElBQUcsR0FBRyxLQUFJLEVBQUUsR0FBRyxJQUFHLEVBQUUsS0FBSSxHQUFHLEdBQUcsSUFBRyxFQUFFLEtBQUksR0FBRyxFQUFHLElBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRyxHQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxHQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUcsSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFHLEdBQUcsR0FBRyxLQUFJLEVBQUUsRUFBRyxJQUFHLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxHQUFHLElBQUcsR0FBRyxLQUFJLEVBQUUsR0FBRyxJQUFHLEdBQUcsS0FBSSxFQUFFLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxFQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsRUFBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFHLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBRyxJQUFHLEdBQUcsS0FBSSxFQUFFLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxFQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsRUFBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsSUFBRyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsRUFBRSxLQUFJLEdBQUcsR0FBRyxHQUFJLEVBQUUsS0FBSyxHQUFHLEdBQUcsSUFBSSxFQUFFLElBQUssR0FBRyxFQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLEdBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRyxHQUFFLEVBQUUsQ0FBQyxFQUFHLEVBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxFQUFFLEVBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEVBQUUsQ0FBQyxFQUFHLEVBQUcsR0FBRyxFQUFHLENBQUMsRUFBRyxFQUFHLEVBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxHQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxHQUFFLEVBQUcsQ0FBQyxFQUFHLEdBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRSxHQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUUsR0FBRSxFQUFHLENBQUMsR0FBRyxFQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEVBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRSxFQUFHLENBQUMsRUFBRSxFQUFHLEdBQUUsR0FBRyxDQUFDLEVBQUcsRUFBRyxHQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUcsRUFBRSxHQUFHLENBQUMsRUFBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBR0MsR0FBRSxHQUFHLElBQUdBLEdBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFHLEVBQUUsSUFBSSxFQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLENDUnIySSxNQUFNLEdBQUVJLEdBQUUsRUFBRUMsR0FBRSxJQUFJLFlBQVlDLEdBQUUsSUFBSSxZQUFZLE9BQU8sRUFBRSxTQUFTRixJQUFHLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLFNBQVMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsSUFBSyxJQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsSUFBSyxLQUFJLEVBQUUsUUFBUSxJQUFLLElBQUcsRUFBRSxLQUFLLElBQUssRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsU0FBUyxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksSUFBSyxHQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSyxLQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsV0FBVyxLQUFLLEdBQUcsQ0FBQyxLQUFLRSxHQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBS0QsR0FBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxJQUFJLElBQUksU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTLElBQUksSUFBSSxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEtBQUssS0FBSyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLE9BQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENDQWowQixTQUFTLEdBQUUsRUFBRSxFQUFFLEdBQUUsQ0FBQyxPQUFPLEtBQUssVUFBVUUsR0FBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBU0MsR0FBRSxFQUFFLENBQUMsR0FBRyxJQUFJLElBQUssR0FBRSxNQUFNLEdBQUcsR0FBRyxPQUFPLEdBQUcsU0FBUyxDQUFDLEdBQUcsT0FBTyxNQUFNLENBQUMsRUFBRSxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBU0QsR0FBRSxFQUFFLEVBQUUsR0FBRSxDQUFDLElBQUksRUFBRUMsR0FBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLEtBQUssT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFQSxHQUFFLENBQUMsRUFBRSxHQUFHLElBQUksS0FBSyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLElBQUssR0FBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxPQUFPLEVBQXpCLENBQTRCLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsWUFBWSxFQUFFLE9BQU8sR0FBRyxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFLLEdBQUUsR0FBRyxJQUFJLElBQUssR0FBRSxDQUFDLElBQUksRUFBRSxPQUFPLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcs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