@willbooster/wb 13.8.5 → 13.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -3
- package/package.json +19 -29
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
|
|
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 y from"node:fs/promises";import{createServer as w}from"node:net";const b={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"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"}};const v=new Map;function k(e){const n=v.get(e);if(n)return n;const r=u({path:t.resolve(e),processEnv:{}}).parsed??{};return v.set(e,r),r}function A(e){return e instanceof Error&&"code"in e}function E(e,t="SIGTERM"){if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid pid: ${e}`);if("win32"===process.platform)return void function(e){try{$("taskkill",["/PID",String(e),"/T","/F"],{maxBuffer:1048576,timeout:2e3})}catch(e){if(S(e))return;throw e}}(e);const n=function(e){const{stdout:t}=$("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)P(e,t)}function P(e,t){try{process.kill(e,t)}catch(e){if(S(e))return;throw e}}function $(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 x(e,t,r,function(e){if(A(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 S(e){return!(!A(e)||"ESRCH"!==e.code)||e instanceof x&&/no such process|not found|not recognized|there is no running instance/i.test(e.stderr)}class x extends Error{constructor(e,t,n,r){super(`Command failed: ${e} ${t.join(" ")}`),this.name="CommandExecutionError",this.stderr=n,this.code=r}}async function R(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="";s.stdout?.on("data",e=>{a+=e,n?.printingStdout&&process.stdout.write(e)}),s.stderr?.on("data",e=>{n?.mergeOutAndError?a+=e:c+=e,n?.printingStderr&&process.stderr.write(e)});let d=!1;const l=()=>{if(!d&&s.pid){d=!0,n?.verbose&&console.info(`treeKill(${s.pid})`);try{E(s.pid)}catch(e){n?.verbose&&console.warn(`Failed to treeKill(${s.pid})`,e)}}},u="win32"===process.platform?["SIGINT","SIGTERM"]:["SIGINT","SIGTERM","SIGQUIT"],p=new Map,f=()=>{process.removeListener("beforeExit",l);for(const[e,t]of p)process.removeListener(e,t);p.clear()};if(n?.killOnExit){process.on("beforeExit",l);for(const e of u){const t=()=>{l(),f(),0===process.listenerCount(e)&&process.kill(process.pid,e)};p.set(e,t),process.on(e,t)}}s.on("error",e=>{f(),s.removeAllListeners("close"),o(e)}),s.on("close",(e,t)=>{f(),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)}})}function j(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 N(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 D(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,5 +6,5 @@ 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 O=[..."0123456789abcdef"],T=[6,1536,393216,100663296],I=[0,8,16,24],_=[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 C=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class L{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<<I[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<I[3&i++],t[i>>2]|=(128|63&a)<<I[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<I[3&i++],t[i>>2]|=(128|a>>6&63)<<I[3&i++],t[i>>2]|=(128|63&a)<<I[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<I[3&i++],t[i>>2]|=(128|a>>12&63)<<I[3&i++],t[i>>2]|=(128|a>>6&63)<<I[3&i++],t[i>>2]|=(128|63&a)<<I[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];B(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];B(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+=O[o>>4&15]+O[15&o]+O[o>>12&15]+O[o>>8&15]+O[o>>20&15]+O[o>>16&15]+O[o>>28&15]+O[o>>24&15];i%e===0&&(t=C(t),B(t),s=0)}return r&&(o=t[s],a+=O[o>>4&15]+O[15&o],r>1&&(a+=O[o>>12&15]+O[o>>8&15]),r>2&&(a+=O[o>>20&15]+O[o>>16&15])),a}}const B=function(e){let t,n,r,o,s,i,a,c,d,l,u,p,f,h,m,g,b,y,w,v,k,A,E,P,S,$,x,R,j,N,D,O,T,I,C,L,B,F,z,J,U,M,W,Y,V,q,G,K,H,Q,X,Z,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],q=e[11]<<4|e[10]>>>28,G=e[10]<<4|e[11]>>>28,R=e[20]<<3|e[21]>>>29,j=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,M=e[40]<<18|e[41]>>>14,W=e[41]<<18|e[40]>>>14,I=e[2]<<1|e[3]>>>31,C=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,b=e[12]<<12|e[13]>>>20,K=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,N=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,L=e[14]<<6|e[15]>>>26,B=e[15]<<6|e[14]>>>26,y=e[25]<<11|e[24]>>>21,w=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,X=e[35]<<15|e[34]>>>17,O=e[45]<<29|e[44]>>>3,T=e[44]<<29|e[45]>>>3,P=e[6]<<28|e[7]>>>4,S=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,Z=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,$=e[18]<<20|e[19]>>>12,x=e[19]<<20|e[18]>>>12,se=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,J=e[38]<<8|e[39]>>>24,U=e[39]<<8|e[38]>>>24,A=e[48]<<14|e[49]>>>18,E=e[49]<<14|e[48]>>>18,e[0]=h^~g&y,e[1]=m^~b&w,e[10]=P^~$&R,e[11]=S^~x&j,e[20]=I^~L&F,e[21]=C^~B&z,e[30]=Y^~q&K,e[31]=V^~G&H,e[40]=te^~re&se,e[41]=ne^~oe&ie,e[2]=g^~y&v,e[3]=b^~w&k,e[12]=$^~R&N,e[13]=x^~j&D,e[22]=L^~F&J,e[23]=B^~z&U,e[32]=q^~K&Q,e[33]=G^~H&X,e[42]=re^~se&ae,e[43]=oe^~ie&ce,e[4]=y^~v&A,e[5]=w^~k&E,e[14]=R^~N&O,e[15]=j^~D&T,e[24]=F^~J&M,e[25]=z^~U&W,e[34]=K^~Q&Z,e[35]=H^~X&ee,e[44]=se^~ae&de,e[45]=ie^~ce&le,e[6]=v^~A&h,e[7]=k^~E&m,e[16]=N^~O&P,e[17]=D^~T&S,e[26]=J^~M&I,e[27]=U^~W&C,e[36]=Q^~Z&Y,e[37]=X^~ee&V,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=A^~h&g,e[9]=E^~m&b,e[18]=O^~P&$,e[19]=T^~S&x,e[28]=M^~I&L,e[29]=W^~C&B,e[38]=Z^~Y&q,e[39]=ee^~V&G,e[48]=de^~te&re,e[49]=le^~ne&oe,e[0]^=_[r],e[1]^=_[r+1]},F=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(J.decode(e))],create:([e])=>z.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]))}(),z=new TextEncoder,J=new TextDecoder("utf-8");function U(e=void 0,t=F){return JSON.stringify(Y(e,t))}function M(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 W=[];function Y(e,t=F){const n=M(e);if(null!==n)return n;const r=[],o=new Map;return function e(n){const s=M(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(W.length<e){const t=W.length;W.length=e,W.fill(-2,t,e)}return W.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 V(e,t){return function(e){return new L(512,T,512).update(e).hex()}(U([e,t]))}const q=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=V}={}){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:V});function G(e){return!!e&&"0"!==e&&"false"!==e}let K;class H{static{[K]=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 b(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 w(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]),w=t[3],v=!c,k=1===o,A=3===o,E=4===o,P=2===o;function S(t,n,r){return function(o,s){return n&&(s=o,o=e),r&&r(o),$[t].call(o,s)}}if(!v){var $={},x=[],R=A?"get":E||k?"set":"value";if(l?(u||k?$={get:N(function(){return w(this)},r,"get"),set:function(e){t[4](this,e)}}:$[R]=w,u||N($[R],r,P?"":R)):u||($=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=m[+d][r])&&7!==(i^o))throw Error("Decorating two elements with the same name ("+$[R].name+") is not supported yet");m[+d][r]=o<3?1:o}}for(var j=e,D=g.length-1;D>=0;D-=n?2:1){var O=y(g[D],"A decorator","be",!0),T=n?g[D-1]:void 0,I={},_={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=O.call(T,j,_),I.v=1,y(i,"class decorators","return")&&(j=i);else if(_.static=d,_.private=l,i=_.access={has:l?p.bind():function(e){return r in e}},E||(i.get=l?P?function(e){return h(e),$.value}:S("get",0,h):function(e){return e[r]}),P||A||(i.set=l?S("set",0,h):function(e,t){e[r]=t}),j=O.call(T,k?{get:$.get,set:$.set}:$[R],_),I.v=1,k){if("object"==typeof j&&j)(i=y(j.get,"accessor.get"))&&($.get=i),(i=y(j.set,"accessor.set"))&&($.set=i),(i=y(j.init,"accessor.init"))&&x.unshift(i);else if(void 0!==j)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(j,(u?"field":"method")+" decorators","return")&&(u?x.unshift(j):$[R]=j)}return o<2&&c.push(b(x,d,1),b(a,d,0)),u||v||(l?k?c.splice(-1,0,S("get",d),S("set",d)):c.push(P?$[R]:y.call.bind($[R])):f(e,r,$)),j}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(b(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;w(t?e:e.prototype,i,h,f?"#"+p:D(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,f,r,t&&f?function(t){return j(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=w(e,[t],r,e.name,5,n)),b(n,1)]}}}(this,[],[[q,3,"isBunAvailable"],[q,3,"buildCommand"],[q,3,"rootDirPath"],[q,3,"dockerfile"],[q,3,"hasDockerfile"],[q,3,"hasSourceCode"],[q,3,"name"],[q,3,"dockerImageName"],[q,3,"env"],[q,3,"packageJson"],[q,3,"packageJsonPath"],[q,3,"hasPrisma"],[q,3,"hasDrizzle"],[q,3,"databaseOrm"],[q,3,"hasVitest"],[q,3,"hasBiome"],[q,3,"hasEslint"],[q,3,"hasOxlint"],[q,3,"hasOxfmt"],[q,3,"hasPoetryLock"],[q,3,"hasPubspecYaml"],[q,3,"preferredLinter"],[q,3,"hasPlaywrightConfig"],[q,3,"skipLaunchingServerForPlaywright"],[q,3,"dockerPackageJson"],[q,3,"binExists"],[q,3,"rootPackageJson"]]).e}argv=void K(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}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)),n.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",o.join(", ")));const i=[],a={};for(const e of o){const o=[];for(const[n,s]of Object.entries(k(t.join(r,e))))n in a||n in process.env||(a[n]=s,o.push(n));i.push([e,o]),n.verbose&&o.length>0&&console.info(`Read ${o.length} environment variables from ${e}`)}if(n.verbose||console.info(`Read env files: ${i.map(([e,t])=>t.length>0?`${e} (${t.join(", ")})`:e).join(", ")||"nothing"}`),n.checkEnv){const e=Object.keys(k(t.join(r,n.checkEnv))).filter(e=>!(e in a)&&!(e in process.env));if(e.length>0)throw new Error(`Missing environment variables in [${o.join(", ")}]: [${e.join(", ")}]`)}return[p({parsed:a,processEnv:{}}).parsed??a,i]}(this.argv,this.dirPath);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 hasBiome(){return this.hasDependency("@biomejs/biome")||this.hasDependency("biome")}get hasEslint(){return this.hasDependency("eslint")}get hasOxlint(){return this.hasDependency("oxlint")}get hasOxfmt(){return this.hasDependency("oxfmt")}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(){return this.hasBiome?"biome":this.hasOxlint?"oxlint":this.hasEslint?"eslint":void 0}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(G(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 Q(n,r=!0,o){if(o??=process.cwd(),e.existsSync(t.join(o,"package.json")))return new H(o,n,r)}async function X(e,t=!0,n){const r=Z(e,t,n);if(r)return{...r,descendants:r.root===r.self?await ee(e,r.root,t):[r.self]}}function Z(n,r=!0,o){if(o??=process.cwd(),!e.existsSync(t.join(o,"package.json")))return;const s=new H(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 H(s,n,r))}return{root:i,self:s}}async function ee(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 H(r,n,o));return s}const te=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),ne=te?"bun --bun run":"node",re=te?"bun":"yarn",oe=te?"bun --bun run":"yarn",se={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=Q(n,!0,r);if(!s)return console.error(d.red("No project found.")),!0;const i=n.command??(s.packageJson.scripts?.build?te?"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 ie(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])=>!ae.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=>(ce.some(t=>e.includes(t))||de.some(t=>e.endsWith(t)))&&!le.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(!ie(s,n))return;n.dryRun||await e.promises.writeFile(l,u,"utf8");return!0}(n)}};function ie(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 ae=new Set(["CI","PWDEBUG","TMPDIR"]);const ce=["src/","public/"],de=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],le=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const ue=new m,pe={exitIfFailed:!0};async function fe(e,t,n,r=pe){const o=me(e,t);if(ge(o.printable,t),n.verbose&&ge(o.runnable,t,"Start (raw)",!0),n.dryRun)return be(o.printable,0,r),0;const s=await R(o.runnable,void 0,{cwd:t.dirPath,env:ye(t.env,r),shell:!0,stdio:"inherit",timeout:r.timeout,killOnExit:!0,verbose:n.verbose});return r.onSignal?.(s.signal),be(o.printable,s.status,r),s.status??1}function he(e,t,n,r=pe){return ue.runAndWaitForReturnValue(async()=>{const o=me(e,t);if(ge(o.printable,t,"Start (parallel)",!0),n.dryRun)return ge(o.printable,t,"Started (log)"),n.verbose&&ge(o.runnable,t,"Started (raw)",!0),be(o.printable,0,r),0;const s=await R(o.runnable,void 0,{cwd:t.dirPath,env:ye(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});r.onSignal?.(s.signal),ge(o.printable,t,"Started (log)"),n.verbose&&ge(o.runnable,t,"Started (raw)",!0);const i=s.stdout.trim();return i&&(process.stdout.write(i),process.stdout.write("\n")),be(o.printable,s.status,r),s.status??1})}function me(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA generate ",t.packageJson.dependencies?.blitz?"PRISMA generate ":"PRISMA generate --no-hints ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",te?"bun --bun run ":"yarn run ");te&&(n=n.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").replaceAll(/(?:YARN )?vitest run/g,"bun test").replaceAll(/ --color --passWithNoTests(?: --allowOnly)?/g,"")),n=n.trim();const r=we(n.replaceAll("YARN ",`${oe} `)),o=we(n.replaceAll("YARN playwright ",`${oe} playwright `).replaceAll("YARN ",!te&&t.binExists?"":`${oe} `)),s=t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:"";return{printable:`${oe} dotenv${s} -- ${r}`,runnable:o}}function ge(e,t,n="Start",r=!1){console.info("\n"+(r?d.gray:d.cyan)(d.bold(`${n}:`),e)+d.gray(` at ${t.dirPath}`))}function be(e,t,n){0===t?console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function ye(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function we(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const ve={...w,"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 ke(e){const t=[];for(const n of Object.keys(w)){const r=Ae(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 t}function Ae(e,t){const n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const Ee={command:"concurrently <commands...>",describe:"Run commands concurrently",builder:{...ve,"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=Q(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(me(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:ye(e.project.env,{ci:e.ci,forceColor:e.forceColor}),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(Se(t,"SIGTERM"))),d())};n.once("error",e=>{console.error("Failed to start child process:",e),u(1)}),n.once("exit",(e,t)=>{u(Pe(e??void 0,t??void 0))})})),l=e=>{n??=e,i||(i=!0,a.push(Se(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 Pe(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,forceColor:"boolean"==typeof e.forceColor?e.forceColor:void 0});process.exit(r)}catch(e){console.error(d.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function Pe(e,t){return void 0!==e?e:t&&t in h.signals?128+h.signals[t]:1}async function Se(e,t){const n=$e(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(xe))return!1;await Re(Math.min(100,t-Date.now()))}return!0}(n)&&$e(n,"SIGKILL")}function $e(e,t){const n=[];for(const r of e)try{if(!je(r,t))continue;n.push(r),E(r,t)}catch(e){console.warn("Failed to kill child process:",e)}return n}function xe(e){try{return process.kill(-e,0),!1}catch(e){return!!Ne(e)}}async function Re(e){await new Promise(t=>setTimeout(t,e))}function je(e,t){try{return process.kill(-e,t),!0}catch(e){if(Ne(e))return!1;throw e}}function Ne(e){return"object"==typeof e&&null!==e&&"code"in e&&"ESRCH"===e.code}const De={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=Q(e);t||(console.error(d.red("No project found.")),process.exit(1));if(G(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 Oe(e){return e.map(e=>Te(e)).join(" ")}function Te(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll("'","'\"'\"'")}'`}const Ie=new Set(["astro","cjs","css","cts","gql","htm","html","js","json","json5","jsonc","jsx","mjs","mts","svelte","ts","tsx","vue","yaml","yml"]),_e=new Set(["cjs","cts","js","jsx","mjs","mts","ts","tsx"]),Ce=new Set([..._e,"astro","svelte","vue"]),Le=new Set(["py"]),Be=new Set(["dart"]),Fe=new Set([...Ce,"css","gql","graphql","hbs","htm","html","json","json5","jsonc","less","md","mdx","scss","toml","yaml","yml"]),ze=new Set(["cjs","css","cts","htm","html","java","js","json","json5","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),Je=new Set([...ze].filter(e=>!Ie.has(e))),Ue="!**/test{-,/}fixtures/**",Me={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"}},async handler(e){const t=await We(e);t&&process.exit(t)}};async function We(e){if("win32"===process.platform)return console.error(d.red("This command is not supported on Windows.")),1;const n=await X(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 e=await Promise.all(r.map(async e=>{const n=t.resolve(e),r=await async function(e){try{if((await b.stat(e)).isDirectory())return"directory"}catch{}return"other"}(n);return{fileKind:r,filePath:n}}));for(const{fileKind:r,filePath:u}of e){if(u.endsWith("/test/fixtures")||u.includes("/test/fixtures/")||u.endsWith("/test-fixtures")||u.includes("/test-fixtures/"))continue;const e=t.extname(u).slice(1);if(u.endsWith("/package.json"))l.push(u);else{l.push(...He(n.descendants,u,r));for(const{lintPath:t,project:l}of Qe(n.descendants,u,r)){if(l.hasPoetryLock&&("directory"===r||Le.has(e))){const e=i.get(l)??[];if(e.push(t),i.set(l,e),"directory"!==r)continue}if(l.hasPubspecYaml&&("directory"===r||Be.has(e))){const e=a.get(l)??[];if(e.push(t),a.set(l,e),"directory"!==r)continue}if("biome"===l.preferredLinter||"directory"===r||Ze(l,e)){const n=o.get(l)??[];n.push(t),o.set(l,n);for(const n of Ke(l,t,r,e))if(l.hasOxfmt){const e=s.get(l)??[];e.push(n),s.set(l,e)}else c.push(n)}else if(ze.has(e)||Fe.has(e))if(l.hasOxfmt&&Fe.has(e)){const e=s.get(l)??[];e.push(t),s.set(l,e)}else ze.has(e)&&c.push(t);else Xe(e)&&!l.preferredLinter&&(console.error(d.red(`No linter found for ${l.name}. Install ESLint or Biome.`)),f=!0)}}}u=[...new Set(c)],p=[...new Set(l)]}else u=function(e,n){const r=new Set([`**/{.*/,}*.{${[...Je].join(",")}}`,Ue]);for(const o of n){if(!et(o))continue;const n=t.join(o.dirPath,"**/{.*/,}*.{"+[...ze].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={exitIfFailed:!1,forceColor:!0};if(r.length>0){for(const[t,n]of o){const r=Ye(t,e,n);r&&h.push(he(r,t,e,m))}for(const[t,n]of s)h.push(he(Ve(n),t,e,m));for(const[t,n]of i)h.push(he(qe(e,n),t,e,m));for(const[t,n]of a)h.push(he(Ge(e,n),t,e,m))}else{for(const t of n.descendants){if(t.packageJson.workspaces&&!t.hasSourceCode)continue;const n=Ye(t,e);n&&h.push(he(n,t,e,m))}for(const t of n.descendants)t.hasPoetryLock&&h.push(he(qe(e),t,e,m)),t.hasPubspecYaml&&h.push(he(Ge(e),t,e,m)),t.hasOxfmt&&e.format&&h.push(he(Ve(),t,e,m))}const g=await Promise.all(h);return f||g.some(e=>0!==e)?1:(e.format&&(u.length>0&&g.push(await he(Oe(["YARN","prettier","--cache","--color","--no-error-on-unmatched-pattern","--write","--",...u]),n.self,e,{exitIfFailed:!1,forceColor:!0})),p.length>0&&g.push(await he(Oe(["YARN","sort-package-json","--",...p]),n.self,e,{exitIfFailed:!1,forceColor:!0}))),g.some(e=>0!==e)?1:0)}function Ye(e,t,n){if("biome"===e.preferredLinter){let e;return e=t.fix&&t.format?["check","--write"]:t.fix?["lint","--fix"]:t.format?["format","--fix"]:["lint"],Oe(["BUN","biome",...e,"--colors=force","--no-errors-on-unmatched","--files-ignore-unknown=true",...t.quiet?["--diagnostic-level=error"]:[],...n?.length?["--"]:[],...n??[]])}return"eslint"===e.preferredLinter?Oe(["YARN","eslint","--color",...t.quiet?["--quiet"]:[],...t.fix||t.format?["--fix"]:[],"--",...n??["."]]):"oxlint"===e.preferredLinter?Oe(["YARN","oxlint",...t.quiet?["--quiet"]:[],...t.fix?["--fix"]:[],...n??["."]]):void 0}function Ve(e){return Oe(["YARN","oxfmt","--write","--no-error-on-unmatched-pattern",...e??["."]])}function qe(e,t){const n=t&&t.length>0?t:["."];return(e.fix||e.format?[Oe(["poetry","run","isort","--profile","black","--filter-files",...n]),Oe(["poetry","run","black",...n]),Oe(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])]:[Oe(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])]).join(" && ")}function Ge(e,t){const n=t&&t.length>0?t:["."],r=[];return(e.fix||e.format)&&r.push(Oe(["dart","format",...n])),r.push(Oe(["dart","analyze",...n])),r.join(" && ")}function Ke(e,n,r,o){return"directory"===r&&e.hasOxfmt?[n]:"directory"===r&&"biome"===e.preferredLinter?[t.join(n,"**/{.*/,}*.{"+[...Je].join(",")+"}"),Ue]:"directory"===r&&et(e)?[n,Ue]:function(e,t){return e.hasOxfmt?Fe.has(t):!!et(e)||"biome"===e.preferredLinter&&!Ze(e,t)&&ze.has(t)}(e,o)?[n]:[]}function He(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 Qe(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 Xe(e){return Ie.has(e)||Ce.has(e)||_e.has(e)||Le.has(e)||Be.has(e)}function Ze(e,t){return"biome"===e.preferredLinter?Ie.has(t):"oxlint"===e.preferredLinter?Ce.has(t):"eslint"===e.preferredLinter&&_e.has(t)}function et(e){return!e.hasOxfmt&&("eslint"===e.preferredLinter||"oxlint"===e.preferredLinter)}function*tt(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const nt={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 X(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const o of tt("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(rt(n,r),ot(r),st(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.dryRun||n.outside||(o.spawnSync(re,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function rt(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies??{},r=["artillery","biome","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],o=[];for(const e of Object.keys(n))(r.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete n[e],o.push(e));console.info("Removed devDependencies:",o.join(", ")||"none")}function ot(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 st(e){delete e.private,delete e.publishConfig,delete e.prettier}const it="file:";const at=new class{deploy(e,t=""){return this.migrate(e,t)}migrate(e,t=""){return`YARN drizzle-kit migrate ${t}`}migrateDev(e,t=""){return`YARN drizzle-kit generate ${t}`}reset(e,n=""){const r=function(e){const n=e.env.DATABASE_PATH??function(e){const t=e.env.DATABASE_URL;if(!t?.startsWith(it))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)} && ${this.seed(e)}`:"echo 'wb db reset supports Drizzle only when DATABASE_PATH or file: DATABASE_URL is set.' && exit 1"}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}`}},ct="file:",dt=[{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 lt(e){return e.packageJson.dependencies?.blitz?"db/mount":"prisma/mount"}function ut(n){return dt.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}const pt=new class{cleanUpLitestream(e){const t=lt(e);var n;return`${`if [ -f "${n=`${t}/prod.sqlite3`}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${ct}${n}"; fi && rm -f "${n}".* "${n}"-*`}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}deployForce(e){const t=lt(e),n=`rm -Rf "${`${t}/prod.sqlite3`}"*`;return`${n}; PRISMA migrate reset --force --skip-seed && ${n}\n && litestream restore -config litestream.yml -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e){return`litestream ltx -config litestream.yml ${lt(e)}/prod.sqlite3`}migrate(e,t=""){return`PRISMA migrate deploy ${t} && PRISMA generate && ${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(ct))return;const r=n.slice(5).replace(/[?#].*$/,"");if(!r)return;const o=ut(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){return`rm -Rf ${t}*; litestream restore -config litestream.yml -o ${t} ${lt(e)}/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=${ct}${e} `}else if(e.env.DATABASE_URL?.startsWith(ct)){const n=ut(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));o=`DATABASE_URL=${ct}${r} `}}return`${o}PRISMA studio ${r}`}},ft={},ht={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(mt).command(gt).command(bt).command(yt).command(wt).command(vt).command(kt).command(At).command(Et).command(Pt).command(St).command($t).demandCommand().strict(!1),handler(){}},mt={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:ft,async handler(e){const t=await Rt(e,"prisma");for(const{project:n}of Nt("prisma cleanup-litestream",t))await fe(pt.cleanUpLitestream(n),n,e)}},gt={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:ft,async handler(e){const t=await Rt(e,"prisma");for(const{project:e}of Nt("prisma create-litestream-config",t))xt(e)}},bt={command:"deploy",describe:"Apply migration to DB without initializing it",builder:ft,async handler(e){const t=await Rt(e),n=Dt(e);for(const{orm:r,project:o}of Nt("db deploy",t))await fe(jt(r).deploy(o,n),o,e)}},yt={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:ft,async handler(e){const t=await Rt(e,"prisma");for(const{project:n}of Nt("prisma deploy-force",t))await fe(pt.deployForce(n),n,e)}},wt={command:"list-backups",describe:"List Litestream backups",builder:ft,async handler(e){const t=await Rt(e,"prisma");for(const{project:n}of Nt("prisma list-backups",t))await fe(pt.listBackups(n),n,e)}},vt={command:"migrate",describe:"Apply migration to DB with initializing it",builder:ft,async handler(e){const t=await Rt(e),n=Dt(e);for(const{orm:r,project:o}of Nt("db migrate",t))await fe(jt(r).migrate(o,n),o,e)}},kt={command:"migrate-dev",describe:"Create a migration file",builder:ft,async handler(e){const t=await Rt(e),n=Dt(e);for(const{orm:r,project:o}of Nt("db migrate-dev",t))await fe(jt(r).migrateDev(o,n),o,e)}},At={command:"reset",describe:"Reset DB",builder:ft,async handler(e){const t=await Rt(e),n=Dt(e);for(const{orm:r,project:o}of Nt("db reset",t))await fe(jt(r).reset(o,n),o,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const{orm:t,project:r}of Nt("WB_ENV=test db reset",await Rt(e)))await fe(jt(t).reset(r,n),r,e)}}},Et={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...ft,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await Rt(e,"prisma");for(const{project:n}of Nt("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await fe(pt.restore(n,t),n,e)}}},Pt={command:"seed",describe:"Populate DB with seed data",builder:{...ft,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await Rt(e);for(const{orm:n,project:r}of Nt("db seed",t))await fe(jt(n).seed(r,e.file),r,e)}},St={command:"studio [db-url-or-path]",describe:"Open database studio",builder:{...ft,"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 Rt(e),n=Dt(e,["db-url-or-path","restored"]);for(const{orm:r,project:o}of Nt("db studio",t)){const t=e.restored?o.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await fe(jt(r).studio(o,t,n),o,e)}}},$t={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 Rt(e),n=[(e.args?.join(" ")??"").trimEnd(),Dt(e,["args"])].filter(Boolean).join(" ");for(const{orm:r,project:o}of Nt(`db ${n}`,t)){const t="prisma"===r?`PRISMA ${n}`:`YARN drizzle-kit ${n}`;await fe(t,o,e)}}};function xt(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 Rt(e,t){const n=await X(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 jt(e){return"prisma"===e?pt:at}function*Nt(e,t){const n=new Map(t.map(e=>[e.project,e]));for(const r of tt(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 Dt(e,t=[]){const n=[],r=Object.keys(ve),o=Object.values(ve).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 Oe([...n,...i])}const Ot={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=Q(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 fe(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},Tt={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await X(e,!1,t);n||(console.error(d.red("No project found.")),process.exit(1));for(const t of tt("setup",n.descendants)){const r=await b.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===f.platform()){const n=["pstree"];await he(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await fe("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await he("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await he(`poetry env use ${n}`,t,e),await ue.promiseAll(),await fe("poetry run pip install --upgrade pip",t,e),await fe("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await fe(`${oe} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await fe(`${oe} playwright install --with-deps`,r,e)}(e)}};function It(e){return e.silent?" > /dev/null":""}const _t=new Set;async function Ct(e,t){const n=await async function(e){for(const t of["127.0.0.1","::"]){if(!await Ft(t,e))return!1}return!0}(e);n||await Lt(e,t);const r=async()=>{_t.has(e)||(_t.add(e),await Lt(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,r)}async function Lt(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await R("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 R("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await g(e)}catch{}}async function Bt(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await Ct(n,t),n}async function Ft(e,t){return new Promise(n=>{const r=y();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 zt=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"";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} .`}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),ge(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});be(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 ":""}--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 Jt{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return zt.buildImage(e,t)}async startDev(e,t){return await Bt(e.env.PORT,e),this.shouldWaitAndOpenApp?Oe(["YARN","wb","concurrently",...ke(t),"--kill-others-on-fail",this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await Bt(e.env.PORT,e),this.shouldWaitAndOpenApp?Oe(["YARN","wb","concurrently",...ke(t),"--kill-others-on-fail",this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await Bt(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await Bt(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && ${Oe(["YARN","wb","concurrently",...ke(t),"--kill-others-on-fail",zt.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??""),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,"development")}\n && ${zt.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProductionProtected(e,t){const n=function(e){try{return e.findFile("ecosystem.config.cjs")}catch{return}}(e),r=void 0===n?[("YARN wb buildIfNeeded "+(t.verbose?"--verbose":"")).trim(),`node dist/index.js ${t.normalizedArgsText??""}`.trim()]:[e.buildCommand,`pm2-runtime start --no-autorestart ${n}`];return[...e.hasPrisma?pt.migrate(e).split("&&"):[],...r].filter(Boolean).map(e=>`${e} ${It(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,zt.stopAndStart(e),n)}async testStart(e,t){return await Bt(e.env.PORT,e),`${n="NODE_ENV",r="",`${n}=${Te(r)}`} ${Oe(["YARN","wb","concurrently",...ke(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 Bt(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 Ut([...o,...e,...r],n);const i=e.slice(1),a=Mt(i),c=0===a.length?i:i.filter((e,t)=>!a.includes(t));return Ut([...o,"test",...s,...c,...r],n)}(o,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${a}${i}`:Oe(["YARN","wb","concurrently",...ke(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?Oe(["YARN","vitest","run",...n?.length?n:["test/unit/"],"--color","--passWithNoTests","--allowOnly","--watch=false",...t.bail?["--bail=1"]:[]]):e.isBunAvailable?Oe(["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 Ut(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="))?Oe(e):Oe([...e,"--max-failures=1"]):Oe(e)}function Mt(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;Wt.has(o)?t="required":Yt.has(o)&&(t="optional")}else{if(o.startsWith("-")&&"-"!==o){const e=o.slice(0,2);2===o.length&&Vt.has(e)&&(t="required");continue}n.push(r)}}return n}const Wt=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"]),Yt=new Set(["--only-changed","--update-snapshots","--update-source-method"]),Vt=new Set(["-c","-g","-j"]);const qt=new class extends Jt{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const Gt=new class extends Jt{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 Bt(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets?.map(String);return Oe(["YARN","wb","concurrently",...ke(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o}\n && ${Oe(["vitest","run",...i&&i.length>0?i:["test/e2e/"],"--color","--passWithNoTests","--allowOnly",...t.bail?["--bail=1"]:[]])}${s}`])}};const Kt=new class extends Jt{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}};const Ht=new class extends Jt{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} && ${ne} 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")} && ${zt.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 Qt=new class extends Jt{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const Xt=new class extends Jt{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()}},Zt=["express","fastify","elysia","hono"],en={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"}},tn={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(en),async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e["--"]??[]].map(e=>Te(String(e))).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>Te(String(e))).join(" ")}(e);const t=await X(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=qt;else if(t.next)o=Kt;else if(r["@remix-run/dev"])o=Qt;else if(r.vite)o=Xt;else if(Zt.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))o=Gt;else{if(!t["build-ts"]&&!r["build-ts"])continue;o=Ht}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await fe(await o.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await fe(await o.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await fe(await o.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await fe(await o.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await o.startTest(n,e);await fe(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},nn={e2e:{description:"E2e test mode: headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",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"}},rn={targets:{description:"Test target paths",type:"array"}},on={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({...nn,...rn}),async handler(e){await sn(e)}};async function sn(n){const r=await X(n);r||(console.error(d.red("No project found.")),process.exit(1)),process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const o=n.targets??[],s=n["--"]??[],{shouldRunE2e:i,shouldRunUnit:a}=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}}(o,s);for(const c of r.descendants){const r=c.packageJson.dependencies??{},d=c.packageJson.devDependencies??{};let l;if(l=r.blitz?qt:r.next?Kt:d["@remix-run/dev"]?Qt:d.vite?Xt:Zt.some(e=>r[e])&&!r["firebase-functions"]?Gt:Ht,console.info(`Running "test" for ${c.name} ...`),a&&e.existsSync(t.join(c.dirPath,"test","unit"))){const e=o.filter(e=>e.includes("/unit")),t={...n,targets:e.length>0?e:void 0};await fe(l.testUnit(c,t),c,n,{timeout:n.unitTimeout})}if(!i||!e.existsSync(t.join(c.dirPath,"test","e2e")))continue;const u=o.filter(e=>e.includes("/e2e")),p={...n,targets:u.length>0?u:void 0};switch(n.e2e){case"headless":await fe(await l.testE2EProduction(c,p,{playwrightArgs:cn(u,s),forwardedPlaywrightArgs:s}),c,n);continue;case"headless-dev":await fe(await l.testE2EDev(c,p,{playwrightArgs:cn(u,s),forwardedPlaywrightArgs:s}),c,n);continue;case"docker":await an(c,p,l,cn(u,s),s);continue;case"docker-debug":await an(c,p,l,cn(u,s,["--debug"]),s);continue}if(r.blitz||r.next||d["@remix-run/dev"]||d.vite)switch(n.e2e){case"headed":await fe(await l.testE2EProduction(c,p,{playwrightArgs:cn(u,s,["--headed"]),forwardedPlaywrightArgs:s}),c,n);break;case"headed-dev":await fe(await l.testE2EDev(c,p,{playwrightArgs:cn(u,s,["--headed"]),forwardedPlaywrightArgs:s}),c,n);break;case"debug":await fe(await l.testE2EProduction(c,p,{playwrightArgs:cn(u,s,["--debug"]),forwardedPlaywrightArgs:s}),c,n);break;case"generate":await fe(await l.testE2EProduction(c,p,{playwrightArgs:["codegen",`http://localhost:${c.env.PORT}`]}),c,n);break;case"trace":await fe("BUN playwright show-trace",c,n)}}}async function an(e,t,n,r,o){e.env.WB_DOCKER||="1",await fe(`${n.buildDocker(e,"test")}${It(t)}`,e,t),process.exitCode=await fe(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:o}),e,t,{exitIfFailed:!1}),await fe(zt.stop(e),e,t)}function cn(e,t=[],n=[]){const r=Mt(t).length>0;return["test",...e.length>0||r?[]:["test/e2e/"],...n]}const dn={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 X(n);r||(console.error(d.red("No project found.")),process.exit(1));process.env.CI||="1",process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const o of r.descendants){const r=o.packageJson.dependencies??{},s=o.packageJson.devDependencies??{};let i;i=r.blitz?qt:r.next?Kt:s["@remix-run/dev"]?Qt:s.vite?Xt:Zt.some(e=>r[e])&&!r["firebase-functions"]?Gt:Ht,console.info(`Running "test-on-ci" for ${o.name} ...`);const a=o.hasDockerfile;if(a&&await he(zt.stopAll(),o,n),e.existsSync(t.join(o.dirPath,"test","unit"))&&await he(i.testUnit(o,n).replaceAll(" --allowOnly",""),o,n),e.existsSync(t.join(o.dirPath,"test","e2e"))){await he(await i.testStart(o,n),o,n),await ue.promiseAll(),a&&(o.env.WB_DOCKER||="1",await fe(`${i.buildDocker(o,"test")}${It(n)}`,o,n));const e=a?await i.testE2EDocker(o,n,{}):await i.testE2EProduction(o,n,{});process.exitCode=await fe(e.replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),a&&await fe(zt.stop(o),o,n)}}}(n)}};const ln={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}`);E(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},un={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(e){process.exit(await pn(e))}};async function pn(n){const r=await X(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&&(s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit"):((s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit"),s.packageJson.devDependencies?.pyright&&i.push("YARN pyright"));i.length>0;){const a=await he(i.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!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}return 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.")),a}const fn={...un,command:"tc"},hn={},mn={command:"verify-code",describe:"Verify project code",builder:hn,async handler(e){const t=Z(e,!1);t||(console.error(d.red("No project found.")),process.exit(1)),await bn(t.self,e)}},gn={command:"verify-code-with-tests",describe:"Verify project code and run tests",builder:hn,async handler(e){const t=Z(e,!1);t||(console.error(d.red("No project found.")),process.exit(1)),await bn(t.self,e),await async function(e,t){if(e.packageJson.scripts?.test?.includes("wb test"))return console.info("\n"+d.cyan(d.bold("Start:"),"test")),await sn({...t,_:["test"],e2e:"headless"}),void console.info(d.green(d.bold("Finished:"),"test"));await wn("test",`${re} test`,e,t)}(t.self,e)}};async function bn(e,t){await wn("install",`${re} install`,e,t,{silent:!0}),e.packageJson.scripts?.["gen-code"]&&await wn("gen-code",`${re} gen-code`,e,t,{silent:!0}),await yn("format",()=>We({...t,_:["lint"],format:!0}),{allowFailure:!0}),await yn("typecheck",()=>pn(t)),await yn("lint-fix",()=>We({...t,_:["lint"],fix:!0,quiet:!0}))}async function yn(e,t,n={}){console.info("\n"+d.cyan(d.bold("Start:"),e));const r=await t()??0;return 0===r||n.allowFailure?console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${r}):`),e)),process.exit(r)),r}async function wn(e,t,n,r,o={}){if(console.info("\n"+d.cyan(d.bold("Start:"),e)+d.gray(` at ${n.dirPath}`)),r.verbose&&console.info(d.gray(d.bold("Start (raw):"),t)),r.dryRun)return console.info(d.green(d.bold("Finished:"),e)),0;const s=await R(t,void 0,{cwd:n.dirPath,env:ye(n.env,{forceColor:!0}),shell:!0,stdio:o.silent?["ignore","ignore","inherit"]:"inherit",killOnExit:!0,verbose:r.verbose});return 0===s.status||o.allowFailure?console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${s.status}):`),e)),process.exit(s.status??1)),s.status??1}await n(r(process.argv)).scriptName("wb").options(ve).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(gn).command(mn).command(se).command(Ee).command(De).command(Me).command(nt).command(ht).command(Ot).command(Tt).command(tn).command(on).command(dn).command(ln).command(un).command(fn).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 vn=!1;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{if(!vn){vn=!0;try{E(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
|
|
10
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvdXRpbHMvc2hlbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC50cyIsIi4uL3NyYy9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyIsIi4uL3NyYy9jb21tYW5kcy9wcmlzbWEudHMiLCIuLi9zcmMvY29tbWFuZHMvcmV0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcG9ydC50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdE9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvdHJlZUtpbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ZlcmlmeUNvZGUudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52ID0ge1xuICBlbnY6IHtcbiAgICBkZXNjcmlwdGlvbjogJy5lbnYgZmlsZXMgdG8gYmUgbG9hZGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgJ2Nhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0Vudmlyb25tZW50IHRvIGxvYWQgY2FzY2FkaW5nIC5lbnYgZmlsZXMgKGUuZy4sIGAuZW52YCwgYC5lbnYuPGVudmlyb25tZW50PmAsIGAuZW52LmxvY2FsYCBhbmQgYC5lbnYuPGVudmlyb25tZW50Pi5sb2NhbGApLiBQcmVmZXJyZWQgb3ZlciBgY2FzY2FkZS1ub2RlLWVudmAgYW5kIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICAnY2FzY2FkZS1ub2RlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LiBQcmVmZXJyZWQgb3ZlciBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdhdXRvLWNhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PFdCX0VOViB8fCBOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdpbmNsdWRlLXJvb3QtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSAuZW52IGZpbGVzIGluIHJvb3QgZGlyZWN0b3J5IGlmIHRoZSBwcm9qZWN0IGlzIGluIGEgbW9ub3JlcG8gYW5kIC0tZW52IG9wdGlvbiBpcyBub3QgdXNlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnY2hlY2stZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ2hlY2sgd2hldGhlciB0aGUga2V5cyBvZiB0aGUgbG9hZGVkIC5lbnYgZmlsZXMgYXJlIHNhbWUgd2l0aCB0aGUgZ2l2ZW4gLmVudiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJy5lbnYuZXhhbXBsZScsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzLlxuICogTm90ZSBpdCBkb2VzIG5vdCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogQHJldHVybiBbZW52VmFycywgW2VudlBhdGhzLCBlbnZWYXJOYW1lc11bXV1cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIFtzdHJpbmcsIHN0cmluZ1tdXVtdXSB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLmZpbHRlcigoZW52UGF0aCkgPT4gZnMuZXhpc3RzU3luYyhlbnZQYXRoKSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlbGF0aXZlKGN3ZCwgZW52UGF0aCkpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cHJvY2Vzcy5lbnYuV0JfRU5WfSwgTk9ERV9FTlY6ICR7cHJvY2Vzcy5lbnYuTk9ERV9FTlZ9YCk7XG4gICAgY29uc29sZS5pbmZvKCdSZWFkaW5nIGVudiBmaWxlczonLCBlbnZQYXRocy5qb2luKCcsICcpKTtcbiAgfVxuXG4gIGNvbnN0IGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lczogW3N0cmluZywgc3RyaW5nW11dW10gPSBbXTtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudlBhdGggb2YgZW52UGF0aHMpIHtcbiAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGVudlBhdGgpKSkpIHtcbiAgICAgIGlmICghKGtleSBpbiBlbnZWYXJzKSAmJiAhKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbZW52UGF0aCwga2V5c10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYga2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtrZXlzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgfVxuICBpZiAoIWFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGBSZWFkIGVudiBmaWxlczogJHtlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMubWFwKChbZW52UGF0aCwga2V5c10pID0+IChrZXlzLmxlbmd0aCA+IDAgPyBgJHtlbnZQYXRofSAoJHtrZXlzLmpvaW4oJywgJyl9KWAgOiBlbnZQYXRoKSkuam9pbignLCAnKSB8fCAnbm90aGluZyd9YFxuICAgICk7XG4gIH1cblxuICBpZiAoYXJndi5jaGVja0Vudikge1xuICAgIGNvbnN0IGV4YW1wbGVLZXlzID0gT2JqZWN0LmtleXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgYXJndi5jaGVja0VudikpKTtcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IGV4YW1wbGVLZXlzLmZpbHRlcigoa2V5KSA9PiAhKGtleSBpbiBlbnZWYXJzKSAmJiAhKGtleSBpbiBwcm9jZXNzLmVudikpO1xuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIFske2VudlBhdGhzLmpvaW4oJywgJyl9XTogWyR7bWlzc2luZ0tleXMuam9pbignLCAnKX1dYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbZXhwYW5kKHsgcGFyc2VkOiBlbnZWYXJzLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8gZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzXTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzIGFuZCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG5jb25zdCBjYWNoZWRFbnZWYXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbmZ1bmN0aW9uIHJlYWRFbnZGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVkRW52VmFycy5nZXQoZmlsZVBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IHBhdGgucmVzb2x2ZShmaWxlUGF0aCksIHByb2Nlc3NFbnY6IHt9IH0pLnBhcnNlZCA/PyB7fTtcbiAgY2FjaGVkRW52VmFycy5zZXQoZmlsZVBhdGgsIHBhcnNlZCk7XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxhdGVkIHRvIG5wbSBhbmQgeWFybiBmcm9tIHRoZSBnaXZlbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogdm9pZCB7XG4gIC8vIFJlbW92ZSBucG0gJiB5YXJuIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHByb2Nlc3MuZW52XG4gIGlmIChlbnZWYXJzLlBBVEggJiYgZW52VmFycy5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52VmFycy5QQVRIID0gZW52VmFycy5QQVRILnJlcGxhY2UoYCR7ZW52VmFycy5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gbWFjT1NcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC9wcml2YXRlXFwvdmFyXFwvZm9sZGVyc1xcL1teOl0rOi9nLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcmllcyBpbiBMaW51eFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ZhclxcL3RtcFxcL1teOl0rOi9nLCAnJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC90bXBcXC9bXjpdKzovZywgJycpO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgY29uc3QgdXBwZXJLZXkgPSBrZXkudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoXG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdOUE1fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ1lBUk5fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ0JFUlJZXycpIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ1BST0pFQ1RfQ1dEJyB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdJTklUX0NXRCdcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBlbnZWYXJzW2tleV07XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNFcnJub0V4Y2VwdGlvbihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdjb2RlJyBpbiBlcnJvcjtcbn1cbiIsImltcG9ydCB7IGV4ZWNGaWxlU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IGlzRXJybm9FeGNlcHRpb24gfSBmcm9tICcuL2Vycm5vLmpzJztcbmltcG9ydCB7IGJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcCwgY29sbGVjdERlc2NlbmRhbnRQaWRzIGFzIGNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAgfSBmcm9tICcuL3Byb2Nlc3NUcmVlLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRyZWVLaWxsKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzID0gJ1NJR1RFUk0nKTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwaWQpIHx8IHBpZCA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBpZDogJHtwaWR9YCk7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGtpbGxUcmVlT25XaW5kb3dzKHBpZCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGVzY2VuZGFudHMgPSBjb2xsZWN0RGVzY2VuZGFudFBpZHMocGlkKTtcbiAgY29uc3QgdGFyZ2V0UGlkcyA9IHRvQ2hpbGRyZW5GaXJzdFBpZHMocGlkLCBkZXNjZW5kYW50cyk7XG4gIGZvciAoY29uc3QgdGFyZ2V0UGlkIG9mIHRhcmdldFBpZHMpIHtcbiAgICBraWxsSWZOZWVkZWQodGFyZ2V0UGlkLCBzaWduYWwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxJZk5lZWRlZChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwaWQsIHNpZ25hbCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsVHJlZU9uV2luZG93cyhwaWQ6IG51bWJlcik6IHZvaWQge1xuICB0cnkge1xuICAgIHJ1bkNvbW1hbmQoJ3Rhc2traWxsJywgWycvUElEJywgU3RyaW5nKHBpZCksICcvVCcsICcvRiddLCB7XG4gICAgICBtYXhCdWZmZXI6IDEwMjQgKiAxMDI0LFxuICAgICAgdGltZW91dDogMjAwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50UGlkcyhyb290UGlkOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBydW5Db21tYW5kKFxuICAgICdwcycsXG4gICAgWyctQW8nLCAncGlkPSxwcGlkPSddLFxuICAgIC8vIEtlZXAgY29tbWFuZCBib3VuZGVkIHNvIHdhdGNoLW1vZGUga2lsbCBsb29wcyBjYW5ub3QgaGFuZyB0aGlzIHBhdGguXG4gICAgeyBtYXhCdWZmZXI6IDEwMjQgKiAxMDI0LCB0aW1lb3V0OiAyMDAwIH1cbiAgKTtcbiAgY29uc3QgY2hpbGRyZW5CeVBhcmVudCA9IGJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcChzdGRvdXQpO1xuICByZXR1cm4gY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcChyb290UGlkLCBjaGlsZHJlbkJ5UGFyZW50KTtcbn1cblxuZnVuY3Rpb24gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQ6IG51bWJlciwgZGVzY2VuZGFudHM6IHJlYWRvbmx5IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCB0YXJnZXRQaWRzID0gZGVzY2VuZGFudHMudG9SZXZlcnNlZCgpO1xuICB0YXJnZXRQaWRzLnB1c2gocGlkKTtcbiAgcmV0dXJuIHRhcmdldFBpZHM7XG59XG5cbmZ1bmN0aW9uIHJ1bkNvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiB7IHRpbWVvdXQ6IG51bWJlcjsgbWF4QnVmZmVyOiBudW1iZXIgfVxuKTogeyBzdGRvdXQ6IHN0cmluZzsgc3RkZXJyOiBzdHJpbmcgfSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gZXhlY0ZpbGVTeW5jKGNvbW1hbmQsIFsuLi5hcmdzXSwge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIG1heEJ1ZmZlcjogb3B0aW9ucz8ubWF4QnVmZmVyLFxuICAgICAgdGltZW91dDogb3B0aW9ucz8udGltZW91dCxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBzdGRvdXQsIHN0ZGVycjogJycgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBzdGRlcnIgPSBleHRyYWN0U3RkZXJyKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgQ29tbWFuZEV4ZWN1dGlvbkVycm9yKGNvbW1hbmQsIGFyZ3MsIHN0ZGVyciwgdG9FeGl0Q29kZShlcnJvcikpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSAmJiBlcnJvci5jb2RlID09PSAnRVNSQ0gnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb21tYW5kRXhlY3V0aW9uRXJyb3IpIHtcbiAgICByZXR1cm4gL25vIHN1Y2ggcHJvY2Vzc3xub3QgZm91bmR8bm90IHJlY29nbml6ZWR8dGhlcmUgaXMgbm8gcnVubmluZyBpbnN0YW5jZS9pLnRlc3QoZXJyb3Iuc3RkZXJyKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHRvRXhpdENvZGUoZXJyb3I6IHVua25vd24pOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikpIHtcbiAgICByZXR1cm4gZXJyb3IuY29kZTtcbiAgfVxuICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnc3RhdHVzJyBpbiBlcnJvcikge1xuICAgIGNvbnN0IHN0YXR1cyA9IChlcnJvciBhcyB7IHN0YXR1czogdW5rbm93biB9KS5zdGF0dXM7XG4gICAgaWYgKHR5cGVvZiBzdGF0dXMgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gc3RhdHVzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0U3RkZXJyKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcgfHwgZXJyb3IgPT09IG51bGwgfHwgISgnc3RkZXJyJyBpbiBlcnJvcikpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBzdGRlcnIgPSAoZXJyb3IgYXMgUmVjb3JkPCdzdGRlcnInLCB1bmtub3duPikuc3RkZXJyO1xuICBpZiAodHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RkZXJyO1xuICB9XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RkZXJyKSkge1xuICAgIHJldHVybiBzdGRlcnIudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmNsYXNzIENvbW1hbmRFeGVjdXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvZGU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBzdGRlcnI6IHN0cmluZywgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgc3VwZXIoYENvbW1hbmQgZmFpbGVkOiAke2NvbW1hbmR9ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbW1hbmRFeGVjdXRpb25FcnJvcic7XG4gICAgdGhpcy5zdGRlcnIgPSBzdGRlcnI7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcChwc091dHB1dDogc3RyaW5nKTogTWFwPG51bWJlciwgbnVtYmVyW10+IHtcbiAgY29uc3QgY2hpbGRyZW5CeVBhcmVudCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXJbXT4oKTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHBzT3V0cHV0LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IG1hdGNoZWQgPSAvXlxccyooXFxkKylcXHMrKFxcZCspXFxzKiQvLmV4ZWMobGluZSk7XG4gICAgaWYgKCFtYXRjaGVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZFBpZCA9IE51bWJlcihtYXRjaGVkWzFdKTtcbiAgICBjb25zdCBwYXJlbnRQaWQgPSBOdW1iZXIobWF0Y2hlZFsyXSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50LmdldChwYXJlbnRQaWQpO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZFBpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkcmVuQnlQYXJlbnQuc2V0KHBhcmVudFBpZCwgW2NoaWxkUGlkXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGlsZHJlbkJ5UGFyZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlciwgY2hpbGRyZW5CeVBhcmVudDogTWFwPG51bWJlciwgbnVtYmVyW10+KTogbnVtYmVyW10ge1xuICBjb25zdCBkZXNjZW5kYW50czogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgcXVldWUgPSBbLi4uKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHJvb3RQaWQpID8/IFtdKV07XG4gIGxldCBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IHF1ZXVlLmxlbmd0aCkge1xuICAgIGNvbnN0IHBpZCA9IHF1ZXVlW2luZGV4XSBhcyBudW1iZXI7XG4gICAgaW5kZXggKz0gMTtcbiAgICBkZXNjZW5kYW50cy5wdXNoKHBpZCk7XG4gICAgcXVldWUucHVzaCguLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocGlkKSA/PyBbXSkpO1xuICB9XG4gIHJldHVybiBkZXNjZW5kYW50cztcbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgU3Bhd25PcHRpb25zLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG4gIFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlLFxuICBTcGF3blN5bmNSZXR1cm5zLFxuICBTdGRpb051bGwsXG4gIFN0ZGlvUGlwZSxcbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICcuL3RyZWVLaWxsLmpzJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgYmFzZWQgb24gU3Bhd25TeW5jUmV0dXJucyBidXQgd2l0aG91dCBvdXRwdXQgYW5kIGVycm9yIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBleHRlbmRpbmcgdmFyaW91cyBOb2RlLmpzIHNwYXduIG9wdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgLyoqIElucHV0IHN0cmluZyB0byB3cml0ZSB0byB0aGUgc3Bhd25lZCBwcm9jZXNzJ3Mgc3RkaW4gKi9cbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgb3V0cHV0IHdpbGwgYmUgbWVyZ2VkIGludG8gc3Rkb3V0ICovXG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhlIHNwYXduZWQgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBleGl0cyAqL1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGVuYWJsZXMgdmVyYm9zZSBsb2dnaW5nIG9mIHByb2Nlc3Mgb3BlcmF0aW9ucyAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZG91dCBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRvdXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZGVycj86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRvdXQpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3RkZXJyKSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0cmVlS2lsbChwcm9jLnBpZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvYy5waWR9KWAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBjbGVhbnVwU2lnbmFsczogTm9kZUpTLlNpZ25hbHNbXSA9XG4gICAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBbJ1NJR0lOVCcsICdTSUdURVJNJ10gOiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXTtcbiAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICAgIGNvbnN0IHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBbc2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoc2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWxIYW5kbGVycy5jbGVhcigpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGNsZWFudXBTaWduYWxzKSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlU2lnbmFsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgc3RvcFByb2Nlc3MoKTtcbiAgICAgICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MubGlzdGVuZXJDb3VudChzaWduYWwpID09PSAwKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIgfCBudWxsLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zPy5pbnB1dCkge1xuICAgICAgICBwcm9jLnN0ZGluPy53cml0ZShvcHRpb25zLmlucHV0KTtcbiAgICAgICAgcHJvYy5zdGRpbj8uZW5kKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiLyoqXG4gKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfVxuICpcbiAqIEB2ZXJzaW9uIDAuOS4zXG4gKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXVxuICogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5jb25zdCB0PVsuLi5cIjAxMjM0NTY3ODlhYmNkZWZcIl0scz1bNiwxNTM2LDM5MzIxNiwxMDA2NjMyOTZdLGk9WzAsOCwxNiwyNF0sZT1bMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF07ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbmV3IGgoNTEyLHMsNTEyKS51cGRhdGUodCkuaGV4KCl9Y29uc3Qgbj10PT57Y29uc3Qgcz1bXTtmb3IoY29uc3RbaSxlXW9mIHQuZW50cmllcygpKXNbaV09ZTtyZXR1cm4gc307Y2xhc3MgaHtibG9ja3M9W107cz1bXTtyZXNldD0hMDtmaW5hbGl6ZWQ9ITE7YmxvY2s9MDtzdGFydD0wO2xhc3RCeXRlSW5kZXg9MDtjb25zdHJ1Y3Rvcih0LHMsaSl7dGhpcy5wYWRkaW5nPXMsdGhpcy5vdXRwdXRCaXRzPWksdGhpcy5ibG9ja0NvdW50PTE2MDAtKHQ8PDEpPj41LHRoaXMuYnl0ZUNvdW50PXRoaXMuYmxvY2tDb3VudDw8Mix0aGlzLm91dHB1dEJsb2Nrcz1pPj41LHRoaXMuZXh0cmFCeXRlcz0oMzEmaSk+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+W2UuaHJlZl0sY3JlYXRlOihbZV0pPT5uZXcgVVJMKGUpfTtyZXR1cm4gbmV3IE1hcChbZSx0LHMsbyxyLGMsZF0ubWFwKGU9PltlLmluc3RhbmNlLm5hbWUsZV0pKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpO2V4cG9ydHt0IGFzIEdMT0JBTF9DT05TVFJVQ1RPUl9NQVAsZSBhcyBQTEFJTl9PQkpFQ1RfTEFCRUx9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RydWN0b3JzLmpzLm1hcFxuIiwiaW1wb3J0e0dMT0JBTF9DT05TVFJVQ1RPUl9NQVAgYXMgdCxQTEFJTl9PQkpFQ1RfTEFCRUwgYXMgbn1mcm9tXCIuL2NvbnN0cnVjdG9ycy5qc1wiO2NvbnN0IGU9LTEscj0tMixvPS0zLGk9LTQscz0tNSxjPS02O2Z1bmN0aW9uIGYobj12b2lkIDAsZT10KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYShuLGUpKX1mdW5jdGlvbiB1KHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuLTE7aWYoXCJudW1iZXJcIj09dHlwZW9mIHQpe2lmKE51bWJlci5pc05hTih0KSlyZXR1cm4tMztpZighTnVtYmVyLmlzRmluaXRlKHQpKXJldHVybiB0PDA/LTU6LTR9cmV0dXJuIG51bGx9Y29uc3QgbD1bXTtmdW5jdGlvbiBhKGUscj10KXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87Y29uc3QgaT1bXSxzPW5ldyBNYXA7cmV0dXJuIGZ1bmN0aW9uIHQoZSl7Y29uc3Qgbz11KGUpO2lmKG51bGwhPT1vKXJldHVybiBvO2xldCBjPXMuZ2V0KGUpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7c3dpdGNoKGM9aS5sZW5ndGgsdHlwZW9mIGUpe2Nhc2VcIm51bWJlclwiOmNhc2VcInN0cmluZ1wiOmNhc2VcImJvb2xlYW5cIjppW2NdPWUscy5zZXQoZSxjKTticmVhaztjYXNlXCJiaWdpbnRcIjppW2NdPVstNixlLnRvU3RyaW5nKDE2KV0scy5zZXQoZSxjKTticmVhaztjYXNlXCJvYmplY3RcIjppZihudWxsPT09ZSlpW2NdPWUscy5zZXQoZSxjKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkoZSkpe2NvbnN0IG49ZnVuY3Rpb24odCl7aWYobC5sZW5ndGg8dCl7Y29uc3Qgbj1sLmxlbmd0aDtsLmxlbmd0aD10LGwuZmlsbCgtMixuLHQpfXJldHVybiBsLnNsaWNlKDAsdCl9KGUubGVuZ3RoKTtpW2NdPW4scy5zZXQoZSxjKTtmb3IoY29uc3RbcixvXW9mIGUuZW50cmllcygpKW5bcl09dChvKX1lbHNle2NvbnN0W28sZl09ZnVuY3Rpb24odCxlKXtjb25zdCByPXQuY29uc3RydWN0b3I7aWYoXCJmdW5jdGlvblwiPT10eXBlb2Ygcil7Y29uc3Qgbj1yLm5hbWUsbz1lLmdldChuKTtpZih2b2lkIDAhPT1vKXJldHVybltuLG8uZnJvbSh0KV19Y29uc3Qgbz1PYmplY3QuZW50cmllcyh0KSxpPW8ubGVuZ3RoLHM9QXJyYXkuZnJvbSh7bGVuZ3RoOmkraX0pO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IG49b1t0XSxlPXQrdDtzW2VdPW5bMF0sc1tlKzFdPW5bMV19cmV0dXJuW24sc119KGUsciksdT1mLmxlbmd0aCxsPUFycmF5LmZyb20oe2xlbmd0aDp1KzF9KTtsWzBdPW8saVtjXT1sLHMuc2V0KGUsYyk7Zm9yKGxldCBuPTA7bjx1O24rKylsW24rMV09dChmW25dKX19cmV0dXJuIGN9KGUpLGl9ZXhwb3J0e3IgYXMgQVJSQVlfSE9MRV9JTkRFWCxjIGFzIEJJR19JTlRfTEFCRUwsbyBhcyBOQU5fSU5ERVgscyBhcyBORUdfSU5GX0lOREVYLGkgYXMgUE9TX0lORl9JTkRFWCxlIGFzIFVOREVGSU5FRF9JTkRFWCxhIGFzIGxpc3RpZnksZiBhcyBzdHJpbmdpZnl9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5naWZ5LmpzLm1hcFxuIiwiaW1wb3J0e3NoYTNfNTEyIGFzIHJ9ZnJvbVwiLi9oYXNoLmpzXCI7aW1wb3J0e3N0cmluZ2lmeSBhcyBufWZyb21cIi4vb3Nvbi9zdHJpbmdpZnkuanNcIjtmdW5jdGlvbiBvKG8sdCl7cmV0dXJuIHIobihbbyx0XSkpfWZ1bmN0aW9uIHQocixvKXtyZXR1cm4gbihbcixvXSl9ZnVuY3Rpb24gaSgpe3JldHVyblwiXCJ9ZXhwb3J0e2kgYXMgZ2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nLG8gYXMgZ2V0Q2FjaGVLZXlPZkhhc2gsdCBhcyBnZXRDYWNoZUtleU9mU3RyaW5naWZpZWR9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0Q2FjaGVLZXkuanMubWFwXG4iLCJpbXBvcnR7Z2V0Q2FjaGVLZXlPZkhhc2ggYXMgdCxnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcgYXMgZX1mcm9tXCIuL2dldENhY2hlS2V5LmpzXCI7Y29uc3Qgbj1yKHtnZXRDYWNoZUtleTp0fSksYz1yKHtnZXRDYWNoZUtleTplfSk7ZnVuY3Rpb24gcih7Y2FjaGVEdXJhdGlvbjplPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxnZXRDYWNoZUtleTpuPXR9PXt9KXtyZXR1cm4gZnVuY3Rpb24odCxjKXtsZXQgcixvLGk7cmV0dXJuXCJnZXR0ZXJcIj09PWM/LmtpbmQ/ZnVuY3Rpb24oKXtjb25zdCBjPW4odGhpcyxbXSksYT1EYXRlLm5vdygpO3JldHVybihpIT09Y3x8YS1vPmUpJiYoaT1jLHI9dC5jYWxsKHRoaXMpLG89YSkscn06ZnVuY3Rpb24oLi4uYSl7Y29uc3QgdT1uKHRoaXMsYSksaD1EYXRlLm5vdygpO3JldHVybihpIT09dXx8aC1vPmUpJiYoaT11LHI9Yz90LmNhbGwodGhpcywuLi5hKTp0KC4uLmEpLG89aCkscn19fWV4cG9ydHtuIGFzIG1lbW9pemVPbmUsciBhcyBtZW1vaXplT25lRmFjdG9yeSxjIGFzIG1lbW9pemVPbmVXaXRoRW1wdHlIYXNofTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9pemVPbmUuanMubWFwXG4iLCJleHBvcnQgZnVuY3Rpb24gaXNDSShjaUVudjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWNpRW52ICYmIGNpRW52ICE9PSAnMCcgJiYgY2lFbnYgIT09ICdmYWxzZSc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyBtZW1vaXplT25lIH0gZnJvbSAnYXQtZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBnbG9iYnkgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuL3V0aWxzL2NpLmpzJztcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcm0gPSAncHJpc21hJyB8ICdkcml6emxlJztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAvKF58XFxuKWJ1blxccy8udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgID8gJ1lBUk4gcnVuIGJ1aWxkJ1xuICAgICAgOiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkXG4gICAgICAgID8gYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke3RoaXMuYXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gXG4gICAgICAgIDogXCJlY2hvICdObyBidWlsZCBzY3JpcHQnXCI7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXRoaXMubG9hZEVudikgcmV0dXJuIHByb2Nlc3MuZW52O1xuXG4gICAgY29uc3QgW2VudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmFyZ3YsIHRoaXMuZGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBbZW52UGF0aCwgY291bnRdIG9mIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYExvYWRlZCAke2NvdW50fSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IC4uLmVudlZhcnMsIC4uLnByb2Nlc3MuZW52IH07XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLnBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb25QYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbigncHJpc21hJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRHJpenpsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCdkcml6emxlLW9ybScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRhdGFiYXNlT3JtKCk6IERhdGFiYXNlT3JtIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNQcmlzbWEpIHJldHVybiAncHJpc21hJztcbiAgICBpZiAodGhpcy5oYXNEcml6emxlKSByZXR1cm4gJ2RyaXp6bGUnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNWaXRlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy52aXRlc3QgPz8gdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnZpdGVzdCk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzQmlvbWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgnQGJpb21lanMvYmlvbWUnKSB8fCB0aGlzLmhhc0RlcGVuZGVuY3koJ2Jpb21lJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRXNsaW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ2VzbGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094bGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGxpbnQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNPeGZtdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGZtdCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BvZXRyeUxvY2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwb2V0cnkubG9jaycpKVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHVic3BlY1lhbWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSB8fFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdiaW9tZScgfCAnb3hsaW50JyB8ICdlc2xpbnQnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNCaW9tZSkgcmV0dXJuICdiaW9tZSc7XG4gICAgaWYgKHRoaXMuaGFzT3hsaW50KSByZXR1cm4gJ294bGludCc7XG4gICAgaWYgKHRoaXMuaGFzRXNsaW50KSByZXR1cm4gJ2VzbGludCc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BsYXl3cmlnaHRDb25maWcoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0NJKHRoaXMuZW52LkNJKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdQYXRoID0gdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICAgIHJldHVybiAvXFxid2ViU2VydmVyXFxiLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSA9PT0gdGhpcy5kaXJQYXRoXG4gICAgICA/IHRoaXMucGFja2FnZUpzb25cbiAgICAgIDogKEpTT04ucGFyc2UoXG4gICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICAgICkgYXMgUGFja2FnZUpzb24pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJpbkV4aXN0cygpOiBib29sZWFuIHtcbiAgICBsZXQgYmluRm91bmQgPSBmYWxzZTtcbiAgICBsZXQgY3VycmVudFBhdGggPSB0aGlzLmRpclBhdGg7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgYmluUGF0aCA9IHBhdGguam9pbihjdXJyZW50UGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhiaW5QYXRoKSkge1xuICAgICAgICB0aGlzLmVudi5QQVRIID0gYCR7YmluUGF0aH06JHt0aGlzLmVudi5QQVRIfWA7XG4gICAgICAgIGJpbkZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnLmdpdCcpKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgICAgaWYgKGN1cnJlbnRQYXRoID09PSBwYXJlbnRQYXRoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY3VycmVudFBhdGggPSBwYXJlbnRQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gYmluRm91bmQ7XG4gIH1cblxuICBmaW5kRmlsZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgZmlsZVBhdGggPSB0aGlzLnBhdGhCeU5hbWUuZ2V0KGZpbGVOYW1lKTtcbiAgICBpZiAoZmlsZVBhdGgpIHJldHVybiBmaWxlUGF0aDtcblxuICAgIGZpbGVQYXRoID0gW2ZpbGVOYW1lLCBwYXRoLmpvaW4oJy4uJywgJy4uJywgZmlsZU5hbWUpXVxuICAgICAgLm1hcCgocCkgPT4gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgcCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlTmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5wYXRoQnlOYW1lLnNldChmaWxlTmFtZSwgZmlsZVBhdGgpO1xuICAgIHJldHVybiBmaWxlUGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzRGVwZW5kZW5jeShwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZSkgPz8gdGhpcy5nZXREZXBlbmRlbmN5VmVyc2lvbih0aGlzLnJvb3RQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWUpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGVwZW5kZW5jeVZlcnNpb24odGhpcy5wYWNrYWdlSnNvbiwgcGFja2FnZU5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghcGFja2FnZUpzb24pIHJldHVybjtcblxuICAgIHJldHVybiAoXG4gICAgICBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgcHJpdmF0ZSBnZXQgcm9vdFBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yb290RGlyUGF0aCA9PT0gdGhpcy5kaXJQYXRoKSByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbjtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFt3Yl0gRmFpbGVkIHRvIHJlYWQgb3IgcGFyc2UgJHtwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpfWAsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID1cbiAgLy8gRGV0ZWN0IGBidW4gLS1idW4gcnVuIHdiIC4uLmAuIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gIHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8XG4gIC8vIERldGVjdCBgYnVuIHJ1biB3YiAuLi5gLlxuICBwcm9jZXNzLmFyZ3ZbMF0/LmVuZHNXaXRoKCcvYnVuJykgfHxcbiAgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQmluYXJ5TGlrZSwgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGJ1aWxkQ29tbWFuZCA9XG4gICAgYXJndi5jb21tYW5kID8/XG4gICAgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQgPyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFidWlsZENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1NraXAgdG8gYnVpbGQgYmVjYXVzZSBubyBidWlsZCBjb21tYW5kIGlzIGRlZmluZWQuJykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBidWlsZENvbW1hbmQgfTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50SGFzaCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICByZXR1cm4gW2NhY2hlZENvbnRlbnRIYXNoID09PSBjb250ZW50SGFzaCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5jb25zdCBpbmNsdWRlUGF0dGVybnMgPSBbJ3NyYy8nLCAncHVibGljLyddO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuXTtcbmNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IFsndGVzdC8nLCAndGVzdHMvJywgJ19fdGVzdHNfXy8nLCAndGVzdC1maXh0dXJlcy8nLCAndGVzdC9maXh0dXJlcy8nXTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJ10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IGxpbmVzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSBsaW5lc1xuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZSgyKS50cmltKCkpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biwgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgY2k/OiBib29sZWFuO1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xuICBvblNpZ25hbD86IChzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4gdm9pZDtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChyYXcpJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cyk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSk7XG4gIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcmV0LnN0YXR1cywgb3B0cyk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcmV0LnN0YXR1cywgb3B0cyk7XG4gICAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBjYXBpdGFsaXplZCBjb21tYW5kcyAoZS5nLiwgWUFSTiwgUFJJU01BLCBCVU4pIHdpdGggc3VpdGFibGUgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB7IHByaW50YWJsZTogc3RyaW5nOyBydW5uYWJsZTogc3RyaW5nIH0ge1xuICBsZXQgbmV3U2NyaXB0ID0gc2NyaXB0XG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXHNcXHMrL2csICcgJylcbiAgICAucmVwbGFjZUFsbChcbiAgICAgICdQUklTTUEgZ2VuZXJhdGUgJyxcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdQUklTTUEgZ2VuZXJhdGUgJyA6ICdQUklTTUEgZ2VuZXJhdGUgLS1uby1oaW50cyAnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuIC0tYnVuKSBydW5gXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4gJyA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKVxuICAgICAgLnJlcGxhY2VBbGwoLyg/OllBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAvLyAnLS1hbGxvd09ubHknIGlzIHNvbWV0aW1lcyByZW1vdmVkLlxuICAgICAgLnJlcGxhY2VBbGwoLyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzKD86IC0tYWxsb3dPbmx5KT8vZywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQobmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKSk7XG4gIGNvbnN0IHJ1bm5hYmxlU2NyaXB0ID0gZml4QnVuQ29tbWFuZChcbiAgICBuZXdTY3JpcHRcbiAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW4gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiAnLCAhaXNSdW5uaW5nT25CdW4gJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYClcbiAgKTtcbiAgLy8gQWRkIGNhc2NhZGUgb3B0aW9uIHdoZW4gV0JfRU5WIGlzIGRlZmluZWRcbiAgY29uc3QgY2FzY2FkZU9wdGlvbiA9IHByb2plY3QuZW52LldCX0VOViA/IGAgLWM9JHtwcm9qZWN0LmVudi5XQl9FTlYgfHwgJ2RldmVsb3BtZW50J31gIDogJyc7XG4gIHJldHVybiB7XG4gICAgcHJpbnRhYmxlOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiR7Y2FzY2FkZU9wdGlvbn0gLS0gJHtwcmludGFibGVTY3JpcHR9YCxcbiAgICBydW5uYWJsZTogcnVubmFibGVTY3JpcHQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCwgcHJlZml4ID0gJ1N0YXJ0Jywgd2VhayA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhcbiAgICAnXFxuJyArXG4gICAgICAod2VhayA/IGNoYWxrLmdyYXkgOiBjaGFsay5jeWFuKShjaGFsay5ib2xkKGAke3ByZWZpeH06YCksIG5vcm1hbGl6ZWRTY3JpcHQpICtcbiAgICAgIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsLFxuICBvcHRzOiBPbWl0PE9wdGlvbnMsICd0aW1lb3V0Jz5cbik6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIHNjcmlwdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOiBgKSwgc2NyaXB0KSk7XG4gICAgaWYgKG9wdHMuZXhpdElmRmFpbGVkICE9PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlID8/IDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlRW52KFxuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdHM6IE9wdGlvbnNcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0Vudi5DSSA9ICcxJztcbiAgfVxuICBpZiAob3B0cy5mb3JjZUNvbG9yKSB7XG4gICAgbmV3RW52LkZPUkNFX0NPTE9SID0gJzMnO1xuICB9XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbmZ1bmN0aW9uIGZpeEJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvMTQzNTlcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJ25leHQgZGV2JykgfHxcbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy84MjIyXG4gICAgY29tbWFuZC5pbmNsdWRlcygncGxheXdyaWdodCcpIHx8XG4gICAgLy8gXCJidW4gLS1idW4gcHJpc21hIGdlbmVyYXRlXCIgZG9lc24ndCB3b3JrXG4gICAgY29tbWFuZC5pbmNsdWRlcygncHJpc21hJykgfHxcbiAgICBjb21tYW5kLmluY2x1ZGVzKCd0ZXN0L2UyZS1hZGRpdGlvbmFsJylcbiAgICA/IGNvbW1hbmQucmVwbGFjZUFsbCgnYnVuIC0tYnVuJywgJ2J1bicpXG4gICAgOiBjb21tYW5kO1xufVxuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBvcHRpb25OYW1lIG9mIE9iamVjdC5rZXlzKHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRPcHRpb25WYWx1ZShhcmd2LCBvcHRpb25OYW1lKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGFyZ3MucHVzaCh2YWx1ZSA/IGAtLSR7b3B0aW9uTmFtZX1gIDogYC0tJHtvcHRpb25OYW1lfT1mYWxzZWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7dmFsdWV9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHtpdGVtfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gYXJncztcbn1cblxuZnVuY3Rpb24gZ2V0T3B0aW9uVmFsdWUoYXJndjogRW52UmVhZGVyT3B0aW9ucywgb3B0aW9uTmFtZTogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGNhbWVsQ2FzZU9wdGlvbk5hbWUgPSBvcHRpb25OYW1lLnJlcGxhY2VBbGwoLy0oW2Etel0pL2csIChfLCBjaGFyYWN0ZXI6IHN0cmluZykgPT4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCkpO1xuICBjb25zdCBvcHRpb25zID0gYXJndiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIG9wdGlvbnNbb3B0aW9uTmFtZV0gPz8gb3B0aW9uc1tjYW1lbENhc2VPcHRpb25OYW1lXTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52LCBub3JtYWxpemVTY3JpcHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgRk9SQ0VfS0lMTF9ERUxBWV9NUyA9IDUwMDA7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdraWxsLW90aGVycyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBleGl0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAna2lsbC1vdGhlcnMtb24tZmFpbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBmYWlscycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzdWNjZXNzOiB7XG4gICAgZGVzY3JpcHRpb246ICdEZWZpbmUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIGNyaXRlcmlhJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbJ2FsbCcsICdmaXJzdCddLFxuICAgIGRlZmF1bHQ6ICdhbGwnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NvbW1hbmRzIHRvIHJ1biBjb25jdXJyZW50bHknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5pbnRlcmZhY2UgUnVuQ29uY3VycmVudGx5T3B0aW9ucyB7XG4gIGNvbW1hbmRzOiBzdHJpbmdbXTtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAga2lsbE90aGVyczogYm9vbGVhbjtcbiAga2lsbE90aGVyc09uRmFpbDogYm9vbGVhbjtcbiAgc3VjY2VzczogJ2FsbCcgfCAnZmlyc3QnO1xuICBjaT86IGJvb2xlYW47XG4gIGZvcmNlQ29sb3I/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgY29uY3VycmVudGx5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2NvbmN1cnJlbnRseSA8Y29tbWFuZHMuLi4+JyxcbiAgZGVzY3JpYmU6ICdSdW4gY29tbWFuZHMgY29uY3VycmVudGx5JyxcbiAgYnVpbGRlcjogeyAuLi5zaGFyZWRPcHRpb25zQnVpbGRlciwgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZHMgPSAoYXJndi5jb21tYW5kcyA/PyBbXSkubWFwKFN0cmluZykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChjb21tYW5kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBjb21tYW5kcyBwcm92aWRlZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuQ29uY3VycmVudGx5KHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGtpbGxPdGhlcnM6IGFyZ3Yua2lsbE90aGVycyA/PyBmYWxzZSxcbiAgICAgICAga2lsbE90aGVyc09uRmFpbDogYXJndi5raWxsT3RoZXJzT25GYWlsID8/IGZhbHNlLFxuICAgICAgICBzdWNjZXNzOiBhcmd2LnN1Y2Nlc3MsXG4gICAgICAgIGNpOiB0eXBlb2YgYXJndi5jaSA9PT0gJ2Jvb2xlYW4nID8gYXJndi5jaSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZm9yY2VDb2xvcjogdHlwZW9mIGFyZ3YuZm9yY2VDb2xvciA9PT0gJ2Jvb2xlYW4nID8gYXJndi5mb3JjZUNvbG9yIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ29uY3VycmVudGx5KG9wdGlvbnM6IFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBjaGlsZHJlbiA9IG9wdGlvbnMuY29tbWFuZHMubWFwKChjb21tYW5kKSA9PlxuICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd24obm9ybWFsaXplU2NyaXB0KGNvbW1hbmQsIG9wdGlvbnMucHJvamVjdCkucnVubmFibGUsIHtcbiAgICAgIGN3ZDogb3B0aW9ucy5wcm9qZWN0LmRpclBhdGgsXG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIGVudjogY29uZmlndXJlRW52KG9wdGlvbnMucHJvamVjdC5lbnYsIHsgY2k6IG9wdGlvbnMuY2ksIGZvcmNlQ29sb3I6IG9wdGlvbnMuZm9yY2VDb2xvciB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KVxuICApO1xuXG4gIGxldCBzdG9wcGluZyA9IGZhbHNlO1xuICBsZXQgaW50ZXJydXB0ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBsZXQgZmlyc3RSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0b3BSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZm9yY2VLaWxsUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBjb25zdCByZXN1bHRzID0gQXJyYXkuZnJvbTxudW1iZXIgfCB1bmRlZmluZWQ+KHsgbGVuZ3RoOiBjaGlsZHJlbi5sZW5ndGggfSk7XG4gIGNvbnN0IHdhaXRGb3JFeGl0UHJvbWlzZXMgPSBjaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHNldHRsZSA9IChleGl0Q29kZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG5cbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0gZXhpdENvZGU7XG4gICAgICAgIGZpcnN0UmVzdWx0ID8/PSBleGl0Q29kZTtcblxuICAgICAgICBpZiAoIXN0b3BwaW5nICYmIHNob3VsZFN0b3BPdGhlcnMoZXhpdENvZGUsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgc3RvcFJlc3VsdCA9IGV4aXRDb2RlO1xuICAgICAgICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICAgICAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCAnU0lHVEVSTScpKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgICAgIHNldHRsZSgxKTtcbiAgICAgIH0pO1xuICAgICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgc2V0dGxlKGdldEV4aXRDb2RlKGNvZGUgPz8gdW5kZWZpbmVkLCBzaWduYWwgPz8gdW5kZWZpbmVkKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3Qgc3RvcEFsbCA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgaW50ZXJydXB0ZWRTaWduYWwgPz89IHNpZ25hbDtcbiAgICBpZiAoc3RvcHBpbmcpIHJldHVybjtcblxuICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCBzaWduYWwpKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lnaW50ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR0lOVCcpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWd0ZXJtID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1RFUk0nKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lncXVpdCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdRVUlUJyk7XG4gIH07XG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgcHJvY2Vzcy5vbignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB0cnkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3JFeGl0UHJvbWlzZXMpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGZvcmNlS2lsbFByb21pc2VzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIH1cblxuICBpZiAoaW50ZXJydXB0ZWRTaWduYWwpIHtcbiAgICByZXR1cm4gZ2V0RXhpdENvZGUodW5kZWZpbmVkLCBpbnRlcnJ1cHRlZFNpZ25hbCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnKSB7XG4gICAgcmV0dXJuIGZpcnN0UmVzdWx0ID8/IDE7XG4gIH1cbiAgaWYgKHN0b3BSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdG9wUmVzdWx0O1xuICB9XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpdENvZGUoY29kZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjb2RlO1xuICB9XG4gIGlmIChzaWduYWwgJiYgc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSB7XG4gICAgcmV0dXJuIDEyOCArIGNvbnN0YW50cy5zaWduYWxzW3NpZ25hbF07XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN0b3BPdGhlcnMoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIG9wdGlvbnM6IFBpY2s8UnVuQ29uY3VycmVudGx5T3B0aW9ucywgJ2tpbGxPdGhlcnMnIHwgJ2tpbGxPdGhlcnNPbkZhaWwnIHwgJ3N1Y2Nlc3MnPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcgfHwgb3B0aW9ucy5raWxsT3RoZXJzIHx8IChvcHRpb25zLmtpbGxPdGhlcnNPbkZhaWwgJiYgZXhpdENvZGUgIT09IDApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmb3JjZUtpbGxQaWRzID0gc2lnbmFsUGlkcyh0b0NoaWxkUGlkcyhjaGlsZHJlbiksIHNpZ25hbCk7XG4gIGlmIChmb3JjZUtpbGxQaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGlmIChhd2FpdCB3YWl0Rm9yRm9yY2VLaWxsKGZvcmNlS2lsbFBpZHMpKSB7XG4gICAgc2lnbmFsUGlkcyhmb3JjZUtpbGxQaWRzLCAnU0lHS0lMTCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRQaWRzKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdKTogbnVtYmVyW10ge1xuICByZXR1cm4gY2hpbGRyZW4uZmxhdE1hcCgoY2hpbGQpID0+IChjaGlsZC5waWQgPT09IHVuZGVmaW5lZCA/IFtdIDogW2NoaWxkLnBpZF0pKTtcbn1cblxuZnVuY3Rpb24gc2lnbmFsUGlkcyhwaWRzOiByZWFkb25seSBudW1iZXJbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IG51bWJlcltdIHtcbiAgY29uc3Qgc2lnbmFsZWRQaWRzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBpZCBvZiBwaWRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICgha2lsbFByb2Nlc3NHcm91cChwaWQsIHNpZ25hbCkpIGNvbnRpbnVlO1xuXG4gICAgICBzaWduYWxlZFBpZHMucHVzaChwaWQpO1xuICAgICAgdHJlZUtpbGwocGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBraWxsIGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2lnbmFsZWRQaWRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yRm9yY2VLaWxsKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEZPUkNFX0tJTExfREVMQVlfTVM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICBpZiAocGlkcy5ldmVyeShpc1Byb2Nlc3NHcm91cEdvbmUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCBzbGVlcChNYXRoLm1pbigxMDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSkpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1Byb2Nlc3NHcm91cEdvbmUocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgMCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG5mdW5jdGlvbiBraWxsUHJvY2Vzc0dyb3VwKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsIHNpZ25hbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJztcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuY29uc3Qga2lsbFBvcnRJZk5vbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qga2lsbFBvcnRJZk5vbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdraWxsLXBvcnQtaWYtbm9uLWNpJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBwb3J0IHNwZWNpZmllZCBieSBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIG5vbi1DSS4nLFxuICBidWlsZGVyOiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBraWxsUG9ydElmTm9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRJZk5vbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChpc0NJKHByb2plY3QuZW52LkNJKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBraWxsaW5nIHBvcnQgZHVlIHRvIENJOiAke3Byb2plY3QuZW52LkNJfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBvcnRFbnYgPSBwcm9qZWN0LmVudi5QT1JUO1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocG9ydCkgfHwgcG9ydCA8PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oYEtpbGxpbmcgdGhlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnKSkuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bmFtZX09JHtzaGVsbEVzY2FwZUFyZ3VtZW50KHZhbHVlKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hlbGxFc2NhcGVBcmd1bWVudChhcmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXltcXHcuLzo9LEAlKy1dKyQvdS50ZXN0KGFyZykgPyBhcmcgOiBgJyR7YXJnLnJlcGxhY2VBbGwoXCInXCIsIGAnXCInXCInYCl9J2A7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHF1aWV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZXBvcnQgZXJyb3JzIG9ubHknLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBmaWxlczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhzIHRvIGxpbnQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPFxuICB0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlclxuPjtcbmV4cG9ydCB0eXBlIExpbnRDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxMaW50Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogdW5rbm93bltdOyBfOiB1bmtub3duW10gfTtcblxuY29uc3QgYmlvbWVFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdhc3RybycsXG4gICdjanMnLFxuICAnY3NzJyxcbiAgJ2N0cycsXG4gICdncWwnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzdmVsdGUnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IGVzbGludEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICd0cycsICd0c3gnXSk7XG5jb25zdCBveGxpbnRFeHRlbnNpb25zID0gbmV3IFNldChbLi4uZXNsaW50RXh0ZW5zaW9ucywgJ2FzdHJvJywgJ3N2ZWx0ZScsICd2dWUnXSk7XG5jb25zdCBweXRob25FeHRlbnNpb25zID0gbmV3IFNldChbJ3B5J10pO1xuY29uc3QgZGFydEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnZGFydCddKTtcbmNvbnN0IG94Zm10RXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAuLi5veGxpbnRFeHRlbnNpb25zLFxuICAnY3NzJyxcbiAgJ2dxbCcsXG4gICdncmFwaHFsJyxcbiAgJ2hicycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2xlc3MnLFxuICAnbWQnLFxuICAnbWR4JyxcbiAgJ3Njc3MnLFxuICAndG9tbCcsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnY2pzJyxcbiAgJ2NzcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnamF2YScsXG4gICdqcycsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2pzeCcsXG4gICdtZCcsXG4gICdtanMnLFxuICAnbXRzJyxcbiAgJ3Njc3MnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyT25seUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmZpbHRlcigoZXh0KSA9PiAhYmlvbWVFeHRlbnNpb25zLmhhcyhleHQpKSk7XG5jb25zdCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuID0gJyEqKi90ZXN0ey0sL31maXh0dXJlcy8qKic7XG5cbmV4cG9ydCBjb25zdCBsaW50Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBMaW50Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IGxpbnQoYXJndiBhcyBMaW50Q29tbWFuZEFyZ3YpO1xuICAgIGlmIChleGl0Q29kZSkgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW50KGFyZ3Y6IExpbnRDb21tYW5kQXJndik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gZ2V0TGludFRhcmdldEZpbGVzKGFyZ3YpO1xuICBjb25zdCBsaW50RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3Qgb3hmbXRGaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBweXRob25GaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHJldHRpZXJGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VKc29uRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IGZhbHNlO1xuICBsZXQgcHJldHRpZXJBcmdzOiBzdHJpbmdbXTtcbiAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3M6IHN0cmluZ1tdO1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbnRUYXJnZXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZSk7XG4gICAgICAgIGNvbnN0IGZpbGVLaW5kID0gYXdhaXQgZ2V0TGludFRhcmdldEZpbGVLaW5kKGZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIHsgZmlsZUtpbmQsIGZpbGVQYXRoIH07XG4gICAgICB9KVxuICAgICk7XG4gICAgZm9yIChjb25zdCB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9IG9mIGxpbnRUYXJnZXRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpIHx8XG4gICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC9maXh0dXJlcy8nKSB8fFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goLi4uZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKHByb2plY3RzLmRlc2NlbmRhbnRzLCBmaWxlUGF0aCwgZmlsZUtpbmQpKTtcblxuICAgICAgZm9yIChjb25zdCB7IGxpbnRQYXRoLCBwcm9qZWN0IH0gb2YgZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSkge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgcHl0aG9uRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBweXRob25GaWxlUGF0aHMgPSBweXRob25GaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIHB5dGhvbkZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIHB5dGhvbkZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwgJiYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBkYXJ0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBkYXJ0RmlsZVBhdGhzID0gZGFydEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgZGFydEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzKTtcbiAgICAgICAgICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdiaW9tZScgfHxcbiAgICAgICAgICBmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHxcbiAgICAgICAgICBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdCwgZXh0ZW5zaW9uKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBsaW50RmlsZVBhdGhzID0gbGludEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgbGludEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBsaW50RmlsZVBhdGhzKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGZvcm1hdHRlclBhdGggb2YgYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MocHJvamVjdCwgbGludFBhdGgsIGZpbGVLaW5kLCBleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkge1xuICAgICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHByZXR0aWVyRmlsZVBhdGhzLnB1c2goZm9ybWF0dGVyUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCAmJiBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbikgJiYgIXByb2plY3QucHJlZmVycmVkTGludGVyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE5vIGxpbnRlciBmb3VuZCBmb3IgJHtwcm9qZWN0Lm5hbWV9LiBJbnN0YWxsIEVTTGludCBvciBCaW9tZS5gKSk7XG4gICAgICAgICAgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJldHRpZXJBcmdzID0gWy4uLm5ldyBTZXQocHJldHRpZXJGaWxlUGF0aHMpXTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gWy4uLm5ldyBTZXQocGFja2FnZUpzb25GaWxlUGF0aHMpXTtcbiAgfSBlbHNlIHtcbiAgICBwcmV0dGllckFyZ3MgPSBidWlsZFByZXR0aWVyQXJncyhwcm9qZWN0cy5zZWxmLmRpclBhdGgsIHByb2plY3RzLmRlc2NlbmRhbnRzKTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwKSA9PiBwLnBhY2thZ2VKc29uUGF0aCk7XG4gIH1cblxuICBjb25zdCBsaW50UHJvbWlzZXM6IFByb21pc2U8bnVtYmVyPltdID0gW107XG4gIGNvbnN0IGxpbnRSdW5PcHRpb25zID0geyBleGl0SWZGYWlsZWQ6IGZhbHNlLCBmb3JjZUNvbG9yOiB0cnVlIH0gYXMgY29uc3Q7XG4gIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgbGludEZpbGVQYXRoc10gb2YgbGludEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgaWYgKCFsaW50Q29tbWFuZCkgY29udGludWU7XG5cbiAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwobGludENvbW1hbmQsIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIG94Zm10RmlsZVBhdGhzXSBvZiBveGZtdEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgbGludFByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduSW5QYXJhbGxlbChidWlsZE94Zm10Q29tbWFuZChveGZtdEZpbGVQYXRocyksIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIHB5dGhvbkZpbGVQYXRoc10gb2YgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBsaW50UHJvbWlzZXMucHVzaChcbiAgICAgICAgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChidWlsZFBvZXRyeUNvbW1hbmQoYXJndiwgcHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpXG4gICAgICApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzXSBvZiBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBsaW50UHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd25JblBhcmFsbGVsKGJ1aWxkRGFydENvbW1hbmQoYXJndiwgZGFydEZpbGVQYXRocyksIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiAhcHJvamVjdC5oYXNTb3VyY2VDb2RlKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YpO1xuICAgICAgaWYgKCFsaW50Q29tbWFuZCkgY29udGludWU7XG5cbiAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwobGludENvbW1hbmQsIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykge1xuICAgICAgICBsaW50UHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd25JblBhcmFsbGVsKGJ1aWxkUG9ldHJ5Q29tbWFuZChhcmd2KSwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sKSB7XG4gICAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYnVpbGREYXJ0Q29tbWFuZChhcmd2KSwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10ICYmIGFyZ3YuZm9ybWF0KSB7XG4gICAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYnVpbGRPeGZtdENvbW1hbmQoKSwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgbGludEV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKGxpbnRQcm9taXNlcyk7XG5cbiAgaWYgKG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgfHwgbGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICBpZiAocHJldHRpZXJBcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxpbnRFeGl0Q29kZXMucHVzaChcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICAgICAnWUFSTicsXG4gICAgICAgICAgICAncHJldHRpZXInLFxuICAgICAgICAgICAgJy0tY2FjaGUnLFxuICAgICAgICAgICAgJy0tY29sb3InLFxuICAgICAgICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgICAgICAgJy0td3JpdGUnLFxuICAgICAgICAgICAgJy0tJyxcbiAgICAgICAgICAgIC4uLnByZXR0aWVyQXJncyxcbiAgICAgICAgICBdKSxcbiAgICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlLCBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKFxuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICdzb3J0LXBhY2thZ2UtanNvbicsICctLScsIC4uLnNvcnRQYWNrYWdlSnNvbkFyZ3NdKSxcbiAgICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlLCBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApID8gMSA6IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExpbnRDb21tYW5kKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPixcbiAgYXJndjogUGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdmaXgnIHwgJ2Zvcm1hdCc+ICYgUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LFxuICBmaWxlcz86IHN0cmluZ1tdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdiaW9tZScpIHtcbiAgICBsZXQgYmlvbWVBcmdzOiBzdHJpbmdbXTtcbiAgICBpZiAoYXJndi5maXggJiYgYXJndi5mb3JtYXQpIHtcbiAgICAgIGJpb21lQXJncyA9IFsnY2hlY2snLCAnLS13cml0ZSddO1xuICAgIH0gZWxzZSBpZiAoYXJndi5maXgpIHtcbiAgICAgIGJpb21lQXJncyA9IFsnbGludCcsICctLWZpeCddO1xuICAgIH0gZWxzZSBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgIGJpb21lQXJncyA9IFsnZm9ybWF0JywgJy0tZml4J107XG4gICAgfSBlbHNlIHtcbiAgICAgIGJpb21lQXJncyA9IFsnbGludCddO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ0JVTicsXG4gICAgICAnYmlvbWUnLFxuICAgICAgLi4uYmlvbWVBcmdzLFxuICAgICAgJy0tY29sb3JzPWZvcmNlJyxcbiAgICAgICctLW5vLWVycm9ycy1vbi11bm1hdGNoZWQnLFxuICAgICAgJy0tZmlsZXMtaWdub3JlLXVua25vd249dHJ1ZScsXG4gICAgICAuLi4oYXJndi5xdWlldCA/IFsnLS1kaWFnbm9zdGljLWxldmVsPWVycm9yJ10gOiBbXSksXG4gICAgICAuLi4oZmlsZXM/Lmxlbmd0aCA/IFsnLS0nXSA6IFtdKSxcbiAgICAgIC4uLihmaWxlcyA/PyBbXSksXG4gICAgXSk7XG4gIH1cbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnZXNsaW50Jykge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnZXNsaW50JyxcbiAgICAgICctLWNvbG9yJyxcbiAgICAgIC4uLihhcmd2LnF1aWV0ID8gWyctLXF1aWV0J10gOiBbXSksXG4gICAgICAuLi4oYXJndi5maXggfHwgYXJndi5mb3JtYXQgPyBbJy0tZml4J10gOiBbXSksXG4gICAgICAnLS0nLFxuICAgICAgLi4uKGZpbGVzID8/IFsnLiddKSxcbiAgICBdKTtcbiAgfVxuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICdveGxpbnQnLFxuICAgICAgLi4uKGFyZ3YucXVpZXQgPyBbJy0tcXVpZXQnXSA6IFtdKSxcbiAgICAgIC4uLihhcmd2LmZpeCA/IFsnLS1maXgnXSA6IFtdKSxcbiAgICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgXSk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPeGZtdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ1lBUk4nLCAnb3hmbXQnLCAnLS13cml0ZScsICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJywgLi4uKGZpbGVzID8/IFsnLiddKV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2V0cnlDb21tYW5kKFxuICBhcmd2OiBQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ2ZpeCcgfCAnZm9ybWF0Jz4gJiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sXG4gIGZpbGVzPzogc3RyaW5nW11cbik6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgY29uc3QgY29tbWFuZHMgPVxuICAgIGFyZ3YuZml4IHx8IGFyZ3YuZm9ybWF0XG4gICAgICA/IFtcbiAgICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnaXNvcnQnLCAnLS1wcm9maWxlJywgJ2JsYWNrJywgJy0tZmlsdGVyLWZpbGVzJywgLi4udGFyZ2V0c10pLFxuICAgICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdibGFjaycsIC4uLnRhcmdldHNdKSxcbiAgICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnZmxha2U4JywgLi4uKGFyZ3YucXVpZXQgPyBbJy1xJ10gOiBbXSksIC4uLnRhcmdldHNdKSxcbiAgICAgICAgXVxuICAgICAgOiBbYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2ZsYWtlOCcsIC4uLihhcmd2LnF1aWV0ID8gWyctcSddIDogW10pLCAuLi50YXJnZXRzXSldO1xuICByZXR1cm4gY29tbWFuZHMuam9pbignICYmICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREYXJ0Q29tbWFuZChcbiAgYXJndjogUGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdmaXgnIHwgJ2Zvcm1hdCc+ICYgUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LFxuICBmaWxlcz86IHN0cmluZ1tdXG4pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoYXJndi5maXggfHwgYXJndi5mb3JtYXQpIHtcbiAgICBjb21tYW5kcy5wdXNoKGJ1aWxkU2hlbGxDb21tYW5kKFsnZGFydCcsICdmb3JtYXQnLCAuLi50YXJnZXRzXSkpO1xuICB9XG4gIGNvbW1hbmRzLnB1c2goYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2FuYWx5emUnLCAuLi50YXJnZXRzXSkpO1xuICByZXR1cm4gY29tbWFuZHMuam9pbignICYmICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQcmV0dGllckFyZ3MoXG4gIHNlbGZEaXJQYXRoOiBzdHJpbmcsXG4gIHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz5bXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzID0gbmV3IFNldDxzdHJpbmc+KFtgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuXSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmICghbmVlZHNQcmV0dGllcihwcm9qZWN0KSkgY29udGludWU7XG5cbiAgICBjb25zdCBwcm9qZWN0UGF0dGVybiA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcqKi97LiovLH0qLnsnICsgWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uam9pbignLCcpICsgJ30nKTtcbiAgICBhcmdzLmFkZChwYXRoLnJlbGF0aXZlKHNlbGZEaXJQYXRoLCBwcm9qZWN0UGF0dGVybikgfHwgcHJvamVjdFBhdHRlcm4pO1xuICB9XG4gIHJldHVybiBbLi4uYXJnc107XG59XG5cbmZ1bmN0aW9uIGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzOiBQcm9qZWN0W10sIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgbGV0IG93bmluZ1Byb2plY3Q6IFByb2plY3QgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmIChcbiAgICAgIChmaWxlUGF0aCA9PT0gcHJvamVjdC5kaXJQYXRoIHx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7cHJvamVjdC5kaXJQYXRofS9gKSkgJiZcbiAgICAgICghb3duaW5nUHJvamVjdCB8fCBwcm9qZWN0LmRpclBhdGgubGVuZ3RoID4gb3duaW5nUHJvamVjdC5kaXJQYXRoLmxlbmd0aClcbiAgICApIHtcbiAgICAgIG93bmluZ1Byb2plY3QgPSBwcm9qZWN0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3duaW5nUHJvamVjdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExpbnRUYXJnZXRGaWxlcyhhcmd2OiBQaWNrPExpbnRDb21tYW5kQXJndiwgJy0tJyB8ICdfJyB8ICdmaWxlcyc+KTogc3RyaW5nW10ge1xuICBjb25zdCBsaW50VGFyZ2V0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIFsuLi4oYXJndi5maWxlcyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXSkge1xuICAgIGxpbnRUYXJnZXRzLmFkZChTdHJpbmcodmFsdWUpKTtcbiAgfVxuICByZXR1cm4gWy4uLmxpbnRUYXJnZXRzXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTwnZGlyZWN0b3J5JyB8ICdvdGhlcic+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSByZXR1cm4gJ2RpcmVjdG9yeSc7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE1pc3NpbmcgcGF0aHMgYXJlIGhhbmRsZWQgYnkgdGhlIGRvd25zdHJlYW0gdG9vbHMuXG4gIH1cblxuICByZXR1cm4gJ290aGVyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllcihcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+LFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0Lmhhc094Zm10KSByZXR1cm4gb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICBpZiAobmVlZHNQcmV0dGllcihwcm9qZWN0KSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiAoXG4gICAgcHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdiaW9tZScgJiZcbiAgICAhc3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uKHByb2plY3QsIGV4dGVuc2lvbikgJiZcbiAgICBwcmV0dGllckV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbilcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcicsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgcHJvamVjdC5oYXNPeGZtdCkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgcHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdiaW9tZScpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcGF0aC5qb2luKGZpbGVQYXRoLCAnKiovey4qLyx9Ki57JyArIFsuLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJykgKyAnfScpLFxuICAgICAgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybixcbiAgICBdO1xuICB9XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgbmVlZHNQcmV0dGllcihwcm9qZWN0KSkge1xuICAgIHJldHVybiBbZmlsZVBhdGgsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dO1xuICB9XG4gIGlmIChzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uUGF0aCc+W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgcmV0dXJuIFtdO1xuICByZXR1cm4gcHJvamVjdHNcbiAgICAuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoID09PSBwYXRoLmpvaW4oZmlsZVBhdGgsICdwYWNrYWdlLmpzb24nKSB8fFxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgIClcbiAgICAubWFwKChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdExpbnRUYXJnZXRzKFxuICBwcm9qZWN0czogUHJvamVjdFtdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiB7IGxpbnRQYXRoOiBzdHJpbmc7IHByb2plY3Q6IFByb2plY3QgfVtdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5Jykge1xuICAgIGNvbnN0IGRlc2NlbmRhbnRQcm9qZWN0cyA9IHByb2plY3RzLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LmRpclBhdGggPT09IGZpbGVQYXRoIHx8IHByb2plY3QuZGlyUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgICk7XG4gICAgaWYgKGRlc2NlbmRhbnRQcm9qZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZGVzY2VuZGFudFByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gKHsgbGludFBhdGg6IHByb2plY3QuZGlyUGF0aCwgcHJvamVjdCB9KSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzLCBmaWxlUGF0aCk7XG4gIHJldHVybiBwcm9qZWN0ID8gW3sgbGludFBhdGg6IGZpbGVQYXRoLCBwcm9qZWN0IH1dIDogW107XG59XG5cbmZ1bmN0aW9uIGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fFxuICAgIG94bGludEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHxcbiAgICBlc2xpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8XG4gICAgcHl0aG9uRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fFxuICAgIGRhcnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pXG4gICk7XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPiwgZXh0ZW5zaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnYmlvbWUnKSByZXR1cm4gYmlvbWVFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnKSByZXR1cm4gb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnZXNsaW50JykgcmV0dXJuIGVzbGludEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbmVlZHNQcmV0dGllcihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4pOiBib29sZWFuIHtcbiAgcmV0dXJuICFwcm9qZWN0Lmhhc094Zm10ICYmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ2VzbGludCcgfHwgcHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChjb21tYW5kTmFtZTogc3RyaW5nLCBwcm9qZWN0czogUHJvamVjdFtdKTogR2VuZXJhdG9yPFByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiJHtjb21tYW5kTmFtZX1cIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgeWllbGQgcHJvamVjdDtcbiAgfVxufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBvdXRzaWRlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBvcHRpbWl6YXRpb24gaXMgZXhlY3V0ZWQgb3V0c2lkZSBhIGRvY2tlciBjb250YWluZXIgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJyxcbiAgZGVzY3JpYmU6ICdPcHRpbWl6ZSBjb25maWd1cmF0aW9uIHdoZW4gYnVpbGRpbmcgYSBEb2NrZXIgaW1hZ2UnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gICAgICBjb25zdCBrZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldID8/IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwcykpIHtcbiAgICAgICAgICBpZiAodmFsdWU/LnN0YXJ0c1dpdGgoJ2dpdEBnaXRodWIuY29tOicpKSB7XG4gICAgICAgICAgICBkZXBzW25hbWVdID0gYC4vJHtuYW1lfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICB9XG4gICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhYXJndi5vdXRzaWRlKSB7XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5pbmZvKCdJbnN0YWxsZWQgZGVwZW5kZW5jaWVzLicpO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3Y6IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+LCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgaWYgKCFhcmd2Lm91dHNpZGUpIHtcbiAgICBkZWxldGUgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzO1xuICAgIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IG5hbWVXb3Jkc1RvQmVSZW1vdmVkID0gW1xuICAgICdhcnRpbGxlcnknLFxuICAgICdiaW9tZScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2VzbGludCcsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAncmFpbHdheScsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBjb25zdCByZW1vdmVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIChuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLnN0YXJ0c1dpdGgod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgICAgcmVtb3ZlZFNjcmlwdHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIHNjcmlwdHM6JywgcmVtb3ZlZFNjcmlwdHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuXG5jbGFzcyBEcml6emxlU2NyaXB0cyB7XG4gIGRlcGxveShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIG1pZ3JhdGUoX3Byb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBkcml6emxlLWtpdCBtaWdyYXRlICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoX3Byb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBkcml6emxlLWtpdCBnZW5lcmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCByZW1vdmVDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdCk7XG4gICAgaWYgKCFyZW1vdmVDb21tYW5kKSB7XG4gICAgICByZXR1cm4gXCJlY2hvICd3YiBkYiByZXNldCBzdXBwb3J0cyBEcml6emxlIG9ubHkgd2hlbiBEQVRBQkFTRV9QQVRIIG9yIGZpbGU6IERBVEFCQVNFX1VSTCBpcyBzZXQuJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7cmVtb3ZlQ29tbWFuZH0gJiYgJHt0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpfSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LnNlZWQpIHJldHVybiAnWUFSTiBydW4gc2VlZCc7XG4gICAgcmV0dXJuICd0cnVlJztcbiAgfVxuXG4gIHN0dWRpbyhfcHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgc3R1ZGlvIGZvciBEcml6emxlIGRvZXMgbm90IHN1cHBvcnQgZGItdXJsLW9yLXBhdGguJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYFlBUk4gZHJpenpsZS1raXQgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gcHJvamVjdC5lbnYuREFUQUJBU0VfUEFUSCA/PyBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpID8gZGJQYXRoIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGJQYXRoKTtcbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZnVuY3Rpb24gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3RGJQYXRoID0gZGJVcmwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKS5yZXBsYWNlKC9bPyNdLiokLywgJycpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIHJldHVybiByYXdEYlBhdGg7XG59XG5cbmV4cG9ydCBjb25zdCBkcml6emxlU2NyaXB0cyA9IG5ldyBEcml6emxlU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuY29uc3QgUE9TU0lCTEVfUFJJU01BX1BBVEhTID0gW1xuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuXTtcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjbGVhblVwQ29tbWFuZCA9IGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgLy8gQ2xlYW51cCBleGlzdGluZyBhcnRpZmFjdHMgdG8gYXZvaWQgaXNzdWVzIHdpdGggTGl0ZXN0cmVhbSByZXBsaWNhdGlvbi5cbiAgICAvLyBOb3RlIHRoYXQgZG9uJ3QgbWVyZ2UgbXVsdGlwbGUgcm0gY29tbWFuZHMgaW50byBvbmUsIGJlY2F1c2UgaWYgb25lIGZhaWxzLCB0aGUgc3Vic2VxdWVudCBvbmVzIHdvbid0IHJ1bi5cbiAgICByZXR1cm4gYCR7Y2xlYW5VcENvbW1hbmR9OyBybSAtUmYgJHtkaXJQYXRofS8ucHJvZC5zcWxpdGUzKiB8fCB0cnVlYDtcbiAgfVxuXG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IHJlbW92ZURiQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIC8vIGBwcmlzbWEgbWlncmF0ZSByZXNldGAgY2FuIGZhaWwgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgZXhpc3RpbmcgZGF0YWJhc2UsIHNvIHdlIHJlbW92ZSBpdCBmaXJzdC5cbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYCR7cmVtb3ZlRGJDb21tYW5kfTsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3JlbW92ZURiQ29tbWFuZH1cbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAtY29uZmlnIGxpdGVzdHJlYW0ueW1sIC1vICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIGxzIC1haGwgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBsaXRlc3RyZWFtIGx0eCAtY29uZmlnIGxpdGVzdHJlYW0ueW1sICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc30gJiYgUFJJU01BIGdlbmVyYXRlICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIGNvbnN0IHN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNsZWFudXBDb21tYW5kID0gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdCk7XG4gICAgaWYgKGNsZWFudXBDb21tYW5kKSBzdGVwcy5wdXNoKGNsZWFudXBDb21tYW5kKTtcbiAgICBjb25zdCByZXNldENvbW1hbmQgPSBbJ1BSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBzdGVwcy5wdXNoKHJlc2V0Q29tbWFuZCk7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikge1xuICAgICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgICAgc3RlcHMucHVzaCh0aGlzLnNlZWQocHJvamVjdCkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgcm0gLVJmICR7b3V0cHV0UGF0aH0qOyBsaXRlc3RyZWFtIHJlc3RvcmUgLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAtbyAke291dHB1dFBhdGh9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gICAgICBpZiAoYmFzZURpcikge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyLCBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKSk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvbW91bnQnIDogJ3ByaXNtYS9tb3VudCc7XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF07IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBQUklTTUEgZGIgZXhlY3V0ZSAtLXN0ZGluIC0tdXJsIFwiJHtGSUxFX1NDSEVNQX0ke2RiUGF0aH1cIjsgZmkgJiYgcm0gLWYgXCIke2RiUGF0aH1cIi4qIFwiJHtkYlBhdGh9XCItKmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3RGJQYXRoID0gZGJVcmwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKS5yZXBsYWNlKC9bPyNdLiokLywgJycpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUocmF3RGJQYXRoKVxuICAgID8gcmF3RGJQYXRoXG4gICAgOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyID8/ICcuJywgcmF3RGJQYXRoKTtcblxuICByZXR1cm4gYHJtIC1mIFwiJHthYnNvbHV0ZVBhdGh9XCIgXCIke2Fic29sdXRlUGF0aH0td2FsXCIgXCIke2Fic29sdXRlUGF0aH0tc2htXCJgO1xufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VPcm0sIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGFsaWFzZXM6IFsnZGInXSxcbiAgZGVzY3JpYmU6XG4gICAgXCJSdW4gZGF0YWJhc2UgY29tbWFuZHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gUHJpc21hLiBEcml6emxlIHByb2plY3RzIHVzZSBkcml6emxlLWtpdC4gRXhhbXBsZTogd2IgcHJpc21hIG1pZ3JhdGUtZGV2IC0tIC0tbmFtZSBpbml0XCIsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5jb21tYW5kKGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpc3RCYWNrdXBzQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKVxuICAgICAgLnN0cmljdChmYWxzZSk7IC8vIEFsbG93IHVua25vd24gb3B0aW9ucyB0byBiZSBwYXNzZWQgdGhyb3VnaFxuICB9LFxuICBoYW5kbGVyKCkge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfSxcbn07XG5cbmNvbnN0IGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdjbGVhbnVwLWxpdGVzdHJlYW0nLFxuICBkZXNjcmliZTogJ0NsZWFuIHVwIHRlbXBvcmFsIExpdGVzdHJlYW0gZmlsZXMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgY2xlYW51cC1saXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5jbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3QpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aG91dCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZGVwbG95JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXN0QmFja3Vwcyhwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkubWlncmF0ZURldihwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc2V0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXNldCcsXG4gIGRlc2NyaWJlOiAnUmVzZXQgREInLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgcmVzZXQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gICAgICAgICdXQl9FTlY9dGVzdCBkYiByZXNldCcsXG4gICAgICAgIGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpXG4gICAgICApKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc3RvcmVCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSByZXN0b3JlZCBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gXCI8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzXCIuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlc3RvcmVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHJlc3RvcmVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXN0b3JlJyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICBhcmd2Lm91dHB1dCA/PyAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXN0b3JlKHByb2plY3QsIG91dHB1dCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBkYXRhYmFzZSBzdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc3R1ZGlvJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBkYlVybE9yUGF0aCA9IGFyZ3YucmVzdG9yZWRcbiAgICAgICAgPyBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHpcbiAgICAgICAgICA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICAgIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoLCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOlxuICAgIFwiUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHRoZSBkZXRlY3RlZCBPUk0gYXMgaXMuIEFkZGl0aW9uYWwgUHJpc21hIGZsYWdzIGNhbiBhbHNvIGJlIGZvcndhcmRlZCBhZnRlciAnLS0nLlwiLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gKGFyZ3YuYXJncz8uam9pbignICcpID8/ICcnKS50cmltRW5kKCk7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydhcmdzJ10pO1xuICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gW3NjcmlwdCwgdW5rbm93bk9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKGBkYiAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgY29tbWFuZCA9IG9ybSA9PT0gJ3ByaXNtYScgPyBgUFJJU01BICR7ZnVsbENvbW1hbmR9YCA6IGBZQVJOIGRyaXp6bGUta2l0ICR7ZnVsbENvbW1hbmR9YDtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihjb21tYW5kLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYicgOiAncHJpc21hJztcbiAgY29uc3QgZGJQYXRoID0gYCR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzYDtcbiAgY29uc3QgcmVxdWlyZWRFbnZWYXJzID0ge1xuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUU6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVksXG4gIH0gYXMgY29uc3Q7XG4gIGNvbnN0IG1pc3NpbmdFbnZWYXJzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRFbnZWYXJzKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIXZhbHVlKVxuICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZ0VudlZhcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExpdGVzdHJlYW06ICR7bWlzc2luZ0VudlZhcnMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJldGVudGlvbkNoZWNrSW50ZXJ2YWwgPSBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICdzdGFnaW5nJyA/ICc1bScgOiAnMWgnO1xuICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnID0gYGRiczpcbiAgLSBwYXRoOiAke2RiUGF0aH1cbiAgICBidXN5LXRpbWVvdXQ6IDVzXG4gICAgY2hlY2twb2ludC1pbnRlcnZhbDogMW1cbiAgICByZXBsaWNhOlxuICAgICAgdHlwZTogczNcbiAgICAgIGVuZHBvaW50OiBodHRwczovLyR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEfS5yMi5jbG91ZGZsYXJlc3RvcmFnZS5jb21cbiAgICAgIGJ1Y2tldDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FfVxuICAgICAgYWNjZXNzLWtleS1pZDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUR9XG4gICAgICBzZWNyZXQtYWNjZXNzLWtleTogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZfVxuICAgICAgc25hcHNob3QtaW50ZXJ2YWw6IDI0aCAgIyBDcmVhdGUgYSBiYWNrdXAgcGVyIGRheVxuICAgICAgcmV0ZW50aW9uOiA3MmggICAgICAgICAgIyBLZWVwIGJhY2t1cHMgZm9yIDMgZGF5c1xuICAgICAgcmV0ZW50aW9uLWNoZWNrLWludGVydmFsOiAke3JldGVudGlvbkNoZWNrSW50ZXJ2YWx9XG4gICAgICBzeW5jLWludGVydmFsOiAxbVxuYDtcblxuICBjb25zdCBjb25maWdQYXRoID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gLCB7XG4gICAgICBjYXVzZTogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIERhdGFiYXNlT3JtUHJvamVjdCB7XG4gIHByb2plY3Q6IFByb2plY3Q7XG4gIG9ybTogRGF0YWJhc2VPcm07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIG9ybT86IERhdGFiYXNlT3JtKTogUHJvbWlzZTxEYXRhYmFzZU9ybVByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1xuICAgIC5tYXAoKHByb2plY3QpID0+IChwcm9qZWN0LmRhdGFiYXNlT3JtID8geyBwcm9qZWN0LCBvcm06IHByb2plY3QuZGF0YWJhc2VPcm0gfSA6IHVuZGVmaW5lZCkpXG4gICAgLmZpbHRlcigocHJvamVjdCk6IHByb2plY3QgaXMgRGF0YWJhc2VPcm1Qcm9qZWN0ID0+ICEhcHJvamVjdCAmJiAoIW9ybSB8fCBwcm9qZWN0Lm9ybSA9PT0gb3JtKSk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChvcm0gPyBgTm8gJHtvcm19IHByb2plY3QgZm91bmQuYCA6ICdObyBzdXBwb3J0ZWQgZGF0YWJhc2UgT1JNIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbmZ1bmN0aW9uIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm06IERhdGFiYXNlT3JtKTogdHlwZW9mIHByaXNtYVNjcmlwdHMgfCB0eXBlb2YgZHJpenpsZVNjcmlwdHMge1xuICByZXR1cm4gb3JtID09PSAncHJpc21hJyA/IHByaXNtYVNjcmlwdHMgOiBkcml6emxlU2NyaXB0cztcbn1cblxuZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKFxuICBjb21tYW5kTmFtZTogc3RyaW5nLFxuICBwcm9qZWN0czogRGF0YWJhc2VPcm1Qcm9qZWN0W11cbik6IEdlbmVyYXRvcjxEYXRhYmFzZU9ybVByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgY29uc3Qgb3JtUHJvamVjdEJ5UHJvamVjdCA9IG5ldyBNYXAocHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiBbcHJvamVjdC5wcm9qZWN0LCBwcm9qZWN0XSkpO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKFxuICAgIGNvbW1hbmROYW1lLFxuICAgIHByb2plY3RzLm1hcCgoeyBwcm9qZWN0IH0pID0+IHByb2plY3QpXG4gICkpIHtcbiAgICBjb25zdCBvcm1Qcm9qZWN0ID0gb3JtUHJvamVjdEJ5UHJvamVjdC5nZXQocHJvamVjdCk7XG4gICAgaWYgKCFvcm1Qcm9qZWN0KSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZXRlY3QgZGF0YWJhc2UgT1JNIGZvciAke3Byb2plY3QubmFtZX0uYCk7XG5cbiAgICB5aWVsZCBvcm1Qcm9qZWN0O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gT1JNIGNvbW1hbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3Y6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmcge1xuICBjb25zdCB1bmtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBCdWlsZCBsaXN0IG9mIGtub3duIG9wdGlvbnMgZnJvbSBzaGFyZWQgb3B0aW9ucyBidWlsZGVyc1xuICBjb25zdCBzaGFyZWRPcHRpb25LZXlzID0gT2JqZWN0LmtleXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpO1xuICBjb25zdCBzaGFyZWRPcHRpb25BbGlhc2VzID0gT2JqZWN0LnZhbHVlcyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgICAuZmxhdE1hcCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAoJ2FsaWFzJyBpbiBvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob3B0aW9uLmFsaWFzKSA/IG9wdGlvbi5hbGlhcyA6IFtvcHRpb24uYWxpYXNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pXG4gICAgLm1hcChTdHJpbmcpO1xuXG4gIGNvbnN0IGFsbEtub3duT3B0aW9ucyA9IG5ldyBTZXQoW1xuICAgIC4uLmtub3duT3B0aW9ucyxcbiAgICAuLi5zaGFyZWRPcHRpb25LZXlzLFxuICAgIC4uLnNoYXJlZE9wdGlvbkFsaWFzZXMsXG4gICAgLy8gSW50ZXJuYWwgeWFyZ3MgcHJvcGVydGllc1xuICAgICctLScsXG4gICAgJ18nLFxuICAgICckMCcsXG4gIF0pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGFyZ3YpKSB7XG4gICAgaWYgKCFhbGxLbm93bk9wdGlvbnMuaGFzKGtleSkpIHtcbiAgICAgIC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb25zIG9mIGtlYmFiLWNhc2Ugb3B0aW9ucyB0byBhdm9pZCBkdXBsaWNhdGlvblxuICAgICAgLy8gSWYgd2UgaGF2ZSBib3RoICdjcmVhdGUtb25seScgYW5kICdjcmVhdGVPbmx5JywgcHJlZmVyIHRoZSBrZWJhYi1jYXNlIHZlcnNpb25cbiAgICAgIGNvbnN0IGtlYmFiQ2FzZUtleSA9IGtleS5yZXBsYWNlQWxsKC9bQS1aXS9nLCAobWF0Y2gpID0+IGAtJHttYXRjaC50b0xvd2VyQ2FzZSgpfWApO1xuICAgICAgaWYgKGtlYmFiQ2FzZUtleSAhPT0ga2V5ICYmIGFyZ3Zba2ViYWJDYXNlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9uIGlmIGtlYmFiLWNhc2UgZXhpc3RzXG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBib29sZWFuIGZsYWdzXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgdmFsdWUpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBzdHJpbmcvbnVtYmVyIHZhbHVlc1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyhpdGVtKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBwYXNzdGhyb3VnaEFyZ3MgPSBBcnJheS5pc0FycmF5KGFyZ3ZbJy0tJ10pID8gYXJndlsnLS0nXS5tYXAoU3RyaW5nKSA6IFtdO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWy4uLnVua25vd25PcHRpb25zLCAuLi5wYXNzdGhyb3VnaEFyZ3NdKTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgcmV0cnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbWF4aW11bSByZXRyeSBjb3VudCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgYWxpYXM6ICdyJyxcbiAgICBkZWZhdWx0OiAzLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBvblNpZ25hbDogKHNpZ25hbCkgPT4ge1xuICAgICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignYXNkZiBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGNvbnN0IFssIHZlcnNpb25dID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnYXNkZiBjdXJyZW50IHB5dGhvbicpLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3ZlcnNpb259YCwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmluZCgocCkgPT4gcC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnBsYXl3cmlnaHQpO1xuICBpZiAocHJvamVjdCkge1xuICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICAnLS0nPzogc3RyaW5nW107XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xuICBzaWxlbnQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHsgJy0tJz86IHN0cmluZ1tdIH1cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSlcbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5pbXBvcnQgeyBpc1BvcnRBdmFpbGFibGUgfSBmcm9tICcuL3BvcnQuanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCk7XG4gIGlmICghYXZhaWxhYmxlKSB7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9XG5cbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFdlIHNob3VsZCBzdG9wIERvY2tlciBjb250YWluZXJzIGZpcnN0IGJlY2F1c2UgYGtpbGwtcG9ydGAgbWF5IGZhaWwgdG8gc3RvcCBEb2NrZXIgY29udGFpbmVycy5cbiAgYXdhaXQgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0LCBwcm9qZWN0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5SW1hZ2VOYW1lKGltYWdlTmFtZTogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBuYW1lPSR7aW1hZ2VOYW1lfWBdLCBwcm9qZWN0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBwdWJsaXNoPSR7cG9ydH1gXSwgcHJvamVjdCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckNvbnRhaW5lcnMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250YWluZXJJZHMgPSBhd2FpdCBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3MsIHByb2plY3QpO1xuICAgIGlmIChjb250YWluZXJJZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3JtJywgJy1mJywgLi4uY29udGFpbmVySWRzXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncHMnLCAnLXEnLCAuLi5maWx0ZXJBcmdzXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogcHJvamVjdC5lbnYsXG4gIH0pO1xuICByZXR1cm4gc3Rkb3V0XG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChpZCkgPT4gaWQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIENoZWNrcyB0aGUgZ2l2ZW4gcG9ydCBhbmQga2lsbHMgYW55IHByb2Nlc3MgdXNpbmcgaXQuXG4gKiBOb3RlIHdiIGFsd2F5cyByZXF1aXJlcyBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocmF3UG9ydDogdW5rbm93biwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocmF3UG9ydCk7XG4gIGlmICghcG9ydCkgdGhyb3cgbmV3IEVycm9yKGBUaGUgZ2l2ZW4gcG9ydCAoJHtwb3J0fSkgaXMgaW52YWxpZC5gKTtcblxuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0LCBwcm9qZWN0KTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcG9ydCBpcyBhdmFpbGFibGUuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBjaGVja1xuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgcG9ydCBpcyBhdmFpbGFibGUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNQb3J0QXZhaWxhYmxlKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBDaGVjayBib3RoIHN0YWNrcyB0byBjYXRjaCBwcm9jZXNzZXMgYm91bmQgb25seSBvbiBJUHY2IG9yIElQdjQuXG4gIGZvciAoY29uc3QgaG9zdCBvZiBbJzEyNy4wLjAuMScsICc6OiddKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgcHJvYmVQb3J0KGhvc3QsIHBvcnQpO1xuICAgIGlmICghYXZhaWxhYmxlKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2JlUG9ydChob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcblxuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRk5PU1VQUE9SVCcpIHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCBob3N0KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGRJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259IC5gO1xuICB9XG5cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dGhpcy5zdGFydChwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucywgYWRkaXRpb25hbEFyZ3MpfWA7XG4gIH1cblxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICBjb25zdCBhbGxvY2F0ZVR0eSA9IGFkZGl0aW9uYWxBcmdzLmluY2x1ZGVzKCcvYmluL2Jhc2gnKTtcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAke2FsbG9jYXRlVHR5ID8gJy1pdCAnIDogJyd9LS1wdWJsaXNoICR7cHJvamVjdC5lbnYuUE9SVH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVPcHRpb25zIHtcbiAgLyoqICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJyAqL1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xuICAvKiogUmF3IFBsYXl3cmlnaHQgYXJncyBmb3J3YXJkZWQgYWZ0ZXIgYHdiIHRlc3QgLS0gLi4uYCAqL1xuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHAgPSBzaG91bGRXYWl0QW5kT3BlbkFwcDtcbiAgfVxuXG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGRJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogc3RhcnQgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIGFzeW5jIHN0YXJ0RGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgXSk7XG4gIH1cbiAgYXN5bmMgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhc3luYyBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAnd2InLFxuICAgICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgICAgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKSxcbiAgICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICAgIF0pfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcbiAgcHJvdGVjdGVkIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBlY29zeXN0ZW1Db25maWdQYXRoID0gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY29tbWFuZHMgPVxuICAgICAgZWNvc3lzdGVtQ29uZmlnUGF0aCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gW1xuICAgICAgICAgICAgYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke2FyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YC50cmltKCksXG4gICAgICAgICAgICBgbm9kZSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCksXG4gICAgICAgICAgXVxuICAgICAgICA6IFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYHBtMi1ydW50aW1lIHN0YXJ0IC0tbm8tYXV0b3Jlc3RhcnQgJHtlY29zeXN0ZW1Db25maWdQYXRofWBdO1xuXG4gICAgcmV0dXJuIFsuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCkuc3BsaXQoJyYmJykgOiBbXSksIC4uLmNvbW1hbmRzXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCgoY21kKSA9PiBgJHtjbWR9ICR7dG9EZXZOdWxsKGFyZ3YpfWAudHJpbSgpKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRURvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCksIG9wdGlvbnMpO1xuICB9XG4gIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBVc2UgZW1wdHkgTk9ERV9FTlYgdG8gYXZvaWQgXCJwcm9kdWN0aW9uXCIgbW9kZSBpbiBzb21lIGZyYW1ld29ya3MgbGlrZSBCbGl0ei5qcy5cbiAgICByZXR1cm4gYCR7YnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCgnTk9ERV9FTlYnLCAnJyl9ICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFwcChwcm9qZWN0KSxcbiAgICBdKX1gO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIHsgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBbXSwgcGxheXdyaWdodEFyZ3MgPSBbJ3Rlc3QnLCAndGVzdC9lMmUvJ10gfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJncywgYXJndi50YXJnZXRzLCBhcmd2LmJhaWwsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcbiAgICBpZiAocHJvamVjdC5za2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCkge1xuICAgICAgcmV0dXJuIGAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGB3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd2aXRlc3QnLFxuICAgICAgICAncnVuJyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgICctLWNvbG9yJyxcbiAgICAgICAgJy0tcGFzc1dpdGhOb1Rlc3RzJyxcbiAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgJy0td2F0Y2g9ZmFsc2UnLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgXSk7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnYnVuJyxcbiAgICAgICAgJ3Rlc3QnLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDUwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAxMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMjAwMDAgLWkgNDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA2MDAwMCAtaSA1MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDkwMDAwIC1pIDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0XG4gICAgKX0gfHwgd2FpdC1vbiBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodENvbW1hbmQoXG4gIHBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSxcbiAgdGFyZ2V0czogVGVzdEFyZ3ZbJ3RhcmdldHMnXSxcbiAgYmFpbD86IGJvb2xlYW4sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gWydCVU4nLCAncGxheXdyaWdodCddO1xuICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICBpZiAocGxheXdyaWdodEFyZ3NbMF0gIT09ICd0ZXN0JyB8fCAhbm9ybWFsaXplZFRhcmdldHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihbLi4uYmFzZSwgLi4ucGxheXdyaWdodEFyZ3MsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSwgYmFpbCk7XG4gIH1cblxuICBjb25zdCByZXN0ID0gcGxheXdyaWdodEFyZ3Muc2xpY2UoMSk7XG4gIGNvbnN0IGV4cGxpY2l0VGFyZ2V0SW5kZXhlcyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKHJlc3QpO1xuICBjb25zdCByZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0ID1cbiAgICBleHBsaWNpdFRhcmdldEluZGV4ZXMubGVuZ3RoID09PSAwID8gcmVzdCA6IHJlc3QuZmlsdGVyKChfLCBpbmRleCkgPT4gIWV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5pbmNsdWRlcyhpbmRleCkpO1xuICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oXG4gICAgWy4uLmJhc2UsICd0ZXN0JywgLi4ubm9ybWFsaXplZFRhcmdldHMsIC4uLnJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSxcbiAgICBiYWlsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGNvbW1hbmRBcmdzOiBzdHJpbmdbXSwgYmFpbD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBwbGF5d3JpZ2h0SW5kZXggPSBjb21tYW5kQXJncy5pbmRleE9mKCdwbGF5d3JpZ2h0Jyk7XG4gIGNvbnN0IGlzUGxheXdyaWdodFRlc3RDb21tYW5kID0gcGxheXdyaWdodEluZGV4ICE9PSAtMSAmJiBjb21tYW5kQXJnc1twbGF5d3JpZ2h0SW5kZXggKyAxXSA9PT0gJ3Rlc3QnO1xuICBpZiAoIWJhaWwgfHwgIWlzUGxheXdyaWdodFRlc3RDb21tYW5kKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICBpZiAoY29tbWFuZEFyZ3Muc29tZSgoYXJnKSA9PiBhcmcgPT09ICctLW1heC1mYWlsdXJlcycgfHwgYXJnLnN0YXJ0c1dpdGgoJy0tbWF4LWZhaWx1cmVzPScpKSkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi5jb21tYW5kQXJncywgJy0tbWF4LWZhaWx1cmVzPTEnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhhcmdzOiBzdHJpbmdbXSk6IG51bWJlcltdIHtcbiAgbGV0IHBlbmRpbmdWYWx1ZU1vZGU6ICdvcHRpb25hbCcgfCAncmVxdWlyZWQnIHwgdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXRJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBhcmddIG9mIGFyZ3MuZW50cmllcygpKSB7XG4gICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUpIHtcbiAgICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlID09PSAncmVxdWlyZWQnIHx8ICFhcmcuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICByZXR1cm4gWy4uLnRhcmdldEluZGV4ZXMsIC4uLmFyZ3Muc2xpY2UoaW5kZXggKyAxKS5tYXAoKF8sIG9mZnNldCkgPT4gaW5kZXggKyAxICsgb2Zmc2V0KV07XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgaWYgKGFyZy5pbmNsdWRlcygnPScpKSBjb250aW51ZTtcbiAgICAgIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH0gZWxzZSBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdvcHRpb25hbCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctJykgJiYgYXJnICE9PSAnLScpIHtcbiAgICAgIGNvbnN0IHNob3J0T3B0aW9uID0gYXJnLnNsaWNlKDAsIDIpO1xuICAgICAgaWYgKGFyZy5sZW5ndGggPT09IDIgJiYgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKHNob3J0T3B0aW9uKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0YXJnZXRJbmRleGVzLnB1c2goaW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldEluZGV4ZXM7XG59XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbXG4gICctLWJyb3dzZXInLFxuICAnLS1jb25maWcnLFxuICAnLS1ncmVwJyxcbiAgJy0tZ3JlcC1pbnZlcnQnLFxuICAnLS1nbG9iYWwtdGltZW91dCcsXG4gICctLW1heC1mYWlsdXJlcycsXG4gICctLW91dHB1dCcsXG4gICctLXByb2plY3QnLFxuICAnLS1yZXBlYXQtZWFjaCcsXG4gICctLXJlcG9ydGVyJyxcbiAgJy0tcmV0cmllcycsXG4gICctLXNoYXJkJyxcbiAgJy0tdGVzdC1saXN0JyxcbiAgJy0tdGVzdC1saXN0LWludmVydCcsXG4gICctLXRpbWVvdXQnLFxuICAnLS10cmFjZScsXG4gICctLXRzY29uZmlnJyxcbiAgJy0tdWktaG9zdCcsXG4gICctLXVpLXBvcnQnLFxuICAnLS11aS10aXRsZScsXG4gICctLXdvcmtlcnMnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTID0gbmV3IFNldChbXG4gICctLW9ubHktY2hhbmdlZCcsXG4gICctLXVwZGF0ZS1zbmFwc2hvdHMnLFxuICAnLS11cGRhdGUtc291cmNlLW1ldGhvZCcsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFsnLWMnLCAnLWcnLCAnLWonXSk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBibGl0eiBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cywgdHlwZSBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRDb25maWcpIHtcbiAgICAgIHJldHVybiBzdXBlci50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHN0YXJ0Q29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYHdhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fVxuICAgICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgICAndml0ZXN0JyxcbiAgICAgICAgICAncnVuJyxcbiAgICAgICAgICAuLi4odGFyZ2V0cyAmJiB0YXJnZXRzLmxlbmd0aCA+IDAgPyB0YXJnZXRzIDogWyd0ZXN0L2UyZS8nXSksXG4gICAgICAgICAgJy0tY29sb3InLFxuICAgICAgICAgICctLXBhc3NXaXRoTm9UZXN0cycsXG4gICAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgICBdKX0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5leHQgZGV2IC0tdHVyYm9wYWNrICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgU0VSVkVSX0xPR19GSUxFIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0RGV2UHJvdGVjdGVkKF8xOiBQcm9qZWN0LCBfMjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZC4nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RGV2KF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9IHwgdGVlICR7U0VSVkVSX0xPR19GSUxFfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0VGVzdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICAgICl9YFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRVByb2R1Y3Rpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0RTJFRG9ja2VyKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBSZW1peCBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUmVtaXhTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHJlbWl4IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlbWl4U2NyaXB0cyA9IG5ldyBSZW1peFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBWaXRlLWJhc2VkIGFwcHMgd2l0aCBQbGF5d3JpZ2h0IGUyZSB0ZXN0cy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgVml0ZVNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiB2aXRlIGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFlBUk4gdml0ZSBwcmV2aWV3ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpdGVTY3JpcHRzID0gbmV3IFZpdGVTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJywgJ2hvbm8nXTtcbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFyZ3MsIHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCB0ZXN0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiU3RhcnQgYXBwLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIHRoZSB1bmRlcmx5aW5nIGFwcCBjb21tYW5kLiBFeGFtcGxlOiB3YiBzdGFydCAtLSAtLWhvc3QgMC4wLjAuMFwiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+XG4gICAgeWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KS5vcHRpb25zKGJ1aWxkZXIpIGFzIEFyZ3Y8XG4gICAgICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuICAgID4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHx8XG4gICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICApIHtcbiAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSA/PyAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdkZXZlbG9wbWVudCc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREZXYocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0YWdpbmcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnRQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA9IGAnL2Jpbi9iYXNoJ2A7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0gYXdhaXQgc2NyaXB0cy5zdGFydFRlc3QocHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFydCBtb2RlOiAke2FyZ3YubW9kZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGUyZToge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0UyZSB0ZXN0IG1vZGU6IGhlYWRsZXNzIChkZWZhdWx0KSB8IGhlYWRsZXNzLWRldiB8IGhlYWRlZCB8IGhlYWRlZC1kZXYgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCBkZWJ1ZyB8IGdlbmVyYXRlIHwgdHJhY2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFtcbiAgICAgICdoZWFkbGVzcycsXG4gICAgICAnaGVhZGxlc3MtZGV2JyxcbiAgICAgICdoZWFkZWQnLFxuICAgICAgJ2hlYWRlZC1kZXYnLFxuICAgICAgJ2RvY2tlcicsXG4gICAgICAnZG9ja2VyLWRlYnVnJyxcbiAgICAgICdkZWJ1ZycsXG4gICAgICAnZ2VuZXJhdGUnLFxuICAgICAgJ3RyYWNlJyxcbiAgICBdLFxuICAgIGRlZmF1bHQ6ICdoZWFkbGVzcycsXG4gIH0sXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGJhaWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0b3AgdGVzdHMgYWZ0ZXIgdGhlIGZpcnN0IGZhaWx1cmUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ3VuaXQtdGltZW91dCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWVvdXQgZm9yIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgdGFyZ2V0czoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGVzdCB0YXJnZXQgcGF0aHMnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIFRlc3RDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj47XG5cbmV4cG9ydCB0eXBlIFRlc3RBcmd2ID0gUGFydGlhbDxcbiAgQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4+O1xuXG5leHBvcnQgdHlwZSBUZXN0Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VGVzdENvbW1hbmRPcHRpb25zPiAmIHsgJy0tJz86IHN0cmluZ1tdIH07XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUZXN0Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndGVzdCBbdGFyZ2V0cy4uLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlRlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBmbGFncyB0byBQbGF5d3JpZ2h0LiBFeGFtcGxlOiB3YiB0ZXN0IC0tIC0tZ3JlcCAndXBsb2FkZWQgaW1hZ2UgYXNzZXQnXCIsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPik6IEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPiA9PlxuICAgIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLm9wdGlvbnMoeyAuLi5idWlsZGVyLCAuLi5hcmd1bWVudHNCdWlsZGVyIH0pIGFzIEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdChhcmd2IGFzIFRlc3RDb21tYW5kQXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChhcmd2OiBUZXN0Q29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIC8vIEdldCB0ZXN0IHRhcmdldHMgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICBjb25zdCB0ZXN0VGFyZ2V0cyA9IChhcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IGFyZ3ZbJy0tJ10gPz8gW107XG4gIGNvbnN0IHsgc2hvdWxkUnVuRTJlLCBzaG91bGRSdW5Vbml0IH0gPSByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHModGVzdFRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgLy8gUnVuIHVuaXQgdGVzdHMgaWYgbmVlZGVkXG4gICAgaWYgKHNob3VsZFJ1blVuaXQgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgICBjb25zdCB1bml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICAgICAgY29uc3QgdW5pdEFyZ3YgPSB7IC4uLmFyZ3YsIHRhcmdldHM6IHVuaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyB1bml0VGFyZ2V0cyA6IHVuZGVmaW5lZCB9O1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgdW5pdEFyZ3YpLCBwcm9qZWN0LCBhcmd2LCB7IHRpbWVvdXQ6IGFyZ3YudW5pdFRpbWVvdXQgfSk7XG4gICAgfVxuICAgIC8vIFNraXAgZTJlIHRlc3RzIGlmIG5vdCBuZWVkZWQgb3Igbm8gZTJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIXNob3VsZFJ1bkUyZSB8fCAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBlMmUgdGFyZ2V0cyBmb3IgdGhpcyBwcm9qZWN0XG4gICAgY29uc3QgZTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gICAgY29uc3QgZTJlQXJndiA9IHsgLi4uYXJndiwgdGFyZ2V0czogZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cyA6IHVuZGVmaW5lZCB9O1xuXG4gICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgY2FzZSAnaGVhZGxlc3MnOiB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndlxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3ZcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc1xuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc1xuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlcHMuYmxpdHogfHwgZGVwcy5uZXh0IHx8IGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10gfHwgZGV2RGVwcy52aXRlKSB7XG4gICAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IFsnY29kZWdlbicsIGBodHRwOi8vbG9jYWxob3N0OiR7cHJvamVjdC5lbnYuUE9SVH1gXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RyYWNlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgQlVOIHBsYXl3cmlnaHQgc2hvdy10cmFjZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RPbkRvY2tlcihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+LFxuICBzY3JpcHRzOiBCYXNlU2NyaXB0cyxcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2plY3QuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoXG4gIGUyZVRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXSxcbiAgYWRkaXRpb25hbEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncykubGVuZ3RoID4gMDtcbiAgcmV0dXJuIFsndGVzdCcsIC4uLihlMmVUYXJnZXRzLmxlbmd0aCA+IDAgfHwgaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMgPyBbXSA6IFsndGVzdC9lMmUvJ10pLCAuLi5hZGRpdGlvbmFsQXJnc107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHMoXG4gIHRlc3RUYXJnZXRzOiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHsgc2hvdWxkUnVuVW5pdDogYm9vbGVhbjsgc2hvdWxkUnVuRTJlOiBib29sZWFuIH0ge1xuICBjb25zdCBoYXNFMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gIGNvbnN0IGhhc1VuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IHRlc3RUYXJnZXRzLmxlbmd0aCA9PT0gMCAmJiBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPT09IDA7XG5cbiAgcmV0dXJuIHtcbiAgICBzaG91bGRSdW5Vbml0OiBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNVbml0VGFyZ2V0cyxcbiAgICBzaG91bGRSdW5FMmU6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc0UyZVRhcmdldHMgfHwgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MubGVuZ3RoID4gMCxcbiAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCB0ZXN0T25DaUJ1aWxkZXIgPSB7XG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHRlc3RPbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3Qtb24tY2knLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCBvbiBDSSB3aXRoIG5vIG9wdGlvbnMuJyxcbiAgYnVpbGRlcjogdGVzdE9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0T25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0T25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LkNJIHx8PSAnMSc7XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBoYXNEb2NrZXJmaWxlID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlO1xuICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgLy8gQ29uZmlybSBkZXYgc2VydmVyIHN0YXJ0dXAgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBwcm9qZWN0cyB3aXRoIEUyRSB0ZXN0cy5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBoYXNEb2NrZXJmaWxlXG4gICAgICAgID8gYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHt9KVxuICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHQucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbnRlcmZhY2UgVHJlZUtpbGxDb21tYW5kQXJncyB7XG4gIHBpZDogbnVtYmVyO1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuY29uc3QgYnVpbGRlciA9ICh5YXJnczogQXJndik6IEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz4gPT5cbiAgeWFyZ3NcbiAgICAucG9zaXRpb25hbCgncGlkJywge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcHJvY2VzcyBJRCB0byBraWxsLicsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ3NpZ25hbCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmFsIHRvIHNlbmQgdG8gdGhlIHByb2Nlc3MgdHJlZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnU0lHVEVSTScsXG4gICAgfSkgYXMgQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPjtcblxuZXhwb3J0IGNvbnN0IHRyZWVLaWxsQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxvYmplY3QsIFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0ge1xuICBjb21tYW5kOiAndHJlZS1raWxsIDxwaWQ+IFtzaWduYWxdJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBnaXZlbiBwcm9jZXNzIGFuZCBhbGwgZGVzY2VuZGFudHMnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2lnbmFsID0gYXJndi5zaWduYWwgYXMgTm9kZUpTLlNpZ25hbHM7XG4gICAgICBpZiAoIShzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaWduYWw6ICR7c2lnbmFsfWApO1xuICAgICAgfVxuICAgICAgdHJlZUtpbGwoYXJndi5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG5leHBvcnQgdHlwZSBUeXBlQ2hlY2tDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcHJvY2Vzcy5leGl0KGF3YWl0IHR5cGVDaGVjayhhcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHlwZUNoZWNrKGFyZ3Y6IFR5cGVDaGVja0NvbW1hbmRBcmd2KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGxldCByZW1vdmVkTmV4dERpciA9IGZhbHNlIGFzIGJvb2xlYW47XG4gIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG4gICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0Jyk7XG4gICAgICB9XG4gICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnB5cmlnaHQpIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHByb2plY3QuaGFzU291cmNlQ29kZSAmJlxuICAgICAgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KVxuICAgICkge1xuICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCcpO1xuICAgIH1cbiAgICB3aGlsZSAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgLy8gUmUtdHJ5IHR5cGUgY2hlY2tpbmcgYWZ0ZXIgcmVtb3ZpbmcgYC5uZXh0YCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IG5leHREaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy5uZXh0Jyk7XG4gICAgICBpZiAoZXhpdENvZGUgJiYgZnMuZXhpc3RzU3luYyhuZXh0RGlyUGF0aCkpIHtcbiAgICAgICAgZnMucm1TeW5jKG5leHREaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1JlbW92ZWQgYC5uZXh0YCBkaXJlY3RvcnkuIFdlIHdpbGwgcmUtdHJ5IHR5cGUgY2hlY2tpbmcuJykpO1xuICAgICAgICByZW1vdmVkTmV4dERpciA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgZXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gIGZvciAoY29uc3QgW2ksIGV4aXRDb2RlXSBvZiBleGl0Q29kZXMuZW50cmllcygpKSB7XG4gICAgaWYgKGV4aXRDb2RlKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdHMuZGVzY2VuZGFudHNbaV0/LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1BsZWFzZSB0cnkgXCJ5YXJuIGdlbi1jb2RlXCIgaWYgeW91IGZhY2UgdW5rbm93biB0eXBlIGVycm9ycy4nKSk7XG4gICAgICB9XG4gICAgICBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgfVxuICB9XG4gIGlmICghZmluYWxFeGl0Q29kZSlcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgcmVtb3ZlZE5leHREaXJcbiAgICAgICAgICA/ICctLS0tLVxcbk5vIHR5cGUgZXJyb3JzIGZvdW5kLiBQbGVhc2UgaWdub3JlIHRoZSBwcmV2aW91cyB0eXBlIGVycm9ycywgYXMgdGhleSB3ZXJlIGNhdXNlZCBieSBvdXRkYXRlZCBOZXh0LmpzIGNhY2hlIGZpbGVzLidcbiAgICAgICAgICA6ICdObyB0eXBlIGVycm9ycyBmb3VuZC4nXG4gICAgICApXG4gICAgKTtcbiAgcmV0dXJuIGZpbmFsRXhpdENvZGU7XG59XG5cbmV4cG9ydCBjb25zdCB0Y0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICAuLi50eXBlQ2hlY2tDb21tYW5kLFxuICBjb21tYW5kOiAndGMnLFxufTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFJvb3RBbmRTZWxmUHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBsaW50LCB0eXBlIExpbnRDb21tYW5kQXJndiB9IGZyb20gJy4vbGludC5qcyc7XG5pbXBvcnQgeyB0ZXN0LCB0eXBlIFRlc3RDb21tYW5kQXJndiB9IGZyb20gJy4vdGVzdC5qcyc7XG5pbXBvcnQgeyB0eXBlQ2hlY2sgfSBmcm9tICcuL3R5cGVjaGVjay5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCB2ZXJpZnlDb2RlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndmVyaWZ5LWNvZGUnLFxuICBkZXNjcmliZTogJ1ZlcmlmeSBwcm9qZWN0IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdmVyaWZ5Q29kZShwcm9qZWN0cy5zZWxmLCBhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCB2ZXJpZnlDb2RlV2l0aFRlc3RzQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndmVyaWZ5LWNvZGUtd2l0aC10ZXN0cycsXG4gIGRlc2NyaWJlOiAnVmVyaWZ5IHByb2plY3QgY29kZSBhbmQgcnVuIHRlc3RzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGF3YWl0IHZlcmlmeUNvZGUocHJvamVjdHMuc2VsZiwgYXJndik7XG4gICAgYXdhaXQgcnVuUHJvamVjdFRlc3QocHJvamVjdHMuc2VsZiwgYXJndik7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZCgnaW5zdGFsbCcsIGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsYCwgcHJvamVjdCwgYXJndiwgeyBzaWxlbnQ6IHRydWUgfSk7XG4gIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkge1xuICAgIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKCdnZW4tY29kZScsIGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHNpbGVudDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuICBhd2FpdCBydW5JblByb2Nlc3NDb21tYW5kKCdmb3JtYXQnLCAoKSA9PiBsaW50KHsgLi4uYXJndiwgXzogWydsaW50J10sIGZvcm1hdDogdHJ1ZSB9IGFzIExpbnRDb21tYW5kQXJndiksIHtcbiAgICBhbGxvd0ZhaWx1cmU6IHRydWUsXG4gIH0pO1xuICBhd2FpdCBydW5JblByb2Nlc3NDb21tYW5kKCd0eXBlY2hlY2snLCAoKSA9PiB0eXBlQ2hlY2soYXJndikpO1xuICBhd2FpdCBydW5JblByb2Nlc3NDb21tYW5kKCdsaW50LWZpeCcsICgpID0+XG4gICAgbGludCh7IC4uLmFyZ3YsIF86IFsnbGludCddLCBmaXg6IHRydWUsIHF1aWV0OiB0cnVlIH0gYXMgTGludENvbW1hbmRBcmd2KVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Qcm9qZWN0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8udGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnU3RhcnQ6JyksICd0ZXN0JykpO1xuICAgIGF3YWl0IHRlc3QoeyAuLi5hcmd2LCBfOiBbJ3Rlc3QnXSwgZTJlOiAnaGVhZGxlc3MnIH0gYXMgVGVzdENvbW1hbmRBcmd2KTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksICd0ZXN0JykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKCd0ZXN0JywgYCR7cGFja2FnZU1hbmFnZXJ9IHRlc3RgLCBwcm9qZWN0LCBhcmd2KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuSW5Qcm9jZXNzQ29tbWFuZChcbiAgY29tbWFuZE5hbWU6IHN0cmluZyxcbiAgY29tbWFuZDogKCkgPT4gUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+LFxuICBvcHRpb25zOiB7IGFsbG93RmFpbHVyZT86IGJvb2xlYW4gfSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ1N0YXJ0OicpLCBjb21tYW5kTmFtZSkpO1xuICBjb25zdCBleGl0Q29kZSA9IChhd2FpdCBjb21tYW5kKCkpID8/IDA7XG4gIGlmIChleGl0Q29kZSA9PT0gMCB8fCBvcHRpb25zLmFsbG93RmFpbHVyZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgY29tbWFuZE5hbWUpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgY29tbWFuZE5hbWUpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFja2FnZUNvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2LFxuICBvcHRpb25zOiB7IGFsbG93RmFpbHVyZT86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ1N0YXJ0OicpLCBjb21tYW5kTmFtZSkgKyBjaGFsay5ncmF5KGAgYXQgJHtwcm9qZWN0LmRpclBhdGh9YCkpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyYXkoY2hhbGsuYm9sZCgnU3RhcnQgKHJhdyk6JyksIGNvbW1hbmQpKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIGNvbW1hbmROYW1lKSk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKGNvbW1hbmQsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IGZvcmNlQ29sb3I6IHRydWUgfSksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86IG9wdGlvbnMuc2lsZW50ID8gWydpZ25vcmUnLCAnaWdub3JlJywgJ2luaGVyaXQnXSA6ICdpbmhlcml0JyxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSk7XG5cbiAgaWYgKHJldC5zdGF0dXMgPT09IDAgfHwgb3B0aW9ucy5hbGxvd0ZhaWx1cmUpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIGNvbW1hbmROYW1lKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke3JldC5zdGF0dXN9KTpgKSwgY29tbWFuZE5hbWUpKTtcbiAgICBwcm9jZXNzLmV4aXQocmV0LnN0YXR1cyA/PyAxKTtcbiAgfVxuICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzLCB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGNvbmN1cnJlbnRseUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NvbmN1cnJlbnRseS5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdHJlZUtpbGxDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90cmVlS2lsbC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyB2ZXJpZnlDb2RlQ29tbWFuZCwgdmVyaWZ5Q29kZVdpdGhUZXN0c0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ZlcmlmeUNvZGUuanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnd2InKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLm1pZGRsZXdhcmUoKGFyZ3YpID0+IHtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gYXJndlsnd29ya2luZy1kaXInXTtcbiAgICBpZiAod29ya2luZ0Rpcikge1xuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyKTtcbiAgICAgIHByb2Nlc3MuY2hkaXIoZGlyUGF0aCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcbiAgfSlcbiAgLmNvbW1hbmQodmVyaWZ5Q29kZVdpdGhUZXN0c0NvbW1hbmQpXG4gIC5jb21tYW5kKHZlcmlmeUNvZGVDb21tYW5kKVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQoY29uY3VycmVudGx5Q29tbWFuZClcbiAgLmNvbW1hbmQoa2lsbFBvcnRJZk5vbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQobGludENvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc3RhcnRDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdE9uQ2lDb21tYW5kKVxuICAuY29tbWFuZCh0cmVlS2lsbENvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgaWYgKHNodXR0aW5nRG93bikgcmV0dXJuO1xuXG4gICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdHJlZUtpbGwocHJvY2Vzcy5waWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2Nlc3MucGlkfSkgZHVyaW5nIHNodXRkb3duOmAsIGVycm9yKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KCk7XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbInlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYiLCJlbnYiLCJkZXNjcmlwdGlvbiIsInR5cGUiLCJkZWZhdWx0IiwidmVyYm9zZSIsImFsaWFzIiwiY2FjaGVkRW52VmFycyIsIk1hcCIsInJlYWRFbnZGaWxlIiwiZmlsZVBhdGgiLCJjYWNoZWQiLCJnZXQiLCJwYXJzZWQiLCJjb25maWciLCJwYXRoIiwicmVzb2x2ZSIsInByb2Nlc3NFbnYiLCJzZXQiLCJpc0Vycm5vRXhjZXB0aW9uIiwiZXJyb3IiLCJFcnJvciIsInRyZWVLaWxsIiwicGlkIiwic2lnbmFsIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwicHJvY2VzcyIsInBsYXRmb3JtIiwicnVuQ29tbWFuZCIsIlN0cmluZyIsIm1heEJ1ZmZlciIsInRpbWVvdXQiLCJpc05vU3VjaFByb2Nlc3NFcnJvciIsImtpbGxUcmVlT25XaW5kb3dzIiwiZGVzY2VuZGFudHMiLCJyb290UGlkIiwic3Rkb3V0IiwiY2hpbGRyZW5CeVBhcmVudCIsInBzT3V0cHV0IiwibGluZSIsInNwbGl0IiwibWF0Y2hlZCIsImV4ZWMiLCJjaGlsZFBpZCIsInBhcmVudFBpZCIsImNoaWxkcmVuIiwicHVzaCIsImJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcCIsInF1ZXVlIiwiaW5kZXgiLCJsZW5ndGgiLCJjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwIiwiY29sbGVjdERlc2NlbmRhbnRQaWRzIiwidGFyZ2V0UGlkcyIsInRvUmV2ZXJzZWQiLCJ0b0NoaWxkcmVuRmlyc3RQaWRzIiwidGFyZ2V0UGlkIiwia2lsbElmTmVlZGVkIiwia2lsbCIsImNvbW1hbmQiLCJhcmdzIiwib3B0aW9ucyIsImV4ZWNGaWxlU3luYyIsImVuY29kaW5nIiwic3RkaW8iLCJzdGRlcnIiLCJCdWZmZXIiLCJpc0J1ZmZlciIsInRvU3RyaW5nIiwiZXh0cmFjdFN0ZGVyciIsIkNvbW1hbmRFeGVjdXRpb25FcnJvciIsImNvZGUiLCJzdGF0dXMiLCJ0b0V4aXRDb2RlIiwidGVzdCIsImNvbnN0cnVjdG9yIiwic3VwZXIiLCJqb2luIiwidGhpcyIsIm5hbWUiLCJhc3luYyIsInNwYXduQXN5bmMiLCJQcm9taXNlIiwicmVqZWN0IiwicHJvYyIsInNwYXduIiwic2V0RW5jb2RpbmciLCJvbiIsImRhdGEiLCJwcmludGluZ1N0ZG91dCIsIndyaXRlIiwibWVyZ2VPdXRBbmRFcnJvciIsInByaW50aW5nU3RkZXJyIiwic3RvcHBlZCIsInN0b3BQcm9jZXNzIiwiY29uc29sZSIsImluZm8iLCJ3YXJuIiwiY2xlYW51cFNpZ25hbHMiLCJzaWduYWxIYW5kbGVycyIsInJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycyIsInJlbW92ZUxpc3RlbmVyIiwiaGFuZGxlciIsImNsZWFyIiwia2lsbE9uRXhpdCIsImhhbmRsZVNpZ25hbCIsImxpc3RlbmVyQ291bnQiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJ1bmRlZmluZWQiLCJpbnB1dCIsInN0ZGluIiwiZW5kIiwidCIsInMiLCJpIiwiZSIsIm4iLCJlbnRyaWVzIiwiaCIsImJsb2NrcyIsInJlc2V0IiwiZmluYWxpemVkIiwiYmxvY2siLCJzdGFydCIsImxhc3RCeXRlSW5kZXgiLCJwYWRkaW5nIiwib3V0cHV0Qml0cyIsImJsb2NrQ291bnQiLCJieXRlQ291bnQiLCJvdXRwdXRCbG9ja3MiLCJleHRyYUJ5dGVzIiwidXBkYXRlIiwibyIsImwiLCJjIiwiZiIsImNvZGVQb2ludEF0IiwiciIsImZpbmFsaXplIiwiaGV4IiwiYSIsInUiLCJkIiwiYiIsImsiLCJ5IiwieCIsIkIiLCJwIiwiQyIsInoiLCJJIiwiZyIsInciLCJBIiwiUCIsIkUiLCJqIiwibSIsInEiLCJ2IiwiRCIsIkYiLCJHIiwiSCIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCIkIiwiXyIsInR0Iiwic3QiLCJpdCIsImV0Iiwib3QiLCJudCIsImh0IiwicnQiLCJsdCIsImN0IiwiZnQiLCJpbnN0YW5jZSIsImZyb20iLCJtZXNzYWdlIiwic3RhY2siLCJjYXVzZSIsInN0dWIiLCJoeWRyYXRlIiwiVWludDhBcnJheSIsImJ0b2EiLCJkZWNvZGUiLCJjcmVhdGUiLCJlbmNvZGUiLCJhdG9iIiwiU2V0IiwidmFsdWVzIiwiYWRkIiwiRGF0ZSIsInRvSlNPTiIsIlJlZ0V4cCIsImZsYWdzIiwic291cmNlIiwiVVJMIiwiaHJlZiIsIm1hcCIsIlRleHRFbmNvZGVyIiwiVGV4dERlY29kZXIiLCJKU09OIiwic3RyaW5naWZ5IiwiaXNOYU4iLCJpc0Zpbml0ZSIsIkFycmF5IiwiaXNBcnJheSIsImZpbGwiLCJzbGljZSIsIk9iamVjdCIsImNhY2hlRHVyYXRpb24iLCJQT1NJVElWRV9JTkZJTklUWSIsImdldENhY2hlS2V5Iiwia2luZCIsIm5vdyIsImNhbGwiLCJpc0NJIiwiY2lFbnYiLCJQcm9qZWN0IiwiX2luaXRQcm90byIsIl9hcHBseURlY3MiLCJtZW1vaXplT25lIiwiYXJndiIsInBhdGhCeU5hbWUiLCJkaXJQYXRoIiwibG9hZEVudiIsIl9kaXJQYXRoIiwiaXNCdW5BdmFpbGFibGUiLCJmcyIsInJlYWRGaWxlU3luYyIsInJvb3REaXJQYXRoIiwiYnVpbGRDb21tYW5kIiwicGFja2FnZUpzb24iLCJzY3JpcHRzIiwiYnVpbGQiLCJpbmNsdWRlcyIsImV4aXN0c1N5bmMiLCJkb2NrZXJmaWxlIiwiZmluZEZpbGUiLCJoYXNEb2NrZXJmaWxlIiwiaGFzU291cmNlQ29kZSIsImRvY2tlckltYWdlTmFtZSIsInJlcGxhY2VBbGwiLCJlbnZWYXJzIiwiZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMiLCJjd2QiLCJlbnZQYXRocyIsImVudlBhdGgiLCJjYXNjYWRlIiwiY2FzY2FkZUVudiIsImNhc2NhZGVOb2RlRW52IiwiTk9ERV9FTlYiLCJhdXRvQ2FzY2FkZUVudiIsIldCX0VOViIsImluY2x1ZGVSb290RW52Iiwicm9vdFBhdGgiLCJmbGF0TWFwIiwiZmlsdGVyIiwicmVsYXRpdmUiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMiLCJrZXlzIiwia2V5IiwidmFsdWUiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwiZXhwYW5kIiwicmVhZEVudmlyb25tZW50VmFyaWFibGVzIiwiY291bnQiLCJwYXJzZSIsInBhY2thZ2VKc29uUGF0aCIsImhhc1ByaXNtYSIsImdldE93bkRlcGVuZGVuY3lWZXJzaW9uIiwiaGFzRHJpenpsZSIsImRhdGFiYXNlT3JtIiwiaGFzVml0ZXN0IiwiZGVwZW5kZW5jaWVzIiwidml0ZXN0IiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzQmlvbWUiLCJoYXNEZXBlbmRlbmN5IiwiaGFzRXNsaW50IiwiaGFzT3hsaW50IiwiaGFzT3hmbXQiLCJoYXNQb2V0cnlMb2NrIiwiaGFzUHVic3BlY1lhbWwiLCJwcmVmZXJyZWRMaW50ZXIiLCJoYXNQbGF5d3JpZ2h0Q29uZmlnIiwic2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQiLCJDSSIsImNvbmZpZ1BhdGgiLCJkb2NrZXJQYWNrYWdlSnNvbiIsImRpcm5hbWUiLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmlsZU5hbWUiLCJmaW5kIiwicGFja2FnZU5hbWUiLCJnZXREZXBlbmRlbmN5VmVyc2lvbiIsInJvb3RQYWNrYWdlSnNvbiIsIm9wdGlvbmFsRGVwZW5kZW5jaWVzIiwicGVlckRlcGVuZGVuY2llcyIsImZpbmRTZWxmUHJvamVjdCIsImZpbmREZXNjZW5kYW50UHJvamVjdHMiLCJyb290QW5kU2VsZlByb2plY3RzIiwiZmluZFJvb3RBbmRTZWxmUHJvamVjdHMiLCJyb290Iiwic2VsZiIsImdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyIsInRoaXNQcm9qZWN0Iiwicm9vdFByb2plY3QiLCJ3b3Jrc3BhY2VzIiwiZW5kc1dpdGgiLCJwcm9qZWN0cyIsIndvcmtzcGFjZSIsImdsb2JQYXR0ZXJuIiwicGFja2FnZURpcnMiLCJ3b3Jrc3BhY2VQYXRoIiwid3MiLCJnbG9iYnkiLCJkb3QiLCJvbmx5RGlyZWN0b3JpZXMiLCJzdWJQYWNrYWdlRGlyUGF0aCIsImlzUnVubmluZ09uQnVuIiwidmVyc2lvbnMiLCJidW4iLCJucG1fZXhlY3BhdGgiLCJydW50aW1lV2l0aEFyZ3MiLCJwYWNrYWdlTWFuYWdlciIsInBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsImJ1aWxkSWZOZWVkZWRDb21tYW5kIiwiZGVzY3JpYmUiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJwcm9qZWN0IiwiY2hhbGsiLCJyZWQiLCJncmVlbiIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwidHJpbSIsImVudmlyb25tZW50SnNvbiIsImlnbm9yaW5nRW52VmFyTmFtZXMiLCJoYXMiLCJ0b1NvcnRlZCIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkRmlsZVBhdGhzIiwic3Bhd25TeW5jIiwicmVwbGFjZSIsImluY2x1ZGVQYXR0ZXJucyIsInNvbWUiLCJwYXR0ZXJuIiwiaW5jbHVkZVN1ZmZpeCIsInN1ZmZpeCIsImV4Y2x1ZGVQYXR0ZXJucyIsImNvcHkiLCJkaWdlc3QiLCJ1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQiLCJjYWNoZWRDb250ZW50SGFzaCIsImZuIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkRmlsZSIsImNhblNraXBCdWlsZCIsImRyeVJ1biIsIndyaXRlRmlsZSIsImJ1aWxkSWZOZWVkZWQiLCJyZXQiLCJzaGVsbCIsImV4aXRDb2RlIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwic2NyaXB0Iiwib3B0cyIsIm5vcm1hbGl6ZWRTY3JpcHQiLCJub3JtYWxpemVTY3JpcHQiLCJwcmludFN0YXJ0IiwicHJpbnRhYmxlIiwicnVubmFibGUiLCJwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkIiwiY29uZmlndXJlRW52Iiwib25TaWduYWwiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsIiwicnVuQW5kV2FpdEZvclJldHVyblZhbHVlIiwib3V0IiwibmV3U2NyaXB0IiwiYmxpdHoiLCJwcmludGFibGVTY3JpcHQiLCJmaXhCdW5Db21tYW5kIiwicnVubmFibGVTY3JpcHQiLCJjYXNjYWRlT3B0aW9uIiwicHJlZml4Iiwid2VhayIsImdyYXkiLCJjeWFuIiwiYm9sZCIsImV4aXQiLCJuZXdFbnYiLCJjaSIsImZvcmNlQ29sb3IiLCJGT1JDRV9DT0xPUiIsInNoYXJlZE9wdGlvbnNCdWlsZGVyIiwiYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIiwib3B0aW9uTmFtZSIsImdldE9wdGlvblZhbHVlIiwiaXRlbSIsImNhbWVsQ2FzZU9wdGlvbk5hbWUiLCJjaGFyYWN0ZXIiLCJ0b1VwcGVyQ2FzZSIsImNvbmN1cnJlbnRseUNvbW1hbmQiLCJidWlsZGVyIiwic3VjY2VzcyIsImNob2ljZXMiLCJjb21tYW5kcyIsIkJvb2xlYW4iLCJkZXRhY2hlZCIsImludGVycnVwdGVkU2lnbmFsIiwiZmlyc3RSZXN1bHQiLCJzdG9wUmVzdWx0Iiwic3RvcHBpbmciLCJmb3JjZUtpbGxQcm9taXNlcyIsInJlc3VsdHMiLCJ3YWl0Rm9yRXhpdFByb21pc2VzIiwiY2hpbGQiLCJzZXR0bGVkIiwic2V0dGxlIiwia2lsbE90aGVycyIsImtpbGxPdGhlcnNPbkZhaWwiLCJzaG91bGRTdG9wT3RoZXJzIiwidGVybWluYXRlQ2hpbGRyZW4iLCJvbmNlIiwiZ2V0RXhpdENvZGUiLCJzdG9wQWxsIiwic3RvcE9uU2lnaW50Iiwic3RvcE9uU2lndGVybSIsInN0b3BPblNpZ3F1aXQiLCJhbGwiLCJyZXN1bHQiLCJydW5Db25jdXJyZW50bHkiLCJjb25zdGFudHMiLCJzaWduYWxzIiwiZm9yY2VLaWxsUGlkcyIsInNpZ25hbFBpZHMiLCJ0b0NoaWxkUGlkcyIsInBpZHMiLCJkZWFkbGluZSIsImV2ZXJ5IiwiaXNQcm9jZXNzR3JvdXBHb25lIiwic2xlZXAiLCJNYXRoIiwibWluIiwid2FpdEZvckZvcmNlS2lsbCIsInNpZ25hbGVkUGlkcyIsImtpbGxQcm9jZXNzR3JvdXAiLCJtcyIsInNldFRpbWVvdXQiLCJraWxsUG9ydElmTm9uQ2lDb21tYW5kIiwicG9ydEVudiIsIlBPUlQiLCJwb3J0Iiwia2lsbFBvcnRQcm9jZXNzIiwia2lsbFBvcnRJZk5vbkNpIiwiYnVpbGRTaGVsbENvbW1hbmQiLCJhcmciLCJzaGVsbEVzY2FwZUFyZ3VtZW50IiwiYmlvbWVFeHRlbnNpb25zIiwiZXNsaW50RXh0ZW5zaW9ucyIsIm94bGludEV4dGVuc2lvbnMiLCJweXRob25FeHRlbnNpb25zIiwiZGFydEV4dGVuc2lvbnMiLCJveGZtdEV4dGVuc2lvbnMiLCJwcmV0dGllckV4dGVuc2lvbnMiLCJwcmV0dGllck9ubHlFeHRlbnNpb25zIiwiZXh0IiwicHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybiIsImxpbnRDb21tYW5kIiwiZml4IiwiZm9ybWF0IiwicXVpZXQiLCJsaW50IiwiZmlsZXMiLCJsaW50VGFyZ2V0cyIsImdldExpbnRUYXJnZXRGaWxlcyIsImxpbnRGaWxlUGF0aHNCeVByb2plY3QiLCJveGZtdEZpbGVQYXRoc0J5UHJvamVjdCIsInB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdCIsImRhcnRGaWxlUGF0aHNCeVByb2plY3QiLCJwcmV0dGllckZpbGVQYXRocyIsInBhY2thZ2VKc29uRmlsZVBhdGhzIiwicHJldHRpZXJBcmdzIiwic29ydFBhY2thZ2VKc29uQXJncyIsIm1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMiLCJmaWxlIiwiZmlsZUtpbmQiLCJzdGF0IiwiaXNEaXJlY3RvcnkiLCJnZXRMaW50VGFyZ2V0RmlsZUtpbmQiLCJleHRlbnNpb24iLCJleHRuYW1lIiwiZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzIiwibGludFBhdGgiLCJnZXRFeHBsaWNpdExpbnRUYXJnZXRzIiwicHl0aG9uRmlsZVBhdGhzIiwiZGFydEZpbGVQYXRocyIsInN1cHBvcnRzTGludGluZ0V4dGVuc2lvbiIsImxpbnRGaWxlUGF0aHMiLCJmb3JtYXR0ZXJQYXRoIiwiYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MiLCJveGZtdEZpbGVQYXRocyIsImlzUG90ZW50aWFsTGludFRhcmdldCIsInNlbGZEaXJQYXRoIiwibmVlZHNQcmV0dGllciIsInByb2plY3RQYXR0ZXJuIiwiYnVpbGRQcmV0dGllckFyZ3MiLCJsaW50UHJvbWlzZXMiLCJsaW50UnVuT3B0aW9ucyIsImJ1aWxkTGludENvbW1hbmQiLCJidWlsZE94Zm10Q29tbWFuZCIsImJ1aWxkUG9ldHJ5Q29tbWFuZCIsImJ1aWxkRGFydENvbW1hbmQiLCJsaW50RXhpdENvZGVzIiwiYmlvbWVBcmdzIiwidGFyZ2V0cyIsInNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllciIsInN0YXJ0c1dpdGgiLCJkZXNjZW5kYW50UHJvamVjdHMiLCJvd25pbmdQcm9qZWN0IiwiZmluZE93bmluZ1Byb2plY3QiLCJwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQiLCJjb21tYW5kTmFtZSIsIm9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIiwib3V0c2lkZSIsImRlcHMiLCJvcHRpbWl6ZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplU2NyaXB0cyIsIm9wdGltaXplUm9vdFByb3BzIiwiZGlzdERpclBhdGgiLCJkZXZEZXBzIiwibmFtZVdvcmRzVG9CZVJlbW92ZWQiLCJyZW1vdmVkRGVwcyIsIndvcmQiLCJuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwicmVtb3ZlZFNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsIkZJTEVfU0NIRU1BIiwiZHJpenpsZVNjcmlwdHMiLCJkZXBsb3kiLCJhZGRpdGlvbmFsT3B0aW9ucyIsIm1pZ3JhdGUiLCJfcHJvamVjdCIsIm1pZ3JhdGVEZXYiLCJyZW1vdmVDb21tYW5kIiwiZGJQYXRoIiwiREFUQUJBU0VfUEFUSCIsImRiVXJsIiwiREFUQUJBU0VfVVJMIiwicmF3RGJQYXRoIiwiZ2V0RmlsZURhdGFiYXNlVXJsUGF0aCIsImFic29sdXRlUGF0aCIsImlzQWJzb2x1dGUiLCJidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZCIsInNlZWQiLCJzY3JpcHRQYXRoIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJQT1NTSUJMRV9QUklTTUFfUEFUSFMiLCJzY2hlbWFQYXRoIiwiZ2V0RGF0YWJhc2VEaXJQYXRoIiwiZ2V0UHJpc21hQmFzZURpciIsInByaXNtYVNjcmlwdHMiLCJjbGVhblVwTGl0ZXN0cmVhbSIsImRlcGxveUZvcmNlIiwicmVtb3ZlRGJDb21tYW5kIiwibGlzdEJhY2t1cHMiLCJzdGVwcyIsImNsZWFudXBDb21tYW5kIiwiYmFzZURpciIsImNsZWFuVXBTcWxpdGVEYklmTmVlZGVkIiwicmVzZXRDb21tYW5kIiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJwcmlzbWEiLCJwcmlzbWFDb21tYW5kIiwiYWxpYXNlcyIsInlhcmdzIiwicGFyc2VyQ29uZmlndXJhdGlvbiIsImNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZCIsImNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kIiwiZGVwbG95Q29tbWFuZCIsImRlcGxveUZvcmNlQ29tbWFuZCIsImxpc3RCYWNrdXBzQ29tbWFuZCIsIm1pZ3JhdGVDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInNlZWRDb21tYW5kIiwic3R1ZGlvQ29tbWFuZCIsImRlZmF1bHRDb21tYW5kIiwiZGVtYW5kQ29tbWFuZCIsInN0cmljdCIsImFsbFByb2plY3RzIiwiZmluZERhdGFiYXNlT3JtUHJvamVjdHMiLCJwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCIsImNyZWF0ZUxpdGVzdHJlYW1Db25maWciLCJ1bmtub3duT3B0aW9ucyIsImV4dHJhY3RVbmtub3duT3B0aW9ucyIsIm9ybSIsImdldERhdGFiYXNlT3JtU2NyaXB0cyIsIm91dHB1dCIsInJlc3RvcmVkIiwiZnVsbENvbW1hbmQiLCJ0cmltRW5kIiwicmVxdWlyZWRFbnZWYXJzIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUUiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSIsIm1pc3NpbmdFbnZWYXJzIiwicmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCIsImxpdGVzdHJlYW1Db25maWciLCJ3cml0ZUZpbGVTeW5jIiwicmVhc29uIiwiZmlsdGVyZWQiLCJvcm1Qcm9qZWN0QnlQcm9qZWN0Iiwib3JtUHJvamVjdCIsImtub3duT3B0aW9ucyIsInNoYXJlZE9wdGlvbktleXMiLCJzaGFyZWRPcHRpb25BbGlhc2VzIiwib3B0aW9uIiwiYWxsS25vd25PcHRpb25zIiwia2ViYWJDYXNlS2V5IiwibWF0Y2giLCJ0b0xvd2VyQ2FzZSIsInBhc3N0aHJvdWdoQXJncyIsInJldHJ5Q29tbWFuZCIsInJldHJ5IiwiY21kQW5kQXJncyIsImxhc3RTdGF0dXMiLCJ5ZWxsb3ciLCJzZXR1cENvbW1hbmQiLCJkaXJlbnRzIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJvcyIsInBhY2thZ2VzIiwiaXNGaWxlIiwidmVyc2lvbiIsInByb21pc2VBbGwiLCJwbGF5d3JpZ2h0Iiwic2V0dXAiLCJ0b0Rldk51bGwiLCJzaWxlbnQiLCJraWxsZWQiLCJraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCIsImF2YWlsYWJsZSIsImhvc3QiLCJwcm9iZVBvcnQiLCJpc1BvcnRBdmFpbGFibGUiLCJraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MiLCJraWxsRnVuYyIsImZpbHRlckFyZ3MiLCJjb250YWluZXJJZHMiLCJpZCIsImxpc3REb2NrZXJDb250YWluZXJJZHMiLCJyZW1vdmVEb2NrZXJDb250YWluZXJzIiwic3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydCIsImNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIiwicmF3UG9ydCIsInNlcnZlciIsImNyZWF0ZVNlcnZlciIsImVyciIsImNsb3NlIiwibGlzdGVuIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkSW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJCYXNlU2NyaXB0cyIsInNob3VsZFdhaXRBbmRPcGVuQXBwIiwiYnVpbGREb2NrZXIiLCJzdGFydERldiIsInN0YXJ0RGV2UHJvdGVjdGVkIiwid2FpdEFuZE9wZW5BcHAiLCJzdGFydFByb2R1Y3Rpb24iLCJzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQiLCJzdGFydFRlc3QiLCJzdGFydERvY2tlciIsIm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCIsIm5vcm1hbGl6ZWRBcmdzVGV4dCIsImVjb3N5c3RlbUNvbmZpZ1BhdGgiLCJmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aCIsImNtZCIsInRlc3RFMkVEZXYiLCJ0ZXN0RTJFUHJvdGVjdGVkIiwidGVzdEUyRVByb2R1Y3Rpb24iLCJ0ZXN0RTJFRG9ja2VyIiwidGVzdFN0YXJ0Iiwid2FpdEFwcCIsInN0YXJ0Q29tbWFuZCIsImZvcndhcmRlZFBsYXl3cmlnaHRBcmdzIiwicGxheXdyaWdodEFyZ3MiLCJwbGF5d3JpZ2h0Q29tbWFuZCIsImJhaWwiLCJiYXNlIiwibm9ybWFsaXplZFRhcmdldHMiLCJhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbiIsInJlc3QiLCJleHBsaWNpdFRhcmdldEluZGV4ZXMiLCJmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyIsInJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQiLCJidWlsZFBsYXl3cmlnaHRDb21tYW5kIiwidGVzdFVuaXQiLCJjb21tYW5kQXJncyIsInBsYXl3cmlnaHRJbmRleCIsImluZGV4T2YiLCJpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCIsInBlbmRpbmdWYWx1ZU1vZGUiLCJ0YXJnZXRJbmRleGVzIiwib2Zmc2V0IiwiUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMiLCJQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUyIsInNob3J0T3B0aW9uIiwiUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMiLCJibGl0elNjcmlwdHMiLCJodHRwU2VydmVyU2NyaXB0cyIsIndhdGNoIiwibmV4dFNjcmlwdHMiLCJwbGFpbkFwcFNjcmlwdHMiLCJfMSIsIl8yIiwicmVtaXhTY3JpcHRzIiwidml0ZVNjcmlwdHMiLCJodHRwU2VydmVyUGFja2FnZXMiLCJtb2RlIiwiZG9ja2VyT3B0aW9ucyIsIm5vcm1hbGl6ZUFyZ3MiLCJuZXh0Iiwidml0ZSIsImUyZSIsImFyZ3VtZW50c0J1aWxkZXIiLCJ0ZXN0Q29tbWFuZCIsInRlc3RUYXJnZXRzIiwic2hvdWxkUnVuRTJlIiwic2hvdWxkUnVuVW5pdCIsImhhc0UyZVRhcmdldHMiLCJ0YXJnZXQiLCJoYXNVbml0VGFyZ2V0cyIsInNob3VsZFJ1bkFsbFRlc3RzIiwicmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzIiwidW5pdFRhcmdldHMiLCJ1bml0QXJndiIsInVuaXRUaW1lb3V0IiwiZTJlVGFyZ2V0cyIsImUyZUFyZ3YiLCJidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFIiwidGVzdE9uRG9ja2VyIiwiV0JfRE9DS0VSIiwiaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMiLCJ0ZXN0T25DaUNvbW1hbmQiLCJ0ZXN0T25DaSIsInRyZWVLaWxsQ29tbWFuZCIsInBvc2l0aW9uYWwiLCJkZW1hbmRPcHRpb24iLCJ0eXBlQ2hlY2tDb21tYW5kIiwidHlwZUNoZWNrIiwicmVtb3ZlZE5leHREaXIiLCJ0eXBlc2NyaXB0IiwicHlyaWdodCIsIm5leHREaXJQYXRoIiwicm1TeW5jIiwiZm9yY2UiLCJleGl0Q29kZXMiLCJmaW5hbEV4aXRDb2RlIiwidGNDb21tYW5kIiwidmVyaWZ5Q29kZUNvbW1hbmQiLCJ2ZXJpZnlDb2RlIiwidmVyaWZ5Q29kZVdpdGhUZXN0c0NvbW1hbmQiLCJydW5QYWNrYWdlQ29tbWFuZCIsInJ1blByb2plY3RUZXN0IiwicnVuSW5Qcm9jZXNzQ29tbWFuZCIsImFsbG93RmFpbHVyZSIsImhpZGVCaW4iLCJzY3JpcHROYW1lIiwibWlkZGxld2FyZSIsIndvcmtpbmdEaXIiLCJjaGRpciIsIkJFUlJZX0JJTl9GT0xERVIiLCJ1cHBlcktleSIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhY2thZ2VKc29uRGlyIiwidXJsIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwiaGVscCIsInNodXR0aW5nRG93biJdLCJtYXBwaW5ncyI6IjRoQkFPTyxNQUFNQSxFQUE0QixDQUN2Q0MsSUFBSyxDQUNIQyxZQUFhLDJCQUNiQyxLQUFNLFNBRVIsY0FBZSxDQUNiRCxZQUNFLHdMQUNGQyxLQUFNLFVBRVIsbUJBQW9CLENBQ2xCRCxZQUFhLDBGQUNiQyxLQUFNLFdBRVIsbUJBQW9CLENBQ2xCRCxZQUFhLGlFQUNiQyxLQUFNLFVBQ05DLFNBQVMsR0FFWCxtQkFB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QUFJTixFQUFFTSxHQUFHLEdBQUcsTUFBTWlCLENBQUMsRUFBRSxNQUFNRSxFQUFFLFNBQVN6QixHQUFHLElBQUlDLEVBQUVDLEVBQUVrQixFQUFFaEIsRUFBRUUsRUFBRW1CLEVBQUVKLEVBQUVDLEVBQUVDLEVBQUVLLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUcsSUFBSTdELEVBQUUsRUFBRUEsRUFBRSxHQUFHQSxHQUFHLEVBQUVoQixFQUFFSixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSU0sRUFBRU4sRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUl5QixFQUFFekIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlxQixFQUFFckIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlzQixFQUFFdEIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUl1QixFQUFFdkIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUk0QixFQUFFNUIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFB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
|
|
9
|
+
*/const O=[..."0123456789abcdef"],T=[6,1536,393216,100663296],I=[0,8,16,24],_=[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 C=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class B{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<<I[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<I[3&i++],t[i>>2]|=(128|63&a)<<I[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<I[3&i++],t[i>>2]|=(128|a>>6&63)<<I[3&i++],t[i>>2]|=(128|63&a)<<I[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<I[3&i++],t[i>>2]|=(128|a>>12&63)<<I[3&i++],t[i>>2]|=(128|a>>6&63)<<I[3&i++],t[i>>2]|=(128|63&a)<<I[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];L(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];L(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+=O[o>>4&15]+O[15&o]+O[o>>12&15]+O[o>>8&15]+O[o>>20&15]+O[o>>16&15]+O[o>>28&15]+O[o>>24&15];i%e===0&&(t=C(t),L(t),s=0)}return r&&(o=t[s],a+=O[o>>4&15]+O[15&o],r>1&&(a+=O[o>>12&15]+O[o>>8&15]),r>2&&(a+=O[o>>20&15]+O[o>>16&15])),a}}const L=function(e){let t,n,r,o,s,i,a,c,d,l,u,p,f,h,m,g,y,w,b,v,k,A,E,P,$,S,x,R,j,N,D,O,T,I,C,B,L,F,z,U,M,W,J,Y,V,q,G,K,H,Q,X,Z,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],q=e[11]<<4|e[10]>>>28,G=e[10]<<4|e[11]>>>28,R=e[20]<<3|e[21]>>>29,j=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,I=e[2]<<1|e[3]>>>31,C=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,y=e[12]<<12|e[13]>>>20,K=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,N=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,B=e[14]<<6|e[15]>>>26,L=e[15]<<6|e[14]>>>26,w=e[25]<<11|e[24]>>>21,b=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,X=e[35]<<15|e[34]>>>17,O=e[45]<<29|e[44]>>>3,T=e[44]<<29|e[45]>>>3,P=e[6]<<28|e[7]>>>4,$=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,Z=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,S=e[18]<<20|e[19]>>>12,x=e[19]<<20|e[18]>>>12,se=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,U=e[38]<<8|e[39]>>>24,M=e[39]<<8|e[38]>>>24,A=e[48]<<14|e[49]>>>18,E=e[49]<<14|e[48]>>>18,e[0]=h^~g&w,e[1]=m^~y&b,e[10]=P^~S&R,e[11]=$^~x&j,e[20]=I^~B&F,e[21]=C^~L&z,e[30]=Y^~q&K,e[31]=V^~G&H,e[40]=te^~re&se,e[41]=ne^~oe&ie,e[2]=g^~w&v,e[3]=y^~b&k,e[12]=S^~R&N,e[13]=x^~j&D,e[22]=B^~F&U,e[23]=L^~z&M,e[32]=q^~K&Q,e[33]=G^~H&X,e[42]=re^~se&ae,e[43]=oe^~ie&ce,e[4]=w^~v&A,e[5]=b^~k&E,e[14]=R^~N&O,e[15]=j^~D&T,e[24]=F^~U&W,e[25]=z^~M&J,e[34]=K^~Q&Z,e[35]=H^~X&ee,e[44]=se^~ae&de,e[45]=ie^~ce&le,e[6]=v^~A&h,e[7]=k^~E&m,e[16]=N^~O&P,e[17]=D^~T&$,e[26]=U^~W&I,e[27]=M^~J&C,e[36]=Q^~Z&Y,e[37]=X^~ee&V,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=A^~h&g,e[9]=E^~m&y,e[18]=O^~P&S,e[19]=T^~$&x,e[28]=W^~I&B,e[29]=J^~C&L,e[38]=Z^~Y&q,e[39]=ee^~V&G,e[48]=de^~te&re,e[49]=le^~ne&oe,e[0]^=_[r],e[1]^=_[r+1]},F=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(U.decode(e))],create:([e])=>z.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]))}(),z=new TextEncoder,U=new TextDecoder("utf-8");function M(e=void 0,t=F){return JSON.stringify(Y(e,t))}function W(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 J=[];function Y(e,t=F){const n=W(e);if(null!==n)return n;const r=[],o=new Map;return function e(n){const s=W(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(J.length<e){const t=J.length;J.length=e,J.fill(-2,t,e)}return J.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 V(e,t){return function(e){return new B(512,T,512).update(e).hex()}(M([e,t]))}const q=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=V}={}){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:V});function G(e){return!!e&&"0"!==e&&"false"!==e}let K;class H{static{[K]=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 y(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 w(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,A=3===o,E=4===o,P=2===o;function $(t,n,r){return function(o,s){return n&&(s=o,o=e),r&&r(o),S[t].call(o,s)}}if(!v){var S={},x=[],R=A?"get":E||k?"set":"value";if(l?(u||k?S={get:N(function(){return b(this)},r,"get"),set:function(e){t[4](this,e)}}:S[R]=b,u||N(S[R],r,P?"":R)):u||(S=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=m[+d][r])&&7!==(i^o))throw Error("Decorating two elements with the same name ("+S[R].name+") is not supported yet");m[+d][r]=o<3?1:o}}for(var j=e,D=g.length-1;D>=0;D-=n?2:1){var O=w(g[D],"A decorator","be",!0),T=n?g[D-1]:void 0,I={},_={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");w(t,"An initializer","be",!0),a.push(t)}.bind(null,I)};if(v)i=O.call(T,j,_),I.v=1,w(i,"class decorators","return")&&(j=i);else if(_.static=d,_.private=l,i=_.access={has:l?p.bind():function(e){return r in e}},E||(i.get=l?P?function(e){return h(e),S.value}:$("get",0,h):function(e){return e[r]}),P||A||(i.set=l?$("set",0,h):function(e,t){e[r]=t}),j=O.call(T,k?{get:S.get,set:S.set}:S[R],_),I.v=1,k){if("object"==typeof j&&j)(i=w(j.get,"accessor.get"))&&(S.get=i),(i=w(j.set,"accessor.set"))&&(S.set=i),(i=w(j.init,"accessor.init"))&&x.unshift(i);else if(void 0!==j)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else w(j,(u?"field":"method")+" decorators","return")&&(u?x.unshift(j):S[R]=j)}return o<2&&c.push(y(x,d,1),y(a,d,0)),u||v||(l?k?c.splice(-1,0,$("get",d),$("set",d)):c.push(P?S[R]:w.call.bind(S[R])):f(e,r,S)),j}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(y(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:D(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,f,r,t&&f?function(t){return j(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)),y(n,1)]}}}(this,[],[[q,3,"isBunAvailable"],[q,3,"buildCommand"],[q,3,"rootDirPath"],[q,3,"dockerfile"],[q,3,"hasDockerfile"],[q,3,"hasSourceCode"],[q,3,"name"],[q,3,"dockerImageName"],[q,3,"env"],[q,3,"packageJson"],[q,3,"packageJsonPath"],[q,3,"hasPrisma"],[q,3,"hasDrizzle"],[q,3,"databaseOrm"],[q,3,"hasVitest"],[q,3,"hasOxlint"],[q,3,"hasOxfmt"],[q,3,"hasPoetryLock"],[q,3,"hasPubspecYaml"],[q,3,"preferredLinter"],[q,3,"hasPlaywrightConfig"],[q,3,"skipLaunchingServerForPlaywright"],[q,3,"dockerPackageJson"],[q,3,"binExists"],[q,3,"rootPackageJson"]]).e}argv=void K(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}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)),n.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",o.join(", ")));const i=[],a={};for(const e of o){const o=[];for(const[n,s]of Object.entries(k(t.join(r,e))))n in a||n in process.env||(a[n]=s,o.push(n));i.push([e,o]),n.verbose&&o.length>0&&console.info(`Read ${o.length} environment variables from ${e}`)}if(n.verbose||console.info(`Read env files: ${i.map(([e,t])=>t.length>0?`${e} (${t.join(", ")})`:e).join(", ")||"nothing"}`),n.checkEnv){const e=Object.keys(k(t.join(r,n.checkEnv))).filter(e=>!(e in a)&&!(e in process.env));if(e.length>0)throw new Error(`Missing environment variables in [${o.join(", ")}]: [${e.join(", ")}]`)}return[p({parsed:a,processEnv:{}}).parsed??a,i]}(this.argv,this.dirPath);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 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(G(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 Q(n,r=!0,o){if(o??=process.cwd(),e.existsSync(t.join(o,"package.json")))return new H(o,n,r)}async function X(e,t=!0,n){const r=Z(e,t,n);if(r)return{...r,descendants:r.root===r.self?await ee(e,r.root,t):[r.self]}}function Z(n,r=!0,o){if(o??=process.cwd(),!e.existsSync(t.join(o,"package.json")))return;const s=new H(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 H(s,n,r))}return{root:i,self:s}}async function ee(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 H(r,n,o));return s}const te=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),ne=te?"bun --bun run":"node",re=te?"bun":"yarn",oe=te?"bun --bun run":"yarn",se={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=Q(n,!0,r);if(!s)return console.error(d.red("No project found.")),!0;const i=n.command??(s.packageJson.scripts?.build?te?"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 ie(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])=>!ae.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=>(ce.some(t=>e.includes(t))||de.some(t=>e.endsWith(t)))&&!le.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(!ie(s,n))return;n.dryRun||await e.promises.writeFile(l,u,"utf8");return!0}(n)}};function ie(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 ae=new Set(["CI","PWDEBUG","TMPDIR"]);const ce=["src/","public/"],de=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],le=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const ue=new m,pe={exitIfFailed:!0};async function fe(e,t,n,r=pe){const o=me(e,t);if(ge(o.printable,t),n.verbose&&ge(o.runnable,t,"Start (raw)",!0),n.dryRun)return ye(o.printable,0,r),0;const s=await R(o.runnable,void 0,{cwd:t.dirPath,env:we(t.env,r),shell:!0,stdio:"inherit",timeout:r.timeout,killOnExit:!0,verbose:n.verbose});return r.onSignal?.(s.signal),ye(o.printable,s.status,r),s.status??1}function he(e,t,n,r=pe){return ue.runAndWaitForReturnValue(async()=>{const o=me(e,t);if(ge(o.printable,t,"Start (parallel)",!0),n.dryRun)return ge(o.printable,t,"Started (log)"),n.verbose&&ge(o.runnable,t,"Started (raw)",!0),ye(o.printable,0,r),0;const s=await R(o.runnable,void 0,{cwd:t.dirPath,env:we(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});r.onSignal?.(s.signal),ge(o.printable,t,"Started (log)"),n.verbose&&ge(o.runnable,t,"Started (raw)",!0);const i=s.stdout.trim();return i&&(process.stdout.write(i),process.stdout.write("\n")),ye(o.printable,s.status,r),s.status??1})}function me(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA generate ",t.packageJson.dependencies?.blitz?"PRISMA generate ":"PRISMA generate --no-hints ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",te?"bun --bun run ":"yarn run ");te&&(n=n.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").replaceAll(/(?:YARN )?vitest run/g,"bun test").replaceAll(/ --color --passWithNoTests(?: --allowOnly)?/g,"")),n=n.trim();const r=be(n.replaceAll("YARN ",`${oe} `)),o=be(n.replaceAll("YARN playwright ",`${oe} playwright `).replaceAll("YARN ",!te&&t.binExists?"":`${oe} `)),s=t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:"";return{printable:`${oe} dotenv${s} -- ${r}`,runnable:o}}function ge(e,t,n="Start",r=!1){console.info("\n"+(r?d.gray:d.cyan)(d.bold(`${n}:`),e)+d.gray(` at ${t.dirPath}`))}function ye(e,t,n){0===t?console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function we(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function be(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const ve={...b,"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 ke(e){const t=[];for(const n of Object.keys(b)){const r=Ae(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 t}function Ae(e,t){const n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const Ee={command:"concurrently <commands...>",describe:"Run commands concurrently",builder:{...ve,"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=Q(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(me(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:we(e.project.env,{ci:e.ci,forceColor:e.forceColor}),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($e(t,"SIGTERM"))),d())};n.once("error",e=>{console.error("Failed to start child process:",e),u(1)}),n.once("exit",(e,t)=>{u(Pe(e??void 0,t??void 0))})})),l=e=>{n??=e,i||(i=!0,a.push($e(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 Pe(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,forceColor:"boolean"==typeof e.forceColor?e.forceColor:void 0});process.exit(r)}catch(e){console.error(d.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function Pe(e,t){return void 0!==e?e:t&&t in h.signals?128+h.signals[t]:1}async function $e(e,t){const n=Se(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(xe))return!1;await Re(Math.min(100,t-Date.now()))}return!0}(n)&&Se(n,"SIGKILL")}function Se(e,t){const n=[];for(const r of e)try{if(!je(r,t))continue;n.push(r),E(r,t)}catch(e){console.warn("Failed to kill child process:",e)}return n}function xe(e){try{return process.kill(-e,0),!1}catch(e){return!!Ne(e)}}async function Re(e){await new Promise(t=>setTimeout(t,e))}function je(e,t){try{return process.kill(-e,t),!0}catch(e){if(Ne(e))return!1;throw e}}function Ne(e){return"object"==typeof e&&null!==e&&"code"in e&&"ESRCH"===e.code}const De={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=Q(e);t||(console.error(d.red("No project found.")),process.exit(1));if(G(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 Oe(e){return e.map(e=>Te(e)).join(" ")}function Te(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll("'","'\"'\"'")}'`}const Ie=new Set(["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"]),_e=new Set(["py"]),Ce=new Set(["dart"]),Be=new Set([...Ie,"css","gql","graphql","hbs","htm","html","json","json5","jsonc","less","md","mdx","scss","toml","yaml","yml"]),Le=new Set(["cjs","css","cts","htm","html","java","js","json","json5","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),Fe=new Set([...Le].filter(e=>!Be.has(e))),ze="!**/test{-,/}fixtures/**",Ue={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"}},async handler(e){const t=await Me(e);t&&process.exit(t)}};async function Me(e){if("win32"===process.platform)return console.error(d.red("This command is not supported on Windows.")),1;const n=await X(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 y.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(...Ke(n.descendants,u,r));for(const{lintPath:t,project:l}of He(n.descendants,u,r)){if(l.hasPoetryLock&&("directory"===r||_e.has(p))){const e=i.get(l)??[];if(e.push(t),i.set(l,e),"directory"!==r)continue}if(l.hasPubspecYaml&&("directory"===r||Ce.has(p))){const e=a.get(l)??[];if(e.push(t),a.set(l,e),"directory"!==r)continue}if("directory"===r||Xe(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(Ge(t),ze)}else for(const e of qe(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&&(Le.has(p)||Be.has(p)))if(l.hasOxfmt&&Be.has(p)){const e=s.get(l)??[];e.push(t),s.set(l,e)}else Le.has(p)&&c.push(t);else Qe(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([`**/{.*/,}*.{${[...Fe].join(",")}}`,ze]);for(const o of n){if(!Ze(o))continue;const n=t.join(o.dirPath,"**/{.*/,}*.{"+[...Le].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={exitIfFailed:!1,forceColor:!0};if(r.length>0){for(const[t,n]of o){const r=We(t,e,n);r&&h.push(he(r,t,e,m))}if(e.format)for(const[t,n]of s)h.push(he(Je(n),t,e,m));for(const[t,n]of i)h.push(he(Ye(e,n),t,e,m));for(const[t,n]of a)h.push(he(Ve(e,n),t,e,m))}else{for(const t of n.descendants){if(t.packageJson.workspaces&&!t.hasSourceCode)continue;const n=We(t,e);n&&h.push(he(n,t,e,m))}for(const t of n.descendants)t.hasPoetryLock&&h.push(he(Ye(e),t,e,m)),t.hasPubspecYaml&&h.push(he(Ve(e),t,e,m)),t.hasOxfmt&&e.format&&h.push(he(Je(),t,e,m))}const g=await Promise.all(h);return f||g.some(e=>0!==e)?1:(e.format&&(u.length>0&&g.push(await he(Oe(["YARN","prettier","--cache","--color","--no-error-on-unmatched-pattern","--write","--",...u]),n.self,e,{exitIfFailed:!1,forceColor:!0})),p.length>0&&g.push(await he(Oe(["YARN","sort-package-json","--",...p]),n.self,e,{exitIfFailed:!1,forceColor:!0}))),g.some(e=>0!==e)?1:0)}function We(e,t,n){if("oxlint"===e.preferredLinter)return Oe(["YARN","oxlint","--no-error-on-unmatched-pattern",...t.quiet?["--quiet"]:[],...t.fix?["--fix"]:[],...n??["."]])}function Je(e){return Oe(["YARN","oxfmt","--write","--no-error-on-unmatched-pattern",...e??["."]])}function Ye(e,t){const n=t&&t.length>0?t:["."];return(e.fix||e.format?[Oe(["poetry","run","isort","--profile","black","--filter-files",...n]),Oe(["poetry","run","black",...n]),Oe(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])]:[Oe(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])]).join(" && ")}function Ve(e,t){const n=t&&t.length>0?t:["."],r=[];return(e.fix||e.format)&&r.push(Oe(["dart","format",...n])),r.push(Oe(["dart","analyze",...n])),r.join(" && ")}function qe(e,t,n,r){return"directory"===n&&e.hasOxfmt?[t]:"directory"===n&&Ze(e)?[t,ze]:function(e,t){return e.hasOxfmt?Be.has(t):!!Ze(e)||Fe.has(t)}(e,r)?[t]:[]}function Ge(e){return t.join(e,`**/{.*/,}*.{${[...Fe].join(",")}}`)}function Ke(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 He(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 Qe(e){return Ie.has(e)||_e.has(e)||Ce.has(e)}function Xe(e,t){return"oxlint"===e.preferredLinter&&Ie.has(t)}function Ze(e){return!e.hasOxfmt&&"oxlint"===e.preferredLinter}function*et(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const tt={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 X(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const o of et("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(nt(n,r),rt(r),ot(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.dryRun||n.outside||(o.spawnSync(re,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function nt(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies??{},r=["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"],o=[];for(const e of Object.keys(n))(r.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete n[e],o.push(e));console.info("Removed devDependencies:",o.join(", ")||"none")}function rt(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 ot(e){delete e.private,delete e.publishConfig,delete e.prettier}const st="file:";const it=new class{deploy(e,t=""){return this.migrate(e,t)}migrate(e,t=""){return`YARN drizzle-kit migrate ${t}`}migrateDev(e,t=""){return`YARN drizzle-kit generate ${t}`}reset(e,n=""){const r=function(e){const n=e.env.DATABASE_PATH??function(e){const t=e.env.DATABASE_URL;if(!t?.startsWith(st))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)} && ${this.seed(e)}`:"echo 'wb db reset supports Drizzle only when DATABASE_PATH or file: DATABASE_URL is set.' && exit 1"}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}`}},at="file:",ct=[{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 dt(e){return e.packageJson.dependencies?.blitz?"db/mount":"prisma/mount"}function lt(n){return ct.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}const ut=new class{cleanUpLitestream(e){const t=dt(e);var n;return`${`if [ -f "${n=`${t}/prod.sqlite3`}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${at}${n}"; fi && rm -f "${n}".* "${n}"-*`}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}deployForce(e){const t=dt(e),n=`rm -Rf "${`${t}/prod.sqlite3`}"*`;return`${n}; PRISMA migrate reset --force --skip-seed && ${n}\n && litestream restore -config litestream.yml -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e){return`litestream ltx -config litestream.yml ${dt(e)}/prod.sqlite3`}migrate(e,t=""){return`PRISMA migrate deploy ${t} && PRISMA generate && ${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(at))return;const r=n.slice(5).replace(/[?#].*$/,"");if(!r)return;const o=lt(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){return`rm -Rf ${t}*; litestream restore -config litestream.yml -o ${t} ${dt(e)}/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=${at}${e} `}else if(e.env.DATABASE_URL?.startsWith(at)){const n=lt(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));o=`DATABASE_URL=${at}${r} `}}return`${o}PRISMA studio ${r}`}},pt={},ft={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(mt).command(gt).command(yt).command(wt).command(bt).command(vt).command(kt).command(At).command(Et).command(Pt).command($t).demandCommand().strict(!1),handler(){}},ht={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:pt,async handler(e){const t=await xt(e,"prisma");for(const{project:n}of jt("prisma cleanup-litestream",t))await fe(ut.cleanUpLitestream(n),n,e)}},mt={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:pt,async handler(e){const t=await xt(e,"prisma");for(const{project:e}of jt("prisma create-litestream-config",t))St(e)}},gt={command:"deploy",describe:"Apply migration to DB without initializing it",builder:pt,async handler(e){const t=await xt(e),n=Nt(e);for(const{orm:r,project:o}of jt("db deploy",t))await fe(Rt(r).deploy(o,n),o,e)}},yt={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:pt,async handler(e){const t=await xt(e,"prisma");for(const{project:n}of jt("prisma deploy-force",t))await fe(ut.deployForce(n),n,e)}},wt={command:"list-backups",describe:"List Litestream backups",builder:pt,async handler(e){const t=await xt(e,"prisma");for(const{project:n}of jt("prisma list-backups",t))await fe(ut.listBackups(n),n,e)}},bt={command:"migrate",describe:"Apply migration to DB with initializing it",builder:pt,async handler(e){const t=await xt(e),n=Nt(e);for(const{orm:r,project:o}of jt("db migrate",t))await fe(Rt(r).migrate(o,n),o,e)}},vt={command:"migrate-dev",describe:"Create a migration file",builder:pt,async handler(e){const t=await xt(e),n=Nt(e);for(const{orm:r,project:o}of jt("db migrate-dev",t))await fe(Rt(r).migrateDev(o,n),o,e)}},kt={command:"reset",describe:"Reset DB",builder:pt,async handler(e){const t=await xt(e),n=Nt(e);for(const{orm:r,project:o}of jt("db reset",t))await fe(Rt(r).reset(o,n),o,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const{orm:t,project:r}of jt("WB_ENV=test db reset",await xt(e)))await fe(Rt(t).reset(r,n),r,e)}}},At={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...pt,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await xt(e,"prisma");for(const{project:n}of jt("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await fe(ut.restore(n,t),n,e)}}},Et={command:"seed",describe:"Populate DB with seed data",builder:{...pt,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await xt(e);for(const{orm:n,project:r}of jt("db seed",t))await fe(Rt(n).seed(r,e.file),r,e)}},Pt={command:"studio [db-url-or-path]",describe:"Open database studio",builder:{...pt,"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 xt(e),n=Nt(e,["db-url-or-path","restored"]);for(const{orm:r,project:o}of jt("db studio",t)){const t=e.restored?o.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await fe(Rt(r).studio(o,t,n),o,e)}}},$t={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 xt(e),n=[(e.args?.join(" ")??"").trimEnd(),Nt(e,["args"])].filter(Boolean).join(" ");for(const{orm:r,project:o}of jt(`db ${n}`,t)){const t="prisma"===r?`PRISMA ${n}`:`YARN drizzle-kit ${n}`;await fe(t,o,e)}}};function St(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 xt(e,t){const n=await X(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 Rt(e){return"prisma"===e?ut:it}function*jt(e,t){const n=new Map(t.map(e=>[e.project,e]));for(const r of et(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 Nt(e,t=[]){const n=[],r=Object.keys(ve),o=Object.values(ve).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 Oe([...n,...i])}const Dt={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=Q(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 fe(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},Ot={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await X(e,!1,t);n||(console.error(d.red("No project found.")),process.exit(1));for(const t of et("setup",n.descendants)){const r=await y.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===f.platform()){const n=["pstree"];await he(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await fe("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await he("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await he(`poetry env use ${n}`,t,e),await ue.promiseAll(),await fe("poetry run pip install --upgrade pip",t,e),await fe("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await fe(`${oe} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await fe(`${oe} playwright install --with-deps`,r,e)}(e)}};function Tt(e){return e.silent?" > /dev/null":""}const It=new Set;async function _t(e,t){const n=await async function(e){for(const t of["127.0.0.1","::"]){if(!await Lt(t,e))return!1}return!0}(e);n||await Ct(e,t);const r=async()=>{It.has(e)||(It.add(e),await Ct(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,r)}async function Ct(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await R("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 R("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await g(e)}catch{}}async function Bt(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await _t(n,t),n}async function Lt(e,t){return new Promise(n=>{const r=w();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 Ft=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"";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} .`}stopAndStart(e,t="",n=""){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t="",n=""){!function(e,t){const n=()=>{if(It.has(e))return;It.add(e),ge(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});ye(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 ":""}--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 zt{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return Ft.buildImage(e,t)}async startDev(e,t){return await Bt(e.env.PORT,e),this.shouldWaitAndOpenApp?Oe(["YARN","wb","concurrently",...ke(t),"--kill-others-on-fail",this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await Bt(e.env.PORT,e),this.shouldWaitAndOpenApp?Oe(["YARN","wb","concurrently",...ke(t),"--kill-others-on-fail",this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await Bt(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await Bt(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && ${Oe(["YARN","wb","concurrently",...ke(t),"--kill-others-on-fail",Ft.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??""),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,"development")}\n && ${Ft.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProductionProtected(e,t){const n=function(e){try{return e.findFile("ecosystem.config.cjs")}catch{return}}(e),r=void 0===n?[("YARN wb buildIfNeeded "+(t.verbose?"--verbose":"")).trim(),`node dist/index.js ${t.normalizedArgsText??""}`.trim()]:[e.buildCommand,`pm2-runtime start --no-autorestart ${n}`];return[...e.hasPrisma?ut.migrate(e).split("&&"):[],...r].filter(Boolean).map(e=>`${e} ${Tt(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,Ft.stopAndStart(e),n)}async testStart(e,t){return await Bt(e.env.PORT,e),`${n="NODE_ENV",r="",`${n}=${Te(r)}`} ${Oe(["YARN","wb","concurrently",...ke(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 Bt(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 Ut([...o,...e,...r],n);const i=e.slice(1),a=Mt(i),c=0===a.length?i:i.filter((e,t)=>!a.includes(t));return Ut([...o,"test",...s,...c,...r],n)}(o,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${a}${i}`:Oe(["YARN","wb","concurrently",...ke(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?Oe(["YARN","vitest","run",...n?.length?n:["test/unit/"],"--color","--passWithNoTests","--allowOnly","--watch=false",...t.bail?["--bail=1"]:[]]):e.isBunAvailable?Oe(["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 Ut(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="))?Oe(e):Oe([...e,"--max-failures=1"]):Oe(e)}function Mt(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;Wt.has(o)?t="required":Jt.has(o)&&(t="optional")}else{if(o.startsWith("-")&&"-"!==o){const e=o.slice(0,2);2===o.length&&Yt.has(e)&&(t="required");continue}n.push(r)}}return n}const Wt=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"]),Jt=new Set(["--only-changed","--update-snapshots","--update-source-method"]),Yt=new Set(["-c","-g","-j"]);const Vt=new class extends zt{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const qt=new class extends zt{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 Bt(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets?.map(String);return Oe(["YARN","wb","concurrently",...ke(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o}\n && ${Oe(["vitest","run",...i&&i.length>0?i:["test/e2e/"],"--color","--passWithNoTests","--allowOnly",...t.bail?["--bail=1"]:[]])}${s}`])}};const Gt=new class extends zt{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}};const Kt=new class extends zt{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} && ${ne} 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")} && ${Ft.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 Ht=new class extends zt{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const Qt=new class extends zt{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()}},Xt=["express","fastify","elysia","hono"],Zt={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"}},en={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(Zt),async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e["--"]??[]].map(e=>Te(String(e))).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>Te(String(e))).join(" ")}(e);const t=await X(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=Vt;else if(t.next)o=Gt;else if(r["@remix-run/dev"])o=Ht;else if(r.vite)o=Qt;else if(Xt.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))o=qt;else{if(!t["build-ts"]&&!r["build-ts"])continue;o=Kt}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await fe(await o.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await fe(await o.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await fe(await o.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await fe(await o.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await o.startTest(n,e);await fe(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},tn={e2e:{description:"E2e test mode: headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",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"}},nn={targets:{description:"Test target paths",type:"array"}},rn={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({...tn,...nn}),async handler(e){await on(e)}};async function on(n){const r=await X(n);r||(console.error(d.red("No project found.")),process.exit(1)),process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const o=n.targets??[],s=n["--"]??[],{shouldRunE2e:i,shouldRunUnit:a}=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}}(o,s);for(const c of r.descendants){const r=c.packageJson.dependencies??{},d=c.packageJson.devDependencies??{};let l;if(l=r.blitz?Vt:r.next?Gt:d["@remix-run/dev"]?Ht:d.vite?Qt:Xt.some(e=>r[e])&&!r["firebase-functions"]?qt:Kt,console.info(`Running "test" for ${c.name} ...`),a&&e.existsSync(t.join(c.dirPath,"test","unit"))){const e=o.filter(e=>e.includes("/unit")),t={...n,targets:e.length>0?e:void 0};await fe(l.testUnit(c,t),c,n,{timeout:n.unitTimeout})}if(!i||!e.existsSync(t.join(c.dirPath,"test","e2e")))continue;const u=o.filter(e=>e.includes("/e2e")),p={...n,targets:u.length>0?u:void 0};switch(n.e2e){case"headless":await fe(await l.testE2EProduction(c,p,{playwrightArgs:an(u,s),forwardedPlaywrightArgs:s}),c,n);continue;case"headless-dev":await fe(await l.testE2EDev(c,p,{playwrightArgs:an(u,s),forwardedPlaywrightArgs:s}),c,n);continue;case"docker":await sn(c,p,l,an(u,s),s);continue;case"docker-debug":await sn(c,p,l,an(u,s,["--debug"]),s);continue}if(r.blitz||r.next||d["@remix-run/dev"]||d.vite)switch(n.e2e){case"headed":await fe(await l.testE2EProduction(c,p,{playwrightArgs:an(u,s,["--headed"]),forwardedPlaywrightArgs:s}),c,n);break;case"headed-dev":await fe(await l.testE2EDev(c,p,{playwrightArgs:an(u,s,["--headed"]),forwardedPlaywrightArgs:s}),c,n);break;case"debug":await fe(await l.testE2EProduction(c,p,{playwrightArgs:an(u,s,["--debug"]),forwardedPlaywrightArgs:s}),c,n);break;case"generate":await fe(await l.testE2EProduction(c,p,{playwrightArgs:["codegen",`http://localhost:${c.env.PORT}`]}),c,n);break;case"trace":await fe("BUN playwright show-trace",c,n)}}}async function sn(e,t,n,r,o){e.env.WB_DOCKER||="1",await fe(`${n.buildDocker(e,"test")}${Tt(t)}`,e,t),process.exitCode=await fe(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:o}),e,t,{exitIfFailed:!1}),await fe(Ft.stop(e),e,t)}function an(e,t=[],n=[]){const r=Mt(t).length>0;return["test",...e.length>0||r?[]:["test/e2e/"],...n]}const cn={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 X(n);r||(console.error(d.red("No project found.")),process.exit(1));process.env.CI||="1",process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const o of r.descendants){const r=o.packageJson.dependencies??{},s=o.packageJson.devDependencies??{};let i;i=r.blitz?Vt:r.next?Gt:s["@remix-run/dev"]?Ht:s.vite?Qt:Xt.some(e=>r[e])&&!r["firebase-functions"]?qt:Kt,console.info(`Running "test-on-ci" for ${o.name} ...`);const a=o.hasDockerfile;if(a&&await he(Ft.stopAll(),o,n),e.existsSync(t.join(o.dirPath,"test","unit"))&&await he(i.testUnit(o,n).replaceAll(" --allowOnly",""),o,n),e.existsSync(t.join(o.dirPath,"test","e2e"))){await he(await i.testStart(o,n),o,n),await ue.promiseAll(),a&&(o.env.WB_DOCKER||="1",await fe(`${i.buildDocker(o,"test")}${Tt(n)}`,o,n));const e=a?await i.testE2EDocker(o,n,{}):await i.testE2EProduction(o,n,{});process.exitCode=await fe(e.replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),a&&await fe(Ft.stop(o),o,n)}}}(n)}};const dn={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}`);E(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},ln={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){process.exit(await async function(n){const r=await X(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 he(i.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!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 un={...ln,command:"tc"},pn={},fn={command:"verify-code",describe:"Verify project code",builder:pn,async handler(e){const t=Z(e,!1);t||(console.error(d.red("No project found.")),process.exit(1)),await mn(t.self,e)}},hn={command:"verify-code-with-tests",describe:"Verify project code and run tests",builder:pn,async handler(e){const t=Z(e,!1);t||(console.error(d.red("No project found.")),process.exit(1)),await mn(t.self,e),await async function(e,t){if(e.packageJson.scripts?.test?.includes("wb test"))return console.info("\n"+d.cyan(d.bold("Start:"),"test")),await on({...t,_:["test"],e2e:"headless"}),void console.info(d.green(d.bold("Finished:"),"test"));await yn("test",`${re} test`,e,t)}(t.self,e)}};async function mn(e,t){await yn("install",`${re} install`,e,t,{silent:!0}),e.packageJson.scripts?.["gen-code"]&&await yn("gen-code",`${re} gen-code`,e,t,{silent:!0}),await gn("format",()=>Me({...t,_:["lint"],format:!0}),{allowFailure:!0}),await gn("lint-fix",()=>Me({...t,_:["lint"],fix:!0,quiet:!0}))}async function gn(e,t,n={}){console.info("\n"+d.cyan(d.bold("Start:"),e));const r=await t()??0;return 0===r||n.allowFailure?console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${r}):`),e)),process.exit(r)),r}async function yn(e,t,n,r,o={}){if(console.info("\n"+d.cyan(d.bold("Start:"),e)+d.gray(` at ${n.dirPath}`)),r.verbose&&console.info(d.gray(d.bold("Start (raw):"),t)),r.dryRun)return console.info(d.green(d.bold("Finished:"),e)),0;const s=await R(t,void 0,{cwd:n.dirPath,env:we(n.env,{forceColor:!0}),shell:!0,stdio:o.silent?["ignore","ignore","inherit"]:"inherit",killOnExit:!0,verbose:r.verbose});return 0===s.status||o.allowFailure?console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${s.status}):`),e)),process.exit(s.status??1)),s.status??1}await n(r(process.argv)).scriptName("wb").options(ve).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(hn).command(fn).command(se).command(Ee).command(De).command(Ue).command(tt).command(ft).command(Dt).command(Ot).command(en).command(rn).command(cn).command(dn).command(ln).command(un).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 wn=!1;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{if(!wn){wn=!0;try{E(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
|
|
10
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvdXRpbHMvc2hlbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC50cyIsIi4uL3NyYy9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyIsIi4uL3NyYy9jb21tYW5kcy9wcmlzbWEudHMiLCIuLi9zcmMvY29tbWFuZHMvcmV0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcG9ydC50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdE9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvdHJlZUtpbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ZlcmlmeUNvZGUudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52ID0ge1xuICBlbnY6IHtcbiAgICBkZXNjcmlwdGlvbjogJy5lbnYgZmlsZXMgdG8gYmUgbG9hZGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgJ2Nhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0Vudmlyb25tZW50IHRvIGxvYWQgY2FzY2FkaW5nIC5lbnYgZmlsZXMgKGUuZy4sIGAuZW52YCwgYC5lbnYuPGVudmlyb25tZW50PmAsIGAuZW52LmxvY2FsYCBhbmQgYC5lbnYuPGVudmlyb25tZW50Pi5sb2NhbGApLiBQcmVmZXJyZWQgb3ZlciBgY2FzY2FkZS1ub2RlLWVudmAgYW5kIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICAnY2FzY2FkZS1ub2RlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LiBQcmVmZXJyZWQgb3ZlciBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdhdXRvLWNhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PFdCX0VOViB8fCBOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdpbmNsdWRlLXJvb3QtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSAuZW52IGZpbGVzIGluIHJvb3QgZGlyZWN0b3J5IGlmIHRoZSBwcm9qZWN0IGlzIGluIGEgbW9ub3JlcG8gYW5kIC0tZW52IG9wdGlvbiBpcyBub3QgdXNlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnY2hlY2stZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ2hlY2sgd2hldGhlciB0aGUga2V5cyBvZiB0aGUgbG9hZGVkIC5lbnYgZmlsZXMgYXJlIHNhbWUgd2l0aCB0aGUgZ2l2ZW4gLmVudiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJy5lbnYuZXhhbXBsZScsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzLlxuICogTm90ZSBpdCBkb2VzIG5vdCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogQHJldHVybiBbZW52VmFycywgW2VudlBhdGhzLCBlbnZWYXJOYW1lc11bXV1cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIFtzdHJpbmcsIHN0cmluZ1tdXVtdXSB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLmZpbHRlcigoZW52UGF0aCkgPT4gZnMuZXhpc3RzU3luYyhlbnZQYXRoKSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlbGF0aXZlKGN3ZCwgZW52UGF0aCkpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cHJvY2Vzcy5lbnYuV0JfRU5WfSwgTk9ERV9FTlY6ICR7cHJvY2Vzcy5lbnYuTk9ERV9FTlZ9YCk7XG4gICAgY29uc29sZS5pbmZvKCdSZWFkaW5nIGVudiBmaWxlczonLCBlbnZQYXRocy5qb2luKCcsICcpKTtcbiAgfVxuXG4gIGNvbnN0IGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lczogW3N0cmluZywgc3RyaW5nW11dW10gPSBbXTtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudlBhdGggb2YgZW52UGF0aHMpIHtcbiAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGVudlBhdGgpKSkpIHtcbiAgICAgIGlmICghKGtleSBpbiBlbnZWYXJzKSAmJiAhKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbZW52UGF0aCwga2V5c10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYga2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtrZXlzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgfVxuICBpZiAoIWFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGBSZWFkIGVudiBmaWxlczogJHtlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMubWFwKChbZW52UGF0aCwga2V5c10pID0+IChrZXlzLmxlbmd0aCA+IDAgPyBgJHtlbnZQYXRofSAoJHtrZXlzLmpvaW4oJywgJyl9KWAgOiBlbnZQYXRoKSkuam9pbignLCAnKSB8fCAnbm90aGluZyd9YFxuICAgICk7XG4gIH1cblxuICBpZiAoYXJndi5jaGVja0Vudikge1xuICAgIGNvbnN0IGV4YW1wbGVLZXlzID0gT2JqZWN0LmtleXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgYXJndi5jaGVja0VudikpKTtcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IGV4YW1wbGVLZXlzLmZpbHRlcigoa2V5KSA9PiAhKGtleSBpbiBlbnZWYXJzKSAmJiAhKGtleSBpbiBwcm9jZXNzLmVudikpO1xuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIFske2VudlBhdGhzLmpvaW4oJywgJyl9XTogWyR7bWlzc2luZ0tleXMuam9pbignLCAnKX1dYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbZXhwYW5kKHsgcGFyc2VkOiBlbnZWYXJzLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8gZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzXTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzIGFuZCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG5jb25zdCBjYWNoZWRFbnZWYXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbmZ1bmN0aW9uIHJlYWRFbnZGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVkRW52VmFycy5nZXQoZmlsZVBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IHBhdGgucmVzb2x2ZShmaWxlUGF0aCksIHByb2Nlc3NFbnY6IHt9IH0pLnBhcnNlZCA/PyB7fTtcbiAgY2FjaGVkRW52VmFycy5zZXQoZmlsZVBhdGgsIHBhcnNlZCk7XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxhdGVkIHRvIG5wbSBhbmQgeWFybiBmcm9tIHRoZSBnaXZlbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogdm9pZCB7XG4gIC8vIFJlbW92ZSBucG0gJiB5YXJuIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHByb2Nlc3MuZW52XG4gIGlmIChlbnZWYXJzLlBBVEggJiYgZW52VmFycy5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52VmFycy5QQVRIID0gZW52VmFycy5QQVRILnJlcGxhY2UoYCR7ZW52VmFycy5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gbWFjT1NcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC9wcml2YXRlXFwvdmFyXFwvZm9sZGVyc1xcL1teOl0rOi9nLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcmllcyBpbiBMaW51eFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ZhclxcL3RtcFxcL1teOl0rOi9nLCAnJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC90bXBcXC9bXjpdKzovZywgJycpO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgY29uc3QgdXBwZXJLZXkgPSBrZXkudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoXG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdOUE1fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ1lBUk5fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ0JFUlJZXycpIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ1BST0pFQ1RfQ1dEJyB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdJTklUX0NXRCdcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBlbnZWYXJzW2tleV07XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNFcnJub0V4Y2VwdGlvbihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdjb2RlJyBpbiBlcnJvcjtcbn1cbiIsImltcG9ydCB7IGV4ZWNGaWxlU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IGlzRXJybm9FeGNlcHRpb24gfSBmcm9tICcuL2Vycm5vLmpzJztcbmltcG9ydCB7IGJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcCwgY29sbGVjdERlc2NlbmRhbnRQaWRzIGFzIGNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAgfSBmcm9tICcuL3Byb2Nlc3NUcmVlLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRyZWVLaWxsKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzID0gJ1NJR1RFUk0nKTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwaWQpIHx8IHBpZCA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBpZDogJHtwaWR9YCk7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGtpbGxUcmVlT25XaW5kb3dzKHBpZCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGVzY2VuZGFudHMgPSBjb2xsZWN0RGVzY2VuZGFudFBpZHMocGlkKTtcbiAgY29uc3QgdGFyZ2V0UGlkcyA9IHRvQ2hpbGRyZW5GaXJzdFBpZHMocGlkLCBkZXNjZW5kYW50cyk7XG4gIGZvciAoY29uc3QgdGFyZ2V0UGlkIG9mIHRhcmdldFBpZHMpIHtcbiAgICBraWxsSWZOZWVkZWQodGFyZ2V0UGlkLCBzaWduYWwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxJZk5lZWRlZChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwaWQsIHNpZ25hbCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsVHJlZU9uV2luZG93cyhwaWQ6IG51bWJlcik6IHZvaWQge1xuICB0cnkge1xuICAgIHJ1bkNvbW1hbmQoJ3Rhc2traWxsJywgWycvUElEJywgU3RyaW5nKHBpZCksICcvVCcsICcvRiddLCB7XG4gICAgICBtYXhCdWZmZXI6IDEwMjQgKiAxMDI0LFxuICAgICAgdGltZW91dDogMjAwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50UGlkcyhyb290UGlkOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBydW5Db21tYW5kKFxuICAgICdwcycsXG4gICAgWyctQW8nLCAncGlkPSxwcGlkPSddLFxuICAgIC8vIEtlZXAgY29tbWFuZCBib3VuZGVkIHNvIHdhdGNoLW1vZGUga2lsbCBsb29wcyBjYW5ub3QgaGFuZyB0aGlzIHBhdGguXG4gICAgeyBtYXhCdWZmZXI6IDEwMjQgKiAxMDI0LCB0aW1lb3V0OiAyMDAwIH1cbiAgKTtcbiAgY29uc3QgY2hpbGRyZW5CeVBhcmVudCA9IGJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcChzdGRvdXQpO1xuICByZXR1cm4gY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcChyb290UGlkLCBjaGlsZHJlbkJ5UGFyZW50KTtcbn1cblxuZnVuY3Rpb24gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQ6IG51bWJlciwgZGVzY2VuZGFudHM6IHJlYWRvbmx5IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCB0YXJnZXRQaWRzID0gZGVzY2VuZGFudHMudG9SZXZlcnNlZCgpO1xuICB0YXJnZXRQaWRzLnB1c2gocGlkKTtcbiAgcmV0dXJuIHRhcmdldFBpZHM7XG59XG5cbmZ1bmN0aW9uIHJ1bkNvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiB7IHRpbWVvdXQ6IG51bWJlcjsgbWF4QnVmZmVyOiBudW1iZXIgfVxuKTogeyBzdGRvdXQ6IHN0cmluZzsgc3RkZXJyOiBzdHJpbmcgfSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gZXhlY0ZpbGVTeW5jKGNvbW1hbmQsIFsuLi5hcmdzXSwge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIG1heEJ1ZmZlcjogb3B0aW9ucz8ubWF4QnVmZmVyLFxuICAgICAgdGltZW91dDogb3B0aW9ucz8udGltZW91dCxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBzdGRvdXQsIHN0ZGVycjogJycgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBzdGRlcnIgPSBleHRyYWN0U3RkZXJyKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgQ29tbWFuZEV4ZWN1dGlvbkVycm9yKGNvbW1hbmQsIGFyZ3MsIHN0ZGVyciwgdG9FeGl0Q29kZShlcnJvcikpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSAmJiBlcnJvci5jb2RlID09PSAnRVNSQ0gnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb21tYW5kRXhlY3V0aW9uRXJyb3IpIHtcbiAgICByZXR1cm4gL25vIHN1Y2ggcHJvY2Vzc3xub3QgZm91bmR8bm90IHJlY29nbml6ZWR8dGhlcmUgaXMgbm8gcnVubmluZyBpbnN0YW5jZS9pLnRlc3QoZXJyb3Iuc3RkZXJyKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHRvRXhpdENvZGUoZXJyb3I6IHVua25vd24pOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikpIHtcbiAgICByZXR1cm4gZXJyb3IuY29kZTtcbiAgfVxuICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnc3RhdHVzJyBpbiBlcnJvcikge1xuICAgIGNvbnN0IHN0YXR1cyA9IChlcnJvciBhcyB7IHN0YXR1czogdW5rbm93biB9KS5zdGF0dXM7XG4gICAgaWYgKHR5cGVvZiBzdGF0dXMgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gc3RhdHVzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0U3RkZXJyKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcgfHwgZXJyb3IgPT09IG51bGwgfHwgISgnc3RkZXJyJyBpbiBlcnJvcikpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBzdGRlcnIgPSAoZXJyb3IgYXMgUmVjb3JkPCdzdGRlcnInLCB1bmtub3duPikuc3RkZXJyO1xuICBpZiAodHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RkZXJyO1xuICB9XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RkZXJyKSkge1xuICAgIHJldHVybiBzdGRlcnIudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmNsYXNzIENvbW1hbmRFeGVjdXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvZGU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBzdGRlcnI6IHN0cmluZywgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgc3VwZXIoYENvbW1hbmQgZmFpbGVkOiAke2NvbW1hbmR9ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbW1hbmRFeGVjdXRpb25FcnJvcic7XG4gICAgdGhpcy5zdGRlcnIgPSBzdGRlcnI7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcChwc091dHB1dDogc3RyaW5nKTogTWFwPG51bWJlciwgbnVtYmVyW10+IHtcbiAgY29uc3QgY2hpbGRyZW5CeVBhcmVudCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXJbXT4oKTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHBzT3V0cHV0LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IG1hdGNoZWQgPSAvXlxccyooXFxkKylcXHMrKFxcZCspXFxzKiQvLmV4ZWMobGluZSk7XG4gICAgaWYgKCFtYXRjaGVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZFBpZCA9IE51bWJlcihtYXRjaGVkWzFdKTtcbiAgICBjb25zdCBwYXJlbnRQaWQgPSBOdW1iZXIobWF0Y2hlZFsyXSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50LmdldChwYXJlbnRQaWQpO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZFBpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkcmVuQnlQYXJlbnQuc2V0KHBhcmVudFBpZCwgW2NoaWxkUGlkXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGlsZHJlbkJ5UGFyZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlciwgY2hpbGRyZW5CeVBhcmVudDogTWFwPG51bWJlciwgbnVtYmVyW10+KTogbnVtYmVyW10ge1xuICBjb25zdCBkZXNjZW5kYW50czogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgcXVldWUgPSBbLi4uKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHJvb3RQaWQpID8/IFtdKV07XG4gIGxldCBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IHF1ZXVlLmxlbmd0aCkge1xuICAgIGNvbnN0IHBpZCA9IHF1ZXVlW2luZGV4XSBhcyBudW1iZXI7XG4gICAgaW5kZXggKz0gMTtcbiAgICBkZXNjZW5kYW50cy5wdXNoKHBpZCk7XG4gICAgcXVldWUucHVzaCguLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocGlkKSA/PyBbXSkpO1xuICB9XG4gIHJldHVybiBkZXNjZW5kYW50cztcbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgU3Bhd25PcHRpb25zLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG4gIFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlLFxuICBTcGF3blN5bmNSZXR1cm5zLFxuICBTdGRpb051bGwsXG4gIFN0ZGlvUGlwZSxcbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICcuL3RyZWVLaWxsLmpzJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgYmFzZWQgb24gU3Bhd25TeW5jUmV0dXJucyBidXQgd2l0aG91dCBvdXRwdXQgYW5kIGVycm9yIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBleHRlbmRpbmcgdmFyaW91cyBOb2RlLmpzIHNwYXduIG9wdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgLyoqIElucHV0IHN0cmluZyB0byB3cml0ZSB0byB0aGUgc3Bhd25lZCBwcm9jZXNzJ3Mgc3RkaW4gKi9cbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgb3V0cHV0IHdpbGwgYmUgbWVyZ2VkIGludG8gc3Rkb3V0ICovXG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhlIHNwYXduZWQgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBleGl0cyAqL1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGVuYWJsZXMgdmVyYm9zZSBsb2dnaW5nIG9mIHByb2Nlc3Mgb3BlcmF0aW9ucyAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZG91dCBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRvdXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZGVycj86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRvdXQpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3RkZXJyKSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0cmVlS2lsbChwcm9jLnBpZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvYy5waWR9KWAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBjbGVhbnVwU2lnbmFsczogTm9kZUpTLlNpZ25hbHNbXSA9XG4gICAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBbJ1NJR0lOVCcsICdTSUdURVJNJ10gOiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXTtcbiAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICAgIGNvbnN0IHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBbc2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoc2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWxIYW5kbGVycy5jbGVhcigpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGNsZWFudXBTaWduYWxzKSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlU2lnbmFsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgc3RvcFByb2Nlc3MoKTtcbiAgICAgICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MubGlzdGVuZXJDb3VudChzaWduYWwpID09PSAwKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIgfCBudWxsLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zPy5pbnB1dCkge1xuICAgICAgICBwcm9jLnN0ZGluPy53cml0ZShvcHRpb25zLmlucHV0KTtcbiAgICAgICAgcHJvYy5zdGRpbj8uZW5kKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiLyoqXG4gKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfVxuICpcbiAqIEB2ZXJzaW9uIDAuOS4zXG4gKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXVxuICogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5jb25zdCB0PVsuLi5cIjAxMjM0NTY3ODlhYmNkZWZcIl0scz1bNiwxNTM2LDM5MzIxNiwxMDA2NjMyOTZdLGk9WzAsOCwxNiwyNF0sZT1bMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF07ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbmV3IGgoNTEyLHMsNTEyKS51cGRhdGUodCkuaGV4KCl9Y29uc3Qgbj10PT57Y29uc3Qgcz1bXTtmb3IoY29uc3RbaSxlXW9mIHQuZW50cmllcygpKXNbaV09ZTtyZXR1cm4gc307Y2xhc3MgaHtibG9ja3M9W107cz1bXTtyZXNldD0hMDtmaW5hbGl6ZWQ9ITE7YmxvY2s9MDtzdGFydD0wO2xhc3RCeXRlSW5kZXg9MDtjb25zdHJ1Y3Rvcih0LHMsaSl7dGhpcy5wYWRkaW5nPXMsdGhpcy5vdXRwdXRCaXRzPWksdGhpcy5ibG9ja0NvdW50PTE2MDAtKHQ8PDEpPj41LHRoaXMuYnl0ZUNvdW50PXRoaXMuYmxvY2tDb3VudDw8Mix0aGlzLm91dHB1dEJsb2Nrcz1pPj41LHRoaXMuZXh0cmFCeXRlcz0oMzEmaSk+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+W2UuaHJlZl0sY3JlYXRlOihbZV0pPT5uZXcgVVJMKGUpfTtyZXR1cm4gbmV3IE1hcChbZSx0LHMsbyxyLGMsZF0ubWFwKGU9PltlLmluc3RhbmNlLm5hbWUsZV0pKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpO2V4cG9ydHt0IGFzIEdMT0JBTF9DT05TVFJVQ1RPUl9NQVAsZSBhcyBQTEFJTl9PQkpFQ1RfTEFCRUx9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RydWN0b3JzLmpzLm1hcFxuIiwiaW1wb3J0e0dMT0JBTF9DT05TVFJVQ1RPUl9NQVAgYXMgdCxQTEFJTl9PQkpFQ1RfTEFCRUwgYXMgbn1mcm9tXCIuL2NvbnN0cnVjdG9ycy5qc1wiO2NvbnN0IGU9LTEscj0tMixvPS0zLGk9LTQscz0tNSxjPS02O2Z1bmN0aW9uIGYobj12b2lkIDAsZT10KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYShuLGUpKX1mdW5jdGlvbiB1KHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuLTE7aWYoXCJudW1iZXJcIj09dHlwZW9mIHQpe2lmKE51bWJlci5pc05hTih0KSlyZXR1cm4tMztpZighTnVtYmVyLmlzRmluaXRlKHQpKXJldHVybiB0PDA/LTU6LTR9cmV0dXJuIG51bGx9Y29uc3QgbD1bXTtmdW5jdGlvbiBhKGUscj10KXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87Y29uc3QgaT1bXSxzPW5ldyBNYXA7cmV0dXJuIGZ1bmN0aW9uIHQoZSl7Y29uc3Qgbz11KGUpO2lmKG51bGwhPT1vKXJldHVybiBvO2xldCBjPXMuZ2V0KGUpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7c3dpdGNoKGM9aS5sZW5ndGgsdHlwZW9mIGUpe2Nhc2VcIm51bWJlclwiOmNhc2VcInN0cmluZ1wiOmNhc2VcImJvb2xlYW5cIjppW2NdPWUscy5zZXQoZSxjKTticmVhaztjYXNlXCJiaWdpbnRcIjppW2NdPVstNixlLnRvU3RyaW5nKDE2KV0scy5zZXQoZSxjKTticmVhaztjYXNlXCJvYmplY3RcIjppZihudWxsPT09ZSlpW2NdPWUscy5zZXQoZSxjKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkoZSkpe2NvbnN0IG49ZnVuY3Rpb24odCl7aWYobC5sZW5ndGg8dCl7Y29uc3Qgbj1sLmxlbmd0aDtsLmxlbmd0aD10LGwuZmlsbCgtMixuLHQpfXJldHVybiBsLnNsaWNlKDAsdCl9KGUubGVuZ3RoKTtpW2NdPW4scy5zZXQoZSxjKTtmb3IoY29uc3RbcixvXW9mIGUuZW50cmllcygpKW5bcl09dChvKX1lbHNle2NvbnN0W28sZl09ZnVuY3Rpb24odCxlKXtjb25zdCByPXQuY29uc3RydWN0b3I7aWYoXCJmdW5jdGlvblwiPT10eXBlb2Ygcil7Y29uc3Qgbj1yLm5hbWUsbz1lLmdldChuKTtpZih2b2lkIDAhPT1vKXJldHVybltuLG8uZnJvbSh0KV19Y29uc3Qgbz1PYmplY3QuZW50cmllcyh0KSxpPW8ubGVuZ3RoLHM9QXJyYXkuZnJvbSh7bGVuZ3RoOmkraX0pO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IG49b1t0XSxlPXQrdDtzW2VdPW5bMF0sc1tlKzFdPW5bMV19cmV0dXJuW24sc119KGUsciksdT1mLmxlbmd0aCxsPUFycmF5LmZyb20oe2xlbmd0aDp1KzF9KTtsWzBdPW8saVtjXT1sLHMuc2V0KGUsYyk7Zm9yKGxldCBuPTA7bjx1O24rKylsW24rMV09dChmW25dKX19cmV0dXJuIGN9KGUpLGl9ZXhwb3J0e3IgYXMgQVJSQVlfSE9MRV9JTkRFWCxjIGFzIEJJR19JTlRfTEFCRUwsbyBhcyBOQU5fSU5ERVgscyBhcyBORUdfSU5GX0lOREVYLGkgYXMgUE9TX0lORl9JTkRFWCxlIGFzIFVOREVGSU5FRF9JTkRFWCxhIGFzIGxpc3RpZnksZiBhcyBzdHJpbmdpZnl9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5naWZ5LmpzLm1hcFxuIiwiaW1wb3J0e3NoYTNfNTEyIGFzIHJ9ZnJvbVwiLi9oYXNoLmpzXCI7aW1wb3J0e3N0cmluZ2lmeSBhcyBufWZyb21cIi4vb3Nvbi9zdHJpbmdpZnkuanNcIjtmdW5jdGlvbiBvKG8sdCl7cmV0dXJuIHIobihbbyx0XSkpfWZ1bmN0aW9uIHQocixvKXtyZXR1cm4gbihbcixvXSl9ZnVuY3Rpb24gaSgpe3JldHVyblwiXCJ9ZXhwb3J0e2kgYXMgZ2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nLG8gYXMgZ2V0Q2FjaGVLZXlPZkhhc2gsdCBhcyBnZXRDYWNoZUtleU9mU3RyaW5naWZpZWR9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0Q2FjaGVLZXkuanMubWFwXG4iLCJpbXBvcnR7Z2V0Q2FjaGVLZXlPZkhhc2ggYXMgdCxnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcgYXMgZX1mcm9tXCIuL2dldENhY2hlS2V5LmpzXCI7Y29uc3Qgbj1yKHtnZXRDYWNoZUtleTp0fSksYz1yKHtnZXRDYWNoZUtleTplfSk7ZnVuY3Rpb24gcih7Y2FjaGVEdXJhdGlvbjplPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxnZXRDYWNoZUtleTpuPXR9PXt9KXtyZXR1cm4gZnVuY3Rpb24odCxjKXtsZXQgcixvLGk7cmV0dXJuXCJnZXR0ZXJcIj09PWM/LmtpbmQ/ZnVuY3Rpb24oKXtjb25zdCBjPW4odGhpcyxbXSksYT1EYXRlLm5vdygpO3JldHVybihpIT09Y3x8YS1vPmUpJiYoaT1jLHI9dC5jYWxsKHRoaXMpLG89YSkscn06ZnVuY3Rpb24oLi4uYSl7Y29uc3QgdT1uKHRoaXMsYSksaD1EYXRlLm5vdygpO3JldHVybihpIT09dXx8aC1vPmUpJiYoaT11LHI9Yz90LmNhbGwodGhpcywuLi5hKTp0KC4uLmEpLG89aCkscn19fWV4cG9ydHtuIGFzIG1lbW9pemVPbmUsciBhcyBtZW1vaXplT25lRmFjdG9yeSxjIGFzIG1lbW9pemVPbmVXaXRoRW1wdHlIYXNofTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9pemVPbmUuanMubWFwXG4iLCJleHBvcnQgZnVuY3Rpb24gaXNDSShjaUVudjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWNpRW52ICYmIGNpRW52ICE9PSAnMCcgJiYgY2lFbnYgIT09ICdmYWxzZSc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyBtZW1vaXplT25lIH0gZnJvbSAnYXQtZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBnbG9iYnkgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuL3V0aWxzL2NpLmpzJztcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcm0gPSAncHJpc21hJyB8ICdkcml6emxlJztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAvKF58XFxuKWJ1blxccy8udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgID8gJ1lBUk4gcnVuIGJ1aWxkJ1xuICAgICAgOiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkXG4gICAgICAgID8gYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke3RoaXMuYXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gXG4gICAgICAgIDogXCJlY2hvICdObyBidWlsZCBzY3JpcHQnXCI7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXRoaXMubG9hZEVudikgcmV0dXJuIHByb2Nlc3MuZW52O1xuXG4gICAgY29uc3QgW2VudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmFyZ3YsIHRoaXMuZGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBbZW52UGF0aCwgY291bnRdIG9mIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYExvYWRlZCAke2NvdW50fSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IC4uLmVudlZhcnMsIC4uLnByb2Nlc3MuZW52IH07XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLnBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb25QYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbigncHJpc21hJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRHJpenpsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCdkcml6emxlLW9ybScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRhdGFiYXNlT3JtKCk6IERhdGFiYXNlT3JtIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNQcmlzbWEpIHJldHVybiAncHJpc21hJztcbiAgICBpZiAodGhpcy5oYXNEcml6emxlKSByZXR1cm4gJ2RyaXp6bGUnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNWaXRlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy52aXRlc3QgPz8gdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnZpdGVzdCk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzT3hsaW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094Zm10KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294Zm10Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUG9ldHJ5TG9jaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncG9ldHJ5LmxvY2snKSkgfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQdWJzcGVjWWFtbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncHVic3BlYy55YW1sJykpIHx8XG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncHVic3BlYy55YW1sJykpXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwcmVmZXJyZWRMaW50ZXIoKTogJ294bGludCcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmhhc094bGludCkgcmV0dXJuICdveGxpbnQnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGhhc093bkRlcGVuZGVuY3kocGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWUpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BsYXl3cmlnaHRDb25maWcoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0NJKHRoaXMuZW52LkNJKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdQYXRoID0gdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICAgIHJldHVybiAvXFxid2ViU2VydmVyXFxiLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSA9PT0gdGhpcy5kaXJQYXRoXG4gICAgICA/IHRoaXMucGFja2FnZUpzb25cbiAgICAgIDogKEpTT04ucGFyc2UoXG4gICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICAgICkgYXMgUGFja2FnZUpzb24pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJpbkV4aXN0cygpOiBib29sZWFuIHtcbiAgICBsZXQgYmluRm91bmQgPSBmYWxzZTtcbiAgICBsZXQgY3VycmVudFBhdGggPSB0aGlzLmRpclBhdGg7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgYmluUGF0aCA9IHBhdGguam9pbihjdXJyZW50UGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhiaW5QYXRoKSkge1xuICAgICAgICB0aGlzLmVudi5QQVRIID0gYCR7YmluUGF0aH06JHt0aGlzLmVudi5QQVRIfWA7XG4gICAgICAgIGJpbkZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnLmdpdCcpKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgICAgaWYgKGN1cnJlbnRQYXRoID09PSBwYXJlbnRQYXRoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY3VycmVudFBhdGggPSBwYXJlbnRQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gYmluRm91bmQ7XG4gIH1cblxuICBmaW5kRmlsZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgZmlsZVBhdGggPSB0aGlzLnBhdGhCeU5hbWUuZ2V0KGZpbGVOYW1lKTtcbiAgICBpZiAoZmlsZVBhdGgpIHJldHVybiBmaWxlUGF0aDtcblxuICAgIGZpbGVQYXRoID0gW2ZpbGVOYW1lLCBwYXRoLmpvaW4oJy4uJywgJy4uJywgZmlsZU5hbWUpXVxuICAgICAgLm1hcCgocCkgPT4gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgcCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlTmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5wYXRoQnlOYW1lLnNldChmaWxlTmFtZSwgZmlsZVBhdGgpO1xuICAgIHJldHVybiBmaWxlUGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzRGVwZW5kZW5jeShwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZSkgPz8gdGhpcy5nZXREZXBlbmRlbmN5VmVyc2lvbih0aGlzLnJvb3RQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWUpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGVwZW5kZW5jeVZlcnNpb24odGhpcy5wYWNrYWdlSnNvbiwgcGFja2FnZU5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghcGFja2FnZUpzb24pIHJldHVybjtcblxuICAgIHJldHVybiAoXG4gICAgICBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgcHJpdmF0ZSBnZXQgcm9vdFBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yb290RGlyUGF0aCA9PT0gdGhpcy5kaXJQYXRoKSByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbjtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFt3Yl0gRmFpbGVkIHRvIHJlYWQgb3IgcGFyc2UgJHtwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpfWAsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID1cbiAgLy8gRGV0ZWN0IGBidW4gLS1idW4gcnVuIHdiIC4uLmAuIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gIHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8XG4gIC8vIERldGVjdCBgYnVuIHJ1biB3YiAuLi5gLlxuICBwcm9jZXNzLmFyZ3ZbMF0/LmVuZHNXaXRoKCcvYnVuJykgfHxcbiAgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQmluYXJ5TGlrZSwgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGJ1aWxkQ29tbWFuZCA9XG4gICAgYXJndi5jb21tYW5kID8/XG4gICAgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQgPyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFidWlsZENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1NraXAgdG8gYnVpbGQgYmVjYXVzZSBubyBidWlsZCBjb21tYW5kIGlzIGRlZmluZWQuJykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBidWlsZENvbW1hbmQgfTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50SGFzaCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICByZXR1cm4gW2NhY2hlZENvbnRlbnRIYXNoID09PSBjb250ZW50SGFzaCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5jb25zdCBpbmNsdWRlUGF0dGVybnMgPSBbJ3NyYy8nLCAncHVibGljLyddO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuXTtcbmNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IFsndGVzdC8nLCAndGVzdHMvJywgJ19fdGVzdHNfXy8nLCAndGVzdC1maXh0dXJlcy8nLCAndGVzdC9maXh0dXJlcy8nXTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJ10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IGxpbmVzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSBsaW5lc1xuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZSgyKS50cmltKCkpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biwgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgY2k/OiBib29sZWFuO1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xuICBvblNpZ25hbD86IChzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4gdm9pZDtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChyYXcpJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cyk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSk7XG4gIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcmV0LnN0YXR1cywgb3B0cyk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcmV0LnN0YXR1cywgb3B0cyk7XG4gICAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBjYXBpdGFsaXplZCBjb21tYW5kcyAoZS5nLiwgWUFSTiwgUFJJU01BLCBCVU4pIHdpdGggc3VpdGFibGUgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB7IHByaW50YWJsZTogc3RyaW5nOyBydW5uYWJsZTogc3RyaW5nIH0ge1xuICBsZXQgbmV3U2NyaXB0ID0gc2NyaXB0XG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXHNcXHMrL2csICcgJylcbiAgICAucmVwbGFjZUFsbChcbiAgICAgICdQUklTTUEgZ2VuZXJhdGUgJyxcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdQUklTTUEgZ2VuZXJhdGUgJyA6ICdQUklTTUEgZ2VuZXJhdGUgLS1uby1oaW50cyAnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuIC0tYnVuKSBydW5gXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4gJyA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKVxuICAgICAgLnJlcGxhY2VBbGwoLyg/OllBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAvLyAnLS1hbGxvd09ubHknIGlzIHNvbWV0aW1lcyByZW1vdmVkLlxuICAgICAgLnJlcGxhY2VBbGwoLyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzKD86IC0tYWxsb3dPbmx5KT8vZywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQobmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKSk7XG4gIGNvbnN0IHJ1bm5hYmxlU2NyaXB0ID0gZml4QnVuQ29tbWFuZChcbiAgICBuZXdTY3JpcHRcbiAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW4gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiAnLCAhaXNSdW5uaW5nT25CdW4gJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYClcbiAgKTtcbiAgLy8gQWRkIGNhc2NhZGUgb3B0aW9uIHdoZW4gV0JfRU5WIGlzIGRlZmluZWRcbiAgY29uc3QgY2FzY2FkZU9wdGlvbiA9IHByb2plY3QuZW52LldCX0VOViA/IGAgLWM9JHtwcm9qZWN0LmVudi5XQl9FTlYgfHwgJ2RldmVsb3BtZW50J31gIDogJyc7XG4gIHJldHVybiB7XG4gICAgcHJpbnRhYmxlOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiR7Y2FzY2FkZU9wdGlvbn0gLS0gJHtwcmludGFibGVTY3JpcHR9YCxcbiAgICBydW5uYWJsZTogcnVubmFibGVTY3JpcHQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCwgcHJlZml4ID0gJ1N0YXJ0Jywgd2VhayA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhcbiAgICAnXFxuJyArXG4gICAgICAod2VhayA/IGNoYWxrLmdyYXkgOiBjaGFsay5jeWFuKShjaGFsay5ib2xkKGAke3ByZWZpeH06YCksIG5vcm1hbGl6ZWRTY3JpcHQpICtcbiAgICAgIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsLFxuICBvcHRzOiBPbWl0PE9wdGlvbnMsICd0aW1lb3V0Jz5cbik6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIHNjcmlwdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOiBgKSwgc2NyaXB0KSk7XG4gICAgaWYgKG9wdHMuZXhpdElmRmFpbGVkICE9PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlID8/IDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlRW52KFxuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdHM6IE9wdGlvbnNcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0Vudi5DSSA9ICcxJztcbiAgfVxuICBpZiAob3B0cy5mb3JjZUNvbG9yKSB7XG4gICAgbmV3RW52LkZPUkNFX0NPTE9SID0gJzMnO1xuICB9XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbmZ1bmN0aW9uIGZpeEJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvMTQzNTlcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJ25leHQgZGV2JykgfHxcbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy84MjIyXG4gICAgY29tbWFuZC5pbmNsdWRlcygncGxheXdyaWdodCcpIHx8XG4gICAgLy8gXCJidW4gLS1idW4gcHJpc21hIGdlbmVyYXRlXCIgZG9lc24ndCB3b3JrXG4gICAgY29tbWFuZC5pbmNsdWRlcygncHJpc21hJykgfHxcbiAgICBjb21tYW5kLmluY2x1ZGVzKCd0ZXN0L2UyZS1hZGRpdGlvbmFsJylcbiAgICA/IGNvbW1hbmQucmVwbGFjZUFsbCgnYnVuIC0tYnVuJywgJ2J1bicpXG4gICAgOiBjb21tYW5kO1xufVxuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBvcHRpb25OYW1lIG9mIE9iamVjdC5rZXlzKHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRPcHRpb25WYWx1ZShhcmd2LCBvcHRpb25OYW1lKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGFyZ3MucHVzaCh2YWx1ZSA/IGAtLSR7b3B0aW9uTmFtZX1gIDogYC0tJHtvcHRpb25OYW1lfT1mYWxzZWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7dmFsdWV9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHtpdGVtfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gYXJncztcbn1cblxuZnVuY3Rpb24gZ2V0T3B0aW9uVmFsdWUoYXJndjogRW52UmVhZGVyT3B0aW9ucywgb3B0aW9uTmFtZTogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGNhbWVsQ2FzZU9wdGlvbk5hbWUgPSBvcHRpb25OYW1lLnJlcGxhY2VBbGwoLy0oW2Etel0pL2csIChfLCBjaGFyYWN0ZXI6IHN0cmluZykgPT4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCkpO1xuICBjb25zdCBvcHRpb25zID0gYXJndiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIG9wdGlvbnNbb3B0aW9uTmFtZV0gPz8gb3B0aW9uc1tjYW1lbENhc2VPcHRpb25OYW1lXTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52LCBub3JtYWxpemVTY3JpcHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgRk9SQ0VfS0lMTF9ERUxBWV9NUyA9IDUwMDA7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdraWxsLW90aGVycyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBleGl0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAna2lsbC1vdGhlcnMtb24tZmFpbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBmYWlscycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzdWNjZXNzOiB7XG4gICAgZGVzY3JpcHRpb246ICdEZWZpbmUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIGNyaXRlcmlhJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbJ2FsbCcsICdmaXJzdCddLFxuICAgIGRlZmF1bHQ6ICdhbGwnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NvbW1hbmRzIHRvIHJ1biBjb25jdXJyZW50bHknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5pbnRlcmZhY2UgUnVuQ29uY3VycmVudGx5T3B0aW9ucyB7XG4gIGNvbW1hbmRzOiBzdHJpbmdbXTtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAga2lsbE90aGVyczogYm9vbGVhbjtcbiAga2lsbE90aGVyc09uRmFpbDogYm9vbGVhbjtcbiAgc3VjY2VzczogJ2FsbCcgfCAnZmlyc3QnO1xuICBjaT86IGJvb2xlYW47XG4gIGZvcmNlQ29sb3I/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgY29uY3VycmVudGx5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2NvbmN1cnJlbnRseSA8Y29tbWFuZHMuLi4+JyxcbiAgZGVzY3JpYmU6ICdSdW4gY29tbWFuZHMgY29uY3VycmVudGx5JyxcbiAgYnVpbGRlcjogeyAuLi5zaGFyZWRPcHRpb25zQnVpbGRlciwgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZHMgPSAoYXJndi5jb21tYW5kcyA/PyBbXSkubWFwKFN0cmluZykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChjb21tYW5kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBjb21tYW5kcyBwcm92aWRlZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuQ29uY3VycmVudGx5KHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGtpbGxPdGhlcnM6IGFyZ3Yua2lsbE90aGVycyA/PyBmYWxzZSxcbiAgICAgICAga2lsbE90aGVyc09uRmFpbDogYXJndi5raWxsT3RoZXJzT25GYWlsID8/IGZhbHNlLFxuICAgICAgICBzdWNjZXNzOiBhcmd2LnN1Y2Nlc3MsXG4gICAgICAgIGNpOiB0eXBlb2YgYXJndi5jaSA9PT0gJ2Jvb2xlYW4nID8gYXJndi5jaSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZm9yY2VDb2xvcjogdHlwZW9mIGFyZ3YuZm9yY2VDb2xvciA9PT0gJ2Jvb2xlYW4nID8gYXJndi5mb3JjZUNvbG9yIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ29uY3VycmVudGx5KG9wdGlvbnM6IFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBjaGlsZHJlbiA9IG9wdGlvbnMuY29tbWFuZHMubWFwKChjb21tYW5kKSA9PlxuICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd24obm9ybWFsaXplU2NyaXB0KGNvbW1hbmQsIG9wdGlvbnMucHJvamVjdCkucnVubmFibGUsIHtcbiAgICAgIGN3ZDogb3B0aW9ucy5wcm9qZWN0LmRpclBhdGgsXG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIGVudjogY29uZmlndXJlRW52KG9wdGlvbnMucHJvamVjdC5lbnYsIHsgY2k6IG9wdGlvbnMuY2ksIGZvcmNlQ29sb3I6IG9wdGlvbnMuZm9yY2VDb2xvciB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KVxuICApO1xuXG4gIGxldCBzdG9wcGluZyA9IGZhbHNlO1xuICBsZXQgaW50ZXJydXB0ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBsZXQgZmlyc3RSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0b3BSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZm9yY2VLaWxsUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBjb25zdCByZXN1bHRzID0gQXJyYXkuZnJvbTxudW1iZXIgfCB1bmRlZmluZWQ+KHsgbGVuZ3RoOiBjaGlsZHJlbi5sZW5ndGggfSk7XG4gIGNvbnN0IHdhaXRGb3JFeGl0UHJvbWlzZXMgPSBjaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHNldHRsZSA9IChleGl0Q29kZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG5cbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0gZXhpdENvZGU7XG4gICAgICAgIGZpcnN0UmVzdWx0ID8/PSBleGl0Q29kZTtcblxuICAgICAgICBpZiAoIXN0b3BwaW5nICYmIHNob3VsZFN0b3BPdGhlcnMoZXhpdENvZGUsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgc3RvcFJlc3VsdCA9IGV4aXRDb2RlO1xuICAgICAgICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICAgICAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCAnU0lHVEVSTScpKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgICAgIHNldHRsZSgxKTtcbiAgICAgIH0pO1xuICAgICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgc2V0dGxlKGdldEV4aXRDb2RlKGNvZGUgPz8gdW5kZWZpbmVkLCBzaWduYWwgPz8gdW5kZWZpbmVkKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3Qgc3RvcEFsbCA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgaW50ZXJydXB0ZWRTaWduYWwgPz89IHNpZ25hbDtcbiAgICBpZiAoc3RvcHBpbmcpIHJldHVybjtcblxuICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCBzaWduYWwpKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lnaW50ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR0lOVCcpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWd0ZXJtID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1RFUk0nKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lncXVpdCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdRVUlUJyk7XG4gIH07XG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgcHJvY2Vzcy5vbignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB0cnkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3JFeGl0UHJvbWlzZXMpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGZvcmNlS2lsbFByb21pc2VzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIH1cblxuICBpZiAoaW50ZXJydXB0ZWRTaWduYWwpIHtcbiAgICByZXR1cm4gZ2V0RXhpdENvZGUodW5kZWZpbmVkLCBpbnRlcnJ1cHRlZFNpZ25hbCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnKSB7XG4gICAgcmV0dXJuIGZpcnN0UmVzdWx0ID8/IDE7XG4gIH1cbiAgaWYgKHN0b3BSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdG9wUmVzdWx0O1xuICB9XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpdENvZGUoY29kZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjb2RlO1xuICB9XG4gIGlmIChzaWduYWwgJiYgc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSB7XG4gICAgcmV0dXJuIDEyOCArIGNvbnN0YW50cy5zaWduYWxzW3NpZ25hbF07XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN0b3BPdGhlcnMoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIG9wdGlvbnM6IFBpY2s8UnVuQ29uY3VycmVudGx5T3B0aW9ucywgJ2tpbGxPdGhlcnMnIHwgJ2tpbGxPdGhlcnNPbkZhaWwnIHwgJ3N1Y2Nlc3MnPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcgfHwgb3B0aW9ucy5raWxsT3RoZXJzIHx8IChvcHRpb25zLmtpbGxPdGhlcnNPbkZhaWwgJiYgZXhpdENvZGUgIT09IDApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmb3JjZUtpbGxQaWRzID0gc2lnbmFsUGlkcyh0b0NoaWxkUGlkcyhjaGlsZHJlbiksIHNpZ25hbCk7XG4gIGlmIChmb3JjZUtpbGxQaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGlmIChhd2FpdCB3YWl0Rm9yRm9yY2VLaWxsKGZvcmNlS2lsbFBpZHMpKSB7XG4gICAgc2lnbmFsUGlkcyhmb3JjZUtpbGxQaWRzLCAnU0lHS0lMTCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRQaWRzKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdKTogbnVtYmVyW10ge1xuICByZXR1cm4gY2hpbGRyZW4uZmxhdE1hcCgoY2hpbGQpID0+IChjaGlsZC5waWQgPT09IHVuZGVmaW5lZCA/IFtdIDogW2NoaWxkLnBpZF0pKTtcbn1cblxuZnVuY3Rpb24gc2lnbmFsUGlkcyhwaWRzOiByZWFkb25seSBudW1iZXJbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IG51bWJlcltdIHtcbiAgY29uc3Qgc2lnbmFsZWRQaWRzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBpZCBvZiBwaWRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICgha2lsbFByb2Nlc3NHcm91cChwaWQsIHNpZ25hbCkpIGNvbnRpbnVlO1xuXG4gICAgICBzaWduYWxlZFBpZHMucHVzaChwaWQpO1xuICAgICAgdHJlZUtpbGwocGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBraWxsIGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2lnbmFsZWRQaWRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yRm9yY2VLaWxsKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEZPUkNFX0tJTExfREVMQVlfTVM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICBpZiAocGlkcy5ldmVyeShpc1Byb2Nlc3NHcm91cEdvbmUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCBzbGVlcChNYXRoLm1pbigxMDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSkpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1Byb2Nlc3NHcm91cEdvbmUocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgMCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG5mdW5jdGlvbiBraWxsUHJvY2Vzc0dyb3VwKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsIHNpZ25hbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJztcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuY29uc3Qga2lsbFBvcnRJZk5vbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qga2lsbFBvcnRJZk5vbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdraWxsLXBvcnQtaWYtbm9uLWNpJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBwb3J0IHNwZWNpZmllZCBieSBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIG5vbi1DSS4nLFxuICBidWlsZGVyOiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBraWxsUG9ydElmTm9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRJZk5vbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChpc0NJKHByb2plY3QuZW52LkNJKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBraWxsaW5nIHBvcnQgZHVlIHRvIENJOiAke3Byb2plY3QuZW52LkNJfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBvcnRFbnYgPSBwcm9qZWN0LmVudi5QT1JUO1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocG9ydCkgfHwgcG9ydCA8PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oYEtpbGxpbmcgdGhlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnKSkuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bmFtZX09JHtzaGVsbEVzY2FwZUFyZ3VtZW50KHZhbHVlKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hlbGxFc2NhcGVBcmd1bWVudChhcmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXltcXHcuLzo9LEAlKy1dKyQvdS50ZXN0KGFyZykgPyBhcmcgOiBgJyR7YXJnLnJlcGxhY2VBbGwoXCInXCIsIGAnXCInXCInYCl9J2A7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHF1aWV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZXBvcnQgZXJyb3JzIG9ubHknLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBmaWxlczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhzIHRvIGxpbnQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPFxuICB0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlclxuPjtcbmV4cG9ydCB0eXBlIExpbnRDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxMaW50Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogdW5rbm93bltdOyBfOiB1bmtub3duW10gfTtcblxuY29uc3Qgb3hsaW50RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydhc3RybycsICdjanMnLCAnY3RzJywgJ2pzJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3N2ZWx0ZScsICd0cycsICd0c3gnLCAndnVlJ10pO1xuY29uc3QgcHl0aG9uRXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydweSddKTtcbmNvbnN0IGRhcnRFeHRlbnNpb25zID0gbmV3IFNldChbJ2RhcnQnXSk7XG5jb25zdCBveGZtdEV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgLi4ub3hsaW50RXh0ZW5zaW9ucyxcbiAgJ2NzcycsXG4gICdncWwnLFxuICAnZ3JhcGhxbCcsXG4gICdoYnMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdsZXNzJyxcbiAgJ21kJyxcbiAgJ21keCcsXG4gICdzY3NzJyxcbiAgJ3RvbWwnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllckV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgJ2NqcycsXG4gICdjc3MnLFxuICAnY3RzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2phdmEnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWQnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzY3NzJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllck9ubHlFeHRlbnNpb25zID0gbmV3IFNldChbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5maWx0ZXIoKGV4dCkgPT4gIW94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0KSkpO1xuY29uc3QgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybiA9ICchKiovdGVzdHstLC99Zml4dHVyZXMvKionO1xuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTGludENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBsaW50KGFyZ3YgYXMgTGludENvbW1hbmRBcmd2KTtcbiAgICBpZiAoZXhpdENvZGUpIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGludChhcmd2OiBMaW50Q29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGdldExpbnRUYXJnZXRGaWxlcyhhcmd2KTtcbiAgY29uc3QgbGludEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgZGFydEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IHByZXR0aWVyRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSBmYWxzZTtcbiAgbGV0IHByZXR0aWVyQXJnczogc3RyaW5nW107XG4gIGxldCBzb3J0UGFja2FnZUpzb25BcmdzOiBzdHJpbmdbXTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW50VGFyZ2V0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpO1xuICAgICAgICBjb25zdCBmaWxlS2luZCA9IGF3YWl0IGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9O1xuICAgICAgfSlcbiAgICApO1xuICAgIGZvciAoY29uc3QgeyBmaWxlS2luZCwgZmlsZVBhdGggfSBvZiBsaW50VGFyZ2V0cykge1xuICAgICAgaWYgKFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKC4uLmdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSk7XG5cbiAgICAgIGZvciAoY29uc3QgeyBsaW50UGF0aCwgcHJvamVjdCB9IG9mIGdldEV4cGxpY2l0TGludFRhcmdldHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jayAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgcHl0aG9uRmlsZVBhdGhzID0gcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBweXRob25GaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgZGFydEZpbGVQYXRocyA9IGRhcnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGRhcnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgZGFydEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgZGFydEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRGaWxlUGF0aHMgPSBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4obGludFBhdGgpLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZm9ybWF0dGVyUGF0aCBvZiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhwcm9qZWN0LCBsaW50UGF0aCwgZmlsZUtpbmQsIGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYXJndi5mb3JtYXQgJiYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQgJiYgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb24pICYmICFwcm9qZWN0LnByZWZlcnJlZExpbnRlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBObyBsaW50ZXIgZm91bmQgZm9yICR7cHJvamVjdC5uYW1lfS4gSW5zdGFsbCBPeGxpbnQuYCkpO1xuICAgICAgICAgIG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByZXR0aWVyQXJncyA9IFsuLi5uZXcgU2V0KHByZXR0aWVyRmlsZVBhdGhzKV07XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IFsuLi5uZXcgU2V0KHBhY2thZ2VKc29uRmlsZVBhdGhzKV07XG4gIH0gZWxzZSB7XG4gICAgcHJldHRpZXJBcmdzID0gYnVpbGRQcmV0dGllckFyZ3MocHJvamVjdHMuc2VsZi5kaXJQYXRoLCBwcm9qZWN0cy5kZXNjZW5kYW50cyk7XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gcC5wYWNrYWdlSnNvblBhdGgpO1xuICB9XG5cbiAgY29uc3QgbGludFByb21pc2VzOiBQcm9taXNlPG51bWJlcj5bXSA9IFtdO1xuICBjb25zdCBsaW50UnVuT3B0aW9ucyA9IHsgZXhpdElmRmFpbGVkOiBmYWxzZSwgZm9yY2VDb2xvcjogdHJ1ZSB9IGFzIGNvbnN0O1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIGxpbnRGaWxlUGF0aHNdIG9mIGxpbnRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2LCBsaW50RmlsZVBhdGhzKTtcbiAgICAgIGlmICghbGludENvbW1hbmQpIGNvbnRpbnVlO1xuXG4gICAgICBsaW50UHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd25JblBhcmFsbGVsKGxpbnRDb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgIH1cbiAgICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgIGZvciAoY29uc3QgW3Byb2plY3QsIG94Zm10RmlsZVBhdGhzXSBvZiBveGZtdEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgICBsaW50UHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd25JblBhcmFsbGVsKGJ1aWxkT3hmbXRDb21tYW5kKG94Zm10RmlsZVBhdGhzKSwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgcHl0aG9uRmlsZVBhdGhzXSBvZiBweXRob25GaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgIGxpbnRQcm9taXNlcy5wdXNoKFxuICAgICAgICBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGJ1aWxkUG9ldHJ5Q29tbWFuZChhcmd2LCBweXRob25GaWxlUGF0aHMpLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucylcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIGRhcnRGaWxlUGF0aHNdIG9mIGRhcnRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYnVpbGREYXJ0Q29tbWFuZChhcmd2LCBkYXJ0RmlsZVBhdGhzKSwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmICFwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndik7XG4gICAgICBpZiAoIWxpbnRDb21tYW5kKSBjb250aW51ZTtcblxuICAgICAgbGludFByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduSW5QYXJhbGxlbChsaW50Q29tbWFuZCwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrKSB7XG4gICAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYnVpbGRQb2V0cnlDb21tYW5kKGFyZ3YpLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgICAgfVxuICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwpIHtcbiAgICAgICAgbGludFByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduSW5QYXJhbGxlbChidWlsZERhcnRDb21tYW5kKGFyZ3YpLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgICAgfVxuICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQgJiYgYXJndi5mb3JtYXQpIHtcbiAgICAgICAgbGludFByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduSW5QYXJhbGxlbChidWlsZE94Zm10Q29tbWFuZCgpLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBsaW50RXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwobGludFByb21pc2VzKTtcblxuICBpZiAobWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyB8fCBsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGlmIChhcmd2LmZvcm1hdCkge1xuICAgIGlmIChwcmV0dGllckFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKFxuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgICAgICdZQVJOJyxcbiAgICAgICAgICAgICdwcmV0dGllcicsXG4gICAgICAgICAgICAnLS1jYWNoZScsXG4gICAgICAgICAgICAnLS1jb2xvcicsXG4gICAgICAgICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAgICAgICAnLS13cml0ZScsXG4gICAgICAgICAgICAnLS0nLFxuICAgICAgICAgICAgLi4ucHJldHRpZXJBcmdzLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UsIGZvcmNlQ29sb3I6IHRydWUgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoc29ydFBhY2thZ2VKc29uQXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW50RXhpdENvZGVzLnB1c2goXG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gICAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoWydZQVJOJywgJ3NvcnQtcGFja2FnZS1qc29uJywgJy0tJywgLi4uc29ydFBhY2thZ2VKc29uQXJnc10pLFxuICAgICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UsIGZvcmNlQ29sb3I6IHRydWUgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkgPyAxIDogMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTGludENvbW1hbmQoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcic+LFxuICBhcmd2OiBQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ2ZpeCcgfCAnZm9ybWF0Jz4gJiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sXG4gIGZpbGVzPzogc3RyaW5nW11cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ294bGludCcsXG4gICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAuLi4oYXJndi5xdWlldCA/IFsnLS1xdWlldCddIDogW10pLFxuICAgICAgLi4uKGFyZ3YuZml4ID8gWyctLWZpeCddIDogW10pLFxuICAgICAgLi4uKGZpbGVzID8/IFsnLiddKSxcbiAgICBdKTtcbiAgfVxuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE94Zm10Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICdveGZtdCcsICctLXdyaXRlJywgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLCAuLi4oZmlsZXMgPz8gWycuJ10pXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvZXRyeUNvbW1hbmQoXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAnZml4JyB8ICdmb3JtYXQnPiAmIFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PixcbiAgZmlsZXM/OiBzdHJpbmdbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICBjb25zdCBjb21tYW5kcyA9XG4gICAgYXJndi5maXggfHwgYXJndi5mb3JtYXRcbiAgICAgID8gW1xuICAgICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdpc29ydCcsICctLXByb2ZpbGUnLCAnYmxhY2snLCAnLS1maWx0ZXItZmlsZXMnLCAuLi50YXJnZXRzXSksXG4gICAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2JsYWNrJywgLi4udGFyZ2V0c10pLFxuICAgICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdmbGFrZTgnLCAuLi4oYXJndi5xdWlldCA/IFsnLXEnXSA6IFtdKSwgLi4udGFyZ2V0c10pLFxuICAgICAgICBdXG4gICAgICA6IFtidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnZmxha2U4JywgLi4uKGFyZ3YucXVpZXQgPyBbJy1xJ10gOiBbXSksIC4uLnRhcmdldHNdKV07XG4gIHJldHVybiBjb21tYW5kcy5qb2luKCcgJiYgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERhcnRDb21tYW5kKFxuICBhcmd2OiBQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ2ZpeCcgfCAnZm9ybWF0Jz4gJiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sXG4gIGZpbGVzPzogc3RyaW5nW11cbik6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChhcmd2LmZpeCB8fCBhcmd2LmZvcm1hdCkge1xuICAgIGNvbW1hbmRzLnB1c2goYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2Zvcm1hdCcsIC4uLnRhcmdldHNdKSk7XG4gIH1cbiAgY29tbWFuZHMucHVzaChidWlsZFNoZWxsQ29tbWFuZChbJ2RhcnQnLCAnYW5hbHl6ZScsIC4uLnRhcmdldHNdKSk7XG4gIHJldHVybiBjb21tYW5kcy5qb2luKCcgJiYgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByZXR0aWVyQXJncyhcbiAgc2VsZkRpclBhdGg6IHN0cmluZyxcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPltdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3MgPSBuZXcgU2V0PHN0cmluZz4oW2AqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9fWAsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dKTtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgaWYgKCFuZWVkc1ByZXR0aWVyKHByb2plY3QpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHByb2plY3RQYXR0ZXJuID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJyoqL3suKi8sfSoueycgKyBbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5qb2luKCcsJykgKyAnfScpO1xuICAgIGFyZ3MuYWRkKHBhdGgucmVsYXRpdmUoc2VsZkRpclBhdGgsIHByb2plY3RQYXR0ZXJuKSB8fCBwcm9qZWN0UGF0dGVybik7XG4gIH1cbiAgcmV0dXJuIFsuLi5hcmdzXTtcbn1cblxuZnVuY3Rpb24gZmluZE93bmluZ1Byb2plY3QocHJvamVjdHM6IFByb2plY3RbXSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBsZXQgb3duaW5nUHJvamVjdDogUHJvamVjdCB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgaWYgKFxuICAgICAgKGZpbGVQYXRoID09PSBwcm9qZWN0LmRpclBhdGggfHwgZmlsZVBhdGguc3RhcnRzV2l0aChgJHtwcm9qZWN0LmRpclBhdGh9L2ApKSAmJlxuICAgICAgKCFvd25pbmdQcm9qZWN0IHx8IHByb2plY3QuZGlyUGF0aC5sZW5ndGggPiBvd25pbmdQcm9qZWN0LmRpclBhdGgubGVuZ3RoKVxuICAgICkge1xuICAgICAgb3duaW5nUHJvamVjdCA9IHByb2plY3Q7XG4gICAgfVxuICB9XG4gIHJldHVybiBvd25pbmdQcm9qZWN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGludFRhcmdldEZpbGVzKGFyZ3Y6IFBpY2s8TGludENvbW1hbmRBcmd2LCAnLS0nIHwgJ18nIHwgJ2ZpbGVzJz4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGxpbnRUYXJnZXRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgWy4uLihhcmd2LmZpbGVzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpLCAuLi4oYXJndlsnLS0nXSA/PyBbXSldKSB7XG4gICAgbGludFRhcmdldHMuYWRkKFN0cmluZyh2YWx1ZSkpO1xuICB9XG4gIHJldHVybiBbLi4ubGludFRhcmdldHNdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TGludFRhcmdldEZpbGVLaW5kKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPCdkaXJlY3RvcnknIHwgJ290aGVyJz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aCk7XG4gICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHJldHVybiAnZGlyZWN0b3J5JztcbiAgfSBjYXRjaCB7XG4gICAgLy8gTWlzc2luZyBwYXRocyBhcmUgaGFuZGxlZCBieSB0aGUgZG93bnN0cmVhbSB0b29scy5cbiAgfVxuXG4gIHJldHVybiAnb3RoZXInO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkRm9ybWF0RXhwbGljaXRQYXRoV2l0aFByZXR0aWVyKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgaWYgKHByb2plY3QuaGFzT3hmbXQpIHJldHVybiBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIGlmIChuZWVkc1ByZXR0aWVyKHByb2plY3QpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHByZXR0aWVyT25seUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+LFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInLFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoXTtcbiAgfVxuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuXTtcbiAgfVxuICBpZiAoc2hvdWxkRm9ybWF0RXhwbGljaXRQYXRoV2l0aFByZXR0aWVyKHByb2plY3QsIGV4dGVuc2lvbikpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoXTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJPbmx5RGlyZWN0b3J5UGF0dGVybihmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihmaWxlUGF0aCwgYCoqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdFBhY2thZ2VKc29uUGF0aHMoXG4gIHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwYWNrYWdlSnNvblBhdGgnPltdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIHJldHVybiBbXTtcbiAgcmV0dXJuIHByb2plY3RzXG4gICAgLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PlxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCA9PT0gcGF0aC5qb2luKGZpbGVQYXRoLCAncGFja2FnZS5qc29uJykgfHxcbiAgICAgICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGguc3RhcnRzV2l0aChgJHtmaWxlUGF0aH0vYClcbiAgICApXG4gICAgLm1hcCgocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvblBhdGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyhcbiAgcHJvamVjdHM6IFByb2plY3RbXSxcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJ1xuKTogeyBsaW50UGF0aDogc3RyaW5nOyBwcm9qZWN0OiBQcm9qZWN0IH1bXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScpIHtcbiAgICBjb25zdCBkZXNjZW5kYW50UHJvamVjdHMgPSBwcm9qZWN0cy5maWx0ZXIoXG4gICAgICAocHJvamVjdCkgPT4gcHJvamVjdC5kaXJQYXRoID09PSBmaWxlUGF0aCB8fCBwcm9qZWN0LmRpclBhdGguc3RhcnRzV2l0aChgJHtmaWxlUGF0aH0vYClcbiAgICApO1xuICAgIGlmIChkZXNjZW5kYW50UHJvamVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGRlc2NlbmRhbnRQcm9qZWN0cy5tYXAoKHByb2plY3QpID0+ICh7IGxpbnRQYXRoOiBwcm9qZWN0LmRpclBhdGgsIHByb2plY3QgfSkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0cywgZmlsZVBhdGgpO1xuICByZXR1cm4gcHJvamVjdCA/IFt7IGxpbnRQYXRoOiBmaWxlUGF0aCwgcHJvamVjdCB9XSA6IFtdO1xufVxuXG5mdW5jdGlvbiBpc1BvdGVudGlhbExpbnRUYXJnZXQoZXh0ZW5zaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIG94bGludEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHwgcHl0aG9uRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBkYXJ0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcic+LCBleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnKSByZXR1cm4gb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBuZWVkc1ByZXR0aWVyKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPik6IGJvb2xlYW4ge1xuICByZXR1cm4gIXByb2plY3QuaGFzT3hmbXQgJiYgcHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IGtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gPz8ge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZT8uc3RhcnRzV2l0aCgnZ2l0QGdpdGh1Yi5jb206JykpIHtcbiAgICAgICAgICAgIGRlcHNbbmFtZV0gPSBgLi8ke25hbWV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgIH1cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFhcmd2Lm91dHNpZGUpIHtcbiAgICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmluZm8oJ0luc3RhbGxlZCBkZXBlbmRlbmNpZXMuJyk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWFyZ3Yub3V0c2lkZSkge1xuICAgIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gICAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGV2RGVwcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAncmFpbHdheScsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBjb25zdCByZW1vdmVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIChuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLnN0YXJ0c1dpdGgod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgICAgcmVtb3ZlZFNjcmlwdHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIHNjcmlwdHM6JywgcmVtb3ZlZFNjcmlwdHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuXG5jbGFzcyBEcml6emxlU2NyaXB0cyB7XG4gIGRlcGxveShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIG1pZ3JhdGUoX3Byb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBkcml6emxlLWtpdCBtaWdyYXRlICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoX3Byb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBkcml6emxlLWtpdCBnZW5lcmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCByZW1vdmVDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdCk7XG4gICAgaWYgKCFyZW1vdmVDb21tYW5kKSB7XG4gICAgICByZXR1cm4gXCJlY2hvICd3YiBkYiByZXNldCBzdXBwb3J0cyBEcml6emxlIG9ubHkgd2hlbiBEQVRBQkFTRV9QQVRIIG9yIGZpbGU6IERBVEFCQVNFX1VSTCBpcyBzZXQuJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7cmVtb3ZlQ29tbWFuZH0gJiYgJHt0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpfSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LnNlZWQpIHJldHVybiAnWUFSTiBydW4gc2VlZCc7XG4gICAgcmV0dXJuICd0cnVlJztcbiAgfVxuXG4gIHN0dWRpbyhfcHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgc3R1ZGlvIGZvciBEcml6emxlIGRvZXMgbm90IHN1cHBvcnQgZGItdXJsLW9yLXBhdGguJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYFlBUk4gZHJpenpsZS1raXQgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gcHJvamVjdC5lbnYuREFUQUJBU0VfUEFUSCA/PyBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpID8gZGJQYXRoIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGJQYXRoKTtcbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZnVuY3Rpb24gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3RGJQYXRoID0gZGJVcmwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKS5yZXBsYWNlKC9bPyNdLiokLywgJycpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIHJldHVybiByYXdEYlBhdGg7XG59XG5cbmV4cG9ydCBjb25zdCBkcml6emxlU2NyaXB0cyA9IG5ldyBEcml6emxlU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuY29uc3QgUE9TU0lCTEVfUFJJU01BX1BBVEhTID0gW1xuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuXTtcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjbGVhblVwQ29tbWFuZCA9IGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgLy8gQ2xlYW51cCBleGlzdGluZyBhcnRpZmFjdHMgdG8gYXZvaWQgaXNzdWVzIHdpdGggTGl0ZXN0cmVhbSByZXBsaWNhdGlvbi5cbiAgICAvLyBOb3RlIHRoYXQgZG9uJ3QgbWVyZ2UgbXVsdGlwbGUgcm0gY29tbWFuZHMgaW50byBvbmUsIGJlY2F1c2UgaWYgb25lIGZhaWxzLCB0aGUgc3Vic2VxdWVudCBvbmVzIHdvbid0IHJ1bi5cbiAgICByZXR1cm4gYCR7Y2xlYW5VcENvbW1hbmR9OyBybSAtUmYgJHtkaXJQYXRofS8ucHJvZC5zcWxpdGUzKiB8fCB0cnVlYDtcbiAgfVxuXG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IHJlbW92ZURiQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIC8vIGBwcmlzbWEgbWlncmF0ZSByZXNldGAgY2FuIGZhaWwgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgZXhpc3RpbmcgZGF0YWJhc2UsIHNvIHdlIHJlbW92ZSBpdCBmaXJzdC5cbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYCR7cmVtb3ZlRGJDb21tYW5kfTsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3JlbW92ZURiQ29tbWFuZH1cbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAtY29uZmlnIGxpdGVzdHJlYW0ueW1sIC1vICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIGxzIC1haGwgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBsaXRlc3RyZWFtIGx0eCAtY29uZmlnIGxpdGVzdHJlYW0ueW1sICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc30gJiYgUFJJU01BIGdlbmVyYXRlICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIGNvbnN0IHN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNsZWFudXBDb21tYW5kID0gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdCk7XG4gICAgaWYgKGNsZWFudXBDb21tYW5kKSBzdGVwcy5wdXNoKGNsZWFudXBDb21tYW5kKTtcbiAgICBjb25zdCByZXNldENvbW1hbmQgPSBbJ1BSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBzdGVwcy5wdXNoKHJlc2V0Q29tbWFuZCk7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikge1xuICAgICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgICAgc3RlcHMucHVzaCh0aGlzLnNlZWQocHJvamVjdCkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgcm0gLVJmICR7b3V0cHV0UGF0aH0qOyBsaXRlc3RyZWFtIHJlc3RvcmUgLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAtbyAke291dHB1dFBhdGh9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gICAgICBpZiAoYmFzZURpcikge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyLCBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKSk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvbW91bnQnIDogJ3ByaXNtYS9tb3VudCc7XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF07IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBQUklTTUEgZGIgZXhlY3V0ZSAtLXN0ZGluIC0tdXJsIFwiJHtGSUxFX1NDSEVNQX0ke2RiUGF0aH1cIjsgZmkgJiYgcm0gLWYgXCIke2RiUGF0aH1cIi4qIFwiJHtkYlBhdGh9XCItKmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3RGJQYXRoID0gZGJVcmwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKS5yZXBsYWNlKC9bPyNdLiokLywgJycpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUocmF3RGJQYXRoKVxuICAgID8gcmF3RGJQYXRoXG4gICAgOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyID8/ICcuJywgcmF3RGJQYXRoKTtcblxuICByZXR1cm4gYHJtIC1mIFwiJHthYnNvbHV0ZVBhdGh9XCIgXCIke2Fic29sdXRlUGF0aH0td2FsXCIgXCIke2Fic29sdXRlUGF0aH0tc2htXCJgO1xufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VPcm0sIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGFsaWFzZXM6IFsnZGInXSxcbiAgZGVzY3JpYmU6XG4gICAgXCJSdW4gZGF0YWJhc2UgY29tbWFuZHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gUHJpc21hLiBEcml6emxlIHByb2plY3RzIHVzZSBkcml6emxlLWtpdC4gRXhhbXBsZTogd2IgcHJpc21hIG1pZ3JhdGUtZGV2IC0tIC0tbmFtZSBpbml0XCIsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5jb21tYW5kKGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpc3RCYWNrdXBzQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKVxuICAgICAgLnN0cmljdChmYWxzZSk7IC8vIEFsbG93IHVua25vd24gb3B0aW9ucyB0byBiZSBwYXNzZWQgdGhyb3VnaFxuICB9LFxuICBoYW5kbGVyKCkge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfSxcbn07XG5cbmNvbnN0IGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdjbGVhbnVwLWxpdGVzdHJlYW0nLFxuICBkZXNjcmliZTogJ0NsZWFuIHVwIHRlbXBvcmFsIExpdGVzdHJlYW0gZmlsZXMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgY2xlYW51cC1saXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5jbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3QpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aG91dCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZGVwbG95JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXN0QmFja3Vwcyhwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkubWlncmF0ZURldihwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc2V0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXNldCcsXG4gIGRlc2NyaWJlOiAnUmVzZXQgREInLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgcmVzZXQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gICAgICAgICdXQl9FTlY9dGVzdCBkYiByZXNldCcsXG4gICAgICAgIGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpXG4gICAgICApKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc3RvcmVCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSByZXN0b3JlZCBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gXCI8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzXCIuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlc3RvcmVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHJlc3RvcmVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXN0b3JlJyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICBhcmd2Lm91dHB1dCA/PyAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXN0b3JlKHByb2plY3QsIG91dHB1dCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBkYXRhYmFzZSBzdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc3R1ZGlvJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBkYlVybE9yUGF0aCA9IGFyZ3YucmVzdG9yZWRcbiAgICAgICAgPyBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHpcbiAgICAgICAgICA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICAgIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoLCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOlxuICAgIFwiUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHRoZSBkZXRlY3RlZCBPUk0gYXMgaXMuIEFkZGl0aW9uYWwgUHJpc21hIGZsYWdzIGNhbiBhbHNvIGJlIGZvcndhcmRlZCBhZnRlciAnLS0nLlwiLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gKGFyZ3YuYXJncz8uam9pbignICcpID8/ICcnKS50cmltRW5kKCk7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydhcmdzJ10pO1xuICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gW3NjcmlwdCwgdW5rbm93bk9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKGBkYiAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgY29tbWFuZCA9IG9ybSA9PT0gJ3ByaXNtYScgPyBgUFJJU01BICR7ZnVsbENvbW1hbmR9YCA6IGBZQVJOIGRyaXp6bGUta2l0ICR7ZnVsbENvbW1hbmR9YDtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihjb21tYW5kLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYicgOiAncHJpc21hJztcbiAgY29uc3QgZGJQYXRoID0gYCR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzYDtcbiAgY29uc3QgcmVxdWlyZWRFbnZWYXJzID0ge1xuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUU6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVksXG4gIH0gYXMgY29uc3Q7XG4gIGNvbnN0IG1pc3NpbmdFbnZWYXJzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRFbnZWYXJzKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIXZhbHVlKVxuICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZ0VudlZhcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExpdGVzdHJlYW06ICR7bWlzc2luZ0VudlZhcnMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJldGVudGlvbkNoZWNrSW50ZXJ2YWwgPSBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICdzdGFnaW5nJyA/ICc1bScgOiAnMWgnO1xuICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnID0gYGRiczpcbiAgLSBwYXRoOiAke2RiUGF0aH1cbiAgICBidXN5LXRpbWVvdXQ6IDVzXG4gICAgY2hlY2twb2ludC1pbnRlcnZhbDogMW1cbiAgICByZXBsaWNhOlxuICAgICAgdHlwZTogczNcbiAgICAgIGVuZHBvaW50OiBodHRwczovLyR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEfS5yMi5jbG91ZGZsYXJlc3RvcmFnZS5jb21cbiAgICAgIGJ1Y2tldDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FfVxuICAgICAgYWNjZXNzLWtleS1pZDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUR9XG4gICAgICBzZWNyZXQtYWNjZXNzLWtleTogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZfVxuICAgICAgc25hcHNob3QtaW50ZXJ2YWw6IDI0aCAgIyBDcmVhdGUgYSBiYWNrdXAgcGVyIGRheVxuICAgICAgcmV0ZW50aW9uOiA3MmggICAgICAgICAgIyBLZWVwIGJhY2t1cHMgZm9yIDMgZGF5c1xuICAgICAgcmV0ZW50aW9uLWNoZWNrLWludGVydmFsOiAke3JldGVudGlvbkNoZWNrSW50ZXJ2YWx9XG4gICAgICBzeW5jLWludGVydmFsOiAxbVxuYDtcblxuICBjb25zdCBjb25maWdQYXRoID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gLCB7XG4gICAgICBjYXVzZTogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIERhdGFiYXNlT3JtUHJvamVjdCB7XG4gIHByb2plY3Q6IFByb2plY3Q7XG4gIG9ybTogRGF0YWJhc2VPcm07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIG9ybT86IERhdGFiYXNlT3JtKTogUHJvbWlzZTxEYXRhYmFzZU9ybVByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1xuICAgIC5tYXAoKHByb2plY3QpID0+IChwcm9qZWN0LmRhdGFiYXNlT3JtID8geyBwcm9qZWN0LCBvcm06IHByb2plY3QuZGF0YWJhc2VPcm0gfSA6IHVuZGVmaW5lZCkpXG4gICAgLmZpbHRlcigocHJvamVjdCk6IHByb2plY3QgaXMgRGF0YWJhc2VPcm1Qcm9qZWN0ID0+ICEhcHJvamVjdCAmJiAoIW9ybSB8fCBwcm9qZWN0Lm9ybSA9PT0gb3JtKSk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChvcm0gPyBgTm8gJHtvcm19IHByb2plY3QgZm91bmQuYCA6ICdObyBzdXBwb3J0ZWQgZGF0YWJhc2UgT1JNIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbmZ1bmN0aW9uIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm06IERhdGFiYXNlT3JtKTogdHlwZW9mIHByaXNtYVNjcmlwdHMgfCB0eXBlb2YgZHJpenpsZVNjcmlwdHMge1xuICByZXR1cm4gb3JtID09PSAncHJpc21hJyA/IHByaXNtYVNjcmlwdHMgOiBkcml6emxlU2NyaXB0cztcbn1cblxuZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKFxuICBjb21tYW5kTmFtZTogc3RyaW5nLFxuICBwcm9qZWN0czogRGF0YWJhc2VPcm1Qcm9qZWN0W11cbik6IEdlbmVyYXRvcjxEYXRhYmFzZU9ybVByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgY29uc3Qgb3JtUHJvamVjdEJ5UHJvamVjdCA9IG5ldyBNYXAocHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiBbcHJvamVjdC5wcm9qZWN0LCBwcm9qZWN0XSkpO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKFxuICAgIGNvbW1hbmROYW1lLFxuICAgIHByb2plY3RzLm1hcCgoeyBwcm9qZWN0IH0pID0+IHByb2plY3QpXG4gICkpIHtcbiAgICBjb25zdCBvcm1Qcm9qZWN0ID0gb3JtUHJvamVjdEJ5UHJvamVjdC5nZXQocHJvamVjdCk7XG4gICAgaWYgKCFvcm1Qcm9qZWN0KSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZXRlY3QgZGF0YWJhc2UgT1JNIGZvciAke3Byb2plY3QubmFtZX0uYCk7XG5cbiAgICB5aWVsZCBvcm1Qcm9qZWN0O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gT1JNIGNvbW1hbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3Y6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmcge1xuICBjb25zdCB1bmtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBCdWlsZCBsaXN0IG9mIGtub3duIG9wdGlvbnMgZnJvbSBzaGFyZWQgb3B0aW9ucyBidWlsZGVyc1xuICBjb25zdCBzaGFyZWRPcHRpb25LZXlzID0gT2JqZWN0LmtleXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpO1xuICBjb25zdCBzaGFyZWRPcHRpb25BbGlhc2VzID0gT2JqZWN0LnZhbHVlcyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgICAuZmxhdE1hcCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAoJ2FsaWFzJyBpbiBvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob3B0aW9uLmFsaWFzKSA/IG9wdGlvbi5hbGlhcyA6IFtvcHRpb24uYWxpYXNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pXG4gICAgLm1hcChTdHJpbmcpO1xuXG4gIGNvbnN0IGFsbEtub3duT3B0aW9ucyA9IG5ldyBTZXQoW1xuICAgIC4uLmtub3duT3B0aW9ucyxcbiAgICAuLi5zaGFyZWRPcHRpb25LZXlzLFxuICAgIC4uLnNoYXJlZE9wdGlvbkFsaWFzZXMsXG4gICAgLy8gSW50ZXJuYWwgeWFyZ3MgcHJvcGVydGllc1xuICAgICctLScsXG4gICAgJ18nLFxuICAgICckMCcsXG4gIF0pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGFyZ3YpKSB7XG4gICAgaWYgKCFhbGxLbm93bk9wdGlvbnMuaGFzKGtleSkpIHtcbiAgICAgIC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb25zIG9mIGtlYmFiLWNhc2Ugb3B0aW9ucyB0byBhdm9pZCBkdXBsaWNhdGlvblxuICAgICAgLy8gSWYgd2UgaGF2ZSBib3RoICdjcmVhdGUtb25seScgYW5kICdjcmVhdGVPbmx5JywgcHJlZmVyIHRoZSBrZWJhYi1jYXNlIHZlcnNpb25cbiAgICAgIGNvbnN0IGtlYmFiQ2FzZUtleSA9IGtleS5yZXBsYWNlQWxsKC9bQS1aXS9nLCAobWF0Y2gpID0+IGAtJHttYXRjaC50b0xvd2VyQ2FzZSgpfWApO1xuICAgICAgaWYgKGtlYmFiQ2FzZUtleSAhPT0ga2V5ICYmIGFyZ3Zba2ViYWJDYXNlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9uIGlmIGtlYmFiLWNhc2UgZXhpc3RzXG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBib29sZWFuIGZsYWdzXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgdmFsdWUpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBzdHJpbmcvbnVtYmVyIHZhbHVlc1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyhpdGVtKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBwYXNzdGhyb3VnaEFyZ3MgPSBBcnJheS5pc0FycmF5KGFyZ3ZbJy0tJ10pID8gYXJndlsnLS0nXS5tYXAoU3RyaW5nKSA6IFtdO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWy4uLnVua25vd25PcHRpb25zLCAuLi5wYXNzdGhyb3VnaEFyZ3NdKTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgcmV0cnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbWF4aW11bSByZXRyeSBjb3VudCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgYWxpYXM6ICdyJyxcbiAgICBkZWZhdWx0OiAzLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBvblNpZ25hbDogKHNpZ25hbCkgPT4ge1xuICAgICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignYXNkZiBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGNvbnN0IFssIHZlcnNpb25dID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnYXNkZiBjdXJyZW50IHB5dGhvbicpLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3ZlcnNpb259YCwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmluZCgocCkgPT4gcC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnBsYXl3cmlnaHQpO1xuICBpZiAocHJvamVjdCkge1xuICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICAnLS0nPzogc3RyaW5nW107XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xuICBzaWxlbnQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHsgJy0tJz86IHN0cmluZ1tdIH1cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSlcbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5pbXBvcnQgeyBpc1BvcnRBdmFpbGFibGUgfSBmcm9tICcuL3BvcnQuanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCk7XG4gIGlmICghYXZhaWxhYmxlKSB7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9XG5cbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFdlIHNob3VsZCBzdG9wIERvY2tlciBjb250YWluZXJzIGZpcnN0IGJlY2F1c2UgYGtpbGwtcG9ydGAgbWF5IGZhaWwgdG8gc3RvcCBEb2NrZXIgY29udGFpbmVycy5cbiAgYXdhaXQgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0LCBwcm9qZWN0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5SW1hZ2VOYW1lKGltYWdlTmFtZTogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBuYW1lPSR7aW1hZ2VOYW1lfWBdLCBwcm9qZWN0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBwdWJsaXNoPSR7cG9ydH1gXSwgcHJvamVjdCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckNvbnRhaW5lcnMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250YWluZXJJZHMgPSBhd2FpdCBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3MsIHByb2plY3QpO1xuICAgIGlmIChjb250YWluZXJJZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3JtJywgJy1mJywgLi4uY29udGFpbmVySWRzXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncHMnLCAnLXEnLCAuLi5maWx0ZXJBcmdzXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogcHJvamVjdC5lbnYsXG4gIH0pO1xuICByZXR1cm4gc3Rkb3V0XG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChpZCkgPT4gaWQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIENoZWNrcyB0aGUgZ2l2ZW4gcG9ydCBhbmQga2lsbHMgYW55IHByb2Nlc3MgdXNpbmcgaXQuXG4gKiBOb3RlIHdiIGFsd2F5cyByZXF1aXJlcyBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocmF3UG9ydDogdW5rbm93biwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocmF3UG9ydCk7XG4gIGlmICghcG9ydCkgdGhyb3cgbmV3IEVycm9yKGBUaGUgZ2l2ZW4gcG9ydCAoJHtwb3J0fSkgaXMgaW52YWxpZC5gKTtcblxuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0LCBwcm9qZWN0KTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcG9ydCBpcyBhdmFpbGFibGUuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBjaGVja1xuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgcG9ydCBpcyBhdmFpbGFibGUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNQb3J0QXZhaWxhYmxlKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBDaGVjayBib3RoIHN0YWNrcyB0byBjYXRjaCBwcm9jZXNzZXMgYm91bmQgb25seSBvbiBJUHY2IG9yIElQdjQuXG4gIGZvciAoY29uc3QgaG9zdCBvZiBbJzEyNy4wLjAuMScsICc6OiddKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgcHJvYmVQb3J0KGhvc3QsIHBvcnQpO1xuICAgIGlmICghYXZhaWxhYmxlKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2JlUG9ydChob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcblxuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRk5PU1VQUE9SVCcpIHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCBob3N0KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGRJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259IC5gO1xuICB9XG5cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dGhpcy5zdGFydChwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucywgYWRkaXRpb25hbEFyZ3MpfWA7XG4gIH1cblxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICBjb25zdCBhbGxvY2F0ZVR0eSA9IGFkZGl0aW9uYWxBcmdzLmluY2x1ZGVzKCcvYmluL2Jhc2gnKTtcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAke2FsbG9jYXRlVHR5ID8gJy1pdCAnIDogJyd9LS1wdWJsaXNoICR7cHJvamVjdC5lbnYuUE9SVH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVPcHRpb25zIHtcbiAgLyoqICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJyAqL1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xuICAvKiogUmF3IFBsYXl3cmlnaHQgYXJncyBmb3J3YXJkZWQgYWZ0ZXIgYHdiIHRlc3QgLS0gLi4uYCAqL1xuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHAgPSBzaG91bGRXYWl0QW5kT3BlbkFwcDtcbiAgfVxuXG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGRJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogc3RhcnQgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIGFzeW5jIHN0YXJ0RGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgXSk7XG4gIH1cbiAgYXN5bmMgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhc3luYyBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAnd2InLFxuICAgICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgICAgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKSxcbiAgICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICAgIF0pfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcbiAgcHJvdGVjdGVkIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBlY29zeXN0ZW1Db25maWdQYXRoID0gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY29tbWFuZHMgPVxuICAgICAgZWNvc3lzdGVtQ29uZmlnUGF0aCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gW1xuICAgICAgICAgICAgYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke2FyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YC50cmltKCksXG4gICAgICAgICAgICBgbm9kZSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCksXG4gICAgICAgICAgXVxuICAgICAgICA6IFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYHBtMi1ydW50aW1lIHN0YXJ0IC0tbm8tYXV0b3Jlc3RhcnQgJHtlY29zeXN0ZW1Db25maWdQYXRofWBdO1xuXG4gICAgcmV0dXJuIFsuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCkuc3BsaXQoJyYmJykgOiBbXSksIC4uLmNvbW1hbmRzXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCgoY21kKSA9PiBgJHtjbWR9ICR7dG9EZXZOdWxsKGFyZ3YpfWAudHJpbSgpKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRURvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCksIG9wdGlvbnMpO1xuICB9XG4gIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBVc2UgZW1wdHkgTk9ERV9FTlYgdG8gYXZvaWQgXCJwcm9kdWN0aW9uXCIgbW9kZSBpbiBzb21lIGZyYW1ld29ya3MgbGlrZSBCbGl0ei5qcy5cbiAgICByZXR1cm4gYCR7YnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCgnTk9ERV9FTlYnLCAnJyl9ICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFwcChwcm9qZWN0KSxcbiAgICBdKX1gO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIHsgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBbXSwgcGxheXdyaWdodEFyZ3MgPSBbJ3Rlc3QnLCAndGVzdC9lMmUvJ10gfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJncywgYXJndi50YXJnZXRzLCBhcmd2LmJhaWwsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcbiAgICBpZiAocHJvamVjdC5za2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCkge1xuICAgICAgcmV0dXJuIGAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGB3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd2aXRlc3QnLFxuICAgICAgICAncnVuJyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgICctLWNvbG9yJyxcbiAgICAgICAgJy0tcGFzc1dpdGhOb1Rlc3RzJyxcbiAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgJy0td2F0Y2g9ZmFsc2UnLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgXSk7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnYnVuJyxcbiAgICAgICAgJ3Rlc3QnLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDUwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAxMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMjAwMDAgLWkgNDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA2MDAwMCAtaSA1MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDkwMDAwIC1pIDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0XG4gICAgKX0gfHwgd2FpdC1vbiBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodENvbW1hbmQoXG4gIHBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSxcbiAgdGFyZ2V0czogVGVzdEFyZ3ZbJ3RhcmdldHMnXSxcbiAgYmFpbD86IGJvb2xlYW4sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gWydCVU4nLCAncGxheXdyaWdodCddO1xuICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICBpZiAocGxheXdyaWdodEFyZ3NbMF0gIT09ICd0ZXN0JyB8fCAhbm9ybWFsaXplZFRhcmdldHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihbLi4uYmFzZSwgLi4ucGxheXdyaWdodEFyZ3MsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSwgYmFpbCk7XG4gIH1cblxuICBjb25zdCByZXN0ID0gcGxheXdyaWdodEFyZ3Muc2xpY2UoMSk7XG4gIGNvbnN0IGV4cGxpY2l0VGFyZ2V0SW5kZXhlcyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKHJlc3QpO1xuICBjb25zdCByZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0ID1cbiAgICBleHBsaWNpdFRhcmdldEluZGV4ZXMubGVuZ3RoID09PSAwID8gcmVzdCA6IHJlc3QuZmlsdGVyKChfLCBpbmRleCkgPT4gIWV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5pbmNsdWRlcyhpbmRleCkpO1xuICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oXG4gICAgWy4uLmJhc2UsICd0ZXN0JywgLi4ubm9ybWFsaXplZFRhcmdldHMsIC4uLnJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSxcbiAgICBiYWlsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGNvbW1hbmRBcmdzOiBzdHJpbmdbXSwgYmFpbD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBwbGF5d3JpZ2h0SW5kZXggPSBjb21tYW5kQXJncy5pbmRleE9mKCdwbGF5d3JpZ2h0Jyk7XG4gIGNvbnN0IGlzUGxheXdyaWdodFRlc3RDb21tYW5kID0gcGxheXdyaWdodEluZGV4ICE9PSAtMSAmJiBjb21tYW5kQXJnc1twbGF5d3JpZ2h0SW5kZXggKyAxXSA9PT0gJ3Rlc3QnO1xuICBpZiAoIWJhaWwgfHwgIWlzUGxheXdyaWdodFRlc3RDb21tYW5kKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICBpZiAoY29tbWFuZEFyZ3Muc29tZSgoYXJnKSA9PiBhcmcgPT09ICctLW1heC1mYWlsdXJlcycgfHwgYXJnLnN0YXJ0c1dpdGgoJy0tbWF4LWZhaWx1cmVzPScpKSkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi5jb21tYW5kQXJncywgJy0tbWF4LWZhaWx1cmVzPTEnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhhcmdzOiBzdHJpbmdbXSk6IG51bWJlcltdIHtcbiAgbGV0IHBlbmRpbmdWYWx1ZU1vZGU6ICdvcHRpb25hbCcgfCAncmVxdWlyZWQnIHwgdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXRJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBhcmddIG9mIGFyZ3MuZW50cmllcygpKSB7XG4gICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUpIHtcbiAgICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlID09PSAncmVxdWlyZWQnIHx8ICFhcmcuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICByZXR1cm4gWy4uLnRhcmdldEluZGV4ZXMsIC4uLmFyZ3Muc2xpY2UoaW5kZXggKyAxKS5tYXAoKF8sIG9mZnNldCkgPT4gaW5kZXggKyAxICsgb2Zmc2V0KV07XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgaWYgKGFyZy5pbmNsdWRlcygnPScpKSBjb250aW51ZTtcbiAgICAgIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH0gZWxzZSBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdvcHRpb25hbCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctJykgJiYgYXJnICE9PSAnLScpIHtcbiAgICAgIGNvbnN0IHNob3J0T3B0aW9uID0gYXJnLnNsaWNlKDAsIDIpO1xuICAgICAgaWYgKGFyZy5sZW5ndGggPT09IDIgJiYgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKHNob3J0T3B0aW9uKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0YXJnZXRJbmRleGVzLnB1c2goaW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldEluZGV4ZXM7XG59XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbXG4gICctLWJyb3dzZXInLFxuICAnLS1jb25maWcnLFxuICAnLS1ncmVwJyxcbiAgJy0tZ3JlcC1pbnZlcnQnLFxuICAnLS1nbG9iYWwtdGltZW91dCcsXG4gICctLW1heC1mYWlsdXJlcycsXG4gICctLW91dHB1dCcsXG4gICctLXByb2plY3QnLFxuICAnLS1yZXBlYXQtZWFjaCcsXG4gICctLXJlcG9ydGVyJyxcbiAgJy0tcmV0cmllcycsXG4gICctLXNoYXJkJyxcbiAgJy0tdGVzdC1saXN0JyxcbiAgJy0tdGVzdC1saXN0LWludmVydCcsXG4gICctLXRpbWVvdXQnLFxuICAnLS10cmFjZScsXG4gICctLXRzY29uZmlnJyxcbiAgJy0tdWktaG9zdCcsXG4gICctLXVpLXBvcnQnLFxuICAnLS11aS10aXRsZScsXG4gICctLXdvcmtlcnMnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTID0gbmV3IFNldChbXG4gICctLW9ubHktY2hhbmdlZCcsXG4gICctLXVwZGF0ZS1zbmFwc2hvdHMnLFxuICAnLS11cGRhdGUtc291cmNlLW1ldGhvZCcsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFsnLWMnLCAnLWcnLCAnLWonXSk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBibGl0eiBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cywgdHlwZSBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRDb25maWcpIHtcbiAgICAgIHJldHVybiBzdXBlci50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHN0YXJ0Q29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYHdhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fVxuICAgICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgICAndml0ZXN0JyxcbiAgICAgICAgICAncnVuJyxcbiAgICAgICAgICAuLi4odGFyZ2V0cyAmJiB0YXJnZXRzLmxlbmd0aCA+IDAgPyB0YXJnZXRzIDogWyd0ZXN0L2UyZS8nXSksXG4gICAgICAgICAgJy0tY29sb3InLFxuICAgICAgICAgICctLXBhc3NXaXRoTm9UZXN0cycsXG4gICAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgICBdKX0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5leHQgZGV2IC0tdHVyYm9wYWNrICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgU0VSVkVSX0xPR19GSUxFIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0RGV2UHJvdGVjdGVkKF8xOiBQcm9qZWN0LCBfMjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZC4nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RGV2KF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9IHwgdGVlICR7U0VSVkVSX0xPR19GSUxFfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0VGVzdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICAgICl9YFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRVByb2R1Y3Rpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0RTJFRG9ja2VyKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBSZW1peCBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUmVtaXhTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHJlbWl4IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlbWl4U2NyaXB0cyA9IG5ldyBSZW1peFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBWaXRlLWJhc2VkIGFwcHMgd2l0aCBQbGF5d3JpZ2h0IGUyZSB0ZXN0cy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgVml0ZVNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiB2aXRlIGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFlBUk4gdml0ZSBwcmV2aWV3ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpdGVTY3JpcHRzID0gbmV3IFZpdGVTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJywgJ2hvbm8nXTtcbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFyZ3MsIHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCB0ZXN0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiU3RhcnQgYXBwLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIHRoZSB1bmRlcmx5aW5nIGFwcCBjb21tYW5kLiBFeGFtcGxlOiB3YiBzdGFydCAtLSAtLWhvc3QgMC4wLjAuMFwiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+XG4gICAgeWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KS5vcHRpb25zKGJ1aWxkZXIpIGFzIEFyZ3Y8XG4gICAgICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuICAgID4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHx8XG4gICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICApIHtcbiAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSA/PyAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdkZXZlbG9wbWVudCc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREZXYocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0YWdpbmcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnRQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA9IGAnL2Jpbi9iYXNoJ2A7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0gYXdhaXQgc2NyaXB0cy5zdGFydFRlc3QocHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFydCBtb2RlOiAke2FyZ3YubW9kZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGUyZToge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0UyZSB0ZXN0IG1vZGU6IGhlYWRsZXNzIChkZWZhdWx0KSB8IGhlYWRsZXNzLWRldiB8IGhlYWRlZCB8IGhlYWRlZC1kZXYgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCBkZWJ1ZyB8IGdlbmVyYXRlIHwgdHJhY2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFtcbiAgICAgICdoZWFkbGVzcycsXG4gICAgICAnaGVhZGxlc3MtZGV2JyxcbiAgICAgICdoZWFkZWQnLFxuICAgICAgJ2hlYWRlZC1kZXYnLFxuICAgICAgJ2RvY2tlcicsXG4gICAgICAnZG9ja2VyLWRlYnVnJyxcbiAgICAgICdkZWJ1ZycsXG4gICAgICAnZ2VuZXJhdGUnLFxuICAgICAgJ3RyYWNlJyxcbiAgICBdLFxuICAgIGRlZmF1bHQ6ICdoZWFkbGVzcycsXG4gIH0sXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGJhaWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0b3AgdGVzdHMgYWZ0ZXIgdGhlIGZpcnN0IGZhaWx1cmUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ3VuaXQtdGltZW91dCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWVvdXQgZm9yIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgdGFyZ2V0czoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGVzdCB0YXJnZXQgcGF0aHMnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIFRlc3RDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj47XG5cbmV4cG9ydCB0eXBlIFRlc3RBcmd2ID0gUGFydGlhbDxcbiAgQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4+O1xuXG5leHBvcnQgdHlwZSBUZXN0Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VGVzdENvbW1hbmRPcHRpb25zPiAmIHsgJy0tJz86IHN0cmluZ1tdIH07XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUZXN0Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndGVzdCBbdGFyZ2V0cy4uLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlRlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBmbGFncyB0byBQbGF5d3JpZ2h0LiBFeGFtcGxlOiB3YiB0ZXN0IC0tIC0tZ3JlcCAndXBsb2FkZWQgaW1hZ2UgYXNzZXQnXCIsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPik6IEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPiA9PlxuICAgIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLm9wdGlvbnMoeyAuLi5idWlsZGVyLCAuLi5hcmd1bWVudHNCdWlsZGVyIH0pIGFzIEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdChhcmd2IGFzIFRlc3RDb21tYW5kQXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChhcmd2OiBUZXN0Q29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIC8vIEdldCB0ZXN0IHRhcmdldHMgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICBjb25zdCB0ZXN0VGFyZ2V0cyA9IChhcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IGFyZ3ZbJy0tJ10gPz8gW107XG4gIGNvbnN0IHsgc2hvdWxkUnVuRTJlLCBzaG91bGRSdW5Vbml0IH0gPSByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHModGVzdFRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgLy8gUnVuIHVuaXQgdGVzdHMgaWYgbmVlZGVkXG4gICAgaWYgKHNob3VsZFJ1blVuaXQgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgICBjb25zdCB1bml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICAgICAgY29uc3QgdW5pdEFyZ3YgPSB7IC4uLmFyZ3YsIHRhcmdldHM6IHVuaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyB1bml0VGFyZ2V0cyA6IHVuZGVmaW5lZCB9O1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgdW5pdEFyZ3YpLCBwcm9qZWN0LCBhcmd2LCB7IHRpbWVvdXQ6IGFyZ3YudW5pdFRpbWVvdXQgfSk7XG4gICAgfVxuICAgIC8vIFNraXAgZTJlIHRlc3RzIGlmIG5vdCBuZWVkZWQgb3Igbm8gZTJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIXNob3VsZFJ1bkUyZSB8fCAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBlMmUgdGFyZ2V0cyBmb3IgdGhpcyBwcm9qZWN0XG4gICAgY29uc3QgZTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gICAgY29uc3QgZTJlQXJndiA9IHsgLi4uYXJndiwgdGFyZ2V0czogZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cyA6IHVuZGVmaW5lZCB9O1xuXG4gICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgY2FzZSAnaGVhZGxlc3MnOiB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndlxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3ZcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc1xuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc1xuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlcHMuYmxpdHogfHwgZGVwcy5uZXh0IHx8IGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10gfHwgZGV2RGVwcy52aXRlKSB7XG4gICAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IFsnY29kZWdlbicsIGBodHRwOi8vbG9jYWxob3N0OiR7cHJvamVjdC5lbnYuUE9SVH1gXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RyYWNlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgQlVOIHBsYXl3cmlnaHQgc2hvdy10cmFjZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RPbkRvY2tlcihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+LFxuICBzY3JpcHRzOiBCYXNlU2NyaXB0cyxcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2plY3QuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoXG4gIGUyZVRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXSxcbiAgYWRkaXRpb25hbEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncykubGVuZ3RoID4gMDtcbiAgcmV0dXJuIFsndGVzdCcsIC4uLihlMmVUYXJnZXRzLmxlbmd0aCA+IDAgfHwgaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMgPyBbXSA6IFsndGVzdC9lMmUvJ10pLCAuLi5hZGRpdGlvbmFsQXJnc107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHMoXG4gIHRlc3RUYXJnZXRzOiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHsgc2hvdWxkUnVuVW5pdDogYm9vbGVhbjsgc2hvdWxkUnVuRTJlOiBib29sZWFuIH0ge1xuICBjb25zdCBoYXNFMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gIGNvbnN0IGhhc1VuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IHRlc3RUYXJnZXRzLmxlbmd0aCA9PT0gMCAmJiBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPT09IDA7XG5cbiAgcmV0dXJuIHtcbiAgICBzaG91bGRSdW5Vbml0OiBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNVbml0VGFyZ2V0cyxcbiAgICBzaG91bGRSdW5FMmU6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc0UyZVRhcmdldHMgfHwgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MubGVuZ3RoID4gMCxcbiAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCB0ZXN0T25DaUJ1aWxkZXIgPSB7XG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHRlc3RPbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3Qtb24tY2knLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCBvbiBDSSB3aXRoIG5vIG9wdGlvbnMuJyxcbiAgYnVpbGRlcjogdGVzdE9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0T25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0T25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LkNJIHx8PSAnMSc7XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBoYXNEb2NrZXJmaWxlID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlO1xuICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgLy8gQ29uZmlybSBkZXYgc2VydmVyIHN0YXJ0dXAgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBwcm9qZWN0cyB3aXRoIEUyRSB0ZXN0cy5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBoYXNEb2NrZXJmaWxlXG4gICAgICAgID8gYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHt9KVxuICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHQucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbnRlcmZhY2UgVHJlZUtpbGxDb21tYW5kQXJncyB7XG4gIHBpZDogbnVtYmVyO1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuY29uc3QgYnVpbGRlciA9ICh5YXJnczogQXJndik6IEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz4gPT5cbiAgeWFyZ3NcbiAgICAucG9zaXRpb25hbCgncGlkJywge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcHJvY2VzcyBJRCB0byBraWxsLicsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ3NpZ25hbCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmFsIHRvIHNlbmQgdG8gdGhlIHByb2Nlc3MgdHJlZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnU0lHVEVSTScsXG4gICAgfSkgYXMgQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPjtcblxuZXhwb3J0IGNvbnN0IHRyZWVLaWxsQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxvYmplY3QsIFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0ge1xuICBjb21tYW5kOiAndHJlZS1raWxsIDxwaWQ+IFtzaWduYWxdJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBnaXZlbiBwcm9jZXNzIGFuZCBhbGwgZGVzY2VuZGFudHMnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2lnbmFsID0gYXJndi5zaWduYWwgYXMgTm9kZUpTLlNpZ25hbHM7XG4gICAgICBpZiAoIShzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaWduYWw6ICR7c2lnbmFsfWApO1xuICAgICAgfVxuICAgICAgdHJlZUtpbGwoYXJndi5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbmV4cG9ydCB0eXBlIFR5cGVDaGVja0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdHlwZUNoZWNrKGFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0eXBlQ2hlY2soYXJndjogVHlwZUNoZWNrQ29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgbGV0IHJlbW92ZWROZXh0RGlyID0gZmFsc2UgYXMgYm9vbGVhbjtcbiAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcbiAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyB8fCBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goLi4uYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdCkpO1xuICAgIH1cbiAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ3B5cmlnaHQnKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgfVxuICAgIHdoaWxlIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZS10cnkgdHlwZSBjaGVja2luZyBhZnRlciByZW1vdmluZyBgLm5leHRgIGRpcmVjdG9yeVxuICAgICAgY29uc3QgbmV4dERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLm5leHQnKTtcbiAgICAgIGlmIChleGl0Q29kZSAmJiBmcy5leGlzdHNTeW5jKG5leHREaXJQYXRoKSkge1xuICAgICAgICBmcy5ybVN5bmMobmV4dERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUmVtb3ZlZCBgLm5leHRgIGRpcmVjdG9yeS4gV2Ugd2lsbCByZS10cnkgdHlwZSBjaGVja2luZy4nKSk7XG4gICAgICAgIHJlbW92ZWROZXh0RGlyID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZXhpdENvZGUpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1tpXT8ucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFmaW5hbEV4aXRDb2RlKVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICByZW1vdmVkTmV4dERpclxuICAgICAgICAgID8gJy0tLS0tXFxuTm8gdHlwZSBlcnJvcnMgZm91bmQuIFBsZWFzZSBpZ25vcmUgdGhlIHByZXZpb3VzIHR5cGUgZXJyb3JzLCBhcyB0aGV5IHdlcmUgY2F1c2VkIGJ5IG91dGRhdGVkIE5leHQuanMgY2FjaGUgZmlsZXMuJ1xuICAgICAgICAgIDogJ05vIHR5cGUgZXJyb3JzIGZvdW5kLidcbiAgICAgIClcbiAgICApO1xuICByZXR1cm4gZmluYWxFeGl0Q29kZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnKSkge1xuICAgIHJldHVybiBbJ0JVTiB0c2dvIC0tbm9FbWl0J107XG4gIH1cbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgndHlwZXNjcmlwdCcpKSB7XG4gICAgcmV0dXJuIFsnQlVOIHRzYyAtLW5vRW1pdCddO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IGxpbnQsIHR5cGUgTGludENvbW1hbmRBcmd2IH0gZnJvbSAnLi9saW50LmpzJztcbmltcG9ydCB7IHRlc3QsIHR5cGUgVGVzdENvbW1hbmRBcmd2IH0gZnJvbSAnLi90ZXN0LmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xudHlwZSBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHZlcmlmeUNvZGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd2ZXJpZnktY29kZScsXG4gIGRlc2NyaWJlOiAnVmVyaWZ5IHByb2plY3QgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBhd2FpdCB2ZXJpZnlDb2RlKHByb2plY3RzLnNlbGYsIGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHZlcmlmeUNvZGVXaXRoVGVzdHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd2ZXJpZnktY29kZS13aXRoLXRlc3RzJyxcbiAgZGVzY3JpYmU6ICdWZXJpZnkgcHJvamVjdCBjb2RlIGFuZCBydW4gdGVzdHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdmVyaWZ5Q29kZShwcm9qZWN0cy5zZWxmLCBhcmd2KTtcbiAgICBhd2FpdCBydW5Qcm9qZWN0VGVzdChwcm9qZWN0cy5zZWxmLCBhcmd2KTtcbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUNvZGUocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKCdpbnN0YWxsJywgYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgLCBwcm9qZWN0LCBhcmd2LCB7IHNpbGVudDogdHJ1ZSB9KTtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoJ2dlbi1jb2RlJywgYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndiwge1xuICAgICAgc2lsZW50OiB0cnVlLFxuICAgIH0pO1xuICB9XG4gIGF3YWl0IHJ1bkluUHJvY2Vzc0NvbW1hbmQoJ2Zvcm1hdCcsICgpID0+IGxpbnQoeyAuLi5hcmd2LCBfOiBbJ2xpbnQnXSwgZm9ybWF0OiB0cnVlIH0gYXMgTGludENvbW1hbmRBcmd2KSwge1xuICAgIGFsbG93RmFpbHVyZTogdHJ1ZSxcbiAgfSk7XG4gIGF3YWl0IHJ1bkluUHJvY2Vzc0NvbW1hbmQoJ2xpbnQtZml4JywgKCkgPT5cbiAgICBsaW50KHsgLi4uYXJndiwgXzogWydsaW50J10sIGZpeDogdHJ1ZSwgcXVpZXQ6IHRydWUgfSBhcyBMaW50Q29tbWFuZEFyZ3YpXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blByb2plY3RUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy50ZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuY3lhbihjaGFsay5ib2xkKCdTdGFydDonKSwgJ3Rlc3QnKSk7XG4gICAgYXdhaXQgdGVzdCh7IC4uLmFyZ3YsIF86IFsndGVzdCddLCBlMmU6ICdoZWFkbGVzcycgfSBhcyBUZXN0Q29tbWFuZEFyZ3YpO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgJ3Rlc3QnKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoJ3Rlc3QnLCBgJHtwYWNrYWdlTWFuYWdlcn0gdGVzdGAsIHByb2plY3QsIGFyZ3YpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5JblByb2Nlc3NDb21tYW5kKFxuICBjb21tYW5kTmFtZTogc3RyaW5nLFxuICBjb21tYW5kOiAoKSA9PiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4sXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnU3RhcnQ6JyksIGNvbW1hbmROYW1lKSk7XG4gIGNvbnN0IGV4aXRDb2RlID0gKGF3YWl0IGNvbW1hbmQoKSkgPz8gMDtcbiAgaWYgKGV4aXRDb2RlID09PSAwIHx8IG9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBjb21tYW5kTmFtZSkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kTmFtZSkpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QYWNrYWdlQ29tbWFuZChcbiAgY29tbWFuZE5hbWU6IHN0cmluZyxcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnU3RhcnQ6JyksIGNvbW1hbmROYW1lKSArIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKSk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JheShjaGFsay5ib2xkKCdTdGFydCAocmF3KTonKSwgY29tbWFuZCkpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgY29tbWFuZE5hbWUpKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMoY29tbWFuZCwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgZm9yY2VDb2xvcjogdHJ1ZSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogb3B0aW9ucy5zaWxlbnQgPyBbJ2lnbm9yZScsICdpZ25vcmUnLCAnaW5oZXJpdCddIDogJ2luaGVyaXQnLFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KTtcblxuICBpZiAocmV0LnN0YXR1cyA9PT0gMCB8fCBvcHRpb25zLmFsbG93RmFpbHVyZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgY29tbWFuZE5hbWUpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7cmV0LnN0YXR1c30pOmApLCBjb21tYW5kTmFtZSkpO1xuICAgIHByb2Nlc3MuZXhpdChyZXQuc3RhdHVzID8/IDEpO1xuICB9XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMsIHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYnVpbGRJZk5lZWRlZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQuanMnO1xuaW1wb3J0IHsgY29uY3VycmVudGx5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvY29uY3VycmVudGx5LmpzJztcbmltcG9ydCB7IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGVzdE9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0T25DaS5qcyc7XG5pbXBvcnQgeyB0cmVlS2lsbENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3RyZWVLaWxsLmpzJztcbmltcG9ydCB7IHRjQ29tbWFuZCwgdHlwZUNoZWNrQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHlwZWNoZWNrLmpzJztcbmltcG9ydCB7IHZlcmlmeUNvZGVDb21tYW5kLCB2ZXJpZnlDb2RlV2l0aFRlc3RzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdmVyaWZ5Q29kZS5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZCh2ZXJpZnlDb2RlV2l0aFRlc3RzQ29tbWFuZClcbiAgLmNvbW1hbmQodmVyaWZ5Q29kZUNvbW1hbmQpXG4gIC5jb21tYW5kKGJ1aWxkSWZOZWVkZWRDb21tYW5kKVxuICAuY29tbWFuZChjb25jdXJyZW50bHlDb21tYW5kKVxuICAuY29tbWFuZChraWxsUG9ydElmTm9uQ2lDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQob3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQpXG4gIC5jb21tYW5kKHByaXNtYUNvbW1hbmQpXG4gIC5jb21tYW5kKHJldHJ5Q29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBDb21tYW5kKVxuICAuY29tbWFuZChzdGFydENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0T25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKHRyZWVLaWxsQ29tbWFuZClcbiAgLmNvbW1hbmQodHlwZUNoZWNrQ29tbWFuZClcbiAgLmNvbW1hbmQodGNDb21tYW5kKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxubGV0IHNodXR0aW5nRG93biA9IGZhbHNlO1xuZm9yIChjb25zdCBzaWduYWwgb2YgWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IHtcbiAgICBpZiAoc2h1dHRpbmdEb3duKSByZXR1cm47XG5cbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICB0cmVlS2lsbChwcm9jZXNzLnBpZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvY2Vzcy5waWR9KSBkdXJpbmcgc2h1dGRvd246YCwgZXJyb3IpO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoKTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOlsieWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiIsImVudiIsImRlc2NyaXB0aW9uIiwidHlwZSIsImRlZmF1bHQiLCJ2ZXJib3NlIiwiYWxpYXMiLCJjYWNoZWRFbnZWYXJzIiwiTWFwIiwicmVhZEVudkZpbGUiLCJmaWxlUGF0aCIsImNhY2hlZCIsImdldCIsInBhcnNlZCIsImNvbmZpZyIsInBhdGgiLCJyZXNvbHZlIiwicHJvY2Vzc0VudiIsInNldCIsImlzRXJybm9FeGNlcHRpb24iLCJlcnJvciIsIkVycm9yIiwidHJlZUtpbGwiLCJwaWQiLCJzaWduYWwiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJydW5Db21tYW5kIiwiU3RyaW5nIiwibWF4QnVmZmVyIiwidGltZW91dCIsImlzTm9TdWNoUHJvY2Vzc0Vycm9yIiwia2lsbFRyZWVPbldpbmRvd3MiLCJkZXNjZW5kYW50cyIsInJvb3RQaWQiLCJzdGRvdXQiLCJjaGlsZHJlbkJ5UGFyZW50IiwicHNPdXRwdXQiLCJsaW5lIiwic3BsaXQiLCJtYXRjaGVkIiwiZXhlYyIsImNoaWxkUGlkIiwicGFyZW50UGlkIiwiY2hpbGRyZW4iLCJwdXNoIiwiYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwIiwicXVldWUiLCJpbmRleCIsImxlbmd0aCIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJjb2xsZWN0RGVzY2VuZGFudFBpZHMiLCJ0YXJnZXRQaWRzIiwidG9SZXZlcnNlZCIsInRvQ2hpbGRyZW5GaXJzdFBpZHMiLCJ0YXJnZXRQaWQiLCJraWxsSWZOZWVkZWQiLCJraWxsIiwiY29tbWFuZCIsImFyZ3MiLCJvcHRpb25zIiwiZXhlY0ZpbGVTeW5jIiwiZW5jb2RpbmciLCJzdGRpbyIsInN0ZGVyciIsIkJ1ZmZlciIsImlzQnVmZmVyIiwidG9TdHJpbmciLCJleHRyYWN0U3RkZXJyIiwiQ29tbWFuZEV4ZWN1dGlvbkVycm9yIiwiY29kZSIsInN0YXR1cyIsInRvRXhpdENvZGUiLCJ0ZXN0IiwiY29uc3RydWN0b3IiLCJzdXBlciIsImpvaW4iLCJ0aGlzIiwibmFtZSIsImFzeW5jIiwic3Bhd25Bc3luYyIsIlByb21pc2UiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzZXRFbmNvZGluZyIsIm9uIiwiZGF0YSIsInByaW50aW5nU3Rkb3V0Iiwid3JpdGUiLCJtZXJnZU91dEFuZEVycm9yIiwicHJpbnRpbmdTdGRlcnIiLCJzdG9wcGVkIiwic3RvcFByb2Nlc3MiLCJjb25zb2xlIiwiaW5mbyIsIndhcm4iLCJjbGVhbnVwU2lnbmFscyIsInNpZ25hbEhhbmRsZXJzIiwicmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzIiwicmVtb3ZlTGlzdGVuZXIiLCJoYW5kbGVyIiwiY2xlYXIiLCJraWxsT25FeGl0IiwiaGFuZGxlU2lnbmFsIiwibGlzdGVuZXJDb3VudCIsInJlbW92ZUFsbExpc3RlbmVycyIsInVuZGVmaW5lZCIsImlucHV0Iiwic3RkaW4iLCJlbmQiLCJ0IiwicyIsImkiLCJlIiwibiIsImVudHJpZXMiLCJoIiwiYmxvY2tzIiwicmVzZXQiLCJmaW5hbGl6ZWQiLCJibG9jayIsInN0YXJ0IiwibGFzdEJ5dGVJbmRleCIsInBhZGRpbmciLCJvdXRwdXRCaXRzIiwiYmxvY2tDb3VudCIsImJ5dGVDb3VudCIsIm91dHB1dEJsb2NrcyIsImV4dHJhQnl0ZXMiLCJ1cGRhdGUiLCJvIiwibCIsImMiLCJmIiwiY29kZVBvaW50QXQiLCJyIiwiZmluYWxpemUiLCJoZXgiLCJhIiwidSIsImQiLCJiIiwiayIsInkiLCJ4IiwiQiIsInAiLCJDIiwieiIsIkkiLCJnIiwidyIsIkEiLCJQIiwiRSIsImoiLCJtIiwicSIsInYiLCJEIiwiRiIsIkciLCJIIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsIiQiLCJfIiwidHQiLCJzdCIsIml0IiwiZXQiLCJvdCIsIm50IiwiaHQiLCJydCIsImx0IiwiY3QiLCJmdCIsImluc3RhbmNlIiwiZnJvbSIsIm1lc3NhZ2UiLCJzdGFjayIsImNhdXNlIiwic3R1YiIsImh5ZHJhdGUiLCJVaW50OEFycmF5IiwiYnRvYSIsImRlY29kZSIsImNyZWF0ZSIsImVuY29kZSIsImF0b2IiLCJTZXQiLCJ2YWx1ZXMiLCJhZGQiLCJEYXRlIiwidG9KU09OIiwiUmVnRXhwIiwiZmxhZ3MiLCJzb3VyY2UiLCJVUkwiLCJocmVmIiwibWFwIiwiVGV4dEVuY29kZXIiLCJUZXh0RGVjb2RlciIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc05hTiIsImlzRmluaXRlIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsbCIsInNsaWNlIiwiT2JqZWN0IiwiY2FjaGVEdXJhdGlvbiIsIlBPU0lUSVZFX0lORklOSVRZIiwiZ2V0Q2FjaGVLZXkiLCJraW5kIiwibm93IiwiY2FsbCIsImlzQ0kiLCJjaUVudiIsIlByb2plY3QiLCJfaW5pdFByb3RvIiwiX2FwcGx5RGVjcyIsIm1lbW9pemVPbmUiLCJhcmd2IiwicGF0aEJ5TmFtZSIsImRpclBhdGgiLCJsb2FkRW52IiwiX2RpclBhdGgiLCJpc0J1bkF2YWlsYWJsZSIsImZzIiwicmVhZEZpbGVTeW5jIiwicm9vdERpclBhdGgiLCJidWlsZENvbW1hbmQiLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJidWlsZCIsImluY2x1ZGVzIiwiZXhpc3RzU3luYyIsImRvY2tlcmZpbGUiLCJmaW5kRmlsZSIsImhhc0RvY2tlcmZpbGUiLCJoYXNTb3VyY2VDb2RlIiwiZG9ja2VySW1hZ2VOYW1lIiwicmVwbGFjZUFsbCIsImVudlZhcnMiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycyIsImN3ZCIsImVudlBhdGhzIiwiZW52UGF0aCIsImNhc2NhZGUiLCJjYXNjYWRlRW52IiwiY2FzY2FkZU5vZGVFbnYiLCJOT0RFX0VOViIsImF1dG9DYXNjYWRlRW52IiwiV0JfRU5WIiwiaW5jbHVkZVJvb3RFbnYiLCJyb290UGF0aCIsImZsYXRNYXAiLCJmaWx0ZXIiLCJyZWxhdGl2ZSIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcyIsImtleXMiLCJrZXkiLCJ2YWx1ZSIsImNoZWNrRW52IiwibWlzc2luZ0tleXMiLCJleHBhbmQiLCJyZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJjb3VudCIsInBhcnNlIiwicGFja2FnZUpzb25QYXRoIiwiaGFzUHJpc21hIiwiZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24iLCJoYXNEcml6emxlIiwiZGF0YWJhc2VPcm0iLCJoYXNWaXRlc3QiLCJkZXBlbmRlbmNpZXMiLCJ2aXRlc3QiLCJkZXZEZXBlbmRlbmNpZXMiLCJoYXNPeGxpbnQiLCJoYXNEZXBlbmRlbmN5IiwiaGFzT3hmbXQiLCJoYXNQb2V0cnlMb2NrIiwiaGFzUHVic3BlY1lhbWwiLCJwcmVmZXJyZWRMaW50ZXIiLCJoYXNPd25EZXBlbmRlbmN5IiwicGFja2FnZU5hbWUiLCJoYXNQbGF5d3JpZ2h0Q29uZmlnIiwic2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQiLCJDSSIsImNvbmZpZ1BhdGgiLCJkb2NrZXJQYWNrYWdlSnNvbiIsImRpcm5hbWUiLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmlsZU5hbWUiLCJmaW5kIiwiZ2V0RGVwZW5kZW5jeVZlcnNpb24iLCJyb290UGFja2FnZUpzb24iLCJvcHRpb25hbERlcGVuZGVuY2llcyIsInBlZXJEZXBlbmRlbmNpZXMiLCJmaW5kU2VsZlByb2plY3QiLCJmaW5kRGVzY2VuZGFudFByb2plY3RzIiwicm9vdEFuZFNlbGZQcm9qZWN0cyIsImZpbmRSb290QW5kU2VsZlByb2plY3RzIiwicm9vdCIsInNlbGYiLCJnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMiLCJ0aGlzUHJvamVjdCIsInJvb3RQcm9qZWN0Iiwid29ya3NwYWNlcyIsImVuZHNXaXRoIiwicHJvamVjdHMiLCJ3b3Jrc3BhY2UiLCJnbG9iUGF0dGVybiIsInBhY2thZ2VEaXJzIiwid29ya3NwYWNlUGF0aCIsIndzIiwiZ2xvYmJ5IiwiZG90Iiwib25seURpcmVjdG9yaWVzIiwic3ViUGFja2FnZURpclBhdGgiLCJpc1J1bm5pbmdPbkJ1biIsInZlcnNpb25zIiwiYnVuIiwibnBtX2V4ZWNwYXRoIiwicnVudGltZVdpdGhBcmdzIiwicGFja2FnZU1hbmFnZXIiLCJwYWNrYWdlTWFuYWdlcldpdGhSdW4iLCJidWlsZElmTmVlZGVkQ29tbWFuZCIsImRlc2NyaWJlIiwicHJvamVjdFBhdGhGb3JUZXN0aW5nIiwicHJvamVjdCIsImNoYWxrIiwicmVkIiwiZ3JlZW4iLCJjYW5Ta2lwIiwiY2FjaGVGaWxlUGF0aCIsImNvbnRlbnRIYXNoIiwiY2FjaGVEaXJlY3RvcnlQYXRoIiwicHJvbWlzZXMiLCJta2RpciIsInJlY3Vyc2l2ZSIsImhhc2giLCJjcmVhdGVIYXNoIiwiY29tbWl0SGFzaCIsImNoaWxkX3Byb2Nlc3MiLCJleGVjU3luYyIsInRyaW0iLCJlbnZpcm9ubWVudEpzb24iLCJpZ25vcmluZ0VudlZhck5hbWVzIiwiaGFzIiwidG9Tb3J0ZWQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZEZpbGVQYXRocyIsInNwYXduU3luYyIsInJlcGxhY2UiLCJpbmNsdWRlUGF0dGVybnMiLCJzb21lIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJkcnlSdW4iLCJ3cml0ZUZpbGUiLCJidWlsZElmTmVlZGVkIiwicmV0Iiwic2hlbGwiLCJleGl0Q29kZSIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJkZWZhdWx0T3B0aW9ucyIsImV4aXRJZkZhaWxlZCIsInJ1bldpdGhTcGF3biIsInNjcmlwdCIsIm9wdHMiLCJub3JtYWxpemVkU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0IiwicHJpbnRTdGFydCIsInByaW50YWJsZSIsInJ1bm5hYmxlIiwicHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCIsImNvbmZpZ3VyZUVudiIsIm9uU2lnbmFsIiwicnVuV2l0aFNwYXduSW5QYXJhbGxlbCIsInJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSIsIm91dCIsIm5ld1NjcmlwdCIsImJsaXR6IiwicHJpbnRhYmxlU2NyaXB0IiwiZml4QnVuQ29tbWFuZCIsInJ1bm5hYmxlU2NyaXB0IiwiY2FzY2FkZU9wdGlvbiIsInByZWZpeCIsIndlYWsiLCJncmF5IiwiY3lhbiIsImJvbGQiLCJleGl0IiwibmV3RW52IiwiY2kiLCJmb3JjZUNvbG9yIiwiRk9SQ0VfQ09MT1IiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsImJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyIsIm9wdGlvbk5hbWUiLCJnZXRPcHRpb25WYWx1ZSIsIml0ZW0iLCJjYW1lbENhc2VPcHRpb25OYW1lIiwiY2hhcmFjdGVyIiwidG9VcHBlckNhc2UiLCJjb25jdXJyZW50bHlDb21tYW5kIiwiYnVpbGRlciIsInN1Y2Nlc3MiLCJjaG9pY2VzIiwiY29tbWFuZHMiLCJCb29sZWFuIiwiZGV0YWNoZWQiLCJpbnRlcnJ1cHRlZFNpZ25hbCIsImZpcnN0UmVzdWx0Iiwic3RvcFJlc3VsdCIsInN0b3BwaW5nIiwiZm9yY2VLaWxsUHJvbWlzZXMiLCJyZXN1bHRzIiwid2FpdEZvckV4aXRQcm9taXNlcyIsImNoaWxkIiwic2V0dGxlZCIsInNldHRsZSIsImtpbGxPdGhlcnMiLCJraWxsT3RoZXJzT25GYWlsIiwic2hvdWxkU3RvcE90aGVycyIsInRlcm1pbmF0ZUNoaWxkcmVuIiwib25jZSIsImdldEV4aXRDb2RlIiwic3RvcEFsbCIsInN0b3BPblNpZ2ludCIsInN0b3BPblNpZ3Rlcm0iLCJzdG9wT25TaWdxdWl0IiwiYWxsIiwicmVzdWx0IiwicnVuQ29uY3VycmVudGx5IiwiY29uc3RhbnRzIiwic2lnbmFscyIsImZvcmNlS2lsbFBpZHMiLCJzaWduYWxQaWRzIiwidG9DaGlsZFBpZHMiLCJwaWRzIiwiZGVhZGxpbmUiLCJldmVyeSIsImlzUHJvY2Vzc0dyb3VwR29uZSIsInNsZWVwIiwiTWF0aCIsIm1pbiIsIndhaXRGb3JGb3JjZUtpbGwiLCJzaWduYWxlZFBpZHMiLCJraWxsUHJvY2Vzc0dyb3VwIiwibXMiLCJzZXRUaW1lb3V0Iiwia2lsbFBvcnRJZk5vbkNpQ29tbWFuZCIsInBvcnRFbnYiLCJQT1JUIiwicG9ydCIsImtpbGxQb3J0UHJvY2VzcyIsImtpbGxQb3J0SWZOb25DaSIsImJ1aWxkU2hlbGxDb21tYW5kIiwiYXJnIiwic2hlbGxFc2NhcGVBcmd1bWVudCIsIm94bGludEV4dGVuc2lvbnMiLCJweXRob25FeHRlbnNpb25zIiwiZGFydEV4dGVuc2lvbnMiLCJveGZtdEV4dGVuc2lvbnMiLCJwcmV0dGllckV4dGVuc2lvbnMiLCJwcmV0dGllck9ubHlFeHRlbnNpb25zIiwiZXh0IiwicHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybiIsImxpbnRDb21tYW5kIiwiZml4IiwiZm9ybWF0IiwicXVpZXQiLCJsaW50IiwiZmlsZXMiLCJsaW50VGFyZ2V0cyIsImdldExpbnRUYXJnZXRGaWxlcyIsImxpbnRGaWxlUGF0aHNCeVByb2plY3QiLCJveGZtdEZpbGVQYXRoc0J5UHJvamVjdCIsInB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdCIsImRhcnRGaWxlUGF0aHNCeVByb2plY3QiLCJwcmV0dGllckZpbGVQYXRocyIsInBhY2thZ2VKc29uRmlsZVBhdGhzIiwicHJldHRpZXJBcmdzIiwic29ydFBhY2thZ2VKc29uQXJncyIsIm1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMiLCJmaWxlIiwiZmlsZUtpbmQiLCJzdGF0IiwiaXNEaXJlY3RvcnkiLCJnZXRMaW50VGFyZ2V0RmlsZUtpbmQiLCJleHRlbnNpb24iLCJleHRuYW1lIiwiZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzIiwibGludFBhdGgiLCJnZXRFeHBsaWNpdExpbnRUYXJnZXRzIiwicHl0aG9uRmlsZVBhdGhzIiwiZGFydEZpbGVQYXRocyIsInN1cHBvcnRzTGludGluZ0V4dGVuc2lvbiIsImxpbnRGaWxlUGF0aHMiLCJveGZtdEZpbGVQYXRocyIsImJ1aWxkUHJldHRpZXJPbmx5RGlyZWN0b3J5UGF0dGVybiIsImZvcm1hdHRlclBhdGgiLCJidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyIsImlzUG90ZW50aWFsTGludFRhcmdldCIsInNlbGZEaXJQYXRoIiwibmVlZHNQcmV0dGllciIsInByb2plY3RQYXR0ZXJuIiwiYnVpbGRQcmV0dGllckFyZ3MiLCJsaW50UHJvbWlzZXMiLCJsaW50UnVuT3B0aW9ucyIsImJ1aWxkTGludENvbW1hbmQiLCJidWlsZE94Zm10Q29tbWFuZCIsImJ1aWxkUG9ldHJ5Q29tbWFuZCIsImJ1aWxkRGFydENvbW1hbmQiLCJsaW50RXhpdENvZGVzIiwidGFyZ2V0cyIsInNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllciIsInN0YXJ0c1dpdGgiLCJkZXNjZW5kYW50UHJvamVjdHMiLCJvd25pbmdQcm9qZWN0IiwiZmluZE93bmluZ1Byb2plY3QiLCJwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQiLCJjb21tYW5kTmFtZSIsIm9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIiwib3V0c2lkZSIsImRlcHMiLCJvcHRpbWl6ZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplU2NyaXB0cyIsIm9wdGltaXplUm9vdFByb3BzIiwiZGlzdERpclBhdGgiLCJkZXZEZXBzIiwibmFtZVdvcmRzVG9CZVJlbW92ZWQiLCJyZW1vdmVkRGVwcyIsIndvcmQiLCJuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwicmVtb3ZlZFNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsIkZJTEVfU0NIRU1BIiwiZHJpenpsZVNjcmlwdHMiLCJkZXBsb3kiLCJhZGRpdGlvbmFsT3B0aW9ucyIsIm1pZ3JhdGUiLCJfcHJvamVjdCIsIm1pZ3JhdGVEZXYiLCJyZW1vdmVDb21tYW5kIiwiZGJQYXRoIiwiREFUQUJBU0VfUEFUSCIsImRiVXJsIiwiREFUQUJBU0VfVVJMIiwicmF3RGJQYXRoIiwiZ2V0RmlsZURhdGFiYXNlVXJsUGF0aCIsImFic29sdXRlUGF0aCIsImlzQWJzb2x1dGUiLCJidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZCIsInNlZWQiLCJzY3JpcHRQYXRoIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJQT1NTSUJMRV9QUklTTUFfUEFUSFMiLCJzY2hlbWFQYXRoIiwiZ2V0RGF0YWJhc2VEaXJQYXRoIiwiZ2V0UHJpc21hQmFzZURpciIsInByaXNtYVNjcmlwdHMiLCJjbGVhblVwTGl0ZXN0cmVhbSIsImRlcGxveUZvcmNlIiwicmVtb3ZlRGJDb21tYW5kIiwibGlzdEJhY2t1cHMiLCJzdGVwcyIsImNsZWFudXBDb21tYW5kIiwiYmFzZURpciIsImNsZWFuVXBTcWxpdGVEYklmTmVlZGVkIiwicmVzZXRDb21tYW5kIiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJwcmlzbWEiLCJwcmlzbWFDb21tYW5kIiwiYWxpYXNlcyIsInlhcmdzIiwicGFyc2VyQ29uZmlndXJhdGlvbiIsImNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZCIsImNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kIiwiZGVwbG95Q29tbWFuZCIsImRlcGxveUZvcmNlQ29tbWFuZCIsImxpc3RCYWNrdXBzQ29tbWFuZCIsIm1pZ3JhdGVDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInNlZWRDb21tYW5kIiwic3R1ZGlvQ29tbWFuZCIsImRlZmF1bHRDb21tYW5kIiwiZGVtYW5kQ29tbWFuZCIsInN0cmljdCIsImFsbFByb2plY3RzIiwiZmluZERhdGFiYXNlT3JtUHJvamVjdHMiLCJwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCIsImNyZWF0ZUxpdGVzdHJlYW1Db25maWciLCJ1bmtub3duT3B0aW9ucyIsImV4dHJhY3RVbmtub3duT3B0aW9ucyIsIm9ybSIsImdldERhdGFiYXNlT3JtU2NyaXB0cyIsIm91dHB1dCIsInJlc3RvcmVkIiwiZnVsbENvbW1hbmQiLCJ0cmltRW5kIiwicmVxdWlyZWRFbnZWYXJzIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUUiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSIsIm1pc3NpbmdFbnZWYXJzIiwicmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCIsImxpdGVzdHJlYW1Db25maWciLCJ3cml0ZUZpbGVTeW5jIiwicmVhc29uIiwiZmlsdGVyZWQiLCJvcm1Qcm9qZWN0QnlQcm9qZWN0Iiwib3JtUHJvamVjdCIsImtub3duT3B0aW9ucyIsInNoYXJlZE9wdGlvbktleXMiLCJzaGFyZWRPcHRpb25BbGlhc2VzIiwib3B0aW9uIiwiYWxsS25vd25PcHRpb25zIiwia2ViYWJDYXNlS2V5IiwibWF0Y2giLCJ0b0xvd2VyQ2FzZSIsInBhc3N0aHJvdWdoQXJncyIsInJldHJ5Q29tbWFuZCIsInJldHJ5IiwiY21kQW5kQXJncyIsImxhc3RTdGF0dXMiLCJ5ZWxsb3ciLCJzZXR1cENvbW1hbmQiLCJkaXJlbnRzIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJvcyIsInBhY2thZ2VzIiwiaXNGaWxlIiwidmVyc2lvbiIsInByb21pc2VBbGwiLCJwbGF5d3JpZ2h0Iiwic2V0dXAiLCJ0b0Rldk51bGwiLCJzaWxlbnQiLCJraWxsZWQiLCJraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCIsImF2YWlsYWJsZSIsImhvc3QiLCJwcm9iZVBvcnQiLCJpc1BvcnRBdmFpbGFibGUiLCJraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MiLCJraWxsRnVuYyIsImZpbHRlckFyZ3MiLCJjb250YWluZXJJZHMiLCJpZCIsImxpc3REb2NrZXJDb250YWluZXJJZHMiLCJyZW1vdmVEb2NrZXJDb250YWluZXJzIiwic3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydCIsImNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIiwicmF3UG9ydCIsInNlcnZlciIsImNyZWF0ZVNlcnZlciIsImVyciIsImNsb3NlIiwibGlzdGVuIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkSW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJCYXNlU2NyaXB0cyIsInNob3VsZFdhaXRBbmRPcGVuQXBwIiwiYnVpbGREb2NrZXIiLCJzdGFydERldiIsInN0YXJ0RGV2UHJvdGVjdGVkIiwid2FpdEFuZE9wZW5BcHAiLCJzdGFydFByb2R1Y3Rpb24iLCJzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQiLCJzdGFydFRlc3QiLCJzdGFydERvY2tlciIsIm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCIsIm5vcm1hbGl6ZWRBcmdzVGV4dCIsImVjb3N5c3RlbUNvbmZpZ1BhdGgiLCJmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aCIsImNtZCIsInRlc3RFMkVEZXYiLCJ0ZXN0RTJFUHJvdGVjdGVkIiwidGVzdEUyRVByb2R1Y3Rpb24iLCJ0ZXN0RTJFRG9ja2VyIiwidGVzdFN0YXJ0Iiwid2FpdEFwcCIsInN0YXJ0Q29tbWFuZCIsImZvcndhcmRlZFBsYXl3cmlnaHRBcmdzIiwicGxheXdyaWdodEFyZ3MiLCJwbGF5d3JpZ2h0Q29tbWFuZCIsImJhaWwiLCJiYXNlIiwibm9ybWFsaXplZFRhcmdldHMiLCJhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbiIsInJlc3QiLCJleHBsaWNpdFRhcmdldEluZGV4ZXMiLCJmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyIsInJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQiLCJidWlsZFBsYXl3cmlnaHRDb21tYW5kIiwidGVzdFVuaXQiLCJjb21tYW5kQXJncyIsInBsYXl3cmlnaHRJbmRleCIsImluZGV4T2YiLCJpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCIsInBlbmRpbmdWYWx1ZU1vZGUiLCJ0YXJnZXRJbmRleGVzIiwib2Zmc2V0IiwiUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMiLCJQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUyIsInNob3J0T3B0aW9uIiwiUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMiLCJibGl0elNjcmlwdHMiLCJodHRwU2VydmVyU2NyaXB0cyIsIndhdGNoIiwibmV4dFNjcmlwdHMiLCJwbGFpbkFwcFNjcmlwdHMiLCJfMSIsIl8yIiwicmVtaXhTY3JpcHRzIiwidml0ZVNjcmlwdHMiLCJodHRwU2VydmVyUGFja2FnZXMiLCJtb2RlIiwiZG9ja2VyT3B0aW9ucyIsIm5vcm1hbGl6ZUFyZ3MiLCJuZXh0Iiwidml0ZSIsImUyZSIsImFyZ3VtZW50c0J1aWxkZXIiLCJ0ZXN0Q29tbWFuZCIsInRlc3RUYXJnZXRzIiwic2hvdWxkUnVuRTJlIiwic2hvdWxkUnVuVW5pdCIsImhhc0UyZVRhcmdldHMiLCJ0YXJnZXQiLCJoYXNVbml0VGFyZ2V0cyIsInNob3VsZFJ1bkFsbFRlc3RzIiwicmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzIiwidW5pdFRhcmdldHMiLCJ1bml0QXJndiIsInVuaXRUaW1lb3V0IiwiZTJlVGFyZ2V0cyIsImUyZUFyZ3YiLCJidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFIiwidGVzdE9uRG9ja2VyIiwiV0JfRE9DS0VSIiwiaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMiLCJ0ZXN0T25DaUNvbW1hbmQiLCJ0ZXN0T25DaSIsInRyZWVLaWxsQ29tbWFuZCIsInBvc2l0aW9uYWwiLCJkZW1hbmRPcHRpb24iLCJ0eXBlQ2hlY2tDb21tYW5kIiwicmVtb3ZlZE5leHREaXIiLCJidWlsZFR5cGVTY3JpcHRUeXBlQ2hlY2tDb21tYW5kcyIsIm5leHREaXJQYXRoIiwicm1TeW5jIiwiZm9yY2UiLCJleGl0Q29kZXMiLCJmaW5hbEV4aXRDb2RlIiwidHlwZUNoZWNrIiwidGNDb21tYW5kIiwidmVyaWZ5Q29kZUNvbW1hbmQiLCJ2ZXJpZnlDb2RlIiwidmVyaWZ5Q29kZVdpdGhUZXN0c0NvbW1hbmQiLCJydW5QYWNrYWdlQ29tbWFuZCIsInJ1blByb2plY3RUZXN0IiwicnVuSW5Qcm9jZXNzQ29tbWFuZCIsImFsbG93RmFpbHVyZSIsImhpZGVCaW4iLCJzY3JpcHROYW1lIiwibWlkZGxld2FyZSIsIndvcmtpbmdEaXIiLCJjaGRpciIsIkJFUlJZX0JJTl9GT0xERVIiLCJ1cHBlcktleSIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhY2thZ2VKc29uRGlyIiwidXJsIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwiaGVscCIsInNodXR0aW5nRG93biJdLCJtYXBwaW5ncyI6IjRoQkFPTyxNQUFNQSxFQUE0QixDQUN2Q0MsSUFBSyxDQUNIQyxZQUFhLDJCQUNiQyxLQUFNLFNBRVIsY0FBZSxDQUNiRCxZQUNFLHdMQUNGQyxLQUFNLFVBRVIsbUJBQW9CLENBQ2xCRCxZQUFhLDBGQUNiQyxLQUFNLFdBRVIsbUJBQW9CLENBQ2xCRCxZQUFhLGlFQUNiQyxLQUFNLFVBQ05DLFNBQVMsR0FFWCxtQkFBb0IsQ0FDbEJGLFlBQWEscUdBQ2JDLEtBQU0sVUFDTkMsU0FBUyxHQUVYLFlBQWEsQ0FDWEYsWUFBYSxxRkFDYkMsS0FBTSxTQUNOQyxRQUFTLGdCQUVYQyxRQUFTLENBQ1BILFlBQWEsc0NBQ2JDLEtBQU0sVUFDTkcsTUFBTyxNQTRGWCxNQUFNQyxFQUFnQixJQUFJQyxJQUUxQixTQUFTQyxFQUFZQyxHQUNuQixNQUFNQyxFQUFTSixFQUFjSyxJQUFJRixHQUNqQyxHQUFJQyxFQUFRLE9BQU9BLEVBRW5CLE1BQU1FLEVBQVNDLEVBQU8sQ0FBRUMsS0FBTUEsRUFBS0MsUUFBUU4sR0FBV08sV0FBWSxDQUFBLElBQU1KLFFBQVUsQ0FBQSxFQUVsRixPQURBTixFQUFjVyxJQUFJUixFQUFVRyxHQUNyQkEsQ0FDVCxDQzVJTyxTQUFTTSxFQUFpQkMsR0FDL0IsT0FBT0EsYUFBaUJDLE9BQVMsU0FBVUQsQ0FDN0MsQ0NHTyxTQUFTRSxFQUFTQyxFQUFhQyxFQUF5QixXQUM3RCxJQUFLQyxPQUFPQyxVQUFVSCxJQUFRQSxHQUFPLEVBQ25DLE1BQU0sSUFBSUYsTUFBTSxnQkFBZ0JFLEtBR2xDLEdBQXlCLFVBQXJCSSxRQUFRQyxTQUVWLFlBcUJKLFNBQTJCTCxHQUN6QixJQUNFTSxFQUFXLFdBQVksQ0FBQyxPQUFRQyxPQUFPUCxHQUFNLEtBQU0sTUFBTyxDQUN4RFEsVUFBVyxRQUNYQyxRQUFTLEtB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LEdBQUdvRSxFQUFFcEUsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHcUUsRUFBRXJFLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR2tELEVBQUVsRCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEVBQUVtRCxFQUFFbkQsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxFQUFFMEMsRUFBRTFDLEVBQUUsSUFBSSxHQUFHQSxFQUFFLEtBQUssRUFBRTJDLEVBQUUzQyxFQUFFLElBQUksR0FBR0EsRUFBRSxLQUFLLEVBQUUwRSxHQUFHMUUsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxFQUFFMkUsR0FBRzNFLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sRUFBRXdELEVBQUV4RCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEVBQUV5RCxFQUFFekQsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxFQUFFc0MsRUFBRXRDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR3VDLEVBQUV2QyxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUdzRSxFQUFFdEUsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxFQUFFdUUsR0FBR3ZFLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sRUFBRThELEVBQUU5RCxFQUFFLElBQUksR0FBR0EsRUFBRSxLQUFLLEVBQUUrRCxFQUFFL0QsRUFBRSxJQUFJLEdBQUdBLEVBQUUsS0FBSyxFQUFFNEMsRUFBRTVDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBRzZDLEVBQUU3QyxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUc0RSxHQUFHNUUsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHNkUsR0FBRzdFLEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBRzBELEVBQUUxRCxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUcyRCxFQUFFM0QsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHd0MsRUFBRXhDLEVBQUUs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
|