@willbooster/wb 13.19.1 → 13.19.2

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
@@ -1,4 +1,4 @@
1
- import e from"node:fs";import t from"node:path";import n from"yargs";import{hideBin as r}from"yargs/helpers";import o,{execFileSync as s,spawn as i,spawnSync as a}from"node:child_process";import{createHash as c}from"node:crypto";import d from"chalk";import{globby as l}from"globby";import{config as u}from"dotenv";import{expand as p}from"dotenv-expand";import f,{constants as h}from"node:os";import{PromisePool as m}from"minimal-promise-pool";import g from"kill-port";import w from"node:fs/promises";import y from"node:assert";import{setTimeout as b}from"node:timers/promises";import{createServer as v}from"node:net";import{fileURLToPath as k}from"node:url";import{distance as S}from"fastest-levenshtein";const E={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},"quiet-env":{description:"Suppress .env file loading information.",type:"boolean"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"}};function P(e){const t=e;return!0===t.quietEnv||!1!==t.quietEnv&&!0===t.silent}const A=new Map;function x(e){const n=A.get(e);if(n)return n;const r=u({path:t.resolve(e),processEnv:{},quiet:!0}).parsed??{};return A.set(e,r),r}function $(e){return e instanceof Error&&"code"in e}function j(e,t="SIGTERM"){if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid pid: ${e}`);if("win32"===process.platform)return void function(e){try{O("taskkill",["/PID",String(e),"/T","/F"],{maxBuffer:1048576,timeout:2e3})}catch(e){if(D(e))return;throw e}}(e);const n=function(e){const{stdout:t}=O("ps",["-Ao","pid=,ppid="],{maxBuffer:1048576,timeout:2e3}),n=function(e){const t=new Map;for(const n of e.split("\n")){const e=/^\s*(\d+)\s+(\d+)\s*$/.exec(n);if(!e)continue;const r=Number(e[1]),o=Number(e[2]),s=t.get(o);s?s.push(r):t.set(o,[r])}return t}(t);return function(e,t){const n=[],r=[...t.get(e)??[]];let o=0;for(;o<r.length;){const e=r[o];o+=1,n.push(e),r.push(...t.get(e)??[])}return n}(e,n)}(e),r=function(e,t){const n=t.toReversed();return n.push(e),n}(e,n);for(const e of r)R(e,t)}function R(e,t){try{process.kill(e,t)}catch(e){if(D(e))return;throw e}}function O(e,t,n){try{return{stdout:s(e,[...t],{encoding:"utf8",maxBuffer:n?.maxBuffer,timeout:n?.timeout,stdio:["ignore","pipe","pipe"]}),stderr:""}}catch(n){const r=function(e){if("object"!=typeof e||null===e||!("stderr"in e))return"";const t=e.stderr;if("string"==typeof t)return t;if(Buffer.isBuffer(t))return t.toString("utf8");return""}(n);throw new N(e,t,r,function(e){if($(e))return e.code;if("object"==typeof e&&null!==e&&"status"in e){const t=e.status;if("number"==typeof t)return t}return}(n))}}function D(e){return!(!$(e)||"ESRCH"!==e.code)||e instanceof N&&/no such process|not found|not recognized|there is no running instance/i.test(e.stderr)}class N extends Error{constructor(e,t,n,r){super(`Command failed: ${e} ${t.join(" ")}`),this.name="CommandExecutionError",this.stderr=n,this.code=r}}async function I(e,t,n){return new Promise((r,o)=>{try{const s=i(e,t??[],n??{});s.stdout?.setEncoding?.("utf8"),s.stderr?.setEncoding?.("utf8");let a="",c="";const d=_(process.stdout,n?.omitBlankLinesWhilePrinting),l=_(process.stderr,n?.omitBlankLinesWhilePrinting);s.stdout?.on("data",e=>{a+=e,n?.printingStdout&&d.write(e)}),s.stderr?.on("data",e=>{n?.mergeOutAndError?a+=e:c+=e,n?.printingStderr&&l.write(e)});let u=!1;const p=()=>{if(!u&&s.pid){u=!0,n?.verbose&&console.info(`treeKill(${s.pid})`);try{j(s.pid)}catch(e){n?.verbose&&console.warn(`Failed to treeKill(${s.pid})`,e)}}},f="win32"===process.platform?["SIGINT","SIGTERM"]:["SIGINT","SIGTERM","SIGQUIT"],h=new Map,m=()=>{process.removeListener("beforeExit",p);for(const[e,t]of h)process.removeListener(e,t);h.clear()};if(n?.killOnExit){process.on("beforeExit",p);for(const e of f){const t=()=>{p(),m(),0===process.listenerCount(e)&&process.kill(process.pid,e)};h.set(e,t),process.on(e,t)}}s.on("error",e=>{m(),s.removeAllListeners("close"),o(e)}),s.on("close",(e,t)=>{m(),d.flush(),l.flush(),void 0===s.pid?o(new Error("Process has no pid.")):r({pid:s.pid,stdout:a,stderr:c,status:e,signal:t})}),n?.input&&(s.stdin?.write(n.input),s.stdin?.end())}catch(e){o(e)}})}const T=new RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,"g");function _(e,t=!1){if(!t)return{write:t=>e.write(t),flush:()=>{}};let n="";return{write:t=>{n+=t;const r=n.split(/\r?\n/);n=r.pop()??"";for(const t of r)C(t)||e.write(`${t}\n`)},flush:()=>{C(n)||e.write(n),n=""}}}function C(e){return 0===e.replaceAll(T,"").trim().length}function B(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function F(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function z(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}
1
+ import e from"node:fs";import t from"node:path";import n from"yargs";import{hideBin as r}from"yargs/helpers";import o,{execFileSync as s,spawn as i,spawnSync as a}from"node:child_process";import{createHash as c}from"node:crypto";import d from"chalk";import{globby as l}from"globby";import{config as u}from"dotenv";import{expand as p}from"dotenv-expand";import f,{constants as h}from"node:os";import{PromisePool as m}from"minimal-promise-pool";import g from"kill-port";import w from"node:fs/promises";import y from"node:assert";import{setTimeout as b}from"node:timers/promises";import{createServer as v}from"node:net";import{fileURLToPath as k}from"node:url";import{distance as E}from"fastest-levenshtein";const S={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},"quiet-env":{description:"Suppress .env file loading information.",type:"boolean"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"}};function P(e){const t=e;return!0===t.quietEnv||!1!==t.quietEnv&&!0===t.silent}const A=new Map;function x(e){const n=A.get(e);if(n)return n;const r=u({path:t.resolve(e),processEnv:{},quiet:!0}).parsed??{};return A.set(e,r),r}function $(e){return e instanceof Error&&"code"in e}function j(e,t="SIGTERM"){if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid pid: ${e}`);if("win32"===process.platform)return void function(e){try{O("taskkill",["/PID",String(e),"/T","/F"],{maxBuffer:1048576,timeout:2e3})}catch(e){if(D(e))return;throw e}}(e);const n=function(e){const{stdout:t}=O("ps",["-Ao","pid=,ppid="],{maxBuffer:1048576,timeout:2e3}),n=function(e){const t=new Map;for(const n of e.split("\n")){const e=/^\s*(\d+)\s+(\d+)\s*$/.exec(n);if(!e)continue;const r=Number(e[1]),o=Number(e[2]),s=t.get(o);s?s.push(r):t.set(o,[r])}return t}(t);return function(e,t){const n=[],r=[...t.get(e)??[]];let o=0;for(;o<r.length;){const e=r[o];o+=1,n.push(e),r.push(...t.get(e)??[])}return n}(e,n)}(e),r=function(e,t){const n=t.toReversed();return n.push(e),n}(e,n);for(const e of r)R(e,t)}function R(e,t){try{process.kill(e,t)}catch(e){if(D(e))return;throw e}}function O(e,t,n){try{return{stdout:s(e,[...t],{encoding:"utf8",maxBuffer:n?.maxBuffer,timeout:n?.timeout,stdio:["ignore","pipe","pipe"]}),stderr:""}}catch(n){const r=function(e){if("object"!=typeof e||null===e||!("stderr"in e))return"";const t=e.stderr;if("string"==typeof t)return t;if(Buffer.isBuffer(t))return t.toString("utf8");return""}(n);throw new N(e,t,r,function(e){if($(e))return e.code;if("object"==typeof e&&null!==e&&"status"in e){const t=e.status;if("number"==typeof t)return t}return}(n))}}function D(e){return!(!$(e)||"ESRCH"!==e.code)||e instanceof N&&/no such process|not found|not recognized|there is no running instance/i.test(e.stderr)}class N extends Error{constructor(e,t,n,r){super(`Command failed: ${e} ${t.join(" ")}`),this.name="CommandExecutionError",this.stderr=n,this.code=r}}async function I(e,t,n){return new Promise((r,o)=>{try{const s=i(e,t??[],n??{});s.stdout?.setEncoding?.("utf8"),s.stderr?.setEncoding?.("utf8");let a="",c="";const d=_(process.stdout,n?.omitBlankLinesWhilePrinting),l=_(process.stderr,n?.omitBlankLinesWhilePrinting);s.stdout?.on("data",e=>{a+=e,n?.printingStdout&&d.write(e)}),s.stderr?.on("data",e=>{n?.mergeOutAndError?a+=e:c+=e,n?.printingStderr&&l.write(e)});let u=!1;const p=()=>{if(!u&&s.pid){u=!0,n?.verbose&&console.info(`treeKill(${s.pid})`);try{j(s.pid)}catch(e){n?.verbose&&console.warn(`Failed to treeKill(${s.pid})`,e)}}},f="win32"===process.platform?["SIGINT","SIGTERM"]:["SIGINT","SIGTERM","SIGQUIT"],h=new Map,m=()=>{process.removeListener("beforeExit",p);for(const[e,t]of h)process.removeListener(e,t);h.clear()};if(n?.killOnExit){process.on("beforeExit",p);for(const e of f){const t=()=>{p(),m(),0===process.listenerCount(e)&&process.kill(process.pid,e)};h.set(e,t),process.on(e,t)}}s.on("error",e=>{m(),s.removeAllListeners("close"),o(e)}),s.on("close",(e,t)=>{m(),d.flush(),l.flush(),void 0===s.pid?o(new Error("Process has no pid.")):r({pid:s.pid,stdout:a,stderr:c,status:e,signal:t})}),n?.input&&(s.stdin?.write(n.input),s.stdin?.end())}catch(e){o(e)}})}const T=new RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,"g");function _(e,t=!1){if(!t)return{write:t=>e.write(t),flush:()=>{}};let n="";return{write:t=>{n+=t;const r=n.split(/\r?\n/);n=r.pop()??"";for(const t of r)C(t)||e.write(`${t}\n`)},flush:()=>{C(n)||e.write(n),n=""}}}function C(e){return 0===e.replaceAll(T,"").trim().length}function B(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function F(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function z(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}
2
2
  /**
3
3
  * [js-sha3]{@link https://github.com/emn178/js-sha3}
4
4
  *
@@ -6,7 +6,7 @@ import e from"node:fs";import t from"node:path";import n from"yargs";import{hide
6
6
  * @author Chen, Yi-Cyuan [emn178@gmail.com]
7
7
  * @copyright Chen, Yi-Cyuan 2015-2023
8
8
  * @license MIT
9
- */const M=[..."0123456789abcdef"],L=[6,1536,393216,100663296],W=[0,8,16,24],U=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648];const J=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class Y{blocks=[];s=[];reset=!0;finalized=!1;block=0;start=0;lastByteIndex=0;constructor(e,t,n){this.padding=t,this.outputBits=n,this.blockCount=1600-(e<<1)>>5,this.byteCount=this.blockCount<<2,this.outputBlocks=n>>5,this.extraBytes=(31&n)>>3;for(let e=0;e<50;++e)this.s[e]=0}update(e){if(this.finalized)throw new Error("finalize already called");const t=this.blocks,n=this.byteCount,r=e.length,o=this.blockCount,s=this.s;let i,a,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,i=1;i<o+1;++i)t[i]=0;for(i=this.start;c<r&&i<n;++c)a=e.codePointAt(c)||0,a<128?t[i>>2]|=a<<W[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<W[3&i++],t[i>>2]|=(128|63&a)<<W[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<W[3&i++],t[i>>2]|=(128|a>>6&63)<<W[3&i++],t[i>>2]|=(128|63&a)<<W[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<W[3&i++],t[i>>2]|=(128|a>>12&63)<<W[3&i++],t[i>>2]|=(128|a>>6&63)<<W[3&i++],t[i>>2]|=(128|63&a)<<W[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[o],i=0;i<o;++i)s[i]^=t[i];V(s),this.reset=!0}else this.start=i}return this}finalize(){if(this.finalized)return;this.finalized=!0;const e=this.blocks;let t=this.lastByteIndex;const n=this.blockCount,r=this.s;if(e[t>>2]|=this.padding[3&t],this.lastByteIndex===this.byteCount)for(e[0]=e[n],t=1;t<n+1;++t)e[t]=0;for(e[n-1]|=2147483648,t=0;t<n;++t)r[t]^=e[t];V(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let o,s=0,i=0,a="";for(;i<n;){for(s=0;s<e&&i<n;++s,++i)o=t[s],a+=M[o>>4&15]+M[15&o]+M[o>>12&15]+M[o>>8&15]+M[o>>20&15]+M[o>>16&15]+M[o>>28&15]+M[o>>24&15];i%e===0&&(t=J(t),V(t),s=0)}return r&&(o=t[s],a+=M[o>>4&15]+M[15&o],r>1&&(a+=M[o>>12&15]+M[o>>8&15]),r>2&&(a+=M[o>>20&15]+M[o>>16&15])),a}}const V=function(e){let t,n,r,o,s,i,a,c,d,l,u,p,f,h,m,g,w,y,b,v,k,S,E,P,A,x,$,j,R,O,D,N,I,T,_,C,B,F,z,M,L,W,J,Y,V,G,q,K,H,Q,Z,X,ee,te,ne,re,oe,se,ie,ae,ce,de,le;for(r=0;r<48;r+=2)o=e[0]^e[10]^e[20]^e[30]^e[40],s=e[1]^e[11]^e[21]^e[31]^e[41],i=e[2]^e[12]^e[22]^e[32]^e[42],a=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],d=e[5]^e[15]^e[25]^e[35]^e[45],l=e[6]^e[16]^e[26]^e[36]^e[46],u=e[7]^e[17]^e[27]^e[37]^e[47],p=e[8]^e[18]^e[28]^e[38]^e[48],f=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=f^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=o^(c<<1|d>>>31),n=s^(d<<1|c>>>31),e[2]^=t,e[3]^=n,e[12]^=t,e[13]^=n,e[22]^=t,e[23]^=n,e[32]^=t,e[33]^=n,e[42]^=t,e[43]^=n,t=i^(l<<1|u>>>31),n=a^(u<<1|l>>>31),e[4]^=t,e[5]^=n,e[14]^=t,e[15]^=n,e[24]^=t,e[25]^=n,e[34]^=t,e[35]^=n,e[44]^=t,e[45]^=n,t=c^(p<<1|f>>>31),n=d^(f<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=l^(o<<1|s>>>31),n=u^(s<<1|o>>>31),e[8]^=t,e[9]^=n,e[18]^=t,e[19]^=n,e[28]^=t,e[29]^=n,e[38]^=t,e[39]^=n,e[48]^=t,e[49]^=n,h=e[0],m=e[1],G=e[11]<<4|e[10]>>>28,q=e[10]<<4|e[11]>>>28,j=e[20]<<3|e[21]>>>29,R=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,W=e[40]<<18|e[41]>>>14,J=e[41]<<18|e[40]>>>14,T=e[2]<<1|e[3]>>>31,_=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,w=e[12]<<12|e[13]>>>20,K=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,O=e[33]<<13|e[32]>>>19,D=e[32]<<13|e[33]>>>19,de=e[42]<<2|e[43]>>>30,le=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,C=e[14]<<6|e[15]>>>26,B=e[15]<<6|e[14]>>>26,y=e[25]<<11|e[24]>>>21,b=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,Z=e[35]<<15|e[34]>>>17,N=e[45]<<29|e[44]>>>3,I=e[44]<<29|e[45]>>>3,P=e[6]<<28|e[7]>>>4,A=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,oe=e[16]<<23|e[17]>>>9,F=e[26]<<25|e[27]>>>7,z=e[27]<<25|e[26]>>>7,v=e[36]<<21|e[37]>>>11,k=e[37]<<21|e[36]>>>11,X=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,Y=e[8]<<27|e[9]>>>5,V=e[9]<<27|e[8]>>>5,x=e[18]<<20|e[19]>>>12,$=e[19]<<20|e[18]>>>12,se=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,M=e[38]<<8|e[39]>>>24,L=e[39]<<8|e[38]>>>24,S=e[48]<<14|e[49]>>>18,E=e[49]<<14|e[48]>>>18,e[0]=h^~g&y,e[1]=m^~w&b,e[10]=P^~x&j,e[11]=A^~$&R,e[20]=T^~C&F,e[21]=_^~B&z,e[30]=Y^~G&K,e[31]=V^~q&H,e[40]=te^~re&se,e[41]=ne^~oe&ie,e[2]=g^~y&v,e[3]=w^~b&k,e[12]=x^~j&O,e[13]=$^~R&D,e[22]=C^~F&M,e[23]=B^~z&L,e[32]=G^~K&Q,e[33]=q^~H&Z,e[42]=re^~se&ae,e[43]=oe^~ie&ce,e[4]=y^~v&S,e[5]=b^~k&E,e[14]=j^~O&N,e[15]=R^~D&I,e[24]=F^~M&W,e[25]=z^~L&J,e[34]=K^~Q&X,e[35]=H^~Z&ee,e[44]=se^~ae&de,e[45]=ie^~ce&le,e[6]=v^~S&h,e[7]=k^~E&m,e[16]=O^~N&P,e[17]=D^~I&A,e[26]=M^~W&T,e[27]=L^~J&_,e[36]=Q^~X&Y,e[37]=Z^~ee&V,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=S^~h&g,e[9]=E^~m&w,e[18]=N^~P&x,e[19]=I^~A&$,e[28]=W^~T&C,e[29]=J^~_&B,e[38]=X^~Y&G,e[39]=ee^~V&q,e[48]=de^~te&re,e[49]=le^~ne&oe,e[0]^=U[r],e[1]^=U[r+1]},G=function(){const e={instance:Error,from:e=>{const t=[e.name,e.message];return void 0!==e.stack&&t.push(e.stack),void 0!==e.cause&&(void 0===e.stack&&t.push(void 0),t.push(e.cause)),t},stub:()=>new Error,hydrate:(e,[t,n,r,o])=>{e.name=t,e.message=n,void 0===r?delete e.stack:e.stack=r,void 0!==o&&(e.cause=o)}},t={instance:Uint8Array,from:e=>[btoa(K.decode(e))],create:([e])=>q.encode(atob(e))},n={instance:Map,from:e=>[...e.entries()],stub:()=>new Map,hydrate:(e,t)=>{for(const[n,r]of t)e.set(n,r)}},r={instance:Set,from:e=>[...e.values()],stub:()=>new Set,hydrate:(e,t)=>{for(const n of t)e.add(n)}},o={instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},s={instance:RegExp,from:({flags:e,source:t})=>e?[t,e]:[t],create:([e,t])=>new RegExp(e,t)},i={instance:URL,from:e=>[e.href],create:([e])=>new URL(e)};return new Map([e,t,n,r,o,s,i].map(e=>[e.instance.name,e]))}(),q=new TextEncoder,K=new TextDecoder("utf-8");function H(e,t=G){return JSON.stringify(X(e,t))}function Q(e){if(void 0===e)return-1;if("number"==typeof e){if(Number.isNaN(e))return-3;if(!Number.isFinite(e))return e<0?-5:-4}return null}const Z=[];function X(e,t=G){const n=Q(e);if(null!==n)return n;const r=[],o=new Map;return function e(n){const s=Q(n);if(null!==s)return s;let i=o.get(n);if(void 0!==i)return i;switch(i=r.length,typeof n){case"number":case"string":case"boolean":r[i]=n,o.set(n,i);break;case"bigint":r[i]=[-6,n.toString(16)],o.set(n,i);break;case"object":if(null===n)r[i]=n,o.set(n,i);else if(Array.isArray(n)){const t=function(e){if(Z.length<e){const t=Z.length;Z.length=e,Z.fill(-2,t,e)}return Z.slice(0,e)}(n.length);r[i]=t,o.set(n,i);for(const[r,o]of n.entries())t[r]=e(o)}else{const[s,a]=function(e,t){const n=e.constructor;if("function"==typeof n){const r=n.name,o=t.get(r);if(void 0!==o)return[r,o.from(e)]}const r=Object.entries(e),o=r.length,s=Array.from({length:o+o});for(let e=0;e<o;e++){const t=r[e],n=e+e;s[n]=t[0],s[n+1]=t[1]}return["",s]}(n,t),c=a.length,d=Array.from({length:c+1});d[0]=s,r[i]=d,o.set(n,i);for(let t=0;t<c;t++)d[t+1]=e(a[t])}}return i}(e),r}function ee(e,t){return function(e){return new Y(512,L,512).update(e).hex()}(H([e,t]))}const te=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=ee}={}){return function(n,r){let o,s,i;return"getter"===r?.kind?function(){const r=t(this,[]),a=Date.now();return(i!==r||a-s>e)&&(i=r,o=n.call(this),s=a),o}:function(...a){const c=t(this,a),d=Date.now();return(i!==c||d-s>e)&&(i=c,o=r?n.call(this,...a):n(...a),s=d),o}}}({getCacheKey:ee});function ne(e){return!!e&&"0"!==e&&"false"!==e}let re;class oe{static{[re]=function(e,t,n,r,o){var s,i,a,c,d,l,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),f=Object.defineProperty,h=Object.create,m=[h(null),h(null)],g=t.length;function w(t,n,r){return function(o,s){n&&(s=o,o=e);for(var i=0;i<t.length;i++)s=t[i].apply(o,r?[s]:[]);return r?s:o}}function y(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function b(e,t,n,r,o,a,c,d,l,u,p){function h(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),b=t[3],v=!c,k=1===o,S=3===o,E=4===o,P=2===o;function A(t,n,r){return function(o,s){return n&&(s=o,o=e),r&&r(o),x[t].call(o,s)}}if(!v){var x={},$=[],j=S?"get":E||k?"set":"value";if(l?(u||k?x={get:F(function(){return b(this)},r,"get"),set:function(e){t[4](this,e)}}:x[j]=b,u||F(x[j],r,P?"":j)):u||(x=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=m[+d][r])&&7!==(i^o))throw Error("Decorating two elements with the same name ("+x[j].name+") is not supported yet");m[+d][r]=o<3?1:o}}for(var R=e,O=g.length-1;O>=0;O-=n?2:1){var D=y(g[O],"A decorator","be",!0),N=n?g[O-1]:void 0,I={},T={kind:["field","accessor","method","getter","setter","class"][o],name:r,metadata:s,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");y(t,"An initializer","be",!0),a.push(t)}.bind(null,I)};if(v)i=D.call(N,R,T),I.v=1,y(i,"class decorators","return")&&(R=i);else if(T.static=d,T.private=l,i=T.access={has:l?p.bind():function(e){return r in e}},E||(i.get=l?P?function(e){return h(e),x.value}:A("get",0,h):function(e){return e[r]}),P||S||(i.set=l?A("set",0,h):function(e,t){e[r]=t}),R=D.call(N,k?{get:x.get,set:x.set}:x[j],T),I.v=1,k){if("object"==typeof R&&R)(i=y(R.get,"accessor.get"))&&(x.get=i),(i=y(R.set,"accessor.set"))&&(x.set=i),(i=y(R.init,"accessor.init"))&&$.unshift(i);else if(void 0!==R)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(R,(u?"field":"method")+" decorators","return")&&(u?$.unshift(R):x[j]=R)}return o<2&&c.push(w($,d,1),w(a,d,0)),u||v||(l?k?c.splice(-1,0,A("get",d),A("set",d)):c.push(P?x[j]:y.call.bind(x[j])):f(e,r,x)),R}function v(e){return f(e,p,{configurable:!0,enumerable:!0,value:s})}return s=h(null==s?null:s),d=[],l=function(e){e&&d.push(w(e))},u=function(t,r){for(var s=0;s<n.length;s++){var i=n[s],l=i[1],u=7&l;if((8&l)==t&&!u==r){var p=i[2],f=!!i[3],h=16&l;b(t?e:e.prototype,i,h,f?"#"+p:z(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,f,r,t&&f?function(t){return B(t)===e}:o)}}},u(8,0),u(0,0),u(8,1),u(0,1),l(a),l(c),i=d,g||v(e),{e:i,get c(){var n=[];return g&&[v(e=b(e,[t],r,e.name,5,n)),w(n,1)]}}}(this,[],[[te,3,"isBunAvailable"],[te,3,"usesBunPackageManager"],[te,3,"buildCommand"],[te,3,"rootDirPath"],[te,3,"dockerfile"],[te,3,"hasDockerfile"],[te,3,"hasSourceCode"],[te,3,"name"],[te,3,"dockerImageName"],[te,3,"env"],[te,3,"packageJson"],[te,3,"packageJsonPath"],[te,3,"hasPrisma"],[te,3,"hasDrizzle"],[te,3,"databaseOrm"],[te,3,"hasVitest"],[te,3,"hasOxlint"],[te,3,"hasOxfmt"],[te,3,"hasPrettier"],[te,3,"hasPoetryLock"],[te,3,"hasPubspecYaml"],[te,3,"preferredLinter"],[te,3,"hasPlaywrightConfig"],[te,3,"skipLaunchingServerForPlaywright"],[te,3,"dockerPackageJson"],[te,3,"binExists"],[te,3,"rootPackageJson"]]).e}argv=void re(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){return!!this.hasBunToolVersion()||this.usesBunPackageManager}get usesBunPackageManager(){return!!this.hasBunLockfile()||this.hasBunPackageManager()}hasBunToolVersion(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}hasBunLockfile(){return["bun.lock","bun.lockb"].some(n=>e.existsSync(t.join(this.rootDirPath,n)))}hasBunPackageManager(){const e=this.rootPackageJson?.packageManager??this.packageJson.packageManager;return"string"==typeof e&&e.startsWith("bun@")}get buildCommand(){return this.packageJson.scripts?.build?.includes("buildIfNeeded")?"YARN run build":this.packageJson.scripts?.build?"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":""):"echo 'No build script'"}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,"..","..","package.json"))?t.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){if(!this.loadEnv)return process.env;const[n,r]=function(n,r){let o=(n.env??[]).map(e=>t.resolve(r,e.toString()));const s=n.cascadeEnv??(n.cascadeNodeEnv?process.env.NODE_ENV||"development":n.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof s){if(0===o.length&&(o.push(t.join(r,".env")),n.includeRootEnv)){const n=t.resolve(r,"..","..");e.existsSync(t.join(n,"package.json"))&&o.push(t.join(n,".env"))}o=o.flatMap(e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e])}o=o.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e));const i=P(n);n.verbose&&!i&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",o.join(", ")));const a=[],c={};for(const e of o){const o=[];for(const[n,s]of Object.entries(x(t.join(r,e))))n in c||n in process.env||(c[n]=s,o.push(n));a.push([e,o]),n.verbose&&!i&&o.length>0&&console.info(`Read ${o.length} environment variables from ${e}`)}if(n.verbose||i||console.info(`Read env files: ${a.map(([e,t])=>t.length>0?`${e} (${t.join(", ")})`:e).join(", ")||"nothing"}`),n.checkEnv){const e=Object.keys(x(t.join(r,n.checkEnv))).filter(e=>!(e in c)&&!(e in process.env));if(e.length>0)throw new Error(`Missing environment variables in [${o.join(", ")}]: [${e.join(", ")}]`)}return[p({parsed:c,processEnv:{}}).parsed??c,a]}(this.argv,this.dirPath);if(!P(this.argv))for(const[e,t]of r)console.info(`Loaded ${t} environment variables from ${e}`);return{...n,...process.env}}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return t.join(this.dirPath,"package.json")}get hasPrisma(){return!!this.getOwnDependencyVersion("prisma")}get hasDrizzle(){return!!this.getOwnDependencyVersion("drizzle-orm")}get databaseOrm(){return this.hasPrisma?"prisma":this.hasDrizzle?"drizzle":void 0}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasOxlint(){return this.hasDependency("oxlint")}get hasOxfmt(){return this.hasDependency("oxfmt")}get hasPrettier(){return this.hasDependency("prettier")}get hasPoetryLock(){return e.existsSync(t.join(this.dirPath,"poetry.lock"))||e.existsSync(t.join(this.rootDirPath,"poetry.lock"))}get hasPubspecYaml(){return e.existsSync(t.join(this.dirPath,"pubspec.yaml"))||e.existsSync(t.join(this.rootDirPath,"pubspec.yaml"))}get preferredLinter(){if(this.hasOxlint)return"oxlint"}hasOwnDependency(e){return!!this.getOwnDependencyVersion(e)}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(ne(this.env.CI))return!1;try{const t=this.findFile("playwright.config.ts");return/\bwebServer\b/.test(e.readFileSync(t,"utf8"))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const o=t.join(r,"node_modules",".bin");if(e.existsSync(o)&&(this.env.PATH=`${o}:${this.env.PATH}`,n=!0),e.existsSync(t.join(r,".git")))break;const s=t.dirname(r);if(r===s)break;r=s}return n}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join("..","..",n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw new Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}hasDependency(e){return!!(this.getOwnDependencyVersion(e)??this.getDependencyVersion(this.rootPackageJson,e))}getOwnDependencyVersion(e){return this.getDependencyVersion(this.packageJson,e)}getDependencyVersion(e,t){if(e)return e.dependencies?.[t]??e.devDependencies?.[t]??e.optionalDependencies?.[t]??e.peerDependencies?.[t]}get rootPackageJson(){if(this.rootDirPath===this.dirPath)return this.packageJson;try{return JSON.parse(e.readFileSync(t.join(this.rootDirPath,"package.json"),"utf8"))}catch(e){return void console.error(`[wb] Failed to read or parse ${t.join(this.rootDirPath,"package.json")}`,e)}}}function se(n,r=!0,o){if(o??=process.cwd(),e.existsSync(t.join(o,"package.json")))return new oe(o,n,r)}async function ie(e,t=!0,n){const r=ae(e,t,n);if(r)return{...r,descendants:r.root===r.self?await ce(e,r.root,t):[r.self]}}function ae(n,r=!0,o){if(o??=process.cwd(),!e.existsSync(t.join(o,"package.json")))return;const s=new oe(o,n,r);let i=s;if(!s.packageJson.workspaces&&t.dirname(o).endsWith("/packages")){const s=t.resolve(o,"..","..");e.existsSync(t.join(s,"package.json"))&&(i=new oe(s,n,r))}return{root:i,self:s}}async function ce(n,r,o){const s=[r],i=r.packageJson.workspaces;if(!Array.isArray(i))return s;const a=[],c=[];for(const n of i.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):a.push(n);c.push(...await l(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&s.push(new oe(r,n,o));return s}const de=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),le=de?"bun --bun run":"node",ue=de?"bun":"yarn",pe=de?"bun --bun run":"yarn",fe={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(n){await async function(n,r){const s=se(n,!0,r);if(!s)return console.error(d.red("No project found.")),!0;const i=n.command??(s.packageJson.scripts?.build?de?"bun run build":"yarn build":void 0);if(!i)return console.info(d.green("Skip to build because no build command is defined.")),!1;if(n={...n,command:i},!e.existsSync(t.join(s.rootDirPath,".git")))return he(s,n),!0;const[a,l,u]=await async function(n,r){const s=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(s,"last-build");await e.promises.mkdir(s,{recursive:!0});const a=c("sha256"),d=o.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(d);const l=JSON.stringify(Object.entries(n.env).filter(([e])=>!me.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));a.update(l),await async function(e,t,n){return new Promise(r=>{const s=o.spawnSync("git",["status","--porcelain"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").filter(e=>e.length>0).map(e=>e.slice(2).trim()).map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(ge.some(t=>e.includes(t))||we.some(t=>e.endsWith(t)))&&!ye.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${s.join(", ")}`);const i=o.spawn("git",["diff","--",...s],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,a);const u=a.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(s,n);if(a)return console.info(d.green(`Skip to run '${n.command}' 💫`)),!1;if(!he(s,n))return;n.dryRun||await e.promises.writeFile(l,u,"utf8");return!0}(n)}};function he(e,t){if(console.info(d.green(`Run '${t.command}'`)),!t.dryRun){const n=o.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const me=new Set(["CI","PWDEBUG","TMPDIR"]);const ge=["src/","public/"],we=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],ye=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const be=new m,ve={exitIfFailed:!0};async function ke(e,t,n,r=ve){const o=Ee(e,t);if(n.silent&&r.omitSilentStart&&!n.dryRun||Pe(o.printable,t,n.silent?"Command":"Start"),n.verbose&&Pe(o.runnable,t,"Start (raw)",!0),n.dryRun)return Ae(o.printable,0,r,{silentSuccess:n.silent}),0;const s=Boolean(n.silent&&(r.processSilentOutput??r.printSilentOutputOnFailureOnly));let i=!1;const a=n.silent&&r.silentProgressIntervalMs?setInterval(()=>{process.stdout.write("."),i=!0},r.silentProgressIntervalMs):void 0,c=await I(o.runnable,void 0,{cwd:t.dirPath,env:xe(t.env,{...r,preserveColor:r.preserveColor??(!!n.silent||void 0)}),shell:!0,stdio:n.silent?"pipe":"inherit",timeout:r.timeout,mergeOutAndError:s,killOnExit:!0,printingStdout:n.silent&&!s,printingStderr:n.silent&&!s,omitBlankLinesWhilePrinting:n.silent,verbose:n.verbose}).finally(()=>{a&&clearInterval(a)}),l=c.status??1;if(i&&process.stdout.write("\n"),s&&(!r.printSilentOutputOnFailureOnly||0!==l)){const e=(r.processSilentOutput?r.processSilentOutput(c.stdout):c.stdout).trim();e&&(process.stdout.write(e),process.stdout.write("\n"))}return n.silent&&0===l&&r.silentSuccessMessage&&console.info(d.green(r.silentSuccessMessage)),r.onSignal?.(c.signal),Ae(o.printable,l,r,{silentSuccess:n.silent}),l}function Se(e,t,n,r=ve){return be.runAndWaitForReturnValue(async()=>{const o=Ee(e,t);if(Pe(o.printable,t,"Start (parallel)",!0),n.dryRun)return Pe(o.printable,t,"Started (log)"),n.verbose&&Pe(o.runnable,t,"Started (raw)",!0),Ae(o.printable,0,r),0;const s=await I(o.runnable,void 0,{cwd:t.dirPath,env:xe(t.env,{...r,preserveColor:r.preserveColor??!0}),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});r.onSignal?.(s.signal),Pe(o.printable,t,"Started (log)"),n.verbose&&Pe(o.runnable,t,"Started (raw)",!0);const i=s.stdout.trim();return i&&!r.printRawOutput&&(process.stdout.write(i),process.stdout.write("\n")),Ae(o.printable,s.status,r),s.status??1})}function Ee(e,t){const n=t.usesBunPackageManager?"bun --bun run":"yarn";let r=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll(/PRISMA generate(?!\s+--no-hints)(?=\s|$)/gu,t.packageJson.dependencies?.blitz?"PRISMA generate":"PRISMA generate --no-hints").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN run ",t.usesBunPackageManager?`${n} `:"YARN run ").replaceAll("BUN ",t.usesBunPackageManager?`${n} `:"YARN ").replaceAll("YARN run ",t.usesBunPackageManager?`${n} `:"yarn run ");t.usesBunPackageManager&&(r=r.replaceAll("YARN build-ts run","bun --bun run").replaceAll("bun --bun run bun --bun run","bun --bun run").replaceAll("dist/index.js","src/index.ts")),r=r.trim();const o=$e(r.replaceAll("YARN ",`${n} `)),s=$e(r.replaceAll("YARN playwright ",`${n} playwright `).replaceAll("YARN ",!t.usesBunPackageManager&&t.binExists?"":`${n} `));return{printable:`${n} dotenv${t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:""} -- ${o}`,runnable:s}}function Pe(e,t,n="Start",r=!1){console.info("\n"+(r?d.gray:d.cyan)(d.bold(`${n}:`),e)+d.gray(` at ${t.dirPath}`))}function Ae(e,t,n,r={}){if(0===t){if(r.silentSuccess)return;console.info(d.green(d.bold("Finished:"),e))}else console.info(d.red(d.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1)}function xe(e,t){const n={...e};return t.ci&&(n.CI="1"),function(e,t){void 0!==e.NO_COLOR||!1===t?delete e.FORCE_COLOR:t&&process.stdout.isTTY&&(e.FORCE_COLOR||="3")}(n,t.preserveColor),n}function $e(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const je={...E,"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}};function Re(e){const t=[];for(const n of Object.keys(E)){const r=Oe(e,n);if(void 0!==r)if("boolean"!=typeof r)if("string"!=typeof r&&"number"!=typeof r){if(Array.isArray(r))for(const e of r)t.push(`--${n}=${e}`)}else t.push(`--${n}=${r}`);else t.push(r?`--${n}`:`--${n}=false`)}return!0===e.silent&&void 0===Oe(e,"quiet-env")&&t.push("--quiet-env"),t}function Oe(e,t){const n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const De={command:"concurrently <commands...>",describe:"Run commands concurrently",builder:{...je,"kill-others":{description:"Kill other commands when one command exits",type:"boolean"},"kill-others-on-fail":{description:"Kill other commands when one command fails",type:"boolean"},success:{description:"Define successful completion criteria",type:"string",choices:["all","first"],default:"all"},commands:{description:"Commands to run concurrently",type:"array"}},async handler(e){"win32"===process.platform&&(console.error(d.red("This command is not supported on Windows.")),process.exit(1));const t=se(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=(e.commands??[]).map(String).filter(Boolean);0===n.length&&(console.error(d.red("No commands provided.")),process.exit(1));try{const r=await async function(e){const t=e.commands.map(t=>o.spawn(Ee(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:xe(e.project.env,{ci:e.ci}),shell:!0,stdio:"inherit"}));let n,r,s,i=!1;const a=[],c=Array.from({length:t.length}),d=t.map((n,o)=>new Promise(d=>{let l=!1;const u=n=>{l||(l=!0,c[o]=n,r??=n,!i&&function(e,t){return"first"===t.success||t.killOthers||t.killOthersOnFail&&0!==e}(n,e)&&(s=n,i=!0,a.push(Ie(t,"SIGTERM"))),d())};n.once("error",e=>{console.error("Failed to start child process:",e),u(1)}),n.once("exit",(e,t)=>{u(Ne(e??void 0,t??void 0))})})),l=e=>{n??=e,i||(i=!0,a.push(Ie(t,e)))},u=()=>{l("SIGINT")},p=()=>{l("SIGTERM")},f=()=>{l("SIGQUIT")};process.on("SIGINT",u),process.on("SIGTERM",p),process.on("SIGQUIT",f);try{await Promise.all(d),await Promise.all(a)}finally{process.removeListener("SIGINT",u),process.removeListener("SIGTERM",p),process.removeListener("SIGQUIT",f)}if(n)return Ne(void 0,n);if("first"===e.success)return r??1;if(void 0!==s)return s;for(const e of c)if(void 0!==e&&0!==e)return e;return 0}({commands:n,project:t,killOthers:e.killOthers??!1,killOthersOnFail:e.killOthersOnFail??!1,success:e.success,ci:"boolean"==typeof e.ci?e.ci:void 0});process.exit(r)}catch(e){console.error(d.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function Ne(e,t){return void 0!==e?e:t&&t in h.signals?128+h.signals[t]:1}async function Ie(e,t){const n=Te(function(e){return e.flatMap(e=>void 0===e.pid?[]:[e.pid])}(e),t);0!==n.length&&await async function(e){const t=Date.now()+5e3;for(;Date.now()<t;){if(e.every(_e))return!1;await Ce(Math.min(100,t-Date.now()))}return!0}(n)&&Te(n,"SIGKILL")}function Te(e,t){const n=[];for(const r of e)try{if(!Be(r,t))continue;n.push(r),j(r,t)}catch(e){console.warn("Failed to kill child process:",e)}return n}function _e(e){try{return process.kill(-e,0),!1}catch(e){return!!Fe(e)}}async function Ce(e){await new Promise(t=>setTimeout(t,e))}function Be(e,t){try{return process.kill(-e,t),!0}catch(e){if(Fe(e))return!1;throw e}}function Fe(e){return"object"==typeof e&&null!==e&&"code"in e&&"ESRCH"===e.code}const ze="file:",Me="litestream.yml",Le="/etc/litestream.yml",We=[{schemaPath:t.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:t.join("prisma","schema"),dbPath:t.join("prisma","schema")},{schemaPath:t.join("db","schema.prisma"),dbPath:"db"}];function Ue(e){return e.packageJson.dependencies?.blitz?"db/mount":"prisma/mount"}function Je(n){return We.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}function Ye(n){const r=t.join(n.dirPath,Me);return e.existsSync(r)?`-config ./${Me}`:e.existsSync(Le)?`-config ${Le}`:`-config ./${Me}`}const Ve=new class{cleanUpLitestream(e){const t=Ue(e);var n;return`${`if [ -f "${n=`${t}/prod.sqlite3`}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${ze}${n}"; fi && rm -f "${n}".* "${n}"-*`}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}generate(e,t=""){return["PRISMA generate",t].filter(Boolean).join(" ")}deployForce(e){const t=Ue(e),n=`rm -Rf "${`${t}/prod.sqlite3`}"*`;return`${n}; PRISMA migrate reset --force --skip-seed && ${n}\n && litestream restore ${Ye(e)} -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e){const t=Ue(e);return`litestream ltx ${Ye(e)} ${t}/prod.sqlite3`}migrate(e,t=""){return`PRISMA migrate deploy ${t} && ${this.generate(e)} && ${this.seed(e)}`}migrateDev(e,t=""){return`PRISMA migrate dev ${t}`}reset(e,n=""){const r=[],o=function(e){const n=e.env.DATABASE_URL;if(!n?.startsWith(ze))return;const r=n.slice(5).replace(/[?#].*$/,"");if(!r)return;const o=Je(e),s=t.isAbsolute(r)?r:t.resolve(e.dirPath,o??".",r);return`rm -f "${s}" "${s}-wal" "${s}-shm"`}(e);o&&r.push(o);const s=["PRISMA migrate reset --force",n].filter(Boolean).join(" ");return r.push(s),e.packageJson.dependencies?.blitz&&r.push(this.seed(e)),r.filter(Boolean).join(" && ")}restore(e,t){const n=Ue(e);return`rm -Rf ${t}*; litestream restore ${Ye(e)} -o ${t} ${n}/prod.sqlite3`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(e,n,r=""){let o="";if(n)try{new URL(n),o=`DATABASE_URL=${n} `}catch{const e=t.resolve(n);o=`DATABASE_URL=${ze}${e} `}else if(e.env.DATABASE_URL?.startsWith(ze)){const n=Je(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));o=`DATABASE_URL=${ze}${r} `}}return`${o}PRISMA studio ${r}`}},Ge={command:"gen-code",describe:"Generate code for the current project",builder:{},async handler(e){const t=await ie(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=t.descendants.map(e=>({project:e,scripts:qe(e)})).filter(({scripts:e})=>e.length>0);if(0!==n.length)for(const{project:t,scripts:r}of n){console.info(`Running "gen-code" for ${t.name} ...`);for(const n of r)await ke(n,t,e)}else console.info(d.green("No code generation needed."))}};function qe(e){const t=[];e.hasOwnDependency("blitz")?(t.push("YARN blitz codegen"),e.hasPrisma&&t.push(Ve.generate(e))):e.hasPrisma&&t.push(Ve.generate(e));const n=function(e){if(!e.hasOwnDependency("@chakra-ui/cli"))return;if(2===function(e,t){const n=e.packageJson,r=n.dependencies?.[t]??n.devDependencies?.[t]??n.optionalDependencies?.[t]??n.peerDependencies?.[t],o=r?.match(/\d+/u)?.[0];return void 0===o?void 0:Number(o)}(e,"@chakra-ui/cli"))return"YARN chakra-cli tokens src/core/theme.ts";if(Ke(e,"src/theme.ts"))return"YARN chakra typegen src/theme.ts --strict";return}(e);n&&t.push(n);const r=0===t.length&&e.hasDrizzle?function(e){return["drizzle.config.ts","drizzle.config.mts","drizzle.config.js","drizzle.config.mjs"].find(t=>Ke(e,t))}(e):void 0;return r&&t.push(`YARN drizzle-kit check --config ${r} || true`),t}function Ke(n,r){return e.existsSync(t.join(n.dirPath,r))}const He={command:"kill-port-if-non-ci",describe:"Kill the port specified by PORT environment variable if non-CI.",builder:{},async handler(e){await async function(e){const t=se(e);t||(console.error(d.red("No project found.")),process.exit(1));if(ne(t.env.CI))return void console.info(`Skip killing port due to CI: ${t.env.CI}`);const n=t.env.PORT,r=Number(n);(!Number.isInteger(r)||r<=0)&&(console.error(d.red(`PORT environment variable is invalid: ${n}`)),process.exit(1));console.info(`Killing the port: ${r}`);try{await g(r)}catch{}}(e)}};function Qe(e,t){if(!function(e,t){return 0!==e||function(e){return/\bwarn(?:ing)?s?\b/i.test(e.replaceAll(/\b(?:0|no) warnings?\b/gi,""))}(t)}(e,t))return;const n=function(e){return e.trim()}(t);n&&(process.stdout.write(n),process.stdout.write("\n"))}function Ze(e){return e.map(e=>Xe(e)).join(" ")}function Xe(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll("'","'\"'\"'")}'`}const et=new Set(["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"]),tt=new Set(["py"]),nt=new Set(["dart"]),rt=new Set([...et,"css","gql","graphql","hbs","htm","html","json","json5","jsonc","less","md","mdx","scss","toml","yaml","yml"]),ot=new Set(["cjs","css","cts","htm","html","java","js","json","json5","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),st=new Set([...ot].filter(e=>!rt.has(e))),it="!**/test{-,/}fixtures/**",at={command:"lint [files...]",describe:"Lint code",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"},quiet:{description:"Report errors only",type:"boolean"},silent:{description:"Print only failed or warning command output",type:"boolean"}},async handler(e){const t=await ct(e);t&&process.exit(t)}};async function ct(e){if("win32"===process.platform)return console.error(d.red("This command is not supported on Windows.")),1;const n=await ie(e,!1);if(!n)return console.error(d.red("No project found.")),1;const r=function(e){const t=new Set;for(const n of[...e.files??[],...e._.slice(1),...e["--"]??[]])t.add(String(n));return[...t]}(e),o=new Map,s=new Map,i=new Map,a=new Map,c=[],l=[];let u,p,f=!1;if(r.length>0){const h=await Promise.all(r.map(async e=>{const n=t.resolve(e),r=await async function(e){try{if((await w.stat(e)).isDirectory())return"directory"}catch{}return"other"}(n);return{fileKind:r,filePath:n}}));for(const{fileKind:r,filePath:u}of h){if(u.endsWith("/test/fixtures")||u.includes("/test/fixtures/")||u.endsWith("/test-fixtures")||u.includes("/test-fixtures/"))continue;const p=t.extname(u).slice(1);if(u.endsWith("/package.json"))l.push(u);else{l.push(...St(n.descendants,u,r));for(const{lintPath:t,project:l}of Et(n.descendants,u,r)){if(l.hasPoetryLock&&("directory"===r||tt.has(p))){const e=i.get(l)??[];if(e.push(t),i.set(l,e),"directory"!==r)continue}if(l.hasPubspecYaml&&("directory"===r||nt.has(p))){const e=a.get(l)??[];if(e.push(t),a.set(l,e),"directory"!==r)continue}if("directory"===r||At(l,p)){const n=o.get(l)??[];if(n.push(t),o.set(l,n),e.format)if("directory"===r&&l.hasOxfmt){const e=s.get(l)??[];e.push(t),s.set(l,e),c.push(kt(t),it)}else for(const e of vt(l,t,r,p))if(l.hasOxfmt){const t=s.get(l)??[];t.push(e),s.set(l,t)}else c.push(e)}else if(e.format&&(ot.has(p)||rt.has(p)))if(l.hasOxfmt&&rt.has(p)){const e=s.get(l)??[];e.push(t),s.set(l,e)}else ot.has(p)&&c.push(t);else Pt(p)&&!l.preferredLinter&&(console.error(d.red(`No linter found for ${l.name}. Install Oxlint.`)),f=!0)}}}u=[...new Set(c)],p=[...new Set(l)]}else u=function(e,n){const r=new Set([`**/{.*/,}*.{${[...st].join(",")}}`,it]);for(const o of n){if(!xt(o))continue;const n=t.join(o.dirPath,"**/{.*/,}*.{"+[...ot].join(",")+"}");r.add(t.relative(e,n)||n)}return[...r]}(n.self.dirPath,n.descendants),p=n.descendants.map(e=>e.packageJsonPath);const h=[],m=[],g={exitIfFailed:!1,preserveColor:!e.printAllOutput},y=Boolean(e.format),b=!e.format||e.fix;if(r.length>0){if(b)for(const[t,n]of o){const r=ht(t,e,n);r&&m.push({command:r,project:t})}for(const[t,n]of i)b&&m.push({command:wt(e,n),project:t}),y&&h.push({command:gt(n),project:t});for(const[e,t]of a)b&&m.push({command:bt(t),project:e}),y&&h.push({command:yt(t),project:e});if(y)for(const[e,t]of s)h.push({command:mt(t),project:e})}else for(const t of n.descendants){if(b){if(!t.packageJson.workspaces||t.hasSourceCode){const n=ht(t,e);n&&m.push({command:n,project:t})}t.hasPoetryLock&&m.push({command:wt(e),project:t}),t.hasPubspecYaml&&m.push({command:bt(),project:t})}y&&(t.hasOxfmt&&h.push({command:mt(),project:t}),t.hasPoetryLock&&h.push({command:gt(),project:t}),t.hasPubspecYaml&&h.push({command:yt(),project:t}))}const v=[];if(y){const t=await dt(h,e,g);if(ut(t,e),v.push(...t.map(e=>e.exitCode)),v.some(e=>0!==e))return 1}if(f)return 1;if(y){if(u.length>0&&n.self.hasPrettier){const t=await lt(Ze(["YARN","prettier","--cache","--no-error-on-unmatched-pattern","--write","--",...u]),n.self,e,g);ut([t],e),v.push(t.exitCode)}if(p.length>0){const t=await lt(Ze(["YARN","sort-package-json","--",...p]),n.self,e,g);ut([t],e),v.push(t.exitCode)}if(v.some(e=>0!==e))return 1}if(b){const t=await dt(m,e,g);ut(t,e),v.push(...t.map(e=>e.exitCode))}return v.some(e=>0!==e)?1:0}function dt(e,t,n){return Promise.all(e.map(({command:e,project:r})=>lt(e,r,t,n)))}function lt(e,t,n,r){if(n.silent){const o=Ee(e,t);return function(e,t,n,r=ve){return be.runAndWaitForReturnValue(async()=>{const o=Ee(e,t);if(n.dryRun)return{exitCode:0,output:""};const s=await I(o.runnable,void 0,{cwd:t.dirPath,env:xe(t.env,{...r,preserveColor:r.preserveColor??!0}),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});return r.onSignal?.(s.signal),{exitCode:s.status??1,output:s.stdout}})}(e,t,n,r).then(e=>({...e,command:o.printable,cwd:t.dirPath}))}return Se(e,t,n,r).then(e=>({exitCode:e}))}function ut(e,t){const n=t.silent&&!t.printAllOutput?e.filter(e=>0!==e.exitCode):e;if(0!==n.length)for(const e of n)"output"in e&&(t.printAllOutput?pt(e):(t.silent&&ft(e.command,e.cwd),Qe(e.exitCode,e.output)))}function pt(e){if(ft(e.command,e.cwd),0===e.exitCode&&((t=e.command).includes(" oxfmt ")||t.includes(" sort-package-json ")))return void console.info(d.green("Succeeded."));var t;const n=e.output.trim();n&&(process.stdout.write(n),process.stdout.write("\n"))}function ft(e,t){console.info("\n"+d.cyan(d.bold("Command:"),e)+d.gray(` at ${t}`))}function ht(e,t,n){if("oxlint"===e.preferredLinter)return Ze(["YARN","oxlint","--no-error-on-unmatched-pattern",...t.quiet?["--quiet"]:[],...t.fix?["--fix"]:[],...n??["."]])}function mt(e){return Ze(["YARN","oxfmt","--write","--no-error-on-unmatched-pattern",...e??["."],"!**/package.json"])}function gt(e){const t=e&&e.length>0?e:["."];return[Ze(["poetry","run","isort","--profile","black","--filter-files",...t]),Ze(["poetry","run","black",...t])].join(" && ")}function wt(e,t){const n=t&&t.length>0?t:["."];return Ze(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])}function yt(e){return Ze(["dart","format",...e&&e.length>0?e:["."]])}function bt(e){return Ze(["dart","analyze",...e&&e.length>0?e:["."]])}function vt(e,t,n,r){return"directory"===n&&e.hasOxfmt?[t]:"directory"===n&&xt(e)?[t,it]:function(e,t){return e.hasOxfmt?rt.has(t):!!xt(e)||st.has(t)}(e,r)?[t]:[]}function kt(e){return t.join(e,`**/{.*/,}*.{${[...st].join(",")}}`)}function St(e,n,r){return"directory"!==r?[]:e.filter(e=>e.packageJsonPath===t.join(n,"package.json")||e.packageJsonPath.startsWith(`${n}/`)).map(e=>e.packageJsonPath)}function Et(e,t,n){if("directory"===n){const n=e.filter(e=>e.dirPath===t||e.dirPath.startsWith(`${t}/`));if(n.length>0)return n.map(e=>({lintPath:e.dirPath,project:e}))}const r=function(e,t){let n;for(const r of e)t!==r.dirPath&&!t.startsWith(`${r.dirPath}/`)||n&&!(r.dirPath.length>n.dirPath.length)||(n=r);return n}(e,t);return r?[{lintPath:t,project:r}]:[]}function Pt(e){return et.has(e)||tt.has(e)||nt.has(e)}function At(e,t){return"oxlint"===e.preferredLinter&&et.has(t)}function xt(e){return!e.hasOxfmt&&"oxlint"===e.preferredLinter}const $t=new Set;async function jt(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await I("docker",["ps","-q",...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}(e,t);if(0===n.length)return;await I("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await g(e)}catch{}}async function Rt(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await async function(e,t){await Ot(e)||await jt(e,t);const n=async()=>{$t.has(e)||($t.add(e),await jt(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(n,t),n}async function Ot(e){for(const t of["127.0.0.1","::"]){if(!await Dt(t,e))return!1}return!0}async function Dt(e,t){return new Promise(n=>{const r=v();r.once("error",e=>{"EADDRINUSE"!==e.code?"EAFNOSUPPORT"!==e.code?n(!1):n(!0):n(!1)}),r.once("listening",()=>{r.close(()=>{n(!0)})}),r.listen(t,e)})}const Nt={};function It(e,t){return String.raw`
9
+ */const M=[..."0123456789abcdef"],L=[6,1536,393216,100663296],W=[0,8,16,24],U=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648];const J=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class Y{blocks=[];s=[];reset=!0;finalized=!1;block=0;start=0;lastByteIndex=0;constructor(e,t,n){this.padding=t,this.outputBits=n,this.blockCount=1600-(e<<1)>>5,this.byteCount=this.blockCount<<2,this.outputBlocks=n>>5,this.extraBytes=(31&n)>>3;for(let e=0;e<50;++e)this.s[e]=0}update(e){if(this.finalized)throw new Error("finalize already called");const t=this.blocks,n=this.byteCount,r=e.length,o=this.blockCount,s=this.s;let i,a,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,i=1;i<o+1;++i)t[i]=0;for(i=this.start;c<r&&i<n;++c)a=e.codePointAt(c)||0,a<128?t[i>>2]|=a<<W[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<W[3&i++],t[i>>2]|=(128|63&a)<<W[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<W[3&i++],t[i>>2]|=(128|a>>6&63)<<W[3&i++],t[i>>2]|=(128|63&a)<<W[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<W[3&i++],t[i>>2]|=(128|a>>12&63)<<W[3&i++],t[i>>2]|=(128|a>>6&63)<<W[3&i++],t[i>>2]|=(128|63&a)<<W[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[o],i=0;i<o;++i)s[i]^=t[i];V(s),this.reset=!0}else this.start=i}return this}finalize(){if(this.finalized)return;this.finalized=!0;const e=this.blocks;let t=this.lastByteIndex;const n=this.blockCount,r=this.s;if(e[t>>2]|=this.padding[3&t],this.lastByteIndex===this.byteCount)for(e[0]=e[n],t=1;t<n+1;++t)e[t]=0;for(e[n-1]|=2147483648,t=0;t<n;++t)r[t]^=e[t];V(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let o,s=0,i=0,a="";for(;i<n;){for(s=0;s<e&&i<n;++s,++i)o=t[s],a+=M[o>>4&15]+M[15&o]+M[o>>12&15]+M[o>>8&15]+M[o>>20&15]+M[o>>16&15]+M[o>>28&15]+M[o>>24&15];i%e===0&&(t=J(t),V(t),s=0)}return r&&(o=t[s],a+=M[o>>4&15]+M[15&o],r>1&&(a+=M[o>>12&15]+M[o>>8&15]),r>2&&(a+=M[o>>20&15]+M[o>>16&15])),a}}const V=function(e){let t,n,r,o,s,i,a,c,d,l,u,p,f,h,m,g,w,y,b,v,k,E,S,P,A,x,$,j,R,O,D,N,I,T,_,C,B,F,z,M,L,W,J,Y,V,G,q,K,H,Q,Z,X,ee,te,ne,re,oe,se,ie,ae,ce,de,le;for(r=0;r<48;r+=2)o=e[0]^e[10]^e[20]^e[30]^e[40],s=e[1]^e[11]^e[21]^e[31]^e[41],i=e[2]^e[12]^e[22]^e[32]^e[42],a=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],d=e[5]^e[15]^e[25]^e[35]^e[45],l=e[6]^e[16]^e[26]^e[36]^e[46],u=e[7]^e[17]^e[27]^e[37]^e[47],p=e[8]^e[18]^e[28]^e[38]^e[48],f=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=f^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=o^(c<<1|d>>>31),n=s^(d<<1|c>>>31),e[2]^=t,e[3]^=n,e[12]^=t,e[13]^=n,e[22]^=t,e[23]^=n,e[32]^=t,e[33]^=n,e[42]^=t,e[43]^=n,t=i^(l<<1|u>>>31),n=a^(u<<1|l>>>31),e[4]^=t,e[5]^=n,e[14]^=t,e[15]^=n,e[24]^=t,e[25]^=n,e[34]^=t,e[35]^=n,e[44]^=t,e[45]^=n,t=c^(p<<1|f>>>31),n=d^(f<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=l^(o<<1|s>>>31),n=u^(s<<1|o>>>31),e[8]^=t,e[9]^=n,e[18]^=t,e[19]^=n,e[28]^=t,e[29]^=n,e[38]^=t,e[39]^=n,e[48]^=t,e[49]^=n,h=e[0],m=e[1],G=e[11]<<4|e[10]>>>28,q=e[10]<<4|e[11]>>>28,j=e[20]<<3|e[21]>>>29,R=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,W=e[40]<<18|e[41]>>>14,J=e[41]<<18|e[40]>>>14,T=e[2]<<1|e[3]>>>31,_=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,w=e[12]<<12|e[13]>>>20,K=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,O=e[33]<<13|e[32]>>>19,D=e[32]<<13|e[33]>>>19,de=e[42]<<2|e[43]>>>30,le=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,C=e[14]<<6|e[15]>>>26,B=e[15]<<6|e[14]>>>26,y=e[25]<<11|e[24]>>>21,b=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,Z=e[35]<<15|e[34]>>>17,N=e[45]<<29|e[44]>>>3,I=e[44]<<29|e[45]>>>3,P=e[6]<<28|e[7]>>>4,A=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,oe=e[16]<<23|e[17]>>>9,F=e[26]<<25|e[27]>>>7,z=e[27]<<25|e[26]>>>7,v=e[36]<<21|e[37]>>>11,k=e[37]<<21|e[36]>>>11,X=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,Y=e[8]<<27|e[9]>>>5,V=e[9]<<27|e[8]>>>5,x=e[18]<<20|e[19]>>>12,$=e[19]<<20|e[18]>>>12,se=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,M=e[38]<<8|e[39]>>>24,L=e[39]<<8|e[38]>>>24,E=e[48]<<14|e[49]>>>18,S=e[49]<<14|e[48]>>>18,e[0]=h^~g&y,e[1]=m^~w&b,e[10]=P^~x&j,e[11]=A^~$&R,e[20]=T^~C&F,e[21]=_^~B&z,e[30]=Y^~G&K,e[31]=V^~q&H,e[40]=te^~re&se,e[41]=ne^~oe&ie,e[2]=g^~y&v,e[3]=w^~b&k,e[12]=x^~j&O,e[13]=$^~R&D,e[22]=C^~F&M,e[23]=B^~z&L,e[32]=G^~K&Q,e[33]=q^~H&Z,e[42]=re^~se&ae,e[43]=oe^~ie&ce,e[4]=y^~v&E,e[5]=b^~k&S,e[14]=j^~O&N,e[15]=R^~D&I,e[24]=F^~M&W,e[25]=z^~L&J,e[34]=K^~Q&X,e[35]=H^~Z&ee,e[44]=se^~ae&de,e[45]=ie^~ce&le,e[6]=v^~E&h,e[7]=k^~S&m,e[16]=O^~N&P,e[17]=D^~I&A,e[26]=M^~W&T,e[27]=L^~J&_,e[36]=Q^~X&Y,e[37]=Z^~ee&V,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=E^~h&g,e[9]=S^~m&w,e[18]=N^~P&x,e[19]=I^~A&$,e[28]=W^~T&C,e[29]=J^~_&B,e[38]=X^~Y&G,e[39]=ee^~V&q,e[48]=de^~te&re,e[49]=le^~ne&oe,e[0]^=U[r],e[1]^=U[r+1]},G=function(){const e={instance:Error,from:e=>{const t=[e.name,e.message];return void 0!==e.stack&&t.push(e.stack),void 0!==e.cause&&(void 0===e.stack&&t.push(void 0),t.push(e.cause)),t},stub:()=>new Error,hydrate:(e,[t,n,r,o])=>{e.name=t,e.message=n,void 0===r?delete e.stack:e.stack=r,void 0!==o&&(e.cause=o)}},t={instance:Uint8Array,from:e=>[btoa(K.decode(e))],create:([e])=>q.encode(atob(e))},n={instance:Map,from:e=>[...e.entries()],stub:()=>new Map,hydrate:(e,t)=>{for(const[n,r]of t)e.set(n,r)}},r={instance:Set,from:e=>[...e.values()],stub:()=>new Set,hydrate:(e,t)=>{for(const n of t)e.add(n)}},o={instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},s={instance:RegExp,from:({flags:e,source:t})=>e?[t,e]:[t],create:([e,t])=>new RegExp(e,t)},i={instance:URL,from:e=>[e.href],create:([e])=>new URL(e)};return new Map([e,t,n,r,o,s,i].map(e=>[e.instance.name,e]))}(),q=new TextEncoder,K=new TextDecoder("utf-8");function H(e,t=G){return JSON.stringify(X(e,t))}function Q(e){if(void 0===e)return-1;if("number"==typeof e){if(Number.isNaN(e))return-3;if(!Number.isFinite(e))return e<0?-5:-4}return null}const Z=[];function X(e,t=G){const n=Q(e);if(null!==n)return n;const r=[],o=new Map;return function e(n){const s=Q(n);if(null!==s)return s;let i=o.get(n);if(void 0!==i)return i;switch(i=r.length,typeof n){case"number":case"string":case"boolean":r[i]=n,o.set(n,i);break;case"bigint":r[i]=[-6,n.toString(16)],o.set(n,i);break;case"object":if(null===n)r[i]=n,o.set(n,i);else if(Array.isArray(n)){const t=function(e){if(Z.length<e){const t=Z.length;Z.length=e,Z.fill(-2,t,e)}return Z.slice(0,e)}(n.length);r[i]=t,o.set(n,i);for(const[r,o]of n.entries())t[r]=e(o)}else{const[s,a]=function(e,t){const n=e.constructor;if("function"==typeof n){const r=n.name,o=t.get(r);if(void 0!==o)return[r,o.from(e)]}const r=Object.entries(e),o=r.length,s=Array.from({length:o+o});for(let e=0;e<o;e++){const t=r[e],n=e+e;s[n]=t[0],s[n+1]=t[1]}return["",s]}(n,t),c=a.length,d=Array.from({length:c+1});d[0]=s,r[i]=d,o.set(n,i);for(let t=0;t<c;t++)d[t+1]=e(a[t])}}return i}(e),r}function ee(e,t){return function(e){return new Y(512,L,512).update(e).hex()}(H([e,t]))}const te=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=ee}={}){return function(n,r){let o,s,i;return"getter"===r?.kind?function(){const r=t(this,[]),a=Date.now();return(i!==r||a-s>e)&&(i=r,o=n.call(this),s=a),o}:function(...a){const c=t(this,a),d=Date.now();return(i!==c||d-s>e)&&(i=c,o=r?n.call(this,...a):n(...a),s=d),o}}}({getCacheKey:ee});function ne(e){return!!e&&"0"!==e&&"false"!==e}let re;class oe{static{[re]=function(e,t,n,r,o){var s,i,a,c,d,l,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),f=Object.defineProperty,h=Object.create,m=[h(null),h(null)],g=t.length;function w(t,n,r){return function(o,s){n&&(s=o,o=e);for(var i=0;i<t.length;i++)s=t[i].apply(o,r?[s]:[]);return r?s:o}}function y(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function b(e,t,n,r,o,a,c,d,l,u,p){function h(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),b=t[3],v=!c,k=1===o,E=3===o,S=4===o,P=2===o;function A(t,n,r){return function(o,s){return n&&(s=o,o=e),r&&r(o),x[t].call(o,s)}}if(!v){var x={},$=[],j=E?"get":S||k?"set":"value";if(l?(u||k?x={get:F(function(){return b(this)},r,"get"),set:function(e){t[4](this,e)}}:x[j]=b,u||F(x[j],r,P?"":j)):u||(x=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=m[+d][r])&&7!==(i^o))throw Error("Decorating two elements with the same name ("+x[j].name+") is not supported yet");m[+d][r]=o<3?1:o}}for(var R=e,O=g.length-1;O>=0;O-=n?2:1){var D=y(g[O],"A decorator","be",!0),N=n?g[O-1]:void 0,I={},T={kind:["field","accessor","method","getter","setter","class"][o],name:r,metadata:s,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");y(t,"An initializer","be",!0),a.push(t)}.bind(null,I)};if(v)i=D.call(N,R,T),I.v=1,y(i,"class decorators","return")&&(R=i);else if(T.static=d,T.private=l,i=T.access={has:l?p.bind():function(e){return r in e}},S||(i.get=l?P?function(e){return h(e),x.value}:A("get",0,h):function(e){return e[r]}),P||E||(i.set=l?A("set",0,h):function(e,t){e[r]=t}),R=D.call(N,k?{get:x.get,set:x.set}:x[j],T),I.v=1,k){if("object"==typeof R&&R)(i=y(R.get,"accessor.get"))&&(x.get=i),(i=y(R.set,"accessor.set"))&&(x.set=i),(i=y(R.init,"accessor.init"))&&$.unshift(i);else if(void 0!==R)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(R,(u?"field":"method")+" decorators","return")&&(u?$.unshift(R):x[j]=R)}return o<2&&c.push(w($,d,1),w(a,d,0)),u||v||(l?k?c.splice(-1,0,A("get",d),A("set",d)):c.push(P?x[j]:y.call.bind(x[j])):f(e,r,x)),R}function v(e){return f(e,p,{configurable:!0,enumerable:!0,value:s})}return s=h(null==s?null:s),d=[],l=function(e){e&&d.push(w(e))},u=function(t,r){for(var s=0;s<n.length;s++){var i=n[s],l=i[1],u=7&l;if((8&l)==t&&!u==r){var p=i[2],f=!!i[3],h=16&l;b(t?e:e.prototype,i,h,f?"#"+p:z(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,f,r,t&&f?function(t){return B(t)===e}:o)}}},u(8,0),u(0,0),u(8,1),u(0,1),l(a),l(c),i=d,g||v(e),{e:i,get c(){var n=[];return g&&[v(e=b(e,[t],r,e.name,5,n)),w(n,1)]}}}(this,[],[[te,3,"isBunAvailable"],[te,3,"usesBunPackageManager"],[te,3,"buildCommand"],[te,3,"rootDirPath"],[te,3,"dockerfile"],[te,3,"hasDockerfile"],[te,3,"hasSourceCode"],[te,3,"name"],[te,3,"dockerImageName"],[te,3,"env"],[te,3,"packageJson"],[te,3,"packageJsonPath"],[te,3,"hasPrisma"],[te,3,"hasDrizzle"],[te,3,"databaseOrm"],[te,3,"hasVitest"],[te,3,"hasOxlint"],[te,3,"hasOxfmt"],[te,3,"hasPrettier"],[te,3,"hasPoetryLock"],[te,3,"hasPubspecYaml"],[te,3,"preferredLinter"],[te,3,"hasPlaywrightConfig"],[te,3,"skipLaunchingServerForPlaywright"],[te,3,"dockerPackageJson"],[te,3,"binExists"],[te,3,"rootPackageJson"]]).e}argv=void re(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){return!!this.hasBunToolVersion()||this.usesBunPackageManager}get usesBunPackageManager(){return!!this.hasBunLockfile()||this.hasBunPackageManager()}hasBunToolVersion(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}hasBunLockfile(){return["bun.lock","bun.lockb"].some(n=>e.existsSync(t.join(this.rootDirPath,n)))}hasBunPackageManager(){const e=this.rootPackageJson?.packageManager??this.packageJson.packageManager;return"string"==typeof e&&e.startsWith("bun@")}get buildCommand(){return this.packageJson.scripts?.build?.includes("buildIfNeeded")?"YARN run build":this.packageJson.scripts?.build?"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":""):"echo 'No build script'"}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,"..","..","package.json"))?t.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){if(!this.loadEnv)return process.env;const[n,r]=function(n,r){let o=(n.env??[]).map(e=>t.resolve(r,e.toString()));const s=n.cascadeEnv??(n.cascadeNodeEnv?process.env.NODE_ENV||"development":n.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof s){if(0===o.length&&(o.push(t.join(r,".env")),n.includeRootEnv)){const n=t.resolve(r,"..","..");e.existsSync(t.join(n,"package.json"))&&o.push(t.join(n,".env"))}o=o.flatMap(e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e])}o=o.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e));const i=P(n);n.verbose&&!i&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",o.join(", ")));const a=[],c={};for(const e of o){const o=[];for(const[n,s]of Object.entries(x(t.join(r,e))))n in c||n in process.env||(c[n]=s,o.push(n));a.push([e,o]),n.verbose&&!i&&o.length>0&&console.info(`Read ${o.length} environment variables from ${e}`)}if(n.verbose||i||console.info(`Read env files: ${a.map(([e,t])=>t.length>0?`${e} (${t.join(", ")})`:e).join(", ")||"nothing"}`),n.checkEnv){const e=Object.keys(x(t.join(r,n.checkEnv))).filter(e=>!(e in c)&&!(e in process.env));if(e.length>0)throw new Error(`Missing environment variables in [${o.join(", ")}]: [${e.join(", ")}]`)}return[p({parsed:c,processEnv:{}}).parsed??c,a]}(this.argv,this.dirPath);if(!P(this.argv))for(const[e,t]of r)console.info(`Loaded ${t} environment variables from ${e}`);return{...n,...process.env}}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return t.join(this.dirPath,"package.json")}get hasPrisma(){return!!this.getOwnDependencyVersion("prisma")}get hasDrizzle(){return!!this.getOwnDependencyVersion("drizzle-orm")}get databaseOrm(){return this.hasPrisma?"prisma":this.hasDrizzle?"drizzle":void 0}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasOxlint(){return this.hasDependency("oxlint")}get hasOxfmt(){return this.hasDependency("oxfmt")}get hasPrettier(){return this.hasDependency("prettier")}get hasPoetryLock(){return e.existsSync(t.join(this.dirPath,"poetry.lock"))||e.existsSync(t.join(this.rootDirPath,"poetry.lock"))}get hasPubspecYaml(){return e.existsSync(t.join(this.dirPath,"pubspec.yaml"))||e.existsSync(t.join(this.rootDirPath,"pubspec.yaml"))}get preferredLinter(){if(this.hasOxlint)return"oxlint"}hasOwnDependency(e){return!!this.getOwnDependencyVersion(e)}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(ne(this.env.CI))return!1;try{const t=this.findFile("playwright.config.ts");return/\bwebServer\b/.test(e.readFileSync(t,"utf8"))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const o=t.join(r,"node_modules",".bin");if(e.existsSync(o)&&(this.env.PATH=`${o}:${this.env.PATH}`,n=!0),e.existsSync(t.join(r,".git")))break;const s=t.dirname(r);if(r===s)break;r=s}return n}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join("..","..",n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw new Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}hasDependency(e){return!!(this.getOwnDependencyVersion(e)??this.getDependencyVersion(this.rootPackageJson,e))}getOwnDependencyVersion(e){return this.getDependencyVersion(this.packageJson,e)}getDependencyVersion(e,t){if(e)return e.dependencies?.[t]??e.devDependencies?.[t]??e.optionalDependencies?.[t]??e.peerDependencies?.[t]}get rootPackageJson(){if(this.rootDirPath===this.dirPath)return this.packageJson;try{return JSON.parse(e.readFileSync(t.join(this.rootDirPath,"package.json"),"utf8"))}catch(e){return void console.error(`[wb] Failed to read or parse ${t.join(this.rootDirPath,"package.json")}`,e)}}}function se(n,r=!0,o){if(o??=process.cwd(),e.existsSync(t.join(o,"package.json")))return new oe(o,n,r)}async function ie(e,t=!0,n){const r=ae(e,t,n);if(r)return{...r,descendants:r.root===r.self?await ce(e,r.root,t):[r.self]}}function ae(n,r=!0,o){if(o??=process.cwd(),!e.existsSync(t.join(o,"package.json")))return;const s=new oe(o,n,r);let i=s;if(!s.packageJson.workspaces&&t.dirname(o).endsWith("/packages")){const s=t.resolve(o,"..","..");e.existsSync(t.join(s,"package.json"))&&(i=new oe(s,n,r))}return{root:i,self:s}}async function ce(n,r,o){const s=[r],i=r.packageJson.workspaces;if(!Array.isArray(i))return s;const a=[],c=[];for(const n of i.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):a.push(n);c.push(...await l(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&s.push(new oe(r,n,o));return s}const de=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),le=de?"bun --bun run":"node",ue=de?"bun":"yarn",pe=de?"bun --bun run":"yarn",fe={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(n){await async function(n,r){const s=se(n,!0,r);if(!s)return console.error(d.red("No project found.")),!0;const i=n.command??(s.packageJson.scripts?.build?de?"bun run build":"yarn build":void 0);if(!i)return console.info(d.green("Skip to build because no build command is defined.")),!1;if(n={...n,command:i},!e.existsSync(t.join(s.rootDirPath,".git")))return he(s,n),!0;const[a,l,u]=await async function(n,r){const s=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(s,"last-build");await e.promises.mkdir(s,{recursive:!0});const a=c("sha256"),d=o.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(d);const l=JSON.stringify(Object.entries(n.env).filter(([e])=>!me.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));a.update(l),await async function(e,t,n){return new Promise(r=>{const s=o.spawnSync("git",["status","--porcelain"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").filter(e=>e.length>0).map(e=>e.slice(2).trim()).map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(ge.some(t=>e.includes(t))||we.some(t=>e.endsWith(t)))&&!ye.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${s.join(", ")}`);const i=o.spawn("git",["diff","--",...s],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,a);const u=a.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(s,n);if(a)return console.info(d.green(`Skip to run '${n.command}' 💫`)),!1;if(!he(s,n))return;n.dryRun||await e.promises.writeFile(l,u,"utf8");return!0}(n)}};function he(e,t){if(console.info(d.green(`Run '${t.command}'`)),!t.dryRun){const n=o.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const me=new Set(["CI","PWDEBUG","TMPDIR"]);const ge=["src/","public/"],we=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],ye=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const be=new m,ve={exitIfFailed:!0};async function ke(e,t,n,r=ve){const o=Se(e,t);if(n.silent&&r.omitSilentStart&&!n.dryRun||Pe(o.printable,t,n.silent?"Command":"Start"),n.verbose&&Pe(o.runnable,t,"Start (raw)",!0),n.dryRun)return Ae(o.printable,0,r,{silentSuccess:n.silent}),0;const s=Boolean(n.silent&&(r.processSilentOutput??r.printSilentOutputOnFailureOnly));let i=!1;const a=n.silent&&r.silentProgressIntervalMs?setInterval(()=>{process.stdout.write("."),i=!0},r.silentProgressIntervalMs):void 0,c=await I(o.runnable,void 0,{cwd:t.dirPath,env:xe(t.env,{...r,preserveColor:r.preserveColor??(!!n.silent||void 0)}),shell:!0,stdio:n.silent?"pipe":"inherit",timeout:r.timeout,mergeOutAndError:s,killOnExit:!0,printingStdout:n.silent&&!s,printingStderr:n.silent&&!s,omitBlankLinesWhilePrinting:n.silent,verbose:n.verbose}).finally(()=>{a&&clearInterval(a)}),l=c.status??1;if(i&&process.stdout.write("\n"),s&&(!r.printSilentOutputOnFailureOnly||0!==l)){const e=(r.processSilentOutput?r.processSilentOutput(c.stdout):c.stdout).trim();e&&(process.stdout.write(e),process.stdout.write("\n"))}return n.silent&&0===l&&r.silentSuccessMessage&&console.info(d.green(r.silentSuccessMessage)),r.onSignal?.(c.signal),Ae(o.printable,l,r,{silentSuccess:n.silent}),l}function Ee(e,t,n,r=ve){return be.runAndWaitForReturnValue(async()=>{const o=Se(e,t);if(Pe(o.printable,t,"Start (parallel)",!0),n.dryRun)return Pe(o.printable,t,"Started (log)"),n.verbose&&Pe(o.runnable,t,"Started (raw)",!0),Ae(o.printable,0,r),0;const s=await I(o.runnable,void 0,{cwd:t.dirPath,env:xe(t.env,{...r,preserveColor:r.preserveColor??!0}),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});r.onSignal?.(s.signal),Pe(o.printable,t,"Started (log)"),n.verbose&&Pe(o.runnable,t,"Started (raw)",!0);const i=s.stdout.trim();return i&&!r.printRawOutput&&(process.stdout.write(i),process.stdout.write("\n")),Ae(o.printable,s.status,r),s.status??1})}function Se(e,t){const n=t.usesBunPackageManager?"bun --bun run":"yarn";let r=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll(/PRISMA generate(?!\s+--no-hints)(?=\s|$)/gu,t.packageJson.dependencies?.blitz?"PRISMA generate":"PRISMA generate --no-hints").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN run ",t.usesBunPackageManager?`${n} `:"YARN run ").replaceAll("BUN ",t.usesBunPackageManager?`${n} `:"YARN ").replaceAll("YARN run ",t.usesBunPackageManager?`${n} `:"yarn run ");t.usesBunPackageManager&&(r=r.replaceAll("YARN build-ts run","bun --bun run").replaceAll("bun --bun run bun --bun run","bun --bun run").replaceAll("dist/index.js","src/index.ts")),r=r.trim();const o=$e(r.replaceAll("YARN ",`${n} `)),s=$e(r.replaceAll("YARN playwright ",`${n} playwright `).replaceAll("YARN ",!t.usesBunPackageManager&&t.binExists?"":`${n} `));return{printable:`${n} dotenv${t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:""} -- ${o}`,runnable:s}}function Pe(e,t,n="Start",r=!1){console.info("\n"+(r?d.gray:d.cyan)(d.bold(`${n}:`),e)+d.gray(` at ${t.dirPath}`))}function Ae(e,t,n,r={}){if(0===t){if(r.silentSuccess)return;console.info(d.green(d.bold("Finished:"),e))}else console.info(d.red(d.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1)}function xe(e,t){const n={...e};return t.ci&&(n.CI="1"),function(e,t){void 0!==e.NO_COLOR||!1===t?delete e.FORCE_COLOR:t&&process.stdout.isTTY&&(e.FORCE_COLOR||="3")}(n,t.preserveColor),n}function $e(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const je={...S,"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}};function Re(e){const t=[];for(const n of Object.keys(S)){const r=Oe(e,n);if(void 0!==r)if("boolean"!=typeof r)if("string"!=typeof r&&"number"!=typeof r){if(Array.isArray(r))for(const e of r)t.push(`--${n}=${e}`)}else t.push(`--${n}=${r}`);else t.push(r?`--${n}`:`--${n}=false`)}return!0===e.silent&&void 0===Oe(e,"quiet-env")&&t.push("--quiet-env"),t}function Oe(e,t){const n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const De={command:"concurrently <commands...>",describe:"Run commands concurrently",builder:{...je,"kill-others":{description:"Kill other commands when one command exits",type:"boolean"},"kill-others-on-fail":{description:"Kill other commands when one command fails",type:"boolean"},success:{description:"Define successful completion criteria",type:"string",choices:["all","first"],default:"all"},commands:{description:"Commands to run concurrently",type:"array"}},async handler(e){"win32"===process.platform&&(console.error(d.red("This command is not supported on Windows.")),process.exit(1));const t=se(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=(e.commands??[]).map(String).filter(Boolean);0===n.length&&(console.error(d.red("No commands provided.")),process.exit(1));try{const r=await async function(e){const t=e.commands.map(t=>o.spawn(Se(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:xe(e.project.env,{ci:e.ci}),shell:!0,stdio:"inherit"}));let n,r,s,i=!1;const a=[],c=Array.from({length:t.length}),d=t.map((n,o)=>new Promise(d=>{let l=!1;const u=n=>{l||(l=!0,c[o]=n,r??=n,!i&&function(e,t){return"first"===t.success||t.killOthers||t.killOthersOnFail&&0!==e}(n,e)&&(s=n,i=!0,a.push(Ie(t,"SIGTERM"))),d())};n.once("error",e=>{console.error("Failed to start child process:",e),u(1)}),n.once("exit",(e,t)=>{u(Ne(e??void 0,t??void 0))})})),l=e=>{n??=e,i||(i=!0,a.push(Ie(t,e)))},u=()=>{l("SIGINT")},p=()=>{l("SIGTERM")},f=()=>{l("SIGQUIT")};process.on("SIGINT",u),process.on("SIGTERM",p),process.on("SIGQUIT",f);try{await Promise.all(d),await Promise.all(a)}finally{process.removeListener("SIGINT",u),process.removeListener("SIGTERM",p),process.removeListener("SIGQUIT",f)}if(n)return Ne(void 0,n);if("first"===e.success)return r??1;if(void 0!==s)return s;for(const e of c)if(void 0!==e&&0!==e)return e;return 0}({commands:n,project:t,killOthers:e.killOthers??!1,killOthersOnFail:e.killOthersOnFail??!1,success:e.success,ci:"boolean"==typeof e.ci?e.ci:void 0});process.exit(r)}catch(e){console.error(d.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function Ne(e,t){return void 0!==e?e:t&&t in h.signals?128+h.signals[t]:1}async function Ie(e,t){const n=Te(function(e){return e.flatMap(e=>void 0===e.pid?[]:[e.pid])}(e),t);0!==n.length&&await async function(e){const t=Date.now()+5e3;for(;Date.now()<t;){if(e.every(_e))return!1;await Ce(Math.min(100,t-Date.now()))}return!0}(n)&&Te(n,"SIGKILL")}function Te(e,t){const n=[];for(const r of e)try{if(!Be(r,t))continue;n.push(r),j(r,t)}catch(e){console.warn("Failed to kill child process:",e)}return n}function _e(e){try{return process.kill(-e,0),!1}catch(e){return!!Fe(e)}}async function Ce(e){await new Promise(t=>setTimeout(t,e))}function Be(e,t){try{return process.kill(-e,t),!0}catch(e){if(Fe(e))return!1;throw e}}function Fe(e){return"object"==typeof e&&null!==e&&"code"in e&&"ESRCH"===e.code}const ze="file:",Me="litestream.yml",Le="/etc/litestream.yml",We=[{schemaPath:t.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:t.join("prisma","schema"),dbPath:t.join("prisma","schema")},{schemaPath:t.join("db","schema.prisma"),dbPath:"db"}];function Ue(e){return e.packageJson.dependencies?.blitz?"db/mount":"prisma/mount"}function Je(n){return We.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}function Ye(n){const r=t.join(n.dirPath,Me);return e.existsSync(r)?`-config ./${Me}`:e.existsSync(Le)?`-config ${Le}`:`-config ./${Me}`}const Ve=new class{cleanUpLitestream(e){const t=Ue(e);var n;return`${`if [ -f "${n=`${t}/prod.sqlite3`}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${ze}${n}"; fi && rm -f "${n}".* "${n}"-*`}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}generate(e,t=""){return["PRISMA generate",t].filter(Boolean).join(" ")}deployForce(e){const t=Ue(e),n=`rm -Rf "${`${t}/prod.sqlite3`}"*`;return`${n}; PRISMA migrate reset --force --skip-seed && ${n}\n && litestream restore ${Ye(e)} -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e){const t=Ue(e);return`litestream ltx ${Ye(e)} ${t}/prod.sqlite3`}migrate(e,t=""){return`PRISMA migrate deploy ${t} && ${this.generate(e)} && ${this.seed(e)}`}migrateDev(e,t=""){return`PRISMA migrate dev ${t}`}reset(e,n=""){const r=[],o=function(e){const n=e.env.DATABASE_URL;if(!n?.startsWith(ze))return;const r=n.slice(5).replace(/[?#].*$/,"");if(!r)return;const o=Je(e),s=t.isAbsolute(r)?r:t.resolve(e.dirPath,o??".",r);return`rm -f "${s}" "${s}-wal" "${s}-shm"`}(e);o&&r.push(o);const s=["PRISMA migrate reset --force",n].filter(Boolean).join(" ");return r.push(s),e.packageJson.dependencies?.blitz&&r.push(this.seed(e)),r.filter(Boolean).join(" && ")}restore(e,t){const n=Ue(e);return`rm -Rf ${t}*; litestream restore ${Ye(e)} -o ${t} ${n}/prod.sqlite3`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(e,n,r=""){let o="";if(n)try{new URL(n),o=`DATABASE_URL=${n} `}catch{const e=t.resolve(n);o=`DATABASE_URL=${ze}${e} `}else if(e.env.DATABASE_URL?.startsWith(ze)){const n=Je(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));o=`DATABASE_URL=${ze}${r} `}}return`${o}PRISMA studio ${r}`}},Ge={command:"gen-code",describe:"Generate code for the current project",builder:{},async handler(e){const t=await ie(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=t.descendants.map(e=>({project:e,scripts:qe(e)})).filter(({scripts:e})=>e.length>0);if(0!==n.length)for(const{project:t,scripts:r}of n){console.info(`Running "gen-code" for ${t.name} ...`);for(const n of r)await ke(n,t,e)}else console.info(d.green("No code generation needed."))}};function qe(e){const t=[];e.hasOwnDependency("blitz")?(t.push("YARN blitz codegen"),e.hasPrisma&&t.push(Ve.generate(e))):e.hasPrisma&&t.push(Ve.generate(e));const n=function(e){if(!e.hasOwnDependency("@chakra-ui/cli"))return;if(2===function(e,t){const n=e.packageJson,r=n.dependencies?.[t]??n.devDependencies?.[t]??n.optionalDependencies?.[t]??n.peerDependencies?.[t],o=r?.match(/\d+/u)?.[0];return void 0===o?void 0:Number(o)}(e,"@chakra-ui/cli"))return"YARN chakra-cli tokens src/core/theme.ts";if(Ke(e,"src/theme.ts"))return"YARN chakra typegen src/theme.ts --strict";return}(e);n&&t.push(n);const r=0===t.length&&e.hasDrizzle?function(e){return["drizzle.config.ts","drizzle.config.mts","drizzle.config.js","drizzle.config.mjs"].find(t=>Ke(e,t))}(e):void 0;return r&&t.push(`YARN drizzle-kit check --config ${r} || true`),t}function Ke(n,r){return e.existsSync(t.join(n.dirPath,r))}const He={command:"kill-port-if-non-ci",describe:"Kill the port specified by PORT environment variable if non-CI.",builder:{},async handler(e){await async function(e){const t=se(e);t||(console.error(d.red("No project found.")),process.exit(1));if(ne(t.env.CI))return void console.info(`Skip killing port due to CI: ${t.env.CI}`);const n=t.env.PORT,r=Number(n);(!Number.isInteger(r)||r<=0)&&(console.error(d.red(`PORT environment variable is invalid: ${n}`)),process.exit(1));console.info(`Killing the port: ${r}`);try{await g(r)}catch{}}(e)}};function Qe(e,t){if(!function(e,t){return 0!==e||function(e){return/\bwarn(?:ing)?s?\b/i.test(e.replaceAll(/\b(?:0|no) warnings?\b/gi,""))}(t)}(e,t))return;const n=function(e){return e.trim()}(t);n&&(process.stdout.write(n),process.stdout.write("\n"))}function Ze(e){return e.map(e=>Xe(e)).join(" ")}function Xe(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll("'","'\"'\"'")}'`}const et=new Set(["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"]),tt=new Set(["py"]),nt=new Set(["dart"]),rt=new Set([...et,"css","gql","graphql","hbs","htm","html","json","json5","jsonc","less","md","mdx","scss","toml","yaml","yml"]),ot=new Set(["cjs","css","cts","htm","html","java","js","json","json5","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),st=new Set([...ot].filter(e=>!rt.has(e))),it="!**/test{-,/}fixtures/**",at={command:"lint [files...]",describe:"Lint code",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"},quiet:{description:"Report errors only",type:"boolean"},silent:{description:"Print only failed or warning command output",type:"boolean"}},async handler(e){const t=await ct(e);t&&process.exit(t)}};async function ct(e){if("win32"===process.platform)return console.error(d.red("This command is not supported on Windows.")),1;const n=await ie(e,!1);if(!n)return console.error(d.red("No project found.")),1;const r=function(e){const t=new Set;for(const n of[...e.files??[],...e._.slice(1),...e["--"]??[]])t.add(String(n));return[...t]}(e),o=new Map,s=new Map,i=new Map,a=new Map,c=[],l=[];let u,p,f=!1;if(r.length>0){const h=await Promise.all(r.map(async e=>{const n=t.resolve(e),r=await async function(e){try{if((await w.stat(e)).isDirectory())return"directory"}catch{}return"other"}(n);return{fileKind:r,filePath:n}}));for(const{fileKind:r,filePath:u}of h){if(u.endsWith("/test/fixtures")||u.includes("/test/fixtures/")||u.endsWith("/test-fixtures")||u.includes("/test-fixtures/"))continue;const p=t.extname(u).slice(1);if(u.endsWith("/package.json"))l.push(u);else{l.push(...Et(n.descendants,u,r));for(const{lintPath:t,project:l}of St(n.descendants,u,r)){if(l.hasPoetryLock&&("directory"===r||tt.has(p))){const e=i.get(l)??[];if(e.push(t),i.set(l,e),"directory"!==r)continue}if(l.hasPubspecYaml&&("directory"===r||nt.has(p))){const e=a.get(l)??[];if(e.push(t),a.set(l,e),"directory"!==r)continue}if("directory"===r||At(l,p)){const n=o.get(l)??[];if(n.push(t),o.set(l,n),e.format)if("directory"===r&&l.hasOxfmt){const e=s.get(l)??[];e.push(t),s.set(l,e),c.push(kt(t),it)}else for(const e of vt(l,t,r,p))if(l.hasOxfmt){const t=s.get(l)??[];t.push(e),s.set(l,t)}else c.push(e)}else if(e.format&&(ot.has(p)||rt.has(p)))if(l.hasOxfmt&&rt.has(p)){const e=s.get(l)??[];e.push(t),s.set(l,e)}else ot.has(p)&&c.push(t);else Pt(p)&&!l.preferredLinter&&(console.error(d.red(`No linter found for ${l.name}. Install Oxlint.`)),f=!0)}}}u=[...new Set(c)],p=[...new Set(l)]}else u=function(e,n){const r=new Set([`**/{.*/,}*.{${[...st].join(",")}}`,it]);for(const o of n){if(!xt(o))continue;const n=t.join(o.dirPath,"**/{.*/,}*.{"+[...ot].join(",")+"}");r.add(t.relative(e,n)||n)}return[...r]}(n.self.dirPath,n.descendants),p=n.descendants.map(e=>e.packageJsonPath);const h=[],m=[],g={exitIfFailed:!1,preserveColor:!e.printAllOutput},y=Boolean(e.format),b=!e.format||e.fix;if(r.length>0){if(b)for(const[t,n]of o){const r=ht(t,e,n);r&&m.push({command:r,project:t})}for(const[t,n]of i)b&&m.push({command:wt(e,n),project:t}),y&&h.push({command:gt(n),project:t});for(const[e,t]of a)b&&m.push({command:bt(t),project:e}),y&&h.push({command:yt(t),project:e});if(y)for(const[e,t]of s)h.push({command:mt(t),project:e})}else for(const t of n.descendants){if(b){if(!t.packageJson.workspaces||t.hasSourceCode){const n=ht(t,e);n&&m.push({command:n,project:t})}t.hasPoetryLock&&m.push({command:wt(e),project:t}),t.hasPubspecYaml&&m.push({command:bt(),project:t})}y&&(t.hasOxfmt&&h.push({command:mt(),project:t}),t.hasPoetryLock&&h.push({command:gt(),project:t}),t.hasPubspecYaml&&h.push({command:yt(),project:t}))}const v=[];if(y){const t=await dt(h,e,g);if(ut(t,e),v.push(...t.map(e=>e.exitCode)),v.some(e=>0!==e))return 1}if(f)return 1;if(y){if(u.length>0&&n.self.hasPrettier){const t=await lt(Ze(["YARN","prettier","--cache","--no-error-on-unmatched-pattern","--write","--",...u]),n.self,e,g);ut([t],e),v.push(t.exitCode)}if(p.length>0){const t=await lt(Ze(["YARN","sort-package-json","--",...p]),n.self,e,g);ut([t],e),v.push(t.exitCode)}if(v.some(e=>0!==e))return 1}if(b){const t=await dt(m,e,g);ut(t,e),v.push(...t.map(e=>e.exitCode))}return v.some(e=>0!==e)?1:0}function dt(e,t,n){return Promise.all(e.map(({command:e,project:r})=>lt(e,r,t,n)))}function lt(e,t,n,r){if(n.silent){const o=Se(e,t);return function(e,t,n,r=ve){return be.runAndWaitForReturnValue(async()=>{const o=Se(e,t);if(n.dryRun)return{exitCode:0,output:""};const s=await I(o.runnable,void 0,{cwd:t.dirPath,env:xe(t.env,{...r,preserveColor:r.preserveColor??!0}),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});return r.onSignal?.(s.signal),{exitCode:s.status??1,output:s.stdout}})}(e,t,n,r).then(e=>({...e,command:o.printable,cwd:t.dirPath}))}return Ee(e,t,n,r).then(e=>({exitCode:e}))}function ut(e,t){const n=t.silent&&!t.printAllOutput?e.filter(e=>0!==e.exitCode):e;if(0!==n.length)for(const e of n)"output"in e&&(t.printAllOutput?pt(e):(t.silent&&ft(e.command,e.cwd),Qe(e.exitCode,e.output)))}function pt(e){if(ft(e.command,e.cwd),0===e.exitCode&&((t=e.command).includes(" oxfmt ")||t.includes(" sort-package-json ")))return void console.info(d.green("Succeeded."));var t;const n=e.output.trim();n&&(process.stdout.write(n),process.stdout.write("\n"))}function ft(e,t){console.info("\n"+d.cyan(d.bold("Command:"),e)+d.gray(` at ${t}`))}function ht(e,t,n){if("oxlint"===e.preferredLinter)return Ze(["YARN","oxlint","--no-error-on-unmatched-pattern",...t.quiet?["--quiet"]:[],...t.fix?["--fix"]:[],...n??["."]])}function mt(e){return Ze(["YARN","oxfmt","--write","--no-error-on-unmatched-pattern",...e??["."],"!**/package.json"])}function gt(e){const t=e&&e.length>0?e:["."];return[Ze(["poetry","run","isort","--profile","black","--filter-files",...t]),Ze(["poetry","run","black",...t])].join(" && ")}function wt(e,t){const n=t&&t.length>0?t:["."];return Ze(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])}function yt(e){return Ze(["dart","format",...e&&e.length>0?e:["."]])}function bt(e){return Ze(["dart","analyze",...e&&e.length>0?e:["."]])}function vt(e,t,n,r){return"directory"===n&&e.hasOxfmt?[t]:"directory"===n&&xt(e)?[t,it]:function(e,t){return e.hasOxfmt?rt.has(t):!!xt(e)||st.has(t)}(e,r)?[t]:[]}function kt(e){return t.join(e,`**/{.*/,}*.{${[...st].join(",")}}`)}function Et(e,n,r){return"directory"!==r?[]:e.filter(e=>e.packageJsonPath===t.join(n,"package.json")||e.packageJsonPath.startsWith(`${n}/`)).map(e=>e.packageJsonPath)}function St(e,t,n){if("directory"===n){const n=e.filter(e=>e.dirPath===t||e.dirPath.startsWith(`${t}/`));if(n.length>0)return n.map(e=>({lintPath:e.dirPath,project:e}))}const r=function(e,t){let n;for(const r of e)t!==r.dirPath&&!t.startsWith(`${r.dirPath}/`)||n&&!(r.dirPath.length>n.dirPath.length)||(n=r);return n}(e,t);return r?[{lintPath:t,project:r}]:[]}function Pt(e){return et.has(e)||tt.has(e)||nt.has(e)}function At(e,t){return"oxlint"===e.preferredLinter&&et.has(t)}function xt(e){return!e.hasOxfmt&&"oxlint"===e.preferredLinter}const $t=new Set;async function jt(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await I("docker",["ps","-q",...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}(e,t);if(0===n.length)return;await I("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await g(e)}catch{}}async function Rt(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await async function(e,t){await Ot(e)||await jt(e,t);const n=async()=>{$t.has(e)||($t.add(e),await jt(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(n,t),n}async function Ot(e){for(const t of["127.0.0.1","::"]){if(!await Dt(t,e))return!1}return!0}async function Dt(e,t){return new Promise(n=>{const r=v();r.once("error",e=>{"EADDRINUSE"!==e.code?"EAFNOSUPPORT"!==e.code?n(!1):n(!0):n(!1)}),r.once("listening",()=>{r.close(()=>{n(!0)})}),r.listen(t,e)})}const Nt={};function It(e,t){return String.raw`
10
10
  import fs from 'node:fs';
11
11
  import http from 'node:http';
12
12
 
@@ -32,5 +32,5 @@ server.on('error', () => {
32
32
  server.listen(${e}, '0.0.0.0', () => {
33
33
  fs.writeFileSync(pidPath, String(process.pid) + '\n');
34
34
  });
35
- `}const Tt={command:"maintenance <action>",describe:"Start or stop a lightweight maintenance page server. Example: wb maintenance start",builder:e=>e.positional("action",{choices:["start","stop"],describe:"Maintenance server action",type:"string"}).options(Nt),async handler(n){const r=se(n);r||(console.error(d.red("No project found.")),process.exit(1));const s=n.action;if("test"===r.env.WB_ENV)return void console.info(`Skip maintenance ${s} because WB_ENV is test.`);const i=function(e){const t=Number(e);return y.ok(Number.isInteger(t)&&t>0,`PORT environment variable is invalid: ${e}`),t}(r.env.PORT);if("start"!==s){if("stop"!==s)throw new Error(`Unknown maintenance action: ${s}`);!function(e,t){const n=_t(e,t),r=Ct(n);if(void 0===r)return void console.info(`Maintenance server is not running on port ${t}.`);try{process.kill(r,"SIGTERM")}catch{}Ft(n),console.info(`Stopped maintenance server on port ${t}.`)}(r,i)}else await async function(n,r){const s=_t(n,r),i=Ct(s);if(void 0!==i&&Bt(i))return void console.info(`Maintenance server is already running on port ${r}.`);Ft(s),await Ot(r)||(console.error(d.red(`Port ${r} is already in use.`)),process.exit(1));e.mkdirSync(t.dirname(s),{recursive:!0});const a=o.spawn(process.execPath,["--input-type=module","--eval",It(r,s)],{detached:!0,env:n.env,stdio:"ignore"});if(void 0===a.pid)throw new Error("Failed to start maintenance server.");a.unref(),await async function(e,t){const n=Date.now()+5e3;for(;Date.now()<n;){if(void 0!==Ct(e))return;if(!Bt(t))break;await b(50)}throw Ft(e),new Error("Failed to start maintenance server.")}(s,a.pid),console.info(`Started maintenance server on port ${r}.`)}(r,i)}};function _t(e,n){return t.join(e.rootDirPath,".tmp",`wb-maintenance-server-${n}.pid`)}function Ct(t){try{const n=Number(e.readFileSync(t,"utf8").trim());return Number.isInteger(n)&&n>0?n:void 0}catch{return}}function Bt(e){try{return process.kill(e,0),!0}catch{return!1}}function Ft(t){try{e.rmSync(t,{force:!0})}catch{}}function*zt(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const Mt=["@willbooster/wb","build-ts"],Lt={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){const r=await ie(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const o of zt("optimizeForDockerBuild",r.descendants)){const r=o.packageJson,s=["dependencies","devDependencies"];for(const e of s){const t=r[e]??{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(Ut(n,r),Jt(r),Yt(r),n.dryRun)continue;const i=n.outside?t.join(o.dirPath,"dist"):o.dirPath;await e.promises.mkdir(i,{recursive:!0}),await e.promises.writeFile(t.join(i,"package.json"),JSON.stringify(r),"utf8"),n.outside&&await Wt(t.join(i,"bash"))}n.dryRun||n.outside||(o.spawnSync(ue,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};async function Wt(n){const r=function(){let n=t.dirname(k(import.meta.url));for(;;){const r=t.join(n,"docker","bash");if(e.existsSync(r))return r;const o=t.dirname(n);if(o===n)throw new Error("Docker shell scripts directory not found.");n=o}}();await e.promises.mkdir(n,{recursive:!0});for(const o of await e.promises.readdir(r,{withFileTypes:!0})){if(!o.isFile()||!o.name.endsWith(".sh"))continue;const s=t.join(n,o.name);await e.promises.copyFile(t.join(r,o.name),s),await e.promises.chmod(s,493)}console.info(`Generated Docker shell scripts: ${t.relative(process.cwd(),n)||n}`)}function Ut(e,t){!function(e){const t=e.devDependencies??{},n=e.dependencies??{},r=[];for(const e of Mt){const o=t[e];o&&(n[e]||(n[e]=o,r.push(e)),delete t[e])}r.length>0&&(e.dependencies=n);console.info("Promoted runtime devDependencies:",r.join(", ")||"none")}(t),e.outside?function(e){const t=e.devDependencies??{},n=["artillery","concurrently","conventional-changelog-conventionalcommits","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],r=[];for(const e of Object.keys(t))(n.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete t[e],r.push(e));console.info("Removed devDependencies:",r.join(", ")||"none")}(t):(delete t.devDependencies,console.info("Removed all devDependencies."))}function Jt(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],r=e.scripts??{},o=[];for(const[e,s]of Object.entries(r))(t.some(t=>e.startsWith(t))||n.some(e=>s.includes(e)||s.trim()===e.trim()))&&(delete r[e],o.push(e));console.info("Removed scripts:",o.join(", ")||"none")}function Yt(e){delete e.private,delete e.publishConfig,delete e.prettier}const Vt="file:";const Gt=new class{reset(e,n=""){const r=function(e){const n=e.env.DATABASE_PATH??function(e){const t=e.env.DATABASE_URL;if(!t?.startsWith(Vt))return;const n=t.slice(5).replace(/[?#].*$/,"");if(!n)return;return n}(e);if(!n)return;const r=t.isAbsolute(n)?n:t.resolve(e.dirPath,n);return`rm -f "${r}" "${r}-wal" "${r}-shm"`}(e);return r?`${r} && ${this.migrate(e,n)}`:"echo 'wb db reset supports Drizzle only when DATABASE_PATH or file: DATABASE_URL is set.' && exit 1"}migrate(e,t=""){const n=this.seed(e),r=this.deploy(e,t);return"true"===n?r:`${r} && ${n}`}deploy(e,t=""){return`YARN drizzle-kit migrate ${t}`}generate(e,t=""){return`YARN drizzle-kit generate ${t}`}migrateDev(e,t=""){return this.generate(e,t)}seed(e,t){return t?`BUN build-ts run ${t}`:e.packageJson.scripts?.seed?"YARN run seed":"true"}studio(e,t,n=""){return t?"echo 'wb db studio for Drizzle does not support db-url-or-path.' && exit 1":`YARN drizzle-kit studio ${n}`}},qt={},Kt={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(Ht).command(Qt).command(Zt).command(Xt).command(en).command(tn).command(nn).command(sn).command(an).command(cn).command(dn).command(ln).command(un).demandCommand().strict(!1),handler(){}},Ht={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:qt,async handler(e){const t=await fn(e,"prisma");for(const{project:n}of mn("prisma cleanup-litestream",t))await ke(Ve.cleanUpLitestream(n),n,e)}},Qt={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:qt,async handler(e){const t=await fn(e,"prisma");for(const{project:e}of mn("prisma create-litestream-config",t))pn(e)}},Zt={command:"deploy",describe:"Apply migration to DB without initializing it",builder:qt,async handler(e){const t=await fn(e),n=gn(e);for(const{orm:r,project:o}of mn("db deploy",t))await ke(hn(r).deploy(o,n),o,e)}},Xt={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:qt,async handler(e){const t=await fn(e,"prisma");for(const{project:n}of mn("prisma deploy-force",t))await ke(Ve.deployForce(n),n,e)}},en={command:"generate",describe:"Generate ORM client code",builder:qt,async handler(e){const t=await fn(e),n=gn(e);for(const{orm:r,project:o}of mn("db generate",t))await ke(hn(r).generate(o,n),o,e)}},tn={command:"list-backups",describe:"List Litestream backups",builder:qt,async handler(e){const t=await fn(e,"prisma");for(const{project:n}of mn("prisma list-backups",t))await ke(Ve.listBackups(n),n,e)}},nn={command:"migrate",describe:"Apply migration to DB with initializing it",builder:{...qt,"check-idempotency":{description:"Run the migration command twice to confirm it is idempotent.",type:"boolean"}},async handler(e){const t=await fn(e),n=gn(e,["check-idempotency"]);for(const{orm:r,project:o}of mn("db migrate",t)){const t=hn(r);await ke(t.migrate(o,n),o,e),rn(o,e.checkIdempotency)&&(on(o)?console.info(d.yellow(`Skipping idempotency check for ${o.name} in production environment.`)):await ke(t.deploy(o,n),o,e))}}};function rn(e,t){return t??function(e){return!!e.env.WB_DOCKER&&"0"!==e.env.WB_DOCKER&&"false"!==e.env.WB_DOCKER}(e)}function on(e){return"production"===e.env.WB_ENV||"production"===e.env.MISE_ENV}const sn={command:"migrate-dev",describe:"Create a migration file",builder:qt,async handler(e){const t=await fn(e),n=gn(e);for(const{orm:r,project:o}of mn("db migrate-dev",t))await ke(hn(r).migrateDev(o,n),o,e)}},an={command:"reset",describe:"Reset DB",builder:qt,async handler(e){const t=await fn(e),n=gn(e);for(const{orm:r,project:o}of mn("db reset",t))await ke(hn(r).reset(o,n),o,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const{orm:t,project:r}of mn("WB_ENV=test db reset",await fn(e)))await ke(hn(t).reset(r,n),r,e)}}},cn={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...qt,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await fn(e,"prisma");for(const{project:n}of mn("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await ke(Ve.restore(n,t),n,e)}}},dn={command:"seed",describe:"Populate DB with seed data",builder:{...qt,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await fn(e);for(const{orm:n,project:r}of mn("db seed",t))await ke(hn(n).seed(r,e.file),r,e)}},ln={command:"studio [db-url-or-path]",describe:"Open database studio",builder:{...qt,"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 new Error("You cannot specify both --restored and --db-url-or-path.");const t=await fn(e),n=gn(e,["db-url-or-path","restored"]);for(const{orm:r,project:o}of mn("db studio",t)){const t=e.restored?o.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await ke(hn(r).studio(o,t,n),o,e)}}},un={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){const t=await fn(e),n=[(e.args?.join(" ")??"").trimEnd(),gn(e,["args"])].filter(Boolean).join(" ");for(const{orm:r,project:o}of mn(`db ${n}`,t)){const t="prisma"===r?`PRISMA ${n}`:`YARN drizzle-kit ${n}`;await ke(t,o,e)}}};function pn(t){const n=`${t.packageJson.dependencies?.blitz?"db":"prisma"}/mount/prod.sqlite3`,r={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(r).filter(([,e])=>!e).map(([e])=>e);if(o.length>0)throw new Error(`Missing environment variables for Litestream: ${o.join(", ")}`);const s="staging"===t.env.WB_ENV?"5m":"1h",i=`dbs:\n - path: ${n}\n busy-timeout: 5s\n checkpoint-interval: 1m\n replica:\n type: s3\n endpoint: https://${r.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID}.r2.cloudflarestorage.com\n bucket: ${r.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME}\n access-key-id: ${r.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID}\n secret-access-key: ${r.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY}\n snapshot-interval: 24h # Create a backup per day\n retention: 72h # Keep backups for 3 days\n retention-check-interval: ${s}\n sync-interval: 1m\n`,a="/etc/litestream.yml";try{e.writeFileSync(a,i),console.info(`Generated ${a}`)}catch(e){const t=e instanceof Error?e.message:String(e);throw new Error(`Failed to write ${a}: ${t}`,{cause:e})}}async function fn(e,t){const n=await ie(e);n||(console.error(d.red("No project found.")),process.exit(1));const r=n.descendants.map(e=>e.databaseOrm?{project:e,orm:e.databaseOrm}:void 0).filter(e=>!(!e||t&&e.orm!==t));return 0===r.length&&(console.error(d.red(t?`No ${t} project found.`:"No supported database ORM project found.")),process.exit(1)),r}function hn(e){return"prisma"===e?Ve:Gt}function*mn(e,t){const n=new Map(t.map(e=>[e.project,e]));for(const r of zt(e,t.map(({project:e})=>e))){const e=n.get(r);if(!e)throw new Error(`Failed to detect database ORM for ${r.name}.`);yield e}}function gn(e,t=[]){const n=[],r=Object.keys(je),o=Object.values(je).flatMap(e=>"alias"in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),s=new Set([...t,...r,...o,"--","_","$0"]);for(const[t,r]of Object.entries(e))if(!s.has(t)){const o=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(o!==t&&void 0!==e[o])continue;if("boolean"==typeof r&&r)n.push(`--${t}`);else if("string"==typeof r||"number"==typeof r)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(const e of r)n.push(`--${t}`,String(e))}const i=Array.isArray(e["--"])?e["--"].map(String):[];return Ze([...n,...i])}const wn={command:"retry [command] [args...]",describe:"Retry the given command until it succeeds",builder:{retry:{description:"A maximum retry count",type:"number",alias:"r",default:3}},async handler(e){const t=se(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let o=0;o<e.retry;o++)if(o>0&&console.info(`\n${d.yellow(`#${o} Retrying: ${n.join(" ")}`)}`),r=await ke(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},yn={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await ie(e,!1,t);n||(console.error(d.red("No project found.")),process.exit(1));for(const t of zt("setup",n.descendants)){const r=await w.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===f.platform()){const n=["pstree"];await Se(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await ke("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await Se("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await Se(`poetry env use ${n}`,t,e),await be.promiseAll(),await ke("poetry run pip install --upgrade pip",t,e),await ke("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await ke(`${pe} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await ke(`${pe} playwright install --with-deps`,r,e)}(e)}};function bn(e){return e.silent?" > /dev/null":""}const vn=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"",o=e.env.MISE_AGE_KEY?"\n --secret id=mise_age_key,env=MISE_AGE_KEY":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)\n --build-arg WB_ENV=${e.env.WB_ENV}\n --build-arg WB_VERSION=${n}${o} .`}stopAndStart(e,t="",n=""){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t="",n=""){!function(e,t){const n=()=>{if($t.has(e))return;$t.add(e),Pe(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});Ae(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e);return`docker run --rm ${n.includes("/bin/bash")?"-it ":""}${e.env.MISE_AGE_KEY?"--env MISE_AGE_KEY ":""}--publish ${e.env.PORT}:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class kn{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return vn.buildImage(e,t)}async startDev(e,t){return await Rt(e.env.PORT,e),this.shouldWaitAndOpenApp?Ze(["YARN","wb","concurrently",...Re(t),"--kill-others-on-fail",this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await Rt(e.env.PORT,e),this.shouldWaitAndOpenApp?Ze(["YARN","wb","concurrently",...Re(t),"--kill-others-on-fail",this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await Rt(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await Rt(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && ${Ze(["YARN","wb","concurrently",...Re(t),"--kill-others-on-fail",vn.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??""),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,"development")}\n && ${vn.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProductionProtected(e,t){const n=function(e){try{return e.findFile("scripts/start-production.sh")}catch{return}}(e);if(n)return this.buildProductionCommand(e,t,[e.buildCommand,`${Ze(["bash",n])} ${t.normalizedArgsText??""}`.trim()]);const r=function(e){try{return e.findFile("ecosystem.config.cjs")}catch{return}}(e),o=r?[e.buildCommand,`pm2-runtime start --no-autorestart ${r}`]:this.buildDefaultProductionStartCommands(e,t);return this.buildProductionCommand(e,t,o)}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`${e.isBunAvailable?"bun":"node"} dist/index.js ${t.normalizedArgsText??""}`.trim()]}buildProductionCommand(e,t,n){return[...[...e.hasPrisma?[Ve.migrate(e)]:[],...e.hasDrizzle?[Gt.migrate(e)]:[]].flatMap(e=>e.split("&&")),...n].filter(Boolean).map(e=>`${e} ${bn(t)}`.trim()).join(" && ")}testE2EDev(e,t,n){return this.testE2EProtected(e,t,this.startDevProtected(e,t),n)}testE2EProduction(e,t,n){return this.testE2EProtected(e,t,this.startProductionProtected(e,t),n)}testE2EDocker(e,t,n){return this.testE2EProtected(e,t,vn.stopAndStart(e),n)}async testStart(e,t){return await Rt(e.env.PORT,e),`${n="NODE_ENV",r="",`${n}=${Xe(r)}`} ${Ze(["YARN","wb","concurrently",...Re(t),"--kill-others","--success","first",this.startDevProtected(e,t),this.waitApp(e)])}`;var n,r}async testE2EProtected(e,t,n,{forwardedPlaywrightArgs:r=[],playwrightArgs:o=["test","test/e2e/"]}){const s=await Rt(e.env.PORT,e),i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",a=function(e,t,n,r=[]){const o=["BUN","playwright"],s=t?.map(String);if("test"!==e[0]||!s?.length)return Sn([...o,...e,...r],n);const i=e.slice(1),a=En(i),c=0===a.length?i:i.filter((e,t)=>!a.includes(t));return Sn([...o,"test",...s,...c,...r],n)}(o,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${a}${i}`:Ze(["YARN","wb","concurrently",...Re(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s}\n && ${a}${i}`])}testUnit(e,t){const n=t.targets?.map(String);return e.hasVitest?Ze(["YARN","vitest","run",...n?.length?n:["test/unit/"],"--passWithNoTests","--allowOnly","--watch=false",...t.bail?["--bail=1"]:[]]):e.isBunAvailable?Ze(["bun","test",...n?.length?n:["test/unit/"],...t.bail?["--bail"]:[]]):'echo "No tests."'}waitApp(e){const t=e.env.PORT;return`wait-on -t 10000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){const t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}}function Sn(e,t){const n=e.indexOf("playwright"),r=-1!==n&&"test"===e[n+1];return t&&r?e.some(e=>"--max-failures"===e||e.startsWith("--max-failures="))?Ze(e):Ze([...e,"--max-failures=1"]):Ze(e)}function En(e){let t;const n=[];for(const[r,o]of e.entries()){if(t){if("required"===t||!o.startsWith("-")){t=void 0;continue}t=void 0}if("--"===o)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(o.startsWith("--")){if(o.includes("="))continue;Pn.has(o)?t="required":An.has(o)&&(t="optional")}else{if(o.startsWith("-")&&"-"!==o){const e=o.slice(0,2);2===o.length&&xn.has(e)&&(t="required");continue}n.push(r)}}return n}const Pn=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"]),An=new Set(["--only-changed","--update-snapshots","--update-source-method"]),xn=new Set(["-c","-g","-j"]);const $n=new class extends kn{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const jn=new class extends kn{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);const o=await Rt(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets?.map(String),a=i?.length?i:["test/e2e/"],c=this.testUnit(e,{...t,targets:a});return Ze(["YARN","wb","concurrently",...Re(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o} && ${c}${s}`])}};const Rn=new class extends kn{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`next start ${t.normalizedArgsText??""}`.trim()]}};const On=new class extends kn{constructor(){super(!1)}startDevProtected(e,t){throw new 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} && ${le} 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")} && ${vn.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`)}testE2EDev(){return Promise.resolve("echo 'do nothing.'")}testE2EProduction(){return Promise.resolve("echo 'do nothing.'")}testE2EDocker(){return Promise.resolve("echo 'do nothing.'")}testStart(){return Promise.resolve("echo 'do nothing.'")}};const Dn=new class extends kn{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const Nn=new class extends kn{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()}},In=["express","fastify","elysia","hono"],Tn={watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug | test",type:"string",alias:"m"}},_n={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(Tn),async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e["--"]??[]].map(e=>Xe(String(e))).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>Xe(String(e))).join(" ")}(e);const t=await ie(e);t||(console.error(d.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{};let o;if(t.blitz)o=$n;else if(t.next)o=Rn;else if(r["@remix-run/dev"])o=Dn;else if(r.vite)o=Nn;else if(In.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))o=jn;else{if(!t["build-ts"]&&!r["build-ts"])continue;o=On}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await ke(await o.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await ke(await o.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await ke(await o.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await ke(await o.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await o.startTest(n,e);await ke(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},Cn=new RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,"g"),Bn={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"}},Fn={array:!0,description:"Unit or E2E test target paths",type:"string"},zn={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(Bn).positional("targets",Fn),async handler(e){process.exit(await Mn(e))}};async function Mn(n,r={}){const o=await ie(n);if(!o)return console.error(d.red("No project found.")),1;const s=n.targets??[],i=n["--"]??[],{shouldRunE2e:a,shouldRunUnit:c}=function(e,t=[]){const n=e.some(e=>e.includes("/e2e")),r=e.some(e=>e.includes("/unit")),o=0===e.length&&0===t.length;return{shouldRunUnit:o||r,shouldRunE2e:o||n||t.length>0}}(s,i);for(const d of o.descendants){d.env.WB_ENV||="test";const o=d.packageJson.dependencies??{},l=d.packageJson.devDependencies??{};let u;u=o.blitz?$n:o.next?Rn:l["@remix-run/dev"]?Dn:l.vite?Nn:In.some(e=>o[e])&&!o["firebase-functions"]?jn:On,console.info(`Running "test" for ${d.name} ...`);const p=Ln(d);if(c&&!1!==p){const e=s.filter(e=>e.includes("/unit")),t=e.length>0?e:p.length>0?p:void 0,o={...n,targets:t},i=await Jn(u.testUnit(d,o),d,n,{exitIfFailed:r.exitIfFailed,timeout:n.unitTimeout});if(0!==i)return i}if(!a||!e.existsSync(t.join(d.dirPath,"test","e2e")))continue;const f=s.filter(e=>e.includes("/e2e")),h={...n,targets:f.length>0?f:void 0};switch(n.e2e){case"headless":{const e=await Un(await u.testE2EProduction(d,h,{playwrightArgs:Kn(f,i),forwardedPlaywrightArgs:i}),d,n,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;continue}case"headless-dev":{const e=await Un(await u.testE2EDev(d,h,{playwrightArgs:Kn(f,i),forwardedPlaywrightArgs:i}),d,n,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;continue}case"docker":{const e=await Wn(d,h,u,Kn(f,i),i,r);if(0!==e)return e;continue}case"docker-debug":{const e=await Wn(d,h,u,Kn(f,i,["--debug"]),i,r);if(0!==e)return e;continue}}if(o.blitz||o.next||l["@remix-run/dev"]||l.vite)switch(n.e2e){case"headed":{const e=await Un(await u.testE2EProduction(d,h,{playwrightArgs:Kn(f,i,["--headed"]),forwardedPlaywrightArgs:i}),d,n,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"headed-dev":{const e=await Un(await u.testE2EDev(d,h,{playwrightArgs:Kn(f,i,["--headed"]),forwardedPlaywrightArgs:i}),d,n,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"debug":{const e=await Un(await u.testE2EProduction(d,h,{playwrightArgs:Kn(f,i,["--debug"]),forwardedPlaywrightArgs:i}),d,n,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"generate":{const e=await Un(await u.testE2EProduction(d,h,{playwrightArgs:["codegen",`http://localhost:${d.env.PORT}`]}),d,n,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"trace":{const e=await Un("BUN playwright show-trace",d,n,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}}}return 0}function Ln(n){return e.existsSync(t.join(n.dirPath,"test","unit"))?[]:!(!n.hasVitest||!e.existsSync(t.join(n.dirPath,"test")))&&(e.existsSync(t.join(n.dirPath,"test","e2e"))?["test","--exclude","test/e2e/**"]:["test"])}async function Wn(e,t,n,r,o,s={}){e.env.WB_DOCKER||="1";const i=await ke(`${n.buildDocker(e,"test")}${bn(t)}`,e,t,{exitIfFailed:s.exitIfFailed});if(0!==i)return i;const a=await Un(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:o}),e,t,{exitIfFailed:!1}),c=await ke(vn.stop(e),e,t,{exitIfFailed:s.exitIfFailed});return 0!==a?a:c}function Un(e,t,n,r={}){return ke(e,t,n,{...r,processSilentOutput:Yn})}function Jn(e,t,n,r={}){return ke(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:"Unit tests passed."})}function Yn(e){const t=[],n=new Set,r=[];for(const o of function*(e){let t=0;for(;t<=e.length;){const n=e.indexOf("\n",t);if(-1===n)return void(yield e.slice(t));yield e.slice(t,n),t=n+1}}(e)){const e=Gn(o);n.has(e)||(t.some(t=>qn(t,e))||(Vn(t,n,e),r.push(o)))}return r.join("\n")}function Vn(e,t,n){if(e.push(n),t.add(n),e.length<=200)return;const r=e.shift();void 0!==r&&t.delete(r)}function Gn(e){return e.replaceAll(Cn,"").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 qn(e,t){const n=Math.max(e.length,t.length);return 0===n||!(Math.abs(e.length-t.length)>.05*n)&&S(e,t)/n<=.05}function Kn(e,t=[],n=[]){const r=En(t).length>0;return["test",...e.length>0||r?[]:["test/e2e/"],...n]}const Hn={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{silent:{description:"Reduce redundant outputs",type:"boolean"}},async handler(n){await async function(n){const r=await ie(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const o of r.descendants){o.env.CI||="1",o.env.WB_ENV||="test";const r=o.packageJson.dependencies??{},s=o.packageJson.devDependencies??{};let i;i=r.blitz?$n:r.next?Rn:s["@remix-run/dev"]?Dn:s.vite?Nn:In.some(e=>r[e])&&!r["firebase-functions"]?jn:On,console.info(`Running "test-on-ci" for ${o.name} ...`);const a=o.hasDockerfile;if(a&&await Se(vn.stopAll(),o,n),e.existsSync(t.join(o.dirPath,"test","unit"))&&await Se(i.testUnit(o,n).replaceAll(" --allowOnly",""),o,n),e.existsSync(t.join(o.dirPath,"test","e2e"))){await Se(await i.testStart(o,n),o,n),await be.promiseAll(),a&&(o.env.WB_DOCKER||="1",await ke(`${i.buildDocker(o,"test")}${bn(n)}`,o,n));const e=a?await i.testE2EDocker(o,n,{}):await i.testE2EProduction(o,n,{});process.exitCode=await ke(e.replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),a&&await ke(vn.stop(o),o,n)}}}(n)}};const Qn={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{const t=e.signal;if(!(t in h.signals))throw new Error(`Invalid signal: ${t}`);j(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},Zn={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){process.exit(await async function(n){const r=await ie(n,!1);if(!r)return console.error(d.red("No project found.")),1;let o=!1;const s=r.descendants.map(async s=>{const i=[];for(s.packageJson.workspaces&&!s.hasSourceCode||i.push(...function(e){if(e.hasOwnDependency("@typescript/native-preview"))return["BUN tsgo --noEmit"];if(e.hasOwnDependency("typescript"))return["BUN tsc --noEmit"];return[]}(s)),!s.packageJson.workspaces&&s.hasOwnDependency("pyright")&&i.push("YARN pyright");i.length>0;){const a=await Se(i.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,preserveColor:!0}),c=t.join(s.dirPath,".next");if(!a||!e.existsSync(c))return a;e.rmSync(c,{force:!0,recursive:!0}),console.info(d.yellow("Removed `.next` directory. We will re-try type checking.")),o=!0}}),i=await Promise.all(s);let a=0;for(const[e,t]of i.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(d.yellow('Please try "yarn gen-code" if you face unknown type errors.')),a=t}a||console.info(d.green(o?"-----\nNo type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.":"No type errors found."));return a}(n))}};const Xn={...Zn,command:"tc"},er={command:"verify",describe:"Verify project code",builder:{full:{type:"boolean",default:!1,describe:"Run tests after verifying project code"}},async handler(n){const r=ae(n,!1);r||(console.error(d.red("No project found.")),process.exit(1)),await(n.full?async function(n,r){const o=function(n){const r=Date.now(),o=t.join(n.dirPath,".wb");e.mkdirSync(o,{recursive:!0});const s=t.join(o,"verify-full.log"),i=e.openSync(s,"w"),a=process.stdout.write.bind(process.stdout),c=process.stderr.write.bind(process.stderr);let l=!1,u=!1;process.stdout.write=rr(process.stdout.fd,i),process.stderr.write=rr(process.stderr.fd,i),console.info(d.cyan(d.bold("Full log:"),s));const p=()=>{if(u)return;u=!0,process.stdout.write=a,process.stderr.write=c;const t=function(e){const t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;if(0===n)return`${r}s`;return`${n}m ${r}s`}(Date.now()-r),n=`${l?"Succeeded":"Failed"} in ${t}. Full log: ${s}\n`,o=l?d.green(n):d.red(n);a(o),e.writeSync(i,n),e.closeSync(i)};return process.once("exit",p),{fail:e=>{l=!1,e&&console.error(e)},finish:()=>{process.removeListener("exit",p),p()},succeed:()=>{l=!0}}}(n);try{await tr(n,r),await async function(e,t){const n={...t,_:["test"],e2e:"headless",silent:!0},r=await Mn(n,{exitIfFailed:!1});if(0===r)return;e.packageJson.scripts?.["db-reset"]||(console.info(d.red(d.bold(`Failed (exit code ${r}):`),"test")),process.exit(r));console.info(d.yellow('Tests failed. This project defines "db-reset", so wb will reset the database once and retry tests.')),await nr(`${ue} db-reset`,e,t,{printRawOutput:!0});const o=await Mn(n,{exitIfFailed:!1});0!==o&&(console.info(d.red(d.bold(`Failed (exit code ${o}):`),"test after db-reset retry")),process.exit(o));console.info(d.green("Tests passed after db-reset retry."))}(n,r),o.succeed()}catch(e){throw o.fail(e),e}finally{o.finish()}}(r.self,n):tr(r.self,n))}};async function tr(e,t){await nr(`${ue} install`,e,t),e.packageJson.scripts?.["gen-code"]&&await nr(`${ue} gen-code`,e,t),await async function(e,t,n={}){n.silent||console.info("\n"+d.cyan(d.bold("Start:"),e));const r=await t()??0;0===r||n.allowFailure?n.silent||console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${r}):`),e)),process.exit(r));return r}("cleanup",()=>ct({...t,_:["lint"],fix:!0,format:!0,printAllOutput:!0,quiet:!0,silent:!0}),{silent:!0})}async function nr(e,t,n,r={}){if(function(e,t){console.info("\n"+d.cyan(d.bold("Command:"),e)+d.gray(` at ${t}`))}(e,t.dirPath),n.dryRun)return 0;const o=await I(e,void 0,{cwd:t.dirPath,env:xe(t.env,{preserveColor:!1}),shell:!0,stdio:"pipe",mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose}),s=o.status??1;return r.printRawOutput||function(e,t,n){if(0===t&&(e===`${ue} install`||e===`${ue} gen-code`))return void console.info(d.green("Succeeded."));const r=n.trim();r&&(process.stdout.write(r),process.stdout.write("\n"))}(e,s,o.stdout),0===s||r.allowFailure||(console.info(d.red(d.bold(`Failed (exit code ${s}):`),e)),process.exit(s)),s}function rr(t,n){return(r,o,s)=>{const i="string"==typeof r?Buffer.from(r,"string"==typeof o?o:"utf8"):r;return e.writeSync(n,i),e.writeSync(t,i),"function"==typeof o&&o(),s?.(),!0}}await n(r(process.argv)).scriptName("wb").options(je).middleware(e=>{const n=e["working-dir"];if(n){const e=t.resolve(n);process.chdir(e)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)}).command(er).command(fe).command(De).command(Ge).command(He).command(at).command(Tt).command(Lt).command(Kt).command(wn).command(yn).command(_n).command(zn).command(Hn).command(Qn).command(Zn).command(Xn).demandCommand().strict().version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).help().argv;let or=!1;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{if(!or){or=!0;try{j(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
36
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvZ2VuQ29kZS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvdXRpbHMvb3V0cHV0LnRzIiwiLi4vc3JjL3V0aWxzL3NoZWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2xpbnQudHMiLCIuLi9zcmMvdXRpbHMvcHJvY2Vzcy50cyIsIi4uL3NyYy91dGlscy9wb3J0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL21haW50ZW5hbmNlLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmRVdGlscy50cyIsIi4uL3NyYy9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLnRzIiwiLi4vc3JjL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdE9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvdHJlZUtpbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ZlcmlmeUNvZGUudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52ID0ge1xuICBlbnY6IHtcbiAgICBkZXNjcmlwdGlvbjogJy5lbnYgZmlsZXMgdG8gYmUgbG9hZGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgJ2Nhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0Vudmlyb25tZW50IHRvIGxvYWQgY2FzY2FkaW5nIC5lbnYgZmlsZXMgKGUuZy4sIGAuZW52YCwgYC5lbnYuPGVudmlyb25tZW50PmAsIGAuZW52LmxvY2FsYCBhbmQgYC5lbnYuPGVudmlyb25tZW50Pi5sb2NhbGApLiBQcmVmZXJyZWQgb3ZlciBgY2FzY2FkZS1ub2RlLWVudmAgYW5kIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICAnY2FzY2FkZS1ub2RlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LiBQcmVmZXJyZWQgb3ZlciBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdhdXRvLWNhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PFdCX0VOViB8fCBOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdpbmNsdWRlLXJvb3QtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSAuZW52IGZpbGVzIGluIHJvb3QgZGlyZWN0b3J5IGlmIHRoZSBwcm9qZWN0IGlzIGluIGEgbW9ub3JlcG8gYW5kIC0tZW52IG9wdGlvbiBpcyBub3QgdXNlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnY2hlY2stZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ2hlY2sgd2hldGhlciB0aGUga2V5cyBvZiB0aGUgbG9hZGVkIC5lbnYgZmlsZXMgYXJlIHNhbWUgd2l0aCB0aGUgZ2l2ZW4gLmVudiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJy5lbnYuZXhhbXBsZScsXG4gIH0sXG4gICdxdWlldC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdXBwcmVzcyAuZW52IGZpbGUgbG9hZGluZyBpbmZvcm1hdGlvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52UGF0aHMsIGVudlZhck5hbWVzXVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgc3RyaW5nW11dW11dIHtcbiAgbGV0IGVudlBhdGhzID0gKGFyZ3YuZW52ID8/IFtdKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVzb2x2ZShjd2QsIGVudlBhdGgudG9TdHJpbmcoKSkpO1xuICBjb25zdCBjYXNjYWRlID1cbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudlxuICAgICAgPyBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBwcm9jZXNzLmVudi5XQl9FTlYgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gIGlmICh0eXBlb2YgY2FzY2FkZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoZW52UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihjd2QsICcuZW52JykpO1xuICAgICAgaWYgKGFyZ3YuaW5jbHVkZVJvb3RFbnYpIHtcbiAgICAgICAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCAnLi4nLCAnLi4nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4ocm9vdFBhdGgsICcuZW52JykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhzID0gZW52UGF0aHMuZmxhdE1hcCgoZW52UGF0aCkgPT5cbiAgICAgIGNhc2NhZGVcbiAgICAgICAgPyBbYCR7ZW52UGF0aH0uJHtjYXNjYWRlfS5sb2NhbGAsIGAke2VudlBhdGh9LmxvY2FsYCwgYCR7ZW52UGF0aH0uJHtjYXNjYWRlfWAsIGVudlBhdGhdXG4gICAgICAgIDogW2Ake2VudlBhdGh9LmxvY2FsYCwgZW52UGF0aF1cbiAgICApO1xuICB9XG4gIGVudlBhdGhzID0gZW52UGF0aHMuZmlsdGVyKChlbnZQYXRoKSA9PiBmcy5leGlzdHNTeW5jKGVudlBhdGgpKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVsYXRpdmUoY3dkLCBlbnZQYXRoKSk7XG4gIGNvbnN0IHNob3VsZFN1cHByZXNzT3V0cHV0ID0gc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oYFdCX0VOVjogJHtwcm9jZXNzLmVudi5XQl9FTlZ9LCBOT0RFX0VOVjogJHtwcm9jZXNzLmVudi5OT0RFX0VOVn1gKTtcbiAgICBjb25zb2xlLmluZm8oJ1JlYWRpbmcgZW52IGZpbGVzOicsIGVudlBhdGhzLmpvaW4oJywgJykpO1xuICB9XG5cbiAgY29uc3QgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzOiBbc3RyaW5nLCBzdHJpbmdbXV1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCkpKSkge1xuICAgICAgaWYgKCEoa2V5IGluIGVudlZhcnMpICYmICEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5wdXNoKFtlbnZQYXRoLCBrZXlzXSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQgJiYga2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtrZXlzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgfVxuICBpZiAoIWFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBgUmVhZCBlbnYgZmlsZXM6ICR7ZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLm1hcCgoW2VudlBhdGgsIGtleXNdKSA9PiAoa2V5cy5sZW5ndGggPiAwID8gYCR7ZW52UGF0aH0gKCR7a2V5cy5qb2luKCcsICcpfSlgIDogZW52UGF0aCkpLmpvaW4oJywgJykgfHwgJ25vdGhpbmcnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2V4cGFuZCh7IHBhcnNlZDogZW52VmFycywgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IGVudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lc107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3Qgb3V0cHV0T3B0aW9ucyA9IGFyZ3YgYXMgRW52UmVhZGVyT3B0aW9ucyAmIHsgcXVpZXRFbnY/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH07XG4gIHJldHVybiBvdXRwdXRPcHRpb25zLnF1aWV0RW52ID09PSB0cnVlIHx8IChvdXRwdXRPcHRpb25zLnF1aWV0RW52ICE9PSBmYWxzZSAmJiBvdXRwdXRPcHRpb25zLnNpbGVudCA9PT0gdHJ1ZSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcyBhbmQgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbGF0ZWQgdG8gbnBtIGFuZCB5YXJuIGZyb20gdGhlIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiB2b2lkIHtcbiAgLy8gUmVtb3ZlIG5wbSAmIHlhcm4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcHJvY2Vzcy5lbnZcbiAgaWYgKGVudlZhcnMuUEFUSCAmJiBlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnZWYXJzLlBBVEggPSBlbnZWYXJzLlBBVEgucmVwbGFjZShgJHtlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiBtYWNPU1xuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ByaXZhdGVcXC92YXJcXC9mb2xkZXJzXFwvW146XSs6L2csICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGluIExpbnV4XG4gICAgICAucmVwbGFjZUFsbCgvXFwvdmFyXFwvdG1wXFwvW146XSs6L2csICcnKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3RtcFxcL1teOl0rOi9nLCAnJyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICBjb25zdCB1cHBlcktleSA9IGtleS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ05QTV8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnWUFSTl8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnQkVSUllfJykgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnUFJPSkVDVF9DV0QnIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ0lOSVRfQ1dEJ1xuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc0Vycm5vRXhjZXB0aW9uKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgaXNFcnJub0V4Y2VwdGlvbiB9IGZyb20gJy4vZXJybm8uanMnO1xuaW1wb3J0IHsgYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwLCBjb2xsZWN0RGVzY2VuZGFudFBpZHMgYXMgY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCB9IGZyb20gJy4vcHJvY2Vzc1RyZWUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJlZUtpbGwocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgPSAnU0lHVEVSTScpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgfHwgcGlkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGlkOiAke3BpZH1gKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAga2lsbFRyZWVPbldpbmRvd3MocGlkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXNjZW5kYW50cyA9IGNvbGxlY3REZXNjZW5kYW50UGlkcyhwaWQpO1xuICBjb25zdCB0YXJnZXRQaWRzID0gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQsIGRlc2NlbmRhbnRzKTtcbiAgZm9yIChjb25zdCB0YXJnZXRQaWQgb2YgdGFyZ2V0UGlkcykge1xuICAgIGtpbGxJZk5lZWRlZCh0YXJnZXRQaWQsIHNpZ25hbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbElmTmVlZGVkKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgc2lnbmFsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxUcmVlT25XaW5kb3dzKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcnVuQ29tbWFuZCgndGFza2tpbGwnLCBbJy9QSUQnLCBTdHJpbmcocGlkKSwgJy9UJywgJy9GJ10sIHtcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IHJ1bkNvbW1hbmQoXG4gICAgJ3BzJyxcbiAgICBbJy1BbycsICdwaWQ9LHBwaWQ9J10sXG4gICAgLy8gS2VlcCBjb21tYW5kIGJvdW5kZWQgc28gd2F0Y2gtbW9kZSBraWxsIGxvb3BzIGNhbm5vdCBoYW5nIHRoaXMgcGF0aC5cbiAgICB7IG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsIHRpbWVvdXQ6IDIwMDAgfVxuICApO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHN0ZG91dCk7XG4gIHJldHVybiBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwKHJvb3RQaWQsIGNoaWxkcmVuQnlQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZDogbnVtYmVyLCBkZXNjZW5kYW50czogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSBkZXNjZW5kYW50cy50b1JldmVyc2VkKCk7XG4gIHRhcmdldFBpZHMucHVzaChwaWQpO1xuICByZXR1cm4gdGFyZ2V0UGlkcztcbn1cblxuZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IHsgdGltZW91dDogbnVtYmVyOyBtYXhCdWZmZXI6IG51bWJlciB9XG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoY29tbWFuZCwgWy4uLmFyZ3NdLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBvcHRpb25zPy5tYXhCdWZmZXIsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiAnJyB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHN0ZGVyciA9IGV4dHJhY3RTdGRlcnIoZXJyb3IpO1xuICAgIHRocm93IG5ldyBDb21tYW5kRXhlY3V0aW9uRXJyb3IoY29tbWFuZCwgYXJncywgc3RkZXJyLCB0b0V4aXRDb2RlKGVycm9yKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbW1hbmRFeGVjdXRpb25FcnJvcikge1xuICAgIHJldHVybiAvbm8gc3VjaCBwcm9jZXNzfG5vdCBmb3VuZHxub3QgcmVjb2duaXplZHx0aGVyZSBpcyBubyBydW5uaW5nIGluc3RhbmNlL2kudGVzdChlcnJvci5zdGRlcnIpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdG9FeGl0Q29kZShlcnJvcjogdW5rbm93bik6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXMnIGluIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzOiB1bmtub3duIH0pLnN0YXR1cztcbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGRlcnIoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCBlcnJvciA9PT0gbnVsbCB8fCAhKCdzdGRlcnInIGluIGVycm9yKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHN0ZGVyciA9IChlcnJvciBhcyBSZWNvcmQ8J3N0ZGVycicsIHVua25vd24+KS5zdGRlcnI7XG4gIGlmICh0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdGRlcnI7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdGRlcnIpKSB7XG4gICAgcmV0dXJuIHN0ZGVyci50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuY2xhc3MgQ29tbWFuZEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sIHN0ZGVycjogc3RyaW5nLCBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29tbWFuZEV4ZWN1dGlvbkVycm9yJztcbiAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHBzT3V0cHV0OiBzdHJpbmcpOiBNYXA8bnVtYmVyLCBudW1iZXJbXT4ge1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcHNPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IC9eXFxzKihcXGQrKVxccysoXFxkKylcXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkUGlkID0gTnVtYmVyKG1hdGNoZWRbMV0pO1xuICAgIGNvbnN0IHBhcmVudFBpZCA9IE51bWJlcihtYXRjaGVkWzJdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudFBpZCk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkUGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50UGlkLCBbY2hpbGRQaWRdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuQnlQYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyLCBjaGlsZHJlbkJ5UGFyZW50OiBNYXA8bnVtYmVyLCBudW1iZXJbXT4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGRlc2NlbmRhbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBxdWV1ZSA9IFsuLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocm9vdFBpZCkgPz8gW10pXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgcGlkID0gcXVldWVbaW5kZXhdIGFzIG51bWJlcjtcbiAgICBpbmRleCArPSAxO1xuICAgIGRlc2NlbmRhbnRzLnB1c2gocGlkKTtcbiAgICBxdWV1ZS5wdXNoKC4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChwaWQpID8/IFtdKSk7XG4gIH1cbiAgcmV0dXJuIGRlc2NlbmRhbnRzO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJy4vdHJlZUtpbGwuanMnO1xuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBiYXNlZCBvbiBTcGF3blN5bmNSZXR1cm5zIGJ1dCB3aXRob3V0IG91dHB1dCBhbmQgZXJyb3IgcHJvcGVydGllc1xuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jUmV0dXJucyA9IE9taXQ8U3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+LCAnb3V0cHV0JyB8ICdlcnJvcic+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGV4dGVuZGluZyB2YXJpb3VzIE5vZGUuanMgc3Bhd24gb3B0aW9ucyB3aXRoIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eVxuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jT3B0aW9ucyA9IChcbiAgfCBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW9cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zXG4pICYge1xuICAvKiogSW5wdXQgc3RyaW5nIHRvIHdyaXRlIHRvIHRoZSBzcGF3bmVkIHByb2Nlc3MncyBzdGRpbiAqL1xuICBpbnB1dD86IHN0cmluZztcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBvdXRwdXQgd2lsbCBiZSBtZXJnZWQgaW50byBzdGRvdXQgKi9cbiAgbWVyZ2VPdXRBbmRFcnJvcj86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCB0aGUgc3Bhd25lZCBwcm9jZXNzIHdpbGwgYmUga2lsbGVkIHdoZW4gdGhlIHBhcmVudCBwcm9jZXNzIGV4aXRzICovXG4gIGtpbGxPbkV4aXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgZW5hYmxlcyB2ZXJib3NlIGxvZ2dpbmcgb2YgcHJvY2VzcyBvcGVyYXRpb25zICovXG4gIHZlcmJvc2U/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3Rkb3V0IGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZG91dD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3RkZXJyPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGJsYW5rLW9ubHkgbGluZXMgYXJlIHNraXBwZWQgd2hpbGUgcHJpbnRpbmcgc3Rkb3V0L3N0ZGVyciBpbiByZWFsdGltZSAqL1xuICBvbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmc/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIGFzeW5jaHJvbm91c2x5IGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0c1xuICpcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBQcm9taXNlLWJhc2VkIHdyYXBwZXIgYXJvdW5kIE5vZGUuanMncyBzcGF3biBmdW5jdGlvbiB3aXRoIGFkZGl0aW9uYWwgZmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBlbmNvZGluZyBvZiBzdGRvdXQvc3RkZXJyIGFzIFVURi04XG4gKiAtIE9wdGlvbiB0byBtZXJnZSBzdGRlcnIgaW50byBzdGRvdXRcbiAqIC0gT3B0aW9uIHRvIGF1dG9tYXRpY2FsbHkga2lsbCB0aGUgcHJvY2VzcyBvbiBwYXJlbnQgZXhpdFxuICogLSBPcHRpb24gdG8gcHJvdmlkZSBpbnB1dCB2aWEgc3RkaW5cbiAqIC0gVmVyYm9zZSBsb2dnaW5nIGNhcGFiaWxpdHlcbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIHJ1blxuICogQHBhcmFtIGFyZ3MgLSBMaXN0IG9mIHN0cmluZyBhcmd1bWVudHNcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc3Bhd25lZCBwcm9jZXNzXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzIGluY2x1ZGluZyBwaWQsIHN0ZG91dCwgc3RkZXJyLCBzdGF0dXMsIGFuZCBzaWduYWxcbiAqIEB0aHJvd3MgV2lsbCByZWplY3QgdGhlIHByb21pc2UgaWYgdGhlIHByb2Nlc3MgZmFpbHMgdG8gc3Bhd24gb3IgZW5jb3VudGVycyBhbiBlcnJvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzcGF3bkFzeW5jKCdscycsIFsnLWxhJ10sIHsgdmVyYm9zZTogdHJ1ZSB9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5zdGRvdXQpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzcGF3bkFzeW5jKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M/OiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3Rkb3V0Py5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRlcnI/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcblxuICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgY29uc3Qgc3Rkb3V0UHJpbnRlciA9IGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihwcm9jZXNzLnN0ZG91dCwgb3B0aW9ucz8ub21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nKTtcbiAgICAgIGNvbnN0IHN0ZGVyclByaW50ZXIgPSBjcmVhdGVSZWFsdGltZVByaW50ZXIocHJvY2Vzcy5zdGRlcnIsIG9wdGlvbnM/Lm9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZyk7XG4gICAgICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRvdXQpIHtcbiAgICAgICAgICBzdGRvdXRQcmludGVyLndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/Lm1lcmdlT3V0QW5kRXJyb3IpIHtcbiAgICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGRlcnIgKz0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRlcnIpIHtcbiAgICAgICAgICBzdGRlcnJQcmludGVyLndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHN0b3BQcm9jZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc3RvcHBlZCB8fCAhcHJvYy5waWQpIHJldHVybjtcblxuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYHRyZWVLaWxsKCR7cHJvYy5waWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2MucGlkfSlgLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgY2xlYW51cFNpZ25hbHM6IE5vZGVKUy5TaWduYWxzW10gPVxuICAgICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gWydTSUdJTlQnLCAnU0lHVEVSTSddIDogWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ107XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBjb25zdCByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3QgW3NpZ25hbCwgaGFuZGxlcl0gb2Ygc2lnbmFsSGFuZGxlcnMpIHtcbiAgICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKHNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgc2lnbmFsSGFuZGxlcnMuY2xlYXIoKTtcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucz8ua2lsbE9uRXhpdCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBjbGVhbnVwU2lnbmFscykge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZVNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHN0b3BQcm9jZXNzKCk7XG4gICAgICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmxpc3RlbmVyQ291bnQoc2lnbmFsKSA9PT0gMCkge1xuICAgICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBoYW5kbGVTaWduYWwpO1xuICAgICAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCBoYW5kbGVTaWduYWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByb2Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHN0ZG91dFByaW50ZXIuZmx1c2goKTtcbiAgICAgICAgc3RkZXJyUHJpbnRlci5mbHVzaCgpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmlucHV0KSB7XG4gICAgICAgIHByb2Muc3RkaW4/LndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICBwcm9jLnN0ZGluPy5lbmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmNvbnN0IEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQID0gbmV3IFJlZ0V4cChgJHtTdHJpbmcuZnJvbUNvZGVQb2ludCgyNyl9XFxcXFtbMC0/XSpbIC0vXSpbQC1+XWAsICdnJyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihcbiAgc3RyZWFtOiBOb2RlSlMuV3JpdGVTdHJlYW0sXG4gIG9taXRCbGFua0xpbmVzID0gZmFsc2Vcbik6IHsgd3JpdGU6IChkYXRhOiBzdHJpbmcpID0+IHZvaWQ7IGZsdXNoOiAoKSA9PiB2b2lkIH0ge1xuICBpZiAoIW9taXRCbGFua0xpbmVzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyaXRlOiAoZGF0YSkgPT4gc3RyZWFtLndyaXRlKGRhdGEpLFxuICAgICAgZmx1c2g6ICgpID0+IHt9LFxuICAgIH07XG4gIH1cblxuICBsZXQgcGVuZGluZyA9ICcnO1xuICByZXR1cm4ge1xuICAgIHdyaXRlOiAoZGF0YSkgPT4ge1xuICAgICAgcGVuZGluZyArPSBkYXRhO1xuICAgICAgY29uc3QgbGluZXMgPSBwZW5kaW5nLnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgICBwZW5kaW5nID0gbGluZXMucG9wKCkgPz8gJyc7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgaWYgKCFpc0JsYW5rTGluZShsaW5lKSkge1xuICAgICAgICAgIHN0cmVhbS53cml0ZShgJHtsaW5lfVxcbmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBmbHVzaDogKCkgPT4ge1xuICAgICAgaWYgKCFpc0JsYW5rTGluZShwZW5kaW5nKSkge1xuICAgICAgICBzdHJlYW0ud3JpdGUocGVuZGluZyk7XG4gICAgICB9XG4gICAgICBwZW5kaW5nID0gJyc7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNCbGFua0xpbmUobGluZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBsaW5lLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKS50cmltKCkubGVuZ3RoID09PSAwO1xufVxuIiwiLyoqXG4gKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfVxuICpcbiAqIEB2ZXJzaW9uIDAuOS4zXG4gKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXVxuICogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5jb25zdCB0PVsuLi5cIjAxMjM0NTY3ODlhYmNkZWZcIl0scz1bNiwxNTM2LDM5MzIxNiwxMDA2NjMyOTZdLGk9WzAsOCwxNiwyNF0sZT1bMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF07ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbmV3IGgoNTEyLHMsNTEyKS51cGRhdGUodCkuaGV4KCl9Y29uc3Qgbj10PT57Y29uc3Qgcz1bXTtmb3IoY29uc3RbaSxlXW9mIHQuZW50cmllcygpKXNbaV09ZTtyZXR1cm4gc307Y2xhc3MgaHtibG9ja3M9W107cz1bXTtyZXNldD0hMDtmaW5hbGl6ZWQ9ITE7YmxvY2s9MDtzdGFydD0wO2xhc3RCeXRlSW5kZXg9MDtjb25zdHJ1Y3Rvcih0LHMsaSl7dGhpcy5wYWRkaW5nPXMsdGhpcy5vdXRwdXRCaXRzPWksdGhpcy5ibG9ja0NvdW50PTE2MDAtKHQ8PDEpPj41LHRoaXMuYnl0ZUNvdW50PXRoaXMuYmxvY2tDb3VudDw8Mix0aGlzLm91dHB1dEJsb2Nrcz1pPj41LHRoaXMuZXh0cmFCeXRlcz0oMzEmaSk+PjM7Zm9yKGxldCB0PTA7dDw1MDsrK3QpdGhpcy5zW3RdPTB9dXBkYXRlKHQpe2lmKHRoaXMuZmluYWxpemVkKXRocm93IG5ldyBFcnJvcihcImZpbmFsaXplIGFscmVhZHkgY2FsbGVkXCIpO2NvbnN0IHM9dGhpcy5ibG9ja3MsZT10aGlzLmJ5dGVDb3VudCxvPXQubGVuZ3RoLG49dGhpcy5ibG9ja0NvdW50LGg9dGhpcy5zO2xldCBsLGMsZj0wO2Zvcig7ZjxvOyl7aWYodGhpcy5yZXNldClmb3IodGhpcy5yZXNldD0hMSxzWzBdPXRoaXMuYmxvY2ssbD0xO2w8bisxOysrbClzW2xdPTA7Zm9yKGw9dGhpcy5zdGFydDtmPG8mJmw8ZTsrK2YpYz10LmNvZGVQb2ludEF0KGYpfHwwLGM8MTI4P3NbbD4+Ml18PWM8PGlbMyZsKytdOmM8MjA0OD8oc1tsPj4yXXw9KDE5MnxjPj42KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOmM8NTUyOTZ8fGM+PTU3MzQ0PyhzW2w+PjJdfD0oMjI0fGM+PjEyKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOihjPTY1NTM2KygoMTAyMyZjKTw8MTB8MTAyMyYodC5jb2RlUG9pbnRBdCgrK2YpfHwwKSksc1tsPj4yXXw9KDI0MHxjPj4xOCk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+MTImNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk7aWYodGhpcy5sYXN0Qnl0ZUluZGV4PWwsbD49ZSl7Zm9yKHRoaXMuc3RhcnQ9bC1lLHRoaXMuYmxvY2s9c1tuXSxsPTA7bDxuOysrbCloW2xdXj1zW2xdO3IoaCksdGhpcy5yZXNldD0hMH1lbHNlIHRoaXMuc3RhcnQ9bH1yZXR1cm4gdGhpc31maW5hbGl6ZSgpe2lmKHRoaXMuZmluYWxpemVkKXJldHVybjt0aGlzLmZpbmFsaXplZD0hMDtjb25zdCB0PXRoaXMuYmxvY2tzO2xldCBzPXRoaXMubGFzdEJ5dGVJbmRleDtjb25zdCBpPXRoaXMuYmxvY2tDb3VudCxlPXRoaXMucztpZih0W3M+PjJdfD10aGlzLnBhZGRpbmdbMyZzXSx0aGlzLmxhc3RCeXRlSW5kZXg9PT10aGlzLmJ5dGVDb3VudClmb3IodFswXT10W2ldLHM9MTtzPGkrMTsrK3MpdFtzXT0wO2Zvcih0W2ktMV18PTIxNDc0ODM2NDgscz0wO3M8aTsrK3MpZVtzXV49dFtzXTtyKGUpfWhleCgpe3RoaXMuZmluYWxpemUoKTtjb25zdCBzPXRoaXMuYmxvY2tDb3VudDtsZXQgaT10aGlzLnM7Y29uc3QgZT10aGlzLm91dHB1dEJsb2NrcyxvPXRoaXMuZXh0cmFCeXRlcztsZXQgaCxsPTAsYz0wLGY9XCJcIjtmb3IoO2M8ZTspe2ZvcihsPTA7bDxzJiZjPGU7KytsLCsrYyloPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdK3RbaD4+MTImMTVdK3RbaD4+OCYxNV0rdFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0rdFtoPj4yOCYxNV0rdFtoPj4yNCYxNV07YyVzPT09MCYmKGk9bihpKSxyKGkpLGw9MCl9cmV0dXJuIG8mJihoPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdLG8+MSYmKGYrPXRbaD4+MTImMTVdK3RbaD4+OCYxNV0pLG8+MiYmKGYrPXRbaD4+MjAmMTVdK3RbaD4+MTYmMTVdKSksZn19Y29uc3Qgcj1mdW5jdGlvbih0KXtsZXQgcyxpLG8sbixoLHIsbCxjLGYsYSx1LGQsYixrLHkseCxCLHAsQyx6LEksZyx3LEEsUCxFLGosbSxxLHYsRCxGLEcsSCxKLEssTCxNLE4sTyxRLFIsUyxULFUsVixXLFgsWSxaLCQsXyx0dCxzdCxpdCxldCxvdCxudCxodCxydCxsdCxjdCxmdDtmb3Iobz0wO288NDg7bys9MiluPXRbMF1edFsxMF1edFsyMF1edFszMF1edFs0MF0saD10WzFdXnRbMTFdXnRbMjFdXnRbMzFdXnRbNDFdLHI9dFsyXV50WzEyXV50WzIyXV50WzMyXV50WzQyXSxsPXRbM11edFsxM11edFsyM11edFszM11edFs0M10sYz10WzRdXnRbMTRdXnRbMjRdXnRbMzRdXnRbNDRdLGY9dFs1XV50WzE1XV50WzI1XV50WzM1XV50WzQ1XSxhPXRbNl1edFsxNl1edFsyNl1edFszNl1edFs0Nl0sdT10WzddXnRbMTddXnRbMjddXnRbMzddXnRbNDddLGQ9dFs4XV50WzE4XV50WzI4XV50WzM4XV50WzQ4XSxiPXRbOV1edFsxOV1edFsyOV1edFszOV1edFs0OV0scz1kXihyPDwxfGw+Pj4zMSksaT1iXihsPDwxfHI+Pj4zMSksdFswXV49cyx0WzFdXj1pLHRbMTBdXj1zLHRbMTFdXj1pLHRbMjBdXj1zLHRbMjFdXj1pLHRbMzBdXj1zLHRbMzFdXj1pLHRbNDBdXj1zLHRbNDFdXj1pLHM9bl4oYzw8MXxmPj4+MzEpLGk9aF4oZjw8MXxjPj4+MzEpLHRbMl1ePXMsdFszXV49aSx0WzEyXV49cyx0WzEzXV49aSx0WzIyXV49cyx0WzIzXV49aSx0WzMyXV49cyx0WzMzXV49aSx0WzQyXV49cyx0WzQzXV49aSxzPXJeKGE8PDF8dT4+PjMxKSxpPWxeKHU8PDF8YT4+PjMxKSx0WzRdXj1zLHRbNV1ePWksdFsxNF1ePXMsdFsxNV1ePWksdFsyNF1ePXMsdFsyNV1ePWksdFszNF1ePXMsdFszNV1ePWksdFs0NF1ePXMsdFs0NV1ePWkscz1jXihkPDwxfGI+Pj4zMSksaT1mXihiPDwxfGQ+Pj4zMSksdFs2XV49cyx0WzddXj1pLHRbMTZdXj1zLHRbMTddXj1pLHRbMjZdXj1zLHRbMjddXj1pLHRbMzZdXj1zLHRbMzddXj1pLHRbNDZdXj1zLHRbNDddXj1pLHM9YV4objw8MXxoPj4+MzEpLGk9dV4oaDw8MXxuPj4+MzEpLHRbOF1ePXMsdFs5XV49aSx0WzE4XV49cyx0WzE5XV49aSx0WzI4XV49cyx0WzI5XV49aSx0WzM4XV49cyx0WzM5XV49aSx0WzQ4XV49cyx0WzQ5XV49aSxrPXRbMF0seT10WzFdLFY9dFsxMV08PDR8dFsxMF0+Pj4yOCxXPXRbMTBdPDw0fHRbMTFdPj4+MjgsbT10WzIwXTw8M3x0WzIxXT4+PjI5LHE9dFsyMV08PDN8dFsyMF0+Pj4yOSxydD10WzMxXTw8OXx0WzMwXT4+PjIzLGx0PXRbMzBdPDw5fHRbMzFdPj4+MjMsUj10WzQwXTw8MTh8dFs0MV0+Pj4xNCxTPXRbNDFdPDwxOHx0WzQwXT4+PjE0LEg9dFsyXTw8MXx0WzNdPj4+MzEsSj10WzNdPDwxfHRbMl0+Pj4zMSx4PXRbMTNdPDwxMnx0WzEyXT4+PjIwLEI9dFsxMl08PDEyfHRbMTNdPj4+MjAsWD10WzIyXTw8MTB8dFsyM10+Pj4yMixZPXRbMjNdPDwxMHx0WzIyXT4+PjIyLHY9dFszM108PDEzfHRbMzJdPj4+MTksRD10WzMyXTw8MTN8dFszM10+Pj4xOSxjdD10WzQyXTw8Mnx0WzQzXT4+PjMwLGZ0PXRbNDNdPDwyfHRbNDJdPj4+MzAsc3Q9dFs1XTw8MzB8dFs0XT4+PjIsaXQ9dFs0XTw8MzB8dFs1XT4+PjIsSz10WzE0XTw8Nnx0WzE1XT4+PjI2LEw9dFsxNV08PDZ8dFsxNF0+Pj4yNixwPXRbMjVdPDwxMXx0WzI0XT4+PjIxLEM9dFsyNF08PDExfHRbMjVdPj4+MjEsWj10WzM0XTw8MTV8dFszNV0+Pj4xNywkPXRbMzVdPDwxNXx0WzM0XT4+PjE3LEY9dFs0NV08PDI5fHRbNDRdPj4+MyxHPXRbNDRdPDwyOXx0WzQ1XT4+PjMsQT10WzZdPDwyOHx0WzddPj4+NCxQPXRbN108PDI4fHRbNl0+Pj40LGV0PXRbMTddPDwyM3x0WzE2XT4+Pjksb3Q9dFsxNl08PDIzfHRbMTddPj4+OSxNPXRbMjZdPDwyNXx0WzI3XT4+PjcsTj10WzI3XTw8MjV8dFsyNl0+Pj43LHo9dFszNl08PDIxfHRbMzddPj4+MTEsST10WzM3XTw8MjF8dFszNl0+Pj4xMSxfPXRbNDddPDwyNHx0WzQ2XT4+PjgsdHQ9dFs0Nl08PDI0fHRbNDddPj4+OCxUPXRbOF08PDI3fHRbOV0+Pj41LFU9dFs5XTw8Mjd8dFs4XT4+PjUsRT10WzE4XTw8MjB8dFsxOV0+Pj4xMixqPXRbMTldPDwyMHx0WzE4XT4+PjEyLG50PXRbMjldPDw3fHRbMjhdPj4+MjUsaHQ9dFsyOF08PDd8dFsyOV0+Pj4yNSxPPXRbMzhdPDw4fHRbMzldPj4+MjQsUT10WzM5XTw8OHx0WzM4XT4+PjI0LGc9dFs0OF08PDE0fHRbNDldPj4+MTgsdz10WzQ5XTw8MTR8dFs0OF0+Pj4xOCx0WzBdPWtefngmcCx0WzFdPXlefkImQyx0WzEwXT1BXn5FJm0sdFsxMV09UF5+aiZxLHRbMjBdPUhefksmTSx0WzIxXT1KXn5MJk4sdFszMF09VF5+ViZYLHRbMzFdPVVeflcmWSx0WzQwXT1zdF5+ZXQmbnQsdFs0MV09aXRefm90Jmh0LHRbMl09eF5+cCZ6LHRbM109Ql5+QyZJLHRbMTJdPUVefm0mdix0WzEzXT1qXn5xJkQsdFsyMl09S15+TSZPLHRbMjNdPUxefk4mUSx0WzMyXT1WXn5YJlosdFszM109V15+WSYkLHRbNDJdPWV0Xn5udCZydCx0WzQzXT1vdF5+aHQmbHQsdFs0XT1wXn56JmcsdFs1XT1DXn5JJncsdFsxNF09bV5+diZGLHRbMTVdPXFefkQmRyx0WzI0XT1NXn5PJlIsdFsyNV09Tl5+USZTLHRbMzRdPVheflomXyx0WzM1XT1ZXn4kJnR0LHRbNDRdPW50Xn5ydCZjdCx0WzQ1XT1odF5+bHQmZnQsdFs2XT16Xn5nJmssdFs3XT1JXn53JnksdFsxNl09dl5+RiZBLHRbMTddPURefkcmUCx0WzI2XT1PXn5SJkgsdFsyN109UV5+UyZKLHRbMzZdPVpefl8mVCx0WzM3XT0kXn50dCZVLHRbNDZdPXJ0Xn5jdCZzdCx0WzQ3XT1sdF5+ZnQmaXQsdFs4XT1nXn5rJngsdFs5XT13Xn55JkIsdFsxOF09Rl5+QSZFLHRbMTldPUdeflAmaix0WzI4XT1SXn5IJkssdFsyOV09U15+SiZMLHRbMzhdPV9eflQmVix0WzM5XT10dF5+VSZXLHRbNDhdPWN0Xn5zdCZldCx0WzQ5XT1mdF5+aXQmb3QsdFswXV49ZVtvXSx0WzFdXj1lW28rMV19O2V4cG9ydHtvIGFzIHNoYTNfNTEyfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2guanMubWFwXG4iLCJjb25zdCBlPVwiXCIsdD1mdW5jdGlvbigpe2NvbnN0IGU9e2luc3RhbmNlOkVycm9yLGZyb206ZT0+e2NvbnN0IHQ9W2UubmFtZSxlLm1lc3NhZ2VdO3JldHVybiB2b2lkIDAhPT1lLnN0YWNrJiZ0LnB1c2goZS5zdGFjayksdm9pZCAwIT09ZS5jYXVzZSYmKHZvaWQgMD09PWUuc3RhY2smJnQucHVzaCh2b2lkIDApLHQucHVzaChlLmNhdXNlKSksdH0sc3R1YjooKT0+bmV3IEVycm9yLGh5ZHJhdGU6KGUsW3QsbixhLHNdKT0+e2UubmFtZT10LGUubWVzc2FnZT1uLHZvaWQgMD09PWE/ZGVsZXRlIGUuc3RhY2s6ZS5zdGFjaz1hLHZvaWQgMCE9PXMmJihlLmNhdXNlPXMpfX0sdD17aW5zdGFuY2U6VWludDhBcnJheSxmcm9tOmU9PltidG9hKGEuZGVjb2RlKGUpKV0sY3JlYXRlOihbZV0pPT5uLmVuY29kZShhdG9iKGUpKX0scz17aW5zdGFuY2U6TWFwLGZyb206ZT0+Wy4uLmUuZW50cmllcygpXSxzdHViOigpPT5uZXcgTWFwLGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3RbbixhXW9mIHQpZS5zZXQobixhKX19LG89e2luc3RhbmNlOlNldCxmcm9tOmU9PlsuLi5lLnZhbHVlcygpXSxzdHViOigpPT5uZXcgU2V0LGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3QgbiBvZiB0KWUuYWRkKG4pfX0scj17aW5zdGFuY2U6RGF0ZSxmcm9tOmU9PltlLnRvSlNPTigpXSxjcmVhdGU6KFtlXSk9Pm5ldyBEYXRlKGUpfSxjPXtpbnN0YW5jZTpSZWdFeHAsZnJvbTooe2ZsYWdzOmUsc291cmNlOnR9KT0+ZT9bdCxlXTpbdF0sY3JlYXRlOihbZSx0XSk9Pm5ldyBSZWdFeHAoZSx0KX0sZD17aW5zdGFuY2U6VVJMLGZyb206ZT0+W2UuaHJlZl0sY3JlYXRlOihbZV0pPT5uZXcgVVJMKGUpfTtyZXR1cm4gbmV3IE1hcChbZSx0LHMsbyxyLGMsZF0ubWFwKGU9PltlLmluc3RhbmNlLm5hbWUsZV0pKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpO2V4cG9ydHt0IGFzIEdMT0JBTF9DT05TVFJVQ1RPUl9NQVAsZSBhcyBQTEFJTl9PQkpFQ1RfTEFCRUx9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RydWN0b3JzLmpzLm1hcFxuIiwiaW1wb3J0e0dMT0JBTF9DT05TVFJVQ1RPUl9NQVAgYXMgdCxQTEFJTl9PQkpFQ1RfTEFCRUwgYXMgbn1mcm9tXCIuL2NvbnN0cnVjdG9ycy5qc1wiO2NvbnN0IGU9LTEscj0tMixvPS0zLGk9LTQscz0tNSxjPS02O2Z1bmN0aW9uIGYobixlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcywgc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuXG5leHBvcnQgdHlwZSBEYXRhYmFzZU9ybSA9ICdwcmlzbWEnIHwgJ2RyaXp6bGUnO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNCdW5Ub29sVmVyc2lvbigpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy51c2VzQnVuUGFja2FnZU1hbmFnZXI7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgdXNlc0J1blBhY2thZ2VNYW5hZ2VyKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhc0J1bkxvY2tmaWxlKCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLmhhc0J1blBhY2thZ2VNYW5hZ2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGhhc0J1blRvb2xWZXJzaW9uKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gLyhefFxcbilidW5cXHMvLnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYXNCdW5Mb2NrZmlsZSgpOiBib29sZWFuIHtcbiAgICAvLyBTb21lIHJlcG9zaXRvcmllcyByZWx5IG9uIHRoZSBsb2NrZmlsZSBvciBwYWNrYWdlTWFuYWdlciBmaWVsZCBpbnN0ZWFkIG9mIG1pc2UuXG4gICAgLy8gRG9ja2VyIG9wdGltaXphdGlvbiBtdXN0IGZvbGxvdyB0aGUgdGFyZ2V0IHByb2plY3QsIG5vdCB0aGUgcnVudGltZSB0aGF0IGxhdW5jaGVkIHdiLlxuICAgIHJldHVybiBbJ2J1bi5sb2NrJywgJ2J1bi5sb2NrYiddLnNvbWUoKGZpbGVOYW1lKSA9PiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCBmaWxlTmFtZSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQnVuUGFja2FnZU1hbmFnZXIoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSB0aGlzLnJvb3RQYWNrYWdlSnNvbj8ucGFja2FnZU1hbmFnZXIgPz8gdGhpcy5wYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlcjtcbiAgICByZXR1cm4gdHlwZW9mIHBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJyAmJiBwYWNrYWdlTWFuYWdlci5zdGFydHNXaXRoKCdidW5AJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgID8gJ1lBUk4gcnVuIGJ1aWxkJ1xuICAgICAgOiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkXG4gICAgICAgID8gYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke3RoaXMuYXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gXG4gICAgICAgIDogXCJlY2hvICdObyBidWlsZCBzY3JpcHQnXCI7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXRoaXMubG9hZEVudikgcmV0dXJuIHByb2Nlc3MuZW52O1xuXG4gICAgY29uc3QgW2VudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmFyZ3YsIHRoaXMuZGlyUGF0aCk7XG4gICAgaWYgKCFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgIGZvciAoY29uc3QgW2VudlBhdGgsIGNvdW50XSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycykge1xuICAgICAgICBjb25zb2xlLmluZm8oYExvYWRlZCAke2NvdW50fSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IC4uLmVudlZhcnMsIC4uLnByb2Nlc3MuZW52IH07XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLnBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb25QYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbigncHJpc21hJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRHJpenpsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCdkcml6emxlLW9ybScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRhdGFiYXNlT3JtKCk6IERhdGFiYXNlT3JtIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNQcmlzbWEpIHJldHVybiAncHJpc21hJztcbiAgICBpZiAodGhpcy5oYXNEcml6emxlKSByZXR1cm4gJ2RyaXp6bGUnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNWaXRlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy52aXRlc3QgPz8gdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnZpdGVzdCk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzT3hsaW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094Zm10KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294Zm10Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJldHRpZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgncHJldHRpZXInKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQb2V0cnlMb2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwb2V0cnkubG9jaycpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncG9ldHJ5LmxvY2snKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1B1YnNwZWNZYW1sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSkgfHxcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwdWJzcGVjLnlhbWwnKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHByZWZlcnJlZExpbnRlcigpOiAnb3hsaW50JyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzT3hsaW50KSByZXR1cm4gJ294bGludCc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaGFzT3duRGVwZW5kZW5jeShwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUGxheXdyaWdodENvbmZpZygpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzQ0kodGhpcy5lbnYuQ0kpKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgICAgcmV0dXJuIC9cXGJ3ZWJTZXJ2ZXJcXGIvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiAoSlNPTi5wYXJzZShcbiAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICAgICAgKSBhcyBQYWNrYWdlSnNvbik7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYmluRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBiaW5Gb3VuZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50UGF0aCA9IHRoaXMuZGlyUGF0aDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICAgIHRoaXMuZW52LlBBVEggPSBgJHtiaW5QYXRofToke3RoaXMuZW52LlBBVEh9YDtcbiAgICAgICAgYmluRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBiaW5Gb3VuZDtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNEZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKSA/PyB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucm9vdFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXBlbmRlbmN5VmVyc2lvbih0aGlzLnBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCwgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBwcml2YXRlIGdldCByb290UGFja2FnZUpzb24oKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJvb3REaXJQYXRoID09PSB0aGlzLmRpclBhdGgpIHJldHVybiB0aGlzLnBhY2thZ2VKc29uO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW3diXSBGYWlsZWQgdG8gcmVhZCBvciBwYXJzZSAke3BhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyl9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvdW5kUHJvamVjdHMge1xuICByb290OiBQcm9qZWN0O1xuICBzZWxmOiBQcm9qZWN0O1xuICBkZXNjZW5kYW50czogUHJvamVjdFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNlbGZQcm9qZWN0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnYgPSB0cnVlLCBkaXJQYXRoPzogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmREZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBQcm9taXNlPEZvdW5kUHJvamVjdHMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgcm9vdEFuZFNlbGZQcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGxvYWRFbnYsIGRpclBhdGgpO1xuICBpZiAoIXJvb3RBbmRTZWxmUHJvamVjdHMpIHJldHVybjtcblxuICByZXR1cm4ge1xuICAgIC4uLnJvb3RBbmRTZWxmUHJvamVjdHMsXG4gICAgZGVzY2VuZGFudHM6XG4gICAgICByb290QW5kU2VsZlByb2plY3RzLnJvb3QgPT09IHJvb3RBbmRTZWxmUHJvamVjdHMuc2VsZlxuICAgICAgICA/IGF3YWl0IGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCByb290QW5kU2VsZlByb2plY3RzLnJvb3QsIGxvYWRFbnYpXG4gICAgICAgIDogW3Jvb3RBbmRTZWxmUHJvamVjdHMuc2VsZl0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IE9taXQ8Rm91bmRQcm9qZWN0cywgJ2Rlc2NlbmRhbnRzJz4gfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICBjb25zdCB0aGlzUHJvamVjdCA9IG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICBsZXQgcm9vdFByb2plY3QgPSB0aGlzUHJvamVjdDtcbiAgaWYgKCF0aGlzUHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmIHBhdGguZGlybmFtZShkaXJQYXRoKS5lbmRzV2l0aCgnL3BhY2thZ2VzJykpIHtcbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIHJvb3RQcm9qZWN0ID0gbmV3IFByb2plY3Qocm9vdERpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyByb290OiByb290UHJvamVjdCwgc2VsZjogdGhpc1Byb2plY3QgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICByb290UHJvamVjdDogUHJvamVjdCxcbiAgbG9hZEVudjogYm9vbGVhblxuKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBbcm9vdFByb2plY3RdO1xuXG4gIGNvbnN0IHdvcmtzcGFjZSA9IHJvb3RQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2UpKSByZXR1cm4gcHJvamVjdHM7XG5cbiAgY29uc3QgZ2xvYlBhdHRlcm46IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VEaXJzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdGggb2Ygd29ya3NwYWNlLm1hcCgod3M6IHN0cmluZykgPT4gcGF0aC5qb2luKHJvb3RQcm9qZWN0LmRpclBhdGgsIHdzKSkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh3b3Jrc3BhY2VQYXRoKSkge1xuICAgICAgcGFja2FnZURpcnMucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2xvYlBhdHRlcm4ucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9XG4gIH1cbiAgcGFja2FnZURpcnMucHVzaCguLi4oYXdhaXQgZ2xvYmJ5KGdsb2JQYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSk7XG4gIGZvciAoY29uc3Qgc3ViUGFja2FnZURpclBhdGggb2YgcGFja2FnZURpcnMpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHN1YlBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcblxuICAgIHByb2plY3RzLnB1c2gobmV3IFByb2plY3Qoc3ViUGFja2FnZURpclBhdGgsIGFyZ3YsIGxvYWRFbnYpKTtcbiAgfVxuICByZXR1cm4gcHJvamVjdHM7XG59XG4iLCJleHBvcnQgY29uc3QgaXNSdW5uaW5nT25CdW4gPVxuICAvLyBEZXRlY3QgYGJ1biAtLWJ1biBydW4gd2IgLi4uYC4gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy91dGlsL2RldGVjdC1idW5cbiAgcHJvY2Vzcy52ZXJzaW9ucy5idW4gfHxcbiAgLy8gRGV0ZWN0IGBidW4gcnVuIHdiIC4uLmAuXG4gIHByb2Nlc3MuYXJndlswXT8uZW5kc1dpdGgoJy9idW4nKSB8fFxuICBwcm9jZXNzLmVudi5ucG1fZXhlY3BhdGg/LmVuZHNXaXRoKCcvYnVuJyk7XG5cbmV4cG9ydCBjb25zdCBydW50aW1lV2l0aEFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICdub2RlJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAneWFybic7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXJXaXRoUnVuID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAneWFybic7XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBCaW5hcnlMaWtlLCBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGJ1aWxkIGNvbW1hbmQgKGRlZmF1bHQ6IHlhcm58YnVuIGJ1aWxkKScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdjJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBidWlsZElmTmVlZGVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdidWlsZElmTmVlZGVkJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBjb2RlIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgYnVpbGRJZk5lZWRlZChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZElmTmVlZGVkKFxuICAvLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYnVpbGRDb21tYW5kID1cbiAgICBhcmd2LmNvbW1hbmQgPz9cbiAgICAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZCA/IChpc1J1bm5pbmdPbkJ1biA/ICdidW4gcnVuIGJ1aWxkJyA6ICd5YXJuIGJ1aWxkJykgOiB1bmRlZmluZWQpO1xuICBpZiAoIWJ1aWxkQ29tbWFuZCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignU2tpcCB0byBidWlsZCBiZWNhdXNlIG5vIGJ1aWxkIGNvbW1hbmQgaXMgZGVmaW5lZC4nKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGJ1aWxkQ29tbWFuZCB9O1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkpIHtcbiAgICBidWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IFtjYW5Ta2lwLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF0gPSBhd2FpdCBjYW5Ta2lwQnVpbGQocHJvamVjdCwgYXJndik7XG4gIGlmIChjYW5Ta2lwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTa2lwIHRvIHJ1biAnJHthcmd2LmNvbW1hbmR9JyDwn5KrYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghYnVpbGQocHJvamVjdCwgYXJndikpIHJldHVybjtcblxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBidWlsZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+KTogYm9vbGVhbiB7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgUnVuICcke2FyZ3YuY29tbWFuZH0nYCkpO1xuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoYXJndi5jb21tYW5kID8/ICcnLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBpZ25vcmluZ0VudlZhck5hbWVzID0gbmV3IFNldChbJ0NJJywgJ1BXREVCVUcnLCAnVE1QRElSJ10pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FuU2tpcEJ1aWxkKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdnaXQgcmV2LXBhcnNlIEhFQUQnLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoIH0pLnRvU3RyaW5nKCkudHJpbSgpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSlcbiAgKTtcbiAgaGFzaC51cGRhdGUoZW52aXJvbm1lbnRKc29uKTtcblxuICBhd2FpdCB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQocHJvamVjdCwgYXJndiwgaGFzaCk7XG4gIGNvbnN0IGNvbnRlbnRIYXNoID0gaGFzaC5kaWdlc3QoJ2hleCcpO1xuXG4gIGNvbnN0IGNhY2hlZENvbnRlbnRIYXNoID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIHJldHVybiBbY2FjaGVkQ29udGVudEhhc2ggPT09IGNvbnRlbnRIYXNoLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG59XG5cbmNvbnN0IGluY2x1ZGVQYXR0ZXJucyA9IFsnc3JjLycsICdwdWJsaWMvJ107XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG5dO1xuY29uc3QgZXhjbHVkZVBhdHRlcm5zID0gWyd0ZXN0LycsICd0ZXN0cy8nLCAnX190ZXN0c19fLycsICd0ZXN0LWZpeHR1cmVzLycsICd0ZXN0L2ZpeHR1cmVzLyddO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydzdGF0dXMnLCAnLS1wb3JjZWxhaW4nXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSk7XG4gICAgY29uc3QgbGluZXMgPSByZXQuc3Rkb3V0XG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmxlbmd0aCA+IDApO1xuICAgIGNvbnN0IGZpbGVQYXRocyA9IGxpbmVzXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKDIpLnRyaW0oKSlcbiAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0JyA/IGZpbGVQYXRoLnJlcGxhY2UoL3BhY2thZ2VzXFwvd2JcXC90ZXN0XFwvZml4dHVyZXNcXC9bXi9dK1xcLy8sICcnKSA6IGZpbGVQYXRoXG4gICAgICApO1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZVBhdGhzID0gZmlsZVBhdGhzLmZpbHRlcihcbiAgICAgIChmaWxlUGF0aCkgPT5cbiAgICAgICAgKGluY2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gZmlsZVBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFleGNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpXG4gICAgKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZWQgZmlsZXM6ICR7ZmlsdGVyZWRGaWxlUGF0aHMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGhcbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bignZ2l0JywgWydkaWZmJywgJy0tJywgLi4uZmlsdGVyZWRGaWxlUGF0aHNdLCB7IGN3ZDogcHJvamVjdC5yb290RGlyUGF0aCB9KTtcbiAgICBwcm9jLnN0ZG91dC5vbignZGF0YScsIChkYXRhOiBCaW5hcnlMaWtlKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdEYXRhOicsIGRhdGEpO1xuICAgICAgICBjb25zb2xlLmluZm8oJ0hhc2g6JywgaGFzaC5jb3B5KCkuZGlnZXN0KCdoZXgnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAgICogRm9yIGV4YW1wbGUsIGByZXRyeUNvdW50OiAzYCBydW5zIHRoZSBmdW5jdGlvbiBhdCBtb3N0IDMgdGltZXM6IDEgaW5pdGlhbCBhdHRlbXB0IGFuZCB1cCB0byAyIHJldHJpZXMuXG4gICAqL1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgb25TaWduYWw/OiAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHZvaWQ7XG4gIG9taXRTaWxlbnRTdGFydD86IGJvb2xlYW47XG4gIHByZXNlcnZlQ29sb3I/OiBib29sZWFuO1xuICBwcm9jZXNzU2lsZW50T3V0cHV0PzogKG91dHB1dDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHByaW50UmF3T3V0cHV0PzogYm9vbGVhbjtcbiAgcHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5PzogYm9vbGVhbjtcbiAgc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zPzogbnVtYmVyO1xuICBzaWxlbnRTdWNjZXNzTWVzc2FnZT86IHN0cmluZztcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gIGV4aXRJZkZhaWxlZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVmZmVyZWRSdW5SZXN1bHQge1xuICBleGl0Q29kZTogbnVtYmVyO1xuICBvdXRwdXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+ICYgeyBzaWxlbnQ/OiBib29sZWFuIH0sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBpZiAoIShhcmd2LnNpbGVudCAmJiBvcHRzLm9taXRTaWxlbnRTdGFydCAmJiAhYXJndi5kcnlSdW4pKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgYXJndi5zaWxlbnQgPyAnQ29tbWFuZCcgOiAnU3RhcnQnKTtcbiAgfVxuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3Qgc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCA9IEJvb2xlYW4oXG4gICAgYXJndi5zaWxlbnQgJiYgKG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dCA/PyBvcHRzLnByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSlcbiAgKTtcbiAgbGV0IHdyb3RlU2lsZW50UHJvZ3Jlc3MgPSBmYWxzZTtcbiAgY29uc3QgcHJvZ3Jlc3NUaW1lciA9XG4gICAgYXJndi5zaWxlbnQgJiYgb3B0cy5zaWxlbnRQcm9ncmVzc0ludGVydmFsTXNcbiAgICAgID8gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcuJyk7XG4gICAgICAgICAgd3JvdGVTaWxlbnRQcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIH0sIG9wdHMuc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IChhcmd2LnNpbGVudCA/IHRydWUgOiB1bmRlZmluZWQpIH0pLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiBhcmd2LnNpbGVudCA/ICdwaXBlJyA6ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgbWVyZ2VPdXRBbmRFcnJvcjogc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHByaW50aW5nU3Rkb3V0OiBhcmd2LnNpbGVudCAmJiAhc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgb21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nOiBhcmd2LnNpbGVudCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgIGlmIChwcm9ncmVzc1RpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHByb2dyZXNzVGltZXIpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICBpZiAod3JvdGVTaWxlbnRQcm9ncmVzcykge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxuICBpZiAoc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCAmJiAoIW9wdHMucHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5IHx8IGV4aXRDb2RlICE9PSAwKSkge1xuICAgIGNvbnN0IG91dHB1dCA9IChvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQgPyBvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQocmV0LnN0ZG91dCkgOiByZXQuc3Rkb3V0KS50cmltKCk7XG4gICAgaWYgKG91dHB1dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFyZ3Yuc2lsZW50ICYmIGV4aXRDb2RlID09PSAwICYmIG9wdHMuc2lsZW50U3VjY2Vzc01lc3NhZ2UpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4ob3B0cy5zaWxlbnRTdWNjZXNzTWVzc2FnZSkpO1xuICB9XG4gIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgZXhpdENvZGUsIG9wdHMsIHsgc2lsZW50U3VjY2VzczogYXJndi5zaWxlbnQgfSk7XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChwYXJhbGxlbCknLCB0cnVlKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IHRydWUgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHByaW50aW5nU3Rkb3V0OiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgcHJpbnRpbmdTdGRlcnI6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSByZXQuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAob3V0ICYmICFvcHRzLnByaW50UmF3T3V0cHV0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8QnVmZmVyZWRSdW5SZXN1bHQ+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICAgIG91dHB1dDogJycsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyB0cnVlIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICByZXR1cm4ge1xuICAgICAgZXhpdENvZGU6IHJldC5zdGF0dXMgPz8gMSxcbiAgICAgIG91dHB1dDogcmV0LnN0ZG91dCxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHsgcHJpbnRhYmxlOiBzdHJpbmc7IHJ1bm5hYmxlOiBzdHJpbmcgfSB7XG4gIGNvbnN0IHByb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/ICdidW4gLS1idW4gcnVuJyA6ICd5YXJuJztcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoXG4gICAgICAvUFJJU01BIGdlbmVyYXRlKD8hXFxzKy0tbm8taGludHMpKD89XFxzfCQpL2d1LFxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1BSSVNNQSBnZW5lcmF0ZScgOiAnUFJJU01BIGdlbmVyYXRlIC0tbm8taGludHMnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOIHJ1biAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiBydW4gJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1biAtLWJ1bikgcnVuYC5cbiAgICAucmVwbGFjZUFsbCgnWUFSTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ3lhcm4gcnVuICcpO1xuICBpZiAocHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIpIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIGJ1aWxkLXRzIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdidW4gLS1idW4gcnVuIGJ1biAtLWJ1biBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAvLyBCZWNhdXNlIGJ1biBjYW4gcnVuIHNyYy9pbmRleC50cyBkaXJlY3RseS5cbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQobmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCkpO1xuICBjb25zdCBydW5uYWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQoXG4gICAgbmV3U2NyaXB0XG4gICAgICAvLyBLZWVwIFBsYXl3cmlnaHQgYXMgYSBwYWNrYWdlLW1hbmFnZXIgY29tbWFuZCBpbnN0ZWFkIG9mIHJlc29sdmluZyBpdCB0aHJvdWdoIG5vZGVfbW9kdWxlcy8uYmluLlxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgICAucmVwbGFjZUFsbChcbiAgICAgICAgJ1lBUk4gJyxcbiAgICAgICAgIXByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgXG4gICAgICApXG4gICk7XG4gIC8vIEFkZCBjYXNjYWRlIG9wdGlvbiB3aGVuIFdCX0VOViBpcyBkZWZpbmVkXG4gIGNvbnN0IGNhc2NhZGVPcHRpb24gPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgIC1jPSR7cHJvamVjdC5lbnYuV0JfRU5WIHx8ICdkZXZlbG9wbWVudCd9YCA6ICcnO1xuICByZXR1cm4ge1xuICAgIHByaW50YWJsZTogYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZG90ZW52JHtjYXNjYWRlT3B0aW9ufSAtLSAke3ByaW50YWJsZVNjcmlwdH1gLFxuICAgIHJ1bm5hYmxlOiBydW5uYWJsZVNjcmlwdCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPixcbiAgcHJpbnRPcHRpb25zOiB7IHNpbGVudFN1Y2Nlc3M/OiBib29sZWFuIH0gPSB7fVxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGlmIChwcmludE9wdGlvbnMuc2lsZW50U3VjY2VzcykgcmV0dXJuO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVFbnYoXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgb3B0czogT3B0aW9uc1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5ld0VudiA9IHsgLi4uZW52IH07XG4gIGlmIChvcHRzLmNpKSB7XG4gICAgbmV3RW52LkNJID0gJzEnO1xuICB9XG4gIGNvbmZpZ3VyZUNvbG9yRW52KG5ld0Vudiwgb3B0cy5wcmVzZXJ2ZUNvbG9yKTtcbiAgcmV0dXJuIG5ld0Vudjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIGNoaWxkLXByb2Nlc3MgY29sb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB3Yi1tYW5hZ2VkIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gZW52IFRoZSBjaGlsZC1wcm9jZXNzIGVudmlyb25tZW50IHRvIG11dGF0ZS5cbiAqIEBwYXJhbSBwcmVzZXJ2ZUNvbG9yIFdoZXRoZXIgd2Igc2hvdWxkIHByZXNlcnZlIGNvbG9ycyBmb3Igb3V0cHV0IHRoYXQgaXQgY2FwdHVyZXMgYW5kIHJlcHJpbnRzIHRvIGFuIGludGVyYWN0aXZlIFRUWS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZUNvbG9yRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiwgcHJlc2VydmVDb2xvcj86IGJvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKGVudi5OT19DT0xPUiAhPT0gdW5kZWZpbmVkIHx8IHByZXNlcnZlQ29sb3IgPT09IGZhbHNlKSB7XG4gICAgLy8gTk9fQ09MT1IgYW5kIHByZXNlcnZlQ29sb3I9ZmFsc2UgYXJlIGV4cGxpY2l0IG5vLWNvbG9yIGNob2ljZXMsIHNvIGluaGVyaXRlZCBGT1JDRV9DT0xPUiBtdXN0IG5vdCBsZWFrIHRocm91Z2guXG4gICAgZGVsZXRlIGVudi5GT1JDRV9DT0xPUjtcbiAgfSBlbHNlIGlmIChwcmVzZXJ2ZUNvbG9yICYmIHByb2Nlc3Muc3Rkb3V0LmlzVFRZKSB7XG4gICAgZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZml4QnVuQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy8xNDM1OVxuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnbmV4dCBkZXYnKSB8fFxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzgyMjJcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwbGF5d3JpZ2h0JykgfHxcbiAgICAvLyBcImJ1biAtLWJ1biBwcmlzbWEgZ2VuZXJhdGVcIiBkb2Vzbid0IHdvcmtcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwcmlzbWEnKSB8fFxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnKVxuICAgID8gY29tbWFuZC5yZXBsYWNlQWxsKCdidW4gLS1idW4nLCAnYnVuJylcbiAgICA6IGNvbW1hbmQ7XG59XG4iLCJpbXBvcnQgeyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIC8vIFRoaXMgb3B0aW9uIGlzIGZvciBkZWJ1Z2dpbmcgbWFpbmx5LlxuICAnd29ya2luZy1kaXInOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICAnZHJ5LXJ1bic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogWydkcnknLCAnZCddLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG9wdGlvbk5hbWUgb2YgT2JqZWN0LmtleXMoeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudikpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldE9wdGlvblZhbHVlKGFyZ3YsIG9wdGlvbk5hbWUpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgYXJncy5wdXNoKHZhbHVlID8gYC0tJHtvcHRpb25OYW1lfWAgOiBgLS0ke29wdGlvbk5hbWV9PWZhbHNlYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHt2YWx1ZX1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke2l0ZW19YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChcbiAgICAoYXJndiBhcyBFbnZSZWFkZXJPcHRpb25zICYgeyBzaWxlbnQ/OiBib29sZWFuIH0pLnNpbGVudCA9PT0gdHJ1ZSAmJlxuICAgIGdldE9wdGlvblZhbHVlKGFyZ3YsICdxdWlldC1lbnYnKSA9PT0gdW5kZWZpbmVkXG4gICkge1xuICAgIGFyZ3MucHVzaCgnLS1xdWlldC1lbnYnKTtcbiAgfVxuICByZXR1cm4gYXJncztcbn1cblxuZnVuY3Rpb24gZ2V0T3B0aW9uVmFsdWUoYXJndjogRW52UmVhZGVyT3B0aW9ucywgb3B0aW9uTmFtZTogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGNhbWVsQ2FzZU9wdGlvbk5hbWUgPSBvcHRpb25OYW1lLnJlcGxhY2VBbGwoLy0oW2Etel0pL2csIChfLCBjaGFyYWN0ZXI6IHN0cmluZykgPT4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCkpO1xuICBjb25zdCBvcHRpb25zID0gYXJndiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIG9wdGlvbnNbb3B0aW9uTmFtZV0gPz8gb3B0aW9uc1tjYW1lbENhc2VPcHRpb25OYW1lXTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52LCBub3JtYWxpemVTY3JpcHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgRk9SQ0VfS0lMTF9ERUxBWV9NUyA9IDUwMDA7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdraWxsLW90aGVycyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBleGl0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAna2lsbC1vdGhlcnMtb24tZmFpbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBmYWlscycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzdWNjZXNzOiB7XG4gICAgZGVzY3JpcHRpb246ICdEZWZpbmUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIGNyaXRlcmlhJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbJ2FsbCcsICdmaXJzdCddLFxuICAgIGRlZmF1bHQ6ICdhbGwnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NvbW1hbmRzIHRvIHJ1biBjb25jdXJyZW50bHknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5pbnRlcmZhY2UgUnVuQ29uY3VycmVudGx5T3B0aW9ucyB7XG4gIGNvbW1hbmRzOiBzdHJpbmdbXTtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAga2lsbE90aGVyczogYm9vbGVhbjtcbiAga2lsbE90aGVyc09uRmFpbDogYm9vbGVhbjtcbiAgc3VjY2VzczogJ2FsbCcgfCAnZmlyc3QnO1xuICBjaT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBjb25jdXJyZW50bHlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY29uY3VycmVudGx5IDxjb21tYW5kcy4uLj4nLFxuICBkZXNjcmliZTogJ1J1biBjb21tYW5kcyBjb25jdXJyZW50bHknLFxuICBidWlsZGVyOiB7IC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLCAuLi5idWlsZGVyLCAuLi5hcmd1bWVudHNCdWlsZGVyIH0sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kcyA9IChhcmd2LmNvbW1hbmRzID8/IFtdKS5tYXAoU3RyaW5nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIGNvbW1hbmRzIHByb3ZpZGVkLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Db25jdXJyZW50bHkoe1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAga2lsbE90aGVyczogYXJndi5raWxsT3RoZXJzID8/IGZhbHNlLFxuICAgICAgICBraWxsT3RoZXJzT25GYWlsOiBhcmd2LmtpbGxPdGhlcnNPbkZhaWwgPz8gZmFsc2UsXG4gICAgICAgIHN1Y2Nlc3M6IGFyZ3Yuc3VjY2VzcyxcbiAgICAgICAgY2k6IHR5cGVvZiBhcmd2LmNpID09PSAnYm9vbGVhbicgPyBhcmd2LmNpIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ29uY3VycmVudGx5KG9wdGlvbnM6IFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBjaGlsZHJlbiA9IG9wdGlvbnMuY29tbWFuZHMubWFwKChjb21tYW5kKSA9PlxuICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd24obm9ybWFsaXplU2NyaXB0KGNvbW1hbmQsIG9wdGlvbnMucHJvamVjdCkucnVubmFibGUsIHtcbiAgICAgIGN3ZDogb3B0aW9ucy5wcm9qZWN0LmRpclBhdGgsXG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIGVudjogY29uZmlndXJlRW52KG9wdGlvbnMucHJvamVjdC5lbnYsIHsgY2k6IG9wdGlvbnMuY2kgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSlcbiAgKTtcblxuICBsZXQgc3RvcHBpbmcgPSBmYWxzZTtcbiAgbGV0IGludGVycnVwdGVkU2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZDtcbiAgbGV0IGZpcnN0UmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBzdG9wUmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZvcmNlS2lsbFByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgY29uc3QgcmVzdWx0cyA9IEFycmF5LmZyb208bnVtYmVyIHwgdW5kZWZpbmVkPih7IGxlbmd0aDogY2hpbGRyZW4ubGVuZ3RoIH0pO1xuICBjb25zdCB3YWl0Rm9yRXhpdFByb21pc2VzID0gY2hpbGRyZW4ubWFwKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzZXR0bGUgPSAoZXhpdENvZGU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICByZXN1bHRzW2luZGV4XSA9IGV4aXRDb2RlO1xuICAgICAgICBmaXJzdFJlc3VsdCA/Pz0gZXhpdENvZGU7XG5cbiAgICAgICAgaWYgKCFzdG9wcGluZyAmJiBzaG91bGRTdG9wT3RoZXJzKGV4aXRDb2RlLCBvcHRpb25zKSkge1xuICAgICAgICAgIHN0b3BSZXN1bHQgPSBleGl0Q29kZTtcbiAgICAgICAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgICAgICAgZm9yY2VLaWxsUHJvbWlzZXMucHVzaCh0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbiwgJ1NJR1RFUk0nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgY2hpbGQub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN0YXJ0IGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgICAgICBzZXR0bGUoMSk7XG4gICAgICB9KTtcbiAgICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHNldHRsZShnZXRFeGl0Q29kZShjb2RlID8/IHVuZGVmaW5lZCwgc2lnbmFsID8/IHVuZGVmaW5lZCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IHN0b3BBbGwgPSAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQgPT4ge1xuICAgIGludGVycnVwdGVkU2lnbmFsID8/PSBzaWduYWw7XG4gICAgaWYgKHN0b3BwaW5nKSByZXR1cm47XG5cbiAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgZm9yY2VLaWxsUHJvbWlzZXMucHVzaCh0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbiwgc2lnbmFsKSk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ2ludCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdJTlQnKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lndGVybSA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdURVJNJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3F1aXQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHUVVJVCcpO1xuICB9O1xuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gIHByb2Nlc3Mub24oJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yRXhpdFByb21pc2VzKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChmb3JjZUtpbGxQcm9taXNlcyk7XG4gIH0gZmluYWxseSB7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB9XG5cbiAgaWYgKGludGVycnVwdGVkU2lnbmFsKSB7XG4gICAgcmV0dXJuIGdldEV4aXRDb2RlKHVuZGVmaW5lZCwgaW50ZXJydXB0ZWRTaWduYWwpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0Jykge1xuICAgIHJldHVybiBmaXJzdFJlc3VsdCA/PyAxO1xuICB9XG4gIGlmIChzdG9wUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RvcFJlc3VsdDtcbiAgfVxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGdldEV4aXRDb2RlKGNvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGlmIChjb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29kZTtcbiAgfVxuICBpZiAoc2lnbmFsICYmIHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykge1xuICAgIHJldHVybiAxMjggKyBjb25zdGFudHMuc2lnbmFsc1tzaWduYWxdO1xuICB9XG4gIHJldHVybiAxO1xufVxuXG5mdW5jdGlvbiBzaG91bGRTdG9wT3RoZXJzKFxuICBleGl0Q29kZTogbnVtYmVyLFxuICBvcHRpb25zOiBQaWNrPFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMsICdraWxsT3RoZXJzJyB8ICdraWxsT3RoZXJzT25GYWlsJyB8ICdzdWNjZXNzJz5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gb3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnIHx8IG9wdGlvbnMua2lsbE90aGVycyB8fCAob3B0aW9ucy5raWxsT3RoZXJzT25GYWlsICYmIGV4aXRDb2RlICE9PSAwKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10sIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZm9yY2VLaWxsUGlkcyA9IHNpZ25hbFBpZHModG9DaGlsZFBpZHMoY2hpbGRyZW4pLCBzaWduYWwpO1xuICBpZiAoZm9yY2VLaWxsUGlkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBpZiAoYXdhaXQgd2FpdEZvckZvcmNlS2lsbChmb3JjZUtpbGxQaWRzKSkge1xuICAgIHNpZ25hbFBpZHMoZm9yY2VLaWxsUGlkcywgJ1NJR0tJTEwnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0NoaWxkUGlkcyhjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNoaWxkcmVuLmZsYXRNYXAoKGNoaWxkKSA9PiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQgPyBbXSA6IFtjaGlsZC5waWRdKSk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbFBpZHMocGlkczogcmVhZG9ubHkgbnVtYmVyW10sIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNpZ25hbGVkUGlkczogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBwaWQgb2YgcGlkcykge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWtpbGxQcm9jZXNzR3JvdXAocGlkLCBzaWduYWwpKSBjb250aW51ZTtcblxuICAgICAgc2lnbmFsZWRQaWRzLnB1c2gocGlkKTtcbiAgICAgIHRyZWVLaWxsKHBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8ga2lsbCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNpZ25hbGVkUGlkcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckZvcmNlS2lsbChwaWRzOiByZWFkb25seSBudW1iZXJbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBGT1JDRV9LSUxMX0RFTEFZX01TO1xuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgaWYgKHBpZHMuZXZlcnkoaXNQcm9jZXNzR3JvdXBHb25lKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgYXdhaXQgc2xlZXAoTWF0aC5taW4oMTAwLCBkZWFkbGluZSAtIERhdGUubm93KCkpKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNQcm9jZXNzR3JvdXBHb25lKHBpZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsIDApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZnVuY3Rpb24ga2lsbFByb2Nlc3NHcm91cChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcGlkLCBzaWduYWwpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuY29uc3QgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FID0gJ2xpdGVzdHJlYW0ueW1sJztcbmNvbnN0IERFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSCA9ICcvZXRjL2xpdGVzdHJlYW0ueW1sJztcblxuY29uc3QgUE9TU0lCTEVfUFJJU01BX1BBVEhTID0gW1xuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuXTtcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjbGVhblVwQ29tbWFuZCA9IGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgLy8gQ2xlYW51cCBleGlzdGluZyBhcnRpZmFjdHMgdG8gYXZvaWQgaXNzdWVzIHdpdGggTGl0ZXN0cmVhbSByZXBsaWNhdGlvbi5cbiAgICAvLyBOb3RlIHRoYXQgZG9uJ3QgbWVyZ2UgbXVsdGlwbGUgcm0gY29tbWFuZHMgaW50byBvbmUsIGJlY2F1c2UgaWYgb25lIGZhaWxzLCB0aGUgc3Vic2VxdWVudCBvbmVzIHdvbid0IHJ1bi5cbiAgICByZXR1cm4gYCR7Y2xlYW5VcENvbW1hbmR9OyBybSAtUmYgJHtkaXJQYXRofS8ucHJvZC5zcWxpdGUzKiB8fCB0cnVlYDtcbiAgfVxuXG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICBnZW5lcmF0ZShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gWydQUklTTUEgZ2VuZXJhdGUnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgcmVtb3ZlRGJDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgY29uc3QgbGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiA9IGdldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCk7XG4gICAgLy8gYHByaXNtYSBtaWdyYXRlIHJlc2V0YCBjYW4gZmFpbCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBleGlzdGluZyBkYXRhYmFzZSwgc28gd2UgcmVtb3ZlIGl0IGZpcnN0LlxuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgJHtyZW1vdmVEYkNvbW1hbmR9OyBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlICR7bGl0ZXN0cmVhbUNvbmZpZ09wdGlvbn0gLW8gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgbHMgLWFobCAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBBTExPV19UT19TS0lQX1NFRUQ9MCBQUklTTUEgbWlncmF0ZSBkZXBsb3lgO1xuICB9XG5cbiAgbGlzdEJhY2t1cHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4ICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0KX0gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfSAmJiAke3RoaXMuZ2VuZXJhdGUocHJvamVjdCl9ICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIGNvbnN0IHN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNsZWFudXBDb21tYW5kID0gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdCk7XG4gICAgaWYgKGNsZWFudXBDb21tYW5kKSBzdGVwcy5wdXNoKGNsZWFudXBDb21tYW5kKTtcbiAgICBjb25zdCByZXNldENvbW1hbmQgPSBbJ1BSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBzdGVwcy5wdXNoKHJlc2V0Q29tbWFuZCk7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikge1xuICAgICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgICAgc3RlcHMucHVzaCh0aGlzLnNlZWQocHJvamVjdCkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgcm0gLVJmICR7b3V0cHV0UGF0aH0qOyBsaXRlc3RyZWFtIHJlc3RvcmUgJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QpfSAtbyAke291dHB1dFBhdGh9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gICAgICBpZiAoYmFzZURpcikge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyLCBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKSk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvbW91bnQnIDogJ3ByaXNtYS9tb3VudCc7XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICBjb25zdCBsb2NhbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbENvbmZpZ1BhdGgpKSByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xuICBpZiAoZnMuZXhpc3RzU3luYyhERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgpKSByZXR1cm4gYC1jb25maWcgJHtERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEh9YDtcbiAgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1SZiBcIiR7ZGJQYXRofVwiKmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGlmIFsgLWYgXCIke2RiUGF0aH1cIiBdOyB0aGVuIHByaW50ZiAnUFJBR01BIHdhbF9jaGVja3BvaW50KFRSVU5DQVRFKTsnIHwgUFJJU01BIGRiIGV4ZWN1dGUgLS1zdGRpbiAtLXVybCBcIiR7RklMRV9TQ0hFTUF9JHtkYlBhdGh9XCI7IGZpICYmIHJtIC1mIFwiJHtkYlBhdGh9XCIuKiBcIiR7ZGJQYXRofVwiLSpgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd0RiUGF0aCA9IGRiVXJsLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkucmVwbGFjZSgvWz8jXS4qJC8sICcnKTtcbiAgaWYgKCFyYXdEYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKHJhd0RiUGF0aClcbiAgICA/IHJhd0RiUGF0aFxuICAgIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciA/PyAnLicsIHJhd0RiUGF0aCk7XG5cbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgZ2VuQ29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdnZW4tY29kZScsXG4gIGRlc2NyaWJlOiAnR2VuZXJhdGUgY29kZSBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VuQ29kZVRhcmdldHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1xuICAgICAgLm1hcCgocHJvamVjdCkgPT4gKHsgcHJvamVjdCwgc2NyaXB0czogZ2V0R2VuQ29kZVNjcmlwdHMocHJvamVjdCkgfSkpXG4gICAgICAuZmlsdGVyKCh7IHNjcmlwdHMgfSkgPT4gc2NyaXB0cy5sZW5ndGggPiAwKTtcbiAgICBpZiAoZ2VuQ29kZVRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ05vIGNvZGUgZ2VuZXJhdGlvbiBuZWVkZWQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCwgc2NyaXB0cyB9IG9mIGdlbkNvZGVUYXJnZXRzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJnZW4tY29kZVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG4gICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBzY3JpcHRzKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEdlbkNvZGVTY3JpcHRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ2JsaXR6JykpIHtcbiAgICBzY3JpcHRzLnB1c2goJ1lBUk4gYmxpdHogY29kZWdlbicpO1xuICAgIGlmIChwcm9qZWN0Lmhhc1ByaXNtYSkge1xuICAgICAgc2NyaXB0cy5wdXNoKHByaXNtYVNjcmlwdHMuZ2VuZXJhdGUocHJvamVjdCkpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChwcm9qZWN0Lmhhc1ByaXNtYSkge1xuICAgIHNjcmlwdHMucHVzaChwcmlzbWFTY3JpcHRzLmdlbmVyYXRlKHByb2plY3QpKTtcbiAgfVxuXG4gIGNvbnN0IGNoYWtyYVR5cGVnZW5TY3JpcHQgPSBnZXRDaGFrcmFTY3JpcHQocHJvamVjdCk7XG4gIGlmIChjaGFrcmFUeXBlZ2VuU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKGNoYWtyYVR5cGVnZW5TY3JpcHQpO1xuICB9XG5cbiAgY29uc3QgZHJpenpsZUNvbmZpZ1BhdGggPSBzY3JpcHRzLmxlbmd0aCA9PT0gMCAmJiBwcm9qZWN0Lmhhc0RyaXp6bGUgPyBnZXREcml6emxlQ29uZmlnUGF0aChwcm9qZWN0KSA6IHVuZGVmaW5lZDtcbiAgaWYgKGRyaXp6bGVDb25maWdQYXRoKSB7XG4gICAgc2NyaXB0cy5wdXNoKGBZQVJOIGRyaXp6bGUta2l0IGNoZWNrIC0tY29uZmlnICR7ZHJpenpsZUNvbmZpZ1BhdGh9IHx8IHRydWVgKTtcbiAgfVxuICByZXR1cm4gc2NyaXB0cztcbn1cblxuZnVuY3Rpb24gZ2V0Q2hha3JhU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnQGNoYWtyYS11aS9jbGknKSkgcmV0dXJuO1xuXG4gIGlmIChnZXRPd25EZXBlbmRlbmN5TWFqb3IocHJvamVjdCwgJ0BjaGFrcmEtdWkvY2xpJykgPT09IDIpIHtcbiAgICByZXR1cm4gJ1lBUk4gY2hha3JhLWNsaSB0b2tlbnMgc3JjL2NvcmUvdGhlbWUudHMnO1xuICB9XG4gIGlmIChmaWxlRXhpc3RzKHByb2plY3QsICdzcmMvdGhlbWUudHMnKSkge1xuICAgIHJldHVybiAnWUFSTiBjaGFrcmEgdHlwZWdlbiBzcmMvdGhlbWUudHMgLS1zdHJpY3QnO1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gZ2V0RHJpenpsZUNvbmZpZ1BhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbJ2RyaXp6bGUuY29uZmlnLnRzJywgJ2RyaXp6bGUuY29uZmlnLm10cycsICdkcml6emxlLmNvbmZpZy5qcycsICdkcml6emxlLmNvbmZpZy5tanMnXTtcbiAgcmV0dXJuIGNhbmRpZGF0ZXMuZmluZCgoZmlsZVBhdGgpID0+IGZpbGVFeGlzdHMocHJvamVjdCwgZmlsZVBhdGgpKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3duRGVwZW5kZW5jeU1ham9yKHByb2plY3Q6IFByb2plY3QsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gIGNvbnN0IHZlcnNpb24gPVxuICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgIHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXTtcbiAgY29uc3QgbWFqb3IgPSB2ZXJzaW9uPy5tYXRjaCgvXFxkKy91KT8uWzBdO1xuICByZXR1cm4gbWFqb3IgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE51bWJlcihtYWpvcik7XG59XG5cbmZ1bmN0aW9uIGZpbGVFeGlzdHMocHJvamVjdDogUHJvamVjdCwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBmaWxlUGF0aCkpO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG5jb25zdCBraWxsUG9ydElmTm9uQ2lCdWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBraWxsUG9ydElmTm9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2tpbGwtcG9ydC1pZi1ub24tY2knLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIHBvcnQgc3BlY2lmaWVkIGJ5IFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgbm9uLUNJLicsXG4gIGJ1aWxkZXI6IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGtpbGxQb3J0SWZOb25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydElmTm9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwIGtpbGxpbmcgcG9ydCBkdWUgdG8gQ0k6ICR7cHJvamVjdC5lbnYuQ0l9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9ydEVudiA9IHByb2plY3QuZW52LlBPUlQ7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhgS2lsbGluZyB0aGUgcG9ydDogJHtwb3J0fWApO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIXNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGUsIG91dHB1dCkpIHJldHVybjtcblxuICBjb25zdCBub3JtYWxpemVkT3V0cHV0ID0gbm9ybWFsaXplQnVmZmVyZWRPdXRwdXQob3V0cHV0KTtcbiAgaWYgKG5vcm1hbGl6ZWRPdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShub3JtYWxpemVkT3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV4aXRDb2RlICE9PSAwIHx8IGhhc1dhcm5pbmdPdXRwdXQob3V0cHV0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUJ1ZmZlcmVkT3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG91dHB1dC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1dhcm5pbmdPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGJ3YXJuKD86aW5nKT9zP1xcYi9pLnRlc3Qob3V0cHV0LnJlcGxhY2VBbGwoL1xcYig/OjB8bm8pIHdhcm5pbmdzP1xcYi9naSwgJycpKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsQ29tbWFuZChhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZykpLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke25hbWV9PSR7c2hlbGxFc2NhcGVBcmd1bWVudCh2YWx1ZSl9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gL15bXFx3Li86PSxAJSstXSskL3UudGVzdChhcmcpID8gYXJnIDogYCcke2FyZy5yZXBsYWNlQWxsKFwiJ1wiLCBgJ1wiJ1wiJ2ApfSdgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgQnVmZmVyZWRSdW5SZXN1bHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVTY3JpcHQsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmludEJ1ZmZlcmVkT3V0cHV0IH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmaXg6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpeCB0aGUgbGludGluZyBlcnJvcnMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZm9ybWF0OiB7XG4gICAgZGVzY3JpcHRpb246ICdGb3JtYXQgdGhlIGNvZGUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgcXVpZXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlcG9ydCBlcnJvcnMgb25seScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1ByaW50IG9ubHkgZmFpbGVkIG9yIHdhcm5pbmcgY29tbWFuZCBvdXRwdXQnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBmaWxlczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhzIHRvIGxpbnQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPFxuICB0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlclxuPjtcbmV4cG9ydCB0eXBlIExpbnRDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxMaW50Q29tbWFuZE9wdGlvbnM+ICYge1xuICAnLS0nPzogdW5rbm93bltdO1xuICBfOiB1bmtub3duW107XG4gIHByaW50QWxsT3V0cHV0PzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IG94bGludEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddKTtcbmNvbnN0IHB5dGhvbkV4dGVuc2lvbnMgPSBuZXcgU2V0KFsncHknXSk7XG5jb25zdCBkYXJ0RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydkYXJ0J10pO1xuY29uc3Qgb3hmbXRFeHRlbnNpb25zID0gbmV3IFNldChbXG4gIC4uLm94bGludEV4dGVuc2lvbnMsXG4gICdjc3MnLFxuICAnZ3FsJyxcbiAgJ2dyYXBocWwnLFxuICAnaGJzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnbGVzcycsXG4gICdtZCcsXG4gICdtZHgnLFxuICAnc2NzcycsXG4gICd0b21sJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdjanMnLFxuICAnY3NzJyxcbiAgJ2N0cycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqYXZhJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21kJyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc2NzcycsXG4gICd0cycsXG4gICd0c3gnLFxuICAndnVlJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJPbmx5RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uZmlsdGVyKChleHQpID0+ICFveGZtdEV4dGVuc2lvbnMuaGFzKGV4dCkpKTtcbmNvbnN0IHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4gPSAnISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqJztcblxudHlwZSBCdWZmZXJlZExpbnRSdW5SZXN1bHQgPSBCdWZmZXJlZFJ1blJlc3VsdCAmIHsgY29tbWFuZDogc3RyaW5nOyBjd2Q6IHN0cmluZyB9O1xudHlwZSBMaW50UnVuUmVzdWx0ID0gQnVmZmVyZWRMaW50UnVuUmVzdWx0IHwgeyBleGl0Q29kZTogbnVtYmVyIH07XG5pbnRlcmZhY2UgTGludFJ1bkNvbW1hbmQge1xuICBjb21tYW5kOiBzdHJpbmc7XG4gIHByb2plY3Q6IFByb2plY3Q7XG59XG5cbmV4cG9ydCBjb25zdCBsaW50Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBMaW50Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IGxpbnQoYXJndiBhcyBMaW50Q29tbWFuZEFyZ3YpO1xuICAgIGlmIChleGl0Q29kZSkgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW50KGFyZ3Y6IExpbnRDb21tYW5kQXJndik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gZ2V0TGludFRhcmdldEZpbGVzKGFyZ3YpO1xuICBjb25zdCBsaW50RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3Qgb3hmbXRGaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBweXRob25GaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHJldHRpZXJGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VKc29uRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IGZhbHNlO1xuICBsZXQgcHJldHRpZXJBcmdzOiBzdHJpbmdbXTtcbiAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3M6IHN0cmluZ1tdO1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbnRUYXJnZXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZSk7XG4gICAgICAgIGNvbnN0IGZpbGVLaW5kID0gYXdhaXQgZ2V0TGludFRhcmdldEZpbGVLaW5kKGZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIHsgZmlsZUtpbmQsIGZpbGVQYXRoIH07XG4gICAgICB9KVxuICAgICk7XG4gICAgZm9yIChjb25zdCB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9IG9mIGxpbnRUYXJnZXRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpIHx8XG4gICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC9maXh0dXJlcy8nKSB8fFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goLi4uZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKHByb2plY3RzLmRlc2NlbmRhbnRzLCBmaWxlUGF0aCwgZmlsZUtpbmQpKTtcblxuICAgICAgZm9yIChjb25zdCB7IGxpbnRQYXRoLCBwcm9qZWN0IH0gb2YgZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSkge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgcHl0aG9uRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBweXRob25GaWxlUGF0aHMgPSBweXRob25GaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIHB5dGhvbkZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIHB5dGhvbkZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwgJiYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBkYXJ0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBkYXJ0RmlsZVBhdGhzID0gZGFydEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgZGFydEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzKTtcbiAgICAgICAgICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0LCBleHRlbnNpb24pKSB7XG4gICAgICAgICAgY29uc3QgbGludEZpbGVQYXRocyA9IGxpbnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgbGludEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgbGludEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGJ1aWxkUHJldHRpZXJPbmx5RGlyZWN0b3J5UGF0dGVybihsaW50UGF0aCksIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBmb3JtYXR0ZXJQYXRoIG9mIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKHByb2plY3QsIGxpbnRQYXRoLCBmaWxlS2luZCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2goZm9ybWF0dGVyUGF0aCk7XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChhcmd2LmZvcm1hdCAmJiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCAmJiBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbikgJiYgIXByb2plY3QucHJlZmVycmVkTGludGVyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE5vIGxpbnRlciBmb3VuZCBmb3IgJHtwcm9qZWN0Lm5hbWV9LiBJbnN0YWxsIE94bGludC5gKSk7XG4gICAgICAgICAgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJldHRpZXJBcmdzID0gWy4uLm5ldyBTZXQocHJldHRpZXJGaWxlUGF0aHMpXTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gWy4uLm5ldyBTZXQocGFja2FnZUpzb25GaWxlUGF0aHMpXTtcbiAgfSBlbHNlIHtcbiAgICBwcmV0dGllckFyZ3MgPSBidWlsZFByZXR0aWVyQXJncyhwcm9qZWN0cy5zZWxmLmRpclBhdGgsIHByb2plY3RzLmRlc2NlbmRhbnRzKTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwKSA9PiBwLnBhY2thZ2VKc29uUGF0aCk7XG4gIH1cblxuICBjb25zdCBmb3JtYXR0ZXJDb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSA9IFtdO1xuICBjb25zdCBsaW50ZXJDb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSA9IFtdO1xuICBjb25zdCBsaW50UnVuT3B0aW9ucyA9IHsgZXhpdElmRmFpbGVkOiBmYWxzZSwgcHJlc2VydmVDb2xvcjogIWFyZ3YucHJpbnRBbGxPdXRwdXQgfSBhcyBjb25zdDtcbiAgY29uc3Qgc2hvdWxkUnVuRm9ybWF0dGVycyA9IEJvb2xlYW4oYXJndi5mb3JtYXQpO1xuICBjb25zdCBzaG91bGRSdW5MaW50ZXJzID0gIWFyZ3YuZm9ybWF0IHx8IGFyZ3YuZml4O1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBsaW50RmlsZVBhdGhzXSBvZiBsaW50RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2LCBsaW50RmlsZVBhdGhzKTtcbiAgICAgICAgaWYgKCFsaW50Q29tbWFuZCkgY29udGludWU7XG5cbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGxpbnRDb21tYW5kLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBweXRob25GaWxlUGF0aHNdIG9mIHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndiwgcHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQocHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgZGFydEZpbGVQYXRoc10gb2YgZGFydEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydExpbnRDb21tYW5kKGRhcnRGaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoZGFydEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBveGZtdEZpbGVQYXRoc10gb2Ygb3hmbXRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkT3hmbXRDb21tYW5kKG94Zm10RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyB8fCBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndik7XG4gICAgICAgICAgaWYgKGxpbnRDb21tYW5kKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogbGludENvbW1hbmQsIHByb2plY3QgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndiksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0TGludENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10KSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRPeGZtdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCkgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgbGludEV4aXRDb2RlczogbnVtYmVyW10gPSBbXTtcblxuICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgIGNvbnN0IGZvcm1hdHRlclJlc3VsdHMgPSBhd2FpdCBydW5MaW50Q29tbWFuZHMoZm9ybWF0dGVyQ29tbWFuZHMsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKTtcbiAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKGZvcm1hdHRlclJlc3VsdHMsIGFyZ3YpO1xuICAgIGxpbnRFeGl0Q29kZXMucHVzaCguLi5mb3JtYXR0ZXJSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUpKTtcblxuICAgIGlmIChsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgIGlmIChwcmV0dGllckFyZ3MubGVuZ3RoID4gMCAmJiBwcm9qZWN0cy5zZWxmLmhhc1ByZXR0aWVyKSB7XG4gICAgICBjb25zdCBwcmV0dGllclJlc3VsdCA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kKFxuICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICAgJ1lBUk4nLFxuICAgICAgICAgICdwcmV0dGllcicsXG4gICAgICAgICAgJy0tY2FjaGUnLFxuICAgICAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgICAgICAnLS13cml0ZScsXG4gICAgICAgICAgJy0tJyxcbiAgICAgICAgICAuLi5wcmV0dGllckFyZ3MsXG4gICAgICAgIF0pLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICBsaW50UnVuT3B0aW9uc1xuICAgICAgKTtcbiAgICAgIHByaW50U2lsZW50TGludE91dHB1dHMoW3ByZXR0aWVyUmVzdWx0XSwgYXJndik7XG4gICAgICBsaW50RXhpdENvZGVzLnB1c2gocHJldHRpZXJSZXN1bHQuZXhpdENvZGUpO1xuICAgIH1cbiAgICBpZiAoc29ydFBhY2thZ2VKc29uQXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzb3J0UGFja2FnZUpzb25SZXN1bHQgPSBhd2FpdCBydW5MaW50Q29tbWFuZChcbiAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoWydZQVJOJywgJ3NvcnQtcGFja2FnZS1qc29uJywgJy0tJywgLi4uc29ydFBhY2thZ2VKc29uQXJnc10pLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICBsaW50UnVuT3B0aW9uc1xuICAgICAgKTtcbiAgICAgIHByaW50U2lsZW50TGludE91dHB1dHMoW3NvcnRQYWNrYWdlSnNvblJlc3VsdF0sIGFyZ3YpO1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKHNvcnRQYWNrYWdlSnNvblJlc3VsdC5leGl0Q29kZSk7XG4gICAgfVxuXG4gICAgaWYgKGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICBjb25zdCBsaW50ZXJSZXN1bHRzID0gYXdhaXQgcnVuTGludENvbW1hbmRzKGxpbnRlckNvbW1hbmRzLCBhcmd2LCBsaW50UnVuT3B0aW9ucyk7XG4gICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhsaW50ZXJSZXN1bHRzLCBhcmd2KTtcbiAgICBsaW50RXhpdENvZGVzLnB1c2goLi4ubGludGVyUmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0LmV4aXRDb2RlKSk7XG4gIH1cblxuICByZXR1cm4gbGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApID8gMSA6IDA7XG59XG5cbmZ1bmN0aW9uIHJ1bkxpbnRDb21tYW5kcyhcbiAgY29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10sXG4gIGFyZ3Y6IExpbnRDb21tYW5kQXJndixcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduSW5QYXJhbGxlbD5bM11cbik6IFByb21pc2U8TGludFJ1blJlc3VsdFtdPiB7XG4gIHJldHVybiBQcm9taXNlLmFsbChjb21tYW5kcy5tYXAoKHsgY29tbWFuZCwgcHJvamVjdCB9KSA9PiBydW5MaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKSkpO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHQ+IHtcbiAgaWYgKGFyZ3Yuc2lsZW50KSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKHJlc3VsdCkgPT4gKHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIGNvbW1hbmQ6IG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLFxuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgfSkpO1xuICB9XG4gIHJldHVybiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKGV4aXRDb2RlKSA9PiAoeyBleGl0Q29kZSB9KSk7XG59XG5cbmZ1bmN0aW9uIHByaW50U2lsZW50TGludE91dHB1dHMoXG4gIHJlc3VsdHM6IExpbnRSdW5SZXN1bHRbXSxcbiAgYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICdwcmludEFsbE91dHB1dCcgfCAnc2lsZW50Jz5cbik6IHZvaWQge1xuICBjb25zdCBwcmludGFibGVSZXN1bHRzID1cbiAgICBhcmd2LnNpbGVudCAmJiAhYXJndi5wcmludEFsbE91dHB1dCA/IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+IHJlc3VsdC5leGl0Q29kZSAhPT0gMCkgOiByZXN1bHRzO1xuICBpZiAocHJpbnRhYmxlUmVzdWx0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBwcmludGFibGVSZXN1bHRzKSB7XG4gICAgaWYgKCEoJ291dHB1dCcgaW4gcmVzdWx0KSkgY29udGludWU7XG5cbiAgICBpZiAoYXJndi5wcmludEFsbE91dHB1dCkge1xuICAgICAgcHJpbnRDb21tYW5kT3V0cHV0KHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhcmd2LnNpbGVudCkge1xuICAgICAgICBwcmludENvbW1hbmRIZWFkZXIocmVzdWx0LmNvbW1hbmQsIHJlc3VsdC5jd2QpO1xuICAgICAgfVxuICAgICAgcHJpbnRCdWZmZXJlZE91dHB1dChyZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5vdXRwdXQpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRPdXRwdXQocmVzdWx0OiBCdWZmZXJlZExpbnRSdW5SZXN1bHQpOiB2b2lkIHtcbiAgcHJpbnRDb21tYW5kSGVhZGVyKHJlc3VsdC5jb21tYW5kLCByZXN1bHQuY3dkKTtcblxuICBpZiAocmVzdWx0LmV4aXRDb2RlID09PSAwICYmIHNob3VsZFN1cHByZXNzU3VjY2Vzc2Z1bFZlcmlmeU91dHB1dChyZXN1bHQuY29tbWFuZCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dC50cmltKCk7XG4gIGlmIChvdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRIZWFkZXIoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3VwcHJlc3NTdWNjZXNzZnVsVmVyaWZ5T3V0cHV0KGNvbW1hbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnIG94Zm10ICcpIHx8IGNvbW1hbmQuaW5jbHVkZXMoJyBzb3J0LXBhY2thZ2UtanNvbiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTGludENvbW1hbmQoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcic+LFxuICBhcmd2OiBQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ2ZpeCcgfCAnZm9ybWF0Jz4gJiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sXG4gIGZpbGVzPzogc3RyaW5nW11cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ294bGludCcsXG4gICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAuLi4oYXJndi5xdWlldCA/IFsnLS1xdWlldCddIDogW10pLFxuICAgICAgLi4uKGFyZ3YuZml4ID8gWyctLWZpeCddIDogW10pLFxuICAgICAgLi4uKGZpbGVzID8/IFsnLiddKSxcbiAgICBdKTtcbiAgfVxuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE94Zm10Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAnWUFSTicsXG4gICAgJ294Zm10JyxcbiAgICAnLS13cml0ZScsXG4gICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgJyEqKi9wYWNrYWdlLmpzb24nLFxuICBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICByZXR1cm4gW1xuICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdpc29ydCcsICctLXByb2ZpbGUnLCAnYmxhY2snLCAnLS1maWx0ZXItZmlsZXMnLCAuLi50YXJnZXRzXSksXG4gICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2JsYWNrJywgLi4udGFyZ2V0c10pLFxuICBdLmpvaW4oJyAmJiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndjogUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LCBmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2ZsYWtlOCcsIC4uLihhcmd2LnF1aWV0ID8gWyctcSddIDogW10pLCAuLi50YXJnZXRzXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERhcnRGb3JtYXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ2RhcnQnLCAnZm9ybWF0JywgLi4udGFyZ2V0c10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREYXJ0TGludENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnZGFydCcsICdhbmFseXplJywgLi4udGFyZ2V0c10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQcmV0dGllckFyZ3MoXG4gIHNlbGZEaXJQYXRoOiBzdHJpbmcsXG4gIHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz5bXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzID0gbmV3IFNldDxzdHJpbmc+KFtgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuXSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmICghbmVlZHNQcmV0dGllcihwcm9qZWN0KSkgY29udGludWU7XG5cbiAgICBjb25zdCBwcm9qZWN0UGF0dGVybiA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcqKi97LiovLH0qLnsnICsgWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uam9pbignLCcpICsgJ30nKTtcbiAgICBhcmdzLmFkZChwYXRoLnJlbGF0aXZlKHNlbGZEaXJQYXRoLCBwcm9qZWN0UGF0dGVybikgfHwgcHJvamVjdFBhdHRlcm4pO1xuICB9XG4gIHJldHVybiBbLi4uYXJnc107XG59XG5cbmZ1bmN0aW9uIGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzOiBQcm9qZWN0W10sIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgbGV0IG93bmluZ1Byb2plY3Q6IFByb2plY3QgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmIChcbiAgICAgIChmaWxlUGF0aCA9PT0gcHJvamVjdC5kaXJQYXRoIHx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7cHJvamVjdC5kaXJQYXRofS9gKSkgJiZcbiAgICAgICghb3duaW5nUHJvamVjdCB8fCBwcm9qZWN0LmRpclBhdGgubGVuZ3RoID4gb3duaW5nUHJvamVjdC5kaXJQYXRoLmxlbmd0aClcbiAgICApIHtcbiAgICAgIG93bmluZ1Byb2plY3QgPSBwcm9qZWN0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3duaW5nUHJvamVjdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExpbnRUYXJnZXRGaWxlcyhhcmd2OiBQaWNrPExpbnRDb21tYW5kQXJndiwgJy0tJyB8ICdfJyB8ICdmaWxlcyc+KTogc3RyaW5nW10ge1xuICBjb25zdCBsaW50VGFyZ2V0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIFsuLi4oYXJndi5maWxlcyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXSkge1xuICAgIGxpbnRUYXJnZXRzLmFkZChTdHJpbmcodmFsdWUpKTtcbiAgfVxuICByZXR1cm4gWy4uLmxpbnRUYXJnZXRzXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTwnZGlyZWN0b3J5JyB8ICdvdGhlcic+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSByZXR1cm4gJ2RpcmVjdG9yeSc7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE1pc3NpbmcgcGF0aHMgYXJlIGhhbmRsZWQgYnkgdGhlIGRvd25zdHJlYW0gdG9vbHMuXG4gIH1cblxuICByZXR1cm4gJ290aGVyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllcihcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+LFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0Lmhhc094Zm10KSByZXR1cm4gb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICBpZiAobmVlZHNQcmV0dGllcihwcm9qZWN0KSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBwcmV0dGllck9ubHlFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJyxcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gIH1cbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBuZWVkc1ByZXR0aWVyKHByb2plY3QpKSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl07XG4gIH1cbiAgaWYgKHNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllcihwcm9qZWN0LCBleHRlbnNpb24pKSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4oZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmpvaW4oZmlsZVBhdGgsIGAqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9fWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb25QYXRoJz5bXSxcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJ1xuKTogc3RyaW5nW10ge1xuICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSByZXR1cm4gW107XG4gIHJldHVybiBwcm9qZWN0c1xuICAgIC5maWx0ZXIoXG4gICAgICAocHJvamVjdCkgPT5cbiAgICAgICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGggPT09IHBhdGguam9pbihmaWxlUGF0aCwgJ3BhY2thZ2UuanNvbicpIHx8XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoLnN0YXJ0c1dpdGgoYCR7ZmlsZVBhdGh9L2ApXG4gICAgKVxuICAgIC5tYXAoKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb25QYXRoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0TGludFRhcmdldHMoXG4gIHByb2plY3RzOiBQcm9qZWN0W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHsgbGludFBhdGg6IHN0cmluZzsgcHJvamVjdDogUHJvamVjdCB9W10ge1xuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknKSB7XG4gICAgY29uc3QgZGVzY2VuZGFudFByb2plY3RzID0gcHJvamVjdHMuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+IHByb2plY3QuZGlyUGF0aCA9PT0gZmlsZVBhdGggfHwgcHJvamVjdC5kaXJQYXRoLnN0YXJ0c1dpdGgoYCR7ZmlsZVBhdGh9L2ApXG4gICAgKTtcbiAgICBpZiAoZGVzY2VuZGFudFByb2plY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBkZXNjZW5kYW50UHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiAoeyBsaW50UGF0aDogcHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0IH0pKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gZmluZE93bmluZ1Byb2plY3QocHJvamVjdHMsIGZpbGVQYXRoKTtcbiAgcmV0dXJuIHByb2plY3QgPyBbeyBsaW50UGF0aDogZmlsZVBhdGgsIHByb2plY3QgfV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPiwgZXh0ZW5zaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50JykgcmV0dXJuIG94bGludEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbmVlZHNQcmV0dGllcihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4pOiBib29sZWFuIHtcbiAgcmV0dXJuICFwcm9qZWN0Lmhhc094Zm10ICYmIHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50Jztcbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCwgcHJpbnRTdGFydCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuaW1wb3J0IHsgaXNQb3J0QXZhaWxhYmxlIH0gZnJvbSAnLi9wb3J0LmpzJztcblxuY29uc3Qga2lsbGVkID0gbmV3IFNldDxudW1iZXIgfCBzdHJpbmc+KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQpO1xuICBpZiAoIWF2YWlsYWJsZSkge1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfVxuXG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHBvcnQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHBvcnQpO1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBXZSBzaG91bGQgc3RvcCBEb2NrZXIgY29udGFpbmVycyBmaXJzdCBiZWNhdXNlIGBraWxsLXBvcnRgIG1heSBmYWlsIHRvIHN0b3AgRG9ja2VyIGNvbnRhaW5lcnMuXG4gIGF3YWl0IHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydCwgcHJvamVjdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzKHBvcnQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeUltYWdlTmFtZShpbWFnZU5hbWU6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgbmFtZT0ke2ltYWdlTmFtZX1gXSwgcHJvamVjdCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgcHVibGlzaD0ke3BvcnR9YF0sIHByb2plY3QpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJDb250YWluZXJzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGFpbmVySWRzID0gYXdhaXQgbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzLCBwcm9qZWN0KTtcbiAgICBpZiAoY29udGFpbmVySWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydybScsICctZicsIC4uLmNvbnRhaW5lcklkc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3BzJywgJy1xJywgLi4uZmlsdGVyQXJnc10sIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IHByb2plY3QuZW52LFxuICB9KTtcbiAgcmV0dXJuIHN0ZG91dFxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoaWQpID0+IGlkLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGNyZWF0ZVNlcnZlciB9IGZyb20gJ25vZGU6bmV0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IH0gZnJvbSAnLi9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBDaGVja3MgdGhlIGdpdmVuIHBvcnQgYW5kIGtpbGxzIGFueSBwcm9jZXNzIHVzaW5nIGl0LlxuICogTm90ZSB3YiBhbHdheXMgcmVxdWlyZXMgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHJhd1BvcnQ6IHVua25vd24sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHJhd1BvcnQpO1xuICBpZiAoIXBvcnQpIHRocm93IG5ldyBFcnJvcihgVGhlIGdpdmVuIHBvcnQgKCR7cG9ydH0pIGlzIGludmFsaWQuYCk7XG5cbiAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydCwgcHJvamVjdCk7XG4gIHJldHVybiBwb3J0O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHBvcnQgaXMgYXZhaWxhYmxlLlxuICogQHBhcmFtIHBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gY2hlY2tcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHBvcnQgaXMgYXZhaWxhYmxlLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzUG9ydEF2YWlsYWJsZShwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gQ2hlY2sgYm90aCBzdGFja3MgdG8gY2F0Y2ggcHJvY2Vzc2VzIGJvdW5kIG9ubHkgb24gSVB2NiBvciBJUHY0LlxuICBmb3IgKGNvbnN0IGhvc3Qgb2YgWycxMjcuMC4wLjEnLCAnOjonXSkge1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IHByb2JlUG9ydChob3N0LCBwb3J0KTtcbiAgICBpZiAoIWF2YWlsYWJsZSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9iZVBvcnQoaG9zdDogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gY3JlYXRlU2VydmVyKCk7XG5cbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUZOT1NVUFBPUlQnKSB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLm9uY2UoJ2xpc3RlbmluZycsICgpID0+IHtcbiAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgaG9zdCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNQb3J0QXZhaWxhYmxlIH0gZnJvbSAnLi4vdXRpbHMvcG9ydC5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcbnR5cGUgTWFpbnRlbmFuY2VBcmd2ID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4gJiB7XG4gIGFjdGlvbjogJ3N0YXJ0JyB8ICdzdG9wJztcbn07XG5jb25zdCBtYWludGVuYW5jZUh0bWwgPSBgPCFkb2N0eXBlIGh0bWw+XG48aHRtbCBsYW5nPVwiamFcIj5cbiAgPGhlYWQ+XG4gICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCI+XG4gICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCI+XG4gICAgPHRpdGxlPuODoeODs+ODhuODiuODs+OCueS4rTwvdGl0bGU+XG4gICAgPHN0eWxlPlxuICAgICAgYm9keSB7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICAgIGNvbG9yOiAjMTExODI3O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBcIlNlZ29lIFVJXCIsIHNhbnMtc2VyaWY7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDEwMHZoO1xuICAgICAgfVxuXG4gICAgICBtYWluIHtcbiAgICAgICAgcGFkZGluZzogMjRweDtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgfVxuXG4gICAgICBoMSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMjhweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICAgICAgbWFyZ2luOiAwIDAgMTZweDtcbiAgICAgIH1cblxuICAgICAgcCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuODtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvaGVhZD5cbiAgPGJvZHk+XG4gICAgPG1haW4+XG4gICAgICA8aDE+54++5Zyo44Oh44Oz44OG44OK44Oz44K55Lit44Gn44GZPC9oMT5cbiAgICAgIDxwPueahuanmOOBq+OBr+OBlOS4jeS+v+OCkuOBiuOBi+OBkeOBl+OBvuOBmeOBjOOAgeODoeODs+ODhuODiuODs+OCuee1guS6huOBvuOBp+OBl+OBsOOCieOBj+OBiuW+heOBoeOBj+OBoOOBleOBhOOAgjwvcD5cbiAgICA8L21haW4+XG4gIDwvYm9keT5cbjwvaHRtbD5gO1xuXG5mdW5jdGlvbiBnZXRNYWludGVuYW5jZVNlcnZlclNvdXJjZShwb3J0OiBudW1iZXIsIHBpZFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmcucmF3YFxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcblxuY29uc3QgcGlkUGF0aCA9ICR7SlNPTi5zdHJpbmdpZnkocGlkUGF0aCl9O1xuXG5jb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcigoX3JlcXVlc3QsIHJlc3BvbnNlKSA9PiB7XG4gIHJlc3BvbnNlLndyaXRlSGVhZCg1MDMsIHtcbiAgICAnY2FjaGUtY29udHJvbCc6ICduby1zdG9yZScsXG4gICAgJ2NvbnRlbnQtdHlwZSc6ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnLFxuICB9KTtcbiAgcmVzcG9uc2UuZW5kKCR7SlNPTi5zdHJpbmdpZnkobWFpbnRlbmFuY2VIdG1sKX0pO1xufSk7XG5cbnNlcnZlci5vbignZXJyb3InLCAoKSA9PiB7XG4gIHRyeSB7XG4gICAgZnMucm1TeW5jKHBpZFBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICBwcm9jZXNzLmV4aXQoMSk7XG59KTtcblxuc2VydmVyLmxpc3Rlbigke3BvcnR9LCAnMC4wLjAuMCcsICgpID0+IHtcbiAgZnMud3JpdGVGaWxlU3luYyhwaWRQYXRoLCBTdHJpbmcocHJvY2Vzcy5waWQpICsgJ1xcbicpO1xufSk7XG5gO1xufVxuXG5leHBvcnQgY29uc3QgbWFpbnRlbmFuY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIE1haW50ZW5hbmNlQXJndj4gPSB7XG4gIGNvbW1hbmQ6ICdtYWludGVuYW5jZSA8YWN0aW9uPicsXG4gIGRlc2NyaWJlOiAnU3RhcnQgb3Igc3RvcCBhIGxpZ2h0d2VpZ2h0IG1haW50ZW5hbmNlIHBhZ2Ugc2VydmVyLiBFeGFtcGxlOiB3YiBtYWludGVuYW5jZSBzdGFydCcsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT5cbiAgICB5YXJnc1xuICAgICAgLnBvc2l0aW9uYWwoJ2FjdGlvbicsIHtcbiAgICAgICAgY2hvaWNlczogWydzdGFydCcsICdzdG9wJ10gYXMgY29uc3QsXG4gICAgICAgIGRlc2NyaWJlOiAnTWFpbnRlbmFuY2Ugc2VydmVyIGFjdGlvbicsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgfSlcbiAgICAgIC5vcHRpb25zKGJ1aWxkZXIpIGFzIHVua25vd24gYXMgQXJndjxNYWludGVuYW5jZUFyZ3Y+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbiA9IGFyZ3YuYWN0aW9uO1xuICAgIGlmIChwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0Jykge1xuICAgICAgY29uc29sZS5pbmZvKGBTa2lwIG1haW50ZW5hbmNlICR7YWN0aW9ufSBiZWNhdXNlIFdCX0VOViBpcyB0ZXN0LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSBwYXJzZVBvcnQocHJvamVjdC5lbnYuUE9SVCk7XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3N0YXJ0Jykge1xuICAgICAgYXdhaXQgc3RhcnRNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0LCBwb3J0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3N0b3AnKSB7XG4gICAgICBzdG9wTWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdCwgcG9ydCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG1haW50ZW5hbmNlIGFjdGlvbjogJHthY3Rpb259YCk7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwaWRQYXRoID0gZ2V0UGlkUGF0aChwcm9qZWN0LCBwb3J0KTtcbiAgY29uc3QgZXhpc3RpbmdQaWQgPSByZWFkUGlkKHBpZFBhdGgpO1xuICBpZiAoZXhpc3RpbmdQaWQgIT09IHVuZGVmaW5lZCAmJiBpc1Byb2Nlc3NSdW5uaW5nKGV4aXN0aW5nUGlkKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgTWFpbnRlbmFuY2Ugc2VydmVyIGlzIGFscmVhZHkgcnVubmluZyBvbiBwb3J0ICR7cG9ydH0uYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJlbW92ZVBpZEZpbGUocGlkUGF0aCk7XG5cbiAgaWYgKCEoYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQpKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBQb3J0ICR7cG9ydH0gaXMgYWxyZWFkeSBpbiB1c2UuYCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKHBpZFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBjaGlsZCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oXG4gICAgcHJvY2Vzcy5leGVjUGF0aCxcbiAgICBbJy0taW5wdXQtdHlwZT1tb2R1bGUnLCAnLS1ldmFsJywgZ2V0TWFpbnRlbmFuY2VTZXJ2ZXJTb3VyY2UocG9ydCwgcGlkUGF0aCldLFxuICAgIHtcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAnaWdub3JlJyxcbiAgICB9XG4gICk7XG4gIGlmIChjaGlsZC5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHN0YXJ0IG1haW50ZW5hbmNlIHNlcnZlci4nKTtcbiAgfVxuXG4gIGNoaWxkLnVucmVmKCk7XG4gIGF3YWl0IHdhaXRGb3JQaWRGaWxlKHBpZFBhdGgsIGNoaWxkLnBpZCk7XG4gIGNvbnNvbGUuaW5mbyhgU3RhcnRlZCBtYWludGVuYW5jZSBzZXJ2ZXIgb24gcG9ydCAke3BvcnR9LmApO1xufVxuXG5mdW5jdGlvbiBzdG9wTWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IHBpZFBhdGggPSBnZXRQaWRQYXRoKHByb2plY3QsIHBvcnQpO1xuICBjb25zdCBwaWQgPSByZWFkUGlkKHBpZFBhdGgpO1xuICBpZiAocGlkID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zb2xlLmluZm8oYE1haW50ZW5hbmNlIHNlcnZlciBpcyBub3QgcnVubmluZyBvbiBwb3J0ICR7cG9ydH0uYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCAnU0lHVEVSTScpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmVtb3ZlUGlkRmlsZShwaWRQYXRoKTtcbiAgY29uc29sZS5pbmZvKGBTdG9wcGVkIG1haW50ZW5hbmNlIHNlcnZlciBvbiBwb3J0ICR7cG9ydH0uYCk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUG9ydChwb3J0RW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBhc3NlcnQub2soTnVtYmVyLmlzSW50ZWdlcihwb3J0KSAmJiBwb3J0ID4gMCwgYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApO1xuICByZXR1cm4gcG9ydDtcbn1cblxuZnVuY3Rpb24gZ2V0UGlkUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcudG1wJywgYHdiLW1haW50ZW5hbmNlLXNlcnZlci0ke3BvcnR9LnBpZGApO1xufVxuXG5mdW5jdGlvbiByZWFkUGlkKHBpZFBhdGg6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGlkID0gTnVtYmVyKGZzLnJlYWRGaWxlU3luYyhwaWRQYXRoLCAndXRmOCcpLnRyaW0oKSk7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIocGlkKSAmJiBwaWQgPiAwID8gcGlkIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQcm9jZXNzUnVubmluZyhwaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwaWQsIDApO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlUGlkRmlsZShwaWRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBmcy5ybVN5bmMocGlkUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JQaWRGaWxlKHBpZFBhdGg6IHN0cmluZywgcGlkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgNTAwMDtcbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIGlmIChyZWFkUGlkKHBpZFBhdGgpICE9PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBpZiAoIWlzUHJvY2Vzc1J1bm5pbmcocGlkKSkgYnJlYWs7XG4gICAgYXdhaXQgc2V0VGltZW91dCg1MCk7XG4gIH1cblxuICByZW1vdmVQaWRGaWxlKHBpZFBhdGgpO1xuICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBtYWludGVuYW5jZSBzZXJ2ZXIuJyk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbi8vIFRoZXNlIHRvb2xzIGFyZSBkZWNsYXJlZCBhcyBkZXZEZXBlbmRlbmNpZXMgaW4gc291cmNlIHJlcG9zLCBidXQgb3B0aW1pemVkIERvY2tlclxuLy8gcGFja2FnZS5qc29uIGZpbGVzIHN0aWxsIG5lZWQgdGhlbSBmb3IgaW4taW1hZ2UgY29kZWdlbi9idWlsZCBzdGVwcy5cbmNvbnN0IHJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMgPSBbJ0B3aWxsYm9vc3Rlci93YicsICdidWlsZC10cyddO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBvdXRzaWRlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBvcHRpbWl6YXRpb24gaXMgZXhlY3V0ZWQgb3V0c2lkZSBhIGRvY2tlciBjb250YWluZXIgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJyxcbiAgZGVzY3JpYmU6ICdPcHRpbWl6ZSBjb25maWd1cmF0aW9uIHdoZW4gYnVpbGRpbmcgYSBEb2NrZXIgaW1hZ2UnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gICAgICBjb25zdCBrZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldID8/IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwcykpIHtcbiAgICAgICAgICBpZiAodmFsdWU/LnN0YXJ0c1dpdGgoJ2dpdEBnaXRodWIuY29tOicpKSB7XG4gICAgICAgICAgICAvLyBEb2NrZXIgYnVpbGRzIGNhbm5vdCBhY2Nlc3MgcHJpdmF0ZSBTU0ggVVJMcyB1bmxlc3MgY3JlZGVudGlhbHMgYXJlIGZvcndhcmRlZC5cbiAgICAgICAgICAgIC8vIFRoZSBEb2NrZXJmaWxlIGNvcGllcyB0aG9zZSB3b3Jrc3BhY2UgcGFja2FnZXMgaW50byB0aGUgaW1hZ2UgaW5zdGVhZC5cbiAgICAgICAgICAgIGRlcHNbbmFtZV0gPSBgLi8ke25hbWV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgICAgaWYgKGFyZ3Yub3V0c2lkZSkge1xuICAgICAgICBhd2FpdCB3cml0ZURvY2tlclNoZWxsU2NyaXB0cyhwYXRoLmpvaW4oZGlzdERpclBhdGgsICdiYXNoJykpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFhcmd2Lm91dHNpZGUpIHtcbiAgICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmluZm8oJ0luc3RhbGxlZCBkZXBlbmRlbmNpZXMuJyk7XG4gICAgfVxuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZURpclBhdGggPSBmaW5kRG9ja2VyU2hlbGxTY3JpcHRzRGlyUGF0aCgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihzb3VyY2VEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0ZpbGUoKSB8fCAhZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5zaCcpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHRhcmdldEZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5jb3B5RmlsZShwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCB0YXJnZXRGaWxlUGF0aCk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuY2htb2QodGFyZ2V0RmlsZVBhdGgsIDBvNzU1KTtcbiAgfVxuICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCBEb2NrZXIgc2hlbGwgc2NyaXB0czogJHtwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGRpclBhdGgpIHx8IGRpclBhdGh9YCk7XG59XG5cbmZ1bmN0aW9uIGZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoKCk6IHN0cmluZyB7XG4gIGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAnZG9ja2VyJywgJ2Jhc2gnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvY2tlciBzaGVsbCBzY3JpcHRzIGRpcmVjdG9yeSBub3QgZm91bmQuJyk7XG4gICAgfVxuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIHByb21vdGVSdW50aW1lRGV2RGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uKTtcbiAgaWYgKGFyZ3Yub3V0c2lkZSkge1xuICAgIC8vIE91dHNpZGUgb3B0aW1pemF0aW9uIHdyaXRlcyBkaXN0L3BhY2thZ2UuanNvbiBiZWZvcmUgRG9ja2VyIGJ1aWxkcyB0aGUgYXBwLlxuICAgIC8vIEtlZXAgYnVpbGQtdGltZSBwYWNrYWdlcyBmb3IgdGhhdCBsYXRlciBpbi1pbWFnZSBidWlsZCBhbmQgcmVtb3ZlIG9ubHkga25vd24gbm9uLWJ1aWxkIHRvb2xpbmcuXG4gICAgcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb24pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEluc2lkZSBEb2NrZXIsIGNvZGVnZW4vYnVpbGQgaGFzIGFscmVhZHkgZmluaXNoZWQsIHNvIHByb2R1Y3Rpb24gaW5zdGFsbCBzaG91bGQgbm90IHNlZSBkZXYgdG9vbGluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyBJbiAtLW91dHNpZGUgbW9kZSwgRG9ja2VyIHN0aWxsIHJ1bnMgY29kZWdlbi9idWlsZCBiZWZvcmUgYSBzZWNvbmQgaW4taW1hZ2Ugb3B0aW1pemF0aW9uLlxuICAvLyBSZW1vdmUgb25seSB0b29saW5nIHRoYXQgaXMgbm90IG5lZWRlZCBmb3IgdGhhdCBidWlsZCBwaGFzZS5cbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAncmFpbHdheScsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBjb25zdCByZW1vdmVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIC8vIFNoYXJlZCBjb25maWcgcGFja2FnZXMgYXJlIG5lZWRlZCBvbmx5IGZvciBsaW50L2Zvcm1hdC90ZXN0IGNvbW1hbmRzLCBub3QgRG9ja2VyIGJ1aWxkcy5cbiAgICAgIChuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gcHJvbW90ZVJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcHJvbW90ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgcnVudGltZURldkRlcGVuZGVuY2llcykge1xuICAgIGNvbnN0IHZlcnNpb24gPSBkZXZEZXBzW25hbWVdO1xuICAgIGlmICghdmVyc2lvbikgY29udGludWU7XG4gICAgaWYgKCFkZXBlbmRlbmNpZXNbbmFtZV0pIHtcbiAgICAgIGRlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG4gICAgICBwcm9tb3RlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gIH1cbiAgaWYgKHByb21vdGVkRGVwcy5sZW5ndGggPiAwKSB7XG4gICAgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzO1xuICB9XG4gIGNvbnNvbGUuaW5mbygnUHJvbW90ZWQgcnVudGltZSBkZXZEZXBlbmRlbmNpZXM6JywgcHJvbW90ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLnN0YXJ0c1dpdGgod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgICAgcmVtb3ZlZFNjcmlwdHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIHNjcmlwdHM6JywgcmVtb3ZlZFNjcmlwdHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuXG5jbGFzcyBEcml6emxlU2NyaXB0cyB7XG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlbW92ZUNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0KTtcbiAgICBpZiAoIXJlbW92ZUNvbW1hbmQpIHtcbiAgICAgIHJldHVybiBcImVjaG8gJ3diIGRiIHJlc2V0IHN1cHBvcnRzIERyaXp6bGUgb25seSB3aGVuIERBVEFCQVNFX1BBVEggb3IgZmlsZTogREFUQUJBU0VfVVJMIGlzIHNldC4nICYmIGV4aXQgMVwiO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtyZW1vdmVDb21tYW5kfSAmJiAke3RoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyl9YDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VlZENvbW1hbmQgPSB0aGlzLnNlZWQocHJvamVjdCk7XG4gICAgY29uc3QgbWlncmF0ZUNvbW1hbmQgPSB0aGlzLmRlcGxveShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gICAgcmV0dXJuIHNlZWRDb21tYW5kID09PSAndHJ1ZScgPyBtaWdyYXRlQ29tbWFuZCA6IGAke21pZ3JhdGVDb21tYW5kfSAmJiAke3NlZWRDb21tYW5kfWA7XG4gIH1cblxuICBkZXBsb3koX3Byb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBkcml6emxlLWtpdCBtaWdyYXRlICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIGdlbmVyYXRlKF9wcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gZHJpenpsZS1raXQgZ2VuZXJhdGUgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgbWlncmF0ZURldihfcHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGUoX3Byb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5zZWVkKSByZXR1cm4gJ1lBUk4gcnVuIHNlZWQnO1xuICAgIHJldHVybiAndHJ1ZSc7XG4gIH1cblxuICBzdHVkaW8oX3Byb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHJldHVybiBcImVjaG8gJ3diIGRiIHN0dWRpbyBmb3IgRHJpenpsZSBkb2VzIG5vdCBzdXBwb3J0IGRiLXVybC1vci1wYXRoLicgJiYgZXhpdCAxXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBZQVJOIGRyaXp6bGUta2l0IHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiUGF0aCA9IHByb2plY3QuZW52LkRBVEFCQVNFX1BBVEggPz8gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSA/IGRiUGF0aCA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRiUGF0aCk7XG4gIHJldHVybiBgcm0gLWYgXCIke2Fic29sdXRlUGF0aH1cIiBcIiR7YWJzb2x1dGVQYXRofS13YWxcIiBcIiR7YWJzb2x1dGVQYXRofS1zaG1cImA7XG59XG5cbmZ1bmN0aW9uIGdldEZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd0RiUGF0aCA9IGRiVXJsLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkucmVwbGFjZSgvWz8jXS4qJC8sICcnKTtcbiAgaWYgKCFyYXdEYlBhdGgpIHJldHVybjtcblxuICByZXR1cm4gcmF3RGJQYXRoO1xufVxuXG5leHBvcnQgY29uc3QgZHJpenpsZVNjcmlwdHMgPSBuZXcgRHJpenpsZVNjcmlwdHMoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZU9ybSwgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgYWxpYXNlczogWydkYiddLFxuICBkZXNjcmliZTpcbiAgICBcIlJ1biBkYXRhYmFzZSBjb21tYW5kcy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byBQcmlzbWEuIERyaXp6bGUgcHJvamVjdHMgdXNlIGRyaXp6bGUta2l0LiBFeGFtcGxlOiB3YiBwcmlzbWEgbWlncmF0ZS1kZXYgLS0gLS1uYW1lIGluaXRcIixcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLmNvbW1hbmQoY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Rm9yY2VDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZ2VuZXJhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobGlzdEJhY2t1cHNDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlRGV2Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc2V0Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc3RvcmVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc2VlZENvbW1hbmQpXG4gICAgICAuY29tbWFuZChzdHVkaW9Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVmYXVsdENvbW1hbmQpXG4gICAgICAuZGVtYW5kQ29tbWFuZCgpXG4gICAgICAuc3RyaWN0KGZhbHNlKTsgLy8gQWxsb3cgdW5rbm93biBvcHRpb25zIHRvIGJlIHBhc3NlZCB0aHJvdWdoXG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2NsZWFudXAtbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnQ2xlYW4gdXAgdGVtcG9yYWwgTGl0ZXN0cmVhbSBmaWxlcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSBjbGVhbnVwLWxpdGVzdHJlYW0nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdCk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlJyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveUZvcmNlKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBnZW5lcmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZ2VuZXJhdGUnLFxuICBkZXNjcmliZTogJ0dlbmVyYXRlIE9STSBjbGllbnQgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBnZW5lcmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmdlbmVyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXN0QmFja3Vwcyhwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdjaGVjay1pZGVtcG90ZW5jeSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1J1biB0aGUgbWlncmF0aW9uIGNvbW1hbmQgdHdpY2UgdG8gY29uZmlybSBpdCBpcyBpZGVtcG90ZW50LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgbWlncmF0ZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXI6IG1pZ3JhdGVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnY2hlY2staWRlbXBvdGVuY3knXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvcm1TY3JpcHRzID0gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ob3JtU2NyaXB0cy5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICBpZiAoc2hvdWxkQ2hlY2tJZGVtcG90ZW5jeShwcm9qZWN0LCBhcmd2LmNoZWNrSWRlbXBvdGVuY3kpKSB7XG4gICAgICAgIGlmIChpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudChwcm9qZWN0KSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coYFNraXBwaW5nIGlkZW1wb3RlbmN5IGNoZWNrIGZvciAke3Byb2plY3QubmFtZX0gaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudC5gKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKG9ybVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBzaG91bGRDaGVja0lkZW1wb3RlbmN5KHByb2plY3Q6IFByb2plY3QsIGNoZWNrSWRlbXBvdGVuY3k6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoZWNrSWRlbXBvdGVuY3kgPz8gaXNEb2NrZXJFbmFibGVkKHByb2plY3QpO1xufVxuXG5mdW5jdGlvbiBpc0RvY2tlckVuYWJsZWQocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFwcm9qZWN0LmVudi5XQl9ET0NLRVIgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnMCcgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnZmFsc2UnO1xufVxuXG5mdW5jdGlvbiBpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudChwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICdwcm9kdWN0aW9uJyB8fCBwcm9qZWN0LmVudi5NSVNFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nO1xufVxuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5taWdyYXRlRGV2KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIC8vIEZvcmNlIHRvIHJlc2V0IHRlc3QgZGF0YWJhc2VcbiAgICBpZiAocHJvY2Vzcy5lbnYuV0JfRU5WICE9PSAndGVzdCcpIHtcbiAgICAgIHByb2Nlc3MuZW52LldCX0VOViA9ICd0ZXN0JztcbiAgICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgICAgICAgJ1dCX0VOVj10ZXN0IGRiIHJlc2V0JyxcbiAgICAgICAgYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndilcbiAgICAgICkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUnLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2LCAncHJpc21hJyk7XG4gICAgZm9yIChjb25zdCB7IHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0ID8/IChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIGRhdGFiYXNlIHN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnZGItdXJsLW9yLXBhdGgnLCAncmVzdG9yZWQnXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVmYXVsdENvbW1hbmRCdWlsZGVyID0geyBhcmdzOiB7IHR5cGU6ICdhcnJheScgfSB9IGFzIGNvbnN0O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJyQwIDxhcmdzLi4+JyxcbiAgZGVzY3JpYmU6XG4gICAgXCJQYXNzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gdGhlIGRldGVjdGVkIE9STSBhcyBpcy4gQWRkaXRpb25hbCBQcmlzbWEgZmxhZ3MgY2FuIGFsc28gYmUgZm9yd2FyZGVkIGFmdGVyICctLScuXCIsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCBzY3JpcHQgPSAoYXJndi5hcmdzPy5qb2luKCcgJykgPz8gJycpLnRyaW1FbmQoKTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2FyZ3MnXSk7XG4gICAgY29uc3QgZnVsbENvbW1hbmQgPSBbc2NyaXB0LCB1bmtub3duT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoYGRiICR7ZnVsbENvbW1hbmR9YCwgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBjb21tYW5kID0gb3JtID09PSAncHJpc21hJyA/IGBQUklTTUEgJHtmdWxsQ29tbWFuZH1gIDogYFlBUk4gZHJpenpsZS1raXQgJHtmdWxsQ29tbWFuZH1gO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiJyA6ICdwcmlzbWEnO1xuICBjb25zdCBkYlBhdGggPSBgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTNgO1xuICBjb25zdCByZXF1aXJlZEVudlZhcnMgPSB7XG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FLFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVk6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSxcbiAgfSBhcyBjb25zdDtcbiAgY29uc3QgbWlzc2luZ0VudlZhcnMgPSBPYmplY3QuZW50cmllcyhyZXF1aXJlZEVudlZhcnMpXG4gICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhdmFsdWUpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gIGlmIChtaXNzaW5nRW52VmFycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGl0ZXN0cmVhbTogJHttaXNzaW5nRW52VmFycy5qb2luKCcsICcpfWApO1xuICB9XG5cbiAgY29uc3QgcmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCA9IHByb2plY3QuZW52LldCX0VOViA9PT0gJ3N0YWdpbmcnID8gJzVtJyA6ICcxaCc7XG4gIGNvbnN0IGxpdGVzdHJlYW1Db25maWcgPSBgZGJzOlxuICAtIHBhdGg6ICR7ZGJQYXRofVxuICAgIGJ1c3ktdGltZW91dDogNXNcbiAgICBjaGVja3BvaW50LWludGVydmFsOiAxbVxuICAgIHJlcGxpY2E6XG4gICAgICB0eXBlOiBzM1xuICAgICAgZW5kcG9pbnQ6IGh0dHBzOi8vJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUR9LnIyLmNsb3VkZmxhcmVzdG9yYWdlLmNvbVxuICAgICAgYnVja2V0OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUV9XG4gICAgICBhY2Nlc3Mta2V5LWlkOiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRH1cbiAgICAgIHNlY3JldC1hY2Nlc3Mta2V5OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVl9XG4gICAgICBzbmFwc2hvdC1pbnRlcnZhbDogMjRoICAjIENyZWF0ZSBhIGJhY2t1cCBwZXIgZGF5XG4gICAgICByZXRlbnRpb246IDcyaCAgICAgICAgICAjIEtlZXAgYmFja3VwcyBmb3IgMyBkYXlzXG4gICAgICByZXRlbnRpb24tY2hlY2staW50ZXJ2YWw6ICR7cmV0ZW50aW9uQ2hlY2tJbnRlcnZhbH1cbiAgICAgIHN5bmMtaW50ZXJ2YWw6IDFtXG5gO1xuXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSAnL2V0Yy9saXRlc3RyZWFtLnltbCc7XG4gIHRyeSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBsaXRlc3RyZWFtQ29uZmlnKTtcbiAgICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCAke2NvbmZpZ1BhdGh9YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHdyaXRlICR7Y29uZmlnUGF0aH06ICR7cmVhc29ufWAsIHtcbiAgICAgIGNhdXNlOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgRGF0YWJhc2VPcm1Qcm9qZWN0IHtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAgb3JtOiBEYXRhYmFzZU9ybTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucywgb3JtPzogRGF0YWJhc2VPcm0pOiBQcm9taXNlPERhdGFiYXNlT3JtUHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzXG4gICAgLm1hcCgocHJvamVjdCkgPT4gKHByb2plY3QuZGF0YWJhc2VPcm0gPyB7IHByb2plY3QsIG9ybTogcHJvamVjdC5kYXRhYmFzZU9ybSB9IDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKChwcm9qZWN0KTogcHJvamVjdCBpcyBEYXRhYmFzZU9ybVByb2plY3QgPT4gISFwcm9qZWN0ICYmICghb3JtIHx8IHByb2plY3Qub3JtID09PSBvcm0pKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKG9ybSA/IGBObyAke29ybX0gcHJvamVjdCBmb3VuZC5gIDogJ05vIHN1cHBvcnRlZCBkYXRhYmFzZSBPUk0gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybTogRGF0YWJhc2VPcm0pOiB0eXBlb2YgcHJpc21hU2NyaXB0cyB8IHR5cGVvZiBkcml6emxlU2NyaXB0cyB7XG4gIHJldHVybiBvcm0gPT09ICdwcmlzbWEnID8gcHJpc21hU2NyaXB0cyA6IGRyaXp6bGVTY3JpcHRzO1xufVxuXG5mdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIHByb2plY3RzOiBEYXRhYmFzZU9ybVByb2plY3RbXVxuKTogR2VuZXJhdG9yPERhdGFiYXNlT3JtUHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBjb25zdCBvcm1Qcm9qZWN0QnlQcm9qZWN0ID0gbmV3IE1hcChwcm9qZWN0cy5tYXAoKHByb2plY3QpID0+IFtwcm9qZWN0LnByb2plY3QsIHByb2plY3RdKSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoXG4gICAgY29tbWFuZE5hbWUsXG4gICAgcHJvamVjdHMubWFwKCh7IHByb2plY3QgfSkgPT4gcHJvamVjdClcbiAgKSkge1xuICAgIGNvbnN0IG9ybVByb2plY3QgPSBvcm1Qcm9qZWN0QnlQcm9qZWN0LmdldChwcm9qZWN0KTtcbiAgICBpZiAoIW9ybVByb2plY3QpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRldGVjdCBkYXRhYmFzZSBPUk0gZm9yICR7cHJvamVjdC5uYW1lfS5gKTtcblxuICAgIHlpZWxkIG9ybVByb2plY3Q7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IHVua25vd24gb3B0aW9ucyBmcm9tIGFyZ3YgdG8gcGFzcyB0byBPUk0gY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHVua25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIEJ1aWxkIGxpc3Qgb2Yga25vd24gb3B0aW9ucyBmcm9tIHNoYXJlZCBvcHRpb25zIGJ1aWxkZXJzXG4gIGNvbnN0IHNoYXJlZE9wdGlvbktleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRPcHRpb25zQnVpbGRlcik7XG4gIGNvbnN0IHNoYXJlZE9wdGlvbkFsaWFzZXMgPSBPYmplY3QudmFsdWVzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAgIC5mbGF0TWFwKChvcHRpb24pID0+IHtcbiAgICAgIGlmICgnYWxpYXMnIGluIG9wdGlvbikge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHRpb24uYWxpYXMpID8gb3B0aW9uLmFsaWFzIDogW29wdGlvbi5hbGlhc107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAubWFwKFN0cmluZyk7XG5cbiAgY29uc3QgYWxsS25vd25PcHRpb25zID0gbmV3IFNldChbXG4gICAgLi4ua25vd25PcHRpb25zLFxuICAgIC4uLnNoYXJlZE9wdGlvbktleXMsXG4gICAgLi4uc2hhcmVkT3B0aW9uQWxpYXNlcyxcbiAgICAvLyBJbnRlcm5hbCB5YXJncyBwcm9wZXJ0aWVzXG4gICAgJy0tJyxcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IEFycmF5LmlzQXJyYXkoYXJndlsnLS0nXSkgPyBhcmd2WyctLSddLm1hcChTdHJpbmcpIDogW107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4udW5rbm93bk9wdGlvbnMsIC4uLnBhc3N0aHJvdWdoQXJnc10pO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBjb21tYW5kIHRvIHJldHJ5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZXRyeUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIG9uU2lnbmFsOiAoc2lnbmFsKSA9PiB7XG4gICAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhc3RTdGF0dXMgPT09IDApIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGxhc3RTdGF0dXMpO1xuICB9LFxufTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAnLFxuICBkZXNjcmliZTogJ1NldHVwIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdhc2RmIGluc3RhbGwnLCBwcm9qZWN0LCBhcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUgPT09ICdweXByb2plY3QudG9tbCcpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKCdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgY29uc3QgWywgdmVyc2lvbl0gPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdhc2RmIGN1cnJlbnQgcHl0aG9uJykudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7dmVyc2lvbn1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290IHx8ICFwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkgJiZcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddXG4gICAgKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maW5kKChwKSA9PiBwLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucGxheXdyaWdodCk7XG4gIGlmIChwcm9qZWN0KSB7XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBzaGVsbEVzY2FwZUFyZ3VtZW50IH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0T3B0aW9uc0J1aWxkZXIgPSB7XG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHdhdGNoIGZpbGVzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgY29yZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnYScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG4gICdkb2NrZXItb3B0aW9ucyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgXCJkb2NrZXIgcnVuXCInLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTY3JpcHRBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gICctLSc/OiBzdHJpbmdbXTtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG4gIHNpbGVudD86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYgeyAnLS0nPzogc3RyaW5nW10gfVxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pLCAuLi4oYXJndlsnLS0nXSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KFN0cmluZyhhcmcpKSlcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRGV2TnVsbChhcmd2OiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIChhcmd2IGFzIHsgc2lsZW50OiBib29sZWFuIH0pLnNpbGVudCA/IGAgPiAvZGV2L251bGxgIDogJyc7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGRJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICBjb25zdCBtaXNlQWdlS2V5U2VjcmV0T3B0aW9uID0gcHJvamVjdC5lbnYuTUlTRV9BR0VfS0VZXG4gICAgICA/ICdcXG4gICAgICAgIC0tc2VjcmV0IGlkPW1pc2VfYWdlX2tleSxlbnY9TUlTRV9BR0VfS0VZJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259JHttaXNlQWdlS2V5U2VjcmV0T3B0aW9ufSAuYDtcbiAgfVxuXG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3RoaXMuc3RhcnQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMsIGFkZGl0aW9uYWxBcmdzKX1gO1xuICB9XG5cbiAgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgc3Bhd25TeW5jT25FeGl0KHRoaXMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCk7XG4gICAgY29uc3QgYWxsb2NhdGVUdHkgPSBhZGRpdGlvbmFsQXJncy5pbmNsdWRlcygnL2Jpbi9iYXNoJyk7XG4gICAgY29uc3QgbWlzZUFnZUtleUVudk9wdGlvbiA9IHByb2plY3QuZW52Lk1JU0VfQUdFX0tFWSA/ICctLWVudiBNSVNFX0FHRV9LRVkgJyA6ICcnO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtICR7YWxsb2NhdGVUdHkgPyAnLWl0ICcgOiAnJ30ke21pc2VBZ2VLZXlFbnZPcHRpb259LS1wdWJsaXNoICR7cHJvamVjdC5lbnYuUE9SVH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRU9wdGlvbnMge1xuICAvKiogJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnICovXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG4gIC8qKiBSYXcgUGxheXdyaWdodCBhcmdzIGZvcndhcmRlZCBhZnRlciBgd2IgdGVzdCAtLSAuLi5gICovXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCA9IHNob3VsZFdhaXRBbmRPcGVuQXBwO1xuICB9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZEltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgYXN5bmMgc3RhcnREZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgIF0pO1xuICB9XG4gIGFzeW5jIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGFzeW5jIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd3YicsXG4gICAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgICBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpLFxuICAgICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgICAgXSl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGN1c3RvbVN0YXJ0U2NyaXB0UGF0aCA9IGZpbmRDdXN0b21Qcm9kdWN0aW9uU3RhcnRTY3JpcHRQYXRoKHByb2plY3QpO1xuICAgIGlmIChjdXN0b21TdGFydFNjcmlwdFBhdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdCwgYXJndiwgW1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYCR7YnVpbGRTaGVsbENvbW1hbmQoWydiYXNoJywgY3VzdG9tU3RhcnRTY3JpcHRQYXRoXSl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCksXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBjb25zdCBlY29zeXN0ZW1Db25maWdQYXRoID0gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY29tbWFuZHMgPSBlY29zeXN0ZW1Db25maWdQYXRoXG4gICAgICA/IFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYHBtMi1ydW50aW1lIHN0YXJ0IC0tbm8tYXV0b3Jlc3RhcnQgJHtlY29zeXN0ZW1Db25maWdQYXRofWBdXG4gICAgICA6IHRoaXMuYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gdGhpcy5idWlsZFByb2R1Y3Rpb25Db21tYW5kKHByb2plY3QsIGFyZ3YsIGNvbW1hbmRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgIGAke3Byb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuJyA6ICdub2RlJ30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpLFxuICAgIF07XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBjb21tYW5kczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IG1pZ3JhdGlvbkNvbW1hbmRzID0gW1xuICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KV0gOiBbXSksXG4gICAgICAuLi4ocHJvamVjdC5oYXNEcml6emxlID8gW2RyaXp6bGVTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCldIDogW10pLFxuICAgIF07XG4gICAgcmV0dXJuIFsuLi5taWdyYXRpb25Db21tYW5kcy5mbGF0TWFwKChjbWQpID0+IGNtZC5zcGxpdCgnJiYnKSksIC4uLmNvbW1hbmRzXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCgoY21kKSA9PiBgJHtjbWR9ICR7dG9EZXZOdWxsKGFyZ3YpfWAudHJpbSgpKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRURvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCksIG9wdGlvbnMpO1xuICB9XG4gIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBVc2UgZW1wdHkgTk9ERV9FTlYgdG8gYXZvaWQgXCJwcm9kdWN0aW9uXCIgbW9kZSBpbiBzb21lIGZyYW1ld29ya3MgbGlrZSBCbGl0ei5qcy5cbiAgICByZXR1cm4gYCR7YnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCgnTk9ERV9FTlYnLCAnJyl9ICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFwcChwcm9qZWN0KSxcbiAgICBdKX1gO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIHsgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBbXSwgcGxheXdyaWdodEFyZ3MgPSBbJ3Rlc3QnLCAndGVzdC9lMmUvJ10gfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJncywgYXJndi50YXJnZXRzLCBhcmd2LmJhaWwsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcbiAgICBpZiAocHJvamVjdC5za2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCkge1xuICAgICAgcmV0dXJuIGAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGB3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd2aXRlc3QnLFxuICAgICAgICAncnVuJyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgICctLXBhc3NXaXRoTm9UZXN0cycsXG4gICAgICAgICctLWFsbG93T25seScsXG4gICAgICAgICctLXdhdGNoPWZhbHNlJyxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsPTEnXSA6IFtdKSxcbiAgICAgIF0pO1xuICAgIH0gZWxzZSBpZiAocHJvamVjdC5pc0J1bkF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ2J1bicsXG4gICAgICAgICd0ZXN0JyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgIC4uLihhcmd2LmJhaWwgPyBbJy0tYmFpbCddIDogW10pLFxuICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiAnZWNobyBcIk5vIHRlc3RzLlwiJztcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgd2FpdC1vbiAtdCAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSA1MDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDIwMDAwIC1pIDQwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgNjAwMDAgLWkgNTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA5MDAwMCAtaSAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QW5kT3BlbkFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYCR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdFxuICAgICl9IHx8IHdhaXQtb24gaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1c3RvbVByb2R1Y3Rpb25TdGFydFNjcmlwdFBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ3NjcmlwdHMvc3RhcnQtcHJvZHVjdGlvbi5zaCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRDb21tYW5kKFxuICBwbGF5d3JpZ2h0QXJnczogc3RyaW5nW10sXG4gIHRhcmdldHM6IFRlc3RBcmd2Wyd0YXJnZXRzJ10sXG4gIGJhaWw/OiBib29sZWFuLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IFsnQlVOJywgJ3BsYXl3cmlnaHQnXTtcbiAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgaWYgKHBsYXl3cmlnaHRBcmdzWzBdICE9PSAndGVzdCcgfHwgIW5vcm1hbGl6ZWRUYXJnZXRzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oWy4uLmJhc2UsIC4uLnBsYXl3cmlnaHRBcmdzLCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sIGJhaWwpO1xuICB9XG5cbiAgY29uc3QgcmVzdCA9IHBsYXl3cmlnaHRBcmdzLnNsaWNlKDEpO1xuICBjb25zdCBleHBsaWNpdFRhcmdldEluZGV4ZXMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhyZXN0KTtcbiAgY29uc3QgcmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCA9XG4gICAgZXhwbGljaXRUYXJnZXRJbmRleGVzLmxlbmd0aCA9PT0gMCA/IHJlc3QgOiByZXN0LmZpbHRlcigoXywgaW5kZXgpID0+ICFleHBsaWNpdFRhcmdldEluZGV4ZXMuaW5jbHVkZXMoaW5kZXgpKTtcbiAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKFxuICAgIFsuLi5iYXNlLCAndGVzdCcsIC4uLm5vcm1hbGl6ZWRUYXJnZXRzLCAuLi5yZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0LCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sXG4gICAgYmFpbFxuICApO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihjb21tYW5kQXJnczogc3RyaW5nW10sIGJhaWw/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcGxheXdyaWdodEluZGV4ID0gY29tbWFuZEFyZ3MuaW5kZXhPZigncGxheXdyaWdodCcpO1xuICBjb25zdCBpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCA9IHBsYXl3cmlnaHRJbmRleCAhPT0gLTEgJiYgY29tbWFuZEFyZ3NbcGxheXdyaWdodEluZGV4ICsgMV0gPT09ICd0ZXN0JztcbiAgaWYgKCFiYWlsIHx8ICFpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgaWYgKGNvbW1hbmRBcmdzLnNvbWUoKGFyZykgPT4gYXJnID09PSAnLS1tYXgtZmFpbHVyZXMnIHx8IGFyZy5zdGFydHNXaXRoKCctLW1heC1mYWlsdXJlcz0nKSkpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoY29tbWFuZEFyZ3MpO1xuICB9XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4uY29tbWFuZEFyZ3MsICctLW1heC1mYWlsdXJlcz0xJ10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMoYXJnczogc3RyaW5nW10pOiBudW1iZXJbXSB7XG4gIGxldCBwZW5kaW5nVmFsdWVNb2RlOiAnb3B0aW9uYWwnIHwgJ3JlcXVpcmVkJyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0SW5kZXhlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgYXJnXSBvZiBhcmdzLmVudHJpZXMoKSkge1xuICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlKSB7XG4gICAgICBpZiAocGVuZGluZ1ZhbHVlTW9kZSA9PT0gJ3JlcXVpcmVkJyB8fCAhYXJnLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gdW5kZWZpbmVkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgcmV0dXJuIFsuLi50YXJnZXRJbmRleGVzLCAuLi5hcmdzLnNsaWNlKGluZGV4ICsgMSkubWFwKChfLCBvZmZzZXQpID0+IGluZGV4ICsgMSArIG9mZnNldCldO1xuICAgIH1cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgIGlmIChhcmcuaW5jbHVkZXMoJz0nKSkgY29udGludWU7XG4gICAgICBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9IGVsc2UgaWYgKFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTLmhhcyhhcmcpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAnb3B0aW9uYWwnO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLScpICYmIGFyZyAhPT0gJy0nKSB7XG4gICAgICBjb25zdCBzaG9ydE9wdGlvbiA9IGFyZy5zbGljZSgwLCAyKTtcbiAgICAgIGlmIChhcmcubGVuZ3RoID09PSAyICYmIFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTLmhhcyhzaG9ydE9wdGlvbikpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdGFyZ2V0SW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRJbmRleGVzO1xufVxuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1icm93c2VyJyxcbiAgJy0tY29uZmlnJyxcbiAgJy0tZ3JlcCcsXG4gICctLWdyZXAtaW52ZXJ0JyxcbiAgJy0tZ2xvYmFsLXRpbWVvdXQnLFxuICAnLS1tYXgtZmFpbHVyZXMnLFxuICAnLS1vdXRwdXQnLFxuICAnLS1wcm9qZWN0JyxcbiAgJy0tcmVwZWF0LWVhY2gnLFxuICAnLS1yZXBvcnRlcicsXG4gICctLXJldHJpZXMnLFxuICAnLS1zaGFyZCcsXG4gICctLXRlc3QtbGlzdCcsXG4gICctLXRlc3QtbGlzdC1pbnZlcnQnLFxuICAnLS10aW1lb3V0JyxcbiAgJy0tdHJhY2UnLFxuICAnLS10c2NvbmZpZycsXG4gICctLXVpLWhvc3QnLFxuICAnLS11aS1wb3J0JyxcbiAgJy0tdWktdGl0bGUnLFxuICAnLS13b3JrZXJzJyxcbl0pO1xuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1vbmx5LWNoYW5nZWQnLFxuICAnLS11cGRhdGUtc25hcHNob3RzJyxcbiAgJy0tdXBkYXRlLXNvdXJjZS1tZXRob2QnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbJy1jJywgJy1nJywgJy1qJ10pO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIEJsaXR6LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBCbGl0elNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgYmxpdHogZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYmxpdHpTY3JpcHRzID0gbmV3IEJsaXR6U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMsIHR5cGUgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAocHJvamVjdC5oYXNQbGF5d3JpZ2h0Q29uZmlnKSB7XG4gICAgICByZXR1cm4gc3VwZXIudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBzdGFydENvbW1hbmQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L2UyZS8nXTtcbiAgICBjb25zdCB0ZXN0Q29tbWFuZCA9IHRoaXMudGVzdFVuaXQocHJvamVjdCwgeyAuLi5hcmd2LCB0YXJnZXRzOiBub3JtYWxpemVkVGFyZ2V0cyB9KTtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYHdhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiAke3Rlc3RDb21tYW5kfSR7c3VmZml4fWAsXG4gICAgXSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJTY3JpcHRzID0gbmV3IEh0dHBTZXJ2ZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgTmV4dC5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgTmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgbmV4dCBkZXYgLS10dXJib3BhY2sgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYG5leHQgc3RhcnQgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IFNFUlZFUl9MT0dfRklMRSB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydERldlByb3RlY3RlZChfMTogUHJvamVjdCwgXzI6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQuJyk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERldihfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfSB8IHRlZSAke1NFUlZFUl9MT0dfRklMRX1gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFRlc3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICApfWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVQcm9kdWN0aW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRURvY2tlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGByZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgVml0ZS1iYXNlZCBhcHBzIHdpdGggUGxheXdyaWdodCBlMmUgdGVzdHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpdGVTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gdml0ZSBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBZQVJOIHZpdGUgcHJldmlldyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aXRlU2NyaXB0cyA9IG5ldyBWaXRlU2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlN0YXJ0IGFwcC4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byB0aGUgdW5kZXJseWluZyBhcHAgY29tbWFuZC4gRXhhbXBsZTogd2Igc3RhcnQgLS0gLS1ob3N0IDAuMC4wLjBcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSkub3B0aW9ucyhidWlsZGVyKSBhcyBBcmd2PFxuICAgICAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbiAgICA+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnZGV2ZWxvcG1lbnQnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RGV2KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGF3YWl0IHNjcmlwdHMuc3RhcnRUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfTE9PS0JBQ0tfTElORV9DT1VOVCA9IDIwMDtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU8gPSAwLjA1O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0hvdyB0byBydW4gRTJFIHRlc3RzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBiYWlsOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdG9wIHRlc3RzIGFmdGVyIHRoZSBmaXJzdCBmYWlsdXJlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBhcnJheTogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ1VuaXQgb3IgRTJFIHRlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVGVzdENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPjtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCB0eXBlIFRlc3RDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUZXN0Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogc3RyaW5nW10gfTtcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0UnVuT3B0aW9ucyB7XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUZXN0Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndGVzdCBbdGFyZ2V0cy4uLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlRlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBmbGFncyB0byBQbGF5d3JpZ2h0LiBFeGFtcGxlOiB3YiB0ZXN0IC0tIC0tZ3JlcCAndXBsb2FkZWQgaW1hZ2UgYXNzZXQnXCIsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPik6IEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPiA9PlxuICAgIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLm9wdGlvbnMoYnVpbGRlcilcbiAgICAgIC5wb3NpdGlvbmFsKCd0YXJnZXRzJywgYXJndW1lbnRzQnVpbGRlci50YXJnZXRzKSBhcyBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHByb2Nlc3MuZXhpdChhd2FpdCB0ZXN0KGFyZ3YgYXMgVGVzdENvbW1hbmRBcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChhcmd2OiBUZXN0Q29tbWFuZEFyZ3YsIG9wdGlvbnM6IFRlc3RSdW5PcHRpb25zID0ge30pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICAvLyBHZXQgdGVzdCB0YXJnZXRzIGZyb20gcG9zaXRpb25hbCBhcmd1bWVudHNcbiAgY29uc3QgdGVzdFRhcmdldHMgPSAoYXJndi50YXJnZXRzID8/IFtdKSBhcyBzdHJpbmdbXTtcbiAgY29uc3QgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBhcmd2WyctLSddID8/IFtdO1xuICBjb25zdCB7IHNob3VsZFJ1bkUyZSwgc2hvdWxkUnVuVW5pdCB9ID0gcmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzKHRlc3RUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyk7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgcHJvamVjdC5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgLy8gUnVuIHVuaXQgdGVzdHMgaWYgbmVlZGVkXG4gICAgY29uc3QgZGVmYXVsdFVuaXRUYXJnZXRzID0gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3QpO1xuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIGRlZmF1bHRVbml0VGFyZ2V0cyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHVuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gICAgICBjb25zdCB0YXJnZXRzID1cbiAgICAgICAgdW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IHVuaXRUYXJnZXRzIDogZGVmYXVsdFVuaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyBkZWZhdWx0VW5pdFRhcmdldHMgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB1bml0QXJndiA9IHsgLi4uYXJndiwgdGFyZ2V0cyB9O1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Vbml0VGVzdENvbW1hbmQoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgICAgICAgdGltZW91dDogYXJndi51bml0VGltZW91dCxcbiAgICAgIH0pO1xuICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gU2tpcCBlMmUgdGVzdHMgaWYgbm90IG5lZWRlZCBvciBubyBlMmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghc2hvdWxkUnVuRTJlIHx8ICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGUyZSB0YXJnZXRzIGZvciB0aGlzIHByb2plY3RcbiAgICBjb25zdCBlMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgICBjb25zdCBlMmVBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdoZWFkbGVzcy1kZXYnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzLmJsaXR6IHx8IGRlcHMubmV4dCB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddIHx8IGRldkRlcHMudml0ZSkge1xuICAgICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgICBjYXNlICdoZWFkZWQnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogWydjb2RlZ2VuJywgYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0cmFjZSc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAgICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB8IGZhbHNlIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAocHJvamVjdC5oYXNWaXRlc3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcpKSkge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSA/IFsndGVzdCcsICctLWV4Y2x1ZGUnLCAndGVzdC9lMmUvKionXSA6IFsndGVzdCddO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgY29uc3QgYnVpbGRFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndiwge1xuICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gIH0pO1xuICBpZiAoYnVpbGRFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiBidWlsZEV4aXRDb2RlO1xuICB9XG4gIGNvbnN0IHRlc3RFeGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBjb25zdCBzdG9wRXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgfSk7XG4gIGlmICh0ZXN0RXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gdGVzdEV4aXRDb2RlO1xuICB9XG4gIHJldHVybiBzdG9wRXhpdENvZGU7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgcHJvY2Vzc1NpbGVudE91dHB1dDogZGVkdXBlTm9pc3lUZXN0T3V0cHV0LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuVW5pdFRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgb21pdFNpbGVudFN0YXJ0OiB0cnVlLFxuICAgIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seTogdHJ1ZSxcbiAgICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM6IDEwXzAwMCxcbiAgICBzaWxlbnRTdWNjZXNzTWVzc2FnZTogJ1VuaXQgdGVzdHMgcGFzc2VkLicsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWNlbnRQcmludGVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlZHVwZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGl0ZXJhdGVMaW5lcyhvdXRwdXQpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZExpbmUgPSBub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eShsaW5lKTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVTZXQuaGFzKG5vcm1hbGl6ZWRMaW5lKSkgY29udGludWU7XG4gICAgaWYgKHJlY2VudFByaW50ZWRMaW5lcy5zb21lKChwcmludGVkTGluZSkgPT4gYXJlTGluZXNTaW1pbGFyKHByaW50ZWRMaW5lLCBub3JtYWxpemVkTGluZSkpKSBjb250aW51ZTtcblxuICAgIHB1c2hSZWNlbnRQcmludGVkTGluZShyZWNlbnRQcmludGVkTGluZXMsIHJlY2VudFByaW50ZWRMaW5lU2V0LCBub3JtYWxpemVkTGluZSk7XG4gICAgZGVkdXBlZExpbmVzLnB1c2gobGluZSk7XG4gIH1cbiAgcmV0dXJuIGRlZHVwZWRMaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24qIGl0ZXJhdGVMaW5lcyhvdXRwdXQ6IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgbGV0IGxpbmVTdGFydEluZGV4ID0gMDtcbiAgd2hpbGUgKGxpbmVTdGFydEluZGV4IDw9IG91dHB1dC5sZW5ndGgpIHtcbiAgICBjb25zdCBsaW5lRW5kSW5kZXggPSBvdXRwdXQuaW5kZXhPZignXFxuJywgbGluZVN0YXJ0SW5kZXgpO1xuICAgIGlmIChsaW5lRW5kSW5kZXggPT09IC0xKSB7XG4gICAgICB5aWVsZCBvdXRwdXQuc2xpY2UobGluZVN0YXJ0SW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCwgbGluZUVuZEluZGV4KTtcbiAgICBsaW5lU3RhcnRJbmRleCA9IGxpbmVFbmRJbmRleCArIDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFJlY2VudFByaW50ZWRMaW5lKGxpbmVzOiBzdHJpbmdbXSwgbGluZVNldDogU2V0PHN0cmluZz4sIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBsaW5lcy5wdXNoKGxpbmUpO1xuICBsaW5lU2V0LmFkZChsaW5lKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQpIHJldHVybjtcblxuICBjb25zdCByZW1vdmVkTGluZSA9IGxpbmVzLnNoaWZ0KCk7XG4gIGlmIChyZW1vdmVkTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGluZVNldC5kZWxldGUocmVtb3ZlZExpbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsaW5lXG4gICAgLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKVxuICAgIC50cmltKClcbiAgICAucmVwbGFjZUFsbCgvXig/OlxcW1teXFxdXStcXF1cXHMqKSsvZywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcKG5vZGU6XFxkK1xcKS9nLCAnKG5vZGU6PG51bWJlcj4pJylcbiAgICAucmVwbGFjZUFsbCgvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQrKT9aP1xcYi9nLCAnPHRpbWVzdGFtcD4nKVxuICAgIC5yZXBsYWNlQWxsKC8oWz8mXWNhY2hlPSlcXGQrL2csICckMTxudW1iZXI+Jyk7XG59XG5cbmZ1bmN0aW9uIGFyZUxpbmVzU2ltaWxhcihhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICBpZiAobWF4TGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKE1hdGguYWJzKGEubGVuZ3RoIC0gYi5sZW5ndGgpID4gbWF4TGVuZ3RoICogU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTykgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkaXN0YW5jZShhLCBiKSAvIG1heExlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShcbiAgZTJlVGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdLFxuICBhZGRpdGlvbmFsQXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKS5sZW5ndGggPiAwO1xuICByZXR1cm4gWyd0ZXN0JywgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCB8fCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA/IFtdIDogWyd0ZXN0L2UyZS8nXSksIC4uLmFkZGl0aW9uYWxBcmdzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyhcbiAgdGVzdFRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogeyBzaG91bGRSdW5Vbml0OiBib29sZWFuOyBzaG91bGRSdW5FMmU6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwICYmIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA9PT0gMDtcblxuICByZXR1cm4ge1xuICAgIHNob3VsZFJ1blVuaXQ6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzLFxuICAgIHNob3VsZFJ1bkUyZTogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cyB8fCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPiAwLFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHtcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdGVzdE9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdC1vbi1jaScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0IG9uIENJIHdpdGggbm8gb3B0aW9ucy4nLFxuICBidWlsZGVyOiB0ZXN0T25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3RPbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RPbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgcHJvamVjdC5lbnYuQ0kgfHw9ICcxJztcbiAgICBwcm9qZWN0LmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBoYXNEb2NrZXJmaWxlID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlO1xuICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgLy8gQ29uZmlybSBkZXYgc2VydmVyIHN0YXJ0dXAgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBwcm9qZWN0cyB3aXRoIEUyRSB0ZXN0cy5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBoYXNEb2NrZXJmaWxlXG4gICAgICAgID8gYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHt9KVxuICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHQucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbnRlcmZhY2UgVHJlZUtpbGxDb21tYW5kQXJncyB7XG4gIHBpZDogbnVtYmVyO1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuY29uc3QgYnVpbGRlciA9ICh5YXJnczogQXJndik6IEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz4gPT5cbiAgeWFyZ3NcbiAgICAucG9zaXRpb25hbCgncGlkJywge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcHJvY2VzcyBJRCB0byBraWxsLicsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ3NpZ25hbCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmFsIHRvIHNlbmQgdG8gdGhlIHByb2Nlc3MgdHJlZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnU0lHVEVSTScsXG4gICAgfSkgYXMgQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPjtcblxuZXhwb3J0IGNvbnN0IHRyZWVLaWxsQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxvYmplY3QsIFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0ge1xuICBjb21tYW5kOiAndHJlZS1raWxsIDxwaWQ+IFtzaWduYWxdJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBnaXZlbiBwcm9jZXNzIGFuZCBhbGwgZGVzY2VuZGFudHMnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2lnbmFsID0gYXJndi5zaWduYWwgYXMgTm9kZUpTLlNpZ25hbHM7XG4gICAgICBpZiAoIShzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaWduYWw6ICR7c2lnbmFsfWApO1xuICAgICAgfVxuICAgICAgdHJlZUtpbGwoYXJndi5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbmV4cG9ydCB0eXBlIFR5cGVDaGVja0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdHlwZUNoZWNrKGFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0eXBlQ2hlY2soYXJndjogVHlwZUNoZWNrQ29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgbGV0IHJlbW92ZWROZXh0RGlyID0gZmFsc2UgYXMgYm9vbGVhbjtcbiAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcbiAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyB8fCBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goLi4uYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdCkpO1xuICAgIH1cbiAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ3B5cmlnaHQnKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgfVxuICAgIHdoaWxlIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgcHJlc2VydmVDb2xvcjogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZS10cnkgdHlwZSBjaGVja2luZyBhZnRlciByZW1vdmluZyBgLm5leHRgIGRpcmVjdG9yeVxuICAgICAgY29uc3QgbmV4dERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLm5leHQnKTtcbiAgICAgIGlmIChleGl0Q29kZSAmJiBmcy5leGlzdHNTeW5jKG5leHREaXJQYXRoKSkge1xuICAgICAgICBmcy5ybVN5bmMobmV4dERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUmVtb3ZlZCBgLm5leHRgIGRpcmVjdG9yeS4gV2Ugd2lsbCByZS10cnkgdHlwZSBjaGVja2luZy4nKSk7XG4gICAgICAgIHJlbW92ZWROZXh0RGlyID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZXhpdENvZGUpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1tpXT8ucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFmaW5hbEV4aXRDb2RlKVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICByZW1vdmVkTmV4dERpclxuICAgICAgICAgID8gJy0tLS0tXFxuTm8gdHlwZSBlcnJvcnMgZm91bmQuIFBsZWFzZSBpZ25vcmUgdGhlIHByZXZpb3VzIHR5cGUgZXJyb3JzLCBhcyB0aGV5IHdlcmUgY2F1c2VkIGJ5IG91dGRhdGVkIE5leHQuanMgY2FjaGUgZmlsZXMuJ1xuICAgICAgICAgIDogJ05vIHR5cGUgZXJyb3JzIGZvdW5kLidcbiAgICAgIClcbiAgICApO1xuICByZXR1cm4gZmluYWxFeGl0Q29kZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnKSkge1xuICAgIHJldHVybiBbJ0JVTiB0c2dvIC0tbm9FbWl0J107XG4gIH1cbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgndHlwZXNjcmlwdCcpKSB7XG4gICAgcmV0dXJuIFsnQlVOIHRzYyAtLW5vRW1pdCddO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IGxpbnQsIHR5cGUgTGludENvbW1hbmRBcmd2IH0gZnJvbSAnLi9saW50LmpzJztcbmltcG9ydCB7IHRlc3QsIHR5cGUgVGVzdENvbW1hbmRBcmd2IH0gZnJvbSAnLi90ZXN0LmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZnVsbDoge1xuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICBkZXNjcmliZTogJ1J1biB0ZXN0cyBhZnRlciB2ZXJpZnlpbmcgcHJvamVjdCBjb2RlJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIFZlcmlmeUNvZGVDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgdmVyaWZ5Q29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3ZlcmlmeScsXG4gIGRlc2NyaWJlOiAnVmVyaWZ5IHByb2plY3QgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBhd2FpdCAoYXJndi5mdWxsID8gdmVyaWZ5Q29kZUZ1bGx5KHByb2plY3RzLnNlbGYsIGFyZ3YpIDogdmVyaWZ5Q29kZShwcm9qZWN0cy5zZWxmLCBhcmd2KSk7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9ydGVyID0gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdmVyaWZ5Q29kZShwcm9qZWN0LCBhcmd2KTtcbiAgICBhd2FpdCBydW5Qcm9qZWN0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXBvcnRlci5zdWNjZWVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0ZXIuZmFpbChlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgcmVwb3J0ZXIuZmluaXNoKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Q29kZShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgLCBwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbiAgYXdhaXQgcnVuSW5Qcm9jZXNzQ29tbWFuZChcbiAgICAnY2xlYW51cCcsXG4gICAgKCkgPT5cbiAgICAgIGxpbnQoe1xuICAgICAgICAuLi5hcmd2LFxuICAgICAgICBfOiBbJ2xpbnQnXSxcbiAgICAgICAgZml4OiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IHRydWUsXG4gICAgICAgIHByaW50QWxsT3V0cHV0OiB0cnVlLFxuICAgICAgICBxdWlldDogdHJ1ZSxcbiAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgfSBhcyB1bmtub3duIGFzIExpbnRDb21tYW5kQXJndiksXG4gICAgeyBzaWxlbnQ6IHRydWUgfVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Qcm9qZWN0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdGVzdEFyZ3YgPSB7IC4uLmFyZ3YsIF86IFsndGVzdCddLCBlMmU6ICdoZWFkbGVzcycsIHNpbGVudDogdHJ1ZSB9IGFzIHVua25vd24gYXMgVGVzdENvbW1hbmRBcmd2O1xuICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSByZXR1cm47XG5cbiAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGItcmVzZXQnXSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCAndGVzdCcpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKFxuICAgIGNoYWxrLnllbGxvdygnVGVzdHMgZmFpbGVkLiBUaGlzIHByb2plY3QgZGVmaW5lcyBcImRiLXJlc2V0XCIsIHNvIHdiIHdpbGwgcmVzZXQgdGhlIGRhdGFiYXNlIG9uY2UgYW5kIHJldHJ5IHRlc3RzLicpXG4gICk7XG4gIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKGAke3BhY2thZ2VNYW5hZ2VyfSBkYi1yZXNldGAsIHByb2plY3QsIGFyZ3YsIHsgcHJpbnRSYXdPdXRwdXQ6IHRydWUgfSk7XG5cbiAgY29uc3QgcmV0cnlFeGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKHJldHJ5RXhpdENvZGUgIT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7cmV0cnlFeGl0Q29kZX0pOmApLCAndGVzdCBhZnRlciBkYi1yZXNldCByZXRyeScpKTtcbiAgICBwcm9jZXNzLmV4aXQocmV0cnlFeGl0Q29kZSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdUZXN0cyBwYXNzZWQgYWZ0ZXIgZGItcmVzZXQgcmV0cnkuJykpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5JblByb2Nlc3NDb21tYW5kKFxuICBjb21tYW5kTmFtZTogc3RyaW5nLFxuICBjb21tYW5kOiAoKSA9PiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4sXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ1N0YXJ0OicpLCBjb21tYW5kTmFtZSkpO1xuICB9XG4gIGNvbnN0IGV4aXRDb2RlID0gKGF3YWl0IGNvbW1hbmQoKSkgPz8gMDtcbiAgaWYgKGV4aXRDb2RlID09PSAwIHx8IG9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBjb21tYW5kTmFtZSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgY29tbWFuZE5hbWUpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFja2FnZUNvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2LFxuICBvcHRpb25zOiB7IGFsbG93RmFpbHVyZT86IGJvb2xlYW47IHByaW50UmF3T3V0cHV0PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHByaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LmRpclBhdGgpO1xuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMoY29tbWFuZCwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgcHJlc2VydmVDb2xvcjogZmFsc2UgfSksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdwaXBlJyxcbiAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgcHJpbnRpbmdTdGRvdXQ6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KTtcbiAgY29uc3QgZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gIGlmICghb3B0aW9ucy5wcmludFJhd091dHB1dCkge1xuICAgIHByaW50UGFja2FnZUNvbW1hbmRPdXRwdXQoY29tbWFuZCwgZXhpdENvZGUsIHJldC5zdGRvdXQpO1xuICB9XG5cbiAgaWYgKGV4aXRDb2RlICE9PSAwICYmICFvcHRpb25zLmFsbG93RmFpbHVyZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbi8qKlxuICogUHJpbnRzIHBhY2thZ2UgY29tbWFuZCBvdXRwdXQgZm9yIGB3YiB2ZXJpZnlgLlxuICpcbiAqIGB3YiB2ZXJpZnlgIGlzIHByaW1hcmlseSBjb25zdW1lZCBieSBBSSBjb2RpbmcgYWdlbnRzLCBzbyBzdWNjZXNzZnVsIG5vaXN5XG4gKiBjb21tYW5kcyBhcmUgc3VtbWFyaXplZCB3aGlsZSBmYWlsdXJlIG91dHB1dCByZW1haW5zIGF2YWlsYWJsZSBmb3IgZGlhZ25vc2lzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIFRoZSBleGVjdXRlZCBjb21tYW5kLlxuICogQHBhcmFtIGV4aXRDb2RlIFRoZSBjb21tYW5kIGV4aXQgY29kZS5cbiAqIEBwYXJhbSBvdXRwdXQgVGhlIG1lcmdlZCBzdGRvdXQgYW5kIHN0ZGVyciBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kOiBzdHJpbmcsIGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCAmJiAoY29tbWFuZCA9PT0gYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgIHx8IGNvbW1hbmQgPT09IGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZWApKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTdWNjZWVkZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRyaW1tZWRPdXRwdXQgPSBvdXRwdXQudHJpbSgpO1xuICBpZiAodHJpbW1lZE91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHRyaW1tZWRPdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmQoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdDogUHJvamVjdCk6IHtcbiAgZmFpbDogKGVycm9yPzogdW5rbm93bikgPT4gdm9pZDtcbiAgZmluaXNoOiAoKSA9PiB2b2lkO1xuICBzdWNjZWVkOiAoKSA9PiB2b2lkO1xufSB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHdiRGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcud2InKTtcbiAgZnMubWtkaXJTeW5jKHdiRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgbG9nRmlsZVBhdGggPSBwYXRoLmpvaW4od2JEaXJQYXRoLCAndmVyaWZ5LWZ1bGwubG9nJyk7XG4gIGNvbnN0IGxvZ0ZpbGUgPSBmcy5vcGVuU3luYyhsb2dGaWxlUGF0aCwgJ3cnKTtcbiAgY29uc3Qgb3JpZ2luYWxTdGRvdXRXcml0ZSA9IHByb2Nlc3Muc3Rkb3V0LndyaXRlLmJpbmQocHJvY2Vzcy5zdGRvdXQpO1xuICBjb25zdCBvcmlnaW5hbFN0ZGVycldyaXRlID0gcHJvY2Vzcy5zdGRlcnIud3JpdGUuYmluZChwcm9jZXNzLnN0ZGVycik7XG4gIGxldCBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG5cbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUgPSB0ZWVXcml0ZShwcm9jZXNzLnN0ZG91dC5mZCwgbG9nRmlsZSkgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xuICBwcm9jZXNzLnN0ZGVyci53cml0ZSA9IHRlZVdyaXRlKHByb2Nlc3Muc3RkZXJyLmZkLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRlcnIud3JpdGU7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0Z1bGwgbG9nOicpLCBsb2dGaWxlUGF0aCkpO1xuXG4gIGNvbnN0IGZpbmlzaCA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoZmluaXNoZWQpIHJldHVybjtcbiAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IG9yaWdpbmFsU3Rkb3V0V3JpdGUgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xuICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gb3JpZ2luYWxTdGRlcnJXcml0ZSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRlcnIud3JpdGU7XG5cbiAgICBjb25zdCBlbGFwc2VkVGltZSA9IGZvcm1hdEVsYXBzZWRUaW1lKERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWRlZCA/ICdTdWNjZWVkZWQnIDogJ0ZhaWxlZCc7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGAke3N0YXR1c30gaW4gJHtlbGFwc2VkVGltZX0uIEZ1bGwgbG9nOiAke2xvZ0ZpbGVQYXRofVxcbmA7XG4gICAgY29uc3QgY29sb3JlZFN1bW1hcnkgPSBzdWNjZWVkZWQgPyBjaGFsay5ncmVlbihzdW1tYXJ5KSA6IGNoYWxrLnJlZChzdW1tYXJ5KTtcbiAgICBvcmlnaW5hbFN0ZG91dFdyaXRlKGNvbG9yZWRTdW1tYXJ5KTtcbiAgICBmcy53cml0ZVN5bmMobG9nRmlsZSwgc3VtbWFyeSk7XG4gICAgZnMuY2xvc2VTeW5jKGxvZ0ZpbGUpO1xuICB9O1xuXG4gIHByb2Nlc3Mub25jZSgnZXhpdCcsIGZpbmlzaCk7XG5cbiAgcmV0dXJuIHtcbiAgICBmYWlsOiAoZXJyb3IpID0+IHtcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZmluaXNoOiAoKSA9PiB7XG4gICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdleGl0JywgZmluaXNoKTtcbiAgICAgIGZpbmlzaCgpO1xuICAgIH0sXG4gICAgc3VjY2VlZDogKCkgPT4ge1xuICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB0ZWVXcml0ZShvdXRwdXRGaWxlOiBudW1iZXIsIGxvZ0ZpbGU6IG51bWJlcik6IHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZSB7XG4gIHJldHVybiAoKFxuICAgIGNodW5rOiBVaW50OEFycmF5IHwgc3RyaW5nLFxuICAgIGVuY29kaW5nT3JDYWxsYmFjaz86IEJ1ZmZlckVuY29kaW5nIHwgKChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZCksXG4gICAgY2FsbGJhY2s/OiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWRcbiAgKSA9PiB7XG4gICAgY29uc3QgYnVmZmVyID1cbiAgICAgIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBCdWZmZXIuZnJvbShjaHVuaywgdHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ3N0cmluZycgPyBlbmNvZGluZ09yQ2FsbGJhY2sgOiAndXRmOCcpXG4gICAgICAgIDogY2h1bms7XG4gICAgZnMud3JpdGVTeW5jKGxvZ0ZpbGUsIGJ1ZmZlcik7XG4gICAgZnMud3JpdGVTeW5jKG91dHB1dEZpbGUsIGJ1ZmZlcik7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVuY29kaW5nT3JDYWxsYmFjaygpO1xuICAgIH1cbiAgICBjYWxsYmFjaz8uKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RWxhcHNlZFRpbWUobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5yb3VuZChtaWxsaXNlY29uZHMgLyAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgY29uc3QgcmVtYWluaW5nU2Vjb25kcyA9IHNlY29uZHMgJSA2MDtcbiAgaWYgKG1pbnV0ZXMgPT09IDApIHtcbiAgICByZXR1cm4gYCR7cmVtYWluaW5nU2Vjb25kc31zYDtcbiAgfVxuICByZXR1cm4gYCR7bWludXRlc31tICR7cmVtYWluaW5nU2Vjb25kc31zYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcywgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBjb25jdXJyZW50bHlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9jb25jdXJyZW50bHkuanMnO1xuaW1wb3J0IHsgZ2VuQ29kZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2dlbkNvZGUuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRJZk5vbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLmpzJztcbmltcG9ydCB7IGxpbnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9saW50LmpzJztcbmltcG9ydCB7IG1haW50ZW5hbmNlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbWFpbnRlbmFuY2UuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdHJlZUtpbGxDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90cmVlS2lsbC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyB2ZXJpZnlDb2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdmVyaWZ5Q29kZS5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZCh2ZXJpZnlDb2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGNvbmN1cnJlbnRseUNvbW1hbmQpXG4gIC5jb21tYW5kKGdlbkNvZGVDb21tYW5kKVxuICAuY29tbWFuZChraWxsUG9ydElmTm9uQ2lDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQobWFpbnRlbmFuY2VDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RPbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQodHJlZUtpbGxDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5sZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcblxuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jZXNzLnBpZH0pIGR1cmluZyBzaHV0ZG93bjpgLCBlcnJvcik7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IiwiZW52IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiZGVmYXVsdCIsInZlcmJvc2UiLCJhbGlhcyIsInNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQiLCJhcmd2Iiwib3V0cHV0T3B0aW9ucyIsInF1aWV0RW52Iiwic2lsZW50IiwiY2FjaGVkRW52VmFycyIsIk1hcCIsInJlYWRFbnZGaWxlIiwiZmlsZVBhdGgiLCJjYWNoZWQiLCJnZXQiLCJwYXJzZWQiLCJjb25maWciLCJwYXRoIiwicmVzb2x2ZSIsInByb2Nlc3NFbnYiLCJxdWlldCIsInNldCIsImlzRXJybm9FeGNlcHRpb24iLCJlcnJvciIsIkVycm9yIiwidHJlZUtpbGwiLCJwaWQiLCJzaWduYWwiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJydW5Db21tYW5kIiwiU3RyaW5nIiwibWF4QnVmZmVyIiwidGltZW91dCIsImlzTm9TdWNoUHJvY2Vzc0Vycm9yIiwia2lsbFRyZWVPbldpbmRvd3MiLCJkZXNjZW5kYW50cyIsInJvb3RQaWQiLCJzdGRvdXQiLCJjaGlsZHJlbkJ5UGFyZW50IiwicHNPdXRwdXQiLCJsaW5lIiwic3BsaXQiLCJtYXRjaGVkIiwiZXhlYyIsImNoaWxkUGlkIiwicGFyZW50UGlkIiwiY2hpbGRyZW4iLCJwdXNoIiwiYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwIiwicXVldWUiLCJpbmRleCIsImxlbmd0aCIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJjb2xsZWN0RGVzY2VuZGFudFBpZHMiLCJ0YXJnZXRQaWRzIiwidG9SZXZlcnNlZCIsInRvQ2hpbGRyZW5GaXJzdFBpZHMiLCJ0YXJnZXRQaWQiLCJraWxsSWZOZWVkZWQiLCJraWxsIiwiY29tbWFuZCIsImFyZ3MiLCJvcHRpb25zIiwiZXhlY0ZpbGVTeW5jIiwiZW5jb2RpbmciLCJzdGRpbyIsInN0ZGVyciIsIkJ1ZmZlciIsImlzQnVmZmVyIiwidG9TdHJpbmciLCJleHRyYWN0U3RkZXJyIiwiQ29tbWFuZEV4ZWN1dGlvbkVycm9yIiwiY29kZSIsInN0YXR1cyIsInRvRXhpdENvZGUiLCJ0ZXN0IiwiY29uc3RydWN0b3IiLCJzdXBlciIsImpvaW4iLCJ0aGlzIiwibmFtZSIsImFzeW5jIiwic3Bhd25Bc3luYyIsIlByb21pc2UiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzZXRFbmNvZGluZyIsInN0ZG91dFByaW50ZXIiLCJjcmVhdGVSZWFsdGltZVByaW50ZXIiLCJvbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmciLCJzdGRlcnJQcmludGVyIiwib24iLCJkYXRhIiwicHJpbnRpbmdTdGRvdXQiLCJ3cml0ZSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJwcmludGluZ1N0ZGVyciIsInN0b3BwZWQiLCJzdG9wUHJvY2VzcyIsImNvbnNvbGUiLCJpbmZvIiwid2FybiIsImNsZWFudXBTaWduYWxzIiwic2lnbmFsSGFuZGxlcnMiLCJyZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMiLCJyZW1vdmVMaXN0ZW5lciIsImhhbmRsZXIiLCJjbGVhciIsImtpbGxPbkV4aXQiLCJoYW5kbGVTaWduYWwiLCJsaXN0ZW5lckNvdW50IiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiZmx1c2giLCJ1bmRlZmluZWQiLCJpbnB1dCIsInN0ZGluIiwiZW5kIiwiQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAiLCJSZWdFeHAiLCJmcm9tQ29kZVBvaW50Iiwic3RyZWFtIiwib21pdEJsYW5rTGluZXMiLCJwZW5kaW5nIiwibGluZXMiLCJwb3AiLCJpc0JsYW5rTGluZSIsInJlcGxhY2VBbGwiLCJ0cmltIiwidCIsInMiLCJpIiwiZSIsIm4iLCJlbnRyaWVzIiwiaCIsImJsb2NrcyIsInJlc2V0IiwiZmluYWxpemVkIiwiYmxvY2siLCJzdGFydCIsImxhc3RCeXRlSW5kZXgiLCJwYWRkaW5nIiwib3V0cHV0Qml0cyIsImJsb2NrQ291bnQiLCJieXRlQ291bnQiLCJvdXRwdXRCbG9ja3MiLCJleHRyYUJ5dGVzIiwidXBkYXRlIiwibyIsImwiLCJjIiwiZiIsImNvZGVQb2ludEF0IiwiciIsImZpbmFsaXplIiwiaGV4IiwiYSIsInUiLCJkIiwiYiIsImsiLCJ5IiwieCIsIkIiLCJwIiwiQyIsInoiLCJJIiwiZyIsInciLCJBIiwiUCIsIkUiLCJqIiwibSIsInEiLCJ2IiwiRCIsIkYiLCJHIiwiSCIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCIkIiwiXyIsInR0Iiwic3QiLCJpdCIsImV0Iiwib3QiLCJudCIsImh0IiwicnQiLCJsdCIsImN0IiwiZnQiLCJpbnN0YW5jZSIsImZyb20iLCJtZXNzYWdlIiwic3RhY2siLCJjYXVzZSIsInN0dWIiLCJoeWRyYXRlIiwiVWludDhBcnJheSIsImJ0b2EiLCJkZWNvZGUiLCJjcmVhdGUiLCJlbmNvZGUiLCJhdG9iIiwiU2V0IiwidmFsdWVzIiwiYWRkIiwiRGF0ZSIsInRvSlNPTiIsImZsYWdzIiwic291cmNlIiwiVVJMIiwiaHJlZiIsIm1hcCIsIlRleHRFbmNvZGVyIiwiVGV4dERlY29kZXIiLCJKU09OIiwic3RyaW5naWZ5IiwiaXNOYU4iLCJpc0Zpbml0ZSIsIkFycmF5IiwiaXNBcnJheSIsImZpbGwiLCJzbGljZSIsIk9iamVjdCIsImNhY2hlRHVyYXRpb24iLCJQT1NJVElWRV9JTkZJTklUWSIsImdldENhY2hlS2V5Iiwia2luZCIsIm5vdyIsImNhbGwiLCJpc0NJIiwiY2lFbnYiLCJQcm9qZWN0IiwiX2luaXRQcm90byIsIl9hcHBseURlY3MiLCJtZW1vaXplT25lIiwicGF0aEJ5TmFtZSIsImRpclBhdGgiLCJsb2FkRW52IiwiX2RpclBhdGgiLCJpc0J1bkF2YWlsYWJsZSIsImhhc0J1blRvb2xWZXJzaW9uIiwidXNlc0J1blBhY2thZ2VNYW5hZ2VyIiwiaGFzQnVuTG9ja2ZpbGUiLCJoYXNCdW5QYWNrYWdlTWFuYWdlciIsImZzIiwicmVhZEZpbGVTeW5jIiwicm9vdERpclBhdGgiLCJzb21lIiwiZmlsZU5hbWUiLCJleGlzdHNTeW5jIiwicGFja2FnZU1hbmFnZXIiLCJyb290UGFja2FnZUpzb24iLCJwYWNrYWdlSnNvbiIsInN0YXJ0c1dpdGgiLCJidWlsZENvbW1hbmQiLCJzY3JpcHRzIiwiYnVpbGQiLCJpbmNsdWRlcyIsImRvY2tlcmZpbGUiLCJmaW5kRmlsZSIsImhhc0RvY2tlcmZpbGUiLCJoYXNTb3VyY2VDb2RlIiwiZG9ja2VySW1hZ2VOYW1lIiwiZW52VmFycyIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzIiwiY3dkIiwiZW52UGF0aHMiLCJlbnZQYXRoIiwiY2FzY2FkZSIsImNhc2NhZGVFbnYiLCJjYXNjYWRlTm9kZUVudiIsIk5PREVfRU5WIiwiYXV0b0Nhc2NhZGVFbnYiLCJXQl9FTlYiLCJpbmNsdWRlUm9vdEVudiIsInJvb3RQYXRoIiwiZmxhdE1hcCIsImZpbHRlciIsInJlbGF0aXZlIiwic2hvdWxkU3VwcHJlc3NPdXRwdXQiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMiLCJrZXlzIiwia2V5IiwidmFsdWUiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwiZXhwYW5kIiwicmVhZEVudmlyb25tZW50VmFyaWFibGVzIiwiY291bnQiLCJwYXJzZSIsInBhY2thZ2VKc29uUGF0aCIsImhhc1ByaXNtYSIsImdldE93bkRlcGVuZGVuY3lWZXJzaW9uIiwiaGFzRHJpenpsZSIsImRhdGFiYXNlT3JtIiwiaGFzVml0ZXN0IiwiZGVwZW5kZW5jaWVzIiwidml0ZXN0IiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzT3hsaW50IiwiaGFzRGVwZW5kZW5jeSIsImhhc094Zm10IiwiaGFzUHJldHRpZXIiLCJoYXNQb2V0cnlMb2NrIiwiaGFzUHVic3BlY1lhbWwiLCJwcmVmZXJyZWRMaW50ZXIiLCJoYXNPd25EZXBlbmRlbmN5IiwicGFja2FnZU5hbWUiLCJoYXNQbGF5d3JpZ2h0Q29uZmlnIiwic2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQiLCJDSSIsImNvbmZpZ1BhdGgiLCJkb2NrZXJQYWNrYWdlSnNvbiIsImRpcm5hbWUiLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmluZCIsImdldERlcGVuZGVuY3lWZXJzaW9uIiwib3B0aW9uYWxEZXBlbmRlbmNpZXMiLCJwZWVyRGVwZW5kZW5jaWVzIiwiZmluZFNlbGZQcm9qZWN0IiwiZmluZERlc2NlbmRhbnRQcm9qZWN0cyIsInJvb3RBbmRTZWxmUHJvamVjdHMiLCJmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyIsInJvb3QiLCJzZWxmIiwiZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJ2ZXJzaW9ucyIsImJ1biIsIm5wbV9leGVjcGF0aCIsInJ1bnRpbWVXaXRoQXJncyIsInBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsImJ1aWxkSWZOZWVkZWRDb21tYW5kIiwiZGVzY3JpYmUiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJwcm9qZWN0IiwiY2hhbGsiLCJyZWQiLCJncmVlbiIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwiZW52aXJvbm1lbnRKc29uIiwiaWdub3JpbmdFbnZWYXJOYW1lcyIsImhhcyIsInRvU29ydGVkIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRGaWxlUGF0aHMiLCJzcGF3blN5bmMiLCJyZXBsYWNlIiwiaW5jbHVkZVBhdHRlcm5zIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJkcnlSdW4iLCJ3cml0ZUZpbGUiLCJidWlsZElmTmVlZGVkIiwicmV0Iiwic2hlbGwiLCJleGl0Q29kZSIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJkZWZhdWx0T3B0aW9ucyIsImV4aXRJZkZhaWxlZCIsInJ1bldpdGhTcGF3biIsInNjcmlwdCIsIm9wdHMiLCJub3JtYWxpemVkU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0Iiwib21pdFNpbGVudFN0YXJ0IiwicHJpbnRTdGFydCIsInByaW50YWJsZSIsInJ1bm5hYmxlIiwicHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCIsInNpbGVudFN1Y2Nlc3MiLCJzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0IiwiQm9vbGVhbiIsInByb2Nlc3NTaWxlbnRPdXRwdXQiLCJwcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkiLCJ3cm90ZVNpbGVudFByb2dyZXNzIiwicHJvZ3Jlc3NUaW1lciIsInNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcyIsInNldEludGVydmFsIiwiY29uZmlndXJlRW52IiwicHJlc2VydmVDb2xvciIsImZpbmFsbHkiLCJjbGVhckludGVydmFsIiwib3V0cHV0Iiwic2lsZW50U3VjY2Vzc01lc3NhZ2UiLCJvblNpZ25hbCIsInJ1bldpdGhTcGF3bkluUGFyYWxsZWwiLCJydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUiLCJwcmludFJhd091dHB1dCIsIm91dCIsInByb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW4iLCJuZXdTY3JpcHQiLCJibGl0eiIsInByaW50YWJsZVNjcmlwdCIsImZpeEJ1bkNvbW1hbmQiLCJydW5uYWJsZVNjcmlwdCIsInByZWZpeCIsIndlYWsiLCJncmF5IiwiY3lhbiIsImJvbGQiLCJwcmludE9wdGlvbnMiLCJleGl0IiwibmV3RW52IiwiY2kiLCJOT19DT0xPUiIsIkZPUkNFX0NPTE9SIiwiaXNUVFkiLCJjb25maWd1cmVDb2xvckVudiIsInNoYXJlZE9wdGlvbnNCdWlsZGVyIiwiYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIiwib3B0aW9uTmFtZSIsImdldE9wdGlvblZhbHVlIiwiaXRlbSIsImNhbWVsQ2FzZU9wdGlvbk5hbWUiLCJjaGFyYWN0ZXIiLCJ0b1VwcGVyQ2FzZSIsImNvbmN1cnJlbnRseUNvbW1hbmQiLCJidWlsZGVyIiwic3VjY2VzcyIsImNob2ljZXMiLCJjb21tYW5kcyIsImRldGFjaGVkIiwiaW50ZXJydXB0ZWRTaWduYWwiLCJmaXJzdFJlc3VsdCIsInN0b3BSZXN1bHQiLCJzdG9wcGluZyIsImZvcmNlS2lsbFByb21pc2VzIiwicmVzdWx0cyIsIndhaXRGb3JFeGl0UHJvbWlzZXMiLCJjaGlsZCIsInNldHRsZWQiLCJzZXR0bGUiLCJraWxsT3RoZXJzIiwia2lsbE90aGVyc09uRmFpbCIsInNob3VsZFN0b3BPdGhlcnMiLCJ0ZXJtaW5hdGVDaGlsZHJlbiIsIm9uY2UiLCJnZXRFeGl0Q29kZSIsInN0b3BBbGwiLCJzdG9wT25TaWdpbnQiLCJzdG9wT25TaWd0ZXJtIiwic3RvcE9uU2lncXVpdCIsImFsbCIsInJlc3VsdCIsInJ1bkNvbmN1cnJlbnRseSIsImNvbnN0YW50cyIsInNpZ25hbHMiLCJmb3JjZUtpbGxQaWRzIiwic2lnbmFsUGlkcyIsInRvQ2hpbGRQaWRzIiwicGlkcyIsImRlYWRsaW5lIiwiZXZlcnkiLCJpc1Byb2Nlc3NHcm91cEdvbmUiLCJzbGVlcCIsIk1hdGgiLCJtaW4iLCJ3YWl0Rm9yRm9yY2VLaWxsIiwic2lnbmFsZWRQaWRzIiwia2lsbFByb2Nlc3NHcm91cCIsIm1zIiwic2V0VGltZW91dCIsIkZJTEVfU0NIRU1BIiwiTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FIiwiREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIIiwiUE9TU0lCTEVfUFJJU01BX1BBVEhTIiwic2NoZW1hUGF0aCIsImRiUGF0aCIsImdldERhdGFiYXNlRGlyUGF0aCIsImdldFByaXNtYUJhc2VEaXIiLCJnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uIiwibG9jYWxDb25maWdQYXRoIiwicHJpc21hU2NyaXB0cyIsImNsZWFuVXBMaXRlc3RyZWFtIiwiZGVwbG95IiwiYWRkaXRpb25hbE9wdGlvbnMiLCJnZW5lcmF0ZSIsImRlcGxveUZvcmNlIiwicmVtb3ZlRGJDb21tYW5kIiwibGlzdEJhY2t1cHMiLCJtaWdyYXRlIiwic2VlZCIsIm1pZ3JhdGVEZXYiLCJzdGVwcyIsImNsZWFudXBDb21tYW5kIiwiZGJVcmwiLCJEQVRBQkFTRV9VUkwiLCJyYXdEYlBhdGgiLCJiYXNlRGlyIiwiYWJzb2x1dGVQYXRoIiwiaXNBYnNvbHV0ZSIsImNsZWFuVXBTcWxpdGVEYklmTmVlZGVkIiwicmVzZXRDb21tYW5kIiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJzY3JpcHRQYXRoIiwicHJpc21hIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJnZW5Db2RlQ29tbWFuZCIsImdlbkNvZGVUYXJnZXRzIiwiZ2V0R2VuQ29kZVNjcmlwdHMiLCJjaGFrcmFUeXBlZ2VuU2NyaXB0IiwidmVyc2lvbiIsIm1ham9yIiwibWF0Y2giLCJnZXRPd25EZXBlbmRlbmN5TWFqb3IiLCJmaWxlRXhpc3RzIiwiZ2V0Q2hha3JhU2NyaXB0IiwiZHJpenpsZUNvbmZpZ1BhdGgiLCJnZXREcml6emxlQ29uZmlnUGF0aCIsImtpbGxQb3J0SWZOb25DaUNvbW1hbmQiLCJwb3J0RW52IiwiUE9SVCIsInBvcnQiLCJraWxsUG9ydFByb2Nlc3MiLCJraWxsUG9ydElmTm9uQ2kiLCJwcmludEJ1ZmZlcmVkT3V0cHV0IiwiaGFzV2FybmluZ091dHB1dCIsInNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQiLCJub3JtYWxpemVkT3V0cHV0Iiwibm9ybWFsaXplQnVmZmVyZWRPdXRwdXQiLCJidWlsZFNoZWxsQ29tbWFuZCIsImFyZyIsInNoZWxsRXNjYXBlQXJndW1lbnQiLCJveGxpbnRFeHRlbnNpb25zIiwicHl0aG9uRXh0ZW5zaW9ucyIsImRhcnRFeHRlbnNpb25zIiwib3hmbXRFeHRlbnNpb25zIiwicHJldHRpZXJFeHRlbnNpb25zIiwicHJldHRpZXJPbmx5RXh0ZW5zaW9ucyIsImV4dCIsInByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4iLCJsaW50Q29tbWFuZCIsImZpeCIsImZvcm1hdCIsImxpbnQiLCJmaWxlcyIsImxpbnRUYXJnZXRzIiwiZ2V0TGludFRhcmdldEZpbGVzIiwibGludEZpbGVQYXRoc0J5UHJvamVjdCIsIm94Zm10RmlsZVBhdGhzQnlQcm9qZWN0IiwicHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0IiwiZGFydEZpbGVQYXRoc0J5UHJvamVjdCIsInByZXR0aWVyRmlsZVBhdGhzIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJwcmV0dGllckFyZ3MiLCJzb3J0UGFja2FnZUpzb25BcmdzIiwibWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyIsImZpbGUiLCJmaWxlS2luZCIsInN0YXQiLCJpc0RpcmVjdG9yeSIsImdldExpbnRUYXJnZXRGaWxlS2luZCIsImV4dGVuc2lvbiIsImV4dG5hbWUiLCJnZXRFeHBsaWNpdFBhY2thZ2VKc29uUGF0aHMiLCJsaW50UGF0aCIsImdldEV4cGxpY2l0TGludFRhcmdldHMiLCJweXRob25GaWxlUGF0aHMiLCJkYXJ0RmlsZVBhdGhzIiwic3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uIiwibGludEZpbGVQYXRocyIsIm94Zm10RmlsZVBhdGhzIiwiYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuIiwiZm9ybWF0dGVyUGF0aCIsImJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzIiwiaXNQb3RlbnRpYWxMaW50VGFyZ2V0Iiwic2VsZkRpclBhdGgiLCJuZWVkc1ByZXR0aWVyIiwicHJvamVjdFBhdHRlcm4iLCJidWlsZFByZXR0aWVyQXJncyIsImZvcm1hdHRlckNvbW1hbmRzIiwibGludGVyQ29tbWFuZHMiLCJsaW50UnVuT3B0aW9ucyIsInByaW50QWxsT3V0cHV0Iiwic2hvdWxkUnVuRm9ybWF0dGVycyIsInNob3VsZFJ1bkxpbnRlcnMiLCJidWlsZExpbnRDb21tYW5kIiwiYnVpbGRQb2V0cnlMaW50Q29tbWFuZCIsImJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZCIsImJ1aWxkRGFydExpbnRDb21tYW5kIiwiYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZCIsImJ1aWxkT3hmbXRDb21tYW5kIiwibGludEV4aXRDb2RlcyIsImZvcm1hdHRlclJlc3VsdHMiLCJydW5MaW50Q29tbWFuZHMiLCJwcmludFNpbGVudExpbnRPdXRwdXRzIiwicHJldHRpZXJSZXN1bHQiLCJydW5MaW50Q29tbWFuZCIsInNvcnRQYWNrYWdlSnNvblJlc3VsdCIsImxpbnRlclJlc3VsdHMiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQiLCJ0aGVuIiwicHJpbnRhYmxlUmVzdWx0cyIsInByaW50Q29tbWFuZE91dHB1dCIsInByaW50Q29tbWFuZEhlYWRlciIsInRhcmdldHMiLCJzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIiLCJkZXNjZW5kYW50UHJvamVjdHMiLCJvd25pbmdQcm9qZWN0IiwiZmluZE93bmluZ1Byb2plY3QiLCJraWxsZWQiLCJraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MiLCJmaWx0ZXJBcmdzIiwiY29udGFpbmVySWRzIiwiaWQiLCJsaXN0RG9ja2VyQ29udGFpbmVySWRzIiwicmVtb3ZlRG9ja2VyQ29udGFpbmVycyIsInN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQiLCJjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyIsInJhd1BvcnQiLCJpc1BvcnRBdmFpbGFibGUiLCJraWxsRnVuYyIsImtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IiwiaG9zdCIsInByb2JlUG9ydCIsInNlcnZlciIsImNyZWF0ZVNlcnZlciIsImVyciIsImNsb3NlIiwibGlzdGVuIiwiZ2V0TWFpbnRlbmFuY2VTZXJ2ZXJTb3VyY2UiLCJwaWRQYXRoIiwicmF3IiwibWFpbnRlbmFuY2VDb21tYW5kIiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiYWN0aW9uIiwiYXNzZXJ0Iiwib2siLCJwYXJzZVBvcnQiLCJnZXRQaWRQYXRoIiwicmVhZFBpZCIsInJlbW92ZVBpZEZpbGUiLCJzdG9wTWFpbnRlbmFuY2VTZXJ2ZXIiLCJleGlzdGluZ1BpZCIsImlzUHJvY2Vzc1J1bm5pbmciLCJta2RpclN5bmMiLCJleGVjUGF0aCIsInVucmVmIiwid2FpdEZvclBpZEZpbGUiLCJzdGFydE1haW50ZW5hbmNlU2VydmVyIiwicm1TeW5jIiwiZm9yY2UiLCJwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQiLCJjb21tYW5kTmFtZSIsInJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCIsIm91dHNpZGUiLCJkZXBzIiwib3B0aW1pemVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZVNjcmlwdHMiLCJvcHRpbWl6ZVJvb3RQcm9wcyIsImRpc3REaXJQYXRoIiwid3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMiLCJzb3VyY2VEaXJQYXRoIiwiY3VycmVudERpclBhdGgiLCJmaWxlVVJMVG9QYXRoIiwidXJsIiwiY2FuZGlkYXRlIiwicGFyZW50RGlyUGF0aCIsImZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoIiwiZGlyZW50IiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJpc0ZpbGUiLCJ0YXJnZXRGaWxlUGF0aCIsImNvcHlGaWxlIiwiY2htb2QiLCJkZXZEZXBzIiwicHJvbW90ZWREZXBzIiwicHJvbW90ZVJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMiLCJuYW1lV29yZHNUb0JlUmVtb3ZlZCIsInJlbW92ZWREZXBzIiwid29yZCIsInJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkIiwibmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsInJlbW92ZWRTY3JpcHRzIiwiY29udGVudCIsInByaXZhdGUiLCJwdWJsaXNoQ29uZmlnIiwicHJldHRpZXIiLCJkcml6emxlU2NyaXB0cyIsInJlbW92ZUNvbW1hbmQiLCJEQVRBQkFTRV9QQVRIIiwiZ2V0RmlsZURhdGFiYXNlVXJsUGF0aCIsImJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kIiwic2VlZENvbW1hbmQiLCJtaWdyYXRlQ29tbWFuZCIsIl9wcm9qZWN0IiwicHJpc21hQ29tbWFuZCIsImFsaWFzZXMiLCJwYXJzZXJDb25maWd1cmF0aW9uIiwiY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kIiwiY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQiLCJkZXBsb3lDb21tYW5kIiwiZGVwbG95Rm9yY2VDb21tYW5kIiwiZ2VuZXJhdGVDb21tYW5kIiwibGlzdEJhY2t1cHNDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInN0dWRpb0NvbW1hbmQiLCJkZWZhdWx0Q29tbWFuZCIsImRlbWFuZENvbW1hbmQiLCJzdHJpY3QiLCJhbGxQcm9qZWN0cyIsImZpbmREYXRhYmFzZU9ybVByb2plY3RzIiwicHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnIiwidW5rbm93bk9wdGlvbnMiLCJleHRyYWN0VW5rbm93bk9wdGlvbnMiLCJvcm0iLCJnZXREYXRhYmFzZU9ybVNjcmlwdHMiLCJvcm1TY3JpcHRzIiwic2hvdWxkQ2hlY2tJZGVtcG90ZW5jeSIsImNoZWNrSWRlbXBvdGVuY3kiLCJpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudCIsInllbGxvdyIsIldCX0RPQ0tFUiIsImlzRG9ja2VyRW5hYmxlZCIsIk1JU0VfRU5WIiwicmVzdG9yZWQiLCJmdWxsQ29tbWFuZCIsInRyaW1FbmQiLCJyZXF1aXJlZEVudlZhcnMiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZIiwibWlzc2luZ0VudlZhcnMiLCJyZXRlbnRpb25DaGVja0ludGVydmFsIiwibGl0ZXN0cmVhbUNvbmZpZyIsIndyaXRlRmlsZVN5bmMiLCJyZWFzb24iLCJmaWx0ZXJlZCIsIm9ybVByb2plY3RCeVByb2plY3QiLCJvcm1Qcm9qZWN0Iiwia25vd25PcHRpb25zIiwic2hhcmVkT3B0aW9uS2V5cyIsInNoYXJlZE9wdGlvbkFsaWFzZXMiLCJvcHRpb24iLCJhbGxLbm93bk9wdGlvbnMiLCJrZWJhYkNhc2VLZXkiLCJ0b0xvd2VyQ2FzZSIsInBhc3N0aHJvdWdoQXJncyIsInJldHJ5Q29tbWFuZCIsInJldHJ5IiwiY21kQW5kQXJncyIsImxhc3RTdGF0dXMiLCJzZXR1cENvbW1hbmQiLCJkaXJlbnRzIiwib3MiLCJwYWNrYWdlcyIsInByb21pc2VBbGwiLCJwbGF5d3JpZ2h0Iiwic2V0dXAiLCJ0b0Rldk51bGwiLCJkb2NrZXJTY3JpcHRzIiwiYnVpbGRJbWFnZSIsIm1pc2VBZ2VLZXlTZWNyZXRPcHRpb24iLCJNSVNFX0FHRV9LRVkiLCJzdG9wQW5kU3RhcnQiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJCYXNlU2NyaXB0cyIsInNob3VsZFdhaXRBbmRPcGVuQXBwIiwiYnVpbGREb2NrZXIiLCJzdGFydERldiIsInN0YXJ0RGV2UHJvdGVjdGVkIiwid2FpdEFuZE9wZW5BcHAiLCJzdGFydFByb2R1Y3Rpb24iLCJzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQiLCJzdGFydFRlc3QiLCJzdGFydERvY2tlciIsIm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCIsIm5vcm1hbGl6ZWRBcmdzVGV4dCIsImN1c3RvbVN0YXJ0U2NyaXB0UGF0aCIsImZpbmRDdXN0b21Qcm9kdWN0aW9uU3RhcnRTY3JpcHRQYXRoIiwiYnVpbGRQcm9kdWN0aW9uQ29tbWFuZCIsImVjb3N5c3RlbUNvbmZpZ1BhdGgiLCJmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aCIsImJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzIiwiY21kIiwidGVzdEUyRURldiIsInRlc3RFMkVQcm90ZWN0ZWQiLCJ0ZXN0RTJFUHJvZHVjdGlvbiIsInRlc3RFMkVEb2NrZXIiLCJ0ZXN0U3RhcnQiLCJ3YWl0QXBwIiwic3RhcnRDb21tYW5kIiwiZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MiLCJwbGF5d3JpZ2h0QXJncyIsInBsYXl3cmlnaHRDb21tYW5kIiwiYmFpbCIsImJhc2UiLCJub3JtYWxpemVkVGFyZ2V0cyIsImFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uIiwicmVzdCIsImV4cGxpY2l0VGFyZ2V0SW5kZXhlcyIsImZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzIiwicmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCIsImJ1aWxkUGxheXdyaWdodENvbW1hbmQiLCJ0ZXN0VW5pdCIsImNvbW1hbmRBcmdzIiwicGxheXdyaWdodEluZGV4IiwiaW5kZXhPZiIsImlzUGxheXdyaWdodFRlc3RDb21tYW5kIiwicGVuZGluZ1ZhbHVlTW9kZSIsInRhcmdldEluZGV4ZXMiLCJvZmZzZXQiLCJQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyIsIlBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTIiwic2hvcnRPcHRpb24iLCJQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyIsImJsaXR6U2NyaXB0cyIsImh0dHBTZXJ2ZXJTY3JpcHRzIiwid2F0Y2giLCJ0ZXN0Q29tbWFuZCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwiXzEiLCJfMiIsInJlbWl4U2NyaXB0cyIsInZpdGVTY3JpcHRzIiwiaHR0cFNlcnZlclBhY2thZ2VzIiwibW9kZSIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwibmV4dCIsInZpdGUiLCJlMmUiLCJhcmd1bWVudHNCdWlsZGVyIiwiYXJyYXkiLCJ0ZXN0VGFyZ2V0cyIsInNob3VsZFJ1bkUyZSIsInNob3VsZFJ1blVuaXQiLCJoYXNFMmVUYXJnZXRzIiwidGFyZ2V0IiwiaGFzVW5pdFRhcmdldHMiLCJzaG91bGRSdW5BbGxUZXN0cyIsInJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyIsImRlZmF1bHRVbml0VGFyZ2V0cyIsImdldERlZmF1bHRVbml0VGFyZ2V0cyIsInVuaXRUYXJnZXRzIiwidW5pdEFyZ3YiLCJydW5Vbml0VGVzdENvbW1hbmQiLCJ1bml0VGltZW91dCIsImUyZVRhcmdldHMiLCJlMmVBcmd2IiwicnVuVGVzdENvbW1hbmQiLCJidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFIiwidGVzdE9uRG9ja2VyIiwiYnVpbGRFeGl0Q29kZSIsInRlc3RFeGl0Q29kZSIsInN0b3BFeGl0Q29kZSIsImRlZHVwZU5vaXN5VGVzdE91dHB1dCIsInJlY2VudFByaW50ZWRMaW5lcyIsInJlY2VudFByaW50ZWRMaW5lU2V0IiwiZGVkdXBlZExpbmVzIiwibGluZVN0YXJ0SW5kZXgiLCJsaW5lRW5kSW5kZXgiLCJpdGVyYXRlTGluZXMiLCJub3JtYWxpemVkTGluZSIsIm5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5IiwicHJpbnRlZExpbmUiLCJhcmVMaW5lc1NpbWlsYXIiLCJwdXNoUmVjZW50UHJpbnRlZExpbmUiLCJsaW5lU2V0IiwicmVtb3ZlZExpbmUiLCJzaGlmdCIsImRlbGV0ZSIsIm1heExlbmd0aCIsIm1heCIsImFicyIsImRpc3RhbmNlIiwiaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMiLCJ0ZXN0T25DaUNvbW1hbmQiLCJ0ZXN0T25DaSIsInRyZWVLaWxsQ29tbWFuZCIsImRlbWFuZE9wdGlvbiIsInR5cGVDaGVja0NvbW1hbmQiLCJyZW1vdmVkTmV4dERpciIsImJ1aWxkVHlwZVNjcmlwdFR5cGVDaGVja0NvbW1hbmRzIiwibmV4dERpclBhdGgiLCJleGl0Q29kZXMiLCJmaW5hbEV4aXRDb2RlIiwidHlwZUNoZWNrIiwidGNDb21tYW5kIiwidmVyaWZ5Q29kZUNvbW1hbmQiLCJmdWxsIiwicmVwb3J0ZXIiLCJzdGFydGVkQXQiLCJ3YkRpclBhdGgiLCJsb2dGaWxlUGF0aCIsImxvZ0ZpbGUiLCJvcGVuU3luYyIsIm9yaWdpbmFsU3Rkb3V0V3JpdGUiLCJiaW5kIiwib3JpZ2luYWxTdGRlcnJXcml0ZSIsInN1Y2NlZWRlZCIsImZpbmlzaGVkIiwidGVlV3JpdGUiLCJmZCIsImZpbmlzaCIsImVsYXBzZWRUaW1lIiwibWlsbGlzZWNvbmRzIiwic2Vjb25kcyIsInJvdW5kIiwibWludXRlcyIsImZsb29yIiwicmVtYWluaW5nU2Vjb25kcyIsImZvcm1hdEVsYXBzZWRUaW1lIiwic3VtbWFyeSIsImNvbG9yZWRTdW1tYXJ5Iiwid3JpdGVTeW5jIiwiY2xvc2VTeW5jIiwiZmFpbCIsInN1Y2NlZWQiLCJzdGFydFZlcmlmeUZ1bGxSZXBvcnRlciIsInZlcmlmeUNvZGUiLCJ0ZXN0QXJndiIsInJ1blBhY2thZ2VDb21tYW5kIiwicmV0cnlFeGl0Q29kZSIsInJ1blByb2plY3RUZXN0IiwidmVyaWZ5Q29kZUZ1bGx5IiwiYWxsb3dGYWlsdXJlIiwicnVuSW5Qcm9jZXNzQ29tbWFuZCIsInByaW50Q29tbWFuZCIsInRyaW1tZWRPdXRwdXQiLCJwcmludFBhY2thZ2VDb21tYW5kT3V0cHV0Iiwib3V0cHV0RmlsZSIsImNodW5rIiwiZW5jb2RpbmdPckNhbGxiYWNrIiwiY2FsbGJhY2siLCJidWZmZXIiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYWNrYWdlSnNvbkRpciIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiLCJzaHV0dGluZ0Rvd24iXSwibWFwcGluZ3MiOiJpc0JBT08sTUFBTUEsRUFBNEIsQ0FDdkNDLElBQUssQ0FDSEMsWUFBYSwyQkFDYkMsS0FBTSxTQUVSLGNBQWUsQ0FDYkQsWUFDRSx3TEFDRkMsS0FBTSxVQUVSLG1CQUFvQixDQUNsQkQsWUFBYSwwRkFDYkMsS0FBTSxXQUVSLG1CQUFvQixDQUNsQkQsWUFBYSxpRUFDYkMsS0FBTSxVQUNOQyxTQUFTLEdBRVgsbUJBQW9CLENBQ2xCRixZQUFhLHFHQUNiQyxLQUFNLFVBQ05DLFNBQVMsR0FFWCxZQUFhLENBQ1hGLFlBQWEscUZBQ2JDLEtBQU0sU0FDTkMsUUFBUyxnQkFFWCxZQUFhLENBQ1hGLFlBQWEsMENBQ2JDLEtBQU0sV0FFUkUsUUFBUyxDQUNQSCxZQUFhLHNDQUNiQyxLQUFNLFVBQ05HLE1BQU8sTUE2RUosU0FBU0MsRUFBZ0NDLEdBQzlDLE1BQU1DLEVBQWdCRCxFQUN0QixPQUFrQyxJQUEzQkMsRUFBY0MsV0FBaUQsSUFBM0JELEVBQWNDLFdBQStDLElBQXpCRCxFQUFjRSxNQUMvRixDQWtCQSxNQUFNQyxFQUFnQixJQUFJQyxJQUUxQixTQUFTQyxFQUFZQyxHQUNuQixNQUFNQyxFQUFTSixFQUFj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QUVELElBQUksSUFBSXRCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRXdCLEdBQUdHLEdBQUcsRUFBRUMsSUFBSSxJQUFJM0IsRUFBRW1CLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJNUIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFcUIsR0FBR1EsR0FBRyxFQUFFQyxJQUFJLElBQUk3QixFQUFFcUIsR0FBR1EsR0FBRyxFQUFFRCxJQUFJLElBQUk5QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUUyQixHQUFHeEIsR0FBRyxFQUFFRSxJQUFJLElBQUlKLEVBQUUyQixHQUFHdkIsR0FBRyxFQUFFRixJQUFJLElBQUlKLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUs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
35
+ `}const Tt={command:"maintenance <action>",describe:"Start or stop a lightweight maintenance page server. Example: wb maintenance start",builder:e=>e.positional("action",{choices:["start","stop"],describe:"Maintenance server action",type:"string"}).options(Nt),async handler(n){const r=se(n);r||(console.error(d.red("No project found.")),process.exit(1));const s=n.action;if("test"===r.env.WB_ENV)return void console.info(`Skip maintenance ${s} because WB_ENV is test.`);const i=function(e){const t=Number(e);return y.ok(Number.isInteger(t)&&t>0,`PORT environment variable is invalid: ${e}`),t}(r.env.PORT);if("start"!==s){if("stop"!==s)throw new Error(`Unknown maintenance action: ${s}`);!function(e,t){const n=_t(e,t),r=Ct(n);if(void 0===r)return void console.info(`Maintenance server is not running on port ${t}.`);try{process.kill(r,"SIGTERM")}catch{}Ft(n),console.info(`Stopped maintenance server on port ${t}.`)}(r,i)}else await async function(n,r){const s=_t(n,r),i=Ct(s);if(void 0!==i&&Bt(i))return void console.info(`Maintenance server is already running on port ${r}.`);Ft(s),await Ot(r)||(console.error(d.red(`Port ${r} is already in use.`)),process.exit(1));e.mkdirSync(t.dirname(s),{recursive:!0});const a=o.spawn(process.execPath,["--input-type=module","--eval",It(r,s)],{detached:!0,env:n.env,stdio:"ignore"});if(void 0===a.pid)throw new Error("Failed to start maintenance server.");a.unref(),await async function(e,t){const n=Date.now()+5e3;for(;Date.now()<n;){if(void 0!==Ct(e))return;if(!Bt(t))break;await b(50)}throw Ft(e),new Error("Failed to start maintenance server.")}(s,a.pid),console.info(`Started maintenance server on port ${r}.`)}(r,i)}};function _t(e,n){return t.join(e.rootDirPath,".tmp",`wb-maintenance-server-${n}.pid`)}function Ct(t){try{const n=Number(e.readFileSync(t,"utf8").trim());return Number.isInteger(n)&&n>0?n:void 0}catch{return}}function Bt(e){try{return process.kill(e,0),!0}catch{return!1}}function Ft(t){try{e.rmSync(t,{force:!0})}catch{}}function*zt(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const Mt=["@willbooster/wb","build-ts"],Lt={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){const r=await ie(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const o of zt("optimizeForDockerBuild",r.descendants)){const r=o.packageJson,s=["dependencies","devDependencies"];for(const e of s){const t=r[e]??{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(Ut(n,r),Jt(r),Yt(r),n.dryRun)continue;const i=n.outside?t.join(o.dirPath,"dist"):o.dirPath;await e.promises.mkdir(i,{recursive:!0}),await e.promises.writeFile(t.join(i,"package.json"),JSON.stringify(r),"utf8"),n.outside&&await Wt(t.join(i,"bash"))}n.dryRun||n.outside||(o.spawnSync(ue,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};async function Wt(n){const r=function(){let n=t.dirname(k(import.meta.url));for(;;){const r=t.join(n,"docker","bash");if(e.existsSync(r))return r;const o=t.dirname(n);if(o===n)throw new Error("Docker shell scripts directory not found.");n=o}}();await e.promises.mkdir(n,{recursive:!0});for(const o of await e.promises.readdir(r,{withFileTypes:!0})){if(!o.isFile()||!o.name.endsWith(".sh"))continue;const s=t.join(n,o.name);await e.promises.copyFile(t.join(r,o.name),s),await e.promises.chmod(s,493)}console.info(`Generated Docker shell scripts: ${t.relative(process.cwd(),n)||n}`)}function Ut(e,t){!function(e){const t=e.devDependencies??{},n=e.dependencies??{},r=[];for(const e of Mt){const o=t[e];o&&(n[e]||(n[e]=o,r.push(e)),delete t[e])}r.length>0&&(e.dependencies=n);console.info("Promoted runtime devDependencies:",r.join(", ")||"none")}(t),e.outside?function(e){const t=e.devDependencies??{},n=["artillery","concurrently","conventional-changelog-conventionalcommits","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],r=[];for(const e of Object.keys(t))(n.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete t[e],r.push(e));console.info("Removed devDependencies:",r.join(", ")||"none")}(t):(delete t.devDependencies,console.info("Removed all devDependencies."))}function Jt(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],r=e.scripts??{},o=[];for(const[e,s]of Object.entries(r))(t.some(t=>e.startsWith(t))||n.some(e=>s.includes(e)||s.trim()===e.trim()))&&(delete r[e],o.push(e));console.info("Removed scripts:",o.join(", ")||"none")}function Yt(e){delete e.private,delete e.publishConfig,delete e.prettier}const Vt="file:";const Gt=new class{reset(e,n=""){const r=function(e){const n=e.env.DATABASE_PATH??function(e){const t=e.env.DATABASE_URL;if(!t?.startsWith(Vt))return;const n=t.slice(5).replace(/[?#].*$/,"");if(!n)return;return n}(e);if(!n)return;const r=t.isAbsolute(n)?n:t.resolve(e.dirPath,n);return`rm -f "${r}" "${r}-wal" "${r}-shm"`}(e);return r?`${r} && ${this.migrate(e,n)}`:"echo 'wb db reset supports Drizzle only when DATABASE_PATH or file: DATABASE_URL is set.' && exit 1"}migrate(e,t=""){const n=this.seed(e),r=this.deploy(e,t);return"true"===n?r:`${r} && ${n}`}deploy(e,t=""){return`YARN drizzle-kit migrate ${t}`}generate(e,t=""){return`YARN drizzle-kit generate ${t}`}migrateDev(e,t=""){return this.generate(e,t)}seed(e,t){return t?`BUN build-ts run ${t}`:e.packageJson.scripts?.seed?"YARN run seed":"true"}studio(e,t,n=""){return t?"echo 'wb db studio for Drizzle does not support db-url-or-path.' && exit 1":`YARN drizzle-kit studio ${n}`}},qt={},Kt={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(Ht).command(Qt).command(Zt).command(Xt).command(en).command(tn).command(nn).command(sn).command(an).command(cn).command(dn).command(ln).command(un).demandCommand().strict(!1),handler(){}},Ht={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:qt,async handler(e){const t=await fn(e,"prisma");for(const{project:n}of mn("prisma cleanup-litestream",t))await ke(Ve.cleanUpLitestream(n),n,e)}},Qt={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:qt,async handler(e){const t=await fn(e,"prisma");for(const{project:e}of mn("prisma create-litestream-config",t))pn(e)}},Zt={command:"deploy",describe:"Apply migration to DB without initializing it",builder:qt,async handler(e){const t=await fn(e),n=gn(e);for(const{orm:r,project:o}of mn("db deploy",t))await ke(hn(r).deploy(o,n),o,e)}},Xt={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:qt,async handler(e){const t=await fn(e,"prisma");for(const{project:n}of mn("prisma deploy-force",t))await ke(Ve.deployForce(n),n,e)}},en={command:"generate",describe:"Generate ORM client code",builder:qt,async handler(e){const t=await fn(e),n=gn(e);for(const{orm:r,project:o}of mn("db generate",t))await ke(hn(r).generate(o,n),o,e)}},tn={command:"list-backups",describe:"List Litestream backups",builder:qt,async handler(e){const t=await fn(e,"prisma");for(const{project:n}of mn("prisma list-backups",t))await ke(Ve.listBackups(n),n,e)}},nn={command:"migrate",describe:"Apply migration to DB with initializing it",builder:{...qt,"check-idempotency":{description:"Run the migration command twice to confirm it is idempotent.",type:"boolean"}},async handler(e){const t=await fn(e),n=gn(e,["check-idempotency"]);for(const{orm:r,project:o}of mn("db migrate",t)){const t=hn(r);await ke(t.migrate(o,n),o,e),rn(o,e.checkIdempotency)&&(on(o)?console.info(d.yellow(`Skipping idempotency check for ${o.name} in production environment.`)):await ke(t.deploy(o,n),o,e))}}};function rn(e,t){return t??function(e){return!!e.env.WB_DOCKER&&"0"!==e.env.WB_DOCKER&&"false"!==e.env.WB_DOCKER}(e)}function on(e){return"production"===e.env.WB_ENV||"production"===e.env.MISE_ENV}const sn={command:"migrate-dev",describe:"Create a migration file",builder:qt,async handler(e){const t=await fn(e),n=gn(e);for(const{orm:r,project:o}of mn("db migrate-dev",t))await ke(hn(r).migrateDev(o,n),o,e)}},an={command:"reset",describe:"Reset DB",builder:qt,async handler(e){const t=await fn(e),n=gn(e);for(const{orm:r,project:o}of mn("db reset",t))await ke(hn(r).reset(o,n),o,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const{orm:t,project:r}of mn("WB_ENV=test db reset",await fn(e)))await ke(hn(t).reset(r,n),r,e)}}},cn={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...qt,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await fn(e,"prisma");for(const{project:n}of mn("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await ke(Ve.restore(n,t),n,e)}}},dn={command:"seed",describe:"Populate DB with seed data",builder:{...qt,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await fn(e);for(const{orm:n,project:r}of mn("db seed",t))await ke(hn(n).seed(r,e.file),r,e)}},ln={command:"studio [db-url-or-path]",describe:"Open database studio",builder:{...qt,"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 new Error("You cannot specify both --restored and --db-url-or-path.");const t=await fn(e),n=gn(e,["db-url-or-path","restored"]);for(const{orm:r,project:o}of mn("db studio",t)){const t=e.restored?o.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await ke(hn(r).studio(o,t,n),o,e)}}},un={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){const t=await fn(e),n=[(e.args?.join(" ")??"").trimEnd(),gn(e,["args"])].filter(Boolean).join(" ");for(const{orm:r,project:o}of mn(`db ${n}`,t)){const t="prisma"===r?`PRISMA ${n}`:`YARN drizzle-kit ${n}`;await ke(t,o,e)}}};function pn(t){const n=`${t.packageJson.dependencies?.blitz?"db":"prisma"}/mount/prod.sqlite3`,r={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(r).filter(([,e])=>!e).map(([e])=>e);if(o.length>0)throw new Error(`Missing environment variables for Litestream: ${o.join(", ")}`);const s="staging"===t.env.WB_ENV?"5m":"1h",i=`dbs:\n - path: ${n}\n busy-timeout: 5s\n checkpoint-interval: 1m\n replica:\n type: s3\n endpoint: https://${r.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID}.r2.cloudflarestorage.com\n bucket: ${r.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME}\n access-key-id: ${r.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID}\n secret-access-key: ${r.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY}\n snapshot-interval: 24h # Create a backup per day\n retention: 72h # Keep backups for 3 days\n retention-check-interval: ${s}\n sync-interval: 1m\n`,a="/etc/litestream.yml";try{e.writeFileSync(a,i),console.info(`Generated ${a}`)}catch(e){const t=e instanceof Error?e.message:String(e);throw new Error(`Failed to write ${a}: ${t}`,{cause:e})}}async function fn(e,t){const n=await ie(e);n||(console.error(d.red("No project found.")),process.exit(1));const r=n.descendants.map(e=>e.databaseOrm?{project:e,orm:e.databaseOrm}:void 0).filter(e=>!(!e||t&&e.orm!==t));return 0===r.length&&(console.error(d.red(t?`No ${t} project found.`:"No supported database ORM project found.")),process.exit(1)),r}function hn(e){return"prisma"===e?Ve:Gt}function*mn(e,t){const n=new Map(t.map(e=>[e.project,e]));for(const r of zt(e,t.map(({project:e})=>e))){const e=n.get(r);if(!e)throw new Error(`Failed to detect database ORM for ${r.name}.`);yield e}}function gn(e,t=[]){const n=[],r=Object.keys(je),o=Object.values(je).flatMap(e=>"alias"in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),s=new Set([...t,...r,...o,"--","_","$0"]);for(const[t,r]of Object.entries(e))if(!s.has(t)){const o=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(o!==t&&void 0!==e[o])continue;if("boolean"==typeof r&&r)n.push(`--${t}`);else if("string"==typeof r||"number"==typeof r)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(const e of r)n.push(`--${t}`,String(e))}const i=Array.isArray(e["--"])?e["--"].map(String):[];return Ze([...n,...i])}const wn={command:"retry [command] [args...]",describe:"Retry the given command until it succeeds",builder:{retry:{description:"A maximum retry count",type:"number",alias:"r",default:3}},async handler(e){const t=se(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let o=0;o<e.retry;o++)if(o>0&&console.info(`\n${d.yellow(`#${o} Retrying: ${n.join(" ")}`)}`),r=await ke(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},yn={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await ie(e,!1,t);n||(console.error(d.red("No project found.")),process.exit(1));for(const t of zt("setup",n.descendants)){const r=await w.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===f.platform()){const n=["pstree"];await Ee(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await ke("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await Ee("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await Ee(`poetry env use ${n}`,t,e),await be.promiseAll(),await ke("poetry run pip install --upgrade pip",t,e),await ke("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await ke(`${pe} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await ke(`${pe} playwright install --with-deps`,r,e)}(e)}};function bn(e){return e.silent?" > /dev/null":""}const vn=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"",o=e.env.MISE_AGE_KEY?"\n --secret id=mise_age_key,env=MISE_AGE_KEY":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)\n --build-arg WB_ENV=${e.env.WB_ENV}\n --build-arg WB_VERSION=${n}${o} .`}stopAndStart(e,t="",n=""){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t="",n=""){!function(e,t){const n=()=>{if($t.has(e))return;$t.add(e),Pe(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});Ae(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e);return`docker run --rm ${n.includes("/bin/bash")?"-it ":""}${e.env.MISE_AGE_KEY?"--env MISE_AGE_KEY ":""}--publish ${e.env.PORT}:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class kn{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return vn.buildImage(e,t)}async startDev(e,t){return await Rt(e.env.PORT,e),this.shouldWaitAndOpenApp?Ze(["YARN","wb","concurrently",...Re(t),"--kill-others-on-fail",this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await Rt(e.env.PORT,e),this.shouldWaitAndOpenApp?Ze(["YARN","wb","concurrently",...Re(t),"--kill-others-on-fail",this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await Rt(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await Rt(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && ${Ze(["YARN","wb","concurrently",...Re(t),"--kill-others-on-fail",vn.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??""),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,"development")}\n && ${vn.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProductionProtected(e,t){const n=function(e){try{return e.findFile("scripts/start-production.sh")}catch{return}}(e);if(n)return this.buildProductionCommand(e,t,[e.buildCommand,`${Ze(["bash",n])} ${t.normalizedArgsText??""}`.trim()]);const r=function(e){try{return e.findFile("ecosystem.config.cjs")}catch{return}}(e),o=r?[e.buildCommand,`pm2-runtime start --no-autorestart ${r}`]:this.buildDefaultProductionStartCommands(e,t);return this.buildProductionCommand(e,t,o)}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`${e.isBunAvailable?"bun":"node"} dist/index.js ${t.normalizedArgsText??""}`.trim()]}buildProductionCommand(e,t,n){return[...[...e.hasPrisma?[Ve.migrate(e)]:[],...e.hasDrizzle?[Gt.migrate(e)]:[]].flatMap(e=>e.split("&&")),...n].filter(Boolean).map(e=>`${e} ${bn(t)}`.trim()).join(" && ")}testE2EDev(e,t,n){return this.testE2EProtected(e,t,this.startDevProtected(e,t),n)}testE2EProduction(e,t,n){return this.testE2EProtected(e,t,this.startProductionProtected(e,t),n)}testE2EDocker(e,t,n){return this.testE2EProtected(e,t,vn.stopAndStart(e),n)}async testStart(e,t){return await Rt(e.env.PORT,e),`${n="NODE_ENV",r="",`${n}=${Xe(r)}`} ${Ze(["YARN","wb","concurrently",...Re(t),"--kill-others","--success","first",this.startDevProtected(e,t),this.waitApp(e)])}`;var n,r}async testE2EProtected(e,t,n,{forwardedPlaywrightArgs:r=[],playwrightArgs:o=["test","test/e2e/"]}){const s=await Rt(e.env.PORT,e),i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",a=function(e,t,n,r=[]){const o=["BUN","playwright"],s=t?.map(String);if("test"!==e[0]||!s?.length)return En([...o,...e,...r],n);const i=e.slice(1),a=Sn(i),c=0===a.length?i:i.filter((e,t)=>!a.includes(t));return En([...o,"test",...s,...c,...r],n)}(o,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${a}${i}`:Ze(["YARN","wb","concurrently",...Re(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s}\n && ${a}${i}`])}testUnit(e,t){const n=t.targets?.map(String);return e.hasVitest?Ze(["YARN","vitest","run",...n?.length?n:["test/unit/"],"--passWithNoTests","--allowOnly","--watch=false",...t.bail?["--bail=1"]:[]]):e.isBunAvailable?Ze(["bun","test",...n?.length?n:["test/unit/"],...t.bail?["--bail"]:[]]):'echo "No tests."'}waitApp(e){const t=e.env.PORT;return`wait-on -t 10000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){const t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}}function En(e,t){const n=e.indexOf("playwright"),r=-1!==n&&"test"===e[n+1];return t&&r?e.some(e=>"--max-failures"===e||e.startsWith("--max-failures="))?Ze(e):Ze([...e,"--max-failures=1"]):Ze(e)}function Sn(e){let t;const n=[];for(const[r,o]of e.entries()){if(t){if("required"===t||!o.startsWith("-")){t=void 0;continue}t=void 0}if("--"===o)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(o.startsWith("--")){if(o.includes("="))continue;Pn.has(o)?t="required":An.has(o)&&(t="optional")}else{if(o.startsWith("-")&&"-"!==o){const e=o.slice(0,2);2===o.length&&xn.has(e)&&(t="required");continue}n.push(r)}}return n}const Pn=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"]),An=new Set(["--only-changed","--update-snapshots","--update-source-method"]),xn=new Set(["-c","-g","-j"]);const $n=new class extends kn{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const jn=new class extends kn{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);const o=await Rt(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets?.map(String),a=i?.length?i:["test/e2e/"],c=this.testUnit(e,{...t,targets:a});return Ze(["YARN","wb","concurrently",...Re(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o} && ${c}${s}`])}};const Rn=new class extends kn{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`next start ${t.normalizedArgsText??""}`.trim()]}};const On=new class extends kn{constructor(){super(!1)}startDevProtected(e,t){throw new 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} && ${le} 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")} && ${vn.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`)}testE2EDev(){return Promise.resolve("echo 'do nothing.'")}testE2EProduction(){return Promise.resolve("echo 'do nothing.'")}testE2EDocker(){return Promise.resolve("echo 'do nothing.'")}testStart(){return Promise.resolve("echo 'do nothing.'")}};const Dn=new class extends kn{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const Nn=new class extends kn{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()}},In=["express","fastify","elysia","hono"],Tn={watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug | test",type:"string",alias:"m"}},_n={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(Tn),async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e["--"]??[]].map(e=>Xe(String(e))).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>Xe(String(e))).join(" ")}(e);const t=await ie(e);t||(console.error(d.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{};let o;if(t.blitz)o=$n;else if(t.next)o=Rn;else if(r["@remix-run/dev"])o=Dn;else if(r.vite)o=Nn;else if(In.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))o=jn;else{if(!t["build-ts"]&&!r["build-ts"])continue;o=On}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await ke(await o.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await ke(await o.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await ke(await o.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await ke(await o.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await o.startTest(n,e);await ke(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},Cn=new RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,"g"),Bn={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"}},Fn={array:!0,description:"Unit or E2E test target paths",type:"string"},zn={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(Bn).positional("targets",Fn),async handler(e){process.exit(await Mn(e))}};async function Mn(n,r={}){const o=function(e){if(e.env?.length||e.cascadeEnv||e.cascadeNodeEnv||!1===e.autoCascadeEnv)return e;return{...e,cascadeEnv:"test"}}(n),s=await ie(o);if(!s)return console.error(d.red("No project found.")),1;const i=o.targets??[],a=o["--"]??[],{shouldRunE2e:c,shouldRunUnit:l}=function(e,t=[]){const n=e.some(e=>e.includes("/e2e")),r=e.some(e=>e.includes("/unit")),o=0===e.length&&0===t.length;return{shouldRunUnit:o||r,shouldRunE2e:o||n||t.length>0}}(i,a);for(const n of s.descendants){n.env.WB_ENV||="test";const s=n.packageJson.dependencies??{},d=n.packageJson.devDependencies??{};let u;u=s.blitz?$n:s.next?Rn:d["@remix-run/dev"]?Dn:d.vite?Nn:In.some(e=>s[e])&&!s["firebase-functions"]?jn:On,console.info(`Running "test" for ${n.name} ...`);const p=Ln(n);if(l&&!1!==p){const e=i.filter(e=>e.includes("/unit")),t=e.length>0?e:p.length>0?p:void 0,s={...o,targets:t},a=await Jn(u.testUnit(n,s),n,o,{exitIfFailed:r.exitIfFailed,timeout:o.unitTimeout});if(0!==a)return a}if(!c||!e.existsSync(t.join(n.dirPath,"test","e2e")))continue;const f=i.filter(e=>e.includes("/e2e")),h={...o,targets:f.length>0?f:void 0};switch(o.e2e){case"headless":{const e=await Un(await u.testE2EProduction(n,h,{playwrightArgs:Kn(f,a),forwardedPlaywrightArgs:a}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;continue}case"headless-dev":{const e=await Un(await u.testE2EDev(n,h,{playwrightArgs:Kn(f,a),forwardedPlaywrightArgs:a}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;continue}case"docker":{const e=await Wn(n,h,u,Kn(f,a),a,r);if(0!==e)return e;continue}case"docker-debug":{const e=await Wn(n,h,u,Kn(f,a,["--debug"]),a,r);if(0!==e)return e;continue}}if(s.blitz||s.next||d["@remix-run/dev"]||d.vite)switch(o.e2e){case"headed":{const e=await Un(await u.testE2EProduction(n,h,{playwrightArgs:Kn(f,a,["--headed"]),forwardedPlaywrightArgs:a}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"headed-dev":{const e=await Un(await u.testE2EDev(n,h,{playwrightArgs:Kn(f,a,["--headed"]),forwardedPlaywrightArgs:a}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"debug":{const e=await Un(await u.testE2EProduction(n,h,{playwrightArgs:Kn(f,a,["--debug"]),forwardedPlaywrightArgs:a}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"generate":{const e=await Un(await u.testE2EProduction(n,h,{playwrightArgs:["codegen",`http://localhost:${n.env.PORT}`]}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"trace":{const e=await Un("BUN playwright show-trace",n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}}}return 0}function Ln(n){return e.existsSync(t.join(n.dirPath,"test","unit"))?[]:!(!n.hasVitest||!e.existsSync(t.join(n.dirPath,"test")))&&(e.existsSync(t.join(n.dirPath,"test","e2e"))?["test","--exclude","test/e2e/**"]:["test"])}async function Wn(e,t,n,r,o,s={}){e.env.WB_DOCKER||="1";const i=await ke(`${n.buildDocker(e,"test")}${bn(t)}`,e,t,{exitIfFailed:s.exitIfFailed});if(0!==i)return i;const a=await Un(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:o}),e,t,{exitIfFailed:!1}),c=await ke(vn.stop(e),e,t,{exitIfFailed:s.exitIfFailed});return 0!==a?a:c}function Un(e,t,n,r={}){return ke(e,t,n,{...r,processSilentOutput:Yn})}function Jn(e,t,n,r={}){return ke(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:"Unit tests passed."})}function Yn(e){const t=[],n=new Set,r=[];for(const o of function*(e){let t=0;for(;t<=e.length;){const n=e.indexOf("\n",t);if(-1===n)return void(yield e.slice(t));yield e.slice(t,n),t=n+1}}(e)){const e=Gn(o);n.has(e)||(t.some(t=>qn(t,e))||(Vn(t,n,e),r.push(o)))}return r.join("\n")}function Vn(e,t,n){if(e.push(n),t.add(n),e.length<=200)return;const r=e.shift();void 0!==r&&t.delete(r)}function Gn(e){return e.replaceAll(Cn,"").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 qn(e,t){const n=Math.max(e.length,t.length);return 0===n||!(Math.abs(e.length-t.length)>.05*n)&&E(e,t)/n<=.05}function Kn(e,t=[],n=[]){const r=Sn(t).length>0;return["test",...e.length>0||r?[]:["test/e2e/"],...n]}const Hn={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{silent:{description:"Reduce redundant outputs",type:"boolean"}},async handler(n){await async function(n){const r=await ie(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const o of r.descendants){o.env.CI||="1",o.env.WB_ENV||="test";const r=o.packageJson.dependencies??{},s=o.packageJson.devDependencies??{};let i;i=r.blitz?$n:r.next?Rn:s["@remix-run/dev"]?Dn:s.vite?Nn:In.some(e=>r[e])&&!r["firebase-functions"]?jn:On,console.info(`Running "test-on-ci" for ${o.name} ...`);const a=o.hasDockerfile;if(a&&await Ee(vn.stopAll(),o,n),e.existsSync(t.join(o.dirPath,"test","unit"))&&await Ee(i.testUnit(o,n).replaceAll(" --allowOnly",""),o,n),e.existsSync(t.join(o.dirPath,"test","e2e"))){await Ee(await i.testStart(o,n),o,n),await be.promiseAll(),a&&(o.env.WB_DOCKER||="1",await ke(`${i.buildDocker(o,"test")}${bn(n)}`,o,n));const e=a?await i.testE2EDocker(o,n,{}):await i.testE2EProduction(o,n,{});process.exitCode=await ke(e.replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),a&&await ke(vn.stop(o),o,n)}}}(n)}};const Qn={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{const t=e.signal;if(!(t in h.signals))throw new Error(`Invalid signal: ${t}`);j(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},Zn={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){process.exit(await async function(n){const r=await ie(n,!1);if(!r)return console.error(d.red("No project found.")),1;let o=!1;const s=r.descendants.map(async s=>{const i=[];for(s.packageJson.workspaces&&!s.hasSourceCode||i.push(...function(e){if(e.hasOwnDependency("@typescript/native-preview"))return["BUN tsgo --noEmit"];if(e.hasOwnDependency("typescript"))return["BUN tsc --noEmit"];return[]}(s)),!s.packageJson.workspaces&&s.hasOwnDependency("pyright")&&i.push("YARN pyright");i.length>0;){const a=await Ee(i.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,preserveColor:!0}),c=t.join(s.dirPath,".next");if(!a||!e.existsSync(c))return a;e.rmSync(c,{force:!0,recursive:!0}),console.info(d.yellow("Removed `.next` directory. We will re-try type checking.")),o=!0}}),i=await Promise.all(s);let a=0;for(const[e,t]of i.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(d.yellow('Please try "yarn gen-code" if you face unknown type errors.')),a=t}a||console.info(d.green(o?"-----\nNo type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.":"No type errors found."));return a}(n))}};const Xn={...Zn,command:"tc"},er={command:"verify",describe:"Verify project code",builder:{full:{type:"boolean",default:!1,describe:"Run tests after verifying project code"}},async handler(n){const r=ae(n,!1);r||(console.error(d.red("No project found.")),process.exit(1)),await(n.full?async function(n,r){const o=function(n){const r=Date.now(),o=t.join(n.dirPath,".wb");e.mkdirSync(o,{recursive:!0});const s=t.join(o,"verify-full.log"),i=e.openSync(s,"w"),a=process.stdout.write.bind(process.stdout),c=process.stderr.write.bind(process.stderr);let l=!1,u=!1;process.stdout.write=rr(process.stdout.fd,i),process.stderr.write=rr(process.stderr.fd,i),console.info(d.cyan(d.bold("Full log:"),s));const p=()=>{if(u)return;u=!0,process.stdout.write=a,process.stderr.write=c;const t=function(e){const t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;if(0===n)return`${r}s`;return`${n}m ${r}s`}(Date.now()-r),n=`${l?"Succeeded":"Failed"} in ${t}. Full log: ${s}\n`,o=l?d.green(n):d.red(n);a(o),e.writeSync(i,n),e.closeSync(i)};return process.once("exit",p),{fail:e=>{l=!1,e&&console.error(e)},finish:()=>{process.removeListener("exit",p),p()},succeed:()=>{l=!0}}}(n);try{await tr(n,r),await async function(e,t){const n={...t,_:["test"],e2e:"headless",silent:!0},r=await Mn(n,{exitIfFailed:!1});if(0===r)return;e.packageJson.scripts?.["db-reset"]||(console.info(d.red(d.bold(`Failed (exit code ${r}):`),"test")),process.exit(r));console.info(d.yellow('Tests failed. This project defines "db-reset", so wb will reset the database once and retry tests.')),await nr(`${ue} db-reset`,e,t,{printRawOutput:!0});const o=await Mn(n,{exitIfFailed:!1});0!==o&&(console.info(d.red(d.bold(`Failed (exit code ${o}):`),"test after db-reset retry")),process.exit(o));console.info(d.green("Tests passed after db-reset retry."))}(n,r),o.succeed()}catch(e){throw o.fail(e),e}finally{o.finish()}}(r.self,n):tr(r.self,n))}};async function tr(e,t){await nr(`${ue} install`,e,t),e.packageJson.scripts?.["gen-code"]&&await nr(`${ue} gen-code`,e,t),await async function(e,t,n={}){n.silent||console.info("\n"+d.cyan(d.bold("Start:"),e));const r=await t()??0;0===r||n.allowFailure?n.silent||console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${r}):`),e)),process.exit(r));return r}("cleanup",()=>ct({...t,_:["lint"],fix:!0,format:!0,printAllOutput:!0,quiet:!0,silent:!0}),{silent:!0})}async function nr(e,t,n,r={}){if(function(e,t){console.info("\n"+d.cyan(d.bold("Command:"),e)+d.gray(` at ${t}`))}(e,t.dirPath),n.dryRun)return 0;const o=await I(e,void 0,{cwd:t.dirPath,env:xe(t.env,{preserveColor:!1}),shell:!0,stdio:"pipe",mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose}),s=o.status??1;return r.printRawOutput||function(e,t,n){if(0===t&&(e===`${ue} install`||e===`${ue} gen-code`))return void console.info(d.green("Succeeded."));const r=n.trim();r&&(process.stdout.write(r),process.stdout.write("\n"))}(e,s,o.stdout),0===s||r.allowFailure||(console.info(d.red(d.bold(`Failed (exit code ${s}):`),e)),process.exit(s)),s}function rr(t,n){return(r,o,s)=>{const i="string"==typeof r?Buffer.from(r,"string"==typeof o?o:"utf8"):r;return e.writeSync(n,i),e.writeSync(t,i),"function"==typeof o&&o(),s?.(),!0}}await n(r(process.argv)).scriptName("wb").options(je).middleware(e=>{const n=e["working-dir"];if(n){const e=t.resolve(n);process.chdir(e)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)}).command(er).command(fe).command(De).command(Ge).command(He).command(at).command(Tt).command(Lt).command(Kt).command(wn).command(yn).command(_n).command(zn).command(Hn).command(Qn).command(Zn).command(Xn).demandCommand().strict().version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).help().argv;let or=!1;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{if(!or){or=!0;try{j(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
36
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvZ2VuQ29kZS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvdXRpbHMvb3V0cHV0LnRzIiwiLi4vc3JjL3V0aWxzL3NoZWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2xpbnQudHMiLCIuLi9zcmMvdXRpbHMvcHJvY2Vzcy50cyIsIi4uL3NyYy91dGlscy9wb3J0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL21haW50ZW5hbmNlLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmRVdGlscy50cyIsIi4uL3NyYy9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLnRzIiwiLi4vc3JjL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdE9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvdHJlZUtpbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ZlcmlmeUNvZGUudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52ID0ge1xuICBlbnY6IHtcbiAgICBkZXNjcmlwdGlvbjogJy5lbnYgZmlsZXMgdG8gYmUgbG9hZGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgJ2Nhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0Vudmlyb25tZW50IHRvIGxvYWQgY2FzY2FkaW5nIC5lbnYgZmlsZXMgKGUuZy4sIGAuZW52YCwgYC5lbnYuPGVudmlyb25tZW50PmAsIGAuZW52LmxvY2FsYCBhbmQgYC5lbnYuPGVudmlyb25tZW50Pi5sb2NhbGApLiBQcmVmZXJyZWQgb3ZlciBgY2FzY2FkZS1ub2RlLWVudmAgYW5kIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICAnY2FzY2FkZS1ub2RlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LiBQcmVmZXJyZWQgb3ZlciBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdhdXRvLWNhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PFdCX0VOViB8fCBOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdpbmNsdWRlLXJvb3QtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSAuZW52IGZpbGVzIGluIHJvb3QgZGlyZWN0b3J5IGlmIHRoZSBwcm9qZWN0IGlzIGluIGEgbW9ub3JlcG8gYW5kIC0tZW52IG9wdGlvbiBpcyBub3QgdXNlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnY2hlY2stZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ2hlY2sgd2hldGhlciB0aGUga2V5cyBvZiB0aGUgbG9hZGVkIC5lbnYgZmlsZXMgYXJlIHNhbWUgd2l0aCB0aGUgZ2l2ZW4gLmVudiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJy5lbnYuZXhhbXBsZScsXG4gIH0sXG4gICdxdWlldC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdXBwcmVzcyAuZW52IGZpbGUgbG9hZGluZyBpbmZvcm1hdGlvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52UGF0aHMsIGVudlZhck5hbWVzXVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgc3RyaW5nW11dW11dIHtcbiAgbGV0IGVudlBhdGhzID0gKGFyZ3YuZW52ID8/IFtdKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVzb2x2ZShjd2QsIGVudlBhdGgudG9TdHJpbmcoKSkpO1xuICBjb25zdCBjYXNjYWRlID1cbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudlxuICAgICAgPyBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBwcm9jZXNzLmVudi5XQl9FTlYgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gIGlmICh0eXBlb2YgY2FzY2FkZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoZW52UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihjd2QsICcuZW52JykpO1xuICAgICAgaWYgKGFyZ3YuaW5jbHVkZVJvb3RFbnYpIHtcbiAgICAgICAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCAnLi4nLCAnLi4nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4ocm9vdFBhdGgsICcuZW52JykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhzID0gZW52UGF0aHMuZmxhdE1hcCgoZW52UGF0aCkgPT5cbiAgICAgIGNhc2NhZGVcbiAgICAgICAgPyBbYCR7ZW52UGF0aH0uJHtjYXNjYWRlfS5sb2NhbGAsIGAke2VudlBhdGh9LmxvY2FsYCwgYCR7ZW52UGF0aH0uJHtjYXNjYWRlfWAsIGVudlBhdGhdXG4gICAgICAgIDogW2Ake2VudlBhdGh9LmxvY2FsYCwgZW52UGF0aF1cbiAgICApO1xuICB9XG4gIGVudlBhdGhzID0gZW52UGF0aHMuZmlsdGVyKChlbnZQYXRoKSA9PiBmcy5leGlzdHNTeW5jKGVudlBhdGgpKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVsYXRpdmUoY3dkLCBlbnZQYXRoKSk7XG4gIGNvbnN0IHNob3VsZFN1cHByZXNzT3V0cHV0ID0gc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oYFdCX0VOVjogJHtwcm9jZXNzLmVudi5XQl9FTlZ9LCBOT0RFX0VOVjogJHtwcm9jZXNzLmVudi5OT0RFX0VOVn1gKTtcbiAgICBjb25zb2xlLmluZm8oJ1JlYWRpbmcgZW52IGZpbGVzOicsIGVudlBhdGhzLmpvaW4oJywgJykpO1xuICB9XG5cbiAgY29uc3QgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzOiBbc3RyaW5nLCBzdHJpbmdbXV1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCkpKSkge1xuICAgICAgaWYgKCEoa2V5IGluIGVudlZhcnMpICYmICEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5wdXNoKFtlbnZQYXRoLCBrZXlzXSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQgJiYga2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtrZXlzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgfVxuICBpZiAoIWFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBgUmVhZCBlbnYgZmlsZXM6ICR7ZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLm1hcCgoW2VudlBhdGgsIGtleXNdKSA9PiAoa2V5cy5sZW5ndGggPiAwID8gYCR7ZW52UGF0aH0gKCR7a2V5cy5qb2luKCcsICcpfSlgIDogZW52UGF0aCkpLmpvaW4oJywgJykgfHwgJ25vdGhpbmcnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2V4cGFuZCh7IHBhcnNlZDogZW52VmFycywgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IGVudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lc107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3Qgb3V0cHV0T3B0aW9ucyA9IGFyZ3YgYXMgRW52UmVhZGVyT3B0aW9ucyAmIHsgcXVpZXRFbnY/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH07XG4gIHJldHVybiBvdXRwdXRPcHRpb25zLnF1aWV0RW52ID09PSB0cnVlIHx8IChvdXRwdXRPcHRpb25zLnF1aWV0RW52ICE9PSBmYWxzZSAmJiBvdXRwdXRPcHRpb25zLnNpbGVudCA9PT0gdHJ1ZSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcyBhbmQgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbGF0ZWQgdG8gbnBtIGFuZCB5YXJuIGZyb20gdGhlIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiB2b2lkIHtcbiAgLy8gUmVtb3ZlIG5wbSAmIHlhcm4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcHJvY2Vzcy5lbnZcbiAgaWYgKGVudlZhcnMuUEFUSCAmJiBlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnZWYXJzLlBBVEggPSBlbnZWYXJzLlBBVEgucmVwbGFjZShgJHtlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiBtYWNPU1xuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ByaXZhdGVcXC92YXJcXC9mb2xkZXJzXFwvW146XSs6L2csICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGluIExpbnV4XG4gICAgICAucmVwbGFjZUFsbCgvXFwvdmFyXFwvdG1wXFwvW146XSs6L2csICcnKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3RtcFxcL1teOl0rOi9nLCAnJyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICBjb25zdCB1cHBlcktleSA9IGtleS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ05QTV8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnWUFSTl8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnQkVSUllfJykgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnUFJPSkVDVF9DV0QnIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ0lOSVRfQ1dEJ1xuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc0Vycm5vRXhjZXB0aW9uKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgaXNFcnJub0V4Y2VwdGlvbiB9IGZyb20gJy4vZXJybm8uanMnO1xuaW1wb3J0IHsgYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwLCBjb2xsZWN0RGVzY2VuZGFudFBpZHMgYXMgY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCB9IGZyb20gJy4vcHJvY2Vzc1RyZWUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJlZUtpbGwocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgPSAnU0lHVEVSTScpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgfHwgcGlkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGlkOiAke3BpZH1gKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAga2lsbFRyZWVPbldpbmRvd3MocGlkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXNjZW5kYW50cyA9IGNvbGxlY3REZXNjZW5kYW50UGlkcyhwaWQpO1xuICBjb25zdCB0YXJnZXRQaWRzID0gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQsIGRlc2NlbmRhbnRzKTtcbiAgZm9yIChjb25zdCB0YXJnZXRQaWQgb2YgdGFyZ2V0UGlkcykge1xuICAgIGtpbGxJZk5lZWRlZCh0YXJnZXRQaWQsIHNpZ25hbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbElmTmVlZGVkKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgc2lnbmFsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxUcmVlT25XaW5kb3dzKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcnVuQ29tbWFuZCgndGFza2tpbGwnLCBbJy9QSUQnLCBTdHJpbmcocGlkKSwgJy9UJywgJy9GJ10sIHtcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IHJ1bkNvbW1hbmQoXG4gICAgJ3BzJyxcbiAgICBbJy1BbycsICdwaWQ9LHBwaWQ9J10sXG4gICAgLy8gS2VlcCBjb21tYW5kIGJvdW5kZWQgc28gd2F0Y2gtbW9kZSBraWxsIGxvb3BzIGNhbm5vdCBoYW5nIHRoaXMgcGF0aC5cbiAgICB7IG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsIHRpbWVvdXQ6IDIwMDAgfVxuICApO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHN0ZG91dCk7XG4gIHJldHVybiBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwKHJvb3RQaWQsIGNoaWxkcmVuQnlQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZDogbnVtYmVyLCBkZXNjZW5kYW50czogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSBkZXNjZW5kYW50cy50b1JldmVyc2VkKCk7XG4gIHRhcmdldFBpZHMucHVzaChwaWQpO1xuICByZXR1cm4gdGFyZ2V0UGlkcztcbn1cblxuZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IHsgdGltZW91dDogbnVtYmVyOyBtYXhCdWZmZXI6IG51bWJlciB9XG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoY29tbWFuZCwgWy4uLmFyZ3NdLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBvcHRpb25zPy5tYXhCdWZmZXIsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiAnJyB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHN0ZGVyciA9IGV4dHJhY3RTdGRlcnIoZXJyb3IpO1xuICAgIHRocm93IG5ldyBDb21tYW5kRXhlY3V0aW9uRXJyb3IoY29tbWFuZCwgYXJncywgc3RkZXJyLCB0b0V4aXRDb2RlKGVycm9yKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbW1hbmRFeGVjdXRpb25FcnJvcikge1xuICAgIHJldHVybiAvbm8gc3VjaCBwcm9jZXNzfG5vdCBmb3VuZHxub3QgcmVjb2duaXplZHx0aGVyZSBpcyBubyBydW5uaW5nIGluc3RhbmNlL2kudGVzdChlcnJvci5zdGRlcnIpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdG9FeGl0Q29kZShlcnJvcjogdW5rbm93bik6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXMnIGluIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzOiB1bmtub3duIH0pLnN0YXR1cztcbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGRlcnIoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCBlcnJvciA9PT0gbnVsbCB8fCAhKCdzdGRlcnInIGluIGVycm9yKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHN0ZGVyciA9IChlcnJvciBhcyBSZWNvcmQ8J3N0ZGVycicsIHVua25vd24+KS5zdGRlcnI7XG4gIGlmICh0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdGRlcnI7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdGRlcnIpKSB7XG4gICAgcmV0dXJuIHN0ZGVyci50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuY2xhc3MgQ29tbWFuZEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sIHN0ZGVycjogc3RyaW5nLCBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29tbWFuZEV4ZWN1dGlvbkVycm9yJztcbiAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHBzT3V0cHV0OiBzdHJpbmcpOiBNYXA8bnVtYmVyLCBudW1iZXJbXT4ge1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcHNPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IC9eXFxzKihcXGQrKVxccysoXFxkKylcXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkUGlkID0gTnVtYmVyKG1hdGNoZWRbMV0pO1xuICAgIGNvbnN0IHBhcmVudFBpZCA9IE51bWJlcihtYXRjaGVkWzJdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudFBpZCk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkUGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50UGlkLCBbY2hpbGRQaWRdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuQnlQYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyLCBjaGlsZHJlbkJ5UGFyZW50OiBNYXA8bnVtYmVyLCBudW1iZXJbXT4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGRlc2NlbmRhbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBxdWV1ZSA9IFsuLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocm9vdFBpZCkgPz8gW10pXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgcGlkID0gcXVldWVbaW5kZXhdIGFzIG51bWJlcjtcbiAgICBpbmRleCArPSAxO1xuICAgIGRlc2NlbmRhbnRzLnB1c2gocGlkKTtcbiAgICBxdWV1ZS5wdXNoKC4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChwaWQpID8/IFtdKSk7XG4gIH1cbiAgcmV0dXJuIGRlc2NlbmRhbnRzO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJy4vdHJlZUtpbGwuanMnO1xuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBiYXNlZCBvbiBTcGF3blN5bmNSZXR1cm5zIGJ1dCB3aXRob3V0IG91dHB1dCBhbmQgZXJyb3IgcHJvcGVydGllc1xuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jUmV0dXJucyA9IE9taXQ8U3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+LCAnb3V0cHV0JyB8ICdlcnJvcic+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGV4dGVuZGluZyB2YXJpb3VzIE5vZGUuanMgc3Bhd24gb3B0aW9ucyB3aXRoIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eVxuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jT3B0aW9ucyA9IChcbiAgfCBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW9cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zXG4pICYge1xuICAvKiogSW5wdXQgc3RyaW5nIHRvIHdyaXRlIHRvIHRoZSBzcGF3bmVkIHByb2Nlc3MncyBzdGRpbiAqL1xuICBpbnB1dD86IHN0cmluZztcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBvdXRwdXQgd2lsbCBiZSBtZXJnZWQgaW50byBzdGRvdXQgKi9cbiAgbWVyZ2VPdXRBbmRFcnJvcj86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCB0aGUgc3Bhd25lZCBwcm9jZXNzIHdpbGwgYmUga2lsbGVkIHdoZW4gdGhlIHBhcmVudCBwcm9jZXNzIGV4aXRzICovXG4gIGtpbGxPbkV4aXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgZW5hYmxlcyB2ZXJib3NlIGxvZ2dpbmcgb2YgcHJvY2VzcyBvcGVyYXRpb25zICovXG4gIHZlcmJvc2U/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3Rkb3V0IGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZG91dD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3RkZXJyPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGJsYW5rLW9ubHkgbGluZXMgYXJlIHNraXBwZWQgd2hpbGUgcHJpbnRpbmcgc3Rkb3V0L3N0ZGVyciBpbiByZWFsdGltZSAqL1xuICBvbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmc/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIGFzeW5jaHJvbm91c2x5IGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0c1xuICpcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBQcm9taXNlLWJhc2VkIHdyYXBwZXIgYXJvdW5kIE5vZGUuanMncyBzcGF3biBmdW5jdGlvbiB3aXRoIGFkZGl0aW9uYWwgZmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBlbmNvZGluZyBvZiBzdGRvdXQvc3RkZXJyIGFzIFVURi04XG4gKiAtIE9wdGlvbiB0byBtZXJnZSBzdGRlcnIgaW50byBzdGRvdXRcbiAqIC0gT3B0aW9uIHRvIGF1dG9tYXRpY2FsbHkga2lsbCB0aGUgcHJvY2VzcyBvbiBwYXJlbnQgZXhpdFxuICogLSBPcHRpb24gdG8gcHJvdmlkZSBpbnB1dCB2aWEgc3RkaW5cbiAqIC0gVmVyYm9zZSBsb2dnaW5nIGNhcGFiaWxpdHlcbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIHJ1blxuICogQHBhcmFtIGFyZ3MgLSBMaXN0IG9mIHN0cmluZyBhcmd1bWVudHNcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc3Bhd25lZCBwcm9jZXNzXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzIGluY2x1ZGluZyBwaWQsIHN0ZG91dCwgc3RkZXJyLCBzdGF0dXMsIGFuZCBzaWduYWxcbiAqIEB0aHJvd3MgV2lsbCByZWplY3QgdGhlIHByb21pc2UgaWYgdGhlIHByb2Nlc3MgZmFpbHMgdG8gc3Bhd24gb3IgZW5jb3VudGVycyBhbiBlcnJvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzcGF3bkFzeW5jKCdscycsIFsnLWxhJ10sIHsgdmVyYm9zZTogdHJ1ZSB9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5zdGRvdXQpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzcGF3bkFzeW5jKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M/OiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3Rkb3V0Py5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRlcnI/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcblxuICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgY29uc3Qgc3Rkb3V0UHJpbnRlciA9IGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihwcm9jZXNzLnN0ZG91dCwgb3B0aW9ucz8ub21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nKTtcbiAgICAgIGNvbnN0IHN0ZGVyclByaW50ZXIgPSBjcmVhdGVSZWFsdGltZVByaW50ZXIocHJvY2Vzcy5zdGRlcnIsIG9wdGlvbnM/Lm9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZyk7XG4gICAgICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRvdXQpIHtcbiAgICAgICAgICBzdGRvdXRQcmludGVyLndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/Lm1lcmdlT3V0QW5kRXJyb3IpIHtcbiAgICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGRlcnIgKz0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRlcnIpIHtcbiAgICAgICAgICBzdGRlcnJQcmludGVyLndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHN0b3BQcm9jZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc3RvcHBlZCB8fCAhcHJvYy5waWQpIHJldHVybjtcblxuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYHRyZWVLaWxsKCR7cHJvYy5waWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2MucGlkfSlgLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgY2xlYW51cFNpZ25hbHM6IE5vZGVKUy5TaWduYWxzW10gPVxuICAgICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gWydTSUdJTlQnLCAnU0lHVEVSTSddIDogWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ107XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBjb25zdCByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3QgW3NpZ25hbCwgaGFuZGxlcl0gb2Ygc2lnbmFsSGFuZGxlcnMpIHtcbiAgICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKHNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgc2lnbmFsSGFuZGxlcnMuY2xlYXIoKTtcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucz8ua2lsbE9uRXhpdCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBjbGVhbnVwU2lnbmFscykge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZVNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHN0b3BQcm9jZXNzKCk7XG4gICAgICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmxpc3RlbmVyQ291bnQoc2lnbmFsKSA9PT0gMCkge1xuICAgICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBoYW5kbGVTaWduYWwpO1xuICAgICAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCBoYW5kbGVTaWduYWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByb2Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHN0ZG91dFByaW50ZXIuZmx1c2goKTtcbiAgICAgICAgc3RkZXJyUHJpbnRlci5mbHVzaCgpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmlucHV0KSB7XG4gICAgICAgIHByb2Muc3RkaW4/LndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICBwcm9jLnN0ZGluPy5lbmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmNvbnN0IEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQID0gbmV3IFJlZ0V4cChgJHtTdHJpbmcuZnJvbUNvZGVQb2ludCgyNyl9XFxcXFtbMC0/XSpbIC0vXSpbQC1+XWAsICdnJyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihcbiAgc3RyZWFtOiBOb2RlSlMuV3JpdGVTdHJlYW0sXG4gIG9taXRCbGFua0xpbmVzID0gZmFsc2Vcbik6IHsgd3JpdGU6IChkYXRhOiBzdHJpbmcpID0+IHZvaWQ7IGZsdXNoOiAoKSA9PiB2b2lkIH0ge1xuICBpZiAoIW9taXRCbGFua0xpbmVzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyaXRlOiAoZGF0YSkgPT4gc3RyZWFtLndyaXRlKGRhdGEpLFxuICAgICAgZmx1c2g6ICgpID0+IHt9LFxuICAgIH07XG4gIH1cblxuICBsZXQgcGVuZGluZyA9ICcnO1xuICByZXR1cm4ge1xuICAgIHdyaXRlOiAoZGF0YSkgPT4ge1xuICAgICAgcGVuZGluZyArPSBkYXRhO1xuICAgICAgY29uc3QgbGluZXMgPSBwZW5kaW5nLnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgICBwZW5kaW5nID0gbGluZXMucG9wKCkgPz8gJyc7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgaWYgKCFpc0JsYW5rTGluZShsaW5lKSkge1xuICAgICAgICAgIHN0cmVhbS53cml0ZShgJHtsaW5lfVxcbmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBmbHVzaDogKCkgPT4ge1xuICAgICAgaWYgKCFpc0JsYW5rTGluZShwZW5kaW5nKSkge1xuICAgICAgICBzdHJlYW0ud3JpdGUocGVuZGluZyk7XG4gICAgICB9XG4gICAgICBwZW5kaW5nID0gJyc7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNCbGFua0xpbmUobGluZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBsaW5lLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKS50cmltKCkubGVuZ3RoID09PSAwO1xufVxuIiwiLyoqXG4gKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfVxuICpcbiAqIEB2ZXJzaW9uIDAuOS4zXG4gKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXVxuICogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5jb25zdCB0PVsuLi5cIjAxMjM0NTY3ODlhYmNkZWZcIl0scz1bNiwxNTM2LDM5MzIxNiwxMDA2NjMyOTZdLGk9WzAsOCwxNiwyNF0sZT1bMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF07ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbmV3IGgoNTEyLHMsNTEyKS51cGRhdGUodCkuaGV4KCl9Y29uc3Qgbj10PT57Y29uc3Qgcz1bXTtmb3IoY29uc3RbaSxlXW9mIHQuZW50cmllcygpKXNbaV09ZTtyZXR1cm4gc307Y2xhc3MgaHtibG9ja3M9W107cz1bXTtyZXNldD0hMDtmaW5hbGl6ZWQ9ITE7YmxvY2s9MDtzdGFydD0wO2xhc3RCeXRlSW5kZXg9MDtjb25zdHJ1Y3Rvcih0LHMsaSl7dGhpcy5wYWRkaW5nPXMsdGhpcy5vdXRwdXRCaXRzPWksdGhpcy5ibG9ja0NvdW50PTE2MDAtKHQ8PDEpPj41LHRoaXMuYnl0ZUNvdW50PXRoaXMuYmxvY2tDb3VudDw8Mix0aGlzLm91dHB1dEJsb2Nrcz1pPj41LHRoaXMuZXh0cmFCeXRlcz0oMzEmaSk+PjM7Zm9yKGxldCB0PTA7dDw1MDsrK3QpdGhpcy5zW3RdPTB9dXBkYXRlKHQpe2lmKHRoaXMuZmluYWxpemVkKXRocm93IG5ldyBFcnJvcihcImZpbmFsaXplIGFscmVhZHkgY2FsbGVkXCIpO2NvbnN0IHM9dGhpcy5ibG9ja3MsZT10aGlzLmJ5dGVDb3VudCxvPXQubGVuZ3RoLG49dGhpcy5ibG9ja0NvdW50LGg9dGhpcy5zO2xldCBsLGMsZj0wO2Zvcig7ZjxvOyl7aWYodGhpcy5yZXNldClmb3IodGhpcy5yZXNldD0hMSxzWzBdPXRoaXMuYmxvY2ssbD0xO2w8bisxOysrbClzW2xdPTA7Zm9yKGw9dGhpcy5zdGFydDtmPG8mJmw8ZTsrK2YpYz10LmNvZGVQb2ludEF0KGYpfHwwLGM8MTI4P3NbbD4+Ml18PWM8PGlbMyZsKytdOmM8MjA0OD8oc1tsPj4yXXw9KDE5MnxjPj42KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOmM8NTUyOTZ8fGM+PTU3MzQ0PyhzW2w+PjJdfD0oMjI0fGM+PjEyKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOihjPTY1NTM2KygoMTAyMyZjKTw8MTB8MTAyMyYodC5jb2RlUG9pbnRBdCgrK2YpfHwwKSksc1tsPj4yXXw9KDI0MHxjPj4xOCk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+MTImNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk7aWYodGhpcy5sYXN0Qnl0ZUluZGV4PWwsbD49ZSl7Zm9yKHRoaXMuc3RhcnQ9bC1lLHRoaXMuYmxvY2s9c1tuXSxsPTA7bDxuOysrbCloW2xdXj1zW2xdO3IoaCksdGhpcy5yZXNldD0hMH1lbHNlIHRoaXMuc3RhcnQ9bH1yZXR1cm4gdGhpc31maW5hbGl6ZSgpe2lmKHRoaXMuZmluYWxpemVkKXJldHVybjt0aGlzLmZpbmFsaXplZD0hMDtjb25zdCB0PXRoaXMuYmxvY2tzO2xldCBzPXRoaXMubGFzdEJ5dGVJbmRleDtjb25zdCBpPXRoaXMuYmxvY2tDb3VudCxlPXRoaXMucztpZih0W3M+PjJdfD10aGlzLnBhZGRpbmdbMyZzXSx0aGlzLmxhc3RCeXRlSW5kZXg9PT10aGlzLmJ5dGVDb3VudClmb3IodFswXT10W2ldLHM9MTtzPGkrMTsrK3MpdFtzXT0wO2Zvcih0W2ktMV18PTIxNDc0ODM2NDgscz0wO3M8aTsrK3MpZVtzXV49dFtzXTtyKGUpfWhleCgpe3RoaXMuZmluYWxpemUoKTtjb25zdCBzPXRoaXMuYmxvY2tDb3VudDtsZXQgaT10aGlzLnM7Y29uc3QgZT10aGlzLm91dHB1dEJsb2NrcyxvPXRoaXMuZXh0cmFCeXRlcztsZXQgaCxsPTAsYz0wLGY9XCJcIjtmb3IoO2M8ZTspe2ZvcihsPTA7bDxzJiZjPGU7KytsLCsrYyloPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdK3RbaD4+MTImMTVdK3RbaD4+OCYxNV0rdFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0rdFtoPj4yOCYxNV0rdFtoPj4yNCYxNV07YyVzPT09MCYmKGk9bihpKSxyKGkpLGw9MCl9cmV0dXJuIG8mJihoPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdLG8+MSYmKGYrPXRbaD4+MTImMTVdK3RbaD4+OCYxNV0pLG8+MiYmKGYrPXRbaD4+MjAmMTVdK3RbaD4+MTYmMTVdKSksZn19Y29uc3Qgcj1mdW5jdGlvbih0KXtsZXQgcyxpLG8sbixoLHIsbCxjLGYsYSx1LGQsYixrLHkseCxCLHAsQyx6LEksZyx3LEEsUCxFLGosbSxxLHYsRCxGLEcsSCxKLEssTCxNLE4sTyxRLFIsUyxULFUsVixXLFgsWSxaLCQsXyx0dCxzdCxpdCxldCxvdCxudCxodCxydCxsdCxjdCxmdDtmb3Iobz0wO288NDg7bys9MiluPXRbMF1edFsxMF1edFsyMF1edFszMF1edFs0MF0saD10WzFdXnRbMTFdXnRbMjFdXnRbMzFdXnRbNDFdLHI9dFsyXV50WzEyXV50WzIyXV50WzMyXV50WzQyXSxsPXRbM11edFsxM11edFsyM11edFszM11edFs0M10sYz10WzRdXnRbMTRdXnRbMjRdXnRbMzRdXnRbNDRdLGY9dFs1XV50WzE1XV50WzI1XV50WzM1XV50WzQ1XSxhPXRbNl1edFsxNl1edFsyNl1edFszNl1edFs0Nl0sdT10WzddXnRbMTddXnRbMjddXnRbMzddXnRbNDddLGQ9dFs4XV50WzE4XV50WzI4XV50WzM4XV50WzQ4XSxiPXRbOV1edFsxOV1edFsyOV1edFszOV1edFs0OV0scz1kXihyPDwxfGw+Pj4zMSksaT1iXihsPDwxfHI+Pj4zMSksdFswXV49cyx0WzFdXj1pLHRbMTBdXj1zLHRbMTFdXj1pLHRbMjBdXj1zLHRbMjFdXj1pLHRbMzBdXj1zLHRbMzFdXj1pLHRbNDBdXj1zLHRbNDFdXj1pLHM9bl4oYzw8MXxmPj4+MzEpLGk9aF4oZjw8MXxjPj4+MzEpLHRbMl1ePXMsdFszXV49aSx0WzEyXV49cyx0WzEzXV49aSx0WzIyXV49cyx0WzIzXV49aSx0WzMyXV49cyx0WzMzXV49aSx0WzQyXV49cyx0WzQzXV49aSxzPXJeKGE8PDF8dT4+PjMxKSxpPWxeKHU8PDF8YT4+PjMxKSx0WzRdXj1zLHRbNV1ePWksdFsxNF1ePXMsdFsxNV1ePWksdFsyNF1ePXMsdFsyNV1ePWksdFszNF1ePXMsdFszNV1ePWksdFs0NF1ePXMsdFs0NV1ePWkscz1jXihkPDwxfGI+Pj4zMSksaT1mXihiPDwxfGQ+Pj4zMSksdFs2XV49cyx0WzddXj1pLHRbMTZdXj1zLHRbMTddXj1pLHRbMjZdXj1zLHRbMjddXj1pLHRbMzZdXj1zLHRbMzddXj1pLHRbNDZdXj1zLHRbNDddXj1pLHM9YV4objw8MXxoPj4+MzEpLGk9dV4oaDw8MXxuPj4+MzEpLHRbOF1ePXMsdFs5XV49aSx0WzE4XV49cyx0WzE5XV49aSx0WzI4XV49cyx0WzI5XV49aSx0WzM4XV49cyx0WzM5XV49aSx0WzQ4XV49cyx0WzQ5XV49aSxrPXRbMF0seT10WzFdLFY9dFsxMV08PDR8dFsxMF0+Pj4yOCxXPXRbMTBdPDw0fHRbMTFdPj4+MjgsbT10WzIwXTw8M3x0WzIxXT4+PjI5LHE9dFsyMV08PDN8dFsyMF0+Pj4yOSxydD10WzMxXTw8OXx0WzMwXT4+PjIzLGx0PXRbMzBdPDw5fHRbMzFdPj4+MjMsUj10WzQwXTw8MTh8dFs0MV0+Pj4xNCxTPXRbNDFdPDwxOHx0WzQwXT4+PjE0LEg9dFsyXTw8MXx0WzNdPj4+MzEsSj10WzNdPDwxfHRbMl0+Pj4zMSx4PXRbMTNdPDwxMnx0WzEyXT4+PjIwLEI9dFsxMl08PDEyfHRbMTNdPj4+MjAsWD10WzIyXTw8MTB8dFsyM10+Pj4yMixZPXRbMjNdPDwxMHx0WzIyXT4+PjIyLHY9dFszM108PDEzfHRbMzJdPj4+MTksRD10WzMyXTw8MTN8dFszM10+Pj4xOSxjdD10WzQyXTw8Mnx0WzQzXT4+PjMwLGZ0PXRbNDNdPDwyfHRbNDJdPj4+MzAsc3Q9dFs1XTw8MzB8dFs0XT4+PjIsaXQ9dFs0XTw8MzB8dFs1XT4+PjIsSz10WzE0XTw8Nnx0WzE1XT4+PjI2LEw9dFsxNV08PDZ8dFsxNF0+Pj4yNixwPXRbMjVdPDwxMXx0WzI0XT4+PjIxLEM9dFsyNF08PDExfHRbMjVdPj4+MjEsWj10WzM0XTw8MTV8dFszNV0+Pj4xNywkPXRbMzVdPDwxNXx0WzM0XT4+PjE3LEY9dFs0NV08PDI5fHRbNDRdPj4+MyxHPXRbNDRdPDwyOXx0WzQ1XT4+PjMsQT10WzZdPDwyOHx0WzddPj4+NCxQPXRbN108PDI4fHRbNl0+Pj40LGV0PXRbMTddPDwyM3x0WzE2XT4+Pjksb3Q9dFsxNl08PDIzfHRbMTddPj4+OSxNPXRbMjZdPDwyNXx0WzI3XT4+PjcsTj10WzI3XTw8MjV8dFsyNl0+Pj43LHo9dFszNl08PDIxfHRbMzddPj4+MTEsST10WzM3XTw8MjF8dFszNl0+Pj4xMSxfPXRbNDddPDwyNHx0WzQ2XT4+PjgsdHQ9dFs0Nl08PDI0fHRbNDddPj4+OCxUPXRbOF08PDI3fHRbOV0+Pj41LFU9dFs5XTw8Mjd8dFs4XT4+PjUsRT10WzE4XTw8MjB8dFsxOV0+Pj4xMixqPXRbMTldPDwyMHx0WzE4XT4+PjEyLG50PXRbMjldPDw3fHRbMjhdPj4+MjUsaHQ9dFsyOF08PDd8dFsyOV0+Pj4yNSxPPXRbMzhdPDw4fHRbMzldPj4+MjQsUT10WzM5XTw8OHx0WzM4XT4+PjI0LGc9dFs0OF08PDE0fHRbNDldPj4+MTgsdz10WzQ5XTw8MTR8dFs0OF0+Pj4xOCx0WzBdPWtefngmcCx0WzFdPXlefkImQyx0WzEwXT1BXn5FJm0sdFsxMV09UF5+aiZxLHRbMjBdPUhefksmTSx0WzIxXT1KXn5MJk4sdFszMF09VF5+ViZYLHRbMzFdPVVeflcmWSx0WzQwXT1zdF5+ZXQmbnQsdFs0MV09aXRefm90Jmh0LHRbMl09eF5+cCZ6LHRbM109Ql5+QyZJLHRbMTJdPUVefm0mdix0WzEzXT1qXn5xJkQsdFsyMl09S15+TSZPLHRbMjNdPUxefk4mUSx0WzMyXT1WXn5YJlosdFszM109V15+WSYkLHRbNDJdPWV0Xn5udCZydCx0WzQzXT1vdF5+aHQmbHQsdFs0XT1wXn56JmcsdFs1XT1DXn5JJncsdFsxNF09bV5+diZGLHRbMTVdPXFefkQmRyx0WzI0XT1NXn5PJlIsdFsyNV09Tl5+USZTLHRbMzRdPVheflomXyx0WzM1XT1ZXn4kJnR0LHRbNDRdPW50Xn5ydCZjdCx0WzQ1XT1odF5+bHQmZnQsdFs2XT16Xn5nJmssdFs3XT1JXn53JnksdFsxNl09dl5+RiZBLHRbMTddPURefkcmUCx0WzI2XT1PXn5SJkgsdFsyN109UV5+UyZKLHRbMzZdPVpefl8mVCx0WzM3XT0kXn50dCZVLHRbNDZdPXJ0Xn5jdCZzdCx0WzQ3XT1sdF5+ZnQmaXQsdFs4XT1nXn5rJngsdFs5XT13Xn55JkIsdFsxOF09Rl5+QSZFLHRbMTldPUdeflAmaix0WzI4XT1SXn5IJkssdFsyOV09U15+SiZMLHRbMzhdPV9eflQmVix0WzM5XT10dF5+VSZXLHRbNDhdPWN0Xn5zdCZldCx0WzQ5XT1mdF5+aXQmb3QsdFswXV49ZVtvXSx0WzFdXj1lW28rMV19O2V4cG9ydHtvIGFzIHNoYTNfNTEyfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2guanMubWFwXG4iLCJjb25zdCBlPVwiXCIsdD1mdW5jdGlvbigpe2NvbnN0IGU9e2luc3RhbmNlOkVycm9yLGZyb206ZT0+e2NvbnN0IHQ9W2UubmFtZSxlLm1lc3NhZ2VdO3JldHVybiB2b2lkIDAhPT1lLnN0YWNrJiZ0LnB1c2goZS5zdGFjayksdm9pZCAwIT09ZS5jYXVzZSYmKHZvaWQgMD09PWUuc3RhY2smJnQucHVzaCh2b2lkIDApLHQucHVzaChlLmNhdXNlKSksdH0sc3R1YjooKT0+bmV3IEVycm9yLGh5ZHJhdGU6KGUsW3QsbixhLHNdKT0+e2UubmFtZT10LGUubWVzc2FnZT1uLHZvaWQgMD09PWE/ZGVsZXRlIGUuc3RhY2s6ZS5zdGFjaz1hLHZvaWQgMCE9PXMmJihlLmNhdXNlPXMpfX0sdD17aW5zdGFuY2U6VWludDhBcnJheSxmcm9tOmU9PltidG9hKGEuZGVjb2RlKGUpKV0sY3JlYXRlOihbZV0pPT5uLmVuY29kZShhdG9iKGUpKX0scz17aW5zdGFuY2U6TWFwLGZyb206ZT0+Wy4uLmUuZW50cmllcygpXSxzdHViOigpPT5uZXcgTWFwLGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3RbbixhXW9mIHQpZS5zZXQobixhKX19LG89e2luc3RhbmNlOlNldCxmcm9tOmU9PlsuLi5lLnZhbHVlcygpXSxzdHViOigpPT5uZXcgU2V0LGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3QgbiBvZiB0KWUuYWRkKG4pfX0scj17aW5zdGFuY2U6RGF0ZSxmcm9tOmU9PltlLnRvSlNPTigpXSxjcmVhdGU6KFtlXSk9Pm5ldyBEYXRlKGUpfSxjPXtpbnN0YW5jZTpSZWdFeHAsZnJvbTooe2ZsYWdzOmUsc291cmNlOnR9KT0+ZT9bdCxlXTpbdF0sY3JlYXRlOihbZSx0XSk9Pm5ldyBSZWdFeHAoZSx0KX0sZD17aW5zdGFuY2U6VVJMLGZyb206ZT0+W2UuaHJlZl0sY3JlYXRlOihbZV0pPT5uZXcgVVJMKGUpfTtyZXR1cm4gbmV3IE1hcChbZSx0LHMsbyxyLGMsZF0ubWFwKGU9PltlLmluc3RhbmNlLm5hbWUsZV0pKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpO2V4cG9ydHt0IGFzIEdMT0JBTF9DT05TVFJVQ1RPUl9NQVAsZSBhcyBQTEFJTl9PQkpFQ1RfTEFCRUx9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RydWN0b3JzLmpzLm1hcFxuIiwiaW1wb3J0e0dMT0JBTF9DT05TVFJVQ1RPUl9NQVAgYXMgdCxQTEFJTl9PQkpFQ1RfTEFCRUwgYXMgbn1mcm9tXCIuL2NvbnN0cnVjdG9ycy5qc1wiO2NvbnN0IGU9LTEscj0tMixvPS0zLGk9LTQscz0tNSxjPS02O2Z1bmN0aW9uIGYobixlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcywgc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuXG5leHBvcnQgdHlwZSBEYXRhYmFzZU9ybSA9ICdwcmlzbWEnIHwgJ2RyaXp6bGUnO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNCdW5Ub29sVmVyc2lvbigpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy51c2VzQnVuUGFja2FnZU1hbmFnZXI7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgdXNlc0J1blBhY2thZ2VNYW5hZ2VyKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhc0J1bkxvY2tmaWxlKCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLmhhc0J1blBhY2thZ2VNYW5hZ2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGhhc0J1blRvb2xWZXJzaW9uKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gLyhefFxcbilidW5cXHMvLnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYXNCdW5Mb2NrZmlsZSgpOiBib29sZWFuIHtcbiAgICAvLyBTb21lIHJlcG9zaXRvcmllcyByZWx5IG9uIHRoZSBsb2NrZmlsZSBvciBwYWNrYWdlTWFuYWdlciBmaWVsZCBpbnN0ZWFkIG9mIG1pc2UuXG4gICAgLy8gRG9ja2VyIG9wdGltaXphdGlvbiBtdXN0IGZvbGxvdyB0aGUgdGFyZ2V0IHByb2plY3QsIG5vdCB0aGUgcnVudGltZSB0aGF0IGxhdW5jaGVkIHdiLlxuICAgIHJldHVybiBbJ2J1bi5sb2NrJywgJ2J1bi5sb2NrYiddLnNvbWUoKGZpbGVOYW1lKSA9PiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCBmaWxlTmFtZSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQnVuUGFja2FnZU1hbmFnZXIoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSB0aGlzLnJvb3RQYWNrYWdlSnNvbj8ucGFja2FnZU1hbmFnZXIgPz8gdGhpcy5wYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlcjtcbiAgICByZXR1cm4gdHlwZW9mIHBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJyAmJiBwYWNrYWdlTWFuYWdlci5zdGFydHNXaXRoKCdidW5AJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgID8gJ1lBUk4gcnVuIGJ1aWxkJ1xuICAgICAgOiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkXG4gICAgICAgID8gYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke3RoaXMuYXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gXG4gICAgICAgIDogXCJlY2hvICdObyBidWlsZCBzY3JpcHQnXCI7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXRoaXMubG9hZEVudikgcmV0dXJuIHByb2Nlc3MuZW52O1xuXG4gICAgY29uc3QgW2VudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmFyZ3YsIHRoaXMuZGlyUGF0aCk7XG4gICAgaWYgKCFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgIGZvciAoY29uc3QgW2VudlBhdGgsIGNvdW50XSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycykge1xuICAgICAgICBjb25zb2xlLmluZm8oYExvYWRlZCAke2NvdW50fSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IC4uLmVudlZhcnMsIC4uLnByb2Nlc3MuZW52IH07XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLnBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb25QYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbigncHJpc21hJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRHJpenpsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCdkcml6emxlLW9ybScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRhdGFiYXNlT3JtKCk6IERhdGFiYXNlT3JtIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNQcmlzbWEpIHJldHVybiAncHJpc21hJztcbiAgICBpZiAodGhpcy5oYXNEcml6emxlKSByZXR1cm4gJ2RyaXp6bGUnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNWaXRlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy52aXRlc3QgPz8gdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnZpdGVzdCk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzT3hsaW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094Zm10KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294Zm10Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJldHRpZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgncHJldHRpZXInKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQb2V0cnlMb2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwb2V0cnkubG9jaycpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncG9ldHJ5LmxvY2snKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1B1YnNwZWNZYW1sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSkgfHxcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwdWJzcGVjLnlhbWwnKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHByZWZlcnJlZExpbnRlcigpOiAnb3hsaW50JyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzT3hsaW50KSByZXR1cm4gJ294bGludCc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaGFzT3duRGVwZW5kZW5jeShwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUGxheXdyaWdodENvbmZpZygpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzQ0kodGhpcy5lbnYuQ0kpKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgICAgcmV0dXJuIC9cXGJ3ZWJTZXJ2ZXJcXGIvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiAoSlNPTi5wYXJzZShcbiAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICAgICAgKSBhcyBQYWNrYWdlSnNvbik7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYmluRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBiaW5Gb3VuZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50UGF0aCA9IHRoaXMuZGlyUGF0aDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICAgIHRoaXMuZW52LlBBVEggPSBgJHtiaW5QYXRofToke3RoaXMuZW52LlBBVEh9YDtcbiAgICAgICAgYmluRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBiaW5Gb3VuZDtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNEZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKSA/PyB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucm9vdFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXBlbmRlbmN5VmVyc2lvbih0aGlzLnBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCwgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBwcml2YXRlIGdldCByb290UGFja2FnZUpzb24oKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJvb3REaXJQYXRoID09PSB0aGlzLmRpclBhdGgpIHJldHVybiB0aGlzLnBhY2thZ2VKc29uO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW3diXSBGYWlsZWQgdG8gcmVhZCBvciBwYXJzZSAke3BhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyl9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvdW5kUHJvamVjdHMge1xuICByb290OiBQcm9qZWN0O1xuICBzZWxmOiBQcm9qZWN0O1xuICBkZXNjZW5kYW50czogUHJvamVjdFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNlbGZQcm9qZWN0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnYgPSB0cnVlLCBkaXJQYXRoPzogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmREZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBQcm9taXNlPEZvdW5kUHJvamVjdHMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgcm9vdEFuZFNlbGZQcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGxvYWRFbnYsIGRpclBhdGgpO1xuICBpZiAoIXJvb3RBbmRTZWxmUHJvamVjdHMpIHJldHVybjtcblxuICByZXR1cm4ge1xuICAgIC4uLnJvb3RBbmRTZWxmUHJvamVjdHMsXG4gICAgZGVzY2VuZGFudHM6XG4gICAgICByb290QW5kU2VsZlByb2plY3RzLnJvb3QgPT09IHJvb3RBbmRTZWxmUHJvamVjdHMuc2VsZlxuICAgICAgICA/IGF3YWl0IGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCByb290QW5kU2VsZlByb2plY3RzLnJvb3QsIGxvYWRFbnYpXG4gICAgICAgIDogW3Jvb3RBbmRTZWxmUHJvamVjdHMuc2VsZl0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IE9taXQ8Rm91bmRQcm9qZWN0cywgJ2Rlc2NlbmRhbnRzJz4gfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICBjb25zdCB0aGlzUHJvamVjdCA9IG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICBsZXQgcm9vdFByb2plY3QgPSB0aGlzUHJvamVjdDtcbiAgaWYgKCF0aGlzUHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmIHBhdGguZGlybmFtZShkaXJQYXRoKS5lbmRzV2l0aCgnL3BhY2thZ2VzJykpIHtcbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIHJvb3RQcm9qZWN0ID0gbmV3IFByb2plY3Qocm9vdERpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyByb290OiByb290UHJvamVjdCwgc2VsZjogdGhpc1Byb2plY3QgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICByb290UHJvamVjdDogUHJvamVjdCxcbiAgbG9hZEVudjogYm9vbGVhblxuKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBbcm9vdFByb2plY3RdO1xuXG4gIGNvbnN0IHdvcmtzcGFjZSA9IHJvb3RQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2UpKSByZXR1cm4gcHJvamVjdHM7XG5cbiAgY29uc3QgZ2xvYlBhdHRlcm46IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VEaXJzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdGggb2Ygd29ya3NwYWNlLm1hcCgod3M6IHN0cmluZykgPT4gcGF0aC5qb2luKHJvb3RQcm9qZWN0LmRpclBhdGgsIHdzKSkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh3b3Jrc3BhY2VQYXRoKSkge1xuICAgICAgcGFja2FnZURpcnMucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2xvYlBhdHRlcm4ucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9XG4gIH1cbiAgcGFja2FnZURpcnMucHVzaCguLi4oYXdhaXQgZ2xvYmJ5KGdsb2JQYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSk7XG4gIGZvciAoY29uc3Qgc3ViUGFja2FnZURpclBhdGggb2YgcGFja2FnZURpcnMpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHN1YlBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcblxuICAgIHByb2plY3RzLnB1c2gobmV3IFByb2plY3Qoc3ViUGFja2FnZURpclBhdGgsIGFyZ3YsIGxvYWRFbnYpKTtcbiAgfVxuICByZXR1cm4gcHJvamVjdHM7XG59XG4iLCJleHBvcnQgY29uc3QgaXNSdW5uaW5nT25CdW4gPVxuICAvLyBEZXRlY3QgYGJ1biAtLWJ1biBydW4gd2IgLi4uYC4gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy91dGlsL2RldGVjdC1idW5cbiAgcHJvY2Vzcy52ZXJzaW9ucy5idW4gfHxcbiAgLy8gRGV0ZWN0IGBidW4gcnVuIHdiIC4uLmAuXG4gIHByb2Nlc3MuYXJndlswXT8uZW5kc1dpdGgoJy9idW4nKSB8fFxuICBwcm9jZXNzLmVudi5ucG1fZXhlY3BhdGg/LmVuZHNXaXRoKCcvYnVuJyk7XG5cbmV4cG9ydCBjb25zdCBydW50aW1lV2l0aEFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICdub2RlJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAneWFybic7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXJXaXRoUnVuID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAneWFybic7XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBCaW5hcnlMaWtlLCBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGJ1aWxkIGNvbW1hbmQgKGRlZmF1bHQ6IHlhcm58YnVuIGJ1aWxkKScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdjJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBidWlsZElmTmVlZGVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdidWlsZElmTmVlZGVkJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBjb2RlIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgYnVpbGRJZk5lZWRlZChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZElmTmVlZGVkKFxuICAvLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYnVpbGRDb21tYW5kID1cbiAgICBhcmd2LmNvbW1hbmQgPz9cbiAgICAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZCA/IChpc1J1bm5pbmdPbkJ1biA/ICdidW4gcnVuIGJ1aWxkJyA6ICd5YXJuIGJ1aWxkJykgOiB1bmRlZmluZWQpO1xuICBpZiAoIWJ1aWxkQ29tbWFuZCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignU2tpcCB0byBidWlsZCBiZWNhdXNlIG5vIGJ1aWxkIGNvbW1hbmQgaXMgZGVmaW5lZC4nKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGJ1aWxkQ29tbWFuZCB9O1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkpIHtcbiAgICBidWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IFtjYW5Ta2lwLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF0gPSBhd2FpdCBjYW5Ta2lwQnVpbGQocHJvamVjdCwgYXJndik7XG4gIGlmIChjYW5Ta2lwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTa2lwIHRvIHJ1biAnJHthcmd2LmNvbW1hbmR9JyDwn5KrYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghYnVpbGQocHJvamVjdCwgYXJndikpIHJldHVybjtcblxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBidWlsZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+KTogYm9vbGVhbiB7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgUnVuICcke2FyZ3YuY29tbWFuZH0nYCkpO1xuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoYXJndi5jb21tYW5kID8/ICcnLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBpZ25vcmluZ0VudlZhck5hbWVzID0gbmV3IFNldChbJ0NJJywgJ1BXREVCVUcnLCAnVE1QRElSJ10pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FuU2tpcEJ1aWxkKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdnaXQgcmV2LXBhcnNlIEhFQUQnLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoIH0pLnRvU3RyaW5nKCkudHJpbSgpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSlcbiAgKTtcbiAgaGFzaC51cGRhdGUoZW52aXJvbm1lbnRKc29uKTtcblxuICBhd2FpdCB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQocHJvamVjdCwgYXJndiwgaGFzaCk7XG4gIGNvbnN0IGNvbnRlbnRIYXNoID0gaGFzaC5kaWdlc3QoJ2hleCcpO1xuXG4gIGNvbnN0IGNhY2hlZENvbnRlbnRIYXNoID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIHJldHVybiBbY2FjaGVkQ29udGVudEhhc2ggPT09IGNvbnRlbnRIYXNoLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG59XG5cbmNvbnN0IGluY2x1ZGVQYXR0ZXJucyA9IFsnc3JjLycsICdwdWJsaWMvJ107XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG5dO1xuY29uc3QgZXhjbHVkZVBhdHRlcm5zID0gWyd0ZXN0LycsICd0ZXN0cy8nLCAnX190ZXN0c19fLycsICd0ZXN0LWZpeHR1cmVzLycsICd0ZXN0L2ZpeHR1cmVzLyddO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydzdGF0dXMnLCAnLS1wb3JjZWxhaW4nXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSk7XG4gICAgY29uc3QgbGluZXMgPSByZXQuc3Rkb3V0XG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmxlbmd0aCA+IDApO1xuICAgIGNvbnN0IGZpbGVQYXRocyA9IGxpbmVzXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKDIpLnRyaW0oKSlcbiAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0JyA/IGZpbGVQYXRoLnJlcGxhY2UoL3BhY2thZ2VzXFwvd2JcXC90ZXN0XFwvZml4dHVyZXNcXC9bXi9dK1xcLy8sICcnKSA6IGZpbGVQYXRoXG4gICAgICApO1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZVBhdGhzID0gZmlsZVBhdGhzLmZpbHRlcihcbiAgICAgIChmaWxlUGF0aCkgPT5cbiAgICAgICAgKGluY2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gZmlsZVBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFleGNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpXG4gICAgKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZWQgZmlsZXM6ICR7ZmlsdGVyZWRGaWxlUGF0aHMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGhcbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bignZ2l0JywgWydkaWZmJywgJy0tJywgLi4uZmlsdGVyZWRGaWxlUGF0aHNdLCB7IGN3ZDogcHJvamVjdC5yb290RGlyUGF0aCB9KTtcbiAgICBwcm9jLnN0ZG91dC5vbignZGF0YScsIChkYXRhOiBCaW5hcnlMaWtlKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdEYXRhOicsIGRhdGEpO1xuICAgICAgICBjb25zb2xlLmluZm8oJ0hhc2g6JywgaGFzaC5jb3B5KCkuZGlnZXN0KCdoZXgnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAgICogRm9yIGV4YW1wbGUsIGByZXRyeUNvdW50OiAzYCBydW5zIHRoZSBmdW5jdGlvbiBhdCBtb3N0IDMgdGltZXM6IDEgaW5pdGlhbCBhdHRlbXB0IGFuZCB1cCB0byAyIHJldHJpZXMuXG4gICAqL1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgb25TaWduYWw/OiAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHZvaWQ7XG4gIG9taXRTaWxlbnRTdGFydD86IGJvb2xlYW47XG4gIHByZXNlcnZlQ29sb3I/OiBib29sZWFuO1xuICBwcm9jZXNzU2lsZW50T3V0cHV0PzogKG91dHB1dDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHByaW50UmF3T3V0cHV0PzogYm9vbGVhbjtcbiAgcHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5PzogYm9vbGVhbjtcbiAgc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zPzogbnVtYmVyO1xuICBzaWxlbnRTdWNjZXNzTWVzc2FnZT86IHN0cmluZztcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gIGV4aXRJZkZhaWxlZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVmZmVyZWRSdW5SZXN1bHQge1xuICBleGl0Q29kZTogbnVtYmVyO1xuICBvdXRwdXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+ICYgeyBzaWxlbnQ/OiBib29sZWFuIH0sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBpZiAoIShhcmd2LnNpbGVudCAmJiBvcHRzLm9taXRTaWxlbnRTdGFydCAmJiAhYXJndi5kcnlSdW4pKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgYXJndi5zaWxlbnQgPyAnQ29tbWFuZCcgOiAnU3RhcnQnKTtcbiAgfVxuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3Qgc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCA9IEJvb2xlYW4oXG4gICAgYXJndi5zaWxlbnQgJiYgKG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dCA/PyBvcHRzLnByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSlcbiAgKTtcbiAgbGV0IHdyb3RlU2lsZW50UHJvZ3Jlc3MgPSBmYWxzZTtcbiAgY29uc3QgcHJvZ3Jlc3NUaW1lciA9XG4gICAgYXJndi5zaWxlbnQgJiYgb3B0cy5zaWxlbnRQcm9ncmVzc0ludGVydmFsTXNcbiAgICAgID8gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcuJyk7XG4gICAgICAgICAgd3JvdGVTaWxlbnRQcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIH0sIG9wdHMuc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IChhcmd2LnNpbGVudCA/IHRydWUgOiB1bmRlZmluZWQpIH0pLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiBhcmd2LnNpbGVudCA/ICdwaXBlJyA6ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgbWVyZ2VPdXRBbmRFcnJvcjogc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHByaW50aW5nU3Rkb3V0OiBhcmd2LnNpbGVudCAmJiAhc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgb21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nOiBhcmd2LnNpbGVudCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgIGlmIChwcm9ncmVzc1RpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHByb2dyZXNzVGltZXIpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICBpZiAod3JvdGVTaWxlbnRQcm9ncmVzcykge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxuICBpZiAoc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCAmJiAoIW9wdHMucHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5IHx8IGV4aXRDb2RlICE9PSAwKSkge1xuICAgIGNvbnN0IG91dHB1dCA9IChvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQgPyBvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQocmV0LnN0ZG91dCkgOiByZXQuc3Rkb3V0KS50cmltKCk7XG4gICAgaWYgKG91dHB1dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFyZ3Yuc2lsZW50ICYmIGV4aXRDb2RlID09PSAwICYmIG9wdHMuc2lsZW50U3VjY2Vzc01lc3NhZ2UpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4ob3B0cy5zaWxlbnRTdWNjZXNzTWVzc2FnZSkpO1xuICB9XG4gIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgZXhpdENvZGUsIG9wdHMsIHsgc2lsZW50U3VjY2VzczogYXJndi5zaWxlbnQgfSk7XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChwYXJhbGxlbCknLCB0cnVlKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IHRydWUgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHByaW50aW5nU3Rkb3V0OiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgcHJpbnRpbmdTdGRlcnI6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSByZXQuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAob3V0ICYmICFvcHRzLnByaW50UmF3T3V0cHV0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8QnVmZmVyZWRSdW5SZXN1bHQ+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICAgIG91dHB1dDogJycsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyB0cnVlIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICByZXR1cm4ge1xuICAgICAgZXhpdENvZGU6IHJldC5zdGF0dXMgPz8gMSxcbiAgICAgIG91dHB1dDogcmV0LnN0ZG91dCxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHsgcHJpbnRhYmxlOiBzdHJpbmc7IHJ1bm5hYmxlOiBzdHJpbmcgfSB7XG4gIGNvbnN0IHByb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/ICdidW4gLS1idW4gcnVuJyA6ICd5YXJuJztcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoXG4gICAgICAvUFJJU01BIGdlbmVyYXRlKD8hXFxzKy0tbm8taGludHMpKD89XFxzfCQpL2d1LFxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1BSSVNNQSBnZW5lcmF0ZScgOiAnUFJJU01BIGdlbmVyYXRlIC0tbm8taGludHMnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOIHJ1biAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiBydW4gJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1biAtLWJ1bikgcnVuYC5cbiAgICAucmVwbGFjZUFsbCgnWUFSTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ3lhcm4gcnVuICcpO1xuICBpZiAocHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIpIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIGJ1aWxkLXRzIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdidW4gLS1idW4gcnVuIGJ1biAtLWJ1biBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAvLyBCZWNhdXNlIGJ1biBjYW4gcnVuIHNyYy9pbmRleC50cyBkaXJlY3RseS5cbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQobmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCkpO1xuICBjb25zdCBydW5uYWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQoXG4gICAgbmV3U2NyaXB0XG4gICAgICAvLyBLZWVwIFBsYXl3cmlnaHQgYXMgYSBwYWNrYWdlLW1hbmFnZXIgY29tbWFuZCBpbnN0ZWFkIG9mIHJlc29sdmluZyBpdCB0aHJvdWdoIG5vZGVfbW9kdWxlcy8uYmluLlxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgICAucmVwbGFjZUFsbChcbiAgICAgICAgJ1lBUk4gJyxcbiAgICAgICAgIXByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgXG4gICAgICApXG4gICk7XG4gIC8vIEFkZCBjYXNjYWRlIG9wdGlvbiB3aGVuIFdCX0VOViBpcyBkZWZpbmVkXG4gIGNvbnN0IGNhc2NhZGVPcHRpb24gPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgIC1jPSR7cHJvamVjdC5lbnYuV0JfRU5WIHx8ICdkZXZlbG9wbWVudCd9YCA6ICcnO1xuICByZXR1cm4ge1xuICAgIHByaW50YWJsZTogYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZG90ZW52JHtjYXNjYWRlT3B0aW9ufSAtLSAke3ByaW50YWJsZVNjcmlwdH1gLFxuICAgIHJ1bm5hYmxlOiBydW5uYWJsZVNjcmlwdCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPixcbiAgcHJpbnRPcHRpb25zOiB7IHNpbGVudFN1Y2Nlc3M/OiBib29sZWFuIH0gPSB7fVxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGlmIChwcmludE9wdGlvbnMuc2lsZW50U3VjY2VzcykgcmV0dXJuO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVFbnYoXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgb3B0czogT3B0aW9uc1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5ld0VudiA9IHsgLi4uZW52IH07XG4gIGlmIChvcHRzLmNpKSB7XG4gICAgbmV3RW52LkNJID0gJzEnO1xuICB9XG4gIGNvbmZpZ3VyZUNvbG9yRW52KG5ld0Vudiwgb3B0cy5wcmVzZXJ2ZUNvbG9yKTtcbiAgcmV0dXJuIG5ld0Vudjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIGNoaWxkLXByb2Nlc3MgY29sb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB3Yi1tYW5hZ2VkIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gZW52IFRoZSBjaGlsZC1wcm9jZXNzIGVudmlyb25tZW50IHRvIG11dGF0ZS5cbiAqIEBwYXJhbSBwcmVzZXJ2ZUNvbG9yIFdoZXRoZXIgd2Igc2hvdWxkIHByZXNlcnZlIGNvbG9ycyBmb3Igb3V0cHV0IHRoYXQgaXQgY2FwdHVyZXMgYW5kIHJlcHJpbnRzIHRvIGFuIGludGVyYWN0aXZlIFRUWS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZUNvbG9yRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiwgcHJlc2VydmVDb2xvcj86IGJvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKGVudi5OT19DT0xPUiAhPT0gdW5kZWZpbmVkIHx8IHByZXNlcnZlQ29sb3IgPT09IGZhbHNlKSB7XG4gICAgLy8gTk9fQ09MT1IgYW5kIHByZXNlcnZlQ29sb3I9ZmFsc2UgYXJlIGV4cGxpY2l0IG5vLWNvbG9yIGNob2ljZXMsIHNvIGluaGVyaXRlZCBGT1JDRV9DT0xPUiBtdXN0IG5vdCBsZWFrIHRocm91Z2guXG4gICAgZGVsZXRlIGVudi5GT1JDRV9DT0xPUjtcbiAgfSBlbHNlIGlmIChwcmVzZXJ2ZUNvbG9yICYmIHByb2Nlc3Muc3Rkb3V0LmlzVFRZKSB7XG4gICAgZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZml4QnVuQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy8xNDM1OVxuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnbmV4dCBkZXYnKSB8fFxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzgyMjJcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwbGF5d3JpZ2h0JykgfHxcbiAgICAvLyBcImJ1biAtLWJ1biBwcmlzbWEgZ2VuZXJhdGVcIiBkb2Vzbid0IHdvcmtcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwcmlzbWEnKSB8fFxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnKVxuICAgID8gY29tbWFuZC5yZXBsYWNlQWxsKCdidW4gLS1idW4nLCAnYnVuJylcbiAgICA6IGNvbW1hbmQ7XG59XG4iLCJpbXBvcnQgeyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIC8vIFRoaXMgb3B0aW9uIGlzIGZvciBkZWJ1Z2dpbmcgbWFpbmx5LlxuICAnd29ya2luZy1kaXInOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICAnZHJ5LXJ1bic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogWydkcnknLCAnZCddLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG9wdGlvbk5hbWUgb2YgT2JqZWN0LmtleXMoeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudikpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldE9wdGlvblZhbHVlKGFyZ3YsIG9wdGlvbk5hbWUpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgYXJncy5wdXNoKHZhbHVlID8gYC0tJHtvcHRpb25OYW1lfWAgOiBgLS0ke29wdGlvbk5hbWV9PWZhbHNlYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHt2YWx1ZX1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke2l0ZW19YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChcbiAgICAoYXJndiBhcyBFbnZSZWFkZXJPcHRpb25zICYgeyBzaWxlbnQ/OiBib29sZWFuIH0pLnNpbGVudCA9PT0gdHJ1ZSAmJlxuICAgIGdldE9wdGlvblZhbHVlKGFyZ3YsICdxdWlldC1lbnYnKSA9PT0gdW5kZWZpbmVkXG4gICkge1xuICAgIGFyZ3MucHVzaCgnLS1xdWlldC1lbnYnKTtcbiAgfVxuICByZXR1cm4gYXJncztcbn1cblxuZnVuY3Rpb24gZ2V0T3B0aW9uVmFsdWUoYXJndjogRW52UmVhZGVyT3B0aW9ucywgb3B0aW9uTmFtZTogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGNhbWVsQ2FzZU9wdGlvbk5hbWUgPSBvcHRpb25OYW1lLnJlcGxhY2VBbGwoLy0oW2Etel0pL2csIChfLCBjaGFyYWN0ZXI6IHN0cmluZykgPT4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCkpO1xuICBjb25zdCBvcHRpb25zID0gYXJndiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIG9wdGlvbnNbb3B0aW9uTmFtZV0gPz8gb3B0aW9uc1tjYW1lbENhc2VPcHRpb25OYW1lXTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52LCBub3JtYWxpemVTY3JpcHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgRk9SQ0VfS0lMTF9ERUxBWV9NUyA9IDUwMDA7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdraWxsLW90aGVycyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBleGl0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAna2lsbC1vdGhlcnMtb24tZmFpbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBmYWlscycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzdWNjZXNzOiB7XG4gICAgZGVzY3JpcHRpb246ICdEZWZpbmUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIGNyaXRlcmlhJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbJ2FsbCcsICdmaXJzdCddLFxuICAgIGRlZmF1bHQ6ICdhbGwnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NvbW1hbmRzIHRvIHJ1biBjb25jdXJyZW50bHknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5pbnRlcmZhY2UgUnVuQ29uY3VycmVudGx5T3B0aW9ucyB7XG4gIGNvbW1hbmRzOiBzdHJpbmdbXTtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAga2lsbE90aGVyczogYm9vbGVhbjtcbiAga2lsbE90aGVyc09uRmFpbDogYm9vbGVhbjtcbiAgc3VjY2VzczogJ2FsbCcgfCAnZmlyc3QnO1xuICBjaT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBjb25jdXJyZW50bHlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY29uY3VycmVudGx5IDxjb21tYW5kcy4uLj4nLFxuICBkZXNjcmliZTogJ1J1biBjb21tYW5kcyBjb25jdXJyZW50bHknLFxuICBidWlsZGVyOiB7IC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLCAuLi5idWlsZGVyLCAuLi5hcmd1bWVudHNCdWlsZGVyIH0sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kcyA9IChhcmd2LmNvbW1hbmRzID8/IFtdKS5tYXAoU3RyaW5nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIGNvbW1hbmRzIHByb3ZpZGVkLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Db25jdXJyZW50bHkoe1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAga2lsbE90aGVyczogYXJndi5raWxsT3RoZXJzID8/IGZhbHNlLFxuICAgICAgICBraWxsT3RoZXJzT25GYWlsOiBhcmd2LmtpbGxPdGhlcnNPbkZhaWwgPz8gZmFsc2UsXG4gICAgICAgIHN1Y2Nlc3M6IGFyZ3Yuc3VjY2VzcyxcbiAgICAgICAgY2k6IHR5cGVvZiBhcmd2LmNpID09PSAnYm9vbGVhbicgPyBhcmd2LmNpIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ29uY3VycmVudGx5KG9wdGlvbnM6IFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBjaGlsZHJlbiA9IG9wdGlvbnMuY29tbWFuZHMubWFwKChjb21tYW5kKSA9PlxuICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd24obm9ybWFsaXplU2NyaXB0KGNvbW1hbmQsIG9wdGlvbnMucHJvamVjdCkucnVubmFibGUsIHtcbiAgICAgIGN3ZDogb3B0aW9ucy5wcm9qZWN0LmRpclBhdGgsXG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIGVudjogY29uZmlndXJlRW52KG9wdGlvbnMucHJvamVjdC5lbnYsIHsgY2k6IG9wdGlvbnMuY2kgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSlcbiAgKTtcblxuICBsZXQgc3RvcHBpbmcgPSBmYWxzZTtcbiAgbGV0IGludGVycnVwdGVkU2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZDtcbiAgbGV0IGZpcnN0UmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBzdG9wUmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZvcmNlS2lsbFByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgY29uc3QgcmVzdWx0cyA9IEFycmF5LmZyb208bnVtYmVyIHwgdW5kZWZpbmVkPih7IGxlbmd0aDogY2hpbGRyZW4ubGVuZ3RoIH0pO1xuICBjb25zdCB3YWl0Rm9yRXhpdFByb21pc2VzID0gY2hpbGRyZW4ubWFwKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzZXR0bGUgPSAoZXhpdENvZGU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICByZXN1bHRzW2luZGV4XSA9IGV4aXRDb2RlO1xuICAgICAgICBmaXJzdFJlc3VsdCA/Pz0gZXhpdENvZGU7XG5cbiAgICAgICAgaWYgKCFzdG9wcGluZyAmJiBzaG91bGRTdG9wT3RoZXJzKGV4aXRDb2RlLCBvcHRpb25zKSkge1xuICAgICAgICAgIHN0b3BSZXN1bHQgPSBleGl0Q29kZTtcbiAgICAgICAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgICAgICAgZm9yY2VLaWxsUHJvbWlzZXMucHVzaCh0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbiwgJ1NJR1RFUk0nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgY2hpbGQub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN0YXJ0IGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgICAgICBzZXR0bGUoMSk7XG4gICAgICB9KTtcbiAgICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHNldHRsZShnZXRFeGl0Q29kZShjb2RlID8/IHVuZGVmaW5lZCwgc2lnbmFsID8/IHVuZGVmaW5lZCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IHN0b3BBbGwgPSAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQgPT4ge1xuICAgIGludGVycnVwdGVkU2lnbmFsID8/PSBzaWduYWw7XG4gICAgaWYgKHN0b3BwaW5nKSByZXR1cm47XG5cbiAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgZm9yY2VLaWxsUHJvbWlzZXMucHVzaCh0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbiwgc2lnbmFsKSk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ2ludCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdJTlQnKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lndGVybSA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdURVJNJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3F1aXQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHUVVJVCcpO1xuICB9O1xuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gIHByb2Nlc3Mub24oJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yRXhpdFByb21pc2VzKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChmb3JjZUtpbGxQcm9taXNlcyk7XG4gIH0gZmluYWxseSB7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB9XG5cbiAgaWYgKGludGVycnVwdGVkU2lnbmFsKSB7XG4gICAgcmV0dXJuIGdldEV4aXRDb2RlKHVuZGVmaW5lZCwgaW50ZXJydXB0ZWRTaWduYWwpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0Jykge1xuICAgIHJldHVybiBmaXJzdFJlc3VsdCA/PyAxO1xuICB9XG4gIGlmIChzdG9wUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RvcFJlc3VsdDtcbiAgfVxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGdldEV4aXRDb2RlKGNvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGlmIChjb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29kZTtcbiAgfVxuICBpZiAoc2lnbmFsICYmIHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykge1xuICAgIHJldHVybiAxMjggKyBjb25zdGFudHMuc2lnbmFsc1tzaWduYWxdO1xuICB9XG4gIHJldHVybiAxO1xufVxuXG5mdW5jdGlvbiBzaG91bGRTdG9wT3RoZXJzKFxuICBleGl0Q29kZTogbnVtYmVyLFxuICBvcHRpb25zOiBQaWNrPFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMsICdraWxsT3RoZXJzJyB8ICdraWxsT3RoZXJzT25GYWlsJyB8ICdzdWNjZXNzJz5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gb3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnIHx8IG9wdGlvbnMua2lsbE90aGVycyB8fCAob3B0aW9ucy5raWxsT3RoZXJzT25GYWlsICYmIGV4aXRDb2RlICE9PSAwKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10sIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZm9yY2VLaWxsUGlkcyA9IHNpZ25hbFBpZHModG9DaGlsZFBpZHMoY2hpbGRyZW4pLCBzaWduYWwpO1xuICBpZiAoZm9yY2VLaWxsUGlkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBpZiAoYXdhaXQgd2FpdEZvckZvcmNlS2lsbChmb3JjZUtpbGxQaWRzKSkge1xuICAgIHNpZ25hbFBpZHMoZm9yY2VLaWxsUGlkcywgJ1NJR0tJTEwnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0NoaWxkUGlkcyhjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNoaWxkcmVuLmZsYXRNYXAoKGNoaWxkKSA9PiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQgPyBbXSA6IFtjaGlsZC5waWRdKSk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbFBpZHMocGlkczogcmVhZG9ubHkgbnVtYmVyW10sIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNpZ25hbGVkUGlkczogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBwaWQgb2YgcGlkcykge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWtpbGxQcm9jZXNzR3JvdXAocGlkLCBzaWduYWwpKSBjb250aW51ZTtcblxuICAgICAgc2lnbmFsZWRQaWRzLnB1c2gocGlkKTtcbiAgICAgIHRyZWVLaWxsKHBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8ga2lsbCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNpZ25hbGVkUGlkcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckZvcmNlS2lsbChwaWRzOiByZWFkb25seSBudW1iZXJbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBGT1JDRV9LSUxMX0RFTEFZX01TO1xuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgaWYgKHBpZHMuZXZlcnkoaXNQcm9jZXNzR3JvdXBHb25lKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgYXdhaXQgc2xlZXAoTWF0aC5taW4oMTAwLCBkZWFkbGluZSAtIERhdGUubm93KCkpKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNQcm9jZXNzR3JvdXBHb25lKHBpZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsIDApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZnVuY3Rpb24ga2lsbFByb2Nlc3NHcm91cChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcGlkLCBzaWduYWwpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuY29uc3QgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FID0gJ2xpdGVzdHJlYW0ueW1sJztcbmNvbnN0IERFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSCA9ICcvZXRjL2xpdGVzdHJlYW0ueW1sJztcblxuY29uc3QgUE9TU0lCTEVfUFJJU01BX1BBVEhTID0gW1xuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuXTtcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjbGVhblVwQ29tbWFuZCA9IGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgLy8gQ2xlYW51cCBleGlzdGluZyBhcnRpZmFjdHMgdG8gYXZvaWQgaXNzdWVzIHdpdGggTGl0ZXN0cmVhbSByZXBsaWNhdGlvbi5cbiAgICAvLyBOb3RlIHRoYXQgZG9uJ3QgbWVyZ2UgbXVsdGlwbGUgcm0gY29tbWFuZHMgaW50byBvbmUsIGJlY2F1c2UgaWYgb25lIGZhaWxzLCB0aGUgc3Vic2VxdWVudCBvbmVzIHdvbid0IHJ1bi5cbiAgICByZXR1cm4gYCR7Y2xlYW5VcENvbW1hbmR9OyBybSAtUmYgJHtkaXJQYXRofS8ucHJvZC5zcWxpdGUzKiB8fCB0cnVlYDtcbiAgfVxuXG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICBnZW5lcmF0ZShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gWydQUklTTUEgZ2VuZXJhdGUnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgcmVtb3ZlRGJDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgY29uc3QgbGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiA9IGdldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCk7XG4gICAgLy8gYHByaXNtYSBtaWdyYXRlIHJlc2V0YCBjYW4gZmFpbCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBleGlzdGluZyBkYXRhYmFzZSwgc28gd2UgcmVtb3ZlIGl0IGZpcnN0LlxuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgJHtyZW1vdmVEYkNvbW1hbmR9OyBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlICR7bGl0ZXN0cmVhbUNvbmZpZ09wdGlvbn0gLW8gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgbHMgLWFobCAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBBTExPV19UT19TS0lQX1NFRUQ9MCBQUklTTUEgbWlncmF0ZSBkZXBsb3lgO1xuICB9XG5cbiAgbGlzdEJhY2t1cHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4ICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0KX0gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfSAmJiAke3RoaXMuZ2VuZXJhdGUocHJvamVjdCl9ICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIGNvbnN0IHN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNsZWFudXBDb21tYW5kID0gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdCk7XG4gICAgaWYgKGNsZWFudXBDb21tYW5kKSBzdGVwcy5wdXNoKGNsZWFudXBDb21tYW5kKTtcbiAgICBjb25zdCByZXNldENvbW1hbmQgPSBbJ1BSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBzdGVwcy5wdXNoKHJlc2V0Q29tbWFuZCk7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikge1xuICAgICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgICAgc3RlcHMucHVzaCh0aGlzLnNlZWQocHJvamVjdCkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgcm0gLVJmICR7b3V0cHV0UGF0aH0qOyBsaXRlc3RyZWFtIHJlc3RvcmUgJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QpfSAtbyAke291dHB1dFBhdGh9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gICAgICBpZiAoYmFzZURpcikge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyLCBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKSk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvbW91bnQnIDogJ3ByaXNtYS9tb3VudCc7XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICBjb25zdCBsb2NhbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbENvbmZpZ1BhdGgpKSByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xuICBpZiAoZnMuZXhpc3RzU3luYyhERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgpKSByZXR1cm4gYC1jb25maWcgJHtERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEh9YDtcbiAgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1SZiBcIiR7ZGJQYXRofVwiKmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGlmIFsgLWYgXCIke2RiUGF0aH1cIiBdOyB0aGVuIHByaW50ZiAnUFJBR01BIHdhbF9jaGVja3BvaW50KFRSVU5DQVRFKTsnIHwgUFJJU01BIGRiIGV4ZWN1dGUgLS1zdGRpbiAtLXVybCBcIiR7RklMRV9TQ0hFTUF9JHtkYlBhdGh9XCI7IGZpICYmIHJtIC1mIFwiJHtkYlBhdGh9XCIuKiBcIiR7ZGJQYXRofVwiLSpgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd0RiUGF0aCA9IGRiVXJsLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkucmVwbGFjZSgvWz8jXS4qJC8sICcnKTtcbiAgaWYgKCFyYXdEYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKHJhd0RiUGF0aClcbiAgICA/IHJhd0RiUGF0aFxuICAgIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciA/PyAnLicsIHJhd0RiUGF0aCk7XG5cbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgZ2VuQ29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdnZW4tY29kZScsXG4gIGRlc2NyaWJlOiAnR2VuZXJhdGUgY29kZSBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VuQ29kZVRhcmdldHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1xuICAgICAgLm1hcCgocHJvamVjdCkgPT4gKHsgcHJvamVjdCwgc2NyaXB0czogZ2V0R2VuQ29kZVNjcmlwdHMocHJvamVjdCkgfSkpXG4gICAgICAuZmlsdGVyKCh7IHNjcmlwdHMgfSkgPT4gc2NyaXB0cy5sZW5ndGggPiAwKTtcbiAgICBpZiAoZ2VuQ29kZVRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ05vIGNvZGUgZ2VuZXJhdGlvbiBuZWVkZWQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCwgc2NyaXB0cyB9IG9mIGdlbkNvZGVUYXJnZXRzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJnZW4tY29kZVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG4gICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBzY3JpcHRzKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEdlbkNvZGVTY3JpcHRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ2JsaXR6JykpIHtcbiAgICBzY3JpcHRzLnB1c2goJ1lBUk4gYmxpdHogY29kZWdlbicpO1xuICAgIGlmIChwcm9qZWN0Lmhhc1ByaXNtYSkge1xuICAgICAgc2NyaXB0cy5wdXNoKHByaXNtYVNjcmlwdHMuZ2VuZXJhdGUocHJvamVjdCkpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChwcm9qZWN0Lmhhc1ByaXNtYSkge1xuICAgIHNjcmlwdHMucHVzaChwcmlzbWFTY3JpcHRzLmdlbmVyYXRlKHByb2plY3QpKTtcbiAgfVxuXG4gIGNvbnN0IGNoYWtyYVR5cGVnZW5TY3JpcHQgPSBnZXRDaGFrcmFTY3JpcHQocHJvamVjdCk7XG4gIGlmIChjaGFrcmFUeXBlZ2VuU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKGNoYWtyYVR5cGVnZW5TY3JpcHQpO1xuICB9XG5cbiAgY29uc3QgZHJpenpsZUNvbmZpZ1BhdGggPSBzY3JpcHRzLmxlbmd0aCA9PT0gMCAmJiBwcm9qZWN0Lmhhc0RyaXp6bGUgPyBnZXREcml6emxlQ29uZmlnUGF0aChwcm9qZWN0KSA6IHVuZGVmaW5lZDtcbiAgaWYgKGRyaXp6bGVDb25maWdQYXRoKSB7XG4gICAgc2NyaXB0cy5wdXNoKGBZQVJOIGRyaXp6bGUta2l0IGNoZWNrIC0tY29uZmlnICR7ZHJpenpsZUNvbmZpZ1BhdGh9IHx8IHRydWVgKTtcbiAgfVxuICByZXR1cm4gc2NyaXB0cztcbn1cblxuZnVuY3Rpb24gZ2V0Q2hha3JhU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnQGNoYWtyYS11aS9jbGknKSkgcmV0dXJuO1xuXG4gIGlmIChnZXRPd25EZXBlbmRlbmN5TWFqb3IocHJvamVjdCwgJ0BjaGFrcmEtdWkvY2xpJykgPT09IDIpIHtcbiAgICByZXR1cm4gJ1lBUk4gY2hha3JhLWNsaSB0b2tlbnMgc3JjL2NvcmUvdGhlbWUudHMnO1xuICB9XG4gIGlmIChmaWxlRXhpc3RzKHByb2plY3QsICdzcmMvdGhlbWUudHMnKSkge1xuICAgIHJldHVybiAnWUFSTiBjaGFrcmEgdHlwZWdlbiBzcmMvdGhlbWUudHMgLS1zdHJpY3QnO1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gZ2V0RHJpenpsZUNvbmZpZ1BhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbJ2RyaXp6bGUuY29uZmlnLnRzJywgJ2RyaXp6bGUuY29uZmlnLm10cycsICdkcml6emxlLmNvbmZpZy5qcycsICdkcml6emxlLmNvbmZpZy5tanMnXTtcbiAgcmV0dXJuIGNhbmRpZGF0ZXMuZmluZCgoZmlsZVBhdGgpID0+IGZpbGVFeGlzdHMocHJvamVjdCwgZmlsZVBhdGgpKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3duRGVwZW5kZW5jeU1ham9yKHByb2plY3Q6IFByb2plY3QsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gIGNvbnN0IHZlcnNpb24gPVxuICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgIHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXTtcbiAgY29uc3QgbWFqb3IgPSB2ZXJzaW9uPy5tYXRjaCgvXFxkKy91KT8uWzBdO1xuICByZXR1cm4gbWFqb3IgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE51bWJlcihtYWpvcik7XG59XG5cbmZ1bmN0aW9uIGZpbGVFeGlzdHMocHJvamVjdDogUHJvamVjdCwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBmaWxlUGF0aCkpO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG5jb25zdCBraWxsUG9ydElmTm9uQ2lCdWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBraWxsUG9ydElmTm9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2tpbGwtcG9ydC1pZi1ub24tY2knLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIHBvcnQgc3BlY2lmaWVkIGJ5IFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgbm9uLUNJLicsXG4gIGJ1aWxkZXI6IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGtpbGxQb3J0SWZOb25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydElmTm9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwIGtpbGxpbmcgcG9ydCBkdWUgdG8gQ0k6ICR7cHJvamVjdC5lbnYuQ0l9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9ydEVudiA9IHByb2plY3QuZW52LlBPUlQ7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhgS2lsbGluZyB0aGUgcG9ydDogJHtwb3J0fWApO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIXNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGUsIG91dHB1dCkpIHJldHVybjtcblxuICBjb25zdCBub3JtYWxpemVkT3V0cHV0ID0gbm9ybWFsaXplQnVmZmVyZWRPdXRwdXQob3V0cHV0KTtcbiAgaWYgKG5vcm1hbGl6ZWRPdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShub3JtYWxpemVkT3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV4aXRDb2RlICE9PSAwIHx8IGhhc1dhcm5pbmdPdXRwdXQob3V0cHV0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUJ1ZmZlcmVkT3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG91dHB1dC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1dhcm5pbmdPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGJ3YXJuKD86aW5nKT9zP1xcYi9pLnRlc3Qob3V0cHV0LnJlcGxhY2VBbGwoL1xcYig/OjB8bm8pIHdhcm5pbmdzP1xcYi9naSwgJycpKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsQ29tbWFuZChhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZykpLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke25hbWV9PSR7c2hlbGxFc2NhcGVBcmd1bWVudCh2YWx1ZSl9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gL15bXFx3Li86PSxAJSstXSskL3UudGVzdChhcmcpID8gYXJnIDogYCcke2FyZy5yZXBsYWNlQWxsKFwiJ1wiLCBgJ1wiJ1wiJ2ApfSdgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgQnVmZmVyZWRSdW5SZXN1bHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVTY3JpcHQsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmludEJ1ZmZlcmVkT3V0cHV0IH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmaXg6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpeCB0aGUgbGludGluZyBlcnJvcnMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZm9ybWF0OiB7XG4gICAgZGVzY3JpcHRpb246ICdGb3JtYXQgdGhlIGNvZGUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgcXVpZXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlcG9ydCBlcnJvcnMgb25seScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1ByaW50IG9ubHkgZmFpbGVkIG9yIHdhcm5pbmcgY29tbWFuZCBvdXRwdXQnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBmaWxlczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhzIHRvIGxpbnQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPFxuICB0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlclxuPjtcbmV4cG9ydCB0eXBlIExpbnRDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxMaW50Q29tbWFuZE9wdGlvbnM+ICYge1xuICAnLS0nPzogdW5rbm93bltdO1xuICBfOiB1bmtub3duW107XG4gIHByaW50QWxsT3V0cHV0PzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IG94bGludEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddKTtcbmNvbnN0IHB5dGhvbkV4dGVuc2lvbnMgPSBuZXcgU2V0KFsncHknXSk7XG5jb25zdCBkYXJ0RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydkYXJ0J10pO1xuY29uc3Qgb3hmbXRFeHRlbnNpb25zID0gbmV3IFNldChbXG4gIC4uLm94bGludEV4dGVuc2lvbnMsXG4gICdjc3MnLFxuICAnZ3FsJyxcbiAgJ2dyYXBocWwnLFxuICAnaGJzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnbGVzcycsXG4gICdtZCcsXG4gICdtZHgnLFxuICAnc2NzcycsXG4gICd0b21sJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdjanMnLFxuICAnY3NzJyxcbiAgJ2N0cycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqYXZhJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21kJyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc2NzcycsXG4gICd0cycsXG4gICd0c3gnLFxuICAndnVlJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJPbmx5RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uZmlsdGVyKChleHQpID0+ICFveGZtdEV4dGVuc2lvbnMuaGFzKGV4dCkpKTtcbmNvbnN0IHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4gPSAnISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqJztcblxudHlwZSBCdWZmZXJlZExpbnRSdW5SZXN1bHQgPSBCdWZmZXJlZFJ1blJlc3VsdCAmIHsgY29tbWFuZDogc3RyaW5nOyBjd2Q6IHN0cmluZyB9O1xudHlwZSBMaW50UnVuUmVzdWx0ID0gQnVmZmVyZWRMaW50UnVuUmVzdWx0IHwgeyBleGl0Q29kZTogbnVtYmVyIH07XG5pbnRlcmZhY2UgTGludFJ1bkNvbW1hbmQge1xuICBjb21tYW5kOiBzdHJpbmc7XG4gIHByb2plY3Q6IFByb2plY3Q7XG59XG5cbmV4cG9ydCBjb25zdCBsaW50Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBMaW50Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IGxpbnQoYXJndiBhcyBMaW50Q29tbWFuZEFyZ3YpO1xuICAgIGlmIChleGl0Q29kZSkgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW50KGFyZ3Y6IExpbnRDb21tYW5kQXJndik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gZ2V0TGludFRhcmdldEZpbGVzKGFyZ3YpO1xuICBjb25zdCBsaW50RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3Qgb3hmbXRGaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBweXRob25GaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHJldHRpZXJGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VKc29uRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IGZhbHNlO1xuICBsZXQgcHJldHRpZXJBcmdzOiBzdHJpbmdbXTtcbiAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3M6IHN0cmluZ1tdO1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbnRUYXJnZXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZSk7XG4gICAgICAgIGNvbnN0IGZpbGVLaW5kID0gYXdhaXQgZ2V0TGludFRhcmdldEZpbGVLaW5kKGZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIHsgZmlsZUtpbmQsIGZpbGVQYXRoIH07XG4gICAgICB9KVxuICAgICk7XG4gICAgZm9yIChjb25zdCB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9IG9mIGxpbnRUYXJnZXRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpIHx8XG4gICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC9maXh0dXJlcy8nKSB8fFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goLi4uZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKHByb2plY3RzLmRlc2NlbmRhbnRzLCBmaWxlUGF0aCwgZmlsZUtpbmQpKTtcblxuICAgICAgZm9yIChjb25zdCB7IGxpbnRQYXRoLCBwcm9qZWN0IH0gb2YgZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSkge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgcHl0aG9uRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBweXRob25GaWxlUGF0aHMgPSBweXRob25GaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIHB5dGhvbkZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIHB5dGhvbkZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwgJiYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBkYXJ0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBkYXJ0RmlsZVBhdGhzID0gZGFydEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgZGFydEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzKTtcbiAgICAgICAgICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0LCBleHRlbnNpb24pKSB7XG4gICAgICAgICAgY29uc3QgbGludEZpbGVQYXRocyA9IGxpbnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgbGludEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgbGludEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGJ1aWxkUHJldHRpZXJPbmx5RGlyZWN0b3J5UGF0dGVybihsaW50UGF0aCksIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBmb3JtYXR0ZXJQYXRoIG9mIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKHByb2plY3QsIGxpbnRQYXRoLCBmaWxlS2luZCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2goZm9ybWF0dGVyUGF0aCk7XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChhcmd2LmZvcm1hdCAmJiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCAmJiBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbikgJiYgIXByb2plY3QucHJlZmVycmVkTGludGVyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE5vIGxpbnRlciBmb3VuZCBmb3IgJHtwcm9qZWN0Lm5hbWV9LiBJbnN0YWxsIE94bGludC5gKSk7XG4gICAgICAgICAgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJldHRpZXJBcmdzID0gWy4uLm5ldyBTZXQocHJldHRpZXJGaWxlUGF0aHMpXTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gWy4uLm5ldyBTZXQocGFja2FnZUpzb25GaWxlUGF0aHMpXTtcbiAgfSBlbHNlIHtcbiAgICBwcmV0dGllckFyZ3MgPSBidWlsZFByZXR0aWVyQXJncyhwcm9qZWN0cy5zZWxmLmRpclBhdGgsIHByb2plY3RzLmRlc2NlbmRhbnRzKTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwKSA9PiBwLnBhY2thZ2VKc29uUGF0aCk7XG4gIH1cblxuICBjb25zdCBmb3JtYXR0ZXJDb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSA9IFtdO1xuICBjb25zdCBsaW50ZXJDb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSA9IFtdO1xuICBjb25zdCBsaW50UnVuT3B0aW9ucyA9IHsgZXhpdElmRmFpbGVkOiBmYWxzZSwgcHJlc2VydmVDb2xvcjogIWFyZ3YucHJpbnRBbGxPdXRwdXQgfSBhcyBjb25zdDtcbiAgY29uc3Qgc2hvdWxkUnVuRm9ybWF0dGVycyA9IEJvb2xlYW4oYXJndi5mb3JtYXQpO1xuICBjb25zdCBzaG91bGRSdW5MaW50ZXJzID0gIWFyZ3YuZm9ybWF0IHx8IGFyZ3YuZml4O1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBsaW50RmlsZVBhdGhzXSBvZiBsaW50RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2LCBsaW50RmlsZVBhdGhzKTtcbiAgICAgICAgaWYgKCFsaW50Q29tbWFuZCkgY29udGludWU7XG5cbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGxpbnRDb21tYW5kLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBweXRob25GaWxlUGF0aHNdIG9mIHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndiwgcHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQocHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgZGFydEZpbGVQYXRoc10gb2YgZGFydEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydExpbnRDb21tYW5kKGRhcnRGaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoZGFydEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBveGZtdEZpbGVQYXRoc10gb2Ygb3hmbXRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkT3hmbXRDb21tYW5kKG94Zm10RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyB8fCBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndik7XG4gICAgICAgICAgaWYgKGxpbnRDb21tYW5kKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogbGludENvbW1hbmQsIHByb2plY3QgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndiksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0TGludENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10KSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRPeGZtdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCkgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgbGludEV4aXRDb2RlczogbnVtYmVyW10gPSBbXTtcblxuICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgIGNvbnN0IGZvcm1hdHRlclJlc3VsdHMgPSBhd2FpdCBydW5MaW50Q29tbWFuZHMoZm9ybWF0dGVyQ29tbWFuZHMsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKTtcbiAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKGZvcm1hdHRlclJlc3VsdHMsIGFyZ3YpO1xuICAgIGxpbnRFeGl0Q29kZXMucHVzaCguLi5mb3JtYXR0ZXJSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUpKTtcblxuICAgIGlmIChsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgIGlmIChwcmV0dGllckFyZ3MubGVuZ3RoID4gMCAmJiBwcm9qZWN0cy5zZWxmLmhhc1ByZXR0aWVyKSB7XG4gICAgICBjb25zdCBwcmV0dGllclJlc3VsdCA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kKFxuICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICAgJ1lBUk4nLFxuICAgICAgICAgICdwcmV0dGllcicsXG4gICAgICAgICAgJy0tY2FjaGUnLFxuICAgICAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgICAgICAnLS13cml0ZScsXG4gICAgICAgICAgJy0tJyxcbiAgICAgICAgICAuLi5wcmV0dGllckFyZ3MsXG4gICAgICAgIF0pLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICBsaW50UnVuT3B0aW9uc1xuICAgICAgKTtcbiAgICAgIHByaW50U2lsZW50TGludE91dHB1dHMoW3ByZXR0aWVyUmVzdWx0XSwgYXJndik7XG4gICAgICBsaW50RXhpdENvZGVzLnB1c2gocHJldHRpZXJSZXN1bHQuZXhpdENvZGUpO1xuICAgIH1cbiAgICBpZiAoc29ydFBhY2thZ2VKc29uQXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzb3J0UGFja2FnZUpzb25SZXN1bHQgPSBhd2FpdCBydW5MaW50Q29tbWFuZChcbiAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoWydZQVJOJywgJ3NvcnQtcGFja2FnZS1qc29uJywgJy0tJywgLi4uc29ydFBhY2thZ2VKc29uQXJnc10pLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICBsaW50UnVuT3B0aW9uc1xuICAgICAgKTtcbiAgICAgIHByaW50U2lsZW50TGludE91dHB1dHMoW3NvcnRQYWNrYWdlSnNvblJlc3VsdF0sIGFyZ3YpO1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKHNvcnRQYWNrYWdlSnNvblJlc3VsdC5leGl0Q29kZSk7XG4gICAgfVxuXG4gICAgaWYgKGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICBjb25zdCBsaW50ZXJSZXN1bHRzID0gYXdhaXQgcnVuTGludENvbW1hbmRzKGxpbnRlckNvbW1hbmRzLCBhcmd2LCBsaW50UnVuT3B0aW9ucyk7XG4gICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhsaW50ZXJSZXN1bHRzLCBhcmd2KTtcbiAgICBsaW50RXhpdENvZGVzLnB1c2goLi4ubGludGVyUmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0LmV4aXRDb2RlKSk7XG4gIH1cblxuICByZXR1cm4gbGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApID8gMSA6IDA7XG59XG5cbmZ1bmN0aW9uIHJ1bkxpbnRDb21tYW5kcyhcbiAgY29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10sXG4gIGFyZ3Y6IExpbnRDb21tYW5kQXJndixcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduSW5QYXJhbGxlbD5bM11cbik6IFByb21pc2U8TGludFJ1blJlc3VsdFtdPiB7XG4gIHJldHVybiBQcm9taXNlLmFsbChjb21tYW5kcy5tYXAoKHsgY29tbWFuZCwgcHJvamVjdCB9KSA9PiBydW5MaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKSkpO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHQ+IHtcbiAgaWYgKGFyZ3Yuc2lsZW50KSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKHJlc3VsdCkgPT4gKHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIGNvbW1hbmQ6IG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLFxuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgfSkpO1xuICB9XG4gIHJldHVybiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKGV4aXRDb2RlKSA9PiAoeyBleGl0Q29kZSB9KSk7XG59XG5cbmZ1bmN0aW9uIHByaW50U2lsZW50TGludE91dHB1dHMoXG4gIHJlc3VsdHM6IExpbnRSdW5SZXN1bHRbXSxcbiAgYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICdwcmludEFsbE91dHB1dCcgfCAnc2lsZW50Jz5cbik6IHZvaWQge1xuICBjb25zdCBwcmludGFibGVSZXN1bHRzID1cbiAgICBhcmd2LnNpbGVudCAmJiAhYXJndi5wcmludEFsbE91dHB1dCA/IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+IHJlc3VsdC5leGl0Q29kZSAhPT0gMCkgOiByZXN1bHRzO1xuICBpZiAocHJpbnRhYmxlUmVzdWx0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBwcmludGFibGVSZXN1bHRzKSB7XG4gICAgaWYgKCEoJ291dHB1dCcgaW4gcmVzdWx0KSkgY29udGludWU7XG5cbiAgICBpZiAoYXJndi5wcmludEFsbE91dHB1dCkge1xuICAgICAgcHJpbnRDb21tYW5kT3V0cHV0KHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhcmd2LnNpbGVudCkge1xuICAgICAgICBwcmludENvbW1hbmRIZWFkZXIocmVzdWx0LmNvbW1hbmQsIHJlc3VsdC5jd2QpO1xuICAgICAgfVxuICAgICAgcHJpbnRCdWZmZXJlZE91dHB1dChyZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5vdXRwdXQpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRPdXRwdXQocmVzdWx0OiBCdWZmZXJlZExpbnRSdW5SZXN1bHQpOiB2b2lkIHtcbiAgcHJpbnRDb21tYW5kSGVhZGVyKHJlc3VsdC5jb21tYW5kLCByZXN1bHQuY3dkKTtcblxuICBpZiAocmVzdWx0LmV4aXRDb2RlID09PSAwICYmIHNob3VsZFN1cHByZXNzU3VjY2Vzc2Z1bFZlcmlmeU91dHB1dChyZXN1bHQuY29tbWFuZCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dC50cmltKCk7XG4gIGlmIChvdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRIZWFkZXIoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3VwcHJlc3NTdWNjZXNzZnVsVmVyaWZ5T3V0cHV0KGNvbW1hbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnIG94Zm10ICcpIHx8IGNvbW1hbmQuaW5jbHVkZXMoJyBzb3J0LXBhY2thZ2UtanNvbiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTGludENvbW1hbmQoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcic+LFxuICBhcmd2OiBQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ2ZpeCcgfCAnZm9ybWF0Jz4gJiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sXG4gIGZpbGVzPzogc3RyaW5nW11cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ294bGludCcsXG4gICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAuLi4oYXJndi5xdWlldCA/IFsnLS1xdWlldCddIDogW10pLFxuICAgICAgLi4uKGFyZ3YuZml4ID8gWyctLWZpeCddIDogW10pLFxuICAgICAgLi4uKGZpbGVzID8/IFsnLiddKSxcbiAgICBdKTtcbiAgfVxuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE94Zm10Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAnWUFSTicsXG4gICAgJ294Zm10JyxcbiAgICAnLS13cml0ZScsXG4gICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgJyEqKi9wYWNrYWdlLmpzb24nLFxuICBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICByZXR1cm4gW1xuICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdpc29ydCcsICctLXByb2ZpbGUnLCAnYmxhY2snLCAnLS1maWx0ZXItZmlsZXMnLCAuLi50YXJnZXRzXSksXG4gICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2JsYWNrJywgLi4udGFyZ2V0c10pLFxuICBdLmpvaW4oJyAmJiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndjogUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LCBmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2ZsYWtlOCcsIC4uLihhcmd2LnF1aWV0ID8gWyctcSddIDogW10pLCAuLi50YXJnZXRzXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERhcnRGb3JtYXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ2RhcnQnLCAnZm9ybWF0JywgLi4udGFyZ2V0c10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREYXJ0TGludENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnZGFydCcsICdhbmFseXplJywgLi4udGFyZ2V0c10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQcmV0dGllckFyZ3MoXG4gIHNlbGZEaXJQYXRoOiBzdHJpbmcsXG4gIHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz5bXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzID0gbmV3IFNldDxzdHJpbmc+KFtgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuXSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmICghbmVlZHNQcmV0dGllcihwcm9qZWN0KSkgY29udGludWU7XG5cbiAgICBjb25zdCBwcm9qZWN0UGF0dGVybiA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcqKi97LiovLH0qLnsnICsgWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uam9pbignLCcpICsgJ30nKTtcbiAgICBhcmdzLmFkZChwYXRoLnJlbGF0aXZlKHNlbGZEaXJQYXRoLCBwcm9qZWN0UGF0dGVybikgfHwgcHJvamVjdFBhdHRlcm4pO1xuICB9XG4gIHJldHVybiBbLi4uYXJnc107XG59XG5cbmZ1bmN0aW9uIGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzOiBQcm9qZWN0W10sIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgbGV0IG93bmluZ1Byb2plY3Q6IFByb2plY3QgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmIChcbiAgICAgIChmaWxlUGF0aCA9PT0gcHJvamVjdC5kaXJQYXRoIHx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7cHJvamVjdC5kaXJQYXRofS9gKSkgJiZcbiAgICAgICghb3duaW5nUHJvamVjdCB8fCBwcm9qZWN0LmRpclBhdGgubGVuZ3RoID4gb3duaW5nUHJvamVjdC5kaXJQYXRoLmxlbmd0aClcbiAgICApIHtcbiAgICAgIG93bmluZ1Byb2plY3QgPSBwcm9qZWN0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3duaW5nUHJvamVjdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExpbnRUYXJnZXRGaWxlcyhhcmd2OiBQaWNrPExpbnRDb21tYW5kQXJndiwgJy0tJyB8ICdfJyB8ICdmaWxlcyc+KTogc3RyaW5nW10ge1xuICBjb25zdCBsaW50VGFyZ2V0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIFsuLi4oYXJndi5maWxlcyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXSkge1xuICAgIGxpbnRUYXJnZXRzLmFkZChTdHJpbmcodmFsdWUpKTtcbiAgfVxuICByZXR1cm4gWy4uLmxpbnRUYXJnZXRzXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTwnZGlyZWN0b3J5JyB8ICdvdGhlcic+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSByZXR1cm4gJ2RpcmVjdG9yeSc7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE1pc3NpbmcgcGF0aHMgYXJlIGhhbmRsZWQgYnkgdGhlIGRvd25zdHJlYW0gdG9vbHMuXG4gIH1cblxuICByZXR1cm4gJ290aGVyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllcihcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+LFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0Lmhhc094Zm10KSByZXR1cm4gb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICBpZiAobmVlZHNQcmV0dGllcihwcm9qZWN0KSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBwcmV0dGllck9ubHlFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJyxcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gIH1cbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBuZWVkc1ByZXR0aWVyKHByb2plY3QpKSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl07XG4gIH1cbiAgaWYgKHNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllcihwcm9qZWN0LCBleHRlbnNpb24pKSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4oZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmpvaW4oZmlsZVBhdGgsIGAqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9fWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb25QYXRoJz5bXSxcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJ1xuKTogc3RyaW5nW10ge1xuICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSByZXR1cm4gW107XG4gIHJldHVybiBwcm9qZWN0c1xuICAgIC5maWx0ZXIoXG4gICAgICAocHJvamVjdCkgPT5cbiAgICAgICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGggPT09IHBhdGguam9pbihmaWxlUGF0aCwgJ3BhY2thZ2UuanNvbicpIHx8XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoLnN0YXJ0c1dpdGgoYCR7ZmlsZVBhdGh9L2ApXG4gICAgKVxuICAgIC5tYXAoKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb25QYXRoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0TGludFRhcmdldHMoXG4gIHByb2plY3RzOiBQcm9qZWN0W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHsgbGludFBhdGg6IHN0cmluZzsgcHJvamVjdDogUHJvamVjdCB9W10ge1xuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknKSB7XG4gICAgY29uc3QgZGVzY2VuZGFudFByb2plY3RzID0gcHJvamVjdHMuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+IHByb2plY3QuZGlyUGF0aCA9PT0gZmlsZVBhdGggfHwgcHJvamVjdC5kaXJQYXRoLnN0YXJ0c1dpdGgoYCR7ZmlsZVBhdGh9L2ApXG4gICAgKTtcbiAgICBpZiAoZGVzY2VuZGFudFByb2plY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBkZXNjZW5kYW50UHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiAoeyBsaW50UGF0aDogcHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0IH0pKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gZmluZE93bmluZ1Byb2plY3QocHJvamVjdHMsIGZpbGVQYXRoKTtcbiAgcmV0dXJuIHByb2plY3QgPyBbeyBsaW50UGF0aDogZmlsZVBhdGgsIHByb2plY3QgfV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPiwgZXh0ZW5zaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50JykgcmV0dXJuIG94bGludEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbmVlZHNQcmV0dGllcihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4pOiBib29sZWFuIHtcbiAgcmV0dXJuICFwcm9qZWN0Lmhhc094Zm10ICYmIHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50Jztcbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCwgcHJpbnRTdGFydCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuaW1wb3J0IHsgaXNQb3J0QXZhaWxhYmxlIH0gZnJvbSAnLi9wb3J0LmpzJztcblxuY29uc3Qga2lsbGVkID0gbmV3IFNldDxudW1iZXIgfCBzdHJpbmc+KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQpO1xuICBpZiAoIWF2YWlsYWJsZSkge1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfVxuXG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHBvcnQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHBvcnQpO1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBXZSBzaG91bGQgc3RvcCBEb2NrZXIgY29udGFpbmVycyBmaXJzdCBiZWNhdXNlIGBraWxsLXBvcnRgIG1heSBmYWlsIHRvIHN0b3AgRG9ja2VyIGNvbnRhaW5lcnMuXG4gIGF3YWl0IHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydCwgcHJvamVjdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzKHBvcnQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeUltYWdlTmFtZShpbWFnZU5hbWU6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgbmFtZT0ke2ltYWdlTmFtZX1gXSwgcHJvamVjdCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgcHVibGlzaD0ke3BvcnR9YF0sIHByb2plY3QpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJDb250YWluZXJzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGFpbmVySWRzID0gYXdhaXQgbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzLCBwcm9qZWN0KTtcbiAgICBpZiAoY29udGFpbmVySWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydybScsICctZicsIC4uLmNvbnRhaW5lcklkc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3BzJywgJy1xJywgLi4uZmlsdGVyQXJnc10sIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IHByb2plY3QuZW52LFxuICB9KTtcbiAgcmV0dXJuIHN0ZG91dFxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoaWQpID0+IGlkLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGNyZWF0ZVNlcnZlciB9IGZyb20gJ25vZGU6bmV0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IH0gZnJvbSAnLi9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBDaGVja3MgdGhlIGdpdmVuIHBvcnQgYW5kIGtpbGxzIGFueSBwcm9jZXNzIHVzaW5nIGl0LlxuICogTm90ZSB3YiBhbHdheXMgcmVxdWlyZXMgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHJhd1BvcnQ6IHVua25vd24sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHJhd1BvcnQpO1xuICBpZiAoIXBvcnQpIHRocm93IG5ldyBFcnJvcihgVGhlIGdpdmVuIHBvcnQgKCR7cG9ydH0pIGlzIGludmFsaWQuYCk7XG5cbiAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydCwgcHJvamVjdCk7XG4gIHJldHVybiBwb3J0O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHBvcnQgaXMgYXZhaWxhYmxlLlxuICogQHBhcmFtIHBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gY2hlY2tcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHBvcnQgaXMgYXZhaWxhYmxlLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzUG9ydEF2YWlsYWJsZShwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gQ2hlY2sgYm90aCBzdGFja3MgdG8gY2F0Y2ggcHJvY2Vzc2VzIGJvdW5kIG9ubHkgb24gSVB2NiBvciBJUHY0LlxuICBmb3IgKGNvbnN0IGhvc3Qgb2YgWycxMjcuMC4wLjEnLCAnOjonXSkge1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IHByb2JlUG9ydChob3N0LCBwb3J0KTtcbiAgICBpZiAoIWF2YWlsYWJsZSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9iZVBvcnQoaG9zdDogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gY3JlYXRlU2VydmVyKCk7XG5cbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUZOT1NVUFBPUlQnKSB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLm9uY2UoJ2xpc3RlbmluZycsICgpID0+IHtcbiAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgaG9zdCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNQb3J0QXZhaWxhYmxlIH0gZnJvbSAnLi4vdXRpbHMvcG9ydC5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcbnR5cGUgTWFpbnRlbmFuY2VBcmd2ID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4gJiB7XG4gIGFjdGlvbjogJ3N0YXJ0JyB8ICdzdG9wJztcbn07XG5jb25zdCBtYWludGVuYW5jZUh0bWwgPSBgPCFkb2N0eXBlIGh0bWw+XG48aHRtbCBsYW5nPVwiamFcIj5cbiAgPGhlYWQ+XG4gICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCI+XG4gICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCI+XG4gICAgPHRpdGxlPuODoeODs+ODhuODiuODs+OCueS4rTwvdGl0bGU+XG4gICAgPHN0eWxlPlxuICAgICAgYm9keSB7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICAgIGNvbG9yOiAjMTExODI3O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBcIlNlZ29lIFVJXCIsIHNhbnMtc2VyaWY7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDEwMHZoO1xuICAgICAgfVxuXG4gICAgICBtYWluIHtcbiAgICAgICAgcGFkZGluZzogMjRweDtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgfVxuXG4gICAgICBoMSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMjhweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICAgICAgbWFyZ2luOiAwIDAgMTZweDtcbiAgICAgIH1cblxuICAgICAgcCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuODtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvaGVhZD5cbiAgPGJvZHk+XG4gICAgPG1haW4+XG4gICAgICA8aDE+54++5Zyo44Oh44Oz44OG44OK44Oz44K55Lit44Gn44GZPC9oMT5cbiAgICAgIDxwPueahuanmOOBq+OBr+OBlOS4jeS+v+OCkuOBiuOBi+OBkeOBl+OBvuOBmeOBjOOAgeODoeODs+ODhuODiuODs+OCuee1guS6huOBvuOBp+OBl+OBsOOCieOBj+OBiuW+heOBoeOBj+OBoOOBleOBhOOAgjwvcD5cbiAgICA8L21haW4+XG4gIDwvYm9keT5cbjwvaHRtbD5gO1xuXG5mdW5jdGlvbiBnZXRNYWludGVuYW5jZVNlcnZlclNvdXJjZShwb3J0OiBudW1iZXIsIHBpZFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmcucmF3YFxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcblxuY29uc3QgcGlkUGF0aCA9ICR7SlNPTi5zdHJpbmdpZnkocGlkUGF0aCl9O1xuXG5jb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcigoX3JlcXVlc3QsIHJlc3BvbnNlKSA9PiB7XG4gIHJlc3BvbnNlLndyaXRlSGVhZCg1MDMsIHtcbiAgICAnY2FjaGUtY29udHJvbCc6ICduby1zdG9yZScsXG4gICAgJ2NvbnRlbnQtdHlwZSc6ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnLFxuICB9KTtcbiAgcmVzcG9uc2UuZW5kKCR7SlNPTi5zdHJpbmdpZnkobWFpbnRlbmFuY2VIdG1sKX0pO1xufSk7XG5cbnNlcnZlci5vbignZXJyb3InLCAoKSA9PiB7XG4gIHRyeSB7XG4gICAgZnMucm1TeW5jKHBpZFBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICBwcm9jZXNzLmV4aXQoMSk7XG59KTtcblxuc2VydmVyLmxpc3Rlbigke3BvcnR9LCAnMC4wLjAuMCcsICgpID0+IHtcbiAgZnMud3JpdGVGaWxlU3luYyhwaWRQYXRoLCBTdHJpbmcocHJvY2Vzcy5waWQpICsgJ1xcbicpO1xufSk7XG5gO1xufVxuXG5leHBvcnQgY29uc3QgbWFpbnRlbmFuY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIE1haW50ZW5hbmNlQXJndj4gPSB7XG4gIGNvbW1hbmQ6ICdtYWludGVuYW5jZSA8YWN0aW9uPicsXG4gIGRlc2NyaWJlOiAnU3RhcnQgb3Igc3RvcCBhIGxpZ2h0d2VpZ2h0IG1haW50ZW5hbmNlIHBhZ2Ugc2VydmVyLiBFeGFtcGxlOiB3YiBtYWludGVuYW5jZSBzdGFydCcsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT5cbiAgICB5YXJnc1xuICAgICAgLnBvc2l0aW9uYWwoJ2FjdGlvbicsIHtcbiAgICAgICAgY2hvaWNlczogWydzdGFydCcsICdzdG9wJ10gYXMgY29uc3QsXG4gICAgICAgIGRlc2NyaWJlOiAnTWFpbnRlbmFuY2Ugc2VydmVyIGFjdGlvbicsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgfSlcbiAgICAgIC5vcHRpb25zKGJ1aWxkZXIpIGFzIHVua25vd24gYXMgQXJndjxNYWludGVuYW5jZUFyZ3Y+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbiA9IGFyZ3YuYWN0aW9uO1xuICAgIGlmIChwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0Jykge1xuICAgICAgY29uc29sZS5pbmZvKGBTa2lwIG1haW50ZW5hbmNlICR7YWN0aW9ufSBiZWNhdXNlIFdCX0VOViBpcyB0ZXN0LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSBwYXJzZVBvcnQocHJvamVjdC5lbnYuUE9SVCk7XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3N0YXJ0Jykge1xuICAgICAgYXdhaXQgc3RhcnRNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0LCBwb3J0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3N0b3AnKSB7XG4gICAgICBzdG9wTWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdCwgcG9ydCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG1haW50ZW5hbmNlIGFjdGlvbjogJHthY3Rpb259YCk7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwaWRQYXRoID0gZ2V0UGlkUGF0aChwcm9qZWN0LCBwb3J0KTtcbiAgY29uc3QgZXhpc3RpbmdQaWQgPSByZWFkUGlkKHBpZFBhdGgpO1xuICBpZiAoZXhpc3RpbmdQaWQgIT09IHVuZGVmaW5lZCAmJiBpc1Byb2Nlc3NSdW5uaW5nKGV4aXN0aW5nUGlkKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgTWFpbnRlbmFuY2Ugc2VydmVyIGlzIGFscmVhZHkgcnVubmluZyBvbiBwb3J0ICR7cG9ydH0uYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJlbW92ZVBpZEZpbGUocGlkUGF0aCk7XG5cbiAgaWYgKCEoYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQpKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBQb3J0ICR7cG9ydH0gaXMgYWxyZWFkeSBpbiB1c2UuYCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKHBpZFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBjaGlsZCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oXG4gICAgcHJvY2Vzcy5leGVjUGF0aCxcbiAgICBbJy0taW5wdXQtdHlwZT1tb2R1bGUnLCAnLS1ldmFsJywgZ2V0TWFpbnRlbmFuY2VTZXJ2ZXJTb3VyY2UocG9ydCwgcGlkUGF0aCldLFxuICAgIHtcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAnaWdub3JlJyxcbiAgICB9XG4gICk7XG4gIGlmIChjaGlsZC5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHN0YXJ0IG1haW50ZW5hbmNlIHNlcnZlci4nKTtcbiAgfVxuXG4gIGNoaWxkLnVucmVmKCk7XG4gIGF3YWl0IHdhaXRGb3JQaWRGaWxlKHBpZFBhdGgsIGNoaWxkLnBpZCk7XG4gIGNvbnNvbGUuaW5mbyhgU3RhcnRlZCBtYWludGVuYW5jZSBzZXJ2ZXIgb24gcG9ydCAke3BvcnR9LmApO1xufVxuXG5mdW5jdGlvbiBzdG9wTWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IHBpZFBhdGggPSBnZXRQaWRQYXRoKHByb2plY3QsIHBvcnQpO1xuICBjb25zdCBwaWQgPSByZWFkUGlkKHBpZFBhdGgpO1xuICBpZiAocGlkID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zb2xlLmluZm8oYE1haW50ZW5hbmNlIHNlcnZlciBpcyBub3QgcnVubmluZyBvbiBwb3J0ICR7cG9ydH0uYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCAnU0lHVEVSTScpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmVtb3ZlUGlkRmlsZShwaWRQYXRoKTtcbiAgY29uc29sZS5pbmZvKGBTdG9wcGVkIG1haW50ZW5hbmNlIHNlcnZlciBvbiBwb3J0ICR7cG9ydH0uYCk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUG9ydChwb3J0RW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBhc3NlcnQub2soTnVtYmVyLmlzSW50ZWdlcihwb3J0KSAmJiBwb3J0ID4gMCwgYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApO1xuICByZXR1cm4gcG9ydDtcbn1cblxuZnVuY3Rpb24gZ2V0UGlkUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcudG1wJywgYHdiLW1haW50ZW5hbmNlLXNlcnZlci0ke3BvcnR9LnBpZGApO1xufVxuXG5mdW5jdGlvbiByZWFkUGlkKHBpZFBhdGg6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGlkID0gTnVtYmVyKGZzLnJlYWRGaWxlU3luYyhwaWRQYXRoLCAndXRmOCcpLnRyaW0oKSk7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIocGlkKSAmJiBwaWQgPiAwID8gcGlkIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQcm9jZXNzUnVubmluZyhwaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwaWQsIDApO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlUGlkRmlsZShwaWRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBmcy5ybVN5bmMocGlkUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JQaWRGaWxlKHBpZFBhdGg6IHN0cmluZywgcGlkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgNTAwMDtcbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIGlmIChyZWFkUGlkKHBpZFBhdGgpICE9PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBpZiAoIWlzUHJvY2Vzc1J1bm5pbmcocGlkKSkgYnJlYWs7XG4gICAgYXdhaXQgc2V0VGltZW91dCg1MCk7XG4gIH1cblxuICByZW1vdmVQaWRGaWxlKHBpZFBhdGgpO1xuICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBtYWludGVuYW5jZSBzZXJ2ZXIuJyk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbi8vIFRoZXNlIHRvb2xzIGFyZSBkZWNsYXJlZCBhcyBkZXZEZXBlbmRlbmNpZXMgaW4gc291cmNlIHJlcG9zLCBidXQgb3B0aW1pemVkIERvY2tlclxuLy8gcGFja2FnZS5qc29uIGZpbGVzIHN0aWxsIG5lZWQgdGhlbSBmb3IgaW4taW1hZ2UgY29kZWdlbi9idWlsZCBzdGVwcy5cbmNvbnN0IHJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMgPSBbJ0B3aWxsYm9vc3Rlci93YicsICdidWlsZC10cyddO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBvdXRzaWRlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBvcHRpbWl6YXRpb24gaXMgZXhlY3V0ZWQgb3V0c2lkZSBhIGRvY2tlciBjb250YWluZXIgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJyxcbiAgZGVzY3JpYmU6ICdPcHRpbWl6ZSBjb25maWd1cmF0aW9uIHdoZW4gYnVpbGRpbmcgYSBEb2NrZXIgaW1hZ2UnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gICAgICBjb25zdCBrZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldID8/IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwcykpIHtcbiAgICAgICAgICBpZiAodmFsdWU/LnN0YXJ0c1dpdGgoJ2dpdEBnaXRodWIuY29tOicpKSB7XG4gICAgICAgICAgICAvLyBEb2NrZXIgYnVpbGRzIGNhbm5vdCBhY2Nlc3MgcHJpdmF0ZSBTU0ggVVJMcyB1bmxlc3MgY3JlZGVudGlhbHMgYXJlIGZvcndhcmRlZC5cbiAgICAgICAgICAgIC8vIFRoZSBEb2NrZXJmaWxlIGNvcGllcyB0aG9zZSB3b3Jrc3BhY2UgcGFja2FnZXMgaW50byB0aGUgaW1hZ2UgaW5zdGVhZC5cbiAgICAgICAgICAgIGRlcHNbbmFtZV0gPSBgLi8ke25hbWV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgICAgaWYgKGFyZ3Yub3V0c2lkZSkge1xuICAgICAgICBhd2FpdCB3cml0ZURvY2tlclNoZWxsU2NyaXB0cyhwYXRoLmpvaW4oZGlzdERpclBhdGgsICdiYXNoJykpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFhcmd2Lm91dHNpZGUpIHtcbiAgICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmluZm8oJ0luc3RhbGxlZCBkZXBlbmRlbmNpZXMuJyk7XG4gICAgfVxuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZURpclBhdGggPSBmaW5kRG9ja2VyU2hlbGxTY3JpcHRzRGlyUGF0aCgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihzb3VyY2VEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0ZpbGUoKSB8fCAhZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5zaCcpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHRhcmdldEZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5jb3B5RmlsZShwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCB0YXJnZXRGaWxlUGF0aCk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuY2htb2QodGFyZ2V0RmlsZVBhdGgsIDBvNzU1KTtcbiAgfVxuICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCBEb2NrZXIgc2hlbGwgc2NyaXB0czogJHtwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGRpclBhdGgpIHx8IGRpclBhdGh9YCk7XG59XG5cbmZ1bmN0aW9uIGZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoKCk6IHN0cmluZyB7XG4gIGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAnZG9ja2VyJywgJ2Jhc2gnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvY2tlciBzaGVsbCBzY3JpcHRzIGRpcmVjdG9yeSBub3QgZm91bmQuJyk7XG4gICAgfVxuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIHByb21vdGVSdW50aW1lRGV2RGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uKTtcbiAgaWYgKGFyZ3Yub3V0c2lkZSkge1xuICAgIC8vIE91dHNpZGUgb3B0aW1pemF0aW9uIHdyaXRlcyBkaXN0L3BhY2thZ2UuanNvbiBiZWZvcmUgRG9ja2VyIGJ1aWxkcyB0aGUgYXBwLlxuICAgIC8vIEtlZXAgYnVpbGQtdGltZSBwYWNrYWdlcyBmb3IgdGhhdCBsYXRlciBpbi1pbWFnZSBidWlsZCBhbmQgcmVtb3ZlIG9ubHkga25vd24gbm9uLWJ1aWxkIHRvb2xpbmcuXG4gICAgcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb24pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEluc2lkZSBEb2NrZXIsIGNvZGVnZW4vYnVpbGQgaGFzIGFscmVhZHkgZmluaXNoZWQsIHNvIHByb2R1Y3Rpb24gaW5zdGFsbCBzaG91bGQgbm90IHNlZSBkZXYgdG9vbGluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyBJbiAtLW91dHNpZGUgbW9kZSwgRG9ja2VyIHN0aWxsIHJ1bnMgY29kZWdlbi9idWlsZCBiZWZvcmUgYSBzZWNvbmQgaW4taW1hZ2Ugb3B0aW1pemF0aW9uLlxuICAvLyBSZW1vdmUgb25seSB0b29saW5nIHRoYXQgaXMgbm90IG5lZWRlZCBmb3IgdGhhdCBidWlsZCBwaGFzZS5cbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAncmFpbHdheScsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBjb25zdCByZW1vdmVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIC8vIFNoYXJlZCBjb25maWcgcGFja2FnZXMgYXJlIG5lZWRlZCBvbmx5IGZvciBsaW50L2Zvcm1hdC90ZXN0IGNvbW1hbmRzLCBub3QgRG9ja2VyIGJ1aWxkcy5cbiAgICAgIChuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gcHJvbW90ZVJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcHJvbW90ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgcnVudGltZURldkRlcGVuZGVuY2llcykge1xuICAgIGNvbnN0IHZlcnNpb24gPSBkZXZEZXBzW25hbWVdO1xuICAgIGlmICghdmVyc2lvbikgY29udGludWU7XG4gICAgaWYgKCFkZXBlbmRlbmNpZXNbbmFtZV0pIHtcbiAgICAgIGRlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG4gICAgICBwcm9tb3RlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gIH1cbiAgaWYgKHByb21vdGVkRGVwcy5sZW5ndGggPiAwKSB7XG4gICAgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzO1xuICB9XG4gIGNvbnNvbGUuaW5mbygnUHJvbW90ZWQgcnVudGltZSBkZXZEZXBlbmRlbmNpZXM6JywgcHJvbW90ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLnN0YXJ0c1dpdGgod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgICAgcmVtb3ZlZFNjcmlwdHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIHNjcmlwdHM6JywgcmVtb3ZlZFNjcmlwdHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuXG5jbGFzcyBEcml6emxlU2NyaXB0cyB7XG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlbW92ZUNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0KTtcbiAgICBpZiAoIXJlbW92ZUNvbW1hbmQpIHtcbiAgICAgIHJldHVybiBcImVjaG8gJ3diIGRiIHJlc2V0IHN1cHBvcnRzIERyaXp6bGUgb25seSB3aGVuIERBVEFCQVNFX1BBVEggb3IgZmlsZTogREFUQUJBU0VfVVJMIGlzIHNldC4nICYmIGV4aXQgMVwiO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtyZW1vdmVDb21tYW5kfSAmJiAke3RoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyl9YDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VlZENvbW1hbmQgPSB0aGlzLnNlZWQocHJvamVjdCk7XG4gICAgY29uc3QgbWlncmF0ZUNvbW1hbmQgPSB0aGlzLmRlcGxveShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gICAgcmV0dXJuIHNlZWRDb21tYW5kID09PSAndHJ1ZScgPyBtaWdyYXRlQ29tbWFuZCA6IGAke21pZ3JhdGVDb21tYW5kfSAmJiAke3NlZWRDb21tYW5kfWA7XG4gIH1cblxuICBkZXBsb3koX3Byb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBkcml6emxlLWtpdCBtaWdyYXRlICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIGdlbmVyYXRlKF9wcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gZHJpenpsZS1raXQgZ2VuZXJhdGUgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgbWlncmF0ZURldihfcHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGUoX3Byb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5zZWVkKSByZXR1cm4gJ1lBUk4gcnVuIHNlZWQnO1xuICAgIHJldHVybiAndHJ1ZSc7XG4gIH1cblxuICBzdHVkaW8oX3Byb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHJldHVybiBcImVjaG8gJ3diIGRiIHN0dWRpbyBmb3IgRHJpenpsZSBkb2VzIG5vdCBzdXBwb3J0IGRiLXVybC1vci1wYXRoLicgJiYgZXhpdCAxXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBZQVJOIGRyaXp6bGUta2l0IHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiUGF0aCA9IHByb2plY3QuZW52LkRBVEFCQVNFX1BBVEggPz8gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSA/IGRiUGF0aCA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRiUGF0aCk7XG4gIHJldHVybiBgcm0gLWYgXCIke2Fic29sdXRlUGF0aH1cIiBcIiR7YWJzb2x1dGVQYXRofS13YWxcIiBcIiR7YWJzb2x1dGVQYXRofS1zaG1cImA7XG59XG5cbmZ1bmN0aW9uIGdldEZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd0RiUGF0aCA9IGRiVXJsLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkucmVwbGFjZSgvWz8jXS4qJC8sICcnKTtcbiAgaWYgKCFyYXdEYlBhdGgpIHJldHVybjtcblxuICByZXR1cm4gcmF3RGJQYXRoO1xufVxuXG5leHBvcnQgY29uc3QgZHJpenpsZVNjcmlwdHMgPSBuZXcgRHJpenpsZVNjcmlwdHMoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZU9ybSwgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgYWxpYXNlczogWydkYiddLFxuICBkZXNjcmliZTpcbiAgICBcIlJ1biBkYXRhYmFzZSBjb21tYW5kcy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byBQcmlzbWEuIERyaXp6bGUgcHJvamVjdHMgdXNlIGRyaXp6bGUta2l0LiBFeGFtcGxlOiB3YiBwcmlzbWEgbWlncmF0ZS1kZXYgLS0gLS1uYW1lIGluaXRcIixcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLmNvbW1hbmQoY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Rm9yY2VDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZ2VuZXJhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobGlzdEJhY2t1cHNDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlRGV2Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc2V0Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc3RvcmVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc2VlZENvbW1hbmQpXG4gICAgICAuY29tbWFuZChzdHVkaW9Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVmYXVsdENvbW1hbmQpXG4gICAgICAuZGVtYW5kQ29tbWFuZCgpXG4gICAgICAuc3RyaWN0KGZhbHNlKTsgLy8gQWxsb3cgdW5rbm93biBvcHRpb25zIHRvIGJlIHBhc3NlZCB0aHJvdWdoXG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2NsZWFudXAtbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnQ2xlYW4gdXAgdGVtcG9yYWwgTGl0ZXN0cmVhbSBmaWxlcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSBjbGVhbnVwLWxpdGVzdHJlYW0nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdCk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlJyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveUZvcmNlKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBnZW5lcmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZ2VuZXJhdGUnLFxuICBkZXNjcmliZTogJ0dlbmVyYXRlIE9STSBjbGllbnQgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBnZW5lcmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmdlbmVyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXN0QmFja3Vwcyhwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdjaGVjay1pZGVtcG90ZW5jeSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1J1biB0aGUgbWlncmF0aW9uIGNvbW1hbmQgdHdpY2UgdG8gY29uZmlybSBpdCBpcyBpZGVtcG90ZW50LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgbWlncmF0ZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXI6IG1pZ3JhdGVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnY2hlY2staWRlbXBvdGVuY3knXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvcm1TY3JpcHRzID0gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ob3JtU2NyaXB0cy5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICBpZiAoc2hvdWxkQ2hlY2tJZGVtcG90ZW5jeShwcm9qZWN0LCBhcmd2LmNoZWNrSWRlbXBvdGVuY3kpKSB7XG4gICAgICAgIGlmIChpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudChwcm9qZWN0KSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coYFNraXBwaW5nIGlkZW1wb3RlbmN5IGNoZWNrIGZvciAke3Byb2plY3QubmFtZX0gaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudC5gKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKG9ybVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBzaG91bGRDaGVja0lkZW1wb3RlbmN5KHByb2plY3Q6IFByb2plY3QsIGNoZWNrSWRlbXBvdGVuY3k6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoZWNrSWRlbXBvdGVuY3kgPz8gaXNEb2NrZXJFbmFibGVkKHByb2plY3QpO1xufVxuXG5mdW5jdGlvbiBpc0RvY2tlckVuYWJsZWQocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFwcm9qZWN0LmVudi5XQl9ET0NLRVIgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnMCcgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnZmFsc2UnO1xufVxuXG5mdW5jdGlvbiBpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudChwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICdwcm9kdWN0aW9uJyB8fCBwcm9qZWN0LmVudi5NSVNFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nO1xufVxuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5taWdyYXRlRGV2KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIC8vIEZvcmNlIHRvIHJlc2V0IHRlc3QgZGF0YWJhc2VcbiAgICBpZiAocHJvY2Vzcy5lbnYuV0JfRU5WICE9PSAndGVzdCcpIHtcbiAgICAgIHByb2Nlc3MuZW52LldCX0VOViA9ICd0ZXN0JztcbiAgICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgICAgICAgJ1dCX0VOVj10ZXN0IGRiIHJlc2V0JyxcbiAgICAgICAgYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndilcbiAgICAgICkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUnLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2LCAncHJpc21hJyk7XG4gICAgZm9yIChjb25zdCB7IHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0ID8/IChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIGRhdGFiYXNlIHN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnZGItdXJsLW9yLXBhdGgnLCAncmVzdG9yZWQnXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVmYXVsdENvbW1hbmRCdWlsZGVyID0geyBhcmdzOiB7IHR5cGU6ICdhcnJheScgfSB9IGFzIGNvbnN0O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJyQwIDxhcmdzLi4+JyxcbiAgZGVzY3JpYmU6XG4gICAgXCJQYXNzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gdGhlIGRldGVjdGVkIE9STSBhcyBpcy4gQWRkaXRpb25hbCBQcmlzbWEgZmxhZ3MgY2FuIGFsc28gYmUgZm9yd2FyZGVkIGFmdGVyICctLScuXCIsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCBzY3JpcHQgPSAoYXJndi5hcmdzPy5qb2luKCcgJykgPz8gJycpLnRyaW1FbmQoKTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2FyZ3MnXSk7XG4gICAgY29uc3QgZnVsbENvbW1hbmQgPSBbc2NyaXB0LCB1bmtub3duT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoYGRiICR7ZnVsbENvbW1hbmR9YCwgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBjb21tYW5kID0gb3JtID09PSAncHJpc21hJyA/IGBQUklTTUEgJHtmdWxsQ29tbWFuZH1gIDogYFlBUk4gZHJpenpsZS1raXQgJHtmdWxsQ29tbWFuZH1gO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiJyA6ICdwcmlzbWEnO1xuICBjb25zdCBkYlBhdGggPSBgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTNgO1xuICBjb25zdCByZXF1aXJlZEVudlZhcnMgPSB7XG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FLFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVk6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSxcbiAgfSBhcyBjb25zdDtcbiAgY29uc3QgbWlzc2luZ0VudlZhcnMgPSBPYmplY3QuZW50cmllcyhyZXF1aXJlZEVudlZhcnMpXG4gICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhdmFsdWUpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gIGlmIChtaXNzaW5nRW52VmFycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGl0ZXN0cmVhbTogJHttaXNzaW5nRW52VmFycy5qb2luKCcsICcpfWApO1xuICB9XG5cbiAgY29uc3QgcmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCA9IHByb2plY3QuZW52LldCX0VOViA9PT0gJ3N0YWdpbmcnID8gJzVtJyA6ICcxaCc7XG4gIGNvbnN0IGxpdGVzdHJlYW1Db25maWcgPSBgZGJzOlxuICAtIHBhdGg6ICR7ZGJQYXRofVxuICAgIGJ1c3ktdGltZW91dDogNXNcbiAgICBjaGVja3BvaW50LWludGVydmFsOiAxbVxuICAgIHJlcGxpY2E6XG4gICAgICB0eXBlOiBzM1xuICAgICAgZW5kcG9pbnQ6IGh0dHBzOi8vJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUR9LnIyLmNsb3VkZmxhcmVzdG9yYWdlLmNvbVxuICAgICAgYnVja2V0OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUV9XG4gICAgICBhY2Nlc3Mta2V5LWlkOiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRH1cbiAgICAgIHNlY3JldC1hY2Nlc3Mta2V5OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVl9XG4gICAgICBzbmFwc2hvdC1pbnRlcnZhbDogMjRoICAjIENyZWF0ZSBhIGJhY2t1cCBwZXIgZGF5XG4gICAgICByZXRlbnRpb246IDcyaCAgICAgICAgICAjIEtlZXAgYmFja3VwcyBmb3IgMyBkYXlzXG4gICAgICByZXRlbnRpb24tY2hlY2staW50ZXJ2YWw6ICR7cmV0ZW50aW9uQ2hlY2tJbnRlcnZhbH1cbiAgICAgIHN5bmMtaW50ZXJ2YWw6IDFtXG5gO1xuXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSAnL2V0Yy9saXRlc3RyZWFtLnltbCc7XG4gIHRyeSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBsaXRlc3RyZWFtQ29uZmlnKTtcbiAgICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCAke2NvbmZpZ1BhdGh9YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHdyaXRlICR7Y29uZmlnUGF0aH06ICR7cmVhc29ufWAsIHtcbiAgICAgIGNhdXNlOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgRGF0YWJhc2VPcm1Qcm9qZWN0IHtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAgb3JtOiBEYXRhYmFzZU9ybTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucywgb3JtPzogRGF0YWJhc2VPcm0pOiBQcm9taXNlPERhdGFiYXNlT3JtUHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzXG4gICAgLm1hcCgocHJvamVjdCkgPT4gKHByb2plY3QuZGF0YWJhc2VPcm0gPyB7IHByb2plY3QsIG9ybTogcHJvamVjdC5kYXRhYmFzZU9ybSB9IDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKChwcm9qZWN0KTogcHJvamVjdCBpcyBEYXRhYmFzZU9ybVByb2plY3QgPT4gISFwcm9qZWN0ICYmICghb3JtIHx8IHByb2plY3Qub3JtID09PSBvcm0pKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKG9ybSA/IGBObyAke29ybX0gcHJvamVjdCBmb3VuZC5gIDogJ05vIHN1cHBvcnRlZCBkYXRhYmFzZSBPUk0gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybTogRGF0YWJhc2VPcm0pOiB0eXBlb2YgcHJpc21hU2NyaXB0cyB8IHR5cGVvZiBkcml6emxlU2NyaXB0cyB7XG4gIHJldHVybiBvcm0gPT09ICdwcmlzbWEnID8gcHJpc21hU2NyaXB0cyA6IGRyaXp6bGVTY3JpcHRzO1xufVxuXG5mdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIHByb2plY3RzOiBEYXRhYmFzZU9ybVByb2plY3RbXVxuKTogR2VuZXJhdG9yPERhdGFiYXNlT3JtUHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBjb25zdCBvcm1Qcm9qZWN0QnlQcm9qZWN0ID0gbmV3IE1hcChwcm9qZWN0cy5tYXAoKHByb2plY3QpID0+IFtwcm9qZWN0LnByb2plY3QsIHByb2plY3RdKSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoXG4gICAgY29tbWFuZE5hbWUsXG4gICAgcHJvamVjdHMubWFwKCh7IHByb2plY3QgfSkgPT4gcHJvamVjdClcbiAgKSkge1xuICAgIGNvbnN0IG9ybVByb2plY3QgPSBvcm1Qcm9qZWN0QnlQcm9qZWN0LmdldChwcm9qZWN0KTtcbiAgICBpZiAoIW9ybVByb2plY3QpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRldGVjdCBkYXRhYmFzZSBPUk0gZm9yICR7cHJvamVjdC5uYW1lfS5gKTtcblxuICAgIHlpZWxkIG9ybVByb2plY3Q7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IHVua25vd24gb3B0aW9ucyBmcm9tIGFyZ3YgdG8gcGFzcyB0byBPUk0gY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHVua25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIEJ1aWxkIGxpc3Qgb2Yga25vd24gb3B0aW9ucyBmcm9tIHNoYXJlZCBvcHRpb25zIGJ1aWxkZXJzXG4gIGNvbnN0IHNoYXJlZE9wdGlvbktleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRPcHRpb25zQnVpbGRlcik7XG4gIGNvbnN0IHNoYXJlZE9wdGlvbkFsaWFzZXMgPSBPYmplY3QudmFsdWVzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAgIC5mbGF0TWFwKChvcHRpb24pID0+IHtcbiAgICAgIGlmICgnYWxpYXMnIGluIG9wdGlvbikge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHRpb24uYWxpYXMpID8gb3B0aW9uLmFsaWFzIDogW29wdGlvbi5hbGlhc107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAubWFwKFN0cmluZyk7XG5cbiAgY29uc3QgYWxsS25vd25PcHRpb25zID0gbmV3IFNldChbXG4gICAgLi4ua25vd25PcHRpb25zLFxuICAgIC4uLnNoYXJlZE9wdGlvbktleXMsXG4gICAgLi4uc2hhcmVkT3B0aW9uQWxpYXNlcyxcbiAgICAvLyBJbnRlcm5hbCB5YXJncyBwcm9wZXJ0aWVzXG4gICAgJy0tJyxcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IEFycmF5LmlzQXJyYXkoYXJndlsnLS0nXSkgPyBhcmd2WyctLSddLm1hcChTdHJpbmcpIDogW107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4udW5rbm93bk9wdGlvbnMsIC4uLnBhc3N0aHJvdWdoQXJnc10pO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBjb21tYW5kIHRvIHJldHJ5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZXRyeUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIG9uU2lnbmFsOiAoc2lnbmFsKSA9PiB7XG4gICAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhc3RTdGF0dXMgPT09IDApIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGxhc3RTdGF0dXMpO1xuICB9LFxufTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAnLFxuICBkZXNjcmliZTogJ1NldHVwIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdhc2RmIGluc3RhbGwnLCBwcm9qZWN0LCBhcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUgPT09ICdweXByb2plY3QudG9tbCcpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKCdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgY29uc3QgWywgdmVyc2lvbl0gPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdhc2RmIGN1cnJlbnQgcHl0aG9uJykudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7dmVyc2lvbn1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290IHx8ICFwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkgJiZcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddXG4gICAgKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maW5kKChwKSA9PiBwLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucGxheXdyaWdodCk7XG4gIGlmIChwcm9qZWN0KSB7XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBzaGVsbEVzY2FwZUFyZ3VtZW50IH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0T3B0aW9uc0J1aWxkZXIgPSB7XG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHdhdGNoIGZpbGVzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgY29yZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnYScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG4gICdkb2NrZXItb3B0aW9ucyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgXCJkb2NrZXIgcnVuXCInLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTY3JpcHRBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gICctLSc/OiBzdHJpbmdbXTtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG4gIHNpbGVudD86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYgeyAnLS0nPzogc3RyaW5nW10gfVxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pLCAuLi4oYXJndlsnLS0nXSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KFN0cmluZyhhcmcpKSlcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRGV2TnVsbChhcmd2OiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIChhcmd2IGFzIHsgc2lsZW50OiBib29sZWFuIH0pLnNpbGVudCA/IGAgPiAvZGV2L251bGxgIDogJyc7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGRJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICBjb25zdCBtaXNlQWdlS2V5U2VjcmV0T3B0aW9uID0gcHJvamVjdC5lbnYuTUlTRV9BR0VfS0VZXG4gICAgICA/ICdcXG4gICAgICAgIC0tc2VjcmV0IGlkPW1pc2VfYWdlX2tleSxlbnY9TUlTRV9BR0VfS0VZJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259JHttaXNlQWdlS2V5U2VjcmV0T3B0aW9ufSAuYDtcbiAgfVxuXG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3RoaXMuc3RhcnQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMsIGFkZGl0aW9uYWxBcmdzKX1gO1xuICB9XG5cbiAgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgc3Bhd25TeW5jT25FeGl0KHRoaXMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCk7XG4gICAgY29uc3QgYWxsb2NhdGVUdHkgPSBhZGRpdGlvbmFsQXJncy5pbmNsdWRlcygnL2Jpbi9iYXNoJyk7XG4gICAgY29uc3QgbWlzZUFnZUtleUVudk9wdGlvbiA9IHByb2plY3QuZW52Lk1JU0VfQUdFX0tFWSA/ICctLWVudiBNSVNFX0FHRV9LRVkgJyA6ICcnO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtICR7YWxsb2NhdGVUdHkgPyAnLWl0ICcgOiAnJ30ke21pc2VBZ2VLZXlFbnZPcHRpb259LS1wdWJsaXNoICR7cHJvamVjdC5lbnYuUE9SVH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRU9wdGlvbnMge1xuICAvKiogJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnICovXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG4gIC8qKiBSYXcgUGxheXdyaWdodCBhcmdzIGZvcndhcmRlZCBhZnRlciBgd2IgdGVzdCAtLSAuLi5gICovXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCA9IHNob3VsZFdhaXRBbmRPcGVuQXBwO1xuICB9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZEltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgYXN5bmMgc3RhcnREZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgIF0pO1xuICB9XG4gIGFzeW5jIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGFzeW5jIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd3YicsXG4gICAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgICBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpLFxuICAgICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgICAgXSl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGN1c3RvbVN0YXJ0U2NyaXB0UGF0aCA9IGZpbmRDdXN0b21Qcm9kdWN0aW9uU3RhcnRTY3JpcHRQYXRoKHByb2plY3QpO1xuICAgIGlmIChjdXN0b21TdGFydFNjcmlwdFBhdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdCwgYXJndiwgW1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYCR7YnVpbGRTaGVsbENvbW1hbmQoWydiYXNoJywgY3VzdG9tU3RhcnRTY3JpcHRQYXRoXSl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCksXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBjb25zdCBlY29zeXN0ZW1Db25maWdQYXRoID0gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY29tbWFuZHMgPSBlY29zeXN0ZW1Db25maWdQYXRoXG4gICAgICA/IFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYHBtMi1ydW50aW1lIHN0YXJ0IC0tbm8tYXV0b3Jlc3RhcnQgJHtlY29zeXN0ZW1Db25maWdQYXRofWBdXG4gICAgICA6IHRoaXMuYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gdGhpcy5idWlsZFByb2R1Y3Rpb25Db21tYW5kKHByb2plY3QsIGFyZ3YsIGNvbW1hbmRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgIGAke3Byb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuJyA6ICdub2RlJ30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpLFxuICAgIF07XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBjb21tYW5kczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IG1pZ3JhdGlvbkNvbW1hbmRzID0gW1xuICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KV0gOiBbXSksXG4gICAgICAuLi4ocHJvamVjdC5oYXNEcml6emxlID8gW2RyaXp6bGVTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCldIDogW10pLFxuICAgIF07XG4gICAgcmV0dXJuIFsuLi5taWdyYXRpb25Db21tYW5kcy5mbGF0TWFwKChjbWQpID0+IGNtZC5zcGxpdCgnJiYnKSksIC4uLmNvbW1hbmRzXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCgoY21kKSA9PiBgJHtjbWR9ICR7dG9EZXZOdWxsKGFyZ3YpfWAudHJpbSgpKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRURvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCksIG9wdGlvbnMpO1xuICB9XG4gIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBVc2UgZW1wdHkgTk9ERV9FTlYgdG8gYXZvaWQgXCJwcm9kdWN0aW9uXCIgbW9kZSBpbiBzb21lIGZyYW1ld29ya3MgbGlrZSBCbGl0ei5qcy5cbiAgICByZXR1cm4gYCR7YnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCgnTk9ERV9FTlYnLCAnJyl9ICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFwcChwcm9qZWN0KSxcbiAgICBdKX1gO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIHsgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBbXSwgcGxheXdyaWdodEFyZ3MgPSBbJ3Rlc3QnLCAndGVzdC9lMmUvJ10gfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJncywgYXJndi50YXJnZXRzLCBhcmd2LmJhaWwsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcbiAgICBpZiAocHJvamVjdC5za2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCkge1xuICAgICAgcmV0dXJuIGAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGB3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd2aXRlc3QnLFxuICAgICAgICAncnVuJyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgICctLXBhc3NXaXRoTm9UZXN0cycsXG4gICAgICAgICctLWFsbG93T25seScsXG4gICAgICAgICctLXdhdGNoPWZhbHNlJyxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsPTEnXSA6IFtdKSxcbiAgICAgIF0pO1xuICAgIH0gZWxzZSBpZiAocHJvamVjdC5pc0J1bkF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ2J1bicsXG4gICAgICAgICd0ZXN0JyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgIC4uLihhcmd2LmJhaWwgPyBbJy0tYmFpbCddIDogW10pLFxuICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiAnZWNobyBcIk5vIHRlc3RzLlwiJztcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgd2FpdC1vbiAtdCAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSA1MDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDIwMDAwIC1pIDQwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgNjAwMDAgLWkgNTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA5MDAwMCAtaSAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QW5kT3BlbkFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYCR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdFxuICAgICl9IHx8IHdhaXQtb24gaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1c3RvbVByb2R1Y3Rpb25TdGFydFNjcmlwdFBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ3NjcmlwdHMvc3RhcnQtcHJvZHVjdGlvbi5zaCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRDb21tYW5kKFxuICBwbGF5d3JpZ2h0QXJnczogc3RyaW5nW10sXG4gIHRhcmdldHM6IFRlc3RBcmd2Wyd0YXJnZXRzJ10sXG4gIGJhaWw/OiBib29sZWFuLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IFsnQlVOJywgJ3BsYXl3cmlnaHQnXTtcbiAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgaWYgKHBsYXl3cmlnaHRBcmdzWzBdICE9PSAndGVzdCcgfHwgIW5vcm1hbGl6ZWRUYXJnZXRzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oWy4uLmJhc2UsIC4uLnBsYXl3cmlnaHRBcmdzLCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sIGJhaWwpO1xuICB9XG5cbiAgY29uc3QgcmVzdCA9IHBsYXl3cmlnaHRBcmdzLnNsaWNlKDEpO1xuICBjb25zdCBleHBsaWNpdFRhcmdldEluZGV4ZXMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhyZXN0KTtcbiAgY29uc3QgcmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCA9XG4gICAgZXhwbGljaXRUYXJnZXRJbmRleGVzLmxlbmd0aCA9PT0gMCA/IHJlc3QgOiByZXN0LmZpbHRlcigoXywgaW5kZXgpID0+ICFleHBsaWNpdFRhcmdldEluZGV4ZXMuaW5jbHVkZXMoaW5kZXgpKTtcbiAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKFxuICAgIFsuLi5iYXNlLCAndGVzdCcsIC4uLm5vcm1hbGl6ZWRUYXJnZXRzLCAuLi5yZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0LCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sXG4gICAgYmFpbFxuICApO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihjb21tYW5kQXJnczogc3RyaW5nW10sIGJhaWw/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcGxheXdyaWdodEluZGV4ID0gY29tbWFuZEFyZ3MuaW5kZXhPZigncGxheXdyaWdodCcpO1xuICBjb25zdCBpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCA9IHBsYXl3cmlnaHRJbmRleCAhPT0gLTEgJiYgY29tbWFuZEFyZ3NbcGxheXdyaWdodEluZGV4ICsgMV0gPT09ICd0ZXN0JztcbiAgaWYgKCFiYWlsIHx8ICFpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgaWYgKGNvbW1hbmRBcmdzLnNvbWUoKGFyZykgPT4gYXJnID09PSAnLS1tYXgtZmFpbHVyZXMnIHx8IGFyZy5zdGFydHNXaXRoKCctLW1heC1mYWlsdXJlcz0nKSkpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoY29tbWFuZEFyZ3MpO1xuICB9XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4uY29tbWFuZEFyZ3MsICctLW1heC1mYWlsdXJlcz0xJ10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMoYXJnczogc3RyaW5nW10pOiBudW1iZXJbXSB7XG4gIGxldCBwZW5kaW5nVmFsdWVNb2RlOiAnb3B0aW9uYWwnIHwgJ3JlcXVpcmVkJyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0SW5kZXhlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgYXJnXSBvZiBhcmdzLmVudHJpZXMoKSkge1xuICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlKSB7XG4gICAgICBpZiAocGVuZGluZ1ZhbHVlTW9kZSA9PT0gJ3JlcXVpcmVkJyB8fCAhYXJnLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gdW5kZWZpbmVkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgcmV0dXJuIFsuLi50YXJnZXRJbmRleGVzLCAuLi5hcmdzLnNsaWNlKGluZGV4ICsgMSkubWFwKChfLCBvZmZzZXQpID0+IGluZGV4ICsgMSArIG9mZnNldCldO1xuICAgIH1cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgIGlmIChhcmcuaW5jbHVkZXMoJz0nKSkgY29udGludWU7XG4gICAgICBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9IGVsc2UgaWYgKFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTLmhhcyhhcmcpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAnb3B0aW9uYWwnO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLScpICYmIGFyZyAhPT0gJy0nKSB7XG4gICAgICBjb25zdCBzaG9ydE9wdGlvbiA9IGFyZy5zbGljZSgwLCAyKTtcbiAgICAgIGlmIChhcmcubGVuZ3RoID09PSAyICYmIFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTLmhhcyhzaG9ydE9wdGlvbikpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdGFyZ2V0SW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRJbmRleGVzO1xufVxuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1icm93c2VyJyxcbiAgJy0tY29uZmlnJyxcbiAgJy0tZ3JlcCcsXG4gICctLWdyZXAtaW52ZXJ0JyxcbiAgJy0tZ2xvYmFsLXRpbWVvdXQnLFxuICAnLS1tYXgtZmFpbHVyZXMnLFxuICAnLS1vdXRwdXQnLFxuICAnLS1wcm9qZWN0JyxcbiAgJy0tcmVwZWF0LWVhY2gnLFxuICAnLS1yZXBvcnRlcicsXG4gICctLXJldHJpZXMnLFxuICAnLS1zaGFyZCcsXG4gICctLXRlc3QtbGlzdCcsXG4gICctLXRlc3QtbGlzdC1pbnZlcnQnLFxuICAnLS10aW1lb3V0JyxcbiAgJy0tdHJhY2UnLFxuICAnLS10c2NvbmZpZycsXG4gICctLXVpLWhvc3QnLFxuICAnLS11aS1wb3J0JyxcbiAgJy0tdWktdGl0bGUnLFxuICAnLS13b3JrZXJzJyxcbl0pO1xuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1vbmx5LWNoYW5nZWQnLFxuICAnLS11cGRhdGUtc25hcHNob3RzJyxcbiAgJy0tdXBkYXRlLXNvdXJjZS1tZXRob2QnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbJy1jJywgJy1nJywgJy1qJ10pO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIEJsaXR6LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBCbGl0elNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgYmxpdHogZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYmxpdHpTY3JpcHRzID0gbmV3IEJsaXR6U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMsIHR5cGUgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAocHJvamVjdC5oYXNQbGF5d3JpZ2h0Q29uZmlnKSB7XG4gICAgICByZXR1cm4gc3VwZXIudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBzdGFydENvbW1hbmQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L2UyZS8nXTtcbiAgICBjb25zdCB0ZXN0Q29tbWFuZCA9IHRoaXMudGVzdFVuaXQocHJvamVjdCwgeyAuLi5hcmd2LCB0YXJnZXRzOiBub3JtYWxpemVkVGFyZ2V0cyB9KTtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYHdhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiAke3Rlc3RDb21tYW5kfSR7c3VmZml4fWAsXG4gICAgXSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJTY3JpcHRzID0gbmV3IEh0dHBTZXJ2ZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgTmV4dC5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgTmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgbmV4dCBkZXYgLS10dXJib3BhY2sgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYG5leHQgc3RhcnQgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IFNFUlZFUl9MT0dfRklMRSB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydERldlByb3RlY3RlZChfMTogUHJvamVjdCwgXzI6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQuJyk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERldihfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfSB8IHRlZSAke1NFUlZFUl9MT0dfRklMRX1gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFRlc3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICApfWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVQcm9kdWN0aW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRURvY2tlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGByZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgVml0ZS1iYXNlZCBhcHBzIHdpdGggUGxheXdyaWdodCBlMmUgdGVzdHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpdGVTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gdml0ZSBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBZQVJOIHZpdGUgcHJldmlldyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aXRlU2NyaXB0cyA9IG5ldyBWaXRlU2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlN0YXJ0IGFwcC4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byB0aGUgdW5kZXJseWluZyBhcHAgY29tbWFuZC4gRXhhbXBsZTogd2Igc3RhcnQgLS0gLS1ob3N0IDAuMC4wLjBcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSkub3B0aW9ucyhidWlsZGVyKSBhcyBBcmd2PFxuICAgICAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbiAgICA+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnZGV2ZWxvcG1lbnQnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RGV2KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGF3YWl0IHNjcmlwdHMuc3RhcnRUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfTE9PS0JBQ0tfTElORV9DT1VOVCA9IDIwMDtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU8gPSAwLjA1O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0hvdyB0byBydW4gRTJFIHRlc3RzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBiYWlsOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdG9wIHRlc3RzIGFmdGVyIHRoZSBmaXJzdCBmYWlsdXJlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBhcnJheTogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ1VuaXQgb3IgRTJFIHRlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVGVzdENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPjtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCB0eXBlIFRlc3RDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUZXN0Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogc3RyaW5nW10gfTtcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0UnVuT3B0aW9ucyB7XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUZXN0Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndGVzdCBbdGFyZ2V0cy4uLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlRlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBmbGFncyB0byBQbGF5d3JpZ2h0LiBFeGFtcGxlOiB3YiB0ZXN0IC0tIC0tZ3JlcCAndXBsb2FkZWQgaW1hZ2UgYXNzZXQnXCIsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPik6IEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPiA9PlxuICAgIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLm9wdGlvbnMoYnVpbGRlcilcbiAgICAgIC5wb3NpdGlvbmFsKCd0YXJnZXRzJywgYXJndW1lbnRzQnVpbGRlci50YXJnZXRzKSBhcyBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHByb2Nlc3MuZXhpdChhd2FpdCB0ZXN0KGFyZ3YgYXMgVGVzdENvbW1hbmRBcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChhcmd2OiBUZXN0Q29tbWFuZEFyZ3YsIG9wdGlvbnM6IFRlc3RSdW5PcHRpb25zID0ge30pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCB0ZXN0QXJndiA9IHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoYXJndik7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyh0ZXN0QXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICAvLyBHZXQgdGVzdCB0YXJnZXRzIGZyb20gcG9zaXRpb25hbCBhcmd1bWVudHNcbiAgY29uc3QgdGVzdFRhcmdldHMgPSAodGVzdEFyZ3YudGFyZ2V0cyA/PyBbXSkgYXMgc3RyaW5nW107XG4gIGNvbnN0IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID0gdGVzdEFyZ3ZbJy0tJ10gPz8gW107XG4gIGNvbnN0IHsgc2hvdWxkUnVuRTJlLCBzaG91bGRSdW5Vbml0IH0gPSByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHModGVzdFRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBwcm9qZWN0LmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBjb25zdCBkZWZhdWx0VW5pdFRhcmdldHMgPSBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdCk7XG4gICAgaWYgKHNob3VsZFJ1blVuaXQgJiYgZGVmYXVsdFVuaXRUYXJnZXRzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgdW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgICAgIGNvbnN0IHRhcmdldHMgPVxuICAgICAgICB1bml0VGFyZ2V0cy5sZW5ndGggPiAwID8gdW5pdFRhcmdldHMgOiBkZWZhdWx0VW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IGRlZmF1bHRVbml0VGFyZ2V0cyA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi50ZXN0QXJndiwgdGFyZ2V0cyB9O1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Vbml0VGVzdENvbW1hbmQoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIHRlc3RBcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gICAgICAgIHRpbWVvdXQ6IHRlc3RBcmd2LnVuaXRUaW1lb3V0LFxuICAgICAgfSk7XG4gICAgICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICAgIGNvbnN0IGUyZUFyZ3YgPSB7IC4uLnRlc3RBcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKHRlc3RBcmd2LmUyZSkge1xuICAgICAgY2FzZSAnaGVhZGxlc3MnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzLmJsaXR6IHx8IGRlcHMubmV4dCB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddIHx8IGRldkRlcHMudml0ZSkge1xuICAgICAgc3dpdGNoICh0ZXN0QXJndi5lMmUpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVkJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IFsnY29kZWdlbicsIGBodHRwOi8vbG9jYWxob3N0OiR7cHJvamVjdC5lbnYuUE9SVH1gXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RyYWNlJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCB0ZXN0QXJndiwge1xuICAgICAgICAgICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoYXJndjogVGVzdENvbW1hbmRBcmd2KTogVGVzdENvbW1hbmRBcmd2IHtcbiAgaWYgKGFyZ3YuZW52Py5sZW5ndGggfHwgYXJndi5jYXNjYWRlRW52IHx8IGFyZ3YuY2FzY2FkZU5vZGVFbnYgfHwgYXJndi5hdXRvQ2FzY2FkZUVudiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gYXJndjtcbiAgfVxuICByZXR1cm4geyAuLi5hcmd2LCBjYXNjYWRlRW52OiAndGVzdCcgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB8IGZhbHNlIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAocHJvamVjdC5oYXNWaXRlc3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcpKSkge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSA/IFsndGVzdCcsICctLWV4Y2x1ZGUnLCAndGVzdC9lMmUvKionXSA6IFsndGVzdCddO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgY29uc3QgYnVpbGRFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndiwge1xuICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gIH0pO1xuICBpZiAoYnVpbGRFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiBidWlsZEV4aXRDb2RlO1xuICB9XG4gIGNvbnN0IHRlc3RFeGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBjb25zdCBzdG9wRXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgfSk7XG4gIGlmICh0ZXN0RXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gdGVzdEV4aXRDb2RlO1xuICB9XG4gIHJldHVybiBzdG9wRXhpdENvZGU7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgcHJvY2Vzc1NpbGVudE91dHB1dDogZGVkdXBlTm9pc3lUZXN0T3V0cHV0LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuVW5pdFRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgb21pdFNpbGVudFN0YXJ0OiB0cnVlLFxuICAgIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seTogdHJ1ZSxcbiAgICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM6IDEwXzAwMCxcbiAgICBzaWxlbnRTdWNjZXNzTWVzc2FnZTogJ1VuaXQgdGVzdHMgcGFzc2VkLicsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWNlbnRQcmludGVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlZHVwZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGl0ZXJhdGVMaW5lcyhvdXRwdXQpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZExpbmUgPSBub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eShsaW5lKTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVTZXQuaGFzKG5vcm1hbGl6ZWRMaW5lKSkgY29udGludWU7XG4gICAgaWYgKHJlY2VudFByaW50ZWRMaW5lcy5zb21lKChwcmludGVkTGluZSkgPT4gYXJlTGluZXNTaW1pbGFyKHByaW50ZWRMaW5lLCBub3JtYWxpemVkTGluZSkpKSBjb250aW51ZTtcblxuICAgIHB1c2hSZWNlbnRQcmludGVkTGluZShyZWNlbnRQcmludGVkTGluZXMsIHJlY2VudFByaW50ZWRMaW5lU2V0LCBub3JtYWxpemVkTGluZSk7XG4gICAgZGVkdXBlZExpbmVzLnB1c2gobGluZSk7XG4gIH1cbiAgcmV0dXJuIGRlZHVwZWRMaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24qIGl0ZXJhdGVMaW5lcyhvdXRwdXQ6IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgbGV0IGxpbmVTdGFydEluZGV4ID0gMDtcbiAgd2hpbGUgKGxpbmVTdGFydEluZGV4IDw9IG91dHB1dC5sZW5ndGgpIHtcbiAgICBjb25zdCBsaW5lRW5kSW5kZXggPSBvdXRwdXQuaW5kZXhPZignXFxuJywgbGluZVN0YXJ0SW5kZXgpO1xuICAgIGlmIChsaW5lRW5kSW5kZXggPT09IC0xKSB7XG4gICAgICB5aWVsZCBvdXRwdXQuc2xpY2UobGluZVN0YXJ0SW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCwgbGluZUVuZEluZGV4KTtcbiAgICBsaW5lU3RhcnRJbmRleCA9IGxpbmVFbmRJbmRleCArIDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFJlY2VudFByaW50ZWRMaW5lKGxpbmVzOiBzdHJpbmdbXSwgbGluZVNldDogU2V0PHN0cmluZz4sIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBsaW5lcy5wdXNoKGxpbmUpO1xuICBsaW5lU2V0LmFkZChsaW5lKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQpIHJldHVybjtcblxuICBjb25zdCByZW1vdmVkTGluZSA9IGxpbmVzLnNoaWZ0KCk7XG4gIGlmIChyZW1vdmVkTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGluZVNldC5kZWxldGUocmVtb3ZlZExpbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsaW5lXG4gICAgLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKVxuICAgIC50cmltKClcbiAgICAucmVwbGFjZUFsbCgvXig/OlxcW1teXFxdXStcXF1cXHMqKSsvZywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcKG5vZGU6XFxkK1xcKS9nLCAnKG5vZGU6PG51bWJlcj4pJylcbiAgICAucmVwbGFjZUFsbCgvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQrKT9aP1xcYi9nLCAnPHRpbWVzdGFtcD4nKVxuICAgIC5yZXBsYWNlQWxsKC8oWz8mXWNhY2hlPSlcXGQrL2csICckMTxudW1iZXI+Jyk7XG59XG5cbmZ1bmN0aW9uIGFyZUxpbmVzU2ltaWxhcihhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICBpZiAobWF4TGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKE1hdGguYWJzKGEubGVuZ3RoIC0gYi5sZW5ndGgpID4gbWF4TGVuZ3RoICogU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTykgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkaXN0YW5jZShhLCBiKSAvIG1heExlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShcbiAgZTJlVGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdLFxuICBhZGRpdGlvbmFsQXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKS5sZW5ndGggPiAwO1xuICByZXR1cm4gWyd0ZXN0JywgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCB8fCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA/IFtdIDogWyd0ZXN0L2UyZS8nXSksIC4uLmFkZGl0aW9uYWxBcmdzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyhcbiAgdGVzdFRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogeyBzaG91bGRSdW5Vbml0OiBib29sZWFuOyBzaG91bGRSdW5FMmU6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwICYmIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA9PT0gMDtcblxuICByZXR1cm4ge1xuICAgIHNob3VsZFJ1blVuaXQ6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzLFxuICAgIHNob3VsZFJ1bkUyZTogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cyB8fCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPiAwLFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHtcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdGVzdE9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdC1vbi1jaScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0IG9uIENJIHdpdGggbm8gb3B0aW9ucy4nLFxuICBidWlsZGVyOiB0ZXN0T25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3RPbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RPbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgcHJvamVjdC5lbnYuQ0kgfHw9ICcxJztcbiAgICBwcm9qZWN0LmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBoYXNEb2NrZXJmaWxlID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlO1xuICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgLy8gQ29uZmlybSBkZXYgc2VydmVyIHN0YXJ0dXAgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBwcm9qZWN0cyB3aXRoIEUyRSB0ZXN0cy5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBoYXNEb2NrZXJmaWxlXG4gICAgICAgID8gYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHt9KVxuICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHQucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbnRlcmZhY2UgVHJlZUtpbGxDb21tYW5kQXJncyB7XG4gIHBpZDogbnVtYmVyO1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuY29uc3QgYnVpbGRlciA9ICh5YXJnczogQXJndik6IEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz4gPT5cbiAgeWFyZ3NcbiAgICAucG9zaXRpb25hbCgncGlkJywge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcHJvY2VzcyBJRCB0byBraWxsLicsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ3NpZ25hbCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmFsIHRvIHNlbmQgdG8gdGhlIHByb2Nlc3MgdHJlZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnU0lHVEVSTScsXG4gICAgfSkgYXMgQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPjtcblxuZXhwb3J0IGNvbnN0IHRyZWVLaWxsQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxvYmplY3QsIFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0ge1xuICBjb21tYW5kOiAndHJlZS1raWxsIDxwaWQ+IFtzaWduYWxdJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBnaXZlbiBwcm9jZXNzIGFuZCBhbGwgZGVzY2VuZGFudHMnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2lnbmFsID0gYXJndi5zaWduYWwgYXMgTm9kZUpTLlNpZ25hbHM7XG4gICAgICBpZiAoIShzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaWduYWw6ICR7c2lnbmFsfWApO1xuICAgICAgfVxuICAgICAgdHJlZUtpbGwoYXJndi5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbmV4cG9ydCB0eXBlIFR5cGVDaGVja0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdHlwZUNoZWNrKGFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0eXBlQ2hlY2soYXJndjogVHlwZUNoZWNrQ29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgbGV0IHJlbW92ZWROZXh0RGlyID0gZmFsc2UgYXMgYm9vbGVhbjtcbiAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcbiAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyB8fCBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goLi4uYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdCkpO1xuICAgIH1cbiAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ3B5cmlnaHQnKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgfVxuICAgIHdoaWxlIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgcHJlc2VydmVDb2xvcjogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZS10cnkgdHlwZSBjaGVja2luZyBhZnRlciByZW1vdmluZyBgLm5leHRgIGRpcmVjdG9yeVxuICAgICAgY29uc3QgbmV4dERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLm5leHQnKTtcbiAgICAgIGlmIChleGl0Q29kZSAmJiBmcy5leGlzdHNTeW5jKG5leHREaXJQYXRoKSkge1xuICAgICAgICBmcy5ybVN5bmMobmV4dERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUmVtb3ZlZCBgLm5leHRgIGRpcmVjdG9yeS4gV2Ugd2lsbCByZS10cnkgdHlwZSBjaGVja2luZy4nKSk7XG4gICAgICAgIHJlbW92ZWROZXh0RGlyID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZXhpdENvZGUpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1tpXT8ucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFmaW5hbEV4aXRDb2RlKVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICByZW1vdmVkTmV4dERpclxuICAgICAgICAgID8gJy0tLS0tXFxuTm8gdHlwZSBlcnJvcnMgZm91bmQuIFBsZWFzZSBpZ25vcmUgdGhlIHByZXZpb3VzIHR5cGUgZXJyb3JzLCBhcyB0aGV5IHdlcmUgY2F1c2VkIGJ5IG91dGRhdGVkIE5leHQuanMgY2FjaGUgZmlsZXMuJ1xuICAgICAgICAgIDogJ05vIHR5cGUgZXJyb3JzIGZvdW5kLidcbiAgICAgIClcbiAgICApO1xuICByZXR1cm4gZmluYWxFeGl0Q29kZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnKSkge1xuICAgIHJldHVybiBbJ0JVTiB0c2dvIC0tbm9FbWl0J107XG4gIH1cbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgndHlwZXNjcmlwdCcpKSB7XG4gICAgcmV0dXJuIFsnQlVOIHRzYyAtLW5vRW1pdCddO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IGxpbnQsIHR5cGUgTGludENvbW1hbmRBcmd2IH0gZnJvbSAnLi9saW50LmpzJztcbmltcG9ydCB7IHRlc3QsIHR5cGUgVGVzdENvbW1hbmRBcmd2IH0gZnJvbSAnLi90ZXN0LmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZnVsbDoge1xuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICBkZXNjcmliZTogJ1J1biB0ZXN0cyBhZnRlciB2ZXJpZnlpbmcgcHJvamVjdCBjb2RlJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIFZlcmlmeUNvZGVDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgdmVyaWZ5Q29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3ZlcmlmeScsXG4gIGRlc2NyaWJlOiAnVmVyaWZ5IHByb2plY3QgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBhd2FpdCAoYXJndi5mdWxsID8gdmVyaWZ5Q29kZUZ1bGx5KHByb2plY3RzLnNlbGYsIGFyZ3YpIDogdmVyaWZ5Q29kZShwcm9qZWN0cy5zZWxmLCBhcmd2KSk7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9ydGVyID0gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdmVyaWZ5Q29kZShwcm9qZWN0LCBhcmd2KTtcbiAgICBhd2FpdCBydW5Qcm9qZWN0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXBvcnRlci5zdWNjZWVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0ZXIuZmFpbChlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgcmVwb3J0ZXIuZmluaXNoKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Q29kZShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgLCBwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbiAgYXdhaXQgcnVuSW5Qcm9jZXNzQ29tbWFuZChcbiAgICAnY2xlYW51cCcsXG4gICAgKCkgPT5cbiAgICAgIGxpbnQoe1xuICAgICAgICAuLi5hcmd2LFxuICAgICAgICBfOiBbJ2xpbnQnXSxcbiAgICAgICAgZml4OiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IHRydWUsXG4gICAgICAgIHByaW50QWxsT3V0cHV0OiB0cnVlLFxuICAgICAgICBxdWlldDogdHJ1ZSxcbiAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgfSBhcyB1bmtub3duIGFzIExpbnRDb21tYW5kQXJndiksXG4gICAgeyBzaWxlbnQ6IHRydWUgfVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Qcm9qZWN0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdGVzdEFyZ3YgPSB7IC4uLmFyZ3YsIF86IFsndGVzdCddLCBlMmU6ICdoZWFkbGVzcycsIHNpbGVudDogdHJ1ZSB9IGFzIHVua25vd24gYXMgVGVzdENvbW1hbmRBcmd2O1xuICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSByZXR1cm47XG5cbiAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGItcmVzZXQnXSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCAndGVzdCcpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKFxuICAgIGNoYWxrLnllbGxvdygnVGVzdHMgZmFpbGVkLiBUaGlzIHByb2plY3QgZGVmaW5lcyBcImRiLXJlc2V0XCIsIHNvIHdiIHdpbGwgcmVzZXQgdGhlIGRhdGFiYXNlIG9uY2UgYW5kIHJldHJ5IHRlc3RzLicpXG4gICk7XG4gIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKGAke3BhY2thZ2VNYW5hZ2VyfSBkYi1yZXNldGAsIHByb2plY3QsIGFyZ3YsIHsgcHJpbnRSYXdPdXRwdXQ6IHRydWUgfSk7XG5cbiAgY29uc3QgcmV0cnlFeGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKHJldHJ5RXhpdENvZGUgIT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7cmV0cnlFeGl0Q29kZX0pOmApLCAndGVzdCBhZnRlciBkYi1yZXNldCByZXRyeScpKTtcbiAgICBwcm9jZXNzLmV4aXQocmV0cnlFeGl0Q29kZSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdUZXN0cyBwYXNzZWQgYWZ0ZXIgZGItcmVzZXQgcmV0cnkuJykpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5JblByb2Nlc3NDb21tYW5kKFxuICBjb21tYW5kTmFtZTogc3RyaW5nLFxuICBjb21tYW5kOiAoKSA9PiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4sXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ1N0YXJ0OicpLCBjb21tYW5kTmFtZSkpO1xuICB9XG4gIGNvbnN0IGV4aXRDb2RlID0gKGF3YWl0IGNvbW1hbmQoKSkgPz8gMDtcbiAgaWYgKGV4aXRDb2RlID09PSAwIHx8IG9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBjb21tYW5kTmFtZSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgY29tbWFuZE5hbWUpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFja2FnZUNvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2LFxuICBvcHRpb25zOiB7IGFsbG93RmFpbHVyZT86IGJvb2xlYW47IHByaW50UmF3T3V0cHV0PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHByaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LmRpclBhdGgpO1xuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMoY29tbWFuZCwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgcHJlc2VydmVDb2xvcjogZmFsc2UgfSksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdwaXBlJyxcbiAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgcHJpbnRpbmdTdGRvdXQ6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KTtcbiAgY29uc3QgZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gIGlmICghb3B0aW9ucy5wcmludFJhd091dHB1dCkge1xuICAgIHByaW50UGFja2FnZUNvbW1hbmRPdXRwdXQoY29tbWFuZCwgZXhpdENvZGUsIHJldC5zdGRvdXQpO1xuICB9XG5cbiAgaWYgKGV4aXRDb2RlICE9PSAwICYmICFvcHRpb25zLmFsbG93RmFpbHVyZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbi8qKlxuICogUHJpbnRzIHBhY2thZ2UgY29tbWFuZCBvdXRwdXQgZm9yIGB3YiB2ZXJpZnlgLlxuICpcbiAqIGB3YiB2ZXJpZnlgIGlzIHByaW1hcmlseSBjb25zdW1lZCBieSBBSSBjb2RpbmcgYWdlbnRzLCBzbyBzdWNjZXNzZnVsIG5vaXN5XG4gKiBjb21tYW5kcyBhcmUgc3VtbWFyaXplZCB3aGlsZSBmYWlsdXJlIG91dHB1dCByZW1haW5zIGF2YWlsYWJsZSBmb3IgZGlhZ25vc2lzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIFRoZSBleGVjdXRlZCBjb21tYW5kLlxuICogQHBhcmFtIGV4aXRDb2RlIFRoZSBjb21tYW5kIGV4aXQgY29kZS5cbiAqIEBwYXJhbSBvdXRwdXQgVGhlIG1lcmdlZCBzdGRvdXQgYW5kIHN0ZGVyciBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kOiBzdHJpbmcsIGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCAmJiAoY29tbWFuZCA9PT0gYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgIHx8IGNvbW1hbmQgPT09IGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZWApKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTdWNjZWVkZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRyaW1tZWRPdXRwdXQgPSBvdXRwdXQudHJpbSgpO1xuICBpZiAodHJpbW1lZE91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHRyaW1tZWRPdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmQoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdDogUHJvamVjdCk6IHtcbiAgZmFpbDogKGVycm9yPzogdW5rbm93bikgPT4gdm9pZDtcbiAgZmluaXNoOiAoKSA9PiB2b2lkO1xuICBzdWNjZWVkOiAoKSA9PiB2b2lkO1xufSB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHdiRGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcud2InKTtcbiAgZnMubWtkaXJTeW5jKHdiRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgbG9nRmlsZVBhdGggPSBwYXRoLmpvaW4od2JEaXJQYXRoLCAndmVyaWZ5LWZ1bGwubG9nJyk7XG4gIGNvbnN0IGxvZ0ZpbGUgPSBmcy5vcGVuU3luYyhsb2dGaWxlUGF0aCwgJ3cnKTtcbiAgY29uc3Qgb3JpZ2luYWxTdGRvdXRXcml0ZSA9IHByb2Nlc3Muc3Rkb3V0LndyaXRlLmJpbmQocHJvY2Vzcy5zdGRvdXQpO1xuICBjb25zdCBvcmlnaW5hbFN0ZGVycldyaXRlID0gcHJvY2Vzcy5zdGRlcnIud3JpdGUuYmluZChwcm9jZXNzLnN0ZGVycik7XG4gIGxldCBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG5cbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUgPSB0ZWVXcml0ZShwcm9jZXNzLnN0ZG91dC5mZCwgbG9nRmlsZSkgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xuICBwcm9jZXNzLnN0ZGVyci53cml0ZSA9IHRlZVdyaXRlKHByb2Nlc3Muc3RkZXJyLmZkLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRlcnIud3JpdGU7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0Z1bGwgbG9nOicpLCBsb2dGaWxlUGF0aCkpO1xuXG4gIGNvbnN0IGZpbmlzaCA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoZmluaXNoZWQpIHJldHVybjtcbiAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IG9yaWdpbmFsU3Rkb3V0V3JpdGUgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xuICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gb3JpZ2luYWxTdGRlcnJXcml0ZSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRlcnIud3JpdGU7XG5cbiAgICBjb25zdCBlbGFwc2VkVGltZSA9IGZvcm1hdEVsYXBzZWRUaW1lKERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWRlZCA/ICdTdWNjZWVkZWQnIDogJ0ZhaWxlZCc7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGAke3N0YXR1c30gaW4gJHtlbGFwc2VkVGltZX0uIEZ1bGwgbG9nOiAke2xvZ0ZpbGVQYXRofVxcbmA7XG4gICAgY29uc3QgY29sb3JlZFN1bW1hcnkgPSBzdWNjZWVkZWQgPyBjaGFsay5ncmVlbihzdW1tYXJ5KSA6IGNoYWxrLnJlZChzdW1tYXJ5KTtcbiAgICBvcmlnaW5hbFN0ZG91dFdyaXRlKGNvbG9yZWRTdW1tYXJ5KTtcbiAgICBmcy53cml0ZVN5bmMobG9nRmlsZSwgc3VtbWFyeSk7XG4gICAgZnMuY2xvc2VTeW5jKGxvZ0ZpbGUpO1xuICB9O1xuXG4gIHByb2Nlc3Mub25jZSgnZXhpdCcsIGZpbmlzaCk7XG5cbiAgcmV0dXJuIHtcbiAgICBmYWlsOiAoZXJyb3IpID0+IHtcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZmluaXNoOiAoKSA9PiB7XG4gICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdleGl0JywgZmluaXNoKTtcbiAgICAgIGZpbmlzaCgpO1xuICAgIH0sXG4gICAgc3VjY2VlZDogKCkgPT4ge1xuICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB0ZWVXcml0ZShvdXRwdXRGaWxlOiBudW1iZXIsIGxvZ0ZpbGU6IG51bWJlcik6IHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZSB7XG4gIHJldHVybiAoKFxuICAgIGNodW5rOiBVaW50OEFycmF5IHwgc3RyaW5nLFxuICAgIGVuY29kaW5nT3JDYWxsYmFjaz86IEJ1ZmZlckVuY29kaW5nIHwgKChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZCksXG4gICAgY2FsbGJhY2s/OiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWRcbiAgKSA9PiB7XG4gICAgY29uc3QgYnVmZmVyID1cbiAgICAgIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBCdWZmZXIuZnJvbShjaHVuaywgdHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ3N0cmluZycgPyBlbmNvZGluZ09yQ2FsbGJhY2sgOiAndXRmOCcpXG4gICAgICAgIDogY2h1bms7XG4gICAgZnMud3JpdGVTeW5jKGxvZ0ZpbGUsIGJ1ZmZlcik7XG4gICAgZnMud3JpdGVTeW5jKG91dHB1dEZpbGUsIGJ1ZmZlcik7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVuY29kaW5nT3JDYWxsYmFjaygpO1xuICAgIH1cbiAgICBjYWxsYmFjaz8uKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RWxhcHNlZFRpbWUobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5yb3VuZChtaWxsaXNlY29uZHMgLyAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgY29uc3QgcmVtYWluaW5nU2Vjb25kcyA9IHNlY29uZHMgJSA2MDtcbiAgaWYgKG1pbnV0ZXMgPT09IDApIHtcbiAgICByZXR1cm4gYCR7cmVtYWluaW5nU2Vjb25kc31zYDtcbiAgfVxuICByZXR1cm4gYCR7bWludXRlc31tICR7cmVtYWluaW5nU2Vjb25kc31zYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcywgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBjb25jdXJyZW50bHlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9jb25jdXJyZW50bHkuanMnO1xuaW1wb3J0IHsgZ2VuQ29kZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2dlbkNvZGUuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRJZk5vbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLmpzJztcbmltcG9ydCB7IGxpbnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9saW50LmpzJztcbmltcG9ydCB7IG1haW50ZW5hbmNlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbWFpbnRlbmFuY2UuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdHJlZUtpbGxDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90cmVlS2lsbC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyB2ZXJpZnlDb2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdmVyaWZ5Q29kZS5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZCh2ZXJpZnlDb2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGNvbmN1cnJlbnRseUNvbW1hbmQpXG4gIC5jb21tYW5kKGdlbkNvZGVDb21tYW5kKVxuICAuY29tbWFuZChraWxsUG9ydElmTm9uQ2lDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQobWFpbnRlbmFuY2VDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RPbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQodHJlZUtpbGxDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5sZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcblxuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jZXNzLnBpZH0pIGR1cmluZyBzaHV0ZG93bjpgLCBlcnJvcik7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IiwiZW52IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiZGVmYXVsdCIsInZlcmJvc2UiLCJhbGlhcyIsInNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQiLCJhcmd2Iiwib3V0cHV0T3B0aW9ucyIsInF1aWV0RW52Iiwic2lsZW50IiwiY2FjaGVkRW52VmFycyIsIk1hcCIsInJlYWRFbnZGaWxlIiwiZmlsZVBhdGgiLCJjYWNoZWQiLCJnZXQiLCJwYXJzZWQiLCJjb25maWciLCJwYXRoIiwicmVzb2x2ZSIsInByb2Nlc3NFbnYiLCJxdWlldCIsInNldCIsImlzRXJybm9FeGNlcHRpb24iLCJlcnJvciIsIkVycm9yIiwidHJlZUtpbGwiLCJwaWQiLCJzaWduYWwiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJydW5Db21tYW5kIiwiU3RyaW5nIiwibWF4QnVmZmVyIiwidGltZW91dCIsImlzTm9TdWNoUHJvY2Vzc0Vycm9yIiwia2lsbFRyZWVPbldpbmRvd3MiLCJkZXNjZW5kYW50cyIsInJvb3RQaWQiLCJzdGRvdXQiLCJjaGlsZHJlbkJ5UGFyZW50IiwicHNPdXRwdXQiLCJsaW5lIiwic3BsaXQiLCJtYXRjaGVkIiwiZXhlYyIsImNoaWxkUGlkIiwicGFyZW50UGlkIiwiY2hpbGRyZW4iLCJwdXNoIiwiYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwIiwicXVldWUiLCJpbmRleCIsImxlbmd0aCIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJjb2xsZWN0RGVzY2VuZGFudFBpZHMiLCJ0YXJnZXRQaWRzIiwidG9SZXZlcnNlZCIsInRvQ2hpbGRyZW5GaXJzdFBpZHMiLCJ0YXJnZXRQaWQiLCJraWxsSWZOZWVkZWQiLCJraWxsIiwiY29tbWFuZCIsImFyZ3MiLCJvcHRpb25zIiwiZXhlY0ZpbGVTeW5jIiwiZW5jb2RpbmciLCJzdGRpbyIsInN0ZGVyciIsIkJ1ZmZlciIsImlzQnVmZmVyIiwidG9TdHJpbmciLCJleHRyYWN0U3RkZXJyIiwiQ29tbWFuZEV4ZWN1dGlvbkVycm9yIiwiY29kZSIsInN0YXR1cyIsInRvRXhpdENvZGUiLCJ0ZXN0IiwiY29uc3RydWN0b3IiLCJzdXBlciIsImpvaW4iLCJ0aGlzIiwibmFtZSIsImFzeW5jIiwic3Bhd25Bc3luYyIsIlByb21pc2UiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzZXRFbmNvZGluZyIsInN0ZG91dFByaW50ZXIiLCJjcmVhdGVSZWFsdGltZVByaW50ZXIiLCJvbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmciLCJzdGRlcnJQcmludGVyIiwib24iLCJkYXRhIiwicHJpbnRpbmdTdGRvdXQiLCJ3cml0ZSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJwcmludGluZ1N0ZGVyciIsInN0b3BwZWQiLCJzdG9wUHJvY2VzcyIsImNvbnNvbGUiLCJpbmZvIiwid2FybiIsImNsZWFudXBTaWduYWxzIiwic2lnbmFsSGFuZGxlcnMiLCJyZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMiLCJyZW1vdmVMaXN0ZW5lciIsImhhbmRsZXIiLCJjbGVhciIsImtpbGxPbkV4aXQiLCJoYW5kbGVTaWduYWwiLCJsaXN0ZW5lckNvdW50IiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiZmx1c2giLCJ1bmRlZmluZWQiLCJpbnB1dCIsInN0ZGluIiwiZW5kIiwiQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAiLCJSZWdFeHAiLCJmcm9tQ29kZVBvaW50Iiwic3RyZWFtIiwib21pdEJsYW5rTGluZXMiLCJwZW5kaW5nIiwibGluZXMiLCJwb3AiLCJpc0JsYW5rTGluZSIsInJlcGxhY2VBbGwiLCJ0cmltIiwidCIsInMiLCJpIiwiZSIsIm4iLCJlbnRyaWVzIiwiaCIsImJsb2NrcyIsInJlc2V0IiwiZmluYWxpemVkIiwiYmxvY2siLCJzdGFydCIsImxhc3RCeXRlSW5kZXgiLCJwYWRkaW5nIiwib3V0cHV0Qml0cyIsImJsb2NrQ291bnQiLCJieXRlQ291bnQiLCJvdXRwdXRCbG9ja3MiLCJleHRyYUJ5dGVzIiwidXBkYXRlIiwibyIsImwiLCJjIiwiZiIsImNvZGVQb2ludEF0IiwiciIsImZpbmFsaXplIiwiaGV4IiwiYSIsInUiLCJkIiwiYiIsImsiLCJ5IiwieCIsIkIiLCJwIiwiQyIsInoiLCJJIiwiZyIsInciLCJBIiwiUCIsIkUiLCJqIiwibSIsInEiLCJ2IiwiRCIsIkYiLCJHIiwiSCIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCIkIiwiXyIsInR0Iiwic3QiLCJpdCIsImV0Iiwib3QiLCJudCIsImh0IiwicnQiLCJsdCIsImN0IiwiZnQiLCJpbnN0YW5jZSIsImZyb20iLCJtZXNzYWdlIiwic3RhY2siLCJjYXVzZSIsInN0dWIiLCJoeWRyYXRlIiwiVWludDhBcnJheSIsImJ0b2EiLCJkZWNvZGUiLCJjcmVhdGUiLCJlbmNvZGUiLCJhdG9iIiwiU2V0IiwidmFsdWVzIiwiYWRkIiwiRGF0ZSIsInRvSlNPTiIsImZsYWdzIiwic291cmNlIiwiVVJMIiwiaHJlZiIsIm1hcCIsIlRleHRFbmNvZGVyIiwiVGV4dERlY29kZXIiLCJKU09OIiwic3RyaW5naWZ5IiwiaXNOYU4iLCJpc0Zpbml0ZSIsIkFycmF5IiwiaXNBcnJheSIsImZpbGwiLCJzbGljZSIsIk9iamVjdCIsImNhY2hlRHVyYXRpb24iLCJQT1NJVElWRV9JTkZJTklUWSIsImdldENhY2hlS2V5Iiwia2luZCIsIm5vdyIsImNhbGwiLCJpc0NJIiwiY2lFbnYiLCJQcm9qZWN0IiwiX2luaXRQcm90byIsIl9hcHBseURlY3MiLCJtZW1vaXplT25lIiwicGF0aEJ5TmFtZSIsImRpclBhdGgiLCJsb2FkRW52IiwiX2RpclBhdGgiLCJpc0J1bkF2YWlsYWJsZSIsImhhc0J1blRvb2xWZXJzaW9uIiwidXNlc0J1blBhY2thZ2VNYW5hZ2VyIiwiaGFzQnVuTG9ja2ZpbGUiLCJoYXNCdW5QYWNrYWdlTWFuYWdlciIsImZzIiwicmVhZEZpbGVTeW5jIiwicm9vdERpclBhdGgiLCJzb21lIiwiZmlsZU5hbWUiLCJleGlzdHNTeW5jIiwicGFja2FnZU1hbmFnZXIiLCJyb290UGFja2FnZUpzb24iLCJwYWNrYWdlSnNvbiIsInN0YXJ0c1dpdGgiLCJidWlsZENvbW1hbmQiLCJzY3JpcHRzIiwiYnVpbGQiLCJpbmNsdWRlcyIsImRvY2tlcmZpbGUiLCJmaW5kRmlsZSIsImhhc0RvY2tlcmZpbGUiLCJoYXNTb3VyY2VDb2RlIiwiZG9ja2VySW1hZ2VOYW1lIiwiZW52VmFycyIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzIiwiY3dkIiwiZW52UGF0aHMiLCJlbnZQYXRoIiwiY2FzY2FkZSIsImNhc2NhZGVFbnYiLCJjYXNjYWRlTm9kZUVudiIsIk5PREVfRU5WIiwiYXV0b0Nhc2NhZGVFbnYiLCJXQl9FTlYiLCJpbmNsdWRlUm9vdEVudiIsInJvb3RQYXRoIiwiZmxhdE1hcCIsImZpbHRlciIsInJlbGF0aXZlIiwic2hvdWxkU3VwcHJlc3NPdXRwdXQiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMiLCJrZXlzIiwia2V5IiwidmFsdWUiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwiZXhwYW5kIiwicmVhZEVudmlyb25tZW50VmFyaWFibGVzIiwiY291bnQiLCJwYXJzZSIsInBhY2thZ2VKc29uUGF0aCIsImhhc1ByaXNtYSIsImdldE93bkRlcGVuZGVuY3lWZXJzaW9uIiwiaGFzRHJpenpsZSIsImRhdGFiYXNlT3JtIiwiaGFzVml0ZXN0IiwiZGVwZW5kZW5jaWVzIiwidml0ZXN0IiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzT3hsaW50IiwiaGFzRGVwZW5kZW5jeSIsImhhc094Zm10IiwiaGFzUHJldHRpZXIiLCJoYXNQb2V0cnlMb2NrIiwiaGFzUHVic3BlY1lhbWwiLCJwcmVmZXJyZWRMaW50ZXIiLCJoYXNPd25EZXBlbmRlbmN5IiwicGFja2FnZU5hbWUiLCJoYXNQbGF5d3JpZ2h0Q29uZmlnIiwic2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQiLCJDSSIsImNvbmZpZ1BhdGgiLCJkb2NrZXJQYWNrYWdlSnNvbiIsImRpcm5hbWUiLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmluZCIsImdldERlcGVuZGVuY3lWZXJzaW9uIiwib3B0aW9uYWxEZXBlbmRlbmNpZXMiLCJwZWVyRGVwZW5kZW5jaWVzIiwiZmluZFNlbGZQcm9qZWN0IiwiZmluZERlc2NlbmRhbnRQcm9qZWN0cyIsInJvb3RBbmRTZWxmUHJvamVjdHMiLCJmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyIsInJvb3QiLCJzZWxmIiwiZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJ2ZXJzaW9ucyIsImJ1biIsIm5wbV9leGVjcGF0aCIsInJ1bnRpbWVXaXRoQXJncyIsInBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsImJ1aWxkSWZOZWVkZWRDb21tYW5kIiwiZGVzY3JpYmUiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJwcm9qZWN0IiwiY2hhbGsiLCJyZWQiLCJncmVlbiIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwiZW52aXJvbm1lbnRKc29uIiwiaWdub3JpbmdFbnZWYXJOYW1lcyIsImhhcyIsInRvU29ydGVkIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRGaWxlUGF0aHMiLCJzcGF3blN5bmMiLCJyZXBsYWNlIiwiaW5jbHVkZVBhdHRlcm5zIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJkcnlSdW4iLCJ3cml0ZUZpbGUiLCJidWlsZElmTmVlZGVkIiwicmV0Iiwic2hlbGwiLCJleGl0Q29kZSIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJkZWZhdWx0T3B0aW9ucyIsImV4aXRJZkZhaWxlZCIsInJ1bldpdGhTcGF3biIsInNjcmlwdCIsIm9wdHMiLCJub3JtYWxpemVkU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0Iiwib21pdFNpbGVudFN0YXJ0IiwicHJpbnRTdGFydCIsInByaW50YWJsZSIsInJ1bm5hYmxlIiwicHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCIsInNpbGVudFN1Y2Nlc3MiLCJzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0IiwiQm9vbGVhbiIsInByb2Nlc3NTaWxlbnRPdXRwdXQiLCJwcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkiLCJ3cm90ZVNpbGVudFByb2dyZXNzIiwicHJvZ3Jlc3NUaW1lciIsInNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcyIsInNldEludGVydmFsIiwiY29uZmlndXJlRW52IiwicHJlc2VydmVDb2xvciIsImZpbmFsbHkiLCJjbGVhckludGVydmFsIiwib3V0cHV0Iiwic2lsZW50U3VjY2Vzc01lc3NhZ2UiLCJvblNpZ25hbCIsInJ1bldpdGhTcGF3bkluUGFyYWxsZWwiLCJydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUiLCJwcmludFJhd091dHB1dCIsIm91dCIsInByb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW4iLCJuZXdTY3JpcHQiLCJibGl0eiIsInByaW50YWJsZVNjcmlwdCIsImZpeEJ1bkNvbW1hbmQiLCJydW5uYWJsZVNjcmlwdCIsInByZWZpeCIsIndlYWsiLCJncmF5IiwiY3lhbiIsImJvbGQiLCJwcmludE9wdGlvbnMiLCJleGl0IiwibmV3RW52IiwiY2kiLCJOT19DT0xPUiIsIkZPUkNFX0NPTE9SIiwiaXNUVFkiLCJjb25maWd1cmVDb2xvckVudiIsInNoYXJlZE9wdGlvbnNCdWlsZGVyIiwiYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIiwib3B0aW9uTmFtZSIsImdldE9wdGlvblZhbHVlIiwiaXRlbSIsImNhbWVsQ2FzZU9wdGlvbk5hbWUiLCJjaGFyYWN0ZXIiLCJ0b1VwcGVyQ2FzZSIsImNvbmN1cnJlbnRseUNvbW1hbmQiLCJidWlsZGVyIiwic3VjY2VzcyIsImNob2ljZXMiLCJjb21tYW5kcyIsImRldGFjaGVkIiwiaW50ZXJydXB0ZWRTaWduYWwiLCJmaXJzdFJlc3VsdCIsInN0b3BSZXN1bHQiLCJzdG9wcGluZyIsImZvcmNlS2lsbFByb21pc2VzIiwicmVzdWx0cyIsIndhaXRGb3JFeGl0UHJvbWlzZXMiLCJjaGlsZCIsInNldHRsZWQiLCJzZXR0bGUiLCJraWxsT3RoZXJzIiwia2lsbE90aGVyc09uRmFpbCIsInNob3VsZFN0b3BPdGhlcnMiLCJ0ZXJtaW5hdGVDaGlsZHJlbiIsIm9uY2UiLCJnZXRFeGl0Q29kZSIsInN0b3BBbGwiLCJzdG9wT25TaWdpbnQiLCJzdG9wT25TaWd0ZXJtIiwic3RvcE9uU2lncXVpdCIsImFsbCIsInJlc3VsdCIsInJ1bkNvbmN1cnJlbnRseSIsImNvbnN0YW50cyIsInNpZ25hbHMiLCJmb3JjZUtpbGxQaWRzIiwic2lnbmFsUGlkcyIsInRvQ2hpbGRQaWRzIiwicGlkcyIsImRlYWRsaW5lIiwiZXZlcnkiLCJpc1Byb2Nlc3NHcm91cEdvbmUiLCJzbGVlcCIsIk1hdGgiLCJtaW4iLCJ3YWl0Rm9yRm9yY2VLaWxsIiwic2lnbmFsZWRQaWRzIiwia2lsbFByb2Nlc3NHcm91cCIsIm1zIiwic2V0VGltZW91dCIsIkZJTEVfU0NIRU1BIiwiTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FIiwiREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIIiwiUE9TU0lCTEVfUFJJU01BX1BBVEhTIiwic2NoZW1hUGF0aCIsImRiUGF0aCIsImdldERhdGFiYXNlRGlyUGF0aCIsImdldFByaXNtYUJhc2VEaXIiLCJnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uIiwibG9jYWxDb25maWdQYXRoIiwicHJpc21hU2NyaXB0cyIsImNsZWFuVXBMaXRlc3RyZWFtIiwiZGVwbG95IiwiYWRkaXRpb25hbE9wdGlvbnMiLCJnZW5lcmF0ZSIsImRlcGxveUZvcmNlIiwicmVtb3ZlRGJDb21tYW5kIiwibGlzdEJhY2t1cHMiLCJtaWdyYXRlIiwic2VlZCIsIm1pZ3JhdGVEZXYiLCJzdGVwcyIsImNsZWFudXBDb21tYW5kIiwiZGJVcmwiLCJEQVRBQkFTRV9VUkwiLCJyYXdEYlBhdGgiLCJiYXNlRGlyIiwiYWJzb2x1dGVQYXRoIiwiaXNBYnNvbHV0ZSIsImNsZWFuVXBTcWxpdGVEYklmTmVlZGVkIiwicmVzZXRDb21tYW5kIiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJzY3JpcHRQYXRoIiwicHJpc21hIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJnZW5Db2RlQ29tbWFuZCIsImdlbkNvZGVUYXJnZXRzIiwiZ2V0R2VuQ29kZVNjcmlwdHMiLCJjaGFrcmFUeXBlZ2VuU2NyaXB0IiwidmVyc2lvbiIsIm1ham9yIiwibWF0Y2giLCJnZXRPd25EZXBlbmRlbmN5TWFqb3IiLCJmaWxlRXhpc3RzIiwiZ2V0Q2hha3JhU2NyaXB0IiwiZHJpenpsZUNvbmZpZ1BhdGgiLCJnZXREcml6emxlQ29uZmlnUGF0aCIsImtpbGxQb3J0SWZOb25DaUNvbW1hbmQiLCJwb3J0RW52IiwiUE9SVCIsInBvcnQiLCJraWxsUG9ydFByb2Nlc3MiLCJraWxsUG9ydElmTm9uQ2kiLCJwcmludEJ1ZmZlcmVkT3V0cHV0IiwiaGFzV2FybmluZ091dHB1dCIsInNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQiLCJub3JtYWxpemVkT3V0cHV0Iiwibm9ybWFsaXplQnVmZmVyZWRPdXRwdXQiLCJidWlsZFNoZWxsQ29tbWFuZCIsImFyZyIsInNoZWxsRXNjYXBlQXJndW1lbnQiLCJveGxpbnRFeHRlbnNpb25zIiwicHl0aG9uRXh0ZW5zaW9ucyIsImRhcnRFeHRlbnNpb25zIiwib3hmbXRFeHRlbnNpb25zIiwicHJldHRpZXJFeHRlbnNpb25zIiwicHJldHRpZXJPbmx5RXh0ZW5zaW9ucyIsImV4dCIsInByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4iLCJsaW50Q29tbWFuZCIsImZpeCIsImZvcm1hdCIsImxpbnQiLCJmaWxlcyIsImxpbnRUYXJnZXRzIiwiZ2V0TGludFRhcmdldEZpbGVzIiwibGludEZpbGVQYXRoc0J5UHJvamVjdCIsIm94Zm10RmlsZVBhdGhzQnlQcm9qZWN0IiwicHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0IiwiZGFydEZpbGVQYXRoc0J5UHJvamVjdCIsInByZXR0aWVyRmlsZVBhdGhzIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJwcmV0dGllckFyZ3MiLCJzb3J0UGFja2FnZUpzb25BcmdzIiwibWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyIsImZpbGUiLCJmaWxlS2luZCIsInN0YXQiLCJpc0RpcmVjdG9yeSIsImdldExpbnRUYXJnZXRGaWxlS2luZCIsImV4dGVuc2lvbiIsImV4dG5hbWUiLCJnZXRFeHBsaWNpdFBhY2thZ2VKc29uUGF0aHMiLCJsaW50UGF0aCIsImdldEV4cGxpY2l0TGludFRhcmdldHMiLCJweXRob25GaWxlUGF0aHMiLCJkYXJ0RmlsZVBhdGhzIiwic3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uIiwibGludEZpbGVQYXRocyIsIm94Zm10RmlsZVBhdGhzIiwiYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuIiwiZm9ybWF0dGVyUGF0aCIsImJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzIiwiaXNQb3RlbnRpYWxMaW50VGFyZ2V0Iiwic2VsZkRpclBhdGgiLCJuZWVkc1ByZXR0aWVyIiwicHJvamVjdFBhdHRlcm4iLCJidWlsZFByZXR0aWVyQXJncyIsImZvcm1hdHRlckNvbW1hbmRzIiwibGludGVyQ29tbWFuZHMiLCJsaW50UnVuT3B0aW9ucyIsInByaW50QWxsT3V0cHV0Iiwic2hvdWxkUnVuRm9ybWF0dGVycyIsInNob3VsZFJ1bkxpbnRlcnMiLCJidWlsZExpbnRDb21tYW5kIiwiYnVpbGRQb2V0cnlMaW50Q29tbWFuZCIsImJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZCIsImJ1aWxkRGFydExpbnRDb21tYW5kIiwiYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZCIsImJ1aWxkT3hmbXRDb21tYW5kIiwibGludEV4aXRDb2RlcyIsImZvcm1hdHRlclJlc3VsdHMiLCJydW5MaW50Q29tbWFuZHMiLCJwcmludFNpbGVudExpbnRPdXRwdXRzIiwicHJldHRpZXJSZXN1bHQiLCJydW5MaW50Q29tbWFuZCIsInNvcnRQYWNrYWdlSnNvblJlc3VsdCIsImxpbnRlclJlc3VsdHMiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQiLCJ0aGVuIiwicHJpbnRhYmxlUmVzdWx0cyIsInByaW50Q29tbWFuZE91dHB1dCIsInByaW50Q29tbWFuZEhlYWRlciIsInRhcmdldHMiLCJzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIiLCJkZXNjZW5kYW50UHJvamVjdHMiLCJvd25pbmdQcm9qZWN0IiwiZmluZE93bmluZ1Byb2plY3QiLCJraWxsZWQiLCJraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MiLCJmaWx0ZXJBcmdzIiwiY29udGFpbmVySWRzIiwiaWQiLCJsaXN0RG9ja2VyQ29udGFpbmVySWRzIiwicmVtb3ZlRG9ja2VyQ29udGFpbmVycyIsInN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQiLCJjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyIsInJhd1BvcnQiLCJpc1BvcnRBdmFpbGFibGUiLCJraWxsRnVuYyIsImtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IiwiaG9zdCIsInByb2JlUG9ydCIsInNlcnZlciIsImNyZWF0ZVNlcnZlciIsImVyciIsImNsb3NlIiwibGlzdGVuIiwiZ2V0TWFpbnRlbmFuY2VTZXJ2ZXJTb3VyY2UiLCJwaWRQYXRoIiwicmF3IiwibWFpbnRlbmFuY2VDb21tYW5kIiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiYWN0aW9uIiwiYXNzZXJ0Iiwib2siLCJwYXJzZVBvcnQiLCJnZXRQaWRQYXRoIiwicmVhZFBpZCIsInJlbW92ZVBpZEZpbGUiLCJzdG9wTWFpbnRlbmFuY2VTZXJ2ZXIiLCJleGlzdGluZ1BpZCIsImlzUHJvY2Vzc1J1bm5pbmciLCJta2RpclN5bmMiLCJleGVjUGF0aCIsInVucmVmIiwid2FpdEZvclBpZEZpbGUiLCJzdGFydE1haW50ZW5hbmNlU2VydmVyIiwicm1TeW5jIiwiZm9yY2UiLCJwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQiLCJjb21tYW5kTmFtZSIsInJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCIsIm91dHNpZGUiLCJkZXBzIiwib3B0aW1pemVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZVNjcmlwdHMiLCJvcHRpbWl6ZVJvb3RQcm9wcyIsImRpc3REaXJQYXRoIiwid3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMiLCJzb3VyY2VEaXJQYXRoIiwiY3VycmVudERpclBhdGgiLCJmaWxlVVJMVG9QYXRoIiwidXJsIiwiY2FuZGlkYXRlIiwicGFyZW50RGlyUGF0aCIsImZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoIiwiZGlyZW50IiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJpc0ZpbGUiLCJ0YXJnZXRGaWxlUGF0aCIsImNvcHlGaWxlIiwiY2htb2QiLCJkZXZEZXBzIiwicHJvbW90ZWREZXBzIiwicHJvbW90ZVJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMiLCJuYW1lV29yZHNUb0JlUmVtb3ZlZCIsInJlbW92ZWREZXBzIiwid29yZCIsInJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkIiwibmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsInJlbW92ZWRTY3JpcHRzIiwiY29udGVudCIsInByaXZhdGUiLCJwdWJsaXNoQ29uZmlnIiwicHJldHRpZXIiLCJkcml6emxlU2NyaXB0cyIsInJlbW92ZUNvbW1hbmQiLCJEQVRBQkFTRV9QQVRIIiwiZ2V0RmlsZURhdGFiYXNlVXJsUGF0aCIsImJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kIiwic2VlZENvbW1hbmQiLCJtaWdyYXRlQ29tbWFuZCIsIl9wcm9qZWN0IiwicHJpc21hQ29tbWFuZCIsImFsaWFzZXMiLCJwYXJzZXJDb25maWd1cmF0aW9uIiwiY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kIiwiY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQiLCJkZXBsb3lDb21tYW5kIiwiZGVwbG95Rm9yY2VDb21tYW5kIiwiZ2VuZXJhdGVDb21tYW5kIiwibGlzdEJhY2t1cHNDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInN0dWRpb0NvbW1hbmQiLCJkZWZhdWx0Q29tbWFuZCIsImRlbWFuZENvbW1hbmQiLCJzdHJpY3QiLCJhbGxQcm9qZWN0cyIsImZpbmREYXRhYmFzZU9ybVByb2plY3RzIiwicHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnIiwidW5rbm93bk9wdGlvbnMiLCJleHRyYWN0VW5rbm93bk9wdGlvbnMiLCJvcm0iLCJnZXREYXRhYmFzZU9ybVNjcmlwdHMiLCJvcm1TY3JpcHRzIiwic2hvdWxkQ2hlY2tJZGVtcG90ZW5jeSIsImNoZWNrSWRlbXBvdGVuY3kiLCJpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudCIsInllbGxvdyIsIldCX0RPQ0tFUiIsImlzRG9ja2VyRW5hYmxlZCIsIk1JU0VfRU5WIiwicmVzdG9yZWQiLCJmdWxsQ29tbWFuZCIsInRyaW1FbmQiLCJyZXF1aXJlZEVudlZhcnMiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZIiwibWlzc2luZ0VudlZhcnMiLCJyZXRlbnRpb25DaGVja0ludGVydmFsIiwibGl0ZXN0cmVhbUNvbmZpZyIsIndyaXRlRmlsZVN5bmMiLCJyZWFzb24iLCJmaWx0ZXJlZCIsIm9ybVByb2plY3RCeVByb2plY3QiLCJvcm1Qcm9qZWN0Iiwia25vd25PcHRpb25zIiwic2hhcmVkT3B0aW9uS2V5cyIsInNoYXJlZE9wdGlvbkFsaWFzZXMiLCJvcHRpb24iLCJhbGxLbm93bk9wdGlvbnMiLCJrZWJhYkNhc2VLZXkiLCJ0b0xvd2VyQ2FzZSIsInBhc3N0aHJvdWdoQXJncyIsInJldHJ5Q29tbWFuZCIsInJldHJ5IiwiY21kQW5kQXJncyIsImxhc3RTdGF0dXMiLCJzZXR1cENvbW1hbmQiLCJkaXJlbnRzIiwib3MiLCJwYWNrYWdlcyIsInByb21pc2VBbGwiLCJwbGF5d3JpZ2h0Iiwic2V0dXAiLCJ0b0Rldk51bGwiLCJkb2NrZXJTY3JpcHRzIiwiYnVpbGRJbWFnZSIsIm1pc2VBZ2VLZXlTZWNyZXRPcHRpb24iLCJNSVNFX0FHRV9LRVkiLCJzdG9wQW5kU3RhcnQiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJCYXNlU2NyaXB0cyIsInNob3VsZFdhaXRBbmRPcGVuQXBwIiwiYnVpbGREb2NrZXIiLCJzdGFydERldiIsInN0YXJ0RGV2UHJvdGVjdGVkIiwid2FpdEFuZE9wZW5BcHAiLCJzdGFydFByb2R1Y3Rpb24iLCJzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQiLCJzdGFydFRlc3QiLCJzdGFydERvY2tlciIsIm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCIsIm5vcm1hbGl6ZWRBcmdzVGV4dCIsImN1c3RvbVN0YXJ0U2NyaXB0UGF0aCIsImZpbmRDdXN0b21Qcm9kdWN0aW9uU3RhcnRTY3JpcHRQYXRoIiwiYnVpbGRQcm9kdWN0aW9uQ29tbWFuZCIsImVjb3N5c3RlbUNvbmZpZ1BhdGgiLCJmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aCIsImJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzIiwiY21kIiwidGVzdEUyRURldiIsInRlc3RFMkVQcm90ZWN0ZWQiLCJ0ZXN0RTJFUHJvZHVjdGlvbiIsInRlc3RFMkVEb2NrZXIiLCJ0ZXN0U3RhcnQiLCJ3YWl0QXBwIiwic3RhcnRDb21tYW5kIiwiZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MiLCJwbGF5d3JpZ2h0QXJncyIsInBsYXl3cmlnaHRDb21tYW5kIiwiYmFpbCIsImJhc2UiLCJub3JtYWxpemVkVGFyZ2V0cyIsImFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uIiwicmVzdCIsImV4cGxpY2l0VGFyZ2V0SW5kZXhlcyIsImZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzIiwicmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCIsImJ1aWxkUGxheXdyaWdodENvbW1hbmQiLCJ0ZXN0VW5pdCIsImNvbW1hbmRBcmdzIiwicGxheXdyaWdodEluZGV4IiwiaW5kZXhPZiIsImlzUGxheXdyaWdodFRlc3RDb21tYW5kIiwicGVuZGluZ1ZhbHVlTW9kZSIsInRhcmdldEluZGV4ZXMiLCJvZmZzZXQiLCJQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyIsIlBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTIiwic2hvcnRPcHRpb24iLCJQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyIsImJsaXR6U2NyaXB0cyIsImh0dHBTZXJ2ZXJTY3JpcHRzIiwid2F0Y2giLCJ0ZXN0Q29tbWFuZCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwiXzEiLCJfMiIsInJlbWl4U2NyaXB0cyIsInZpdGVTY3JpcHRzIiwiaHR0cFNlcnZlclBhY2thZ2VzIiwibW9kZSIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwibmV4dCIsInZpdGUiLCJlMmUiLCJhcmd1bWVudHNCdWlsZGVyIiwiYXJyYXkiLCJ0ZXN0QXJndiIsIndpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYiLCJ0ZXN0VGFyZ2V0cyIsInNob3VsZFJ1bkUyZSIsInNob3VsZFJ1blVuaXQiLCJoYXNFMmVUYXJnZXRzIiwidGFyZ2V0IiwiaGFzVW5pdFRhcmdldHMiLCJzaG91bGRSdW5BbGxUZXN0cyIsInJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyIsImRlZmF1bHRVbml0VGFyZ2V0cyIsImdldERlZmF1bHRVbml0VGFyZ2V0cyIsInVuaXRUYXJnZXRzIiwidW5pdEFyZ3YiLCJydW5Vbml0VGVzdENvbW1hbmQiLCJ1bml0VGltZW91dCIsImUyZVRhcmdldHMiLCJlMmVBcmd2IiwicnVuVGVzdENvbW1hbmQiLCJidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFIiwidGVzdE9uRG9ja2VyIiwiYnVpbGRFeGl0Q29kZSIsInRlc3RFeGl0Q29kZSIsInN0b3BFeGl0Q29kZSIsImRlZHVwZU5vaXN5VGVzdE91dHB1dCIsInJlY2VudFByaW50ZWRMaW5lcyIsInJlY2VudFByaW50ZWRMaW5lU2V0IiwiZGVkdXBlZExpbmVzIiwibGluZVN0YXJ0SW5kZXgiLCJsaW5lRW5kSW5kZXgiLCJpdGVyYXRlTGluZXMiLCJub3JtYWxpemVkTGluZSIsIm5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5IiwicHJpbnRlZExpbmUiLCJhcmVMaW5lc1NpbWlsYXIiLCJwdXNoUmVjZW50UHJpbnRlZExpbmUiLCJsaW5lU2V0IiwicmVtb3ZlZExpbmUiLCJzaGlmdCIsImRlbGV0ZSIsIm1heExlbmd0aCIsIm1heCIsImFicyIsImRpc3RhbmNlIiwiaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMiLCJ0ZXN0T25DaUNvbW1hbmQiLCJ0ZXN0T25DaSIsInRyZWVLaWxsQ29tbWFuZCIsImRlbWFuZE9wdGlvbiIsInR5cGVDaGVja0NvbW1hbmQiLCJyZW1vdmVkTmV4dERpciIsImJ1aWxkVHlwZVNjcmlwdFR5cGVDaGVja0NvbW1hbmRzIiwibmV4dERpclBhdGgiLCJleGl0Q29kZXMiLCJmaW5hbEV4aXRDb2RlIiwidHlwZUNoZWNrIiwidGNDb21tYW5kIiwidmVyaWZ5Q29kZUNvbW1hbmQiLCJmdWxsIiwicmVwb3J0ZXIiLCJzdGFydGVkQXQiLCJ3YkRpclBhdGgiLCJsb2dGaWxlUGF0aCIsImxvZ0ZpbGUiLCJvcGVuU3luYyIsIm9yaWdpbmFsU3Rkb3V0V3JpdGUiLCJiaW5kIiwib3JpZ2luYWxTdGRlcnJXcml0ZSIsInN1Y2NlZWRlZCIsImZpbmlzaGVkIiwidGVlV3JpdGUiLCJmZCIsImZpbmlzaCIsImVsYXBzZWRUaW1lIiwibWlsbGlzZWNvbmRzIiwic2Vjb25kcyIsInJvdW5kIiwibWludXRlcyIsImZsb29yIiwicmVtYWluaW5nU2Vjb25kcyIsImZvcm1hdEVsYXBzZWRUaW1lIiwic3VtbWFyeSIsImNvbG9yZWRTdW1tYXJ5Iiwid3JpdGVTeW5jIiwiY2xvc2VTeW5jIiwiZmFpbCIsInN1Y2NlZWQiLCJzdGFydFZlcmlmeUZ1bGxSZXBvcnRlciIsInZlcmlmeUNvZGUiLCJydW5QYWNrYWdlQ29tbWFuZCIsInJldHJ5RXhpdENvZGUiLCJydW5Qcm9qZWN0VGVzdCIsInZlcmlmeUNvZGVGdWxseSIsImFsbG93RmFpbHVyZSIsInJ1bkluUHJvY2Vzc0NvbW1hbmQiLCJwcmludENvbW1hbmQiLCJ0cmltbWVkT3V0cHV0IiwicHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dCIsIm91dHB1dEZpbGUiLCJjaHVuayIsImVuY29kaW5nT3JDYWxsYmFjayIsImNhbGxiYWNrIiwiYnVmZmVyIiwiaGlkZUJpbiIsInNjcmlwdE5hbWUiLCJtaWRkbGV3YXJlIiwid29ya2luZ0RpciIsImNoZGlyIiwiQkVSUllfQklOX0ZPTERFUiIsInVwcGVyS2V5IiwicmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIiwicGFja2FnZUpzb25EaXIiLCJwYXRobmFtZSIsImdldFZlcnNpb24iLCJoZWxwIiwic2h1dHRpbmdEb3duIl0sIm1hcHBpbmdzIjoiaXNCQU9PLE1BQU1BLEVBQTRCLENBQ3ZDQyxJQUFLLENBQ0hDLFlBQWEsMkJBQ2JDLEtBQU0sU0FFUixjQUFlLENBQ2JELFlBQ0Usd0xBQ0ZDLEtBQU0sVUFFUixtQkFBb0IsQ0FDbEJELFlB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RUMsRUFBRUMsRUFBRUssRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBRyxJQUFJN0QsRUFBRSxFQUFFQSxFQUFFLEdBQUdBLEdBQUcsRUFBRWhCLEVBQUVKLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJTSxFQUFFTixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXlCLEVBQUV6QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXFCLEVBQUVyQixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXNCLEVBQUV0QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXVCLEVBQUV2QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSTRCLEVBQUU1QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSTZCLEVBQUU3QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSThCLEVBQUU5QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSStCLEVBQUUvQixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUMsRUFBRTZCLEdBQUdMLEdBQUcsRUFBRUosSUFBSSxJQUFJbkIsRUFBRTZCLEdBQUdWLEdBQUcsRUFBRUksSUFBSSxJQUFJekIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFRyxHQUFHa0IsR0FBRyxFQUFFQyxJQUFJLElBQUlyQixFQUFFSSxHQUFHaUIsR0FBRyxFQUFFRCxJQUFJLElBQUl0QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUV3QixHQUFHRyxHQUFHLEVBQUVDLElBQUksSUFBSTNCLEVBQUVtQixHQUFHUSxHQUFHLEVBQUVELElBQUksSUFBSTVCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRXFCLEdBQUdRLEdBQUcsRUFBRUMsSUFBSSxJQUFJN0IsRUFBRXFCLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJ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RCxLQUFLNkQsUUFBUSxHQUFHcEgsRUFBUXF0QixvQkFBcUIsSUFFakVuM0IsV0FBVyxtQ0FBb0MsSUFFL0NBLFdBQVcsc0JBQXVCLElBQ2xDQSxXQUFXLGlCQUFrQixLQUVsQyxJQUFLLE1BQU1pTCxLQUFPNUQsT0FBTzJELEtBQUtsQixHQUFVLENBQ3RDLE1BQU1zdEIsRUFBV25zQixFQUFJaUwsZUFFbkJraEIsRUFBU2h1QixXQUFXLFNBQ3BCZ3VCLEVBQVNodUIsV0FBVyxVQUNwQmd1QixFQUFTaHVCLFdBQVcsV0FDUCxnQkFBYmd1QixHQUNhLGFBQWJBLFdBR090dEIsRUFBUW1CLEVBRW5CLENBQ0YsQ2tEL0lJb3NCLENBQXFDejlCLFFBQVFoQyxPQUU5Q2lFLFFBQVFtNEIsSUFDUm40QixRQUFReVQsSUFDUnpULFFBQVFzYSxJQUNSdGEsUUFBUXlmLElBQ1J6ZixRQUFRcWdCLElBQ1JyZ0IsUUFBUTJoQixJQUNSM2hCLFFBQVF1bkIsSUFDUnZuQixRQUFROG9CLElBQ1I5b0IsUUFBUTByQixJQUNSMXJCLFFBQVFpdkIsSUFDUmp2QixRQUFRcXZCLElBQ1JydkIsUUFBUTh4QixJQUNSOXhCLFFBQVEwekIsSUFDUjF6QixRQUFRdTNCLElBQ1J2M0IsUUFBUXkzQixJQUNSejNCLFFBQVEyM0IsSUFDUjMzQixRQUFRazRCLElBQ1IzTCxnQkFDQUMsU0FDQTNNLFFBR0gsV0FDRSxJQUFJNGIsRUFBaUJ2K0IsRUFBS2lVLFFBQVEsSUFBSXhHLGdCQUFnQjhlLEtBQUtpUyxVQUMzRCxNQUFRNXVCLEVBQUdLLFdBQVdqUSxFQUFLZ0UsS0FBS3U2QixFQUFnQixrQkFDOUNBLEVBQWlCditCLEVBQUtpVSxRQUFRc3FCLEdBS2hDLE9BSG9CendCLEtBQUsyRSxNQUFNN0MsRUFBR0MsYUFBYTdQLEVBQUtnRSxLQUFLdTZCLEVBQWdCLGdCQUFpQixTQUd2RTViLE9BQ3JCLENBWlc4YixJQUNSQyxPQUFPdC9CLEtBYVYsSUFBSXUvQixJQUFlLEVBQ25CLElBQUssTUFBTWorQixJQUFVLENBQUMsU0FBVSxVQUFXLFdBQ3pDRyxRQUFRaUUsR0FBR3BFLEVBQVEsS0FDakIsSUFBSWkrQixHQUFKLENBRUFBLElBQWUsRUFDZixJQUNFbitCLEVBQVNLLFFBQVFKLElBQ25CLENBQUUsTUFBT0gsR0FDUGdGLFFBQVFFLEtBQUssc0JBQXNCM0UsUUFBUUosd0JBQXlCSCxFQUN0RSxDQUNBTyxRQUFRd2IsTUFSVSIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOls1LDYsNyw4LDldfQ==