1)?d[p-2]>>this.F2:0);var A=this.FV/o,z=(1<=0){g[g.t++]=1;g.subTo(f,g)}BigInteger.ONE.dlShiftTo(p,f);f.subTo(d,d);while(d.t=0){var c=(g[--u]==b)?this.DM:Math.floor(g[u]*A+(g[u-1]+x)*z);if((g[u]+=d.am(0,c,g,s,0,p))0){g.rShiftTo(v,g)}if(a<0){BigInteger.ZERO.subTo(g,g)}}function bnMod(b){var c=nbi();this.abs().divRemTo(b,null,c);if(this.s<0&&c.compareTo(BigInteger.ZERO)>0){b.subTo(c,c)}return c}function Classic(a){this.m=a}function cConvert(a){if(a.s<0||a.compareTo(this.m)>=0){return a.mod(this.m)}else{return a}}function cRevert(a){return a}function cReduce(a){a.divRemTo(this.m,null,a)}function cMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}function cSqrTo(a,b){a.squareTo(b);this.reduce(b)}Classic.prototype.convert=cConvert;Classic.prototype.revert=cRevert;Classic.prototype.reduce=cReduce;Classic.prototype.mulTo=cMulTo;Classic.prototype.sqrTo=cSqrTo;function bnpInvDigit(){if(this.t<1){return 0}var a=this[0];if((a&1)==0){return 0}var b=a&3;b=(b*(2-(a&15)*b))&15;b=(b*(2-(a&255)*b))&255;b=(b*(2-(((a&65535)*b)&65535)))&65535;b=(b*(2-a*b%this.DV))%this.DV;return(b>0)?this.DV-b:-b}function Montgomery(a){this.m=a;this.mp=a.invDigit();this.mpl=this.mp&32767;this.mph=this.mp>>15;this.um=(1<<(a.DB-15))-1;this.mt2=2*a.t}function montConvert(a){var b=nbi();a.abs().dlShiftTo(this.m.t,b);b.divRemTo(this.m,null,b);if(a.s<0&&b.compareTo(BigInteger.ZERO)>0){this.m.subTo(b,b)}return b}function montRevert(a){var b=nbi();a.copyTo(b);this.reduce(b);return b}function montReduce(a){while(a.t<=this.mt2){a[a.t++]=0}for(var c=0;c>15)*this.mpl)&this.um)<<15))&a.DM;b=c+this.m.t;a[b]+=this.m.am(0,d,a,c,0,this.m.t);while(a[b]>=a.DV){a[b]-=a.DV;a[++b]++}}a.clamp();a.drShiftTo(this.m.t,a);if(a.compareTo(this.m)>=0){a.subTo(this.m,a)}}function montSqrTo(a,b){a.squareTo(b);this.reduce(b)}function montMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}Montgomery.prototype.convert=montConvert;Montgomery.prototype.revert=montRevert;Montgomery.prototype.reduce=montReduce;Montgomery.prototype.mulTo=montMulTo;Montgomery.prototype.sqrTo=montSqrTo;function bnpIsEven(){return((this.t>0)?(this[0]&1):this.s)==0}function bnpExp(h,j){if(h>4294967295||h<1){return BigInteger.ONE}var f=nbi(),a=nbi(),d=j.convert(this),c=nbits(h)-1;d.copyTo(f);while(--c>=0){j.sqrTo(f,a);if((h&(1<0){j.mulTo(a,d,f)}else{var b=f;f=a;a=b}}return j.revert(f)}function bnModPowInt(b,a){var c;if(b<256||a.isEven()){c=new Classic(a)}else{c=new Montgomery(a)}return this.exp(b,c)}BigInteger.prototype.copyTo=bnpCopyTo;BigInteger.prototype.fromInt=bnpFromInt;BigInteger.prototype.fromString=bnpFromString;BigInteger.prototype.clamp=bnpClamp;BigInteger.prototype.dlShiftTo=bnpDLShiftTo;BigInteger.prototype.drShiftTo=bnpDRShiftTo;BigInteger.prototype.lShiftTo=bnpLShiftTo;BigInteger.prototype.rShiftTo=bnpRShiftTo;BigInteger.prototype.subTo=bnpSubTo;BigInteger.prototype.multiplyTo=bnpMultiplyTo;BigInteger.prototype.squareTo=bnpSquareTo;BigInteger.prototype.divRemTo=bnpDivRemTo;BigInteger.prototype.invDigit=bnpInvDigit;BigInteger.prototype.isEven=bnpIsEven;BigInteger.prototype.exp=bnpExp;BigInteger.prototype.toString=bnToString;BigInteger.prototype.negate=bnNegate;BigInteger.prototype.abs=bnAbs;BigInteger.prototype.compareTo=bnCompareTo;BigInteger.prototype.bitLength=bnBitLength;BigInteger.prototype.mod=bnMod;BigInteger.prototype.modPowInt=bnModPowInt;BigInteger.ZERO=nbv(0);BigInteger.ONE=nbv(1);
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function bnClone(){var a=nbi();this.copyTo(a);return a}function bnIntValue(){if(this.s<0){if(this.t==1){return this[0]-this.DV}else{if(this.t==0){return -1}}}else{if(this.t==1){return this[0]}else{if(this.t==0){return 0}}}return((this[1]&((1<<(32-this.DB))-1))<>24}function bnShortValue(){return(this.t==0)?this.s:(this[0]<<16)>>16}function bnpChunkSize(a){return Math.floor(Math.LN2*this.DB/Math.log(a))}function bnSigNum(){if(this.s<0){return -1}else{if(this.t<=0||(this.t==1&&this[0]<=0)){return 0}else{return 1}}}function bnpToRadix(c){if(c==null){c=10}if(this.signum()==0||c<2||c>36){return"0"}var f=this.chunkSize(c);var e=Math.pow(c,f);var i=nbv(e),j=nbi(),h=nbi(),g="";this.divRemTo(i,j,h);while(j.signum()>0){g=(e+h.intValue()).toString(c).substr(1)+g;j.divRemTo(i,j,h)}return h.intValue().toString(c)+g}function bnpFromRadix(m,h){this.fromInt(0);if(h==null){h=10}var f=this.chunkSize(h);var g=Math.pow(h,f),e=false,a=0,l=0;for(var c=0;c=f){this.dMultiply(g);this.dAddOffset(l,0);a=0;l=0}}if(a>0){this.dMultiply(Math.pow(h,a));this.dAddOffset(l,0)}if(e){BigInteger.ZERO.subTo(this,this)}}function bnpFromNumber(f,e,h){if("number"==typeof e){if(f<2){this.fromInt(1)}else{this.fromNumber(f,h);if(!this.testBit(f-1)){this.bitwiseTo(BigInteger.ONE.shiftLeft(f-1),op_or,this)}if(this.isEven()){this.dAddOffset(1,0)}while(!this.isProbablePrime(e)){this.dAddOffset(2,0);if(this.bitLength()>f){this.subTo(BigInteger.ONE.shiftLeft(f-1),this)}}}}else{var d=new Array(),g=f&7;d.length=(f>>3)+1;e.nextBytes(d);if(g>0){d[0]&=((1<0){if(e>e)!=(this.s&this.DM)>>e){c[a++]=f|(this.s<<(this.DB-e))}while(b>=0){if(e<8){f=(this[b]&((1<>(e+=this.DB-8)}else{f=(this[b]>>(e-=8))&255;if(e<=0){e+=this.DB;--b}}if((f&128)!=0){f|=-256}if(a==0&&(this.s&128)!=(f&128)){++a}if(a>0||f!=this.s){c[a++]=f}}}return c}function bnEquals(b){return(this.compareTo(b)==0)}function bnMin(b){return(this.compareTo(b)<0)?this:b}function bnMax(b){return(this.compareTo(b)>0)?this:b}function bnpBitwiseTo(c,h,e){var d,g,b=Math.min(c.t,this.t);for(d=0;d>=16;b+=16}if((a&255)==0){a>>=8;b+=8}if((a&15)==0){a>>=4;b+=4}if((a&3)==0){a>>=2;b+=2}if((a&1)==0){++b}return b}function bnGetLowestSetBit(){for(var a=0;a=this.t){return(this.s!=0)}return((this[a]&(1<<(b%this.DB)))!=0)}function bnpChangeBit(c,b){var a=BigInteger.ONE.shiftLeft(c);this.bitwiseTo(a,b,a);return a}function bnSetBit(a){return this.changeBit(a,op_or)}function bnClearBit(a){return this.changeBit(a,op_andnot)}function bnFlipBit(a){return this.changeBit(a,op_xor)}function bnpAddTo(d,f){var e=0,g=0,b=Math.min(d.t,this.t);while(e>=this.DB}if(d.t>=this.DB}g+=this.s}else{g+=this.s;while(e>=this.DB}g+=d.s}f.s=(g<0)?-1:0;if(g>0){f[e++]=g}else{if(g<-1){f[e++]=this.DV+g}}f.t=e;f.clamp()}function bnAdd(b){var c=nbi();this.addTo(b,c);return c}function bnSubtract(b){var c=nbi();this.subTo(b,c);return c}function bnMultiply(b){var c=nbi();this.multiplyTo(b,c);return c}function bnSquare(){var a=nbi();this.squareTo(a);return a}function bnDivide(b){var c=nbi();this.divRemTo(b,c,null);return c}function bnRemainder(b){var c=nbi();this.divRemTo(b,null,c);return c}function bnDivideAndRemainder(b){var d=nbi(),c=nbi();this.divRemTo(b,d,c);return new Array(d,c)}function bnpDMultiply(a){this[this.t]=this.am(0,a-1,this,0,0,this.t);++this.t;this.clamp()}function bnpDAddOffset(b,a){if(b==0){return}while(this.t<=a){this[this.t++]=0}this[a]+=b;while(this[a]>=this.DV){this[a]-=this.DV;if(++a>=this.t){this[this.t++]=0}++this[a]}}function NullExp(){}function nNop(a){return a}function nMulTo(a,c,b){a.multiplyTo(c,b)}function nSqrTo(a,b){a.squareTo(b)}NullExp.prototype.convert=nNop;NullExp.prototype.revert=nNop;NullExp.prototype.mulTo=nMulTo;NullExp.prototype.sqrTo=nSqrTo;function bnPow(a){return this.exp(a,new NullExp())}function bnpMultiplyLowerTo(b,f,e){var d=Math.min(this.t+b.t,f);e.s=0;e.t=d;while(d>0){e[--d]=0}var c;for(c=e.t-this.t;d=0){d[c]=0}for(c=Math.max(e-this.t,0);c2*this.m.t){return a.mod(this.m)}else{if(a.compareTo(this.m)<0){return a}else{var b=nbi();a.copyTo(b);this.reduce(b);return b}}}function barrettRevert(a){return a}function barrettReduce(a){a.drShiftTo(this.m.t-1,this.r2);if(a.t>this.m.t+1){a.t=this.m.t+1;a.clamp()}this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);while(a.compareTo(this.r2)<0){a.dAddOffset(1,this.m.t+1)}a.subTo(this.r2,a);while(a.compareTo(this.m)>=0){a.subTo(this.m,a)}}function barrettSqrTo(a,b){a.squareTo(b);this.reduce(b)}function barrettMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}Barrett.prototype.convert=barrettConvert;Barrett.prototype.revert=barrettRevert;Barrett.prototype.reduce=barrettReduce;Barrett.prototype.mulTo=barrettMulTo;Barrett.prototype.sqrTo=barrettSqrTo;function bnModPow(q,f){var o=q.bitLength(),h,b=nbv(1),v;if(o<=0){return b}else{if(o<18){h=1}else{if(o<48){h=3}else{if(o<144){h=4}else{if(o<768){h=5}else{h=6}}}}}if(o<8){v=new Classic(f)}else{if(f.isEven()){v=new Barrett(f)}else{v=new Montgomery(f)}}var p=new Array(),d=3,s=h-1,a=(1<1){var A=nbi();v.sqrTo(p[1],A);while(d<=a){p[d]=nbi();v.mulTo(A,p[d-2],p[d]);d+=2}}var l=q.t-1,x,u=true,c=nbi(),y;o=nbits(q[l])-1;while(l>=0){if(o>=s){x=(q[l]>>(o-s))&a}else{x=(q[l]&((1<<(o+1))-1))<<(s-o);if(l>0){x|=q[l-1]>>(this.DB+o-s)}}d=h;while((x&1)==0){x>>=1;--d}if((o-=d)<0){o+=this.DB;--l}if(u){p[x].copyTo(b);u=false}else{while(d>1){v.sqrTo(b,c);v.sqrTo(c,b);d-=2}if(d>0){v.sqrTo(b,c)}else{y=b;b=c;c=y}v.mulTo(c,p[x],b)}while(l>=0&&(q[l]&(1<0){b.rShiftTo(f,b);h.rShiftTo(f,h)}while(b.signum()>0){if((d=b.getLowestSetBit())>0){b.rShiftTo(d,b)}if((d=h.getLowestSetBit())>0){h.rShiftTo(d,h)}if(b.compareTo(h)>=0){b.subTo(h,b);b.rShiftTo(1,b)}else{h.subTo(b,h);h.rShiftTo(1,h)}}if(f>0){h.lShiftTo(f,h)}return h}function bnpModInt(e){if(e<=0){return 0}var c=this.DV%e,b=(this.s<0)?e-1:0;if(this.t>0){if(c==0){b=this[0]%e}else{for(var a=this.t-1;a>=0;--a){b=(c*b+this[a])%e}}}return b}function bnModInverse(f){var j=f.isEven();if((this.isEven()&&j)||f.signum()==0){return BigInteger.ZERO}var i=f.clone(),h=this.clone();var g=nbv(1),e=nbv(0),l=nbv(0),k=nbv(1);while(i.signum()!=0){while(i.isEven()){i.rShiftTo(1,i);if(j){if(!g.isEven()||!e.isEven()){g.addTo(this,g);e.subTo(f,e)}g.rShiftTo(1,g)}else{if(!e.isEven()){e.subTo(f,e)}}e.rShiftTo(1,e)}while(h.isEven()){h.rShiftTo(1,h);if(j){if(!l.isEven()||!k.isEven()){l.addTo(this,l);k.subTo(f,k)}l.rShiftTo(1,l)}else{if(!k.isEven()){k.subTo(f,k)}}k.rShiftTo(1,k)}if(i.compareTo(h)>=0){i.subTo(h,i);if(j){g.subTo(l,g)}e.subTo(k,e)}else{h.subTo(i,h);if(j){l.subTo(g,l)}k.subTo(e,k)}}if(h.compareTo(BigInteger.ONE)!=0){return BigInteger.ZERO}if(k.compareTo(f)>=0){return k.subtract(f)}if(k.signum()<0){k.addTo(f,k)}else{return k}if(k.signum()<0){return k.add(f)}else{return k}}var lowprimes=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];var lplim=(1<<26)/lowprimes[lowprimes.length-1];function bnIsProbablePrime(e){var d,b=this.abs();if(b.t==1&&b[0]<=lowprimes[lowprimes.length-1]){for(d=0;d>1;if(f>lowprimes.length){f=lowprimes.length}var b=nbi();for(var e=0;e>8)&255;rng_pool[rng_pptr++]^=(a>>16)&255;rng_pool[rng_pptr++]^=(a>>24)&255;if(rng_pptr>=rng_psize){rng_pptr-=rng_psize}}function rng_seed_time(){rng_seed_int(new Date().getTime())}if(rng_pool==null){rng_pool=new Array();rng_pptr=0;var t;if(window.crypto&&window.crypto.getRandomValues){var ua=new Uint8Array(32);window.crypto.getRandomValues(ua);for(t=0;t<32;++t){rng_pool[rng_pptr++]=ua[t]}}if(navigator.appName=="Netscape"&&navigator.appVersion<"5"&&window.crypto){var z=window.crypto.random(32);for(t=0;t>>8;rng_pool[rng_pptr++]=t&255}rng_pptr=0;rng_seed_time()}function rng_get_byte(){if(rng_state==null){rng_seed_time();rng_state=prng_newstate();rng_state.init(rng_pool);for(rng_pptr=0;rng_pptr=0&&h>0){var f=e.charCodeAt(d--);if(f<128){g[--h]=f}else{if((f>127)&&(f<2048)){g[--h]=(f&63)|128;g[--h]=(f>>6)|192}else{g[--h]=(f&63)|128;g[--h]=((f>>6)&63)|128;g[--h]=(f>>12)|224}}}g[--h]=0;var b=new SecureRandom();var a=new Array();while(h>2){a[0]=0;while(a[0]==0){b.nextBytes(a)}g[--h]=a[0]}g[--h]=2;g[--h]=0;return new BigInteger(g)}function oaep_mgf1_arr(c,a,e){var b="",d=0;while(b.length>24,(d&16711680)>>16,(d&65280)>>8,d&255])));d+=1}return b}var SHA1_SIZE=20;function oaep_pad(l,a,c){if(l.length+2*SHA1_SIZE+2>a){throw"Message too long for RSA"}var h="",d;for(d=0;d0&&a.length>0){this.n=parseBigInt(b,16);this.e=parseInt(a,16)}else{alert("Invalid RSA public key")}}}function RSADoPublic(a){return a.modPowInt(this.e,this.n)}function RSAEncrypt(d){var a=pkcs1pad2(d,(this.n.bitLength()+7)>>3);if(a==null){return null}var e=this.doPublic(a);if(e==null){return null}var b=e.toString(16);if((b.length&1)==0){return b}else{return"0"+b}}function RSAEncryptOAEP(e,d){var a=oaep_pad(e,(this.n.bitLength()+7)>>3,d);if(a==null){return null}var f=this.doPublic(a);if(f==null){return null}var b=f.toString(16);if((b.length&1)==0){return b}else{return"0"+b}}RSAKey.prototype.doPublic=RSADoPublic;RSAKey.prototype.setPublic=RSASetPublic;RSAKey.prototype.encrypt=RSAEncrypt;RSAKey.prototype.encryptOAEP=RSAEncryptOAEP;RSAKey.prototype.type="RSA";
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function pkcs1unpad2(g,j){var a=g.toByteArray();var f=0;while(f=a.length){return null}}var e="";while(++f191)&&(h<224)){e+=String.fromCharCode(((h&31)<<6)|(a[f+1]&63));++f}else{e+=String.fromCharCode(((h&15)<<12)|((a[f+1]&63)<<6)|(a[f+2]&63));f+=2}}}return e}function oaep_mgf1_str(c,a,e){var b="",d=0;while(b.length>24,(d&16711680)>>16,(d&65280)>>8,d&255]));d+=1}return b}var SHA1_SIZE=20;function oaep_unpad(l,b,e){l=l.toByteArray();var f;for(f=0;f0&&a.length>0){this.n=parseBigInt(c,16);this.e=parseInt(a,16);this.d=parseBigInt(b,16)}else{alert("Invalid RSA private key")}}}function RSASetPrivateEx(g,d,e,c,b,a,h,f){this.isPrivate=true;if(g==null){throw"RSASetPrivateEx N == null"}if(d==null){throw"RSASetPrivateEx E == null"}if(g.length==0){throw"RSASetPrivateEx N.length == 0"}if(d.length==0){throw"RSASetPrivateEx E.length == 0"}if(g!=null&&d!=null&&g.length>0&&d.length>0){this.n=parseBigInt(g,16);this.e=parseInt(d,16);this.d=parseBigInt(e,16);this.p=parseBigInt(c,16);this.q=parseBigInt(b,16);this.dmp1=parseBigInt(a,16);this.dmq1=parseBigInt(h,16);this.coeff=parseBigInt(f,16)}else{alert("Invalid RSA private key in RSASetPrivateEx")}}function RSAGenerate(b,i){var a=new SecureRandom();var f=b>>1;this.e=parseInt(i,16);var c=new BigInteger(i,16);for(;;){for(;;){this.p=new BigInteger(b-f,1,a);if(this.p.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE)==0&&this.p.isProbablePrime(10)){break}}for(;;){this.q=new BigInteger(f,1,a);if(this.q.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE)==0&&this.q.isProbablePrime(10)){break}}if(this.p.compareTo(this.q)<=0){var h=this.p;this.p=this.q;this.q=h}var g=this.p.subtract(BigInteger.ONE);var d=this.q.subtract(BigInteger.ONE);var e=g.multiply(d);if(e.gcd(c).compareTo(BigInteger.ONE)==0){this.n=this.p.multiply(this.q);this.d=c.modInverse(e);this.dmp1=this.d.mod(g);this.dmq1=this.d.mod(d);this.coeff=this.q.modInverse(this.p);break}}}function RSADoPrivate(a){if(this.p==null||this.q==null){return a.modPow(this.d,this.n)}var c=a.mod(this.p).modPow(this.dmp1,this.p);var b=a.mod(this.q).modPow(this.dmq1,this.q);while(c.compareTo(b)<0){c=c.add(this.p)}return c.subtract(b).multiply(this.coeff).mod(this.p).multiply(this.q).add(b)}function RSADecrypt(b){var d=parseBigInt(b,16);var a=this.doPrivate(d);if(a==null){return null}return pkcs1unpad2(a,(this.n.bitLength()+7)>>3)}function RSADecryptOAEP(d,b){var e=parseBigInt(d,16);var a=this.doPrivate(e);if(a==null){return null}return oaep_unpad(a,(this.n.bitLength()+7)>>3,b)}RSAKey.prototype.doPrivate=RSADoPrivate;RSAKey.prototype.setPrivate=RSASetPrivate;RSAKey.prototype.setPrivateEx=RSASetPrivateEx;RSAKey.prototype.generate=RSAGenerate;RSAKey.prototype.decrypt=RSADecrypt;RSAKey.prototype.decryptOAEP=RSADecryptOAEP;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function ECFieldElementFp(b,a){this.x=a;this.q=b}function feFpEquals(a){if(a==this){return true}return(this.q.equals(a.q)&&this.x.equals(a.x))}function feFpToBigInteger(){return this.x}function feFpNegate(){return new ECFieldElementFp(this.q,this.x.negate().mod(this.q))}function feFpAdd(a){return new ECFieldElementFp(this.q,this.x.add(a.toBigInteger()).mod(this.q))}function feFpSubtract(a){return new ECFieldElementFp(this.q,this.x.subtract(a.toBigInteger()).mod(this.q))}function feFpMultiply(a){return new ECFieldElementFp(this.q,this.x.multiply(a.toBigInteger()).mod(this.q))}function feFpSquare(){return new ECFieldElementFp(this.q,this.x.square().mod(this.q))}function feFpDivide(a){return new ECFieldElementFp(this.q,this.x.multiply(a.toBigInteger().modInverse(this.q)).mod(this.q))}ECFieldElementFp.prototype.equals=feFpEquals;ECFieldElementFp.prototype.toBigInteger=feFpToBigInteger;ECFieldElementFp.prototype.negate=feFpNegate;ECFieldElementFp.prototype.add=feFpAdd;ECFieldElementFp.prototype.subtract=feFpSubtract;ECFieldElementFp.prototype.multiply=feFpMultiply;ECFieldElementFp.prototype.square=feFpSquare;ECFieldElementFp.prototype.divide=feFpDivide;function ECPointFp(c,a,d,b){this.curve=c;this.x=a;this.y=d;if(b==null){this.z=BigInteger.ONE}else{this.z=b}this.zinv=null}function pointFpGetX(){if(this.zinv==null){this.zinv=this.z.modInverse(this.curve.q)}return this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q))}function pointFpGetY(){if(this.zinv==null){this.zinv=this.z.modInverse(this.curve.q)}return this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q))}function pointFpEquals(a){if(a==this){return true}if(this.isInfinity()){return a.isInfinity()}if(a.isInfinity()){return this.isInfinity()}var c,b;c=a.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(a.z)).mod(this.curve.q);if(!c.equals(BigInteger.ZERO)){return false}b=a.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(a.z)).mod(this.curve.q);return b.equals(BigInteger.ZERO)}function pointFpIsInfinity(){if((this.x==null)&&(this.y==null)){return true}return this.z.equals(BigInteger.ZERO)&&!this.y.toBigInteger().equals(BigInteger.ZERO)}function pointFpNegate(){return new ECPointFp(this.curve,this.x,this.y.negate(),this.z)}function pointFpAdd(l){if(this.isInfinity()){return l}if(l.isInfinity()){return this}var p=l.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(l.z)).mod(this.curve.q);var o=l.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(l.z)).mod(this.curve.q);if(BigInteger.ZERO.equals(o)){if(BigInteger.ZERO.equals(p)){return this.twice()}return this.curve.getInfinity()}var j=new BigInteger("3");var e=this.x.toBigInteger();var n=this.y.toBigInteger();var c=l.x.toBigInteger();var k=l.y.toBigInteger();var m=o.square();var i=m.multiply(o);var d=e.multiply(m);var g=p.square().multiply(this.z);var a=g.subtract(d.shiftLeft(1)).multiply(l.z).subtract(i).multiply(o).mod(this.curve.q);var h=d.multiply(j).multiply(p).subtract(n.multiply(i)).subtract(g.multiply(p)).multiply(l.z).add(p.multiply(i)).mod(this.curve.q);var f=i.multiply(this.z).multiply(l.z).mod(this.curve.q);return new ECPointFp(this.curve,this.curve.fromBigInteger(a),this.curve.fromBigInteger(h),f)}function pointFpTwice(){if(this.isInfinity()){return this}if(this.y.toBigInteger().signum()==0){return this.curve.getInfinity()}var g=new BigInteger("3");var c=this.x.toBigInteger();var h=this.y.toBigInteger();var e=h.multiply(this.z);var j=e.multiply(h).mod(this.curve.q);var i=this.curve.a.toBigInteger();var k=c.square().multiply(g);if(!BigInteger.ZERO.equals(i)){k=k.add(this.z.square().multiply(i))}k=k.mod(this.curve.q);var b=k.square().subtract(c.shiftLeft(3).multiply(j)).shiftLeft(1).multiply(e).mod(this.curve.q);var f=k.multiply(g).multiply(c).subtract(j.shiftLeft(1)).shiftLeft(2).multiply(j).subtract(k.square().multiply(k)).mod(this.curve.q);var d=e.square().multiply(e).shiftLeft(3).mod(this.curve.q);return new ECPointFp(this.curve,this.curve.fromBigInteger(b),this.curve.fromBigInteger(f),d)}function pointFpMultiply(b){if(this.isInfinity()){return this}if(b.signum()==0){return this.curve.getInfinity()}var g=b;var f=g.multiply(new BigInteger("3"));var l=this.negate();var d=this;var c;for(c=f.bitLength()-2;c>0;--c){d=d.twice();var a=f.testBit(c);var j=g.testBit(c);if(a!=j){d=d.add(a?this:l)}}return d}function pointFpMultiplyTwo(c,a,b){var d;if(c.bitLength()>b.bitLength()){d=c.bitLength()-1}else{d=b.bitLength()-1}var f=this.curve.getInfinity();var e=this.add(a);while(d>=0){f=f.twice();if(c.testBit(d)){if(b.testBit(d)){f=f.add(e)}else{f=f.add(this)}}else{if(b.testBit(d)){f=f.add(a)}}--d}return f}ECPointFp.prototype.getX=pointFpGetX;ECPointFp.prototype.getY=pointFpGetY;ECPointFp.prototype.equals=pointFpEquals;ECPointFp.prototype.isInfinity=pointFpIsInfinity;ECPointFp.prototype.negate=pointFpNegate;ECPointFp.prototype.add=pointFpAdd;ECPointFp.prototype.twice=pointFpTwice;ECPointFp.prototype.multiply=pointFpMultiply;ECPointFp.prototype.multiplyTwo=pointFpMultiplyTwo;function ECCurveFp(e,d,c){this.q=e;this.a=this.fromBigInteger(d);this.b=this.fromBigInteger(c);this.infinity=new ECPointFp(this,null,null)}function curveFpGetQ(){return this.q}function curveFpGetA(){return this.a}function curveFpGetB(){return this.b}function curveFpEquals(a){if(a==this){return true}return(this.q.equals(a.q)&&this.a.equals(a.a)&&this.b.equals(a.b))}function curveFpGetInfinity(){return this.infinity}function curveFpFromBigInteger(a){return new ECFieldElementFp(this.q,a)}function curveFpDecodePointHex(d){switch(parseInt(d.substr(0,2),16)){case 0:return this.infinity;case 2:case 3:return null;case 4:case 6:case 7:var a=(d.length-2)/2;var c=d.substr(2,a);var b=d.substr(a+2,a);return new ECPointFp(this,this.fromBigInteger(new BigInteger(c,16)),this.fromBigInteger(new BigInteger(b,16)));default:return null}}ECCurveFp.prototype.getQ=curveFpGetQ;ECCurveFp.prototype.getA=curveFpGetA;ECCurveFp.prototype.getB=curveFpGetB;ECCurveFp.prototype.equals=curveFpEquals;ECCurveFp.prototype.getInfinity=curveFpGetInfinity;ECCurveFp.prototype.fromBigInteger=curveFpFromBigInteger;ECCurveFp.prototype.decodePointHex=curveFpDecodePointHex;
/*! (c) Stefan Thomas | https://github.com/bitcoinjs/bitcoinjs-lib
*/
ECFieldElementFp.prototype.getByteLength=function(){return Math.floor((this.toBigInteger().bitLength()+7)/8)};ECPointFp.prototype.getEncoded=function(c){var d=function(h,f){var g=h.toByteArrayUnsigned();if(fg.length){g.unshift(0)}}return g};var a=this.getX().toBigInteger();var e=this.getY().toBigInteger();var b=d(a,32);if(c){if(e.isEven()){b.unshift(2)}else{b.unshift(3)}}else{b.unshift(4);b=b.concat(d(e,32))}return b};ECPointFp.decodeFrom=function(g,c){var f=c[0];var e=c.length-1;var d=c.slice(1,1+e/2);var b=c.slice(1+e/2,1+e);d.unshift(0);b.unshift(0);var a=new BigInteger(d);var h=new BigInteger(b);return new ECPointFp(g,g.fromBigInteger(a),g.fromBigInteger(h))};ECPointFp.decodeFromHex=function(g,c){var f=c.substr(0,2);var e=c.length-2;var d=c.substr(2,e/2);var b=c.substr(2+e/2,e/2);var a=new BigInteger(d,16);var h=new BigInteger(b,16);return new ECPointFp(g,g.fromBigInteger(a),g.fromBigInteger(h))};ECPointFp.prototype.add2D=function(c){if(this.isInfinity()){return c}if(c.isInfinity()){return this}if(this.x.equals(c.x)){if(this.y.equals(c.y)){return this.twice()}return this.curve.getInfinity()}var g=c.x.subtract(this.x);var e=c.y.subtract(this.y);var a=e.divide(g);var d=a.square().subtract(this.x).subtract(c.x);var f=a.multiply(this.x.subtract(d)).subtract(this.y);return new ECPointFp(this.curve,d,f)};ECPointFp.prototype.twice2D=function(){if(this.isInfinity()){return this}if(this.y.toBigInteger().signum()==0){return this.curve.getInfinity()}var b=this.curve.fromBigInteger(BigInteger.valueOf(2));var e=this.curve.fromBigInteger(BigInteger.valueOf(3));var a=this.x.square().multiply(e).add(this.curve.a).divide(this.y.multiply(b));var c=a.square().subtract(this.x.multiply(b));var d=a.multiply(this.x.subtract(c)).subtract(this.y);return new ECPointFp(this.curve,c,d)};ECPointFp.prototype.multiply2D=function(b){if(this.isInfinity()){return this}if(b.signum()==0){return this.curve.getInfinity()}var g=b;var f=g.multiply(new BigInteger("3"));var l=this.negate();var d=this;var c;for(c=f.bitLength()-2;c>0;--c){d=d.twice();var a=f.testBit(c);var j=g.testBit(c);if(a!=j){d=d.add2D(a?this:l)}}return d};ECPointFp.prototype.isOnCurve=function(){var d=this.getX().toBigInteger();var i=this.getY().toBigInteger();var f=this.curve.getA().toBigInteger();var c=this.curve.getB().toBigInteger();var h=this.curve.getQ();var e=i.multiply(i).mod(h);var g=d.multiply(d).multiply(d).add(f.multiply(d)).add(c).mod(h);return e.equals(g)};ECPointFp.prototype.toString=function(){return"("+this.getX().toBigInteger().toString()+","+this.getY().toBigInteger().toString()+")"};ECPointFp.prototype.validate=function(){var c=this.curve.getQ();if(this.isInfinity()){throw new Error("Point is at infinity.")}var a=this.getX().toBigInteger();var b=this.getY().toBigInteger();if(a.compareTo(BigInteger.ONE)<0||a.compareTo(c.subtract(BigInteger.ONE))>0){throw new Error("x coordinate out of bounds")}if(b.compareTo(BigInteger.ONE)<0||b.compareTo(c.subtract(BigInteger.ONE))>0){throw new Error("y coordinate out of bounds")}if(!this.isOnCurve()){throw new Error("Point is not on the curve.")}if(this.multiply(c).isInfinity()){throw new Error("Point is not a scalar multiple of G.")}return true};
/*! Mike Samuel (c) 2009 | code.google.com/p/json-sans-eval
*/
var jsonParse=(function(){var e="(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)";var j='(?:[^\\0-\\x08\\x0a-\\x1f"\\\\]|\\\\(?:["/\\\\bfnrt]|u[0-9A-Fa-f]{4}))';var i='(?:"'+j+'*")';var d=new RegExp("(?:false|true|null|[\\{\\}\\[\\]]|"+e+"|"+i+")","g");var k=new RegExp("\\\\(?:([^u])|u(.{4}))","g");var g={'"':'"',"/":"/","\\":"\\",b:"\b",f:"\f",n:"\n",r:"\r",t:"\t"};function h(l,m,n){return m?g[m]:String.fromCharCode(parseInt(n,16))}var c=new String("");var a="\\";var f={"{":Object,"[":Array};var b=Object.hasOwnProperty;return function(u,q){var p=u.match(d);var x;var v=p[0];var l=false;if("{"===v){x={}}else{if("["===v){x=[]}else{x=[];l=true}}var t;var r=[x];for(var o=1-l,m=p.length;o=0;){delete D[n[A]]}}}return q.call(C,B,D)};x=s({"":x},"")}return x}})();
/*! asn1-1.0.9.js (c) 2013-2015 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.asn1=="undefined"||!KJUR.asn1){KJUR.asn1={}}KJUR.asn1.ASN1Util=new function(){this.integerToByteHex=function(a){var b=a.toString(16);if((b.length%2)==1){b="0"+b}return b};this.bigIntToMinTwosComplementsHex=function(j){var f=j.toString(16);if(f.substr(0,1)!="-"){if(f.length%2==1){f="0"+f}else{if(!f.match(/^[0-7]/)){f="00"+f}}}else{var a=f.substr(1);var e=a.length;if(e%2==1){e+=1}else{if(!f.match(/^[0-7]/)){e+=2}}var g="";for(var d=0;d15){throw"ASN.1 length too long to represent by 8x: n = "+i.toString(16)}var f=128+g;return f.toString(16)+h}};this.getEncodedHex=function(){if(this.hTLV==null||this.isModified){this.hV=this.getFreshValueHex();this.hL=this.getLengthHexFromValue();this.hTLV=this.hT+this.hL+this.hV;this.isModified=false}return this.hTLV};this.getValueHex=function(){this.getEncodedHex();return this.hV};this.getFreshValueHex=function(){return""}};KJUR.asn1.DERAbstractString=function(c){KJUR.asn1.DERAbstractString.superclass.constructor.call(this);var b=null;var a=null;this.getString=function(){return this.s};this.setString=function(d){this.hTLV=null;this.isModified=true;this.s=d;this.hV=stohex(this.s)};this.setStringHex=function(d){this.hTLV=null;this.isModified=true;this.s=null;this.hV=d};this.getFreshValueHex=function(){return this.hV};if(typeof c!="undefined"){if(typeof c=="string"){this.setString(c)}else{if(typeof c.str!="undefined"){this.setString(c.str)}else{if(typeof c.hex!="undefined"){this.setStringHex(c.hex)}}}}};YAHOO.lang.extend(KJUR.asn1.DERAbstractString,KJUR.asn1.ASN1Object);KJUR.asn1.DERAbstractTime=function(c){KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);var b=null;var a=null;this.localDateToUTC=function(f){utc=f.getTime()+(f.getTimezoneOffset()*60000);var e=new Date(utc);return e};this.formatDate=function(m,o,e){var g=this.zeroPadding;var n=this.localDateToUTC(m);var p=String(n.getFullYear());if(o=="utc"){p=p.substr(2,2)}var l=g(String(n.getMonth()+1),2);var q=g(String(n.getDate()),2);var h=g(String(n.getHours()),2);var i=g(String(n.getMinutes()),2);var j=g(String(n.getSeconds()),2);var r=p+l+q+h+i+j;if(e===true){var f=n.getMilliseconds();if(f!=0){var k=g(String(f),3);k=k.replace(/[0]+$/,"");r=r+"."+k}}return r+"Z"};this.zeroPadding=function(e,d){if(e.length>=d){return e}return new Array(d-e.length+1).join("0")+e};this.getString=function(){return this.s};this.setString=function(d){this.hTLV=null;this.isModified=true;this.s=d;this.hV=stohex(d)};this.setByDateValue=function(h,j,e,d,f,g){var i=new Date(Date.UTC(h,j-1,e,d,f,g,0));this.setByDate(i)};this.getFreshValueHex=function(){return this.hV}};YAHOO.lang.extend(KJUR.asn1.DERAbstractTime,KJUR.asn1.ASN1Object);KJUR.asn1.DERAbstractStructured=function(b){KJUR.asn1.DERAbstractString.superclass.constructor.call(this);var a=null;this.setByASN1ObjectArray=function(c){this.hTLV=null;this.isModified=true;this.asn1Array=c};this.appendASN1Object=function(c){this.hTLV=null;this.isModified=true;this.asn1Array.push(c)};this.asn1Array=new Array();if(typeof b!="undefined"){if(typeof b.array!="undefined"){this.asn1Array=b.array}}};YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured,KJUR.asn1.ASN1Object);KJUR.asn1.DERBoolean=function(){KJUR.asn1.DERBoolean.superclass.constructor.call(this);this.hT="01";this.hTLV="0101ff"};YAHOO.lang.extend(KJUR.asn1.DERBoolean,KJUR.asn1.ASN1Object);KJUR.asn1.DERInteger=function(a){KJUR.asn1.DERInteger.superclass.constructor.call(this);this.hT="02";this.setByBigInteger=function(b){this.hTLV=null;this.isModified=true;this.hV=KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(b)};this.setByInteger=function(c){var b=new BigInteger(String(c),10);this.setByBigInteger(b)};this.setValueHex=function(b){this.hV=b};this.getFreshValueHex=function(){return this.hV};if(typeof a!="undefined"){if(typeof a.bigint!="undefined"){this.setByBigInteger(a.bigint)}else{if(typeof a["int"]!="undefined"){this.setByInteger(a["int"])}else{if(typeof a=="number"){this.setByInteger(a)}else{if(typeof a.hex!="undefined"){this.setValueHex(a.hex)}}}}}};YAHOO.lang.extend(KJUR.asn1.DERInteger,KJUR.asn1.ASN1Object);KJUR.asn1.DERBitString=function(a){KJUR.asn1.DERBitString.superclass.constructor.call(this);this.hT="03";this.setHexValueIncludingUnusedBits=function(b){this.hTLV=null;this.isModified=true;this.hV=b};this.setUnusedBitsAndHexValue=function(b,d){if(b<0||7=(b*2))){break}if(d>=200){break}c.push(e);g=e;d++}return c};this.getNthChildIndex_AtObj=function(d,b,e){var c=this.getPosArrayOfChildren_AtObj(d,b);return c[e]};this.getDecendantIndexByNthList=function(e,d,c){if(c.length==0){return d}var f=c.shift();var b=this.getPosArrayOfChildren_AtObj(e,d);return this.getDecendantIndexByNthList(e,b[f],c)};this.getDecendantHexTLVByNthList=function(d,c,b){var a=this.getDecendantIndexByNthList(d,c,b);return this.getHexOfTLV_AtObj(d,a)};this.getDecendantHexVByNthList=function(d,c,b){var a=this.getDecendantIndexByNthList(d,c,b);return this.getHexOfV_AtObj(d,a)}};ASN1HEX.getVbyList=function(d,c,b,e){var a=this.getDecendantIndexByNthList(d,c,b);if(a===undefined){throw"can't find nthList object"}if(e!==undefined){if(d.substr(a,2)!=e){throw"checking tag doesn't match: "+d.substr(a,2)+"!="+e}}return this.getHexOfV_AtObj(d,a)};ASN1HEX.hextooidstr=function(e){var h=function(b,a){if(b.length>=a){return b}return new Array(a-b.length+1).join("0")+b};var l=[];var o=e.substr(0,2);var f=parseInt(o,16);l[0]=new String(Math.floor(f/40));l[1]=new String(f%40);var m=e.substr(2);var k=[];for(var g=0;g0){n=n+"."+j.join(".")}return n};ASN1HEX.dump=function(e,c,k,g){var o=function(w,i){if(w.length<=i*2){return w}else{var v=w.substr(0,i)+"..(total "+w.length/2+"bytes).."+w.substr(w.length-i,i);return v}};if(c===undefined){c={ommit_long_octet:32}}if(k===undefined){k=0}if(g===undefined){g=""}var r=c.ommit_long_octet;if(e.substr(k,2)=="01"){var h=ASN1HEX.getHexOfV_AtObj(e,k);if(h=="00"){return g+"BOOLEAN FALSE\n"}else{return g+"BOOLEAN TRUE\n"}}if(e.substr(k,2)=="02"){var h=ASN1HEX.getHexOfV_AtObj(e,k);return g+"INTEGER "+o(h,r)+"\n"}if(e.substr(k,2)=="03"){var h=ASN1HEX.getHexOfV_AtObj(e,k);return g+"BITSTRING "+o(h,r)+"\n"}if(e.substr(k,2)=="04"){var h=ASN1HEX.getHexOfV_AtObj(e,k);if(ASN1HEX.isASN1HEX(h)){var j=g+"OCTETSTRING, encapsulates\n";j=j+ASN1HEX.dump(h,c,0,g+" ");return j}else{return g+"OCTETSTRING "+o(h,r)+"\n"}}if(e.substr(k,2)=="05"){return g+"NULL\n"}if(e.substr(k,2)=="06"){var l=ASN1HEX.getHexOfV_AtObj(e,k);var a=KJUR.asn1.ASN1Util.oidHexToInt(l);var n=KJUR.asn1.x509.OID.oid2name(a);var b=a.replace(/\./g," ");if(n!=""){return g+"ObjectIdentifier "+n+" ("+b+")\n"}else{return g+"ObjectIdentifier ("+b+")\n"}}if(e.substr(k,2)=="0c"){return g+"UTF8String '"+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"'\n"}if(e.substr(k,2)=="13"){return g+"PrintableString '"+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"'\n"}if(e.substr(k,2)=="14"){return g+"TeletexString '"+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"'\n"}if(e.substr(k,2)=="16"){return g+"IA5String '"+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"'\n"}if(e.substr(k,2)=="17"){return g+"UTCTime "+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"\n"}if(e.substr(k,2)=="18"){return g+"GeneralizedTime "+hextoutf8(ASN1HEX.getHexOfV_AtObj(e,k))+"\n"}if(e.substr(k,2)=="30"){if(e.substr(k,4)=="3000"){return g+"SEQUENCE {}\n"}var j=g+"SEQUENCE\n";var d=ASN1HEX.getPosArrayOfChildren_AtObj(e,k);var f=c;if((d.length==2||d.length==3)&&e.substr(d[0],2)=="06"&&e.substr(d[d.length-1],2)=="04"){var t=ASN1HEX.getHexOfV_AtObj(e,d[0]);var a=KJUR.asn1.ASN1Util.oidHexToInt(t);var n=KJUR.asn1.x509.OID.oid2name(a);var p=JSON.parse(JSON.stringify(c));p.x509ExtName=n;f=p}for(var q=0;q0){var d=new KJUR.asn1.DERSequence({array:this.extensionsArray});var b=new KJUR.asn1.DERTaggedObject({explicit:true,tag:"a3",obj:d});this.asn1Array.push(b)}var e=new KJUR.asn1.DERSequence({array:this.asn1Array});this.hTLV=e.getEncodedHex();this.isModified=false;return this.hTLV};this._initialize()};YAHOO.lang.extend(KJUR.asn1.x509.TBSCertificate,KJUR.asn1.ASN1Object);KJUR.asn1.x509.Extension=function(b){KJUR.asn1.x509.Extension.superclass.constructor.call(this);var a=null;this.getEncodedHex=function(){var f=new KJUR.asn1.DERObjectIdentifier({oid:this.oid});var e=new KJUR.asn1.DEROctetString({hex:this.getExtnValueHex()});var d=new Array();d.push(f);if(this.critical){d.push(new KJUR.asn1.DERBoolean())}d.push(e);var c=new KJUR.asn1.DERSequence({array:d});return c.getEncodedHex()};this.critical=false;if(typeof b!="undefined"){if(typeof b.critical!="undefined"){this.critical=b.critical}}};YAHOO.lang.extend(KJUR.asn1.x509.Extension,KJUR.asn1.ASN1Object);KJUR.asn1.x509.KeyUsage=function(a){KJUR.asn1.x509.KeyUsage.superclass.constructor.call(this,a);this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()};this.oid="2.5.29.15";if(typeof a!="undefined"){if(typeof a.bin!="undefined"){this.asn1ExtnValue=new KJUR.asn1.DERBitString(a)}}};YAHOO.lang.extend(KJUR.asn1.x509.KeyUsage,KJUR.asn1.x509.Extension);KJUR.asn1.x509.BasicConstraints=function(c){KJUR.asn1.x509.BasicConstraints.superclass.constructor.call(this,c);var a=false;var b=-1;this.getExtnValueHex=function(){var e=new Array();if(this.cA){e.push(new KJUR.asn1.DERBoolean())}if(this.pathLen>-1){e.push(new KJUR.asn1.DERInteger({"int":this.pathLen}))}var d=new KJUR.asn1.DERSequence({array:e});this.asn1ExtnValue=d;return this.asn1ExtnValue.getEncodedHex()};this.oid="2.5.29.19";this.cA=false;this.pathLen=-1;if(typeof c!="undefined"){if(typeof c.cA!="undefined"){this.cA=c.cA}if(typeof c.pathLen!="undefined"){this.pathLen=c.pathLen}}};YAHOO.lang.extend(KJUR.asn1.x509.BasicConstraints,KJUR.asn1.x509.Extension);KJUR.asn1.x509.CRLDistributionPoints=function(a){KJUR.asn1.x509.CRLDistributionPoints.superclass.constructor.call(this,a);this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()};this.setByDPArray=function(b){this.asn1ExtnValue=new KJUR.asn1.DERSequence({array:b})};this.setByOneURI=function(e){var b=new KJUR.asn1.x509.GeneralNames([{uri:e}]);var d=new KJUR.asn1.x509.DistributionPointName(b);var c=new KJUR.asn1.x509.DistributionPoint({dpobj:d});this.setByDPArray([c])};this.oid="2.5.29.31";if(typeof a!="undefined"){if(typeof a.array!="undefined"){this.setByDPArray(a.array)}else{if(typeof a.uri!="undefined"){this.setByOneURI(a.uri)}}}};YAHOO.lang.extend(KJUR.asn1.x509.CRLDistributionPoints,KJUR.asn1.x509.Extension);KJUR.asn1.x509.ExtKeyUsage=function(a){KJUR.asn1.x509.ExtKeyUsage.superclass.constructor.call(this,a);this.setPurposeArray=function(b){this.asn1ExtnValue=new KJUR.asn1.DERSequence();for(var c=0;c0){var c=new KJUR.asn1.DERSequence({array:this.aRevokedCert});this.asn1Array.push(c)}var d=new KJUR.asn1.DERSequence({array:this.asn1Array});this.hTLV=d.getEncodedHex();this.isModified=false;return this.hTLV};this._initialize=function(){this.asn1Version=null;this.asn1SignatureAlg=null;this.asn1Issuer=null;this.asn1ThisUpdate=null;this.asn1NextUpdate=null;this.aRevokedCert=new Array()};this._initialize()};YAHOO.lang.extend(KJUR.asn1.x509.TBSCertList,KJUR.asn1.ASN1Object);KJUR.asn1.x509.CRLEntry=function(c){KJUR.asn1.x509.CRLEntry.superclass.constructor.call(this);var b=null;var a=null;this.setCertSerial=function(d){this.sn=new KJUR.asn1.DERInteger(d)};this.setRevocationDate=function(d){this.time=new KJUR.asn1.x509.Time(d)};this.getEncodedHex=function(){var d=new KJUR.asn1.DERSequence({array:[this.sn,this.time]});this.TLV=d.getEncodedHex();return this.TLV};if(typeof c!="undefined"){if(typeof c.time!="undefined"){this.setRevocationDate(c.time)}if(typeof c.sn!="undefined"){this.setCertSerial(c.sn)}}};YAHOO.lang.extend(KJUR.asn1.x509.CRLEntry,KJUR.asn1.ASN1Object);KJUR.asn1.x509.X500Name=function(b){KJUR.asn1.x509.X500Name.superclass.constructor.call(this);this.asn1Array=new Array();this.setByString=function(c){var d=c.split("/");d.shift();for(var e=0;e0){h=new a.DERTaggedObject({obj:this.dUnsignedAttrs,tag:"a1",explicit:false})}var g=[this.dCMSVersion,this.dSignerIdentifier,this.dDigestAlgorithm,e,this.dSigAlg,this.dSig,];if(h!=null){g.push(h)}var f=new a.DERSequence({array:g});this.hTLV=f.getEncodedHex();return this.hTLV}};YAHOO.lang.extend(KJUR.asn1.cms.SignerInfo,KJUR.asn1.ASN1Object);KJUR.asn1.cms.EncapsulatedContentInfo=function(c){KJUR.asn1.cms.EncapsulatedContentInfo.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dEContentType=new a.DERObjectIdentifier({name:"data"});this.dEContent=null;this.isDetached=false;this.eContentValueHex=null;this.setContentType=function(e){if(e.match(/^[0-2][.][0-9.]+$/)){this.dEContentType=new a.DERObjectIdentifier({oid:e})}else{this.dEContentType=new a.DERObjectIdentifier({name:e})}};this.setContentValue=function(e){if(typeof e!="undefined"){if(typeof e.hex=="string"){this.eContentValueHex=e.hex}else{if(typeof e.str=="string"){this.eContentValueHex=utf8tohex(e.str)}}}};this.setContentValueHex=function(e){this.eContentValueHex=e};this.setContentValueStr=function(e){this.eContentValueHex=utf8tohex(e)};this.getEncodedHex=function(){if(typeof this.eContentValueHex!="string"){throw"eContentValue not yet set"}var g=new a.DEROctetString({hex:this.eContentValueHex});this.dEContent=new a.DERTaggedObject({obj:g,tag:"a0",explicit:true});var e=[this.dEContentType];if(!this.isDetached){e.push(this.dEContent)}var f=new a.DERSequence({array:e});this.hTLV=f.getEncodedHex();return this.hTLV}};YAHOO.lang.extend(KJUR.asn1.cms.EncapsulatedContentInfo,KJUR.asn1.ASN1Object);KJUR.asn1.cms.ContentInfo=function(c){KJUR.asn1.cms.ContentInfo.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dContentType=null;this.dContent=null;this.setContentType=function(e){if(typeof e=="string"){this.dContentType=d.OID.name2obj(e)}};this.getEncodedHex=function(){var f=new a.DERTaggedObject({obj:this.dContent,tag:"a0",explicit:true});var e=new a.DERSequence({array:[this.dContentType,f]});this.hTLV=e.getEncodedHex();return this.hTLV};if(typeof c!="undefined"){if(c.type){this.setContentType(c.type)}if(c.obj&&c.obj instanceof a.ASN1Object){this.dContent=c.obj}}};YAHOO.lang.extend(KJUR.asn1.cms.ContentInfo,KJUR.asn1.ASN1Object);KJUR.asn1.cms.SignedData=function(c){KJUR.asn1.cms.SignedData.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dCMSVersion=new a.DERInteger({"int":1});this.dDigestAlgs=null;this.digestAlgNameList=[];this.dEncapContentInfo=new b.EncapsulatedContentInfo();this.dCerts=null;this.certificateList=[];this.crlList=[];this.signerInfoList=[new b.SignerInfo()];this.addCertificatesByPEM=function(e){var f=KEYUTIL.getHexFromPEM(e);var g=new a.ASN1Object();g.hTLV=f;this.certificateList.push(g)};this.getEncodedHex=function(){if(typeof this.hTLV=="string"){return this.hTLV}if(this.dDigestAlgs==null){var k=[];for(var j=0;j0){var l=new a.DERSet({array:this.certificateList});this.dCerts=new a.DERTaggedObject({obj:l,tag:"a0",explicit:false})}}if(this.dCerts!=null){e.push(this.dCerts)}var g=new a.DERSet({array:this.signerInfoList});e.push(g);var f=new a.DERSequence({array:e});this.hTLV=f.getEncodedHex();return this.hTLV};this.getContentInfo=function(){this.getEncodedHex();var e=new b.ContentInfo({type:"signed-data",obj:this});return e};this.getContentInfoEncodedHex=function(){var e=this.getContentInfo();var f=e.getEncodedHex();return f};this.getPEM=function(){var e=this.getContentInfoEncodedHex();var f=a.ASN1Util.getPEMStringFromHex(e,"CMS");return f}};YAHOO.lang.extend(KJUR.asn1.cms.SignedData,KJUR.asn1.ASN1Object);KJUR.asn1.cms.CMSUtil=new function(){};KJUR.asn1.cms.CMSUtil.newSignedData=function(a){var h=KJUR.asn1.cms;var g=KJUR.asn1.cades;var f=new h.SignedData();f.dEncapContentInfo.setContentValue(a.content);if(typeof a.certs=="object"){for(var b=0;ba.length){d=a.length}for(var b=0;bd){throw"key is too short for SigAlg: keylen="+j+","+a}var b="0001";var k="00"+c;var g="";var l=d-b.length-k.length;for(var f=0;f=0;--p){q=q.twice2D();q.z=BigInteger.ONE;if(o.testBit(p)){if(n.testBit(p)){q=q.add2D(t)}else{q=q.add2D(s)}}else{if(n.testBit(p)){q=q.add2D(r)}}}return q}this.getBigRandom=function(i){return new BigInteger(i.bitLength(),a).mod(i.subtract(BigInteger.ONE)).add(BigInteger.ONE)};this.setNamedCurve=function(i){this.ecparams=KJUR.crypto.ECParameterDB.getByName(i);this.prvKeyHex=null;this.pubKeyHex=null;this.curveName=i};this.setPrivateKeyHex=function(i){this.isPrivate=true;this.prvKeyHex=i};this.setPublicKeyHex=function(i){this.isPublic=true;this.pubKeyHex=i};this.generateKeyPairHex=function(){var k=this.ecparams.n;var n=this.getBigRandom(k);var l=this.ecparams.G.multiply(n);var q=l.getX().toBigInteger();var o=l.getY().toBigInteger();var i=this.ecparams.keylen/4;var m=("0000000000"+n.toString(16)).slice(-i);var r=("0000000000"+q.toString(16)).slice(-i);var p=("0000000000"+o.toString(16)).slice(-i);var j="04"+r+p;this.setPrivateKeyHex(m);this.setPublicKeyHex(j);return{ecprvhex:m,ecpubhex:j}};this.signWithMessageHash=function(i){return this.signHex(i,this.prvKeyHex)};this.signHex=function(o,j){var t=new BigInteger(j,16);var l=this.ecparams.n;var q=new BigInteger(o,16);do{var m=this.getBigRandom(l);var u=this.ecparams.G;var p=u.multiply(m);var i=p.getX().toBigInteger().mod(l)}while(i.compareTo(BigInteger.ZERO)<=0);var v=m.modInverse(l).multiply(q.add(t.multiply(i))).mod(l);return KJUR.crypto.ECDSA.biRSSigToASN1Sig(i,v)};this.sign=function(m,u){var q=u;var j=this.ecparams.n;var p=BigInteger.fromByteArrayUnsigned(m);do{var l=this.getBigRandom(j);var t=this.ecparams.G;var o=t.multiply(l);var i=o.getX().toBigInteger().mod(j)}while(i.compareTo(BigInteger.ZERO)<=0);var v=l.modInverse(j).multiply(p.add(q.multiply(i))).mod(j);return this.serializeSig(i,v)};this.verifyWithMessageHash=function(j,i){return this.verifyHex(j,i,this.pubKeyHex)};this.verifyHex=function(m,i,p){var l,j;var o=KJUR.crypto.ECDSA.parseSigHex(i);l=o.r;j=o.s;var k;k=ECPointFp.decodeFromHex(this.ecparams.curve,p);var n=new BigInteger(m,16);return this.verifyRaw(n,l,j,k)};this.verify=function(o,p,j){var l,i;if(Bitcoin.Util.isArray(p)){var n=this.parseSig(p);l=n.r;i=n.s}else{if("object"===typeof p&&p.r&&p.s){l=p.r;i=p.s}else{throw"Invalid value for signature"}}var k;if(j instanceof ECPointFp){k=j}else{if(Bitcoin.Util.isArray(j)){k=ECPointFp.decodeFrom(this.ecparams.curve,j)}else{throw"Invalid format for pubkey value, must be byte array or ECPointFp"}}var m=BigInteger.fromByteArrayUnsigned(o);return this.verifyRaw(m,l,i,k)};this.verifyRaw=function(o,i,w,m){var l=this.ecparams.n;var u=this.ecparams.G;if(i.compareTo(BigInteger.ONE)<0||i.compareTo(l)>=0){return false}if(w.compareTo(BigInteger.ONE)<0||w.compareTo(l)>=0){return false}var p=w.modInverse(l);var k=o.multiply(p).mod(l);var j=i.multiply(p).mod(l);var q=u.multiply(k).add(m.multiply(j));var t=q.getX().toBigInteger().mod(l);return t.equals(i)};this.serializeSig=function(k,j){var l=k.toByteArraySigned();var i=j.toByteArraySigned();var m=[];m.push(2);m.push(l.length);m=m.concat(l);m.push(2);m.push(i.length);m=m.concat(i);m.unshift(m.length);m.unshift(48);return m};this.parseSig=function(n){var m;if(n[0]!=48){throw new Error("Signature not a valid DERSequence")}m=2;if(n[m]!=2){throw new Error("First element in signature must be a DERInteger")}var l=n.slice(m+2,m+2+n[m+1]);m+=2+n[m+1];if(n[m]!=2){throw new Error("Second element in signature must be a DERInteger")}var i=n.slice(m+2,m+2+n[m+1]);m+=2+n[m+1];var k=BigInteger.fromByteArrayUnsigned(l);var j=BigInteger.fromByteArrayUnsigned(i);return{r:k,s:j}};this.parseSigCompact=function(m){if(m.length!==65){throw"Signature has the wrong length"}var j=m[0]-27;if(j<0||j>7){throw"Invalid signature type"}var o=this.ecparams.n;var l=BigInteger.fromByteArrayUnsigned(m.slice(1,33)).mod(o);var k=BigInteger.fromByteArrayUnsigned(m.slice(33,65)).mod(o);return{r:l,s:k,i:j}};if(h!==undefined){if(h.curve!==undefined){this.curveName=h.curve}}if(this.curveName===undefined){this.curveName=e}this.setNamedCurve(this.curveName);if(h!==undefined){if(h.prv!==undefined){this.setPrivateKeyHex(h.prv)}if(h.pub!==undefined){this.setPublicKeyHex(h.pub)}}};KJUR.crypto.ECDSA.parseSigHex=function(a){var b=KJUR.crypto.ECDSA.parseSigHexInHexRS(a);var d=new BigInteger(b.r,16);var c=new BigInteger(b.s,16);return{r:d,s:c}};KJUR.crypto.ECDSA.parseSigHexInHexRS=function(c){if(c.substr(0,2)!="30"){throw"signature is not a ASN.1 sequence"}var b=ASN1HEX.getPosArrayOfChildren_AtObj(c,0);if(b.length!=2){throw"number of signature ASN.1 sequence elements seem wrong"}var g=b[0];var f=b[1];if(c.substr(g,2)!="02"){throw"1st item of sequene of signature is not ASN.1 integer"}if(c.substr(f,2)!="02"){throw"2nd item of sequene of signature is not ASN.1 integer"}var e=ASN1HEX.getHexOfV_AtObj(c,g);var d=ASN1HEX.getHexOfV_AtObj(c,f);return{r:e,s:d}};KJUR.crypto.ECDSA.asn1SigToConcatSig=function(c){var d=KJUR.crypto.ECDSA.parseSigHexInHexRS(c);var b=d.r;var a=d.s;if(b.substr(0,2)=="00"&&(((b.length/2)*8)%(16*8))==8){b=b.substr(2)}if(a.substr(0,2)=="00"&&(((a.length/2)*8)%(16*8))==8){a=a.substr(2)}if((((b.length/2)*8)%(16*8))!=0){throw"unknown ECDSA sig r length error"}if((((a.length/2)*8)%(16*8))!=0){throw"unknown ECDSA sig s length error"}return b+a};KJUR.crypto.ECDSA.concatSigToASN1Sig=function(a){if((((a.length/2)*8)%(16*8))!=0){throw"unknown ECDSA concatinated r-s sig length error"}var c=a.substr(0,a.length/2);var b=a.substr(a.length/2);return KJUR.crypto.ECDSA.hexRSSigToASN1Sig(c,b)};KJUR.crypto.ECDSA.hexRSSigToASN1Sig=function(b,a){var d=new BigInteger(b,16);var c=new BigInteger(a,16);return KJUR.crypto.ECDSA.biRSSigToASN1Sig(d,c)};KJUR.crypto.ECDSA.biRSSigToASN1Sig=function(e,c){var b=new KJUR.asn1.DERInteger({bigint:e});var a=new KJUR.asn1.DERInteger({bigint:c});var d=new KJUR.asn1.DERSequence({array:[b,a]});return d.getEncodedHex()};
/*! ecparam-1.0.0.js (c) 2013 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.crypto=="undefined"||!KJUR.crypto){KJUR.crypto={}}KJUR.crypto.ECParameterDB=new function(){var b={};var c={};function a(d){return new BigInteger(d,16)}this.getByName=function(e){var d=e;if(typeof c[d]!="undefined"){d=c[e]}if(typeof b[d]!="undefined"){return b[d]}throw"unregistered EC curve name: "+d};this.regist=function(A,l,o,g,m,e,j,f,k,u,d,x){b[A]={};var s=a(o);var z=a(g);var y=a(m);var t=a(e);var w=a(j);var r=new ECCurveFp(s,z,y);var q=r.decodePointHex("04"+f+k);b[A]["name"]=A;b[A]["keylen"]=l;b[A]["curve"]=r;b[A]["G"]=q;b[A]["n"]=t;b[A]["h"]=w;b[A]["oid"]=d;b[A]["info"]=x;for(var v=0;v0||K.compareTo(u)>0||BigInteger.ZERO.compareTo(J)>0||J.compareTo(u)>0){throw"invalid DSA signature"}var I=J.modInverse(u);var A=D.multiply(I).mod(u);var v=K.multiply(I).mod(u);var F=G.modPow(A,z).multiply(H.modPow(v,z)).mod(z).mod(u);return F.compareTo(K)==0};this.parseASN1Signature=function(u){try{var y=new BigInteger(ASN1HEX.getVbyList(u,0,[0],"02"),16);var v=new BigInteger(ASN1HEX.getVbyList(u,0,[1],"02"),16);return[y,v]}catch(w){throw"malformed DSA signature"}};function d(E,w,B,v,u,C){var z=KJUR.crypto.Util.hashString(w,E.toLowerCase());var z=z.substr(0,u.bitLength()/4);var A=new BigInteger(z,16);var y=n(BigInteger.ONE.add(BigInteger.ONE),u.subtract(BigInteger.ONE));var F=(B.modPow(y,v)).mod(u);var D=(y.modInverse(u).multiply(A.add(C.multiply(F)))).mod(u);var G=new Array();G[0]=F;G[1]=D;return G}function r(v){var u=openpgp.config.config.prefer_hash_algorithm;switch(Math.round(v.bitLength()/8)){case 20:if(u!=2&&u>11&&u!=10&&u<8){return 2}return u;case 28:if(u>11&&u<8){return 11}return u;case 32:if(u>10&&u<8){return 8}return u;default:util.print_debug("DSA select hash algorithm: returning null for an unknown length of q");return null}}this.select_hash_algorithm=r;function m(I,K,J,B,z,u,F,G){var C=KJUR.crypto.Util.hashString(B,I.toLowerCase());var C=C.substr(0,u.bitLength()/4);var D=new BigInteger(C,16);if(BigInteger.ZERO.compareTo(K)>0||K.compareTo(u)>0||BigInteger.ZERO.compareTo(J)>0||J.compareTo(u)>0){util.print_error("invalid DSA Signature");return null}var H=J.modInverse(u);var A=D.multiply(H).mod(u);var v=K.multiply(H).mod(u);var E=F.modPow(A,z).multiply(G.modPow(v,z)).mod(z).mod(u);return E.compareTo(K)==0}function a(z){var A=new BigInteger(z,primeCenterie);var y=j(q,512);var u=t(p,q,z);var v;do{v=new BigInteger(q.bitCount(),rand)}while(x.compareTo(BigInteger.ZERO)!=1&&x.compareTo(q)!=-1);var w=g.modPow(x,p);return{x:v,q:A,p:y,g:u,y:w}}function j(y,z,w){if(z%64!=0){return false}var u;var v;do{u=w(bitcount,true);v=u.subtract(BigInteger.ONE);u=u.subtract(v.remainder(y))}while(!u.isProbablePrime(primeCenterie)||u.bitLength()!=l);return u}function t(B,z,A,w){var u=B.subtract(BigInteger.ONE);var y=u.divide(z);var v;do{v=w(A)}while(v.compareTo(u)!=-1&&v.compareTo(BigInteger.ONE)!=1);return v.modPow(y,B)}function o(w,y,u){var v;do{v=u(y,false)}while(v.compareTo(w)!=-1&&v.compareTo(BigInteger.ZERO)!=1);return v}function i(v,w){k=o(v);var u=g.modPow(k,w).mod(v);return u}function h(B,w,y,v,z,u){var A=B(v);s=(w.modInverse(z).multiply(A.add(u.multiply(y)))).mod(z);return s}this.sign=d;this.verify=m;function n(w,u){if(u.compareTo(w)<=0){return}var v=u.subtract(w);var y=e(v.bitLength());while(y>v){y=e(v.bitLength())}return w.add(y)}function e(w){if(w<0){return null}var u=Math.floor((w+7)/8);var v=c(u);if(w%8>0){v=String.fromCharCode((Math.pow(2,w%8)-1)&v.charCodeAt(0))+v.substring(1)}return new BigInteger(f(v),16)}function c(w){var u="";for(var v=0;v=s*2){break}}var x={};x.keyhex=v.substr(0,g[o]["keylen"]*2);x.ivhex=v.substr(g[o]["keylen"]*2,g[o]["ivlen"]*2);return x};var a=function(n,t,p,u){var q=CryptoJS.enc.Base64.parse(n);var o=CryptoJS.enc.Hex.stringify(q);var s=g[t]["proc"];var r=s(o,p,u);return r};var f=function(n,q,o,s){var p=g[q]["eproc"];var r=p(n,o,s);return r};return{version:"1.0.5",getHexFromPEM:function(o,r){var p=o;if(p.indexOf("BEGIN "+r)==-1){throw"can't find PEM header: "+r}p=p.replace("-----BEGIN "+r+"-----","");p=p.replace("-----END "+r+"-----","");var q=p.replace(/\s+/g,"");var n=b64tohex(q);return n},getDecryptedKeyHexByKeyIV:function(o,r,q,p){var n=b(r);return n(o,q,p)},parsePKCS5PEM:function(n){return l(n)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(o,n,p){return h(o,n,p)},decryptKeyB64:function(n,p,o,q){return a(n,p,o,q)},getDecryptedKeyHex:function(w,v){var o=l(w);var r=o.type;var p=o.cipher;var n=o.ivsalt;var q=o.data;var u=h(p,v,n);var t=u.keyhex;var s=a(q,p,t,n);return s},getRSAKeyFromEncryptedPKCS5PEM:function(p,o){var q=this.getDecryptedKeyHex(p,o);var n=new RSAKey();n.readPrivateKeyFromASN1HexString(q);return n},getEryptedPKCS5PEMFromPrvKeyHex:function(q,x,r,p){var n="";if(typeof r=="undefined"||r==null){r="AES-256-CBC"}if(typeof g[r]=="undefined"){throw"PKCS5PKEY unsupported algorithm: "+r}if(typeof p=="undefined"||p==null){var t=g[r]["ivlen"];var s=k(t);p=s.toUpperCase()}var w=h(r,x,p);var v=w.keyhex;var u=f(q,r,v,p);var o=u.replace(/(.{64})/g,"$1\r\n");var n="-----BEGIN RSA PRIVATE KEY-----\r\n";n+="Proc-Type: 4,ENCRYPTED\r\n";n+="DEK-Info: "+r+","+p+"\r\n";n+="\r\n";n+=o;n+="\r\n-----END RSA PRIVATE KEY-----\r\n";return n},getEryptedPKCS5PEMFromRSAKey:function(C,D,o,s){var A=new KJUR.asn1.DERInteger({"int":0});var v=new KJUR.asn1.DERInteger({bigint:C.n});var z=new KJUR.asn1.DERInteger({"int":C.e});var B=new KJUR.asn1.DERInteger({bigint:C.d});var t=new KJUR.asn1.DERInteger({bigint:C.p});var r=new KJUR.asn1.DERInteger({bigint:C.q});var y=new KJUR.asn1.DERInteger({bigint:C.dmp1});var u=new KJUR.asn1.DERInteger({bigint:C.dmq1});var x=new KJUR.asn1.DERInteger({bigint:C.coeff});var E=new KJUR.asn1.DERSequence({array:[A,v,z,B,t,r,y,u,x]});var w=E.getEncodedHex();return this.getEryptedPKCS5PEMFromPrvKeyHex(w,D,o,s)},newEncryptedPKCS5PEM:function(n,o,r,s){if(typeof o=="undefined"||o==null){o=1024}if(typeof r=="undefined"||r==null){r="10001"}var p=new RSAKey();p.generate(o,r);var q=null;if(typeof s=="undefined"||s==null){q=this.getEncryptedPKCS5PEMFromRSAKey(pkey,n)}else{q=this.getEncryptedPKCS5PEMFromRSAKey(pkey,n,s)}return q},getRSAKeyFromPlainPKCS8PEM:function(p){if(p.match(/ENCRYPTED/)){throw"pem shall be not ENCRYPTED"}var o=this.getHexFromPEM(p,"PRIVATE KEY");var n=this.getRSAKeyFromPlainPKCS8Hex(o);return n},getRSAKeyFromPlainPKCS8Hex:function(q){var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=3){throw"outer DERSequence shall have 3 elements: "+p.length}var o=ASN1HEX.getHexOfTLV_AtObj(q,p[1]);if(o!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+o}var o=ASN1HEX.getHexOfTLV_AtObj(q,p[1]);var r=ASN1HEX.getHexOfTLV_AtObj(q,p[2]);var s=ASN1HEX.getHexOfV_AtObj(r,0);var n=new RSAKey();n.readPrivateKeyFromASN1HexString(s);return n},parseHexOfEncryptedPKCS8:function(u){var q={};var p=ASN1HEX.getPosArrayOfChildren_AtObj(u,0);if(p.length!=2){throw"malformed format: SEQUENCE(0).items != 2: "+p.length}q.ciphertext=ASN1HEX.getHexOfV_AtObj(u,p[1]);var w=ASN1HEX.getPosArrayOfChildren_AtObj(u,p[0]);if(w.length!=2){throw"malformed format: SEQUENCE(0.0).items != 2: "+w.length}if(ASN1HEX.getHexOfV_AtObj(u,w[0])!="2a864886f70d01050d"){throw"this only supports pkcs5PBES2"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(u,w[1]);if(w.length!=2){throw"malformed format: SEQUENCE(0.0.1).items != 2: "+n.length}var o=ASN1HEX.getPosArrayOfChildren_AtObj(u,n[1]);if(o.length!=2){throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+o.length}if(ASN1HEX.getHexOfV_AtObj(u,o[0])!="2a864886f70d0307"){throw"this only supports TripleDES"}q.encryptionSchemeAlg="TripleDES";q.encryptionSchemeIV=ASN1HEX.getHexOfV_AtObj(u,o[1]);var r=ASN1HEX.getPosArrayOfChildren_AtObj(u,n[0]);if(r.length!=2){throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+r.length}if(ASN1HEX.getHexOfV_AtObj(u,r[0])!="2a864886f70d01050c"){throw"this only supports pkcs5PBKDF2"}var v=ASN1HEX.getPosArrayOfChildren_AtObj(u,r[1]);if(v.length<2){throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+v.length}q.pbkdf2Salt=ASN1HEX.getHexOfV_AtObj(u,v[0]);var s=ASN1HEX.getHexOfV_AtObj(u,v[1]);try{q.pbkdf2Iter=parseInt(s,16)}catch(t){throw"malformed format pbkdf2Iter: "+s}return q},getPBKDF2KeyHexFromParam:function(s,n){var r=CryptoJS.enc.Hex.parse(s.pbkdf2Salt);var o=s.pbkdf2Iter;var q=CryptoJS.PBKDF2(n,r,{keySize:192/32,iterations:o});var p=CryptoJS.enc.Hex.stringify(q);return p},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(v,w){var p=this.getHexFromPEM(v,"ENCRYPTED PRIVATE KEY");var n=this.parseHexOfEncryptedPKCS8(p);var s=PKCS5PKEY.getPBKDF2KeyHexFromParam(n,w);var t={};t.ciphertext=CryptoJS.enc.Hex.parse(n.ciphertext);var r=CryptoJS.enc.Hex.parse(s);var q=CryptoJS.enc.Hex.parse(n.encryptionSchemeIV);var u=CryptoJS.TripleDES.decrypt(t,r,{iv:q});var o=CryptoJS.enc.Hex.stringify(u);return o},getRSAKeyFromEncryptedPKCS8PEM:function(q,p){var o=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(q,p);var n=this.getRSAKeyFromPlainPKCS8Hex(o);return n},getKeyFromEncryptedPKCS8PEM:function(q,o){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(q,o);var p=this.getKeyFromPlainPrivatePKCS8Hex(n);return p},parsePlainPrivatePKCS8Hex:function(q){var o={};o.algparam=null;if(q.substr(0,2)!="30"){throw"malformed plain PKCS8 private key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=3){throw"malformed plain PKCS8 private key(code:002)"}if(q.substr(p[1],2)!="30"){throw"malformed PKCS8 private key(code:003)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(q,p[1]);if(n.length!=2){throw"malformed PKCS8 private key(code:004)"}if(q.substr(n[0],2)!="06"){throw"malformed PKCS8 private key(code:005)"}o.algoid=ASN1HEX.getHexOfV_AtObj(q,n[0]);if(q.substr(n[1],2)=="06"){o.algparam=ASN1HEX.getHexOfV_AtObj(q,n[1])}if(q.substr(p[2],2)!="04"){throw"malformed PKCS8 private key(code:006)"}o.keyidx=ASN1HEX.getStartPosOfV_AtObj(q,p[2]);return o},getKeyFromPlainPrivatePKCS8PEM:function(o){var n=this.getHexFromPEM(o,"PRIVATE KEY");var p=this.getKeyFromPlainPrivatePKCS8Hex(n);return p},getKeyFromPlainPrivatePKCS8Hex:function(n){var p=this.parsePlainPrivatePKCS8Hex(n);if(p.algoid=="2a864886f70d010101"){this.parsePrivateRawRSAKeyHexAtObj(n,p);var o=p.key;var q=new RSAKey();q.setPrivateEx(o.n,o.e,o.d,o.p,o.q,o.dp,o.dq,o.co);return q}else{if(p.algoid=="2a8648ce3d0201"){this.parsePrivateRawECKeyHexAtObj(n,p);if(KJUR.crypto.OID.oidhex2name[p.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+p.algparam}var r=KJUR.crypto.OID.oidhex2name[p.algparam];var q=new KJUR.crypto.ECDSA({curve:r,prv:p.key});return q}else{throw"unsupported private key algorithm"}}},getRSAKeyFromPublicPKCS8PEM:function(o){var p=this.getHexFromPEM(o,"PUBLIC KEY");var n=this.getRSAKeyFromPublicPKCS8Hex(p);return n},getKeyFromPublicPKCS8PEM:function(o){var p=this.getHexFromPEM(o,"PUBLIC KEY");var n=this.getKeyFromPublicPKCS8Hex(p);return n},getKeyFromPublicPKCS8Hex:function(o){var n=this.parsePublicPKCS8Hex(o);if(n.algoid=="2a864886f70d010101"){var r=this.parsePublicRawRSAKeyHex(n.key);var p=new RSAKey();p.setPublic(r.n,r.e);return p}else{if(n.algoid=="2a8648ce3d0201"){if(KJUR.crypto.OID.oidhex2name[n.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+n.algparam}var q=KJUR.crypto.OID.oidhex2name[n.algparam];var p=new KJUR.crypto.ECDSA({curve:q,pub:n.key});return p}else{throw"unsupported public key algorithm"}}},parsePublicRawRSAKeyHex:function(p){var n={};if(p.substr(0,2)!="30"){throw"malformed RSA key(code:001)"}var o=ASN1HEX.getPosArrayOfChildren_AtObj(p,0);if(o.length!=2){throw"malformed RSA key(code:002)"}if(p.substr(o[0],2)!="02"){throw"malformed RSA key(code:003)"}n.n=ASN1HEX.getHexOfV_AtObj(p,o[0]);if(p.substr(o[1],2)!="02"){throw"malformed RSA key(code:004)"}n.e=ASN1HEX.getHexOfV_AtObj(p,o[1]);return n},parsePrivateRawRSAKeyHexAtObj:function(o,q){var p=q.keyidx;if(o.substr(p,2)!="30"){throw"malformed RSA private key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(o,p);if(n.length!=9){throw"malformed RSA private key(code:002)"}q.key={};q.key.n=ASN1HEX.getHexOfV_AtObj(o,n[1]);q.key.e=ASN1HEX.getHexOfV_AtObj(o,n[2]);q.key.d=ASN1HEX.getHexOfV_AtObj(o,n[3]);q.key.p=ASN1HEX.getHexOfV_AtObj(o,n[4]);q.key.q=ASN1HEX.getHexOfV_AtObj(o,n[5]);q.key.dp=ASN1HEX.getHexOfV_AtObj(o,n[6]);q.key.dq=ASN1HEX.getHexOfV_AtObj(o,n[7]);q.key.co=ASN1HEX.getHexOfV_AtObj(o,n[8])},parsePrivateRawECKeyHexAtObj:function(o,q){var p=q.keyidx;if(o.substr(p,2)!="30"){throw"malformed ECC private key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(o,p);if(n.length!=3){throw"malformed ECC private key(code:002)"}if(o.substr(n[1],2)!="04"){throw"malformed ECC private key(code:003)"}q.key=ASN1HEX.getHexOfV_AtObj(o,n[1])},parsePublicPKCS8Hex:function(q){var o={};o.algparam=null;var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=2){throw"outer DERSequence shall have 2 elements: "+p.length}var r=p[0];if(q.substr(r,2)!="30"){throw"malformed PKCS8 public key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(q,r);if(n.length!=2){throw"malformed PKCS8 public key(code:002)"}if(q.substr(n[0],2)!="06"){throw"malformed PKCS8 public key(code:003)"}o.algoid=ASN1HEX.getHexOfV_AtObj(q,n[0]);if(q.substr(n[1],2)=="06"){o.algparam=ASN1HEX.getHexOfV_AtObj(q,n[1])}if(q.substr(p[1],2)!="03"){throw"malformed PKCS8 public key(code:004)"}o.key=ASN1HEX.getHexOfV_AtObj(q,p[1]).substr(2);return o},getRSAKeyFromPublicPKCS8Hex:function(r){var q=ASN1HEX.getPosArrayOfChildren_AtObj(r,0);if(q.length!=2){throw"outer DERSequence shall have 2 elements: "+q.length}var p=ASN1HEX.getHexOfTLV_AtObj(r,q[0]);if(p!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmId is not rsaEncryption"}if(r.substr(q[1],2)!="03"){throw"PKCS8 Public Key is not BITSTRING encapslated."}var t=ASN1HEX.getStartPosOfV_AtObj(r,q[1])+2;if(r.substr(t,2)!="30"){throw"PKCS8 Public Key is not SEQUENCE."}var n=ASN1HEX.getPosArrayOfChildren_AtObj(r,t);if(n.length!=2){throw"inner DERSequence shall have 2 elements: "+n.length}if(r.substr(n[0],2)!="02"){throw"N is not ASN.1 INTEGER"}if(r.substr(n[1],2)!="02"){throw"E is not ASN.1 INTEGER"}var u=ASN1HEX.getHexOfV_AtObj(r,n[0]);var s=ASN1HEX.getHexOfV_AtObj(r,n[1]);var o=new RSAKey();o.setPublic(u,s);return o},}}();
/*! keyutil-1.0.12.js (c) 2013-2015 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
var KEYUTIL=function(){var d=function(p,r,q){return k(CryptoJS.AES,p,r,q)};var e=function(p,r,q){return k(CryptoJS.TripleDES,p,r,q)};var a=function(p,r,q){return k(CryptoJS.DES,p,r,q)};var k=function(s,x,u,q){var r=CryptoJS.enc.Hex.parse(x);var w=CryptoJS.enc.Hex.parse(u);var p=CryptoJS.enc.Hex.parse(q);var t={};t.key=w;t.iv=p;t.ciphertext=r;var v=s.decrypt(t,w,{iv:p});return CryptoJS.enc.Hex.stringify(v)};var l=function(p,r,q){return g(CryptoJS.AES,p,r,q)};var o=function(p,r,q){return g(CryptoJS.TripleDES,p,r,q)};var f=function(p,r,q){return g(CryptoJS.DES,p,r,q)};var g=function(t,y,v,q){var s=CryptoJS.enc.Hex.parse(y);var x=CryptoJS.enc.Hex.parse(v);var p=CryptoJS.enc.Hex.parse(q);var w=t.encrypt(s,x,{iv:p});var r=CryptoJS.enc.Hex.parse(w.toString());var u=CryptoJS.enc.Base64.stringify(r);return u};var i={"AES-256-CBC":{proc:d,eproc:l,keylen:32,ivlen:16},"AES-192-CBC":{proc:d,eproc:l,keylen:24,ivlen:16},"AES-128-CBC":{proc:d,eproc:l,keylen:16,ivlen:16},"DES-EDE3-CBC":{proc:e,eproc:o,keylen:24,ivlen:8},"DES-CBC":{proc:a,eproc:f,keylen:8,ivlen:8}};var c=function(p){return i[p]["proc"]};var m=function(p){var r=CryptoJS.lib.WordArray.random(p);var q=CryptoJS.enc.Hex.stringify(r);return q};var n=function(t){var u={};if(t.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))){u.cipher=RegExp.$1;u.ivsalt=RegExp.$2}if(t.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))){u.type=RegExp.$1}var r=-1;var v=0;if(t.indexOf("\r\n\r\n")!=-1){r=t.indexOf("\r\n\r\n");v=2}if(t.indexOf("\n\n")!=-1){r=t.indexOf("\n\n");v=1}var q=t.indexOf("-----END");if(r!=-1&&q!=-1){var p=t.substring(r+v*2,q-v);p=p.replace(/\s+/g,"");u.data=p}return u};var j=function(q,y,p){var v=p.substring(0,16);var t=CryptoJS.enc.Hex.parse(v);var r=CryptoJS.enc.Utf8.parse(y);var u=i[q]["keylen"]+i[q]["ivlen"];var x="";var w=null;for(;;){var s=CryptoJS.algo.MD5.create();if(w!=null){s.update(w)}s.update(r);s.update(t);w=s.finalize();x=x+CryptoJS.enc.Hex.stringify(w);if(x.length>=u*2){break}}var z={};z.keyhex=x.substr(0,i[q]["keylen"]*2);z.ivhex=x.substr(i[q]["keylen"]*2,i[q]["ivlen"]*2);return z};var b=function(p,v,r,w){var s=CryptoJS.enc.Base64.parse(p);var q=CryptoJS.enc.Hex.stringify(s);var u=i[v]["proc"];var t=u(q,r,w);return t};var h=function(p,s,q,u){var r=i[s]["eproc"];var t=r(p,q,u);return t};return{version:"1.0.0",getHexFromPEM:function(q,u){var r=q;if(r.indexOf("-----BEGIN ")==-1){throw"can't find PEM header: "+u}if(typeof u=="string"&&u!=""){r=r.replace("-----BEGIN "+u+"-----","");r=r.replace("-----END "+u+"-----","")}else{r=r.replace(/-----BEGIN [^-]+-----/,"");r=r.replace(/-----END [^-]+-----/,"")}var t=r.replace(/\s+/g,"");var p=b64tohex(t);return p},getDecryptedKeyHexByKeyIV:function(q,t,s,r){var p=c(t);return p(q,s,r)},parsePKCS5PEM:function(p){return n(p)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(q,p,r){return j(q,p,r)},decryptKeyB64:function(p,r,q,s){return b(p,r,q,s)},getDecryptedKeyHex:function(y,x){var q=n(y);var t=q.type;var r=q.cipher;var p=q.ivsalt;var s=q.data;var w=j(r,x,p);var v=w.keyhex;var u=b(s,r,v,p);return u},getRSAKeyFromEncryptedPKCS5PEM:function(r,q){var s=this.getDecryptedKeyHex(r,q);var p=new RSAKey();p.readPrivateKeyFromASN1HexString(s);return p},getEncryptedPKCS5PEMFromPrvKeyHex:function(x,s,A,t,r){var p="";if(typeof t=="undefined"||t==null){t="AES-256-CBC"}if(typeof i[t]=="undefined"){throw"KEYUTIL unsupported algorithm: "+t}if(typeof r=="undefined"||r==null){var v=i[t]["ivlen"];var u=m(v);r=u.toUpperCase()}var z=j(t,A,r);var y=z.keyhex;var w=h(s,t,y,r);var q=w.replace(/(.{64})/g,"$1\r\n");var p="-----BEGIN "+x+" PRIVATE KEY-----\r\n";p+="Proc-Type: 4,ENCRYPTED\r\n";p+="DEK-Info: "+t+","+r+"\r\n";p+="\r\n";p+=q;p+="\r\n-----END "+x+" PRIVATE KEY-----\r\n";return p},getEncryptedPKCS5PEMFromRSAKey:function(D,E,r,t){var B=new KJUR.asn1.DERInteger({"int":0});var w=new KJUR.asn1.DERInteger({bigint:D.n});var A=new KJUR.asn1.DERInteger({"int":D.e});var C=new KJUR.asn1.DERInteger({bigint:D.d});var u=new KJUR.asn1.DERInteger({bigint:D.p});var s=new KJUR.asn1.DERInteger({bigint:D.q});var z=new KJUR.asn1.DERInteger({bigint:D.dmp1});var v=new KJUR.asn1.DERInteger({bigint:D.dmq1});var y=new KJUR.asn1.DERInteger({bigint:D.coeff});var F=new KJUR.asn1.DERSequence({array:[B,w,A,C,u,s,z,v,y]});var x=F.getEncodedHex();return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",x,E,r,t)},newEncryptedPKCS5PEM:function(p,q,t,u){if(typeof q=="undefined"||q==null){q=1024}if(typeof t=="undefined"||t==null){t="10001"}var r=new RSAKey();r.generate(q,t);var s=null;if(typeof u=="undefined"||u==null){s=this.getEncryptedPKCS5PEMFromRSAKey(r,p)}else{s=this.getEncryptedPKCS5PEMFromRSAKey(r,p,u)}return s},getRSAKeyFromPlainPKCS8PEM:function(r){if(r.match(/ENCRYPTED/)){throw"pem shall be not ENCRYPTED"}var q=this.getHexFromPEM(r,"PRIVATE KEY");var p=this.getRSAKeyFromPlainPKCS8Hex(q);return p},getRSAKeyFromPlainPKCS8Hex:function(s){var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=3){throw"outer DERSequence shall have 3 elements: "+r.length}var q=ASN1HEX.getHexOfTLV_AtObj(s,r[1]);if(q!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+q}var q=ASN1HEX.getHexOfTLV_AtObj(s,r[1]);var t=ASN1HEX.getHexOfTLV_AtObj(s,r[2]);var u=ASN1HEX.getHexOfV_AtObj(t,0);var p=new RSAKey();p.readPrivateKeyFromASN1HexString(u);return p},parseHexOfEncryptedPKCS8:function(w){var s={};var r=ASN1HEX.getPosArrayOfChildren_AtObj(w,0);if(r.length!=2){throw"malformed format: SEQUENCE(0).items != 2: "+r.length}s.ciphertext=ASN1HEX.getHexOfV_AtObj(w,r[1]);var y=ASN1HEX.getPosArrayOfChildren_AtObj(w,r[0]);if(y.length!=2){throw"malformed format: SEQUENCE(0.0).items != 2: "+y.length}if(ASN1HEX.getHexOfV_AtObj(w,y[0])!="2a864886f70d01050d"){throw"this only supports pkcs5PBES2"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(w,y[1]);if(y.length!=2){throw"malformed format: SEQUENCE(0.0.1).items != 2: "+p.length}var q=ASN1HEX.getPosArrayOfChildren_AtObj(w,p[1]);if(q.length!=2){throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+q.length}if(ASN1HEX.getHexOfV_AtObj(w,q[0])!="2a864886f70d0307"){throw"this only supports TripleDES"}s.encryptionSchemeAlg="TripleDES";s.encryptionSchemeIV=ASN1HEX.getHexOfV_AtObj(w,q[1]);var t=ASN1HEX.getPosArrayOfChildren_AtObj(w,p[0]);if(t.length!=2){throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+t.length}if(ASN1HEX.getHexOfV_AtObj(w,t[0])!="2a864886f70d01050c"){throw"this only supports pkcs5PBKDF2"}var x=ASN1HEX.getPosArrayOfChildren_AtObj(w,t[1]);if(x.length<2){throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+x.length}s.pbkdf2Salt=ASN1HEX.getHexOfV_AtObj(w,x[0]);var u=ASN1HEX.getHexOfV_AtObj(w,x[1]);try{s.pbkdf2Iter=parseInt(u,16)}catch(v){throw"malformed format pbkdf2Iter: "+u}return s},getPBKDF2KeyHexFromParam:function(u,p){var t=CryptoJS.enc.Hex.parse(u.pbkdf2Salt);var q=u.pbkdf2Iter;var s=CryptoJS.PBKDF2(p,t,{keySize:192/32,iterations:q});var r=CryptoJS.enc.Hex.stringify(s);return r},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(x,y){var r=this.getHexFromPEM(x,"ENCRYPTED PRIVATE KEY");var p=this.parseHexOfEncryptedPKCS8(r);var u=KEYUTIL.getPBKDF2KeyHexFromParam(p,y);var v={};v.ciphertext=CryptoJS.enc.Hex.parse(p.ciphertext);var t=CryptoJS.enc.Hex.parse(u);var s=CryptoJS.enc.Hex.parse(p.encryptionSchemeIV);var w=CryptoJS.TripleDES.decrypt(v,t,{iv:s});var q=CryptoJS.enc.Hex.stringify(w);return q},getRSAKeyFromEncryptedPKCS8PEM:function(s,r){var q=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s,r);var p=this.getRSAKeyFromPlainPKCS8Hex(q);return p},getKeyFromEncryptedPKCS8PEM:function(s,q){var p=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s,q);var r=this.getKeyFromPlainPrivatePKCS8Hex(p);return r},parsePlainPrivatePKCS8Hex:function(s){var q={};q.algparam=null;if(s.substr(0,2)!="30"){throw"malformed plain PKCS8 private key(code:001)"}var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=3){throw"malformed plain PKCS8 private key(code:002)"}if(s.substr(r[1],2)!="30"){throw"malformed PKCS8 private key(code:003)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(s,r[1]);if(p.length!=2){throw"malformed PKCS8 private key(code:004)"}if(s.substr(p[0],2)!="06"){throw"malformed PKCS8 private key(code:005)"}q.algoid=ASN1HEX.getHexOfV_AtObj(s,p[0]);if(s.substr(p[1],2)=="06"){q.algparam=ASN1HEX.getHexOfV_AtObj(s,p[1])}if(s.substr(r[2],2)!="04"){throw"malformed PKCS8 private key(code:006)"}q.keyidx=ASN1HEX.getStartPosOfV_AtObj(s,r[2]);return q},getKeyFromPlainPrivatePKCS8PEM:function(q){var p=this.getHexFromPEM(q,"PRIVATE KEY");var r=this.getKeyFromPlainPrivatePKCS8Hex(p);return r},getKeyFromPlainPrivatePKCS8Hex:function(p){var w=this.parsePlainPrivatePKCS8Hex(p);if(w.algoid=="2a864886f70d010101"){this.parsePrivateRawRSAKeyHexAtObj(p,w);var u=w.key;var z=new RSAKey();z.setPrivateEx(u.n,u.e,u.d,u.p,u.q,u.dp,u.dq,u.co);return z}else{if(w.algoid=="2a8648ce3d0201"){this.parsePrivateRawECKeyHexAtObj(p,w);if(KJUR.crypto.OID.oidhex2name[w.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+w.algparam}var v=KJUR.crypto.OID.oidhex2name[w.algparam];var z=new KJUR.crypto.ECDSA({curve:v});z.setPublicKeyHex(w.pubkey);z.setPrivateKeyHex(w.key);z.isPublic=false;return z}else{if(w.algoid=="2a8648ce380401"){var t=ASN1HEX.getVbyList(p,0,[1,1,0],"02");var s=ASN1HEX.getVbyList(p,0,[1,1,1],"02");var y=ASN1HEX.getVbyList(p,0,[1,1,2],"02");var B=ASN1HEX.getVbyList(p,0,[2,0],"02");var r=new BigInteger(t,16);var q=new BigInteger(s,16);var x=new BigInteger(y,16);var A=new BigInteger(B,16);var z=new KJUR.crypto.DSA();z.setPrivate(r,q,x,null,A);return z}else{throw"unsupported private key algorithm"}}}},getRSAKeyFromPublicPKCS8PEM:function(q){var r=this.getHexFromPEM(q,"PUBLIC KEY");var p=this.getRSAKeyFromPublicPKCS8Hex(r);return p},getKeyFromPublicPKCS8PEM:function(q){var r=this.getHexFromPEM(q,"PUBLIC KEY");var p=this.getKeyFromPublicPKCS8Hex(r);return p},getKeyFromPublicPKCS8Hex:function(q){var p=this.parsePublicPKCS8Hex(q);if(p.algoid=="2a864886f70d010101"){var u=this.parsePublicRawRSAKeyHex(p.key);var r=new RSAKey();r.setPublic(u.n,u.e);return r}else{if(p.algoid=="2a8648ce3d0201"){if(KJUR.crypto.OID.oidhex2name[p.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+p.algparam}var s=KJUR.crypto.OID.oidhex2name[p.algparam];var r=new KJUR.crypto.ECDSA({curve:s,pub:p.key});return r}else{if(p.algoid=="2a8648ce380401"){var t=p.algparam;var v=ASN1HEX.getHexOfV_AtObj(p.key,0);var r=new KJUR.crypto.DSA();r.setPublic(new BigInteger(t.p,16),new BigInteger(t.q,16),new BigInteger(t.g,16),new BigInteger(v,16));return r}else{throw"unsupported public key algorithm"}}}},parsePublicRawRSAKeyHex:function(r){var p={};if(r.substr(0,2)!="30"){throw"malformed RSA key(code:001)"}var q=ASN1HEX.getPosArrayOfChildren_AtObj(r,0);if(q.length!=2){throw"malformed RSA key(code:002)"}if(r.substr(q[0],2)!="02"){throw"malformed RSA key(code:003)"}p.n=ASN1HEX.getHexOfV_AtObj(r,q[0]);if(r.substr(q[1],2)!="02"){throw"malformed RSA key(code:004)"}p.e=ASN1HEX.getHexOfV_AtObj(r,q[1]);return p},parsePrivateRawRSAKeyHexAtObj:function(q,s){var r=s.keyidx;if(q.substr(r,2)!="30"){throw"malformed RSA private key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,r);if(p.length!=9){throw"malformed RSA private key(code:002)"}s.key={};s.key.n=ASN1HEX.getHexOfV_AtObj(q,p[1]);s.key.e=ASN1HEX.getHexOfV_AtObj(q,p[2]);s.key.d=ASN1HEX.getHexOfV_AtObj(q,p[3]);s.key.p=ASN1HEX.getHexOfV_AtObj(q,p[4]);s.key.q=ASN1HEX.getHexOfV_AtObj(q,p[5]);s.key.dp=ASN1HEX.getHexOfV_AtObj(q,p[6]);s.key.dq=ASN1HEX.getHexOfV_AtObj(q,p[7]);s.key.co=ASN1HEX.getHexOfV_AtObj(q,p[8])},parsePrivateRawECKeyHexAtObj:function(p,t){var q=t.keyidx;var r=ASN1HEX.getVbyList(p,q,[1],"04");var s=ASN1HEX.getVbyList(p,q,[2,0],"03").substr(2);t.key=r;t.pubkey=s},parsePublicPKCS8Hex:function(s){var q={};q.algparam=null;var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=2){throw"outer DERSequence shall have 2 elements: "+r.length}var t=r[0];if(s.substr(t,2)!="30"){throw"malformed PKCS8 public key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(s,t);if(p.length!=2){throw"malformed PKCS8 public key(code:002)"}if(s.substr(p[0],2)!="06"){throw"malformed PKCS8 public key(code:003)"}q.algoid=ASN1HEX.getHexOfV_AtObj(s,p[0]);if(s.substr(p[1],2)=="06"){q.algparam=ASN1HEX.getHexOfV_AtObj(s,p[1])}else{if(s.substr(p[1],2)=="30"){q.algparam={};q.algparam.p=ASN1HEX.getVbyList(s,p[1],[0],"02");q.algparam.q=ASN1HEX.getVbyList(s,p[1],[1],"02");q.algparam.g=ASN1HEX.getVbyList(s,p[1],[2],"02")}}if(s.substr(r[1],2)!="03"){throw"malformed PKCS8 public key(code:004)"}q.key=ASN1HEX.getHexOfV_AtObj(s,r[1]).substr(2);return q},getRSAKeyFromPublicPKCS8Hex:function(t){var s=ASN1HEX.getPosArrayOfChildren_AtObj(t,0);if(s.length!=2){throw"outer DERSequence shall have 2 elements: "+s.length}var r=ASN1HEX.getHexOfTLV_AtObj(t,s[0]);if(r!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmId is not rsaEncryption"}if(t.substr(s[1],2)!="03"){throw"PKCS8 Public Key is not BITSTRING encapslated."}var v=ASN1HEX.getStartPosOfV_AtObj(t,s[1])+2;if(t.substr(v,2)!="30"){throw"PKCS8 Public Key is not SEQUENCE."}var p=ASN1HEX.getPosArrayOfChildren_AtObj(t,v);if(p.length!=2){throw"inner DERSequence shall have 2 elements: "+p.length}if(t.substr(p[0],2)!="02"){throw"N is not ASN.1 INTEGER"}if(t.substr(p[1],2)!="02"){throw"E is not ASN.1 INTEGER"}var w=ASN1HEX.getHexOfV_AtObj(t,p[0]);var u=ASN1HEX.getHexOfV_AtObj(t,p[1]);var q=new RSAKey();q.setPublic(w,u);return q},}}();KEYUTIL.getKey=function(f,e,h){if(typeof RSAKey!="undefined"&&f instanceof RSAKey){return f}if(typeof KJUR.crypto.ECDSA!="undefined"&&f instanceof KJUR.crypto.ECDSA){return f}if(typeof KJUR.crypto.DSA!="undefined"&&f instanceof KJUR.crypto.DSA){return f}if(f.curve!==undefined&&f.xy!==undefined&&f.d===undefined){return new KJUR.crypto.ECDSA({pub:f.xy,curve:f.curve})}if(f.curve!==undefined&&f.d!==undefined){return new KJUR.crypto.ECDSA({prv:f.d,curve:f.curve})}if(f.kty===undefined&&f.n!==undefined&&f.e!==undefined&&f.d===undefined){var w=new RSAKey();w.setPublic(f.n,f.e);return w}if(f.kty===undefined&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined&&f.p!==undefined&&f.q!==undefined&&f.dp!==undefined&&f.dq!==undefined&&f.co!==undefined&&f.qi===undefined){var w=new RSAKey();w.setPrivateEx(f.n,f.e,f.d,f.p,f.q,f.dp,f.dq,f.co);return w}if(f.kty===undefined&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined&&f.p===undefined){var w=new RSAKey();w.setPrivate(f.n,f.e,f.d);return w}if(f.p!==undefined&&f.q!==undefined&&f.g!==undefined&&f.y!==undefined&&f.x===undefined){var w=new KJUR.crypto.DSA();w.setPublic(f.p,f.q,f.g,f.y);return w}if(f.p!==undefined&&f.q!==undefined&&f.g!==undefined&&f.y!==undefined&&f.x!==undefined){var w=new KJUR.crypto.DSA();w.setPrivate(f.p,f.q,f.g,f.y,f.x);return w}if(f.kty==="RSA"&&f.n!==undefined&&f.e!==undefined&&f.d===undefined){var w=new RSAKey();w.setPublic(b64utohex(f.n),b64utohex(f.e));return w}if(f.kty==="RSA"&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined&&f.p!==undefined&&f.q!==undefined&&f.dp!==undefined&&f.dq!==undefined&&f.qi!==undefined){var w=new RSAKey();w.setPrivateEx(b64utohex(f.n),b64utohex(f.e),b64utohex(f.d),b64utohex(f.p),b64utohex(f.q),b64utohex(f.dp),b64utohex(f.dq),b64utohex(f.qi));return w}if(f.kty==="RSA"&&f.n!==undefined&&f.e!==undefined&&f.d!==undefined){var w=new RSAKey();w.setPrivate(b64utohex(f.n),b64utohex(f.e),b64utohex(f.d));return w}if(f.kty==="EC"&&f.crv!==undefined&&f.x!==undefined&&f.y!==undefined&&f.d===undefined){var d=new KJUR.crypto.ECDSA({curve:f.crv});var l=d.ecparams.keylen/4;var r=("0000000000"+b64utohex(f.x)).slice(-l);var n=("0000000000"+b64utohex(f.y)).slice(-l);var m="04"+r+n;d.setPublicKeyHex(m);return d}if(f.kty==="EC"&&f.crv!==undefined&&f.x!==undefined&&f.y!==undefined&&f.d!==undefined){var d=new KJUR.crypto.ECDSA({curve:f.crv});var l=d.ecparams.keylen/4;var a=("0000000000"+b64utohex(f.d)).slice(-l);d.setPrivateKeyHex(a);return d}if(f.indexOf("-END CERTIFICATE-",0)!=-1||f.indexOf("-END X509 CERTIFICATE-",0)!=-1||f.indexOf("-END TRUSTED CERTIFICATE-",0)!=-1){return X509.getPublicKeyFromCertPEM(f)}if(h==="pkcs8pub"){return KEYUTIL.getKeyFromPublicPKCS8Hex(f)}if(f.indexOf("-END PUBLIC KEY-")!=-1){return KEYUTIL.getKeyFromPublicPKCS8PEM(f)}if(h==="pkcs5prv"){var w=new RSAKey();w.readPrivateKeyFromASN1HexString(f);return w}if(h==="pkcs5prv"){var w=new RSAKey();w.readPrivateKeyFromASN1HexString(f);return w}if(f.indexOf("-END RSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")==-1){var i=KEYUTIL.getHexFromPEM(f,"RSA PRIVATE KEY");return KEYUTIL.getKey(i,null,"pkcs5prv")}if(f.indexOf("-END DSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")==-1){var u=this.getHexFromPEM(f,"DSA PRIVATE KEY");var t=ASN1HEX.getVbyList(u,0,[1],"02");var s=ASN1HEX.getVbyList(u,0,[2],"02");var v=ASN1HEX.getVbyList(u,0,[3],"02");var j=ASN1HEX.getVbyList(u,0,[4],"02");var k=ASN1HEX.getVbyList(u,0,[5],"02");var w=new KJUR.crypto.DSA();w.setPrivate(new BigInteger(t,16),new BigInteger(s,16),new BigInteger(v,16),new BigInteger(j,16),new BigInteger(k,16));return w}if(f.indexOf("-END PRIVATE KEY-")!=-1){return KEYUTIL.getKeyFromPlainPrivatePKCS8PEM(f)}if(f.indexOf("-END RSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")!=-1){return KEYUTIL.getRSAKeyFromEncryptedPKCS5PEM(f,e)}if(f.indexOf("-END EC PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")!=-1){var u=KEYUTIL.getDecryptedKeyHex(f,e);var w=ASN1HEX.getVbyList(u,0,[1],"04");var c=ASN1HEX.getVbyList(u,0,[2,0],"06");var o=ASN1HEX.getVbyList(u,0,[3,0],"03").substr(2);var b="";if(KJUR.crypto.OID.oidhex2name[c]!==undefined){b=KJUR.crypto.OID.oidhex2name[c]}else{throw"undefined OID(hex) in KJUR.crypto.OID: "+c}var d=new KJUR.crypto.ECDSA({name:b});d.setPublicKeyHex(o);d.setPrivateKeyHex(w);d.isPublic=false;return d}if(f.indexOf("-END DSA PRIVATE KEY-")!=-1&&f.indexOf("4,ENCRYPTED")!=-1){var u=KEYUTIL.getDecryptedKeyHex(f,e);var t=ASN1HEX.getVbyList(u,0,[1],"02");var s=ASN1HEX.getVbyList(u,0,[2],"02");var v=ASN1HEX.getVbyList(u,0,[3],"02");var j=ASN1HEX.getVbyList(u,0,[4],"02");var k=ASN1HEX.getVbyList(u,0,[5],"02");var w=new KJUR.crypto.DSA();w.setPrivate(new BigInteger(t,16),new BigInteger(s,16),new BigInteger(v,16),new BigInteger(j,16),new BigInteger(k,16));return w}if(f.indexOf("-END ENCRYPTED PRIVATE KEY-")!=-1){return KEYUTIL.getKeyFromEncryptedPKCS8PEM(f,e)}throw"not supported argument"};KEYUTIL.generateKeypair=function(a,c){if(a=="RSA"){var b=c;var h=new RSAKey();h.generate(b,"10001");h.isPrivate=true;h.isPublic=true;var f=new RSAKey();var e=h.n.toString(16);var i=h.e.toString(16);f.setPublic(e,i);f.isPrivate=false;f.isPublic=true;var k={};k.prvKeyObj=h;k.pubKeyObj=f;return k}else{if(a=="EC"){var d=c;var g=new KJUR.crypto.ECDSA({curve:d});var j=g.generateKeyPairHex();var h=new KJUR.crypto.ECDSA({curve:d});h.setPrivateKeyHex(j.ecprvhex);h.isPrivate=true;h.isPublic=false;var f=new KJUR.crypto.ECDSA({curve:d});f.setPublicKeyHex(j.ecpubhex);f.isPrivate=false;f.isPublic=true;var k={};k.prvKeyObj=h;k.pubKeyObj=f;return k}else{throw"unknown algorithm: "+a}}};KEYUTIL.getPEM=function(a,r,o,g,j){var v=KJUR.asn1;var u=KJUR.crypto;function p(s){var w=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{"int":{bigint:s.n}},{"int":s.e},{"int":{bigint:s.d}},{"int":{bigint:s.p}},{"int":{bigint:s.q}},{"int":{bigint:s.dmp1}},{"int":{bigint:s.dmq1}},{"int":{bigint:s.coeff}}]});return w}function q(w){var s=KJUR.asn1.ASN1Util.newObject({seq:[{"int":1},{octstr:{hex:w.prvKeyHex}},{tag:["a0",true,{oid:{name:w.curveName}}]},{tag:["a1",true,{bitstr:{hex:"00"+w.pubKeyHex}}]}]});return s}function n(s){var w=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{"int":{bigint:s.p}},{"int":{bigint:s.q}},{"int":{bigint:s.g}},{"int":{bigint:s.y}},{"int":{bigint:s.x}}]});return w}if(((typeof RSAKey!="undefined"&&a instanceof RSAKey)||(typeof u.DSA!="undefined"&&a instanceof u.DSA)||(typeof u.ECDSA!="undefined"&&a instanceof u.ECDSA))&&a.isPublic==true&&(r===undefined||r=="PKCS8PUB")){var t=new KJUR.asn1.x509.SubjectPublicKeyInfo(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"PUBLIC KEY")}if(r=="PKCS1PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&(o===undefined||o==null)&&a.isPrivate==true){var t=p(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"RSA PRIVATE KEY")}if(r=="PKCS1PRV"&&typeof RSAKey!="undefined"&&a instanceof KJUR.crypto.ECDSA&&(o===undefined||o==null)&&a.isPrivate==true){var f=new KJUR.asn1.DERObjectIdentifier({name:a.curveName});var l=f.getEncodedHex();var e=q(a);var k=e.getEncodedHex();var i="";i+=v.ASN1Util.getPEMStringFromHex(l,"EC PARAMETERS");i+=v.ASN1Util.getPEMStringFromHex(k,"EC PRIVATE KEY");return i}if(r=="PKCS1PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&(o===undefined||o==null)&&a.isPrivate==true){var t=n(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"DSA PRIVATE KEY")}if(r=="PKCS5PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=p(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",m,o,g)}if(r=="PKCS5PRV"&&typeof KJUR.crypto.ECDSA!="undefined"&&a instanceof KJUR.crypto.ECDSA&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=q(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("EC",m,o,g)}if(r=="PKCS5PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=n(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA",m,o,g)}var h=function(w,s){var y=b(w,s);var x=new KJUR.asn1.ASN1Util.newObject({seq:[{seq:[{oid:{name:"pkcs5PBES2"}},{seq:[{seq:[{oid:{name:"pkcs5PBKDF2"}},{seq:[{octstr:{hex:y.pbkdf2Salt}},{"int":y.pbkdf2Iter}]}]},{seq:[{oid:{name:"des-EDE3-CBC"}},{octstr:{hex:y.encryptionSchemeIV}}]}]}]},{octstr:{hex:y.ciphertext}}]});return x.getEncodedHex()};var b=function(D,E){var x=100;var C=CryptoJS.lib.WordArray.random(8);var B="DES-EDE3-CBC";var s=CryptoJS.lib.WordArray.random(8);var y=CryptoJS.PBKDF2(E,C,{keySize:192/32,iterations:x});var z=CryptoJS.enc.Hex.parse(D);var A=CryptoJS.TripleDES.encrypt(z,y,{iv:s})+"";var w={};w.ciphertext=A;w.pbkdf2Salt=CryptoJS.enc.Hex.stringify(C);w.pbkdf2Iter=x;w.encryptionSchemeAlg=B;w.encryptionSchemeIV=CryptoJS.enc.Hex.stringify(s);return w};if(r=="PKCS8PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&a.isPrivate==true){var d=p(a);var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"rsaEncryption"}},{"null":true}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}if(r=="PKCS8PRV"&&typeof KJUR.crypto.ECDSA!="undefined"&&a instanceof KJUR.crypto.ECDSA&&a.isPrivate==true){var d=new KJUR.asn1.ASN1Util.newObject({seq:[{"int":1},{octstr:{hex:a.prvKeyHex}},{tag:["a1",true,{bitstr:{hex:"00"+a.pubKeyHex}}]}]});var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"ecPublicKey"}},{oid:{name:a.curveName}}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}if(r=="PKCS8PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&a.isPrivate==true){var d=new KJUR.asn1.DERInteger({bigint:a.x});var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"dsa"}},{seq:[{"int":{bigint:a.p}},{"int":{bigint:a.q}},{"int":{bigint:a.g}}]}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}throw"unsupported object nor format"};KEYUTIL.getKeyFromCSRPEM=function(b){var a=KEYUTIL.getHexFromPEM(b,"CERTIFICATE REQUEST");var c=KEYUTIL.getKeyFromCSRHex(a);return c};KEYUTIL.getKeyFromCSRHex=function(a){var c=KEYUTIL.parseCSRHex(a);var b=KEYUTIL.getKey(c.p8pubkeyhex,null,"pkcs8pub");return b};KEYUTIL.parseCSRHex=function(c){var b={};var e=c;if(e.substr(0,2)!="30"){throw"malformed CSR(code:001)"}var d=ASN1HEX.getPosArrayOfChildren_AtObj(e,0);if(d.length<1){throw"malformed CSR(code:002)"}if(e.substr(d[0],2)!="30"){throw"malformed CSR(code:003)"}var a=ASN1HEX.getPosArrayOfChildren_AtObj(e,d[0]);if(a.length<3){throw"malformed CSR(code:004)"}b.p8pubkeyhex=ASN1HEX.getHexOfTLV_AtObj(e,a[2]);return b};
/*! rsapem-1.1.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
function _rsapem_pemToBase64(b){var a=b;a=a.replace("-----BEGIN RSA PRIVATE KEY-----","");a=a.replace("-----END RSA PRIVATE KEY-----","");a=a.replace(/[ \n]+/g,"");return a}function _rsapem_getPosArrayOfChildrenFromHex(d){var j=new Array();var k=ASN1HEX.getStartPosOfV_AtObj(d,0);var f=ASN1HEX.getPosOfNextSibling_AtObj(d,k);var h=ASN1HEX.getPosOfNextSibling_AtObj(d,f);var b=ASN1HEX.getPosOfNextSibling_AtObj(d,h);var l=ASN1HEX.getPosOfNextSibling_AtObj(d,b);var e=ASN1HEX.getPosOfNextSibling_AtObj(d,l);var g=ASN1HEX.getPosOfNextSibling_AtObj(d,e);var c=ASN1HEX.getPosOfNextSibling_AtObj(d,g);var i=ASN1HEX.getPosOfNextSibling_AtObj(d,c);j.push(k,f,h,b,l,e,g,c,i);return j}function _rsapem_getHexValueArrayOfChildrenFromHex(i){var o=_rsapem_getPosArrayOfChildrenFromHex(i);var r=ASN1HEX.getHexOfV_AtObj(i,o[0]);var f=ASN1HEX.getHexOfV_AtObj(i,o[1]);var j=ASN1HEX.getHexOfV_AtObj(i,o[2]);var k=ASN1HEX.getHexOfV_AtObj(i,o[3]);var c=ASN1HEX.getHexOfV_AtObj(i,o[4]);var b=ASN1HEX.getHexOfV_AtObj(i,o[5]);var h=ASN1HEX.getHexOfV_AtObj(i,o[6]);var g=ASN1HEX.getHexOfV_AtObj(i,o[7]);var l=ASN1HEX.getHexOfV_AtObj(i,o[8]);var m=new Array();m.push(r,f,j,k,c,b,h,g,l);return m}function _rsapem_readPrivateKeyFromASN1HexString(c){var b=_rsapem_getHexValueArrayOfChildrenFromHex(c);this.setPrivateEx(b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8])}function _rsapem_readPrivateKeyFromPEMString(e){var c=_rsapem_pemToBase64(e);var d=b64tohex(c);var b=_rsapem_getHexValueArrayOfChildrenFromHex(d);this.setPrivateEx(b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8])}RSAKey.prototype.readPrivateKeyFromPEMString=_rsapem_readPrivateKeyFromPEMString;RSAKey.prototype.readPrivateKeyFromASN1HexString=_rsapem_readPrivateKeyFromASN1HexString;
/*! rsasign-1.2.7.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
var _RE_HEXDECONLY=new RegExp("");_RE_HEXDECONLY.compile("[^0-9a-f]","gi");function _rsasign_getHexPaddedDigestInfoForString(d,e,a){var b=function(f){return KJUR.crypto.Util.hashString(f,a)};var c=b(d);return KJUR.crypto.Util.getPaddedDigestInfoHex(c,a,e)}function _zeroPaddingOfSignature(e,d){var c="";var a=d/4-e.length;for(var b=0;b>24,(d&16711680)>>16,(d&65280)>>8,d&255]))));d+=1}return b}function _rsasign_signStringPSS(e,a,d){var c=function(f){return KJUR.crypto.Util.hashHex(f,a)};var b=c(rstrtohex(e));if(d===undefined){d=-1}return this.signWithMessageHashPSS(b,a,d)}function _rsasign_signWithMessageHashPSS(l,a,k){var b=hextorstr(l);var g=b.length;var m=this.n.bitLength()-1;var c=Math.ceil(m/8);var d;var o=function(i){return KJUR.crypto.Util.hashHex(i,a)};if(k===-1||k===undefined){k=g}else{if(k===-2){k=c-g-2}else{if(k<-2){throw"invalid salt length"}}}if(c<(g+k+2)){throw"data too long"}var f="";if(k>0){f=new Array(k);new SecureRandom().nextBytes(f);f=String.fromCharCode.apply(String,f)}var n=hextorstr(o(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00"+b+f)));var j=[];for(d=0;d>(8*c-m))&255;q[0]&=~p;for(d=0;dthis.n.bitLength()){return 0}var i=this.doPublic(b);var e=i.toString(16).replace(/^1f+00/,"");var g=_rsasign_getAlgNameAndHashFromHexDisgestInfo(e);if(g.length==0){return false}var d=g[0];var h=g[1];var a=function(k){return KJUR.crypto.Util.hashString(k,d)};var c=a(f);return(h==c)}function _rsasign_verifyWithMessageHash(e,a){a=a.replace(_RE_HEXDECONLY,"");a=a.replace(/[ \n]+/g,"");var b=parseBigInt(a,16);if(b.bitLength()>this.n.bitLength()){return 0}var h=this.doPublic(b);var g=h.toString(16).replace(/^1f+00/,"");var c=_rsasign_getAlgNameAndHashFromHexDisgestInfo(g);if(c.length==0){return false}var d=c[0];var f=c[1];return(f==e)}function _rsasign_verifyStringPSS(c,b,a,f){var e=function(g){return KJUR.crypto.Util.hashHex(g,a)};var d=e(rstrtohex(c));if(f===undefined){f=-1}return this.verifyWithMessageHashPSS(d,b,a,f)}function _rsasign_verifyWithMessageHashPSS(f,s,l,c){var k=new BigInteger(s,16);if(k.bitLength()>this.n.bitLength()){return false}var r=function(i){return KJUR.crypto.Util.hashHex(i,l)};var j=hextorstr(f);var h=j.length;var g=this.n.bitLength()-1;var m=Math.ceil(g/8);var q;if(c===-1||c===undefined){c=h}else{if(c===-2){c=m-h-2}else{if(c<-2){throw"invalid salt length"}}}if(m<(h+c+2)){throw"data too long"}var a=this.doPublic(k).toByteArray();for(q=0;q>(8*m-g))&255;if((d.charCodeAt(0)&p)!==0){throw"bits beyond keysize not zero"}var n=pss_mgf1_str(e,d.length,r);var o=[];for(q=0;q0){var c=":"+j.join(":")+":";if(c.indexOf(":"+h+":")==-1){throw"algorithm '"+h+"' not accepted in the list"}}if(h!="none"&&t===null){throw"key shall be specified to verify."}if(typeof t=="string"&&t.indexOf("-----BEGIN ")!=-1){t=KEYUTIL.getKey(t)}if(s=="RS"||s=="PS"){if(!(t instanceof RSAKey)){throw"key shall be a RSAKey obj for RS* and PS* algs"}}if(s=="ES"){if(!(t instanceof KJUR.crypto.ECDSA)){throw"key shall be a ECDSA obj for ES* algs"}}if(h=="none"){}var n=null;if(m.jwsalg2sigalg[i.alg]===undefined){throw"unsupported alg name: "+h}else{n=m.jwsalg2sigalg[h]}if(n=="none"){throw"not supported"}else{if(n.substr(0,4)=="Hmac"){var k=null;if(t===undefined){throw"hexadecimal key shall be specified for HMAC"}var g=new KJUR.crypto.Mac({alg:n,pass:t});g.updateString(b);k=g.doFinal();return r==k}else{if(n.indexOf("withECDSA")!=-1){var f=null;try{f=KJUR.crypto.ECDSA.concatSigToASN1Sig(r)}catch(o){return false}var e=new KJUR.crypto.Signature({alg:n});e.init(t);e.updateString(b);return e.verify(f)}else{var e=new KJUR.crypto.Signature({alg:n});e.init(t);e.updateString(b);return e.verify(r)}}}};KJUR.jws.JWS.parse=function(g){var c=g.split(".");var b={};var f,e,d;if(c.length!=2&&c.length!=3){throw"malformed sJWS: wrong number of '.' splitted elements"}f=c[0];e=c[1];if(c.length==3){d=c[2]}b.headerObj=KJUR.jws.JWS.readSafeJSONString(b64utoutf8(f));b.payloadObj=KJUR.jws.JWS.readSafeJSONString(b64utoutf8(e));b.headerPP=JSON.stringify(b.headerObj,null," ");if(b.payloadObj==null){b.payloadPP=b64utoutf8(e)}else{b.payloadPP=JSON.stringify(b.payloadObj,null," ")}if(d!==undefined){b.sigHex=b64utohex(d)}return b};KJUR.jws.JWS.verifyJWT=function(d,j,l){var h=KJUR.jws.JWS;var i=d.split(".");var c=i[0];var g=i[1];var m=c+"."+g;var k=b64utohex(i[2]);var f=h.readSafeJSONString(b64utoutf8(c));var e=h.readSafeJSONString(b64utoutf8(g));if(f.alg===undefined){return false}if(l.alg===undefined){throw"acceptField.alg shall be specified"}if(!h.inArray(f.alg,l.alg)){return false}if(e.iss!==undefined&&typeof l.iss==="object"){if(!h.inArray(e.iss,l.iss)){return false}}if(e.sub!==undefined&&typeof l.sub==="object"){if(!h.inArray(e.sub,l.sub)){return false}}if(e.aud!==undefined&&typeof l.aud==="object"){if(typeof e.aud=="string"){if(!h.inArray(e.aud,l.aud)){return false}}else{if(typeof e.aud=="object"){if(!h.includedArray(e.aud,l.aud)){return false}}}}var b=KJUR.jws.IntDate.getNow();if(l.verifyAt!==undefined&&typeof l.verifyAt==="number"){b=l.verifyAt}if(l.gracePeriod===undefined||typeof l.gracePeriod!=="number"){l.gracePeriod=0}if(e.exp!==undefined&&typeof e.exp=="number"){if(e.exp+l.gracePeriod
* @license MIT
*/
/* eslint-disable no-proto */
'use strict'
var base64 = __webpack_require__(313)
var ieee754 = __webpack_require__(314)
var isArray = __webpack_require__(315)
exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
exports.INSPECT_MAX_BYTES = 50
Buffer.poolSize = 8192 // not used by this implementation
var rootParent = {}
/**
* If `Buffer.TYPED_ARRAY_SUPPORT`:
* === true Use Uint8Array implementation (fastest)
* === false Use Object implementation (most compatible, even IE6)
*
* Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
* Opera 11.6+, iOS 4.2+.
*
* Due to various browser bugs, sometimes the Object implementation will be used even
* when the browser supports typed arrays.
*
* Note:
*
* - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
* See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
*
* - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property
* on objects.
*
* - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
*
* - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
* incorrect length in some situations.
* We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
* get the Object implementation, which is slower but behaves correctly.
*/
Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
? global.TYPED_ARRAY_SUPPORT
: typedArraySupport()
function typedArraySupport () {
function Bar () {}
try {
var arr = new Uint8Array(1)
arr.foo = function () { return 42 }
arr.constructor = Bar
return arr.foo() === 42 && // typed array instances can be augmented
arr.constructor === Bar && // constructor can be set
typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
} catch (e) {
return false
}
}
function kMaxLength () {
return Buffer.TYPED_ARRAY_SUPPORT
? 0x7fffffff
: 0x3fffffff
}
/**
* Class: Buffer
* =============
*
* The Buffer constructor returns instances of `Uint8Array` that are augmented
* with function properties for all the node `Buffer` API functions. We use
* `Uint8Array` so that square bracket notation works as expected -- it returns
* a single octet.
*
* By augmenting the instances, we can avoid modifying the `Uint8Array`
* prototype.
*/
function Buffer (arg) {
if (!(this instanceof Buffer)) {
// Avoid going through an ArgumentsAdaptorTrampoline in the common case.
if (arguments.length > 1) return new Buffer(arg, arguments[1])
return new Buffer(arg)
}
if (!Buffer.TYPED_ARRAY_SUPPORT) {
this.length = 0
this.parent = undefined
}
// Common case.
if (typeof arg === 'number') {
return fromNumber(this, arg)
}
// Slightly less common case.
if (typeof arg === 'string') {
return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8')
}
// Unusual.
return fromObject(this, arg)
}
function fromNumber (that, length) {
that = allocate(that, length < 0 ? 0 : checked(length) | 0)
if (!Buffer.TYPED_ARRAY_SUPPORT) {
for (var i = 0; i < length; i++) {
that[i] = 0
}
}
return that
}
function fromString (that, string, encoding) {
if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8'
// Assumption: byteLength() return value is always < kMaxLength.
var length = byteLength(string, encoding) | 0
that = allocate(that, length)
that.write(string, encoding)
return that
}
function fromObject (that, object) {
if (Buffer.isBuffer(object)) return fromBuffer(that, object)
if (isArray(object)) return fromArray(that, object)
if (object == null) {
throw new TypeError('must start with number, buffer, array or string')
}
if (typeof ArrayBuffer !== 'undefined') {
if (object.buffer instanceof ArrayBuffer) {
return fromTypedArray(that, object)
}
if (object instanceof ArrayBuffer) {
return fromArrayBuffer(that, object)
}
}
if (object.length) return fromArrayLike(that, object)
return fromJsonObject(that, object)
}
function fromBuffer (that, buffer) {
var length = checked(buffer.length) | 0
that = allocate(that, length)
buffer.copy(that, 0, 0, length)
return that
}
function fromArray (that, array) {
var length = checked(array.length) | 0
that = allocate(that, length)
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
// Duplicate of fromArray() to keep fromArray() monomorphic.
function fromTypedArray (that, array) {
var length = checked(array.length) | 0
that = allocate(that, length)
// Truncating the elements is probably not what people expect from typed
// arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior
// of the old Buffer constructor.
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
function fromArrayBuffer (that, array) {
if (Buffer.TYPED_ARRAY_SUPPORT) {
// Return an augmented `Uint8Array` instance, for best performance
array.byteLength
that = Buffer._augment(new Uint8Array(array))
} else {
// Fallback: Return an object instance of the Buffer class
that = fromTypedArray(that, new Uint8Array(array))
}
return that
}
function fromArrayLike (that, array) {
var length = checked(array.length) | 0
that = allocate(that, length)
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object.
// Returns a zero-length buffer for inputs that don't conform to the spec.
function fromJsonObject (that, object) {
var array
var length = 0
if (object.type === 'Buffer' && isArray(object.data)) {
array = object.data
length = checked(array.length) | 0
}
that = allocate(that, length)
for (var i = 0; i < length; i += 1) {
that[i] = array[i] & 255
}
return that
}
if (Buffer.TYPED_ARRAY_SUPPORT) {
Buffer.prototype.__proto__ = Uint8Array.prototype
Buffer.__proto__ = Uint8Array
} else {
// pre-set for values that may exist in the future
Buffer.prototype.length = undefined
Buffer.prototype.parent = undefined
}
function allocate (that, length) {
if (Buffer.TYPED_ARRAY_SUPPORT) {
// Return an augmented `Uint8Array` instance, for best performance
that = Buffer._augment(new Uint8Array(length))
that.__proto__ = Buffer.prototype
} else {
// Fallback: Return an object instance of the Buffer class
that.length = length
that._isBuffer = true
}
var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1
if (fromPool) that.parent = rootParent
return that
}
function checked (length) {
// Note: cannot use `length < kMaxLength` here because that fails when
// length is NaN (which is otherwise coerced to zero.)
if (length >= kMaxLength()) {
throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
'size: 0x' + kMaxLength().toString(16) + ' bytes')
}
return length | 0
}
function SlowBuffer (subject, encoding) {
if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding)
var buf = new Buffer(subject, encoding)
delete buf.parent
return buf
}
Buffer.isBuffer = function isBuffer (b) {
return !!(b != null && b._isBuffer)
}
Buffer.compare = function compare (a, b) {
if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
throw new TypeError('Arguments must be Buffers')
}
if (a === b) return 0
var x = a.length
var y = b.length
var i = 0
var len = Math.min(x, y)
while (i < len) {
if (a[i] !== b[i]) break
++i
}
if (i !== len) {
x = a[i]
y = b[i]
}
if (x < y) return -1
if (y < x) return 1
return 0
}
Buffer.isEncoding = function isEncoding (encoding) {
switch (String(encoding).toLowerCase()) {
case 'hex':
case 'utf8':
case 'utf-8':
case 'ascii':
case 'binary':
case 'base64':
case 'raw':
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return true
default:
return false
}
}
Buffer.concat = function concat (list, length) {
if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.')
if (list.length === 0) {
return new Buffer(0)
}
var i
if (length === undefined) {
length = 0
for (i = 0; i < list.length; i++) {
length += list[i].length
}
}
var buf = new Buffer(length)
var pos = 0
for (i = 0; i < list.length; i++) {
var item = list[i]
item.copy(buf, pos)
pos += item.length
}
return buf
}
function byteLength (string, encoding) {
if (typeof string !== 'string') string = '' + string
var len = string.length
if (len === 0) return 0
// Use a for loop to avoid recursion
var loweredCase = false
for (;;) {
switch (encoding) {
case 'ascii':
case 'binary':
// Deprecated
case 'raw':
case 'raws':
return len
case 'utf8':
case 'utf-8':
return utf8ToBytes(string).length
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return len * 2
case 'hex':
return len >>> 1
case 'base64':
return base64ToBytes(string).length
default:
if (loweredCase) return utf8ToBytes(string).length // assume utf8
encoding = ('' + encoding).toLowerCase()
loweredCase = true
}
}
}
Buffer.byteLength = byteLength
function slowToString (encoding, start, end) {
var loweredCase = false
start = start | 0
end = end === undefined || end === Infinity ? this.length : end | 0
if (!encoding) encoding = 'utf8'
if (start < 0) start = 0
if (end > this.length) end = this.length
if (end <= start) return ''
while (true) {
switch (encoding) {
case 'hex':
return hexSlice(this, start, end)
case 'utf8':
case 'utf-8':
return utf8Slice(this, start, end)
case 'ascii':
return asciiSlice(this, start, end)
case 'binary':
return binarySlice(this, start, end)
case 'base64':
return base64Slice(this, start, end)
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return utf16leSlice(this, start, end)
default:
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
encoding = (encoding + '').toLowerCase()
loweredCase = true
}
}
}
Buffer.prototype.toString = function toString () {
var length = this.length | 0
if (length === 0) return ''
if (arguments.length === 0) return utf8Slice(this, 0, length)
return slowToString.apply(this, arguments)
}
Buffer.prototype.equals = function equals (b) {
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
if (this === b) return true
return Buffer.compare(this, b) === 0
}
Buffer.prototype.inspect = function inspect () {
var str = ''
var max = exports.INSPECT_MAX_BYTES
if (this.length > 0) {
str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
if (this.length > max) str += ' ... '
}
return ''
}
Buffer.prototype.compare = function compare (b) {
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
if (this === b) return 0
return Buffer.compare(this, b)
}
Buffer.prototype.indexOf = function indexOf (val, byteOffset) {
if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff
else if (byteOffset < -0x80000000) byteOffset = -0x80000000
byteOffset >>= 0
if (this.length === 0) return -1
if (byteOffset >= this.length) return -1
// Negative offsets start from the end of the buffer
if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0)
if (typeof val === 'string') {
if (val.length === 0) return -1 // special case: looking for empty string always fails
return String.prototype.indexOf.call(this, val, byteOffset)
}
if (Buffer.isBuffer(val)) {
return arrayIndexOf(this, val, byteOffset)
}
if (typeof val === 'number') {
if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {
return Uint8Array.prototype.indexOf.call(this, val, byteOffset)
}
return arrayIndexOf(this, [ val ], byteOffset)
}
function arrayIndexOf (arr, val, byteOffset) {
var foundIndex = -1
for (var i = 0; byteOffset + i < arr.length; i++) {
if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) {
if (foundIndex === -1) foundIndex = i
if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex
} else {
foundIndex = -1
}
}
return -1
}
throw new TypeError('val must be string, number or Buffer')
}
// `get` is deprecated
Buffer.prototype.get = function get (offset) {
console.log('.get() is deprecated. Access using array indexes instead.')
return this.readUInt8(offset)
}
// `set` is deprecated
Buffer.prototype.set = function set (v, offset) {
console.log('.set() is deprecated. Access using array indexes instead.')
return this.writeUInt8(v, offset)
}
function hexWrite (buf, string, offset, length) {
offset = Number(offset) || 0
var remaining = buf.length - offset
if (!length) {
length = remaining
} else {
length = Number(length)
if (length > remaining) {
length = remaining
}
}
// must be an even number of digits
var strLen = string.length
if (strLen % 2 !== 0) throw new Error('Invalid hex string')
if (length > strLen / 2) {
length = strLen / 2
}
for (var i = 0; i < length; i++) {
var parsed = parseInt(string.substr(i * 2, 2), 16)
if (isNaN(parsed)) throw new Error('Invalid hex string')
buf[offset + i] = parsed
}
return i
}
function utf8Write (buf, string, offset, length) {
return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
}
function asciiWrite (buf, string, offset, length) {
return blitBuffer(asciiToBytes(string), buf, offset, length)
}
function binaryWrite (buf, string, offset, length) {
return asciiWrite(buf, string, offset, length)
}
function base64Write (buf, string, offset, length) {
return blitBuffer(base64ToBytes(string), buf, offset, length)
}
function ucs2Write (buf, string, offset, length) {
return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
}
Buffer.prototype.write = function write (string, offset, length, encoding) {
// Buffer#write(string)
if (offset === undefined) {
encoding = 'utf8'
length = this.length
offset = 0
// Buffer#write(string, encoding)
} else if (length === undefined && typeof offset === 'string') {
encoding = offset
length = this.length
offset = 0
// Buffer#write(string, offset[, length][, encoding])
} else if (isFinite(offset)) {
offset = offset | 0
if (isFinite(length)) {
length = length | 0
if (encoding === undefined) encoding = 'utf8'
} else {
encoding = length
length = undefined
}
// legacy write(string, encoding, offset, length) - remove in v0.13
} else {
var swap = encoding
encoding = offset
offset = length | 0
length = swap
}
var remaining = this.length - offset
if (length === undefined || length > remaining) length = remaining
if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
throw new RangeError('attempt to write outside buffer bounds')
}
if (!encoding) encoding = 'utf8'
var loweredCase = false
for (;;) {
switch (encoding) {
case 'hex':
return hexWrite(this, string, offset, length)
case 'utf8':
case 'utf-8':
return utf8Write(this, string, offset, length)
case 'ascii':
return asciiWrite(this, string, offset, length)
case 'binary':
return binaryWrite(this, string, offset, length)
case 'base64':
// Warning: maxLength not taken into account in base64Write
return base64Write(this, string, offset, length)
case 'ucs2':
case 'ucs-2':
case 'utf16le':
case 'utf-16le':
return ucs2Write(this, string, offset, length)
default:
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
encoding = ('' + encoding).toLowerCase()
loweredCase = true
}
}
}
Buffer.prototype.toJSON = function toJSON () {
return {
type: 'Buffer',
data: Array.prototype.slice.call(this._arr || this, 0)
}
}
function base64Slice (buf, start, end) {
if (start === 0 && end === buf.length) {
return base64.fromByteArray(buf)
} else {
return base64.fromByteArray(buf.slice(start, end))
}
}
function utf8Slice (buf, start, end) {
end = Math.min(buf.length, end)
var res = []
var i = start
while (i < end) {
var firstByte = buf[i]
var codePoint = null
var bytesPerSequence = (firstByte > 0xEF) ? 4
: (firstByte > 0xDF) ? 3
: (firstByte > 0xBF) ? 2
: 1
if (i + bytesPerSequence <= end) {
var secondByte, thirdByte, fourthByte, tempCodePoint
switch (bytesPerSequence) {
case 1:
if (firstByte < 0x80) {
codePoint = firstByte
}
break
case 2:
secondByte = buf[i + 1]
if ((secondByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
if (tempCodePoint > 0x7F) {
codePoint = tempCodePoint
}
}
break
case 3:
secondByte = buf[i + 1]
thirdByte = buf[i + 2]
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
codePoint = tempCodePoint
}
}
break
case 4:
secondByte = buf[i + 1]
thirdByte = buf[i + 2]
fourthByte = buf[i + 3]
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
codePoint = tempCodePoint
}
}
}
}
if (codePoint === null) {
// we did not generate a valid codePoint so insert a
// replacement char (U+FFFD) and advance only 1 byte
codePoint = 0xFFFD
bytesPerSequence = 1
} else if (codePoint > 0xFFFF) {
// encode to utf16 (surrogate pair dance)
codePoint -= 0x10000
res.push(codePoint >>> 10 & 0x3FF | 0xD800)
codePoint = 0xDC00 | codePoint & 0x3FF
}
res.push(codePoint)
i += bytesPerSequence
}
return decodeCodePointsArray(res)
}
// Based on http://stackoverflow.com/a/22747272/680742, the browser with
// the lowest limit is Chrome, with 0x10000 args.
// We go 1 magnitude less, for safety
var MAX_ARGUMENTS_LENGTH = 0x1000
function decodeCodePointsArray (codePoints) {
var len = codePoints.length
if (len <= MAX_ARGUMENTS_LENGTH) {
return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
}
// Decode in chunks to avoid "call stack size exceeded".
var res = ''
var i = 0
while (i < len) {
res += String.fromCharCode.apply(
String,
codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
)
}
return res
}
function asciiSlice (buf, start, end) {
var ret = ''
end = Math.min(buf.length, end)
for (var i = start; i < end; i++) {
ret += String.fromCharCode(buf[i] & 0x7F)
}
return ret
}
function binarySlice (buf, start, end) {
var ret = ''
end = Math.min(buf.length, end)
for (var i = start; i < end; i++) {
ret += String.fromCharCode(buf[i])
}
return ret
}
function hexSlice (buf, start, end) {
var len = buf.length
if (!start || start < 0) start = 0
if (!end || end < 0 || end > len) end = len
var out = ''
for (var i = start; i < end; i++) {
out += toHex(buf[i])
}
return out
}
function utf16leSlice (buf, start, end) {
var bytes = buf.slice(start, end)
var res = ''
for (var i = 0; i < bytes.length; i += 2) {
res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
}
return res
}
Buffer.prototype.slice = function slice (start, end) {
var len = this.length
start = ~~start
end = end === undefined ? len : ~~end
if (start < 0) {
start += len
if (start < 0) start = 0
} else if (start > len) {
start = len
}
if (end < 0) {
end += len
if (end < 0) end = 0
} else if (end > len) {
end = len
}
if (end < start) end = start
var newBuf
if (Buffer.TYPED_ARRAY_SUPPORT) {
newBuf = Buffer._augment(this.subarray(start, end))
} else {
var sliceLen = end - start
newBuf = new Buffer(sliceLen, undefined)
for (var i = 0; i < sliceLen; i++) {
newBuf[i] = this[i + start]
}
}
if (newBuf.length) newBuf.parent = this.parent || this
return newBuf
}
/*
* Need to make sure that buffer isn't trying to write out of bounds.
*/
function checkOffset (offset, ext, length) {
if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
}
Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkOffset(offset, byteLength, this.length)
var val = this[offset]
var mul = 1
var i = 0
while (++i < byteLength && (mul *= 0x100)) {
val += this[offset + i] * mul
}
return val
}
Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) {
checkOffset(offset, byteLength, this.length)
}
var val = this[offset + --byteLength]
var mul = 1
while (byteLength > 0 && (mul *= 0x100)) {
val += this[offset + --byteLength] * mul
}
return val
}
Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
if (!noAssert) checkOffset(offset, 1, this.length)
return this[offset]
}
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
return this[offset] | (this[offset + 1] << 8)
}
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
return (this[offset] << 8) | this[offset + 1]
}
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return ((this[offset]) |
(this[offset + 1] << 8) |
(this[offset + 2] << 16)) +
(this[offset + 3] * 0x1000000)
}
Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return (this[offset] * 0x1000000) +
((this[offset + 1] << 16) |
(this[offset + 2] << 8) |
this[offset + 3])
}
Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkOffset(offset, byteLength, this.length)
var val = this[offset]
var mul = 1
var i = 0
while (++i < byteLength && (mul *= 0x100)) {
val += this[offset + i] * mul
}
mul *= 0x80
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
return val
}
Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkOffset(offset, byteLength, this.length)
var i = byteLength
var mul = 1
var val = this[offset + --i]
while (i > 0 && (mul *= 0x100)) {
val += this[offset + --i] * mul
}
mul *= 0x80
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
return val
}
Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
if (!noAssert) checkOffset(offset, 1, this.length)
if (!(this[offset] & 0x80)) return (this[offset])
return ((0xff - this[offset] + 1) * -1)
}
Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
var val = this[offset] | (this[offset + 1] << 8)
return (val & 0x8000) ? val | 0xFFFF0000 : val
}
Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 2, this.length)
var val = this[offset + 1] | (this[offset] << 8)
return (val & 0x8000) ? val | 0xFFFF0000 : val
}
Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return (this[offset]) |
(this[offset + 1] << 8) |
(this[offset + 2] << 16) |
(this[offset + 3] << 24)
}
Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return (this[offset] << 24) |
(this[offset + 1] << 16) |
(this[offset + 2] << 8) |
(this[offset + 3])
}
Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return ieee754.read(this, offset, true, 23, 4)
}
Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 4, this.length)
return ieee754.read(this, offset, false, 23, 4)
}
Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 8, this.length)
return ieee754.read(this, offset, true, 52, 8)
}
Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
if (!noAssert) checkOffset(offset, 8, this.length)
return ieee754.read(this, offset, false, 52, 8)
}
function checkInt (buf, value, offset, ext, max, min) {
if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')
if (value > max || value < min) throw new RangeError('value is out of bounds')
if (offset + ext > buf.length) throw new RangeError('index out of range')
}
Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
var mul = 1
var i = 0
this[offset] = value & 0xFF
while (++i < byteLength && (mul *= 0x100)) {
this[offset + i] = (value / mul) & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
byteLength = byteLength | 0
if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
var i = byteLength - 1
var mul = 1
this[offset + i] = value & 0xFF
while (--i >= 0 && (mul *= 0x100)) {
this[offset + i] = (value / mul) & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
this[offset] = (value & 0xff)
return offset + 1
}
function objectWriteUInt16 (buf, value, offset, littleEndian) {
if (value < 0) value = 0xffff + value + 1
for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {
buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
(littleEndian ? i : 1 - i) * 8
}
}
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value & 0xff)
this[offset + 1] = (value >>> 8)
} else {
objectWriteUInt16(this, value, offset, true)
}
return offset + 2
}
Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 8)
this[offset + 1] = (value & 0xff)
} else {
objectWriteUInt16(this, value, offset, false)
}
return offset + 2
}
function objectWriteUInt32 (buf, value, offset, littleEndian) {
if (value < 0) value = 0xffffffff + value + 1
for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {
buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
}
}
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset + 3] = (value >>> 24)
this[offset + 2] = (value >>> 16)
this[offset + 1] = (value >>> 8)
this[offset] = (value & 0xff)
} else {
objectWriteUInt32(this, value, offset, true)
}
return offset + 4
}
Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 24)
this[offset + 1] = (value >>> 16)
this[offset + 2] = (value >>> 8)
this[offset + 3] = (value & 0xff)
} else {
objectWriteUInt32(this, value, offset, false)
}
return offset + 4
}
Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) {
var limit = Math.pow(2, 8 * byteLength - 1)
checkInt(this, value, offset, byteLength, limit - 1, -limit)
}
var i = 0
var mul = 1
var sub = value < 0 ? 1 : 0
this[offset] = value & 0xFF
while (++i < byteLength && (mul *= 0x100)) {
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) {
var limit = Math.pow(2, 8 * byteLength - 1)
checkInt(this, value, offset, byteLength, limit - 1, -limit)
}
var i = byteLength - 1
var mul = 1
var sub = value < 0 ? 1 : 0
this[offset + i] = value & 0xFF
while (--i >= 0 && (mul *= 0x100)) {
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
}
return offset + byteLength
}
Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
if (value < 0) value = 0xff + value + 1
this[offset] = (value & 0xff)
return offset + 1
}
Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value & 0xff)
this[offset + 1] = (value >>> 8)
} else {
objectWriteUInt16(this, value, offset, true)
}
return offset + 2
}
Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 8)
this[offset + 1] = (value & 0xff)
} else {
objectWriteUInt16(this, value, offset, false)
}
return offset + 2
}
Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value & 0xff)
this[offset + 1] = (value >>> 8)
this[offset + 2] = (value >>> 16)
this[offset + 3] = (value >>> 24)
} else {
objectWriteUInt32(this, value, offset, true)
}
return offset + 4
}
Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
value = +value
offset = offset | 0
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
if (value < 0) value = 0xffffffff + value + 1
if (Buffer.TYPED_ARRAY_SUPPORT) {
this[offset] = (value >>> 24)
this[offset + 1] = (value >>> 16)
this[offset + 2] = (value >>> 8)
this[offset + 3] = (value & 0xff)
} else {
objectWriteUInt32(this, value, offset, false)
}
return offset + 4
}
function checkIEEE754 (buf, value, offset, ext, max, min) {
if (value > max || value < min) throw new RangeError('value is out of bounds')
if (offset + ext > buf.length) throw new RangeError('index out of range')
if (offset < 0) throw new RangeError('index out of range')
}
function writeFloat (buf, value, offset, littleEndian, noAssert) {
if (!noAssert) {
checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
}
ieee754.write(buf, value, offset, littleEndian, 23, 4)
return offset + 4
}
Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
return writeFloat(this, value, offset, true, noAssert)
}
Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
return writeFloat(this, value, offset, false, noAssert)
}
function writeDouble (buf, value, offset, littleEndian, noAssert) {
if (!noAssert) {
checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
}
ieee754.write(buf, value, offset, littleEndian, 52, 8)
return offset + 8
}
Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
return writeDouble(this, value, offset, true, noAssert)
}
Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
return writeDouble(this, value, offset, false, noAssert)
}
// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
if (!start) start = 0
if (!end && end !== 0) end = this.length
if (targetStart >= target.length) targetStart = target.length
if (!targetStart) targetStart = 0
if (end > 0 && end < start) end = start
// Copy 0 bytes; we're done
if (end === start) return 0
if (target.length === 0 || this.length === 0) return 0
// Fatal error conditions
if (targetStart < 0) {
throw new RangeError('targetStart out of bounds')
}
if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
if (end < 0) throw new RangeError('sourceEnd out of bounds')
// Are we oob?
if (end > this.length) end = this.length
if (target.length - targetStart < end - start) {
end = target.length - targetStart + start
}
var len = end - start
var i
if (this === target && start < targetStart && targetStart < end) {
// descending copy from end
for (i = len - 1; i >= 0; i--) {
target[i + targetStart] = this[i + start]
}
} else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
// ascending copy from start
for (i = 0; i < len; i++) {
target[i + targetStart] = this[i + start]
}
} else {
target._set(this.subarray(start, start + len), targetStart)
}
return len
}
// fill(value, start=0, end=buffer.length)
Buffer.prototype.fill = function fill (value, start, end) {
if (!value) value = 0
if (!start) start = 0
if (!end) end = this.length
if (end < start) throw new RangeError('end < start')
// Fill 0 bytes; we're done
if (end === start) return
if (this.length === 0) return
if (start < 0 || start >= this.length) throw new RangeError('start out of bounds')
if (end < 0 || end > this.length) throw new RangeError('end out of bounds')
var i
if (typeof value === 'number') {
for (i = start; i < end; i++) {
this[i] = value
}
} else {
var bytes = utf8ToBytes(value.toString())
var len = bytes.length
for (i = start; i < end; i++) {
this[i] = bytes[i % len]
}
}
return this
}
/**
* Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
* Added in Node 0.12. Only available in browsers that support ArrayBuffer.
*/
Buffer.prototype.toArrayBuffer = function toArrayBuffer () {
if (typeof Uint8Array !== 'undefined') {
if (Buffer.TYPED_ARRAY_SUPPORT) {
return (new Buffer(this)).buffer
} else {
var buf = new Uint8Array(this.length)
for (var i = 0, len = buf.length; i < len; i += 1) {
buf[i] = this[i]
}
return buf.buffer
}
} else {
throw new TypeError('Buffer.toArrayBuffer not supported in this browser')
}
}
// HELPER FUNCTIONS
// ================
var BP = Buffer.prototype
/**
* Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
*/
Buffer._augment = function _augment (arr) {
arr.constructor = Buffer
arr._isBuffer = true
// save reference to original Uint8Array set method before overwriting
arr._set = arr.set
// deprecated
arr.get = BP.get
arr.set = BP.set
arr.write = BP.write
arr.toString = BP.toString
arr.toLocaleString = BP.toString
arr.toJSON = BP.toJSON
arr.equals = BP.equals
arr.compare = BP.compare
arr.indexOf = BP.indexOf
arr.copy = BP.copy
arr.slice = BP.slice
arr.readUIntLE = BP.readUIntLE
arr.readUIntBE = BP.readUIntBE
arr.readUInt8 = BP.readUInt8
arr.readUInt16LE = BP.readUInt16LE
arr.readUInt16BE = BP.readUInt16BE
arr.readUInt32LE = BP.readUInt32LE
arr.readUInt32BE = BP.readUInt32BE
arr.readIntLE = BP.readIntLE
arr.readIntBE = BP.readIntBE
arr.readInt8 = BP.readInt8
arr.readInt16LE = BP.readInt16LE
arr.readInt16BE = BP.readInt16BE
arr.readInt32LE = BP.readInt32LE
arr.readInt32BE = BP.readInt32BE
arr.readFloatLE = BP.readFloatLE
arr.readFloatBE = BP.readFloatBE
arr.readDoubleLE = BP.readDoubleLE
arr.readDoubleBE = BP.readDoubleBE
arr.writeUInt8 = BP.writeUInt8
arr.writeUIntLE = BP.writeUIntLE
arr.writeUIntBE = BP.writeUIntBE
arr.writeUInt16LE = BP.writeUInt16LE
arr.writeUInt16BE = BP.writeUInt16BE
arr.writeUInt32LE = BP.writeUInt32LE
arr.writeUInt32BE = BP.writeUInt32BE
arr.writeIntLE = BP.writeIntLE
arr.writeIntBE = BP.writeIntBE
arr.writeInt8 = BP.writeInt8
arr.writeInt16LE = BP.writeInt16LE
arr.writeInt16BE = BP.writeInt16BE
arr.writeInt32LE = BP.writeInt32LE
arr.writeInt32BE = BP.writeInt32BE
arr.writeFloatLE = BP.writeFloatLE
arr.writeFloatBE = BP.writeFloatBE
arr.writeDoubleLE = BP.writeDoubleLE
arr.writeDoubleBE = BP.writeDoubleBE
arr.fill = BP.fill
arr.inspect = BP.inspect
arr.toArrayBuffer = BP.toArrayBuffer
return arr
}
var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
function base64clean (str) {
// Node strips out invalid characters like \n and \t from the string, base64-js does not
str = stringtrim(str).replace(INVALID_BASE64_RE, '')
// Node converts strings with length < 2 to ''
if (str.length < 2) return ''
// Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
while (str.length % 4 !== 0) {
str = str + '='
}
return str
}
function stringtrim (str) {
if (str.trim) return str.trim()
return str.replace(/^\s+|\s+$/g, '')
}
function toHex (n) {
if (n < 16) return '0' + n.toString(16)
return n.toString(16)
}
function utf8ToBytes (string, units) {
units = units || Infinity
var codePoint
var length = string.length
var leadSurrogate = null
var bytes = []
for (var i = 0; i < length; i++) {
codePoint = string.charCodeAt(i)
// is surrogate component
if (codePoint > 0xD7FF && codePoint < 0xE000) {
// last char was a lead
if (!leadSurrogate) {
// no lead yet
if (codePoint > 0xDBFF) {
// unexpected trail
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
continue
} else if (i + 1 === length) {
// unpaired lead
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
continue
}
// valid lead
leadSurrogate = codePoint
continue
}
// 2 leads in a row
if (codePoint < 0xDC00) {
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
leadSurrogate = codePoint
continue
}
// valid surrogate pair
codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
} else if (leadSurrogate) {
// valid bmp char, but last char was a lead
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
}
leadSurrogate = null
// encode utf8
if (codePoint < 0x80) {
if ((units -= 1) < 0) break
bytes.push(codePoint)
} else if (codePoint < 0x800) {
if ((units -= 2) < 0) break
bytes.push(
codePoint >> 0x6 | 0xC0,
codePoint & 0x3F | 0x80
)
} else if (codePoint < 0x10000) {
if ((units -= 3) < 0) break
bytes.push(
codePoint >> 0xC | 0xE0,
codePoint >> 0x6 & 0x3F | 0x80,
codePoint & 0x3F | 0x80
)
} else if (codePoint < 0x110000) {
if ((units -= 4) < 0) break
bytes.push(
codePoint >> 0x12 | 0xF0,
codePoint >> 0xC & 0x3F | 0x80,
codePoint >> 0x6 & 0x3F | 0x80,
codePoint & 0x3F | 0x80
)
} else {
throw new Error('Invalid code point')
}
}
return bytes
}
function asciiToBytes (str) {
var byteArray = []
for (var i = 0; i < str.length; i++) {
// Node's code seems to be doing this and not & 0x7F..
byteArray.push(str.charCodeAt(i) & 0xFF)
}
return byteArray
}
function utf16leToBytes (str, units) {
var c, hi, lo
var byteArray = []
for (var i = 0; i < str.length; i++) {
if ((units -= 2) < 0) break
c = str.charCodeAt(i)
hi = c >> 8
lo = c % 256
byteArray.push(lo)
byteArray.push(hi)
}
return byteArray
}
function base64ToBytes (str) {
return base64.toByteArray(base64clean(str))
}
function blitBuffer (src, dst, offset, length) {
for (var i = 0; i < length; i++) {
if ((i + offset >= dst.length) || (i >= src.length)) break
dst[i + offset] = src[i]
}
return i
}
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(312).Buffer, (function() { return this; }())))
/***/ },
/* 313 */
/***/ function(module, exports, __webpack_require__) {
var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
;(function (exports) {
'use strict';
var Arr = (typeof Uint8Array !== 'undefined')
? Uint8Array
: Array
var PLUS = '+'.charCodeAt(0)
var SLASH = '/'.charCodeAt(0)
var NUMBER = '0'.charCodeAt(0)
var LOWER = 'a'.charCodeAt(0)
var UPPER = 'A'.charCodeAt(0)
var PLUS_URL_SAFE = '-'.charCodeAt(0)
var SLASH_URL_SAFE = '_'.charCodeAt(0)
function decode (elt) {
var code = elt.charCodeAt(0)
if (code === PLUS ||
code === PLUS_URL_SAFE)
return 62 // '+'
if (code === SLASH ||
code === SLASH_URL_SAFE)
return 63 // '/'
if (code < NUMBER)
return -1 //no match
if (code < NUMBER + 10)
return code - NUMBER + 26 + 26
if (code < UPPER + 26)
return code - UPPER
if (code < LOWER + 26)
return code - LOWER + 26
}
function b64ToByteArray (b64) {
var i, j, l, tmp, placeHolders, arr
if (b64.length % 4 > 0) {
throw new Error('Invalid string. Length must be a multiple of 4')
}
// the number of equal signs (place holders)
// if there are two placeholders, than the two characters before it
// represent one byte
// if there is only one, then the three characters before it represent 2 bytes
// this is just a cheap hack to not do indexOf twice
var len = b64.length
placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
// base64 is 4/3 + up to two characters of the original data
arr = new Arr(b64.length * 3 / 4 - placeHolders)
// if there are placeholders, only get up to the last complete 4 chars
l = placeHolders > 0 ? b64.length - 4 : b64.length
var L = 0
function push (v) {
arr[L++] = v
}
for (i = 0, j = 0; i < l; i += 4, j += 3) {
tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
push((tmp & 0xFF0000) >> 16)
push((tmp & 0xFF00) >> 8)
push(tmp & 0xFF)
}
if (placeHolders === 2) {
tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
push(tmp & 0xFF)
} else if (placeHolders === 1) {
tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
push((tmp >> 8) & 0xFF)
push(tmp & 0xFF)
}
return arr
}
function uint8ToBase64 (uint8) {
var i,
extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
output = "",
temp, length
function encode (num) {
return lookup.charAt(num)
}
function tripletToBase64 (num) {
return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
}
// go through the array every three bytes, we'll deal with trailing stuff later
for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
output += tripletToBase64(temp)
}
// pad the end with zeros, but make sure to not forget the extra bytes
switch (extraBytes) {
case 1:
temp = uint8[uint8.length - 1]
output += encode(temp >> 2)
output += encode((temp << 4) & 0x3F)
output += '=='
break
case 2:
temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
output += encode(temp >> 10)
output += encode((temp >> 4) & 0x3F)
output += encode((temp << 2) & 0x3F)
output += '='
break
}
return output
}
exports.toByteArray = b64ToByteArray
exports.fromByteArray = uint8ToBase64
}( false ? (this.base64js = {}) : exports))
/***/ },
/* 314 */
/***/ function(module, exports) {
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
var e, m
var eLen = nBytes * 8 - mLen - 1
var eMax = (1 << eLen) - 1
var eBias = eMax >> 1
var nBits = -7
var i = isLE ? (nBytes - 1) : 0
var d = isLE ? -1 : 1
var s = buffer[offset + i]
i += d
e = s & ((1 << (-nBits)) - 1)
s >>= (-nBits)
nBits += eLen
for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
m = e & ((1 << (-nBits)) - 1)
e >>= (-nBits)
nBits += mLen
for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
if (e === 0) {
e = 1 - eBias
} else if (e === eMax) {
return m ? NaN : ((s ? -1 : 1) * Infinity)
} else {
m = m + Math.pow(2, mLen)
e = e - eBias
}
return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
}
exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
var e, m, c
var eLen = nBytes * 8 - mLen - 1
var eMax = (1 << eLen) - 1
var eBias = eMax >> 1
var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
var i = isLE ? 0 : (nBytes - 1)
var d = isLE ? 1 : -1
var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
value = Math.abs(value)
if (isNaN(value) || value === Infinity) {
m = isNaN(value) ? 1 : 0
e = eMax
} else {
e = Math.floor(Math.log(value) / Math.LN2)
if (value * (c = Math.pow(2, -e)) < 1) {
e--
c *= 2
}
if (e + eBias >= 1) {
value += rt / c
} else {
value += rt * Math.pow(2, 1 - eBias)
}
if (value * c >= 2) {
e++
c /= 2
}
if (e + eBias >= eMax) {
m = 0
e = eMax
} else if (e + eBias >= 1) {
m = (value * c - 1) * Math.pow(2, mLen)
e = e + eBias
} else {
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
e = 0
}
}
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
e = (e << mLen) | m
eLen += mLen
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
buffer[offset + i - d] |= s * 128
}
/***/ },
/* 315 */
/***/ function(module, exports) {
var toString = {}.toString;
module.exports = Array.isArray || function (arr) {
return toString.call(arr) == '[object Array]';
};
/***/ },
/* 316 */
/***/ function(module, exports) {
/***/ },
/* 317 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
var _UrlUtility = __webpack_require__(318);
var _UrlUtility2 = _interopRequireDefault(_UrlUtility);
var _SigninState = __webpack_require__(319);
var _SigninState2 = _interopRequireDefault(_SigninState);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SigninRequest = function () {
function SigninRequest(_ref) {
var
// mandatory
url = _ref.url;
var client_id = _ref.client_id;
var redirect_uri = _ref.redirect_uri;
var response_type = _ref.response_type;
var scope = _ref.scope;
var authority = _ref.authority;
var
// optional
data = _ref.data;
var prompt = _ref.prompt;
var display = _ref.display;
var max_age = _ref.max_age;
var ui_locales = _ref.ui_locales;
var id_token_hint = _ref.id_token_hint;
var login_hint = _ref.login_hint;
var acr_values = _ref.acr_values;
_classCallCheck(this, SigninRequest);
if (!url) {
_Log2.default.error("No url passed to SigninRequest");
throw new Error("url");
}
if (!client_id) {
_Log2.default.error("No client_id passed to SigninRequest");
throw new Error("client_id");
}
if (!redirect_uri) {
_Log2.default.error("No redirect_uri passed to SigninRequest");
throw new Error("redirect_uri");
}
if (!response_type) {
_Log2.default.error("No response_type passed to SigninRequest");
throw new Error("response_type");
}
if (!scope) {
_Log2.default.error("No scope passed to SigninRequest");
throw new Error("scope");
}
if (!authority) {
_Log2.default.error("No authority passed to SigninRequest");
throw new Error("authority");
}
var oidc = SigninRequest.isOidc(response_type);
this.state = new _SigninState2.default({ nonce: oidc, data: data, client_id: client_id, authority: authority });
url = _UrlUtility2.default.addQueryParam(url, "client_id", client_id);
url = _UrlUtility2.default.addQueryParam(url, "redirect_uri", redirect_uri);
url = _UrlUtility2.default.addQueryParam(url, "response_type", response_type);
url = _UrlUtility2.default.addQueryParam(url, "scope", scope);
url = _UrlUtility2.default.addQueryParam(url, "state", this.state.id);
if (oidc) {
url = _UrlUtility2.default.addQueryParam(url, "nonce", this.state.nonce);
}
var optional = { prompt: prompt, display: display, max_age: max_age, ui_locales: ui_locales, id_token_hint: id_token_hint, login_hint: login_hint, acr_values: acr_values };
for (var key in optional) {
if (optional[key]) {
url = _UrlUtility2.default.addQueryParam(url, key, optional[key]);
}
}
this.url = url;
}
SigninRequest.isOidc = function isOidc(response_type) {
var result = response_type.split(/\s+/g).filter(function (item) {
return item === "id_token";
});
return !!result[0];
};
SigninRequest.isOAuth = function isOAuth(response_type) {
var result = response_type.split(/\s+/g).filter(function (item) {
return item === "token";
});
return !!result[0];
};
return SigninRequest;
}();
exports.default = SigninRequest;
module.exports = exports['default'];
/***/ },
/* 318 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
var _Global = __webpack_require__(304);
var _Global2 = _interopRequireDefault(_Global);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var UrlUtility = function () {
function UrlUtility() {
_classCallCheck(this, UrlUtility);
}
UrlUtility.addQueryParam = function addQueryParam(url, name, value) {
if (url.indexOf('?') < 0) {
url += "?";
}
if (url[url.length - 1] !== "?") {
url += "&";
}
url += encodeURIComponent(name);
url += "=";
url += encodeURIComponent(value);
return url;
};
UrlUtility.parseUrlFragment = function parseUrlFragment(value) {
var delimiter = arguments.length <= 1 || arguments[1] === undefined ? "#" : arguments[1];
var global = arguments.length <= 2 || arguments[2] === undefined ? _Global2.default : arguments[2];
_Log2.default.info("UrlUtility.parseUrlFragment");
if (typeof value !== 'string') {
value = global.location.href;
}
var idx = value.lastIndexOf(delimiter);
if (idx >= 0) {
value = value.substr(idx + 1);
}
var params = {},
regex = /([^&=]+)=([^&]*)/g,
m;
var counter = 0;
while (m = regex.exec(value)) {
params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
if (counter++ > 50) {
_Log2.default.error("response exceeded expected number of parameters", value);
return {
error: "Response exceeded expected number of parameters"
};
}
}
for (var prop in params) {
return params;
}
return {};
};
return UrlUtility;
}();
exports.default = UrlUtility;
module.exports = exports['default'];
/***/ },
/* 319 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
var _State2 = __webpack_require__(320);
var _State3 = _interopRequireDefault(_State2);
var _random = __webpack_require__(321);
var _random2 = _interopRequireDefault(_random);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SigninState = function (_State) {
_inherits(SigninState, _State);
function SigninState() {
var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var nonce = _ref.nonce;
var authority = _ref.authority;
var client_id = _ref.client_id;
_classCallCheck(this, SigninState);
var _this = _possibleConstructorReturn(this, _State.call(this, arguments[0]));
if (nonce === true) {
_this._nonce = (0, _random2.default)();
} else if (nonce) {
_this._nonce = nonce;
}
_this._authority = authority;
_this._client_id = client_id;
return _this;
}
SigninState.prototype.toStorageString = function toStorageString() {
_Log2.default.info("SigninState.toStorageString");
return JSON.stringify({
id: this.id,
data: this.data,
created: this.created,
nonce: this.nonce,
authority: this.authority,
client_id: this.client_id
});
};
SigninState.fromStorageString = function fromStorageString(storageString) {
_Log2.default.info("SigninState.fromStorageString");
var data = JSON.parse(storageString);
return new SigninState(data);
};
_createClass(SigninState, [{
key: 'nonce',
get: function get() {
return this._nonce;
}
}, {
key: 'authority',
get: function get() {
return this._authority;
}
}, {
key: 'client_id',
get: function get() {
return this._client_id;
}
}]);
return SigninState;
}(_State3.default);
exports.default = SigninState;
module.exports = exports['default'];
/***/ },
/* 320 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
var _random = __webpack_require__(321);
var _random2 = _interopRequireDefault(_random);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var State = function () {
function State() {
var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var id = _ref.id;
var data = _ref.data;
var created = _ref.created;
_classCallCheck(this, State);
this._id = id || (0, _random2.default)();
this._data = data;
if (typeof created === 'number' && created > 0) {
this._created = created;
} else {
this._created = parseInt(Date.now() / 1000);
}
}
State.prototype.toStorageString = function toStorageString() {
_Log2.default.info("State.toStorageString");
return JSON.stringify({
id: this.id,
data: this.data,
created: this.created
});
};
State.fromStorageString = function fromStorageString(storageString) {
_Log2.default.info("State.fromStorageString");
return new State(JSON.parse(storageString));
};
State.clearStaleState = function clearStaleState(storage, age) {
_Log2.default.info("State.clearStaleState");
var cutoff = Date.now() / 1000 - age;
return storage.getAllKeys().then(function (keys) {
_Log2.default.info("got keys", keys);
var promises = [];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
var _loop = function _loop() {
var key = _step.value;
p = storage.get(key).then(function (item) {
var remove = false;
if (item) {
try {
var state = State.fromStorageString(item);
_Log2.default.info("got item from key: ", key, state.created);
if (state.created <= cutoff) {
remove = true;
}
} catch (e) {
_Log2.default.error("Error parsing state for key", key, e.message);
remove = true;
}
} else {
_Log2.default.info("no item in storage for key: ", key);
remove = true;
}
if (remove) {
_Log2.default.info("removed item for key: ", key);
return storage.remove(key);
}
});
promises.push(p);
};
for (var _iterator = keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var p;
_loop();
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
_Log2.default.info("waiting on promise count:", promises.length);
return Promise.all(promises);
});
};
_createClass(State, [{
key: 'id',
get: function get() {
return this._id;
}
}, {
key: 'data',
get: function get() {
return this._data;
}
}, {
key: 'created',
get: function get() {
return this._created;
}
}]);
return State;
}();
exports.default = State;
module.exports = exports['default'];
/***/ },
/* 321 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = random;
//----------------------------------------------------------------------
// AdalJS v1.0.8
// @preserve Copyright (c) Microsoft Open Technologies, Inc.
// All Rights Reserved
// Apache License 2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//----------------------------------------------------------------------
// NOTICE: the code in this file originally developed by Microsoft
// original source: https://github.com/AzureAD/azure-activedirectory-library-for-js/blob/master/lib/adal.js#L1029
function random() {
var guidHolder = 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx';
var hex = '0123456789abcdef';
var r = 0;
var guidResponse = "";
for (var i = 0; i < guidHolder.length; i++) {
if (guidHolder[i] !== '-' && guidHolder[i] !== '4') {
// each x and y needs to be random
r = Math.random() * 16 | 0;
}
if (guidHolder[i] === 'x') {
guidResponse += hex[r];
} else if (guidHolder[i] === 'y') {
// clock-seq-and-reserved first hex is filtered and remaining hex values are random
r &= 0x3; // bit and with 0011 to set pos 2 to zero ?0??
r |= 0x8; // set pos 3 to 1 as 1???
guidResponse += hex[r];
} else {
guidResponse += guidHolder[i];
}
}
return guidResponse;
}
module.exports = exports['default'];
/***/ },
/* 322 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _UrlUtility = __webpack_require__(318);
var _UrlUtility2 = _interopRequireDefault(_UrlUtility);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var OidcScope = "openid";
var SigninResponse = function () {
function SigninResponse(url) {
_classCallCheck(this, SigninResponse);
var values = _UrlUtility2.default.parseUrlFragment(url, "#");
this.error = values.error;
this.error_description = values.error_description;
this.error_uri = values.error_uri;
this.state = values.state;
this.id_token = values.id_token;
this.session_state = values.session_state;
this.access_token = values.access_token;
this.token_type = values.token_type;
this.scope = values.scope;
this.profile = undefined; // will be set from ResponseValidator
var expires_in = parseInt(values.expires_in);
if (typeof expires_in === 'number' && expires_in > 0) {
var now = parseInt(Date.now() / 1000);
this.expires_at = now + expires_in;
}
}
_createClass(SigninResponse, [{
key: "expires_in",
get: function get() {
if (this.expires_at) {
var now = parseInt(Date.now() / 1000);
return this.expires_at - now;
}
return undefined;
}
}, {
key: "expired",
get: function get() {
var expires_in = this.expires_in;
if (expires_in !== undefined) {
return expires_in <= 0;
}
return undefined;
}
}, {
key: "scopes",
get: function get() {
return (this.scope || "").split(" ");
}
}, {
key: "isOpenIdConnect",
get: function get() {
return this.scopes.indexOf(OidcScope) >= 0;
}
}]);
return SigninResponse;
}();
exports.default = SigninResponse;
module.exports = exports['default'];
/***/ },
/* 323 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
var _UrlUtility = __webpack_require__(318);
var _UrlUtility2 = _interopRequireDefault(_UrlUtility);
var _State = __webpack_require__(320);
var _State2 = _interopRequireDefault(_State);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SignoutRequest = function SignoutRequest(_ref) {
var url = _ref.url;
var id_token_hint = _ref.id_token_hint;
var post_logout_redirect_uri = _ref.post_logout_redirect_uri;
var data = _ref.data;
_classCallCheck(this, SignoutRequest);
if (!url) {
_Log2.default.error("No url passed to SignoutRequest");
throw new Error("url");
}
if (id_token_hint) {
url = _UrlUtility2.default.addQueryParam(url, "id_token_hint", id_token_hint);
if (post_logout_redirect_uri) {
url = _UrlUtility2.default.addQueryParam(url, "post_logout_redirect_uri", post_logout_redirect_uri);
if (data) {
this.state = new _State2.default({ data: data });
url = _UrlUtility2.default.addQueryParam(url, "state", this.state.id);
}
}
}
this.url = url;
};
exports.default = SignoutRequest;
module.exports = exports['default'];
/***/ },
/* 324 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _UrlUtility = __webpack_require__(318);
var _UrlUtility2 = _interopRequireDefault(_UrlUtility);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SignoutResponse = function SignoutResponse(url) {
_classCallCheck(this, SignoutResponse);
var values = _UrlUtility2.default.parseUrlFragment(url, "?");
this.error = values.error;
this.error_description = values.error_description;
this.error_uri = values.error_uri;
this.state = values.state;
};
exports.default = SignoutResponse;
module.exports = exports['default'];
/***/ },
/* 325 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var InMemoryWebStorage = function () {
function InMemoryWebStorage() {
_classCallCheck(this, InMemoryWebStorage);
this._data = {};
}
InMemoryWebStorage.prototype.getItem = function getItem(key) {
_Log2.default.info("InMemoryWebStorage.getItem", key);
return this._data[key];
};
InMemoryWebStorage.prototype.setItem = function setItem(key, value) {
_Log2.default.info("InMemoryWebStorage.setItem", key);
this._data[key] = value;
};
InMemoryWebStorage.prototype.removeItem = function removeItem(key) {
_Log2.default.info("InMemoryWebStorage.removeItem", key);
delete this._data[key];
};
InMemoryWebStorage.prototype.key = function key(index) {
return Object.getOwnPropertyNames(this._data)[index];
};
_createClass(InMemoryWebStorage, [{
key: "length",
get: function get() {
return Object.getOwnPropertyNames(this._data).length;
}
}]);
return InMemoryWebStorage;
}();
exports.default = InMemoryWebStorage;
module.exports = exports['default'];
/***/ },
/* 326 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
var _OidcClient2 = __webpack_require__(301);
var _OidcClient3 = _interopRequireDefault(_OidcClient2);
var _UserManagerSettings = __webpack_require__(327);
var _UserManagerSettings2 = _interopRequireDefault(_UserManagerSettings);
var _User = __webpack_require__(333);
var _User2 = _interopRequireDefault(_User);
var _UserManagerEvents = __webpack_require__(334);
var _UserManagerEvents2 = _interopRequireDefault(_UserManagerEvents);
var _SilentRenewService = __webpack_require__(338);
var _SilentRenewService2 = _interopRequireDefault(_SilentRenewService);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var UserManager = function (_OidcClient) {
_inherits(UserManager, _OidcClient);
function UserManager() {
var settings = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_classCallCheck(this, UserManager);
if (!(settings instanceof _UserManagerSettings2.default)) {
settings = new _UserManagerSettings2.default(settings);
}
// order is important for these two properties; SilentRenewService depends on the events.
var _this = _possibleConstructorReturn(this, _OidcClient.call(this, settings));
_this._events = new _UserManagerEvents2.default(settings);
if (_this.settings.automaticSilentRenew) {
_Log2.default.info("automaticSilentRenew is configured, setting up silent renew");
_this._silentRenewService = new _SilentRenewService2.default(_this);
}
return _this;
}
UserManager.prototype.getUser = function getUser() {
var _this2 = this;
_Log2.default.info("UserManager.getUser");
return this._loadUser().then(function (user) {
if (user) {
_Log2.default.info("user loaded");
_this2._events.load(user, false);
return user;
} else {
_Log2.default.info("user not found in storage");
return null;
}
});
};
UserManager.prototype.removeUser = function removeUser() {
var _this3 = this;
_Log2.default.info("UserManager.removeUser");
return this._storeUser(null).then(function () {
_Log2.default.info("user removed from storage");
_this3._events.unload();
});
};
UserManager.prototype.signinPopup = function signinPopup() {
var args = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_Log2.default.info("UserManager.signinPopup");
var url = args.redirect_uri || this.settings.popup_redirect_uri || this.settings.redirect_uri;
if (!url) {
_Log2.default.error("No popup_redirect_uri or redirect_uri configured");
return Promise.reject(new Error("No popup_redirect_uri or redirect_uri configured"));
}
args.redirect_uri = url;
args.display = "popup";
return this._signin(args, this._popupNavigator, {
startUrl: url,
popupWindowFeatures: args.popupWindowFeatures || this.settings.popupWindowFeatures,
popupWindowTarget: args.popupWindowTarget || this.settings.popupWindowTarget
});
};
UserManager.prototype.signinPopupCallback = function signinPopupCallback(url) {
_Log2.default.info("UserManager.signinPopupCallback");
return this._signinCallback(url, this._popupNavigator);
};
UserManager.prototype.signinSilent = function signinSilent() {
var args = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_Log2.default.info("UserManager.signinSilent");
var url = args.redirect_uri || this.settings.silent_redirect_uri;
if (!url) {
_Log2.default.error("No silent_redirect_uri configured");
return Promise.reject(new Error("No silent_redirect_uri configured"));
}
args.redirect_uri = url;
args.prompt = "none";
return this._signin(args, this._iframeNavigator, {
startUrl: url,
silentRequestTimeout: args.silentRequestTimeout || this.settings.silentRequestTimeout
});
};
UserManager.prototype.signinSilentCallback = function signinSilentCallback(url) {
_Log2.default.info("UserManager.signinSilentCallback");
return this._signinCallback(url, this._iframeNavigator);
};
UserManager.prototype._signin = function _signin(args, navigator) {
var _this4 = this;
var navigatorParams = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
_Log2.default.info("_signin");
return this._signinStart(args, navigator, navigatorParams).then(function (navResponse) {
return _this4._signinEnd(navResponse.url);
});
};
UserManager.prototype._signinCallback = function _signinCallback(url, navigator) {
_Log2.default.info("_signinCallback");
return navigator.callback(url);
};
UserManager.prototype._signout = function _signout(args, navigator) {
var _this5 = this;
var navigatorParams = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
_Log2.default.info("_signout");
return this._signoutStart(args, navigator, navigatorParams).then(function (navResponse) {
return _this5._signoutEnd(navResponse.url);
});
};
UserManager.prototype._signoutCallback = function _signoutCallback(url, navigator) {
_Log2.default.info("_signoutCallback");
return navigator.callback(url);
};
UserManager.prototype.signinRedirect = function signinRedirect(args) {
_Log2.default.info("UserManager.signinRedirect");
return this._signinStart(args, this._redirectNavigator);
};
UserManager.prototype.signinRedirectCallback = function signinRedirectCallback(url) {
_Log2.default.info("UserManager.signinRedirectCallback");
return this._signinEnd(url || this._redirectNavigator.url);
};
UserManager.prototype.signoutRedirect = function signoutRedirect(args) {
_Log2.default.info("UserManager.signoutRedirect");
return this._signoutStart(args, this._redirectNavigator);
};
UserManager.prototype.signoutPopup = function signoutPopup() {
var args = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_Log2.default.info("UserManager.signoutPopup");
var url = args.redirect_uri || this.settings.popup_redirect_uri || this.settings.redirect_uri;
if (!url) {
_Log2.default.error("No popup_redirect_uri or redirect_uri configured");
return Promise.reject(new Error("No popup_redirect_uri or redirect_uri configured"));
}
return this._signout(args, this._popupNavigator, {
startUrl: url,
popupWindowFeatures: args.popupWindowFeatures || this.settings.popupWindowFeatures,
popupWindowTarget: args.popupWindowTarget || this.settings.popupWindowTarget
});
};
UserManager.prototype.signoutRedirectCallback = function signoutRedirectCallback(url) {
_Log2.default.info("UserManager.signoutRedirectCallback");
return this._signoutEnd(url || this._redirectNavigator.url);
};
UserManager.prototype._signinStart = function _signinStart(args, navigator) {
var _this6 = this;
var navigatorParams = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
_Log2.default.info("_signinStart");
return navigator.prepare(navigatorParams).then(function (handle) {
_Log2.default.info("got navigator window handle");
return _this6.createSigninRequest(args).then(function (signinRequest) {
_Log2.default.info("got signin request");
navigatorParams.url = signinRequest.url;
return handle.navigate(navigatorParams);
});
});
};
UserManager.prototype._signinEnd = function _signinEnd(url) {
var _this7 = this;
_Log2.default.info("_signinEnd");
return this.processSigninResponse(url).then(function (signinResponse) {
_Log2.default.info("got signin response");
var user = new _User2.default(signinResponse);
return _this7._storeUser(user).then(function () {
_Log2.default.info("user stored");
_this7._events.load(user);
return user;
});
});
};
UserManager.prototype._signoutStart = function _signoutStart() {
var args = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var _this8 = this;
var navigator = arguments[1];
var navigatorParams = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
_Log2.default.info("_signoutStart");
return navigator.prepare(navigatorParams).then(function (handle) {
_Log2.default.info("got navigator window handle");
return _this8.getUser().then(function (user) {
_Log2.default.info("loaded current user from storage");
var id_token = args.id_token_hint || user && user.id_token;
if (id_token) {
_Log2.default.info("Setting id_token into signout request");
args.id_token_hint = id_token;
}
return _this8.removeUser().then(function () {
_Log2.default.info("user removed, creating signout request");
return _this8.createSignoutRequest(args).then(function (signoutRequest) {
_Log2.default.info("got signout request");
navigatorParams.url = signoutRequest.url;
return handle.navigate(navigatorParams);
});
});
});
});
};
UserManager.prototype._signoutEnd = function _signoutEnd(url) {
_Log2.default.info("_signoutEnd");
return this.processSignoutResponse(url).then(function (signoutResponse) {
_Log2.default.info("got signout response");
return signoutResponse;
});
};
UserManager.prototype._loadUser = function _loadUser() {
_Log2.default.info("_loadUser");
return this._userStore.get(this._userStoreKey).then(function (storageString) {
if (storageString) {
_Log2.default.info("user storageString loaded");
return _User2.default.fromStorageString(storageString);
}
_Log2.default.info("no user storageString");
return null;
});
};
UserManager.prototype._storeUser = function _storeUser(user) {
if (user) {
_Log2.default.info("_storeUser storing user");
var storageString = user.toStorageString();
return this._userStore.set(this._userStoreKey, storageString);
} else {
_Log2.default.info("_storeUser removing user storage");
return this._userStore.remove(this._userStoreKey);
}
};
_createClass(UserManager, [{
key: '_redirectNavigator',
get: function get() {
return this.settings.redirectNavigator;
}
}, {
key: '_popupNavigator',
get: function get() {
return this.settings.popupNavigator;
}
}, {
key: '_iframeNavigator',
get: function get() {
return this.settings.iframeNavigator;
}
}, {
key: '_userStore',
get: function get() {
return this.settings.userStore;
}
}, {
key: 'events',
get: function get() {
return this._events;
}
}, {
key: '_userStoreKey',
get: function get() {
return 'user:' + this.settings.authority + ':' + this.settings.client_id;
}
}]);
return UserManager;
}(_OidcClient3.default);
exports.default = UserManager;
module.exports = exports['default'];
/***/ },
/* 327 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
var _OidcClientSettings2 = __webpack_require__(302);
var _OidcClientSettings3 = _interopRequireDefault(_OidcClientSettings2);
var _RedirectNavigator = __webpack_require__(328);
var _RedirectNavigator2 = _interopRequireDefault(_RedirectNavigator);
var _PopupNavigator = __webpack_require__(329);
var _PopupNavigator2 = _interopRequireDefault(_PopupNavigator);
var _IFrameNavigator = __webpack_require__(331);
var _IFrameNavigator2 = _interopRequireDefault(_IFrameNavigator);
var _WebStorageStateStore = __webpack_require__(303);
var _WebStorageStateStore2 = _interopRequireDefault(_WebStorageStateStore);
var _Global = __webpack_require__(304);
var _Global2 = _interopRequireDefault(_Global);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var DefaultAccessTokenExpiringNotificationTime = 60;
var UserManagerSettings = function (_OidcClientSettings) {
_inherits(UserManagerSettings, _OidcClientSettings);
function UserManagerSettings() {
var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var popup_redirect_uri = _ref.popup_redirect_uri;
var popupWindowFeatures = _ref.popupWindowFeatures;
var popupWindowTarget = _ref.popupWindowTarget;
var silent_redirect_uri = _ref.silent_redirect_uri;
var silentRequestTimeout = _ref.silentRequestTimeout;
var _ref$automaticSilentR = _ref.automaticSilentRenew;
var automaticSilentRenew = _ref$automaticSilentR === undefined ? false : _ref$automaticSilentR;
var _ref$accessTokenExpir = _ref.accessTokenExpiringNotificationTime;
var accessTokenExpiringNotificationTime = _ref$accessTokenExpir === undefined ? DefaultAccessTokenExpiringNotificationTime : _ref$accessTokenExpir;
var _ref$redirectNavigato = _ref.redirectNavigator;
var redirectNavigator = _ref$redirectNavigato === undefined ? new _RedirectNavigator2.default() : _ref$redirectNavigato;
var _ref$popupNavigator = _ref.popupNavigator;
var popupNavigator = _ref$popupNavigator === undefined ? new _PopupNavigator2.default() : _ref$popupNavigator;
var _ref$iframeNavigator = _ref.iframeNavigator;
var iframeNavigator = _ref$iframeNavigator === undefined ? new _IFrameNavigator2.default() : _ref$iframeNavigator;
var _ref$userStore = _ref.userStore;
var userStore = _ref$userStore === undefined ? new _WebStorageStateStore2.default({ store: _Global2.default.sessionStorage }) : _ref$userStore;
_classCallCheck(this, UserManagerSettings);
var _this = _possibleConstructorReturn(this, _OidcClientSettings.call(this, arguments[0]));
_this._popup_redirect_uri = popup_redirect_uri;
_this._popupWindowFeatures = popupWindowFeatures;
_this._popupWindowTarget = popupWindowTarget;
_this._silent_redirect_uri = silent_redirect_uri;
_this._silentRequestTimeout = silentRequestTimeout;
_this._automaticSilentRenew = !!automaticSilentRenew;
_this._accessTokenExpiringNotificationTime = accessTokenExpiringNotificationTime;
_this._redirectNavigator = redirectNavigator;
_this._popupNavigator = popupNavigator;
_this._iframeNavigator = iframeNavigator;
_this._userStore = userStore;
return _this;
}
_createClass(UserManagerSettings, [{
key: 'popup_redirect_uri',
get: function get() {
return this._popup_redirect_uri;
}
}, {
key: 'popupWindowFeatures',
get: function get() {
return this._popupWindowFeatures;
}
}, {
key: 'popupWindowTarget',
get: function get() {
return this._popupWindowTarget;
}
}, {
key: 'silent_redirect_uri',
get: function get() {
return this._silent_redirect_uri;
}
}, {
key: 'silentRequestTimeout',
get: function get() {
return this._silentRequestTimeout;
}
}, {
key: 'automaticSilentRenew',
get: function get() {
return !!(this.silent_redirect_uri && this._automaticSilentRenew);
}
}, {
key: 'accessTokenExpiringNotificationTime',
get: function get() {
return this._accessTokenExpiringNotificationTime;
}
}, {
key: 'redirectNavigator',
get: function get() {
return this._redirectNavigator;
}
}, {
key: 'popupNavigator',
get: function get() {
return this._popupNavigator;
}
}, {
key: 'iframeNavigator',
get: function get() {
return this._iframeNavigator;
}
}, {
key: 'userStore',
get: function get() {
return this._userStore;
}
}]);
return UserManagerSettings;
}(_OidcClientSettings3.default);
exports.default = UserManagerSettings;
module.exports = exports['default'];
/***/ },
/* 328 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var RedirectNavigator = function () {
function RedirectNavigator() {
_classCallCheck(this, RedirectNavigator);
}
RedirectNavigator.prototype.prepare = function prepare() {
return Promise.resolve(this);
};
RedirectNavigator.prototype.navigate = function navigate(params) {
_Log2.default.info("RedirectNavigator.navigate");
if (!params || !params.url) {
_Log2.default.error("No url provided");
return Promise.reject(new Error("No url provided"));
}
window.location = params.url;
return Promise.resolve();
};
_createClass(RedirectNavigator, [{
key: "url",
get: function get() {
_Log2.default.info("RedirectNavigator.url");
return window.location.href;
}
}]);
return RedirectNavigator;
}();
exports.default = RedirectNavigator;
module.exports = exports['default'];
/***/ },
/* 329 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
var _PopupWindow = __webpack_require__(330);
var _PopupWindow2 = _interopRequireDefault(_PopupWindow);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var PopupNavigator = function () {
function PopupNavigator() {
_classCallCheck(this, PopupNavigator);
}
PopupNavigator.prototype.prepare = function prepare(params) {
var popup = new _PopupWindow2.default(params);
return Promise.resolve(popup);
};
PopupNavigator.prototype.callback = function callback(url) {
_Log2.default.info("PopupNavigator.callback");
try {
_PopupWindow2.default.notifyOpener(url);
return Promise.resolve();
} catch (e) {
return Promise.reject(e);
}
};
return PopupNavigator;
}();
exports.default = PopupNavigator;
module.exports = exports['default'];
/***/ },
/* 330 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var CheckForPopupClosedInterval = 500;
var DefaultPopupFeatures = 'location=no,toolbar=no,width=500,height=500,left=100,top=100';
var DefaultPopupTarget = "_blank";
var PopupWindow = function () {
function PopupWindow(params) {
var _this = this;
_classCallCheck(this, PopupWindow);
_Log2.default.info("PopupWindow.ctor");
this._promise = new Promise(function (resolve, reject) {
_this._resolve = resolve;
_this._reject = reject;
});
this._boundMessageEvent = this._message.bind(this);
window.addEventListener("message", this._boundMessageEvent, false);
var features = params.popupWindowFeatures || DefaultPopupFeatures;
var target = params.popupWindowTarget || DefaultPopupTarget;
this._popup = window.open('', target, features);
if (this._popup) {
_Log2.default.info("popup successfully created");
this._checkForPopupClosedTimer = window.setInterval(this._checkForPopupClosed.bind(this), CheckForPopupClosedInterval);
}
}
PopupWindow.prototype.navigate = function navigate(params) {
_Log2.default.info("PopupWindow.navigate");
if (!this._popup) {
this._error("Error opening popup window");
} else if (!params || !params.url) {
this._error("No url provided");
} else {
_Log2.default.info("Setting URL in popup");
this._popup.focus();
this._popup.window.location = params.url;
}
return this.promise;
};
PopupWindow.prototype._success = function _success(data) {
this._cleanup();
_Log2.default.info("Successful response from popup window");
this._resolve(data);
};
PopupWindow.prototype._error = function _error(message) {
this._cleanup();
_Log2.default.error(message);
this._reject(new Error(message));
};
PopupWindow.prototype._cleanup = function _cleanup() {
_Log2.default.info("PopupWindow._cleanup");
window.removeEventListener("message", this._boundMessageEvent, false);
window.clearInterval(this._checkForPopupClosedTimer);
this._checkForPopupClosedTimer = null;
this._boundMessageEventssage = null;
if (this._popup) {
this._popup.close();
}
this._popup = null;
};
PopupWindow.prototype._checkForPopupClosed = function _checkForPopupClosed() {
_Log2.default.info("PopupWindow._checkForPopupClosed");
if (!this._popup || this._popup.closed) {
this._error("Popup window closed");
}
};
PopupWindow.prototype._message = function _message(e) {
_Log2.default.info("PopupWindow._message");
if (e.origin === this._origin && e.source === this._popup.window) {
_Log2.default.info("processing message");
var url = e.data || e.source.location.href; // for IE9
this._cleanup();
if (url) {
this._success({ url: url });
} else {
this._error("Invalid response from popup");
}
}
};
PopupWindow.notifyOpener = function notifyOpener(url) {
_Log2.default.info("PopupWindow.notifyOpener");
if (window.opener) {
url = url || window.location.href;
if (url) {
_Log2.default.info("posting url message to opener");
window.opener.postMessage(url, location.protocol + "//" + location.host);
}
}
};
_createClass(PopupWindow, [{
key: 'promise',
get: function get() {
return this._promise;
}
}, {
key: '_origin',
get: function get() {
return location.protocol + "//" + location.host;
}
}]);
return PopupWindow;
}();
exports.default = PopupWindow;
module.exports = exports['default'];
/***/ },
/* 331 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
var _IFrameWindow = __webpack_require__(332);
var _IFrameWindow2 = _interopRequireDefault(_IFrameWindow);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var IFrameNavigator = function () {
function IFrameNavigator() {
_classCallCheck(this, IFrameNavigator);
}
IFrameNavigator.prototype.prepare = function prepare(params) {
var frame = new _IFrameWindow2.default(params);
return Promise.resolve(frame);
};
IFrameNavigator.prototype.callback = function callback(url) {
_Log2.default.info("IFrameNavigator.callback");
try {
_IFrameWindow2.default.notifyParent(url);
return Promise.resolve();
} catch (e) {
return Promise.reject(e);
}
};
return IFrameNavigator;
}();
exports.default = IFrameNavigator;
module.exports = exports['default'];
/***/ },
/* 332 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var DefaultTimeout = 5000;
var IFrameWindow = function () {
function IFrameWindow(params) {
var _this = this;
_classCallCheck(this, IFrameWindow);
_Log2.default.info("IFrameWindow.ctor");
this._promise = new Promise(function (resolve, reject) {
_this._resolve = resolve;
_this._reject = reject;
});
this._boundMessageEvent = this._message.bind(this);
window.addEventListener("message", this._boundMessageEvent, false);
this._frame = window.document.createElement("iframe");
this._frame.style.display = "none";
window.document.body.appendChild(this._frame);
}
IFrameWindow.prototype.navigate = function navigate(params) {
_Log2.default.info("IFrameWindow.navigate");
if (!params || !params.url) {
this._error("No url provided");
} else {
var timeout = params.silentRequestTimeout || DefaultTimeout;
_Log2.default.info("Using timeout of:", timeout);
this._timer = window.setTimeout(this._timeout.bind(this), timeout);
this._frame.src = params.url;
}
return this.promise;
};
IFrameWindow.prototype._success = function _success(data) {
this._cleanup();
_Log2.default.info("Successful response from frame window");
this._resolve(data);
};
IFrameWindow.prototype._error = function _error(message) {
this._cleanup();
_Log2.default.error(message);
this._reject(new Error(message));
};
IFrameWindow.prototype._cleanup = function _cleanup() {
_Log2.default.info("IFrameWindow._cleanup");
window.removeEventListener("message", this._boundMessageEvent, false);
window.clearTimeout(this._timer);
window.document.body.removeChild(this._frame);
this._timer = null;
this._frame = null;
this._boundMessageEvent = null;
};
IFrameWindow.prototype._timeout = function _timeout() {
_Log2.default.info("IFrameWindow._timeout");
this._error("Frame window timed out");
};
IFrameWindow.prototype._message = function _message(e) {
_Log2.default.info("IFrameWindow._message");
if (this._timer && e.origin === this._origin && e.source === this._frame.contentWindow) {
var url = e.data;
if (url) {
this._success({ url: url });
} else {
this._error("Invalid response from frame");
}
}
};
IFrameWindow.notifyParent = function notifyParent(url) {
_Log2.default.info("IFrameWindow.notifyParent");
if (window.parent && window !== window.parent) {
url = url || window.location.href;
if (url) {
_Log2.default.info("posting url message to parent");
window.parent.postMessage(url, location.protocol + "//" + location.host);
}
}
};
_createClass(IFrameWindow, [{
key: "promise",
get: function get() {
return this._promise;
}
}, {
key: "_origin",
get: function get() {
return location.protocol + "//" + location.host;
}
}]);
return IFrameWindow;
}();
exports.default = IFrameWindow;
module.exports = exports['default'];
/***/ },
/* 333 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var User = function () {
function User(_ref) {
var id_token = _ref.id_token;
var session_state = _ref.session_state;
var access_token = _ref.access_token;
var token_type = _ref.token_type;
var scope = _ref.scope;
var profile = _ref.profile;
var expires_at = _ref.expires_at;
var state = _ref.state;
_classCallCheck(this, User);
this.id_token = id_token;
this.session_state = session_state;
this.access_token = access_token;
this.token_type = token_type;
this.scope = scope;
this.profile = profile;
this.expires_at = expires_at;
this.state = state;
}
User.prototype.toStorageString = function toStorageString() {
_Log2.default.info("User.toStorageString");
return JSON.stringify({
id_token: this.id_token,
session_state: this.session_state,
access_token: this.access_token,
token_type: this.token_type,
scope: this.scope,
profile: this.profile,
expires_at: this.expires_at
});
};
User.fromStorageString = function fromStorageString(storageString) {
_Log2.default.info("User.fromStorageString");
return new User(JSON.parse(storageString));
};
_createClass(User, [{
key: "expires_in",
get: function get() {
if (this.expires_at) {
var now = parseInt(Date.now() / 1000);
return this.expires_at - now;
}
return undefined;
}
}, {
key: "expired",
get: function get() {
var expires_in = this.expires_in;
if (expires_in !== undefined) {
return expires_in <= 0;
}
return undefined;
}
}, {
key: "scopes",
get: function get() {
return (this.scope || "").split(" ");
}
}]);
return User;
}();
exports.default = User;
module.exports = exports['default'];
/***/ },
/* 334 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
var _AccessTokenEvents2 = __webpack_require__(335);
var _AccessTokenEvents3 = _interopRequireDefault(_AccessTokenEvents2);
var _Event = __webpack_require__(337);
var _Event2 = _interopRequireDefault(_Event);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var UserManagerEvents = function (_AccessTokenEvents) {
_inherits(UserManagerEvents, _AccessTokenEvents);
function UserManagerEvents(settings) {
_classCallCheck(this, UserManagerEvents);
var _this = _possibleConstructorReturn(this, _AccessTokenEvents.call(this, settings));
_this._userLoaded = new _Event2.default("User loaded");
_this._userUnloaded = new _Event2.default("User unloaded");
_this._silentRenewError = new _Event2.default("Silent renew error");
return _this;
}
UserManagerEvents.prototype.load = function load(user) {
var raiseEvent = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1];
_Log2.default.info("UserManagerEvents.load");
_AccessTokenEvents.prototype.load.call(this, user);
if (raiseEvent) {
this._userLoaded.raise(user);
}
};
UserManagerEvents.prototype.unload = function unload() {
_Log2.default.info("UserManagerEvents.unload");
_AccessTokenEvents.prototype.unload.call(this);
this._userUnloaded.raise();
};
UserManagerEvents.prototype.addUserLoaded = function addUserLoaded(cb) {
this._userLoaded.addHandler(cb);
};
UserManagerEvents.prototype.removeUserLoaded = function removeUserLoaded(cb) {
this._userLoaded.removeHandler(cb);
};
UserManagerEvents.prototype.addUserUnloaded = function addUserUnloaded(cb) {
this._userUnloaded.addHandler(cb);
};
UserManagerEvents.prototype.removeUserUnloaded = function removeUserUnloaded(cb) {
this._userUnloaded.removeHandler(cb);
};
UserManagerEvents.prototype.addSilentRenewError = function addSilentRenewError(cb) {
this._silentRenewError.addHandler(cb);
};
UserManagerEvents.prototype.removeSilentRenewError = function removeSilentRenewError(cb) {
this._silentRenewError.removeHandler(cb);
};
UserManagerEvents.prototype._raiseSilentRenewError = function _raiseSilentRenewError(e) {
_Log2.default.info("UserManagerEvents._raiseSilentRenewError", e.message);
this._silentRenewError.raise(e);
};
return UserManagerEvents;
}(_AccessTokenEvents3.default);
exports.default = UserManagerEvents;
module.exports = exports['default'];
/***/ },
/* 335 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
var _Timer = __webpack_require__(336);
var _Timer2 = _interopRequireDefault(_Timer);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var DefaultAccessTokenExpiringNotificationTime = 60;
var AccessTokenEvents = function () {
function AccessTokenEvents() {
var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var _ref$accessTokenExpir = _ref.accessTokenExpiringNotificationTime;
var accessTokenExpiringNotificationTime = _ref$accessTokenExpir === undefined ? DefaultAccessTokenExpiringNotificationTime : _ref$accessTokenExpir;
var _ref$accessTokenExpir2 = _ref.accessTokenExpiringTimer;
var accessTokenExpiringTimer = _ref$accessTokenExpir2 === undefined ? new _Timer2.default("Access token expiring") : _ref$accessTokenExpir2;
var _ref$accessTokenExpir3 = _ref.accessTokenExpiredTimer;
var accessTokenExpiredTimer = _ref$accessTokenExpir3 === undefined ? new _Timer2.default("Access token expired") : _ref$accessTokenExpir3;
_classCallCheck(this, AccessTokenEvents);
this._accessTokenExpiringNotificationTime = accessTokenExpiringNotificationTime;
this._accessTokenExpiring = accessTokenExpiringTimer;
this._accessTokenExpired = accessTokenExpiredTimer;
}
AccessTokenEvents.prototype.load = function load(container) {
_Log2.default.info("AccessTokenEvents.load");
this._cancelTimers();
// only register events if there's an access token where we care about expiration
if (container.access_token) {
var duration = container.expires_in;
_Log2.default.info("access token present, remaining duration:", duration);
if (duration > 0) {
// only register expiring if we still have time
var expiring = duration - this._accessTokenExpiringNotificationTime;
if (expiring <= 0) {
expiring = 1;
}
_Log2.default.info("registering expiring timer in:", expiring);
this._accessTokenExpiring.init(expiring);
}
// always register expired. if it's negative, it will still fire
var expired = duration + 1;
_Log2.default.info("registering expired timer in:", expired);
this._accessTokenExpired.init(expired);
}
};
AccessTokenEvents.prototype.unload = function unload() {
_Log2.default.info("AccessTokenEvents.unload");
this._cancelTimers();
};
AccessTokenEvents.prototype._cancelTimers = function _cancelTimers() {
_Log2.default.info("canceling existing access token timers");
this._accessTokenExpiring.cancel();
this._accessTokenExpired.cancel();
};
AccessTokenEvents.prototype.addAccessTokenExpiring = function addAccessTokenExpiring(cb) {
this._accessTokenExpiring.addHandler(cb);
};
AccessTokenEvents.prototype.removeAccessTokenExpiring = function removeAccessTokenExpiring(cb) {
this._accessTokenExpiring.removeHandler(cb);
};
AccessTokenEvents.prototype.addAccessTokenExpired = function addAccessTokenExpired(cb) {
this._accessTokenExpired.addHandler(cb);
};
AccessTokenEvents.prototype.removeAccessTokenExpired = function removeAccessTokenExpired(cb) {
this._accessTokenExpired.removeHandler(cb);
};
return AccessTokenEvents;
}();
exports.default = AccessTokenEvents;
module.exports = exports['default'];
/***/ },
/* 336 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
var _Global = __webpack_require__(304);
var _Global2 = _interopRequireDefault(_Global);
var _Event2 = __webpack_require__(337);
var _Event3 = _interopRequireDefault(_Event2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var Timer = function (_Event) {
_inherits(Timer, _Event);
function Timer(name) {
var timer = arguments.length <= 1 || arguments[1] === undefined ? _Global2.default.timer : arguments[1];
_classCallCheck(this, Timer);
var _this = _possibleConstructorReturn(this, _Event.call(this, name));
_this._timer = timer;
return _this;
}
Timer.prototype.init = function init(duration) {
this.cancel();
if (duration <= 0) {
duration = 1;
}
this._timerHandle = this._timer.setTimeout(this._callback.bind(this), duration * 1000);
};
Timer.prototype.cancel = function cancel() {
if (this._timerHandle) {
this._timer.clearTimeout(this._timerHandle);
this._timerHandle = null;
}
};
Timer.prototype._callback = function _callback() {
this._timerHandle = null;
_Event.prototype.raise.call(this);
};
return Timer;
}(_Event3.default);
exports.default = Timer;
module.exports = exports['default'];
/***/ },
/* 337 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var Event = function () {
function Event(name) {
_classCallCheck(this, Event);
this._name = name;
this._callbacks = [];
}
Event.prototype.addHandler = function addHandler(cb) {
this._callbacks.push(cb);
};
Event.prototype.removeHandler = function removeHandler(cb) {
var idx = this._callbacks.findIndex(function (item) {
return item === cb;
});
if (idx >= 0) {
this._callbacks.splice(idx, 1);
}
};
Event.prototype.raise = function raise() {
_Log2.default.info("Raising event: " + this._name);
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = this._callbacks[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var cb = _step.value;
cb.apply(undefined, arguments);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
};
return Event;
}();
exports.default = Event;
module.exports = exports['default'];
/***/ },
/* 338 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var SilentRenewService = function () {
function SilentRenewService(userManager) {
_classCallCheck(this, SilentRenewService);
this._userManager = userManager;
this._userManager.events.addAccessTokenExpiring(this._tokenExpiring.bind(this));
// this will trigger loading of the user so the expiring events can be initialized
this._userManager.getUser().then(function (user) {
// deliberate nop
}).catch(function (err) {
// catch to suppress errors since we're in a ctor
_Log2.default.error("Error from getUser:", err.message);
});
}
SilentRenewService.prototype._tokenExpiring = function _tokenExpiring() {
var _this = this;
_Log2.default.info("SilentRenewService automatically renewing access token");
this._userManager.signinSilent().then(function (user) {
_Log2.default.info("Silent token renewal successful");
}, function (err) {
_Log2.default.error("Error from signinSilent:", err.message);
_this._userManager.events._raiseSilentRenewError(err);
});
};
return SilentRenewService;
}();
exports.default = SilentRenewService;
module.exports = exports['default'];
/***/ },
/* 339 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
var _CordovaPopupWindow = __webpack_require__(340);
var _CordovaPopupWindow2 = _interopRequireDefault(_CordovaPopupWindow);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var CordovaPopupNavigator = function () {
function CordovaPopupNavigator() {
_classCallCheck(this, CordovaPopupNavigator);
}
CordovaPopupNavigator.prototype.prepare = function prepare(params) {
var popup = new _CordovaPopupWindow2.default(params);
return Promise.resolve(popup);
};
return CordovaPopupNavigator;
}();
exports.default = CordovaPopupNavigator;
module.exports = exports['default'];
/***/ },
/* 340 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var DefaultPopupFeatures = 'location=no,toolbar=no,zoom=no';
var DefaultPopupTarget = "_blank";
var CordovaPopupWindow = function () {
function CordovaPopupWindow(params) {
var _this = this;
_classCallCheck(this, CordovaPopupWindow);
_Log2.default.info("CordovaPopupWindow.ctor");
this._promise = new Promise(function (resolve, reject) {
_this._resolve = resolve;
_this._reject = reject;
});
this.features = params.popupWindowFeatures || DefaultPopupFeatures;
this.target = params.popupWindowTarget || DefaultPopupTarget;
this.redirect_uri = params.startUrl;
_Log2.default.info("redirect_uri: " + this.redirect_uri);
}
CordovaPopupWindow.prototype._isInAppBrowserInstalled = function _isInAppBrowserInstalled(cordovaMetadata) {
return ["cordova-plugin-inappbrowser", "cordova-plugin-inappbrowser.inappbrowser", "org.apache.cordova.inappbrowser"].some(function (name) {
return cordovaMetadata.hasOwnProperty(name);
});
};
CordovaPopupWindow.prototype.navigate = function navigate(params) {
_Log2.default.info("CordovaPopupWindow.navigate");
if (!params || !params.url) {
this._error("No url provided");
} else {
if (!window.cordova) {
return this._error("cordova is undefined");
}
var cordovaMetadata = window.cordova.require("cordova/plugin_list").metadata;
if (this._isInAppBrowserInstalled(cordovaMetadata) === false) {
return this._error("InAppBrowser plugin not found");
}
this._popup = cordova.InAppBrowser.open(params.url, this.target, this.features);
if (this._popup) {
_Log2.default.info("popup successfully created");
this._exitCallbackEvent = this._exitCallback.bind(this);
this._loadStartCallbackEvent = this._loadStartCallback.bind(this);
this._popup.addEventListener("exit", this._exitCallbackEvent, false);
this._popup.addEventListener("loadstart", this._loadStartCallbackEvent, false);
} else {
this._error("Error opening popup window");
}
}
return this.promise;
};
CordovaPopupWindow.prototype._loadStartCallback = function _loadStartCallback(event) {
if (event.url.indexOf(this.redirect_uri) === 0) {
this._success({ url: event.url });
}
};
CordovaPopupWindow.prototype._exitCallback = function _exitCallback(message) {
this._error(message);
};
CordovaPopupWindow.prototype._success = function _success(data) {
this._cleanup();
_Log2.default.info("Successful response from cordova popup window");
this._resolve(data);
};
CordovaPopupWindow.prototype._error = function _error(message) {
this._cleanup();
_Log2.default.error(message);
this._reject(new Error(message));
};
CordovaPopupWindow.prototype._cleanup = function _cleanup() {
_Log2.default.info("CordovaPopupWindow._cleanup");
if (this._popup) {
this._popup.removeEventListener("exit", this._exitCallbackEvent, false);
this._popup.removeEventListener("loadstart", this._loadStartCallbackEvent, false);
this._popup.close();
}
this._popup = null;
};
_createClass(CordovaPopupWindow, [{
key: 'promise',
get: function get() {
return this._promise;
}
}]);
return CordovaPopupWindow;
}();
exports.default = CordovaPopupWindow;
module.exports = exports['default'];
/***/ },
/* 341 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Log = __webpack_require__(300);
var _Log2 = _interopRequireDefault(_Log);
var _CordovaPopupWindow = __webpack_require__(340);
var _CordovaPopupWindow2 = _interopRequireDefault(_CordovaPopupWindow);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
var CordovaIFrameNavigator = function () {
function CordovaIFrameNavigator() {
_classCallCheck(this, CordovaIFrameNavigator);
}
CordovaIFrameNavigator.prototype.prepare = function prepare(params) {
params.popupWindowFeatures = 'hidden=yes';
var popup = new _CordovaPopupWindow2.default(params);
return Promise.resolve(popup);
};
return CordovaIFrameNavigator;
}();
exports.default = CordovaIFrameNavigator;
module.exports = exports['default'];
/***/ }
/******/ ]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgNTRkMDg0MjY5N2NiOGRkYmRhNDgiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvc2hpbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2hhcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19mYWlscy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19leHBvcnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY29yZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2N0eC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX21ldGEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3drcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL193a3MtZXh0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3drcy1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fbGlicmFyeS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19rZXlvZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2lvYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdG8taW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLWtleS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2VudW0ta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWRwcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19odG1sLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1nb3BuLWV4dC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXNhcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190by1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZnJlZXplLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5zZWFsLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWZyb3plbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtc2VhbGVkLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1leHRlbnNpYmxlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWFzc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc2FtZS12YWx1ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zZXQtcHJvdG8uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19jbGFzc29mLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmJpbmQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYmluZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pbnZva2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24ubmFtZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5oYXMtaW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucGFyc2UtaW50LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3BhcnNlLWludC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctdHJpbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctd3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucGFyc2UtZmxvYXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcGFyc2UtZmxvYXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2luaGVyaXQtaWYtcmVxdWlyZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnRvLWZpeGVkLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2EtbnVtYmVyLXZhbHVlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1yZXBlYXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnRvLXByZWNpc2lvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuZXBzaWxvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtZmluaXRlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2lzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLW5hbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5tYXgtc2FmZS1pbnRlZ2VyLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5taW4tc2FmZS1pbnRlZ2VyLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIucGFyc2UtaW50LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYWNvc2guanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fbWF0aC1sb2cxcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmFzaW5oLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYXRhbmguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jYnJ0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX21hdGgtc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNsejMyLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY29zaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmV4cG0xLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX21hdGgtZXhwbTEuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5mcm91bmQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5oeXBvdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmltdWwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cxMC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzFwLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnNpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5zaW5oLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudGFuaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnRydW5jLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mcm9tLWNvZGUtcG9pbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJhdy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcudHJpbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItZGVmaW5lLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuY29kZS1wb2ludC1hdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZW5kcy13aXRoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1jb250ZXh0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2lzLXJlZ2V4cC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19mYWlscy1pcy1yZWdleHAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmluY2x1ZGVzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5yZXBlYXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN0YXJ0cy13aXRoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5hbmNob3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWh0bWwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJpZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYmxpbmsuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJvbGQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZpeGVkLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mb250Y29sb3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRzaXplLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGFsaWNzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5saW5rLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zbWFsbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3RyaWtlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdWIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN1cC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLm5vdy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLWpzb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1pc28tc3RyaW5nLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUudG8tc3RyaW5nLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUudG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2RhdGUtdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmlzLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZyb20uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXRlci1jYWxsLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LWl0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY3JlYXRlLXByb3BlcnR5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItZGV0ZWN0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lm9mLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmpvaW4uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc3RyaWN0LW1ldGhvZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zbGljZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zb3J0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZvci1lYWNoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LW1ldGhvZHMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5tYXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmlsdGVyLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNvbWUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZXZlcnkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LXJlZHVjZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UtcmlnaHQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaW5kZXgtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkubGFzdC1pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5jb3B5LXdpdGhpbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1jb3B5LXdpdGhpbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1maWxsLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbmQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmluZC1pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zcGVjaWVzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZmxhZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuZmxhZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLm1hdGNoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2ZpeC1yZS13a3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnJlcGxhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuc3BsaXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19mb3Itb2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190YXNrLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX21pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWFwLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24tc3Ryb25nLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc2V0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LndlYWstbWFwLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24td2Vhay5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi53ZWFrLXNldC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5hcnJheS1idWZmZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdHlwZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdHlwZWQtYnVmZmVyLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmRhdGEtdmlldy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQ4LWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3R5cGVkLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvY29yZS5pcy1pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1jbGFtcGVkLWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmludDE2LWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQxNi1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQzMi1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50MzItYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZmxvYXQzMi1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDY0LWFycmF5LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuYXBwbHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWxldGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5lbnVtZXJhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuaGFzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuaXMtZXh0ZW5zaWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0Lm93bi1rZXlzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX293bi1rZXlzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QucHJldmVudC1leHRlbnNpb25zLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0LmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5hcnJheS5pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcuYXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1zdGFydC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctcGFkLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtZW5kLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLWxlZnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tcmlnaHQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLm1hdGNoLWFsbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3ltYm9sLm9ic2VydmFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LnZhbHVlcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtdG8tYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmVudHJpZXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWZvcmNlZC1wYW0uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1zZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0Lmxvb2t1cC1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0Lmxvb2t1cC1zZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcubWFwLnRvLWpzb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi10by1qc29uLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LWZyb20taXRlcmFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc2V0LnRvLWpzb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3lzdGVtLmdsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5lcnJvci5pcy1lcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmlhZGRoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguaXN1YmguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pbXVsaC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnVtdWxoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVmaW5lLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX21ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVsZXRlLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS1rZXlzLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuaGFzLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuaGFzLW93bi1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lm1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LmFzYXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JzZXJ2YWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL3dlYi50aW1lcnMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcGFydGlhbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19wYXRoLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvd2ViLmltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2JhYmVsLXJlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvZm4vcmVnZXhwL2VzY2FwZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2NvcmUucmVnZXhwLmVzY2FwZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19yZXBsYWNlci5qcyIsIndlYnBhY2s6Ly8vLi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvTG9nLmpzIiwid2VicGFjazovLy8uL3NyYy9PaWRjQ2xpZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9PaWRjQ2xpZW50U2V0dGluZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1dlYlN0b3JhZ2VTdGF0ZVN0b3JlLmpzIiwid2VicGFjazovLy8uL3NyYy9HbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Jlc3BvbnNlVmFsaWRhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9NZXRhZGF0YVNlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0pzb25TZXJ2aWNlLmpzIiwid2VicGFjazovLy8uL3NyYy9Vc2VySW5mb1NlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0Vycm9yUmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0pvc2VVdGlsLmpzIiwid2VicGFjazovLy8uL34vanNyc2FzaWduL2xpYi9qc3JzYXNpZ24uanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9+L25vZGUtbGlicy1icm93c2VyL34vYnVmZmVyL2luZGV4LmpzIiwid2VicGFjazovLy8od2VicGFjaykvfi9ub2RlLWxpYnMtYnJvd3Nlci9+L2J1ZmZlci9+L2Jhc2U2NC1qcy9saWIvYjY0LmpzIiwid2VicGFjazovLy8od2VicGFjaykvfi9ub2RlLWxpYnMtYnJvd3Nlci9+L2J1ZmZlci9+L2llZWU3NTQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9+L25vZGUtbGlicy1icm93c2VyL34vYnVmZmVyL34vaXNhcnJheS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2lnbmluUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVXJsVXRpbGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2lnbmluU3RhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1N0YXRlLmpzIiwid2VicGFjazovLy8uL3NyYy9yYW5kb20uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpZ25pblJlc3BvbnNlLmpzIiwid2VicGFjazovLy8uL3NyYy9TaWdub3V0UmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvU2lnbm91dFJlc3BvbnNlLmpzIiwid2VicGFjazovLy8uL3NyYy9Jbk1lbW9yeVdlYlN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1VzZXJNYW5hZ2VyLmpzIiwid2VicGFjazovLy8uL3NyYy9Vc2VyTWFuYWdlclNldHRpbmdzLmpzIiwid2VicGFjazovLy8uL3NyYy9SZWRpcmVjdE5hdmlnYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvUG9wdXBOYXZpZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1BvcHVwV2luZG93LmpzIiwid2VicGFjazovLy8uL3NyYy9JRnJhbWVOYXZpZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0lGcmFtZVdpbmRvdy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVXNlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVXNlck1hbmFnZXJFdmVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0FjY2Vzc1Rva2VuRXZlbnRzLmpzIiwid2VicGFjazovLy8uL3NyYy9UaW1lci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvRXZlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1NpbGVudFJlbmV3U2VydmljZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvQ29yZG92YVBvcHVwTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9Db3Jkb3ZhUG9wdXBXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0NvcmRvdmFJRnJhbWVOYXZpZ2F0b3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUN0Q0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7OztBQy9CRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDO0FBQ0Q7QUFDQTtBQUNBLDRGQUEyRjtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQSxFQUFDOztBQUVELHdDOzs7Ozs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEc7Ozs7OztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU8sV0FBVztBQUNsQjtBQUNBO0FBQ0EsUUFBTyxVQUFVO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTyxXQUFXO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLFFBQU8sV0FBVztBQUNsQjtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QVk7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3REFBdUQsNkNBQTZDLEVBQUU7O0FBRXRHO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTCxrREFBaUQ7QUFDakQ7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTCxvQ0FBbUM7QUFDbkM7QUFDQSxNQUFLO0FBQ0wsdUVBQXNFO0FBQ3RFO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsNkRBQTREO0FBQzVEO0FBQ0EsTUFBSztBQUNMLHVFQUFzRTtBQUN0RTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUCxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0NBQStCLFNBQVMsRTs7Ozs7O0FDOUJ4QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDZEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDOztBQUVELHNDOzs7Ozs7QUNYQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDVEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ1REO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNmQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDVEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxlOzs7Ozs7QUNORDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLGE7Ozs7OztBQ05EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVU7QUFDVixFQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUM3QkQsMEM7Ozs7OztBQ0FBLHVDOzs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDbEJEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDUkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQSxHOzs7Ozs7QUNmQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ1JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkNBQTBDLDZEQUE2RDtBQUN2RztBQUNBLEVBQUMsRTs7Ozs7O0FDWEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNEMsYUFBYTtBQUN6RDtBQUNBLEVBQUMsRTs7Ozs7O0FDTkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMEMsNkRBQTZEO0FBQ3ZHO0FBQ0EsRUFBQyxFOzs7Ozs7QUNYRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLEVBQUMsRTs7Ozs7O0FDakJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0EsRUFBQyxFOzs7Ozs7QUNqQkQ7QUFDQTs7QUFFQSx3Q0FBdUMsd0NBQWdELEU7Ozs7OztBQ0h2RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRzs7Ozs7O0FDUkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ05BO0FBQ0E7O0FBRUEsd0NBQXVDLHdDQUFnRCxFOzs7Ozs7QUNIdkY7QUFDQTs7QUFFQSwrQkFBOEIsK0JBQTZCLEU7Ozs7OztBQ0gzRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ1JEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ1ZEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFDLEU7Ozs7OztBQ1ZEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQyxFOzs7Ozs7QUNmRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUMsRTs7Ozs7O0FDZkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBYztBQUNkO0FBQ0EsR0FBRSxFOzs7Ozs7QUNQRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBc0QsZ0JBQWdCLEVBQUU7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHOzs7Ozs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxlQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFFLEU7Ozs7OztBQ2RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBYztBQUNkO0FBQ0EsR0FBRSxFOzs7Ozs7QUNoQkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBYztB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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTBDLFdBQVc7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsNEJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBVztBQUNYO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNB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O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsWUFBWTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWlCLFlBQVk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFnQixvQ0FBb0M7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBaUIsWUFBWTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWUsaUJBQWlCO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYSxpQkFBaUI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBZ0QsRUFBRTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW1CLDZCQUE2QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBLG9CQUFtQixjQUFjO0FBQ2pDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3REFBdUQsT0FBTztBQUM5RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0RBQXVELE9BQU87QUFDOUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBcUIsUUFBUTtBQUM3QjtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0EsZ0JBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLG1CQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBLG9CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQSx3Q0FBdUMsU0FBUztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWlCLFlBQVk7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBaUIsZ0JBQWdCO0FBQ2pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDM2dEQTs7QUFFQSxFQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtEQUFpRCxZQUFZO0FBQzdEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFDLDZCQUFxRDs7Ozs7OztBQzNIdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVEsV0FBVzs7QUFFbkI7QUFDQTtBQUNBO0FBQ0EsU0FBUSxXQUFXOztBQUVuQjtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0EsSUFBRztBQUNI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QkFuQ2E7QUFDVixvQkFBTyxLQUFLLFFBQVo7QUFDSDs7Ozs7O21CQXZEZ0Isa0I7Ozs7Ozs7Ozs7Ozs7QUNMckI7Ozs7QUFDQTs7Ozs7Ozs7O0tBRXFCLHNCOzs7OztzQ0FFakIsTyxvQkFBUSxNLEVBQVE7QUFDWixnQkFBTyxtQkFBUCxHQUE2QixZQUE3QjtBQUNBLGFBQUksUUFBUSxpQ0FBdUIsTUFBdkIsQ0FBWjtBQUNBLGdCQUFPLFFBQVEsT0FBUixDQUFnQixLQUFoQixDQUFQO0FBQ0gsTTs7Ozs7bUJBTmdCLHNCIiwiZmlsZSI6Im9pZGMtY2xpZW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGV4cG9ydHM6IHt9LFxuIFx0XHRcdGlkOiBtb2R1bGVJZCxcbiBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiB3ZWJwYWNrL2Jvb3RzdHJhcCA1NGQwODQyNjk3Y2I4ZGRiZGE0OFxuICoqLyIsIi8qaXN0YW5idWwgaWdub3JlIG5leHQqL1widXNlIHN0cmljdFwiO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBuZXh0Ki9yZXF1aXJlKFwiY29yZS1qcy9zaGltXCIpO1xuXG4vKmlzdGFuYnVsIGlnbm9yZSBuZXh0Ki9yZXF1aXJlKFwiYmFiZWwtcmVnZW5lcmF0b3ItcnVudGltZVwiKTtcblxuLyppc3RhbmJ1bCBpZ25vcmUgbmV4dCovcmVxdWlyZShcImNvcmUtanMvZm4vcmVnZXhwL2VzY2FwZVwiKTtcblxuLyogZXNsaW50IG1heC1sZW46IDAgKi9cblxuaWYgKGdsb2JhbC5fYmFiZWxQb2x5ZmlsbCkge1xuICB0aHJvdyBuZXcgRXJyb3IoXCJvbmx5IG9uZSBpbnN0YW5jZSBvZiBiYWJlbC1wb2x5ZmlsbCBpcyBhbGxvd2VkXCIpO1xufVxuZ2xvYmFsLl9iYWJlbFBvbHlmaWxsID0gdHJ1ZTtcblxuLy8gU2hvdWxkIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZTpcblxudmFyIERFRklORV9QUk9QRVJUWSA9IFwiZGVmaW5lUHJvcGVydHlcIjtcbmZ1bmN0aW9uIGRlZmluZShPLCBrZXksIHZhbHVlKSB7XG4gIE9ba2V5XSB8fCBPYmplY3RbREVGSU5FX1BST1BFUlRZXShPLCBrZXksIHtcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IHZhbHVlXG4gIH0pO1xufVxuXG5kZWZpbmUoU3RyaW5nLnByb3RvdHlwZSwgXCJwYWRMZWZ0XCIsIFwiXCIucGFkU3RhcnQpO1xuZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIFwicGFkUmlnaHRcIiwgXCJcIi5wYWRFbmQpO1xuXG5cInBvcCxyZXZlcnNlLHNoaWZ0LGtleXMsdmFsdWVzLGVudHJpZXMsaW5kZXhPZixldmVyeSxzb21lLGZvckVhY2gsbWFwLGZpbHRlcixmaW5kLGZpbmRJbmRleCxpbmNsdWRlcyxqb2luLHNsaWNlLGNvbmNhdCxwdXNoLHNwbGljZSx1bnNoaWZ0LHNvcnQsbGFzdEluZGV4T2YscmVkdWNlLHJlZHVjZVJpZ2h0LGNvcHlXaXRoaW4sZmlsbFwiLnNwbGl0KFwiLFwiKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgW11ba2V5XSAmJiBkZWZpbmUoQXJyYXksIGtleSwgRnVuY3Rpb24uY2FsbC5iaW5kKFtdW2tleV0pKTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL2xpYi9pbmRleC5qc1xuICoqIG1vZHVsZSBpZCA9IDFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3ltYm9sJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5jcmVhdGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0eScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnRpZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZnJlZXplJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5zZWFsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5wcmV2ZW50LWV4dGVuc2lvbnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzLWZyb3plbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtc2VhbGVkJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1leHRlbnNpYmxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZnVuY3Rpb24uYmluZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5mdW5jdGlvbi5uYW1lJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmhhcy1pbnN0YW5jZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5wYXJzZS1pbnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucGFyc2UtZmxvYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmNvbnN0cnVjdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci50by1maXhlZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIudG8tcHJlY2lzaW9uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5lcHNpbG9uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1maW5pdGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmlzLWludGVnZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmlzLW5hbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5tYXgtc2FmZS1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5taW4tc2FmZS1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1mbG9hdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIucGFyc2UtaW50Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguYWNvc2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5hc2luaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmF0YW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguY2JydCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmNsejMyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguY29zaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmV4cG0xJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguZnJvdW5kJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguaHlwb3QnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5pbXVsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgubG9nMTAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5sb2cxcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmxvZzInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5zaWduJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguc2luaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnRhbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC50cnVuYycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZnJvbS1jb2RlLXBvaW50Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5yYXcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnRyaW0nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5jb2RlLXBvaW50LWF0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5lbmRzLXdpdGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmluY2x1ZGVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5yZXBlYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnN0YXJ0cy13aXRoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5hbmNob3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmJpZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuYmxpbmsnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmJvbGQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmZpeGVkJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5mb250Y29sb3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRzaXplJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5pdGFsaWNzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5saW5rJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zbWFsbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc3RyaWtlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zdWInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnN1cCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLm5vdycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLnRvLWpzb24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS50by1pc28tc3RyaW5nJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmRhdGUudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmRhdGUudG8tcHJpbWl0aXZlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmlzLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZyb20nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkub2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuam9pbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5zbGljZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5zb3J0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZvci1lYWNoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5Lm1hcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5maWx0ZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuc29tZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5ldmVyeScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlLXJpZ2h0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmluZGV4LW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5Lmxhc3QtaW5kZXgtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuY29weS13aXRoaW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmlsbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5maW5kJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZpbmQtaW5kZXgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuc3BlY2llcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuY29uc3RydWN0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuZmxhZ3MnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLm1hdGNoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5zZWFyY2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLnNwbGl0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnByb21pc2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnNldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi53ZWFrLW1hcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi53ZWFrLXNldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5hcnJheS1idWZmZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuZGF0YS12aWV3Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmludDgtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQudWludDgtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQudWludDgtY2xhbXBlZC1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5pbnQxNi1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC51aW50MTYtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuaW50MzItYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQudWludDMyLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmZsb2F0MzItYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuZmxvYXQ2NC1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmFwcGx5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuY29uc3RydWN0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZW51bWVyYXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmhhcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmlzLWV4dGVuc2libGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5vd24ta2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnByZXZlbnQtZXh0ZW5zaW9ucycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuYXJyYXkuaW5jbHVkZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLmF0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtc3RhcnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1lbmQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tbGVmdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1yaWdodCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcubWF0Y2gtYWxsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtZ2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtc2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtZ2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtc2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hcC50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnNldC50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN5c3RlbS5nbG9iYWwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuZXJyb3IuaXMtZXJyb3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5pYWRkaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmlzdWJoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguaW11bGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC51bXVsaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlZmluZS1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlbGV0ZS1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YS1rZXlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEta2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1vd24tbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5hc2FwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9ic2VydmFibGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy93ZWIudGltZXJzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvd2ViLmltbWVkaWF0ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9tb2R1bGVzL19jb3JlJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL3NoaW0uanNcbiAqKiBtb2R1bGUgaWQgPSAyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBFQ01BU2NyaXB0IDYgc3ltYm9scyBzaGltXG52YXIgZ2xvYmFsICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBERVNDUklQVE9SUyAgICA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJylcbiAgLCAkZXhwb3J0ICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgcmVkZWZpbmUgICAgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgTUVUQSAgICAgICAgICAgPSByZXF1aXJlKCcuL19tZXRhJykuS0VZXG4gICwgJGZhaWxzICAgICAgICAgPSByZXF1aXJlKCcuL19mYWlscycpXG4gICwgc2hhcmVkICAgICAgICAgPSByZXF1aXJlKCcuL19zaGFyZWQnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIHVpZCAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdWlkJylcbiAgLCB3a3MgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpXG4gICwgd2tzRXh0ICAgICAgICAgPSByZXF1aXJlKCcuL193a3MtZXh0JylcbiAgLCB3a3NEZWZpbmUgICAgICA9IHJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKVxuICAsIGtleU9mICAgICAgICAgID0gcmVxdWlyZSgnLi9fa2V5b2YnKVxuICAsIGVudW1LZXlzICAgICAgID0gcmVxdWlyZSgnLi9fZW51bS1rZXlzJylcbiAgLCBpc0FycmF5ICAgICAgICA9IHJlcXVpcmUoJy4vX2lzLWFycmF5JylcbiAgLCBhbk9iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgdG9JT2JqZWN0ICAgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCB0b1ByaW1pdGl2ZSAgICA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpXG4gICwgY3JlYXRlRGVzYyAgICAgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJylcbiAgLCBfY3JlYXRlICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKVxuICAsIGdPUE5FeHQgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4tZXh0JylcbiAgLCAkR09QRCAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJylcbiAgLCAkRFAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgJGtleXMgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgZ09QRCAgICAgICAgICAgPSAkR09QRC5mXG4gICwgZFAgICAgICAgICAgICAgPSAkRFAuZlxuICAsIGdPUE4gICAgICAgICAgID0gZ09QTkV4dC5mXG4gICwgJFN5bWJvbCAgICAgICAgPSBnbG9iYWwuU3ltYm9sXG4gICwgJEpTT04gICAgICAgICAgPSBnbG9iYWwuSlNPTlxuICAsIF9zdHJpbmdpZnkgICAgID0gJEpTT04gJiYgJEpTT04uc3RyaW5naWZ5XG4gICwgUFJPVE9UWVBFICAgICAgPSAncHJvdG90eXBlJ1xuICAsIEhJRERFTiAgICAgICAgID0gd2tzKCdfaGlkZGVuJylcbiAgLCBUT19QUklNSVRJVkUgICA9IHdrcygndG9QcmltaXRpdmUnKVxuICAsIGlzRW51bSAgICAgICAgID0ge30ucHJvcGVydHlJc0VudW1lcmFibGVcbiAgLCBTeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3ltYm9sLXJlZ2lzdHJ5JylcbiAgLCBBbGxTeW1ib2xzICAgICA9IHNoYXJlZCgnc3ltYm9scycpXG4gICwgT1BTeW1ib2xzICAgICAgPSBzaGFyZWQoJ29wLXN5bWJvbHMnKVxuICAsIE9iamVjdFByb3RvICAgID0gT2JqZWN0W1BST1RPVFlQRV1cbiAgLCBVU0VfTkFUSVZFICAgICA9IHR5cGVvZiAkU3ltYm9sID09ICdmdW5jdGlvbidcbiAgLCBRT2JqZWN0ICAgICAgICA9IGdsb2JhbC5RT2JqZWN0O1xuLy8gRG9uJ3QgdXNlIHNldHRlcnMgaW4gUXQgU2NyaXB0LCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTczXG52YXIgc2V0dGVyID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDtcblxuLy8gZmFsbGJhY2sgZm9yIG9sZCBBbmRyb2lkLCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Njg3XG52YXIgc2V0U3ltYm9sRGVzYyA9IERFU0NSSVBUT1JTICYmICRmYWlscyhmdW5jdGlvbigpe1xuICByZXR1cm4gX2NyZWF0ZShkUCh7fSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpeyByZXR1cm4gZFAodGhpcywgJ2EnLCB7dmFsdWU6IDd9KS5hOyB9XG4gIH0pKS5hICE9IDc7XG59KSA/IGZ1bmN0aW9uKGl0LCBrZXksIEQpe1xuICB2YXIgcHJvdG9EZXNjID0gZ09QRChPYmplY3RQcm90bywga2V5KTtcbiAgaWYocHJvdG9EZXNjKWRlbGV0ZSBPYmplY3RQcm90b1trZXldO1xuICBkUChpdCwga2V5LCBEKTtcbiAgaWYocHJvdG9EZXNjICYmIGl0ICE9PSBPYmplY3RQcm90bylkUChPYmplY3RQcm90bywga2V5LCBwcm90b0Rlc2MpO1xufSA6IGRQO1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uKHRhZyl7XG4gIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfY3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7XG4gIHN5bS5fayA9IHRhZztcbiAgcmV0dXJuIHN5bTtcbn07XG5cbnZhciBpc1N5bWJvbCA9IFVTRV9OQVRJVkUgJiYgdHlwZW9mICRTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCcgPyBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG59IDogZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgaW5zdGFuY2VvZiAkU3ltYm9sO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIEQpe1xuICBpZihpdCA9PT0gT2JqZWN0UHJvdG8pJGRlZmluZVByb3BlcnR5KE9QU3ltYm9scywga2V5LCBEKTtcbiAgYW5PYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBhbk9iamVjdChEKTtcbiAgaWYoaGFzKEFsbFN5bWJvbHMsIGtleSkpe1xuICAgIGlmKCFELmVudW1lcmFibGUpe1xuICAgICAgaWYoIWhhcyhpdCwgSElEREVOKSlkUChpdCwgSElEREVOLCBjcmVhdGVEZXNjKDEsIHt9KSk7XG4gICAgICBpdFtISURERU5dW2tleV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZihoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKWl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgRCA9IF9jcmVhdGUoRCwge2VudW1lcmFibGU6IGNyZWF0ZURlc2MoMCwgZmFsc2UpfSk7XG4gICAgfSByZXR1cm4gc2V0U3ltYm9sRGVzYyhpdCwga2V5LCBEKTtcbiAgfSByZXR1cm4gZFAoaXQsIGtleSwgRCk7XG59O1xudmFyICRkZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhpdCwgUCl7XG4gIGFuT2JqZWN0KGl0KTtcbiAgdmFyIGtleXMgPSBlbnVtS2V5cyhQID0gdG9JT2JqZWN0KFApKVxuICAgICwgaSAgICA9IDBcbiAgICAsIGwgPSBrZXlzLmxlbmd0aFxuICAgICwga2V5O1xuICB3aGlsZShsID4gaSkkZGVmaW5lUHJvcGVydHkoaXQsIGtleSA9IGtleXNbaSsrXSwgUFtrZXldKTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciAkY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGl0LCBQKXtcbiAgcmV0dXJuIFAgPT09IHVuZGVmaW5lZCA/IF9jcmVhdGUoaXQpIDogJGRlZmluZVByb3BlcnRpZXMoX2NyZWF0ZShpdCksIFApO1xufTtcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShrZXkpe1xuICB2YXIgRSA9IGlzRW51bS5jYWxsKHRoaXMsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpO1xuICBpZih0aGlzID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSlyZXR1cm4gZmFsc2U7XG4gIHJldHVybiBFIHx8ICFoYXModGhpcywga2V5KSB8fCAhaGFzKEFsbFN5bWJvbHMsIGtleSkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW2tleV0gPyBFIDogdHJ1ZTtcbn07XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KXtcbiAgaXQgID0gdG9JT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgaWYoaXQgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKXJldHVybjtcbiAgdmFyIEQgPSBnT1BEKGl0LCBrZXkpO1xuICBpZihEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpRC5lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgcmV0dXJuIEQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCl7XG4gIHZhciBuYW1lcyAgPSBnT1BOKHRvSU9iamVjdChpdCkpXG4gICAgLCByZXN1bHQgPSBbXVxuICAgICwgaSAgICAgID0gMFxuICAgICwga2V5O1xuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKXtcbiAgICBpZighaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIGtleSAhPSBISURERU4gJiYga2V5ICE9IE1FVEEpcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KXtcbiAgdmFyIElTX09QICA9IGl0ID09PSBPYmplY3RQcm90b1xuICAgICwgbmFtZXMgID0gZ09QTihJU19PUCA/IE9QU3ltYm9scyA6IHRvSU9iamVjdChpdCkpXG4gICAgLCByZXN1bHQgPSBbXVxuICAgICwgaSAgICAgID0gMFxuICAgICwga2V5O1xuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKXtcbiAgICBpZihoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYgKElTX09QID8gaGFzKE9iamVjdFByb3RvLCBrZXkpIDogdHJ1ZSkpcmVzdWx0LnB1c2goQWxsU3ltYm9sc1trZXldKTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gMTkuNC4xLjEgU3ltYm9sKFtkZXNjcmlwdGlvbl0pXG5pZighVVNFX05BVElWRSl7XG4gICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKXtcbiAgICBpZih0aGlzIGluc3RhbmNlb2YgJFN5bWJvbCl0aHJvdyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciEnKTtcbiAgICB2YXIgdGFnID0gdWlkKGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgICB2YXIgJHNldCA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAgIGlmKHRoaXMgPT09IE9iamVjdFByb3RvKSRzZXQuY2FsbChPUFN5bWJvbHMsIHZhbHVlKTtcbiAgICAgIGlmKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcbiAgICAgIHNldFN5bWJvbERlc2ModGhpcywgdGFnLCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG4gICAgfTtcbiAgICBpZihERVNDUklQVE9SUyAmJiBzZXR0ZXIpc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7Y29uZmlndXJhYmxlOiB0cnVlLCBzZXQ6ICRzZXR9KTtcbiAgICByZXR1cm4gd3JhcCh0YWcpO1xuICB9O1xuICByZWRlZmluZSgkU3ltYm9sW1BST1RPVFlQRV0sICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCl7XG4gICAgcmV0dXJuIHRoaXMuX2s7XG4gIH0pO1xuXG4gICRHT1BELmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAkRFAuZiAgID0gJGRlZmluZVByb3BlcnR5O1xuICByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmYgPSBnT1BORXh0LmYgPSAkZ2V0T3duUHJvcGVydHlOYW1lcztcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpLmYgID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpLmYgPSAkZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4gIGlmKERFU0NSSVBUT1JTICYmICFyZXF1aXJlKCcuL19saWJyYXJ5Jykpe1xuICAgIHJlZGVmaW5lKE9iamVjdFByb3RvLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAkcHJvcGVydHlJc0VudW1lcmFibGUsIHRydWUpO1xuICB9XG5cbiAgd2tzRXh0LmYgPSBmdW5jdGlvbihuYW1lKXtcbiAgICByZXR1cm4gd3JhcCh3a3MobmFtZSkpO1xuICB9XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHtTeW1ib2w6ICRTeW1ib2x9KTtcblxuZm9yKHZhciBzeW1ib2xzID0gKFxuICAvLyAxOS40LjIuMiwgMTkuNC4yLjMsIDE5LjQuMi40LCAxOS40LjIuNiwgMTkuNC4yLjgsIDE5LjQuMi45LCAxOS40LjIuMTAsIDE5LjQuMi4xMSwgMTkuNC4yLjEyLCAxOS40LjIuMTMsIDE5LjQuMi4xNFxuICAnaGFzSW5zdGFuY2UsaXNDb25jYXRTcHJlYWRhYmxlLGl0ZXJhdG9yLG1hdGNoLHJlcGxhY2Usc2VhcmNoLHNwZWNpZXMsc3BsaXQsdG9QcmltaXRpdmUsdG9TdHJpbmdUYWcsdW5zY29wYWJsZXMnXG4pLnNwbGl0KCcsJyksIGkgPSAwOyBzeW1ib2xzLmxlbmd0aCA+IGk7ICl3a3Moc3ltYm9sc1tpKytdKTtcblxuZm9yKHZhciBzeW1ib2xzID0gJGtleXMod2tzLnN0b3JlKSwgaSA9IDA7IHN5bWJvbHMubGVuZ3RoID4gaTsgKXdrc0RlZmluZShzeW1ib2xzW2krK10pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCAnU3ltYm9sJywge1xuICAvLyAxOS40LjIuMSBTeW1ib2wuZm9yKGtleSlcbiAgJ2Zvcic6IGZ1bmN0aW9uKGtleSl7XG4gICAgcmV0dXJuIGhhcyhTeW1ib2xSZWdpc3RyeSwga2V5ICs9ICcnKVxuICAgICAgPyBTeW1ib2xSZWdpc3RyeVtrZXldXG4gICAgICA6IFN5bWJvbFJlZ2lzdHJ5W2tleV0gPSAkU3ltYm9sKGtleSk7XG4gIH0sXG4gIC8vIDE5LjQuMi41IFN5bWJvbC5rZXlGb3Ioc3ltKVxuICBrZXlGb3I6IGZ1bmN0aW9uIGtleUZvcihrZXkpe1xuICAgIGlmKGlzU3ltYm9sKGtleSkpcmV0dXJuIGtleU9mKFN5bWJvbFJlZ2lzdHJ5LCBrZXkpO1xuICAgIHRocm93IFR5cGVFcnJvcihrZXkgKyAnIGlzIG5vdCBhIHN5bWJvbCEnKTtcbiAgfSxcbiAgdXNlU2V0dGVyOiBmdW5jdGlvbigpeyBzZXR0ZXIgPSB0cnVlOyB9LFxuICB1c2VTaW1wbGU6IGZ1bmN0aW9uKCl7IHNldHRlciA9IGZhbHNlOyB9XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ09iamVjdCcsIHtcbiAgLy8gMTkuMS4yLjIgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuICBjcmVhdGU6ICRjcmVhdGUsXG4gIC8vIDE5LjEuMi40IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuICAvLyAxOS4xLjIuMyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKVxuICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcbiAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG4gIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICAvLyAxOS4xLjIuOCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKE8pXG4gIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1xufSk7XG5cbi8vIDI0LjMuMiBKU09OLnN0cmluZ2lmeSh2YWx1ZSBbLCByZXBsYWNlciBbLCBzcGFjZV1dKVxuJEpTT04gJiYgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoIVVTRV9OQVRJVkUgfHwgJGZhaWxzKGZ1bmN0aW9uKCl7XG4gIHZhciBTID0gJFN5bWJvbCgpO1xuICAvLyBNUyBFZGdlIGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyB7fVxuICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGxcbiAgLy8gVjggdGhyb3dzIG9uIGJveGVkIHN5bWJvbHNcbiAgcmV0dXJuIF9zdHJpbmdpZnkoW1NdKSAhPSAnW251bGxdJyB8fCBfc3RyaW5naWZ5KHthOiBTfSkgIT0gJ3t9JyB8fCBfc3RyaW5naWZ5KE9iamVjdChTKSkgIT0gJ3t9Jztcbn0pKSwgJ0pTT04nLCB7XG4gIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGl0KXtcbiAgICBpZihpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSlyZXR1cm47IC8vIElFOCByZXR1cm5zIHN0cmluZyBvbiB1bmRlZmluZWRcbiAgICB2YXIgYXJncyA9IFtpdF1cbiAgICAgICwgaSAgICA9IDFcbiAgICAgICwgcmVwbGFjZXIsICRyZXBsYWNlcjtcbiAgICB3aGlsZShhcmd1bWVudHMubGVuZ3RoID4gaSlhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHJlcGxhY2VyID0gYXJnc1sxXTtcbiAgICBpZih0eXBlb2YgcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykkcmVwbGFjZXIgPSByZXBsYWNlcjtcbiAgICBpZigkcmVwbGFjZXIgfHwgIWlzQXJyYXkocmVwbGFjZXIpKXJlcGxhY2VyID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSl7XG4gICAgICBpZigkcmVwbGFjZXIpdmFsdWUgPSAkcmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIGlmKCFpc1N5bWJvbCh2YWx1ZSkpcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgYXJnc1sxXSA9IHJlcGxhY2VyO1xuICAgIHJldHVybiBfc3RyaW5naWZ5LmFwcGx5KCRKU09OLCBhcmdzKTtcbiAgfVxufSk7XG5cbi8vIDE5LjQuMy40IFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV0oaGludClcbiRTeW1ib2xbUFJPVE9UWVBFXVtUT19QUklNSVRJVkVdIHx8IHJlcXVpcmUoJy4vX2hpZGUnKSgkU3ltYm9sW1BST1RPVFlQRV0sIFRPX1BSSU1JVElWRSwgJFN5bWJvbFtQUk9UT1RZUEVdLnZhbHVlT2YpO1xuLy8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoJFN5bWJvbCwgJ1N5bWJvbCcpO1xuLy8gMjAuMi4xLjkgTWF0aFtAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoTWF0aCwgJ01hdGgnLCB0cnVlKTtcbi8vIDI0LjMuMyBKU09OW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhnbG9iYWwuSlNPTiwgJ0pTT04nLCB0cnVlKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3ltYm9sLmpzXG4gKiogbW9kdWxlIGlkID0gM1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZiA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZih0eXBlb2YgX19nID09ICdudW1iZXInKV9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19nbG9iYWwuanNcbiAqKiBtb2R1bGUgaWQgPSA0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIGtleSl7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faGFzLmpzXG4gKiogbW9kdWxlIGlkID0gNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2Rlc2NyaXB0b3JzLmpzXG4gKiogbW9kdWxlIGlkID0gNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLmpzXG4gKiogbW9kdWxlIGlkID0gN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgY29yZSAgICAgID0gcmVxdWlyZSgnLi9fY29yZScpXG4gICwgaGlkZSAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgcmVkZWZpbmUgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIGN0eCAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgc291cmNlKXtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkZcbiAgICAsIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0LkdcbiAgICAsIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlNcbiAgICAsIElTX1BST1RPICA9IHR5cGUgJiAkZXhwb3J0LlBcbiAgICAsIElTX0JJTkQgICA9IHR5cGUgJiAkZXhwb3J0LkJcbiAgICAsIHRhcmdldCAgICA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSB8fCAoZ2xvYmFsW25hbWVdID0ge30pIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXVxuICAgICwgZXhwb3J0cyAgID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSlcbiAgICAsIGV4cFByb3RvICA9IGV4cG9ydHNbUFJPVE9UWVBFXSB8fCAoZXhwb3J0c1tQUk9UT1RZUEVdID0ge30pXG4gICAgLCBrZXksIG93biwgb3V0LCBleHA7XG4gIGlmKElTX0dMT0JBTClzb3VyY2UgPSBuYW1lO1xuICBmb3Ioa2V5IGluIHNvdXJjZSl7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IChvd24gPyB0YXJnZXQgOiBzb3VyY2UpW2tleV07XG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICBleHAgPSBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgaWYodGFyZ2V0KXJlZGVmaW5lKHRhcmdldCwga2V5LCBvdXQsIHR5cGUgJiAkZXhwb3J0LlUpO1xuICAgIC8vIGV4cG9ydFxuICAgIGlmKGV4cG9ydHNba2V5XSAhPSBvdXQpaGlkZShleHBvcnRzLCBrZXksIGV4cCk7XG4gICAgaWYoSVNfUFJPVE8gJiYgZXhwUHJvdG9ba2V5XSAhPSBvdXQpZXhwUHJvdG9ba2V5XSA9IG91dDtcbiAgfVxufTtcbmdsb2JhbC5jb3JlID0gY29yZTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWAgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2V4cG9ydC5qc1xuICoqIG1vZHVsZSBpZCA9IDhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7dmVyc2lvbjogJzIuNC4wJ307XG5pZih0eXBlb2YgX19lID09ICdudW1iZXInKV9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY29yZS5qc1xuICoqIG1vZHVsZSBpZCA9IDlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBkUCAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faGlkZS5qc1xuICoqIG1vZHVsZSBpZCA9IDEwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgYW5PYmplY3QgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKVxuICAsIHRvUHJpbWl0aXZlICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcbiAgLCBkUCAgICAgICAgICAgICA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpe1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgaWYoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKXRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmKCd2YWx1ZScgaW4gQXR0cmlidXRlcylPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHAuanNcbiAqKiBtb2R1bGUgaWQgPSAxMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoIWlzT2JqZWN0KGl0KSl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FuLW9iamVjdC5qc1xuICoqIG1vZHVsZSBpZCA9IDEyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2lzLW9iamVjdC5qc1xuICoqIG1vZHVsZSBpZCA9IDEzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XHJcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2RpdicpLCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faWU4LWRvbS1kZWZpbmUuanNcbiAqKiBtb2R1bGUgaWQgPSAxNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50XG4gIC8vIGluIG9sZCBJRSB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0J1xuICAsIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19kb20tY3JlYXRlLmpzXG4gKiogbW9kdWxlIGlkID0gMTVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIFMpe1xuICBpZighaXNPYmplY3QoaXQpKXJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcbiAgaWYodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZighUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190by1wcmltaXRpdmUuanNcbiAqKiBtb2R1bGUgaWQgPSAxNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihiaXRtYXAsIHZhbHVlKXtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlICA6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlICAgIDogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZSAgICAgICA6IHZhbHVlXG4gIH07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzXG4gKiogbW9kdWxlIGlkID0gMTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGhpZGUgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIGhhcyAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgU1JDICAgICAgID0gcmVxdWlyZSgnLi9fdWlkJykoJ3NyYycpXG4gICwgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJ1xuICAsICR0b1N0cmluZyA9IEZ1bmN0aW9uW1RPX1NUUklOR11cbiAgLCBUUEwgICAgICAgPSAoJycgKyAkdG9TdHJpbmcpLnNwbGl0KFRPX1NUUklORyk7XG5cbnJlcXVpcmUoJy4vX2NvcmUnKS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gJHRvU3RyaW5nLmNhbGwoaXQpO1xufTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oTywga2V5LCB2YWwsIHNhZmUpe1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJztcbiAgaWYoaXNGdW5jdGlvbiloYXModmFsLCAnbmFtZScpIHx8IGhpZGUodmFsLCAnbmFtZScsIGtleSk7XG4gIGlmKE9ba2V5XSA9PT0gdmFsKXJldHVybjtcbiAgaWYoaXNGdW5jdGlvbiloYXModmFsLCBTUkMpIHx8IGhpZGUodmFsLCBTUkMsIE9ba2V5XSA/ICcnICsgT1trZXldIDogVFBMLmpvaW4oU3RyaW5nKGtleSkpKTtcbiAgaWYoTyA9PT0gZ2xvYmFsKXtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgaWYoIXNhZmUpe1xuICAgICAgZGVsZXRlIE9ba2V5XTtcbiAgICAgIGhpZGUoTywga2V5LCB2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZihPW2tleV0pT1trZXldID0gdmFsO1xuICAgICAgZWxzZSBoaWRlKE8sIGtleSwgdmFsKTtcbiAgICB9XG4gIH1cbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCl7XG4gIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIHRoaXNbU1JDXSB8fCAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qc1xuICoqIG1vZHVsZSBpZCA9IDE4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgaWQgPSAwXG4gICwgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzXG4gKiogbW9kdWxlIGlkID0gMTlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIHRoYXQsIGxlbmd0aCl7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmKHRoYXQgPT09IHVuZGVmaW5lZClyZXR1cm4gZm47XG4gIHN3aXRjaChsZW5ndGgpe1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uKGEpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbihhLCBiKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24oYSwgYiwgYyl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbigvKiAuLi5hcmdzICovKXtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2N0eC5qc1xuICoqIG1vZHVsZSBpZCA9IDIwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcbiAgcmV0dXJuIGl0O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYS1mdW5jdGlvbi5qc1xuICoqIG1vZHVsZSBpZCA9IDIxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgTUVUQSAgICAgPSByZXF1aXJlKCcuL191aWQnKSgnbWV0YScpXG4gICwgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGhhcyAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBzZXREZXNjICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZcbiAgLCBpZCAgICAgICA9IDA7XG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbigpe1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgRlJFRVpFID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xudmFyIHNldE1ldGEgPSBmdW5jdGlvbihpdCl7XG4gIHNldERlc2MoaXQsIE1FVEEsIHt2YWx1ZToge1xuICAgIGk6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH19KTtcbn07XG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmKCFpc09iamVjdChpdCkpcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYoIWhhcyhpdCwgTUVUQSkpe1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYoIWlzRXh0ZW5zaWJsZShpdCkpcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmKCFjcmVhdGUpcmV0dXJuICdFJztcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gb2JqZWN0IElEXG4gIH0gcmV0dXJuIGl0W01FVEFdLmk7XG59O1xudmFyIGdldFdlYWsgPSBmdW5jdGlvbihpdCwgY3JlYXRlKXtcbiAgaWYoIWhhcyhpdCwgTUVUQSkpe1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYoIWlzRXh0ZW5zaWJsZShpdCkpcmV0dXJuIHRydWU7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZighY3JlYXRlKXJldHVybiBmYWxzZTtcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gaGFzaCB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IHJldHVybiBpdFtNRVRBXS53O1xufTtcbi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xudmFyIG9uRnJlZXplID0gZnVuY3Rpb24oaXQpe1xuICBpZihGUkVFWkUgJiYgbWV0YS5ORUVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhcyhpdCwgTUVUQSkpc2V0TWV0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBLRVk6ICAgICAgTUVUQSxcbiAgTkVFRDogICAgIGZhbHNlLFxuICBmYXN0S2V5OiAgZmFzdEtleSxcbiAgZ2V0V2VhazogIGdldFdlYWssXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fbWV0YS5qc1xuICoqIG1vZHVsZSBpZCA9IDIyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJ1xuICAsIHN0b3JlICA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB7fSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zaGFyZWQuanNcbiAqKiBtb2R1bGUgaWQgPSAyM1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGRlZiA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZcbiAgLCBoYXMgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCB0YWcsIHN0YXQpe1xuICBpZihpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKWRlZihpdCwgVEFHLCB7Y29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnfSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qc1xuICoqIG1vZHVsZSBpZCA9IDI0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgc3RvcmUgICAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKVxuICAsIHVpZCAgICAgICAgPSByZXF1aXJlKCcuL191aWQnKVxuICAsIFN5bWJvbCAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2xcbiAgLCBVU0VfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xuXG52YXIgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fd2tzLmpzXG4gKiogbW9kdWxlIGlkID0gMjVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsImV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX3drcycpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL193a3MtZXh0LmpzXG4gKiogbW9kdWxlIGlkID0gMjZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBnbG9iYWwgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXHJcbiAgLCBjb3JlICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2NvcmUnKVxyXG4gICwgTElCUkFSWSAgICAgICAgPSByZXF1aXJlKCcuL19saWJyYXJ5JylcclxuICAsIHdrc0V4dCAgICAgICAgID0gcmVxdWlyZSgnLi9fd2tzLWV4dCcpXHJcbiAgLCBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obmFtZSl7XHJcbiAgdmFyICRTeW1ib2wgPSBjb3JlLlN5bWJvbCB8fCAoY29yZS5TeW1ib2wgPSBMSUJSQVJZID8ge30gOiBnbG9iYWwuU3ltYm9sIHx8IHt9KTtcclxuICBpZihuYW1lLmNoYXJBdCgwKSAhPSAnXycgJiYgIShuYW1lIGluICRTeW1ib2wpKWRlZmluZVByb3BlcnR5KCRTeW1ib2wsIG5hbWUsIHt2YWx1ZTogd2tzRXh0LmYobmFtZSl9KTtcclxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fd2tzLWRlZmluZS5qc1xuICoqIG1vZHVsZSBpZCA9IDI3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzXG4gKiogbW9kdWxlIGlkID0gMjhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBnZXRLZXlzICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIGVsKXtcbiAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG4gICAgLCBrZXlzICAgPSBnZXRLZXlzKE8pXG4gICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICwgaW5kZXggID0gMFxuICAgICwga2V5O1xuICB3aGlsZShsZW5ndGggPiBpbmRleClpZihPW2tleSA9IGtleXNbaW5kZXgrK11dID09PSBlbClyZXR1cm4ga2V5O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fa2V5b2YuanNcbiAqKiBtb2R1bGUgaWQgPSAyOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXHJcbnZhciAka2V5cyAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJylcclxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pe1xyXG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XHJcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1rZXlzLmpzXG4gKiogbW9kdWxlIGlkID0gMzBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBoYXMgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxyXG4gICwgdG9JT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXHJcbiAgLCBhcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKVxyXG4gICwgSUVfUFJPVE8gICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIG5hbWVzKXtcclxuICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcclxuICAgICwgaSAgICAgID0gMFxyXG4gICAgLCByZXN1bHQgPSBbXVxyXG4gICAgLCBrZXk7XHJcbiAgZm9yKGtleSBpbiBPKWlmKGtleSAhPSBJRV9QUk9UTyloYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xyXG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcclxuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSl7XHJcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xyXG4gIH1cclxuICByZXR1cm4gcmVzdWx0O1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qc1xuICoqIG1vZHVsZSBpZCA9IDMxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyB0byBpbmRleGVkIG9iamVjdCwgdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpXG4gICwgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gSU9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzXG4gKiogbW9kdWxlIGlkID0gMzJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pb2JqZWN0LmpzXG4gKiogbW9kdWxlIGlkID0gMzNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NvZi5qc1xuICoqIG1vZHVsZSBpZCA9IDM0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKGl0ID09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanNcbiAqKiBtb2R1bGUgaWQgPSAzNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIHRvSW5kZXggICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKElTX0lOQ0xVREVTKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKCR0aGlzLCBlbCwgZnJvbUluZGV4KXtcbiAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KCR0aGlzKVxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gdG9JbmRleChmcm9tSW5kZXgsIGxlbmd0aClcbiAgICAgICwgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIGlmKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKXdoaWxlKGxlbmd0aCA+IGluZGV4KXtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIGlmKHZhbHVlICE9IHZhbHVlKXJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I3RvSW5kZXggaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKylpZihJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKXtcbiAgICAgIGlmKE9baW5kZXhdID09PSBlbClyZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qc1xuICoqIG1vZHVsZSBpZCA9IDM2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBtaW4gICAgICAgPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzXG4gKiogbW9kdWxlIGlkID0gMzdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgID0gTWF0aC5jZWlsXG4gICwgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdG8taW50ZWdlci5qc1xuICoqIG1vZHVsZSBpZCA9IDM4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgbWF4ICAgICAgID0gTWF0aC5tYXhcbiAgLCBtaW4gICAgICAgPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaW5kZXgsIGxlbmd0aCl7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190by1pbmRleC5qc1xuICoqIG1vZHVsZSBpZCA9IDM5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ2tleXMnKVxyXG4gICwgdWlkICAgID0gcmVxdWlyZSgnLi9fdWlkJyk7XHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcclxuICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzXG4gKiogbW9kdWxlIGlkID0gNDBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcclxubW9kdWxlLmV4cG9ydHMgPSAoXHJcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcclxuKS5zcGxpdCgnLCcpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzXG4gKiogbW9kdWxlIGlkID0gNDFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJylcbiAgLCBnT1BTICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKVxuICAsIHBJRSAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIHJlc3VsdCAgICAgPSBnZXRLZXlzKGl0KVxuICAgICwgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgaWYoZ2V0U3ltYm9scyl7XG4gICAgdmFyIHN5bWJvbHMgPSBnZXRTeW1ib2xzKGl0KVxuICAgICAgLCBpc0VudW0gID0gcElFLmZcbiAgICAgICwgaSAgICAgICA9IDBcbiAgICAgICwga2V5O1xuICAgIHdoaWxlKHN5bWJvbHMubGVuZ3RoID4gaSlpZihpc0VudW0uY2FsbChpdCwga2V5ID0gc3ltYm9sc1tpKytdKSlyZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19lbnVtLWtleXMuanNcbiAqKiBtb2R1bGUgaWQgPSA0MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanNcbiAqKiBtb2R1bGUgaWQgPSA0M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1waWUuanNcbiAqKiBtb2R1bGUgaWQgPSA0NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZyl7XG4gIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXMtYXJyYXkuanNcbiAqKiBtb2R1bGUgaWQgPSA0NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXHJcbnZhciBhbk9iamVjdCAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXHJcbiAgLCBkUHMgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKVxyXG4gICwgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJylcclxuICAsIElFX1BST1RPICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpXHJcbiAgLCBFbXB0eSAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cclxuICAsIFBST1RPVFlQRSAgID0gJ3Byb3RvdHlwZSc7XHJcblxyXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXHJcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24oKXtcclxuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xyXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpXHJcbiAgICAsIGkgICAgICA9IGVudW1CdWdLZXlzLmxlbmd0aFxyXG4gICAgLCBndCAgICAgPSAnPidcclxuICAgICwgaWZyYW1lRG9jdW1lbnQ7XHJcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgcmVxdWlyZSgnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XHJcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxyXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XHJcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xyXG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XHJcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xyXG4gIGlmcmFtZURvY3VtZW50LndyaXRlKCc8c2NyaXB0PmRvY3VtZW50LkY9T2JqZWN0PC9zY3JpcHQnICsgZ3QpO1xyXG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XHJcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XHJcbiAgd2hpbGUoaS0tKWRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xyXG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpe1xyXG4gIHZhciByZXN1bHQ7XHJcbiAgaWYoTyAhPT0gbnVsbCl7XHJcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XHJcbiAgICByZXN1bHQgPSBuZXcgRW1wdHk7XHJcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcclxuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcclxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xyXG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XHJcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzXG4gKiogbW9kdWxlIGlkID0gNDZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBkUCAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXHJcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXHJcbiAgLCBnZXRLZXlzICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcyl7XHJcbiAgYW5PYmplY3QoTyk7XHJcbiAgdmFyIGtleXMgICA9IGdldEtleXMoUHJvcGVydGllcylcclxuICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcclxuICAgICwgaSA9IDBcclxuICAgICwgUDtcclxuICB3aGlsZShsZW5ndGggPiBpKWRQLmYoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XHJcbiAgcmV0dXJuIE87XHJcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanNcbiAqKiBtb2R1bGUgaWQgPSA0N1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2h0bWwuanNcbiAqKiBtb2R1bGUgaWQgPSA0OFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIGdPUE4gICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZlxuICAsIHRvU3RyaW5nICA9IHt9LnRvU3RyaW5nO1xuXG52YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblxudmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24oaXQpe1xuICB0cnkge1xuICAgIHJldHVybiBnT1BOKGl0KTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi1leHQuanNcbiAqKiBtb2R1bGUgaWQgPSA0OVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxyXG52YXIgJGtleXMgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJylcclxuICAsIGhpZGRlbktleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJykuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XHJcblxyXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pe1xyXG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcclxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4uanNcbiAqKiBtb2R1bGUgaWQgPSA1MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIHBJRSAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpXHJcbiAgLCBjcmVhdGVEZXNjICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxyXG4gICwgdG9JT2JqZWN0ICAgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcclxuICAsIHRvUHJpbWl0aXZlICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcclxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcclxuICAsIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKVxyXG4gICwgZ09QRCAgICAgICAgICAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xyXG5cclxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCl7XHJcbiAgTyA9IHRvSU9iamVjdChPKTtcclxuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XHJcbiAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcclxuICAgIHJldHVybiBnT1BEKE8sIFApO1xyXG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cclxuICBpZihoYXMoTywgUCkpcmV0dXJuIGNyZWF0ZURlc2MoIXBJRS5mLmNhbGwoTywgUCksIE9bUF0pO1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wZC5qc1xuICoqIG1vZHVsZSBpZCA9IDUxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxyXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtjcmVhdGU6IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlLmpzXG4gKiogbW9kdWxlIGlkID0gNTJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XHJcbi8vIDE5LjEuMi40IC8gMTUuMi4zLjYgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXHJcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyksICdPYmplY3QnLCB7ZGVmaW5lUHJvcGVydHk6IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZ9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0eS5qc1xuICoqIG1vZHVsZSBpZCA9IDUzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xyXG4vLyAxOS4xLjIuMyAvIDE1LjIuMy43IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXHJcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyksICdPYmplY3QnLCB7ZGVmaW5lUHJvcGVydGllczogcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydGllcy5qc1xuICoqIG1vZHVsZSBpZCA9IDU0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG52YXIgdG9JT2JqZWN0ICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmY7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJywgZnVuY3Rpb24oKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KXtcbiAgICByZXR1cm4gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0b0lPYmplY3QoaXQpLCBrZXkpO1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcbiAqKiBtb2R1bGUgaWQgPSA1NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gbW9zdCBPYmplY3QgbWV0aG9kcyBieSBFUzYgc2hvdWxkIGFjY2VwdCBwcmltaXRpdmVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgY29yZSAgICA9IHJlcXVpcmUoJy4vX2NvcmUnKVxuICAsIGZhaWxzICAgPSByZXF1aXJlKCcuL19mYWlscycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVksIGV4ZWMpe1xuICB2YXIgZm4gID0gKGNvcmUuT2JqZWN0IHx8IHt9KVtLRVldIHx8IE9iamVjdFtLRVldXG4gICAgLCBleHAgPSB7fTtcbiAgZXhwW0tFWV0gPSBleGVjKGZuKTtcbiAgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbigpeyBmbigxKTsgfSksICdPYmplY3QnLCBleHApO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXNhcC5qc1xuICoqIG1vZHVsZSBpZCA9IDU2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjIuOSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciB0b09iamVjdCAgICAgICAgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsICRnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRQcm90b3R5cGVPZicsIGZ1bmN0aW9uKCl7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCl7XG4gICAgcmV0dXJuICRnZXRQcm90b3R5cGVPZih0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtcHJvdG90eXBlLW9mLmpzXG4gKiogbW9kdWxlIGlkID0gNTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzXG4gKiogbW9kdWxlIGlkID0gNThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXHJcbnZhciBoYXMgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXHJcbiAgLCB0b09iamVjdCAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXHJcbiAgLCBJRV9QUk9UTyAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKVxyXG4gICwgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24oTyl7XHJcbiAgTyA9IHRvT2JqZWN0KE8pO1xyXG4gIGlmKGhhcyhPLCBJRV9QUk9UTykpcmV0dXJuIE9bSUVfUFJPVE9dO1xyXG4gIGlmKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3Ipe1xyXG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xyXG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XHJcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1ncG8uanNcbiAqKiBtb2R1bGUgaWQgPSA1OVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4yLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsICRrZXlzICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24oKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGtleXMoaXQpe1xuICAgIHJldHVybiAka2V5cyh0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzLmpzXG4gKiogbW9kdWxlIGlkID0gNjBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2dldE93blByb3BlcnR5TmFtZXMnLCBmdW5jdGlvbigpe1xuICByZXR1cm4gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4tZXh0JykuZjtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qc1xuICoqIG1vZHVsZSBpZCA9IDYxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjIuNSBPYmplY3QuZnJlZXplKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIG1ldGEgICAgID0gcmVxdWlyZSgnLi9fbWV0YScpLm9uRnJlZXplO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2ZyZWV6ZScsIGZ1bmN0aW9uKCRmcmVlemUpe1xuICByZXR1cm4gZnVuY3Rpb24gZnJlZXplKGl0KXtcbiAgICByZXR1cm4gJGZyZWV6ZSAmJiBpc09iamVjdChpdCkgPyAkZnJlZXplKG1ldGEoaXQpKSA6IGl0O1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUuanNcbiAqKiBtb2R1bGUgaWQgPSA2MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4yLjE3IE9iamVjdC5zZWFsKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIG1ldGEgICAgID0gcmVxdWlyZSgnLi9fbWV0YScpLm9uRnJlZXplO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ3NlYWwnLCBmdW5jdGlvbigkc2VhbCl7XG4gIHJldHVybiBmdW5jdGlvbiBzZWFsKGl0KXtcbiAgICByZXR1cm4gJHNlYWwgJiYgaXNPYmplY3QoaXQpID8gJHNlYWwobWV0YShpdCkpIDogaXQ7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNlYWwuanNcbiAqKiBtb2R1bGUgaWQgPSA2M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4yLjE1IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBtZXRhICAgICA9IHJlcXVpcmUoJy4vX21ldGEnKS5vbkZyZWV6ZTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdwcmV2ZW50RXh0ZW5zaW9ucycsIGZ1bmN0aW9uKCRwcmV2ZW50RXh0ZW5zaW9ucyl7XG4gIHJldHVybiBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhpdCl7XG4gICAgcmV0dXJuICRwcmV2ZW50RXh0ZW5zaW9ucyAmJiBpc09iamVjdChpdCkgPyAkcHJldmVudEV4dGVuc2lvbnMobWV0YShpdCkpIDogaXQ7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qc1xuICoqIG1vZHVsZSBpZCA9IDY0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjIuMTIgT2JqZWN0LmlzRnJvemVuKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdpc0Zyb3plbicsIGZ1bmN0aW9uKCRpc0Zyb3plbil7XG4gIHJldHVybiBmdW5jdGlvbiBpc0Zyb3plbihpdCl7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/ICRpc0Zyb3plbiA/ICRpc0Zyb3plbihpdCkgOiBmYWxzZSA6IHRydWU7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWZyb3plbi5qc1xuICoqIG1vZHVsZSBpZCA9IDY1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjIuMTMgT2JqZWN0LmlzU2VhbGVkKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdpc1NlYWxlZCcsIGZ1bmN0aW9uKCRpc1NlYWxlZCl7XG4gIHJldHVybiBmdW5jdGlvbiBpc1NlYWxlZChpdCl7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/ICRpc1NlYWxlZCA/ICRpc1NlYWxlZChpdCkgOiBmYWxzZSA6IHRydWU7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLXNlYWxlZC5qc1xuICoqIG1vZHVsZSBpZCA9IDY2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjIuMTEgT2JqZWN0LmlzRXh0ZW5zaWJsZShPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnaXNFeHRlbnNpYmxlJywgZnVuY3Rpb24oJGlzRXh0ZW5zaWJsZSl7XG4gIHJldHVybiBmdW5jdGlvbiBpc0V4dGVuc2libGUoaXQpe1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyAkaXNFeHRlbnNpYmxlID8gJGlzRXh0ZW5zaWJsZShpdCkgOiB0cnVlIDogZmFsc2U7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWV4dGVuc2libGUuanNcbiAqKiBtb2R1bGUgaWQgPSA2N1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMS4zLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GLCAnT2JqZWN0Jywge2Fzc2lnbjogcmVxdWlyZSgnLi9fb2JqZWN0LWFzc2lnbicpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanNcbiAqKiBtb2R1bGUgaWQgPSA2OFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxudmFyIGdldEtleXMgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKVxuICAsIGdPUFMgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKVxuICAsIHBJRSAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpXG4gICwgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsIElPYmplY3QgID0gcmVxdWlyZSgnLi9faW9iamVjdCcpXG4gICwgJGFzc2lnbiAgPSBPYmplY3QuYXNzaWduO1xuXG4vLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1Zylcbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICB2YXIgQSA9IHt9XG4gICAgLCBCID0ge31cbiAgICAsIFMgPSBTeW1ib2woKVxuICAgICwgSyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbU10gPSA3O1xuICBLLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uKGspeyBCW2tdID0gazsgfSk7XG4gIHJldHVybiAkYXNzaWduKHt9LCBBKVtTXSAhPSA3IHx8IE9iamVjdC5rZXlzKCRhc3NpZ24oe30sIEIpKS5qb2luKCcnKSAhPSBLO1xufSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUICAgICA9IHRvT2JqZWN0KHRhcmdldClcbiAgICAsIGFMZW4gID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgaW5kZXggPSAxXG4gICAgLCBnZXRTeW1ib2xzID0gZ09QUy5mXG4gICAgLCBpc0VudW0gICAgID0gcElFLmY7XG4gIHdoaWxlKGFMZW4gPiBpbmRleCl7XG4gICAgdmFyIFMgICAgICA9IElPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKVxuICAgICAgLCBrZXlzICAgPSBnZXRTeW1ib2xzID8gZ2V0S2V5cyhTKS5jb25jYXQoZ2V0U3ltYm9scyhTKSkgOiBnZXRLZXlzKFMpXG4gICAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgICAsIGogICAgICA9IDBcbiAgICAgICwga2V5O1xuICAgIHdoaWxlKGxlbmd0aCA+IGopaWYoaXNFbnVtLmNhbGwoUywga2V5ID0ga2V5c1tqKytdKSlUW2tleV0gPSBTW2tleV07XG4gIH0gcmV0dXJuIFQ7XG59IDogJGFzc2lnbjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWFzc2lnbi5qc1xuICoqIG1vZHVsZSBpZCA9IDY5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjMuMTAgT2JqZWN0LmlzKHZhbHVlMSwgdmFsdWUyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge2lzOiByZXF1aXJlKCcuL19zYW1lLXZhbHVlJyl9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLmpzXG4gKiogbW9kdWxlIGlkID0gNzBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDcuMi45IFNhbWVWYWx1ZSh4LCB5KVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuaXMgfHwgZnVuY3Rpb24gaXMoeCwgeSl7XG4gIHJldHVybiB4ID09PSB5ID8geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkgOiB4ICE9IHggJiYgeSAhPSB5O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc2FtZS12YWx1ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDcxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAxOS4xLjMuMTkgT2JqZWN0LnNldFByb3RvdHlwZU9mKE8sIHByb3RvKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge3NldFByb3RvdHlwZU9mOiByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXR9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanNcbiAqKiBtb2R1bGUgaWQgPSA3MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGNoZWNrID0gZnVuY3Rpb24oTywgcHJvdG8pe1xuICBhbk9iamVjdChPKTtcbiAgaWYoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCl0aHJvdyBUeXBlRXJyb3IocHJvdG8gKyBcIjogY2FuJ3Qgc2V0IGFzIHByb3RvdHlwZSFcIik7XG59O1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBmdW5jdGlvbih0ZXN0LCBidWdneSwgc2V0KXtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldCA9IHJlcXVpcmUoJy4vX2N0eCcpKEZ1bmN0aW9uLmNhbGwsIHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0LCAyKTtcbiAgICAgICAgc2V0KHRlc3QsIFtdKTtcbiAgICAgICAgYnVnZ3kgPSAhKHRlc3QgaW5zdGFuY2VvZiBBcnJheSk7XG4gICAgICB9IGNhdGNoKGUpeyBidWdneSA9IHRydWU7IH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90byl7XG4gICAgICAgIGNoZWNrKE8sIHByb3RvKTtcbiAgICAgICAgaWYoYnVnZ3kpTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICAgICAgZWxzZSBzZXQoTywgcHJvdG8pO1xuICAgICAgICByZXR1cm4gTztcbiAgICAgIH07XG4gICAgfSh7fSwgZmFsc2UpIDogdW5kZWZpbmVkKSxcbiAgY2hlY2s6IGNoZWNrXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zZXQtcHJvdG8uanNcbiAqKiBtb2R1bGUgaWQgPSA3M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIHRlc3QgICAgPSB7fTtcbnRlc3RbcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyldID0gJ3onO1xuaWYodGVzdCArICcnICE9ICdbb2JqZWN0IHpdJyl7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoT2JqZWN0LnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG4gIH0sIHRydWUpO1xufVxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nLmpzXG4gKiogbW9kdWxlIGlkID0gNzRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJylcbiAgLCBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKVxuICAvLyBFUzMgd3JvbmcgaGVyZVxuICAsIEFSRyA9IGNvZihmdW5jdGlvbigpeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NsYXNzb2YuanNcbiAqKiBtb2R1bGUgaWQgPSA3NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMTkuMi4zLjIgLyAxNS4zLjQuNSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCh0aGlzQXJnLCBhcmdzLi4uKVxyXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlAsICdGdW5jdGlvbicsIHtiaW5kOiByZXF1aXJlKCcuL19iaW5kJyl9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24uYmluZC5qc1xuICoqIG1vZHVsZSBpZCA9IDc2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgYUZ1bmN0aW9uICA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIGlzT2JqZWN0ICAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGludm9rZSAgICAgPSByZXF1aXJlKCcuL19pbnZva2UnKVxuICAsIGFycmF5U2xpY2UgPSBbXS5zbGljZVxuICAsIGZhY3RvcmllcyAgPSB7fTtcblxudmFyIGNvbnN0cnVjdCA9IGZ1bmN0aW9uKEYsIGxlbiwgYXJncyl7XG4gIGlmKCEobGVuIGluIGZhY3Rvcmllcykpe1xuICAgIGZvcih2YXIgbiA9IFtdLCBpID0gMDsgaSA8IGxlbjsgaSsrKW5baV0gPSAnYVsnICsgaSArICddJztcbiAgICBmYWN0b3JpZXNbbGVuXSA9IEZ1bmN0aW9uKCdGLGEnLCAncmV0dXJuIG5ldyBGKCcgKyBuLmpvaW4oJywnKSArICcpJyk7XG4gIH0gcmV0dXJuIGZhY3Rvcmllc1tsZW5dKEYsIGFyZ3MpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5iaW5kIHx8IGZ1bmN0aW9uIGJpbmQodGhhdCAvKiwgYXJncy4uLiAqLyl7XG4gIHZhciBmbiAgICAgICA9IGFGdW5jdGlvbih0aGlzKVxuICAgICwgcGFydEFyZ3MgPSBhcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgdmFyIGJvdW5kID0gZnVuY3Rpb24oLyogYXJncy4uLiAqLyl7XG4gICAgdmFyIGFyZ3MgPSBwYXJ0QXJncy5jb25jYXQoYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgYm91bmQgPyBjb25zdHJ1Y3QoZm4sIGFyZ3MubGVuZ3RoLCBhcmdzKSA6IGludm9rZShmbiwgYXJncywgdGhhdCk7XG4gIH07XG4gIGlmKGlzT2JqZWN0KGZuLnByb3RvdHlwZSkpYm91bmQucHJvdG90eXBlID0gZm4ucHJvdG90eXBlO1xuICByZXR1cm4gYm91bmQ7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19iaW5kLmpzXG4gKiogbW9kdWxlIGlkID0gNzdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGZhc3QgYXBwbHksIGh0dHA6Ly9qc3BlcmYubG5raXQuY29tL2Zhc3QtYXBwbHkvNVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgYXJncywgdGhhdCl7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoKGFyZ3MubGVuZ3RoKXtcbiAgICBjYXNlIDA6IHJldHVybiB1biA/IGZuKClcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCk7XG4gICAgY2FzZSAxOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgY2FzZSA0OiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgfSByZXR1cm4gICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faW52b2tlLmpzXG4gKiogbW9kdWxlIGlkID0gNzhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBkUCAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZlxuICAsIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJylcbiAgLCBoYXMgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBGUHJvdG8gICAgID0gRnVuY3Rpb24ucHJvdG90eXBlXG4gICwgbmFtZVJFICAgICA9IC9eXFxzKmZ1bmN0aW9uIChbXiAoXSopL1xuICAsIE5BTUUgICAgICAgPSAnbmFtZSc7XG5cbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uKCl7XG4gIHJldHVybiB0cnVlO1xufTtcblxuLy8gMTkuMi40LjIgbmFtZVxuTkFNRSBpbiBGUHJvdG8gfHwgcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiBkUChGUHJvdG8sIE5BTUUsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uKCl7XG4gICAgdHJ5IHtcbiAgICAgIHZhciB0aGF0ID0gdGhpc1xuICAgICAgICAsIG5hbWUgPSAoJycgKyB0aGF0KS5tYXRjaChuYW1lUkUpWzFdO1xuICAgICAgaGFzKHRoYXQsIE5BTUUpIHx8ICFpc0V4dGVuc2libGUodGhhdCkgfHwgZFAodGhhdCwgTkFNRSwgY3JlYXRlRGVzYyg1LCBuYW1lKSk7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLm5hbWUuanNcbiAqKiBtb2R1bGUgaWQgPSA3OVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKVxuICAsIEhBU19JTlNUQU5DRSAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2hhc0luc3RhbmNlJylcbiAgLCBGdW5jdGlvblByb3RvICA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbi8vIDE5LjIuMy42IEZ1bmN0aW9uLnByb3RvdHlwZVtAQGhhc0luc3RhbmNlXShWKVxuaWYoIShIQVNfSU5TVEFOQ0UgaW4gRnVuY3Rpb25Qcm90bykpcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZihGdW5jdGlvblByb3RvLCBIQVNfSU5TVEFOQ0UsIHt2YWx1ZTogZnVuY3Rpb24oTyl7XG4gIGlmKHR5cGVvZiB0aGlzICE9ICdmdW5jdGlvbicgfHwgIWlzT2JqZWN0KE8pKXJldHVybiBmYWxzZTtcbiAgaWYoIWlzT2JqZWN0KHRoaXMucHJvdG90eXBlKSlyZXR1cm4gTyBpbnN0YW5jZW9mIHRoaXM7XG4gIC8vIGZvciBlbnZpcm9ubWVudCB3L28gbmF0aXZlIGBAQGhhc0luc3RhbmNlYCBsb2dpYyBlbm91Z2ggYGluc3RhbmNlb2ZgLCBidXQgYWRkIHRoaXM6XG4gIHdoaWxlKE8gPSBnZXRQcm90b3R5cGVPZihPKSlpZih0aGlzLnByb3RvdHlwZSA9PT0gTylyZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5oYXMtaW5zdGFuY2UuanNcbiAqKiBtb2R1bGUgaWQgPSA4MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCAkcGFyc2VJbnQgPSByZXF1aXJlKCcuL19wYXJzZS1pbnQnKTtcclxuLy8gMTguMi41IHBhcnNlSW50KHN0cmluZywgcmFkaXgpXHJcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5GICogKHBhcnNlSW50ICE9ICRwYXJzZUludCksIHtwYXJzZUludDogJHBhcnNlSW50fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnBhcnNlLWludC5qc1xuICoqIG1vZHVsZSBpZCA9IDgxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykucGFyc2VJbnRcbiAgLCAkdHJpbSAgICAgPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW1cbiAgLCB3cyAgICAgICAgPSByZXF1aXJlKCcuL19zdHJpbmctd3MnKVxuICAsIGhleCAgICAgICA9IC9eW1xcLStdPzBbeFhdLztcblxubW9kdWxlLmV4cG9ydHMgPSAkcGFyc2VJbnQod3MgKyAnMDgnKSAhPT0gOCB8fCAkcGFyc2VJbnQod3MgKyAnMHgxNicpICE9PSAyMiA/IGZ1bmN0aW9uIHBhcnNlSW50KHN0ciwgcmFkaXgpe1xuICB2YXIgc3RyaW5nID0gJHRyaW0oU3RyaW5nKHN0ciksIDMpO1xuICByZXR1cm4gJHBhcnNlSW50KHN0cmluZywgKHJhZGl4ID4+PiAwKSB8fCAoaGV4LnRlc3Qoc3RyaW5nKSA/IDE2IDogMTApKTtcbn0gOiAkcGFyc2VJbnQ7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3BhcnNlLWludC5qc1xuICoqIG1vZHVsZSBpZCA9IDgyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKVxuICAsIGZhaWxzICAgPSByZXF1aXJlKCcuL19mYWlscycpXG4gICwgc3BhY2VzICA9IHJlcXVpcmUoJy4vX3N0cmluZy13cycpXG4gICwgc3BhY2UgICA9ICdbJyArIHNwYWNlcyArICddJ1xuICAsIG5vbiAgICAgPSAnXFx1MjAwYlxcdTAwODUnXG4gICwgbHRyaW0gICA9IFJlZ0V4cCgnXicgKyBzcGFjZSArIHNwYWNlICsgJyonKVxuICAsIHJ0cmltICAgPSBSZWdFeHAoc3BhY2UgKyBzcGFjZSArICcqJCcpO1xuXG52YXIgZXhwb3J0ZXIgPSBmdW5jdGlvbihLRVksIGV4ZWMsIEFMSUFTKXtcbiAgdmFyIGV4cCAgID0ge307XG4gIHZhciBGT1JDRSA9IGZhaWxzKGZ1bmN0aW9uKCl7XG4gICAgcmV0dXJuICEhc3BhY2VzW0tFWV0oKSB8fCBub25bS0VZXSgpICE9IG5vbjtcbiAgfSk7XG4gIHZhciBmbiA9IGV4cFtLRVldID0gRk9SQ0UgPyBleGVjKHRyaW0pIDogc3BhY2VzW0tFWV07XG4gIGlmKEFMSUFTKWV4cFtBTElBU10gPSBmbjtcbiAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBGT1JDRSwgJ1N0cmluZycsIGV4cCk7XG59O1xuXG4vLyAxIC0+IFN0cmluZyN0cmltTGVmdFxuLy8gMiAtPiBTdHJpbmcjdHJpbVJpZ2h0XG4vLyAzIC0+IFN0cmluZyN0cmltXG52YXIgdHJpbSA9IGV4cG9ydGVyLnRyaW0gPSBmdW5jdGlvbihzdHJpbmcsIFRZUEUpe1xuICBzdHJpbmcgPSBTdHJpbmcoZGVmaW5lZChzdHJpbmcpKTtcbiAgaWYoVFlQRSAmIDEpc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UobHRyaW0sICcnKTtcbiAgaWYoVFlQRSAmIDIpc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgcmV0dXJuIHN0cmluZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0ZXI7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy10cmltLmpzXG4gKiogbW9kdWxlIGlkID0gODNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gJ1xceDA5XFx4MEFcXHgwQlxceDBDXFx4MERcXHgyMFxceEEwXFx1MTY4MFxcdTE4MEVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzJyArXHJcbiAgJ1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkYnO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctd3MuanNcbiAqKiBtb2R1bGUgaWQgPSA4NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyICRleHBvcnQgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsICRwYXJzZUZsb2F0ID0gcmVxdWlyZSgnLi9fcGFyc2UtZmxvYXQnKTtcclxuLy8gMTguMi40IHBhcnNlRmxvYXQoc3RyaW5nKVxyXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuRiAqIChwYXJzZUZsb2F0ICE9ICRwYXJzZUZsb2F0KSwge3BhcnNlRmxvYXQ6ICRwYXJzZUZsb2F0fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnBhcnNlLWZsb2F0LmpzXG4gKiogbW9kdWxlIGlkID0gODVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLnBhcnNlRmxvYXRcbiAgLCAkdHJpbSAgICAgICA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbTtcblxubW9kdWxlLmV4cG9ydHMgPSAxIC8gJHBhcnNlRmxvYXQocmVxdWlyZSgnLi9fc3RyaW5nLXdzJykgKyAnLTAnKSAhPT0gLUluZmluaXR5ID8gZnVuY3Rpb24gcGFyc2VGbG9hdChzdHIpe1xuICB2YXIgc3RyaW5nID0gJHRyaW0oU3RyaW5nKHN0ciksIDMpXG4gICAgLCByZXN1bHQgPSAkcGFyc2VGbG9hdChzdHJpbmcpO1xuICByZXR1cm4gcmVzdWx0ID09PSAwICYmIHN0cmluZy5jaGFyQXQoMCkgPT0gJy0nID8gLTAgOiByZXN1bHQ7XG59IDogJHBhcnNlRmxvYXQ7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3BhcnNlLWZsb2F0LmpzXG4gKiogbW9kdWxlIGlkID0gODZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGFzICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIGNvZiAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY29mJylcbiAgLCBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4vX2luaGVyaXQtaWYtcmVxdWlyZWQnKVxuICAsIHRvUHJpbWl0aXZlICAgICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcbiAgLCBmYWlscyAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJylcbiAgLCBnT1BOICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZlxuICAsIGdPUEQgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mXG4gICwgZFAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgJHRyaW0gICAgICAgICAgICAgPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW1cbiAgLCBOVU1CRVIgICAgICAgICAgICA9ICdOdW1iZXInXG4gICwgJE51bWJlciAgICAgICAgICAgPSBnbG9iYWxbTlVNQkVSXVxuICAsIEJhc2UgICAgICAgICAgICAgID0gJE51bWJlclxuICAsIHByb3RvICAgICAgICAgICAgID0gJE51bWJlci5wcm90b3R5cGVcbiAgLy8gT3BlcmEgfjEyIGhhcyBicm9rZW4gT2JqZWN0I3RvU3RyaW5nXG4gICwgQlJPS0VOX0NPRiAgICAgICAgPSBjb2YocmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpKHByb3RvKSkgPT0gTlVNQkVSXG4gICwgVFJJTSAgICAgICAgICAgICAgPSAndHJpbScgaW4gU3RyaW5nLnByb3RvdHlwZTtcblxuLy8gNy4xLjMgVG9OdW1iZXIoYXJndW1lbnQpXG52YXIgdG9OdW1iZXIgPSBmdW5jdGlvbihhcmd1bWVudCl7XG4gIHZhciBpdCA9IHRvUHJpbWl0aXZlKGFyZ3VtZW50LCBmYWxzZSk7XG4gIGlmKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyAmJiBpdC5sZW5ndGggPiAyKXtcbiAgICBpdCA9IFRSSU0gPyBpdC50cmltKCkgOiAkdHJpbShpdCwgMyk7XG4gICAgdmFyIGZpcnN0ID0gaXQuY2hhckNvZGVBdCgwKVxuICAgICAgLCB0aGlyZCwgcmFkaXgsIG1heENvZGU7XG4gICAgaWYoZmlyc3QgPT09IDQzIHx8IGZpcnN0ID09PSA0NSl7XG4gICAgICB0aGlyZCA9IGl0LmNoYXJDb2RlQXQoMik7XG4gICAgICBpZih0aGlyZCA9PT0gODggfHwgdGhpcmQgPT09IDEyMClyZXR1cm4gTmFOOyAvLyBOdW1iZXIoJysweDEnKSBzaG91bGQgYmUgTmFOLCBvbGQgVjggZml4XG4gICAgfSBlbHNlIGlmKGZpcnN0ID09PSA0OCl7XG4gICAgICBzd2l0Y2goaXQuY2hhckNvZGVBdCgxKSl7XG4gICAgICAgIGNhc2UgNjYgOiBjYXNlIDk4ICA6IHJhZGl4ID0gMjsgbWF4Q29kZSA9IDQ5OyBicmVhazsgLy8gZmFzdCBlcXVhbCAvXjBiWzAxXSskL2lcbiAgICAgICAgY2FzZSA3OSA6IGNhc2UgMTExIDogcmFkaXggPSA4OyBtYXhDb2RlID0gNTU7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIC9eMG9bMC03XSskL2lcbiAgICAgICAgZGVmYXVsdCA6IHJldHVybiAraXQ7XG4gICAgICB9XG4gICAgICBmb3IodmFyIGRpZ2l0cyA9IGl0LnNsaWNlKDIpLCBpID0gMCwgbCA9IGRpZ2l0cy5sZW5ndGgsIGNvZGU7IGkgPCBsOyBpKyspe1xuICAgICAgICBjb2RlID0gZGlnaXRzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIC8vIHBhcnNlSW50IHBhcnNlcyBhIHN0cmluZyB0byBhIGZpcnN0IHVuYXZhaWxhYmxlIHN5bWJvbFxuICAgICAgICAvLyBidXQgVG9OdW1iZXIgc2hvdWxkIHJldHVybiBOYU4gaWYgYSBzdHJpbmcgY29udGFpbnMgdW5hdmFpbGFibGUgc3ltYm9sc1xuICAgICAgICBpZihjb2RlIDwgNDggfHwgY29kZSA+IG1heENvZGUpcmV0dXJuIE5hTjtcbiAgICAgIH0gcmV0dXJuIHBhcnNlSW50KGRpZ2l0cywgcmFkaXgpO1xuICAgIH1cbiAgfSByZXR1cm4gK2l0O1xufTtcblxuaWYoISROdW1iZXIoJyAwbzEnKSB8fCAhJE51bWJlcignMGIxJykgfHwgJE51bWJlcignKzB4MScpKXtcbiAgJE51bWJlciA9IGZ1bmN0aW9uIE51bWJlcih2YWx1ZSl7XG4gICAgdmFyIGl0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDEgPyAwIDogdmFsdWVcbiAgICAgICwgdGhhdCA9IHRoaXM7XG4gICAgcmV0dXJuIHRoYXQgaW5zdGFuY2VvZiAkTnVtYmVyXG4gICAgICAvLyBjaGVjayBvbiAxLi5jb25zdHJ1Y3Rvcihmb28pIGNhc2VcbiAgICAgICYmIChCUk9LRU5fQ09GID8gZmFpbHMoZnVuY3Rpb24oKXsgcHJvdG8udmFsdWVPZi5jYWxsKHRoYXQpOyB9KSA6IGNvZih0aGF0KSAhPSBOVU1CRVIpXG4gICAgICAgID8gaW5oZXJpdElmUmVxdWlyZWQobmV3IEJhc2UodG9OdW1iZXIoaXQpKSwgdGhhdCwgJE51bWJlcikgOiB0b051bWJlcihpdCk7XG4gIH07XG4gIGZvcih2YXIga2V5cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BOKEJhc2UpIDogKFxuICAgIC8vIEVTMzpcbiAgICAnTUFYX1ZBTFVFLE1JTl9WQUxVRSxOYU4sTkVHQVRJVkVfSU5GSU5JVFksUE9TSVRJVkVfSU5GSU5JVFksJyArXG4gICAgLy8gRVM2IChpbiBjYXNlLCBpZiBtb2R1bGVzIHdpdGggRVM2IE51bWJlciBzdGF0aWNzIHJlcXVpcmVkIGJlZm9yZSk6XG4gICAgJ0VQU0lMT04saXNGaW5pdGUsaXNJbnRlZ2VyLGlzTmFOLGlzU2FmZUludGVnZXIsTUFYX1NBRkVfSU5URUdFUiwnICtcbiAgICAnTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlcidcbiAgKS5zcGxpdCgnLCcpLCBqID0gMCwga2V5OyBrZXlzLmxlbmd0aCA+IGo7IGorKyl7XG4gICAgaWYoaGFzKEJhc2UsIGtleSA9IGtleXNbal0pICYmICFoYXMoJE51bWJlciwga2V5KSl7XG4gICAgICBkUCgkTnVtYmVyLCBrZXksIGdPUEQoQmFzZSwga2V5KSk7XG4gICAgfVxuICB9XG4gICROdW1iZXIucHJvdG90eXBlID0gcHJvdG87XG4gIHByb3RvLmNvbnN0cnVjdG9yID0gJE51bWJlcjtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShnbG9iYWwsIE5VTUJFUiwgJE51bWJlcik7XG59XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5jb25zdHJ1Y3Rvci5qc1xuICoqIG1vZHVsZSBpZCA9IDg3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgaXNPYmplY3QgICAgICAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxyXG4gICwgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXQ7XHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odGhhdCwgdGFyZ2V0LCBDKXtcclxuICB2YXIgUCwgUyA9IHRhcmdldC5jb25zdHJ1Y3RvcjtcclxuICBpZihTICE9PSBDICYmIHR5cGVvZiBTID09ICdmdW5jdGlvbicgJiYgKFAgPSBTLnByb3RvdHlwZSkgIT09IEMucHJvdG90eXBlICYmIGlzT2JqZWN0KFApICYmIHNldFByb3RvdHlwZU9mKXtcclxuICAgIHNldFByb3RvdHlwZU9mKHRoYXQsIFApO1xyXG4gIH0gcmV0dXJuIHRoYXQ7XHJcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2luaGVyaXQtaWYtcmVxdWlyZWQuanNcbiAqKiBtb2R1bGUgaWQgPSA4OFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsIGFuSW5zdGFuY2UgICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcclxuICAsIHRvSW50ZWdlciAgICA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxyXG4gICwgYU51bWJlclZhbHVlID0gcmVxdWlyZSgnLi9fYS1udW1iZXItdmFsdWUnKVxyXG4gICwgcmVwZWF0ICAgICAgID0gcmVxdWlyZSgnLi9fc3RyaW5nLXJlcGVhdCcpXHJcbiAgLCAkdG9GaXhlZCAgICAgPSAxLi50b0ZpeGVkXHJcbiAgLCBmbG9vciAgICAgICAgPSBNYXRoLmZsb29yXHJcbiAgLCBkYXRhICAgICAgICAgPSBbMCwgMCwgMCwgMCwgMCwgMF1cclxuICAsIEVSUk9SICAgICAgICA9ICdOdW1iZXIudG9GaXhlZDogaW5jb3JyZWN0IGludm9jYXRpb24hJ1xyXG4gICwgWkVSTyAgICAgICAgID0gJzAnO1xyXG5cclxudmFyIG11bHRpcGx5ID0gZnVuY3Rpb24obiwgYyl7XHJcbiAgdmFyIGkgID0gLTFcclxuICAgICwgYzIgPSBjO1xyXG4gIHdoaWxlKCsraSA8IDYpe1xyXG4gICAgYzIgKz0gbiAqIGRhdGFbaV07XHJcbiAgICBkYXRhW2ldID0gYzIgJSAxZTc7XHJcbiAgICBjMiA9IGZsb29yKGMyIC8gMWU3KTtcclxuICB9XHJcbn07XHJcbnZhciBkaXZpZGUgPSBmdW5jdGlvbihuKXtcclxuICB2YXIgaSA9IDZcclxuICAgICwgYyA9IDA7XHJcbiAgd2hpbGUoLS1pID49IDApe1xyXG4gICAgYyArPSBkYXRhW2ldO1xyXG4gICAgZGF0YVtpXSA9IGZsb29yKGMgLyBuKTtcclxuICAgIGMgPSAoYyAlIG4pICogMWU3O1xyXG4gIH1cclxufTtcclxudmFyIG51bVRvU3RyaW5nID0gZnVuY3Rpb24oKXtcclxuICB2YXIgaSA9IDZcclxuICAgICwgcyA9ICcnO1xyXG4gIHdoaWxlKC0taSA+PSAwKXtcclxuICAgIGlmKHMgIT09ICcnIHx8IGkgPT09IDAgfHwgZGF0YVtpXSAhPT0gMCl7XHJcbiAgICAgIHZhciB0ID0gU3RyaW5nKGRhdGFbaV0pO1xyXG4gICAgICBzID0gcyA9PT0gJycgPyB0IDogcyArIHJlcGVhdC5jYWxsKFpFUk8sIDcgLSB0Lmxlbmd0aCkgKyB0O1xyXG4gICAgfVxyXG4gIH0gcmV0dXJuIHM7XHJcbn07XHJcbnZhciBwb3cgPSBmdW5jdGlvbih4LCBuLCBhY2Mpe1xyXG4gIHJldHVybiBuID09PSAwID8gYWNjIDogbiAlIDIgPT09IDEgPyBwb3coeCwgbiAtIDEsIGFjYyAqIHgpIDogcG93KHggKiB4LCBuIC8gMiwgYWNjKTtcclxufTtcclxudmFyIGxvZyA9IGZ1bmN0aW9uKHgpe1xyXG4gIHZhciBuICA9IDBcclxuICAgICwgeDIgPSB4O1xyXG4gIHdoaWxlKHgyID49IDQwOTYpe1xyXG4gICAgbiArPSAxMjtcclxuICAgIHgyIC89IDQwOTY7XHJcbiAgfVxyXG4gIHdoaWxlKHgyID49IDIpe1xyXG4gICAgbiAgKz0gMTtcclxuICAgIHgyIC89IDI7XHJcbiAgfSByZXR1cm4gbjtcclxufTtcclxuXHJcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKCEhJHRvRml4ZWQgJiYgKFxyXG4gIDAuMDAwMDgudG9GaXhlZCgzKSAhPT0gJzAuMDAwJyB8fFxyXG4gIDAuOS50b0ZpeGVkKDApICE9PSAnMScgfHxcclxuICAxLjI1NS50b0ZpeGVkKDIpICE9PSAnMS4yNScgfHxcclxuICAxMDAwMDAwMDAwMDAwMDAwMTI4Li50b0ZpeGVkKDApICE9PSAnMTAwMDAwMDAwMDAwMDAwMDEyOCdcclxuKSB8fCAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xyXG4gIC8vIFY4IH4gQW5kcm9pZCA0LjMtXHJcbiAgJHRvRml4ZWQuY2FsbCh7fSk7XHJcbn0pKSwgJ051bWJlcicsIHtcclxuICB0b0ZpeGVkOiBmdW5jdGlvbiB0b0ZpeGVkKGZyYWN0aW9uRGlnaXRzKXtcclxuICAgIHZhciB4ID0gYU51bWJlclZhbHVlKHRoaXMsIEVSUk9SKVxyXG4gICAgICAsIGYgPSB0b0ludGVnZXIoZnJhY3Rpb25EaWdpdHMpXHJcbiAgICAgICwgcyA9ICcnXHJcbiAgICAgICwgbSA9IFpFUk9cclxuICAgICAgLCBlLCB6LCBqLCBrO1xyXG4gICAgaWYoZiA8IDAgfHwgZiA+IDIwKXRocm93IFJhbmdlRXJyb3IoRVJST1IpO1xyXG4gICAgaWYoeCAhPSB4KXJldHVybiAnTmFOJztcclxuICAgIGlmKHggPD0gLTFlMjEgfHwgeCA+PSAxZTIxKXJldHVybiBTdHJpbmcoeCk7XHJcbiAgICBpZih4IDwgMCl7XHJcbiAgICAgIHMgPSAnLSc7XHJcbiAgICAgIHggPSAteDtcclxuICAgIH1cclxuICAgIGlmKHggPiAxZS0yMSl7XHJcbiAgICAgIGUgPSBsb2coeCAqIHBvdygyLCA2OSwgMSkpIC0gNjk7XHJcbiAgICAgIHogPSBlIDwgMCA/IHggKiBwb3coMiwgLWUsIDEpIDogeCAvIHBvdygyLCBlLCAxKTtcclxuICAgICAgeiAqPSAweDEwMDAwMDAwMDAwMDAwO1xyXG4gICAgICBlID0gNTIgLSBlO1xyXG4gICAgICBpZihlID4gMCl7XHJcbiAgICAgICAgbXVsdGlwbHkoMCwgeik7XHJcbiAgICAgICAgaiA9IGY7XHJcbiAgICAgICAgd2hpbGUoaiA+PSA3KXtcclxuICAgICAgICAgIG11bHRpcGx5KDFlNywgMCk7XHJcbiAgICAgICAgICBqIC09IDc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG11bHRpcGx5KHBvdygxMCwgaiwgMSksIDApO1xyXG4gICAgICAgIGogPSBlIC0gMTtcclxuICAgICAgICB3aGlsZShqID49IDIzKXtcclxuICAgICAgICAgIGRpdmlkZSgxIDw8IDIzKTtcclxuICAgICAgICAgIGogLT0gMjM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRpdmlkZSgxIDw8IGopO1xyXG4gICAgICAgIG11bHRpcGx5KDEsIDEpO1xyXG4gICAgICAgIGRpdmlkZSgyKTtcclxuICAgICAgICBtID0gbnVtVG9TdHJpbmcoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtdWx0aXBseSgwLCB6KTtcclxuICAgICAgICBtdWx0aXBseSgxIDw8IC1lLCAwKTtcclxuICAgICAgICBtID0gbnVtVG9TdHJpbmcoKSArIHJlcGVhdC5jYWxsKFpFUk8sIGYpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZihmID4gMCl7XHJcbiAgICAgIGsgPSBtLmxlbmd0aDtcclxuICAgICAgbSA9IHMgKyAoayA8PSBmID8gJzAuJyArIHJlcGVhdC5jYWxsKFpFUk8sIGYgLSBrKSArIG0gOiBtLnNsaWNlKDAsIGsgLSBmKSArICcuJyArIG0uc2xpY2UoayAtIGYpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG0gPSBzICsgbTtcclxuICAgIH0gcmV0dXJuIG07XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnRvLWZpeGVkLmpzXG4gKiogbW9kdWxlIGlkID0gODlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIENvbnN0cnVjdG9yLCBuYW1lLCBmb3JiaWRkZW5GaWVsZCl7XG4gIGlmKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgfHwgKGZvcmJpZGRlbkZpZWxkICE9PSB1bmRlZmluZWQgJiYgZm9yYmlkZGVuRmllbGQgaW4gaXQpKXtcbiAgICB0aHJvdyBUeXBlRXJyb3IobmFtZSArICc6IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICB9IHJldHVybiBpdDtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzXG4gKiogbW9kdWxlIGlkID0gOTBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgbXNnKXtcclxuICBpZih0eXBlb2YgaXQgIT0gJ251bWJlcicgJiYgY29mKGl0KSAhPSAnTnVtYmVyJyl0aHJvdyBUeXBlRXJyb3IobXNnKTtcclxuICByZXR1cm4gK2l0O1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hLW51bWJlci12YWx1ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDkxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgZGVmaW5lZCAgID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlcGVhdChjb3VudCl7XG4gIHZhciBzdHIgPSBTdHJpbmcoZGVmaW5lZCh0aGlzKSlcbiAgICAsIHJlcyA9ICcnXG4gICAgLCBuICAgPSB0b0ludGVnZXIoY291bnQpO1xuICBpZihuIDwgMCB8fCBuID09IEluZmluaXR5KXRocm93IFJhbmdlRXJyb3IoXCJDb3VudCBjYW4ndCBiZSBuZWdhdGl2ZVwiKTtcbiAgZm9yKDtuID4gMDsgKG4gPj4+PSAxKSAmJiAoc3RyICs9IHN0cikpaWYobiAmIDEpcmVzICs9IHN0cjtcbiAgcmV0dXJuIHJlcztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1yZXBlYXQuanNcbiAqKiBtb2R1bGUgaWQgPSA5MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsICRmYWlscyAgICAgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJylcclxuICAsIGFOdW1iZXJWYWx1ZSA9IHJlcXVpcmUoJy4vX2EtbnVtYmVyLXZhbHVlJylcclxuICAsICR0b1ByZWNpc2lvbiA9IDEuLnRvUHJlY2lzaW9uO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoJGZhaWxzKGZ1bmN0aW9uKCl7XHJcbiAgLy8gSUU3LVxyXG4gIHJldHVybiAkdG9QcmVjaXNpb24uY2FsbCgxLCB1bmRlZmluZWQpICE9PSAnMSc7XHJcbn0pIHx8ICEkZmFpbHMoZnVuY3Rpb24oKXtcclxuICAvLyBWOCB+IEFuZHJvaWQgNC4zLVxyXG4gICR0b1ByZWNpc2lvbi5jYWxsKHt9KTtcclxufSkpLCAnTnVtYmVyJywge1xyXG4gIHRvUHJlY2lzaW9uOiBmdW5jdGlvbiB0b1ByZWNpc2lvbihwcmVjaXNpb24pe1xyXG4gICAgdmFyIHRoYXQgPSBhTnVtYmVyVmFsdWUodGhpcywgJ051bWJlciN0b1ByZWNpc2lvbjogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XHJcbiAgICByZXR1cm4gcHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyAkdG9QcmVjaXNpb24uY2FsbCh0aGF0KSA6ICR0b1ByZWNpc2lvbi5jYWxsKHRoYXQsIHByZWNpc2lvbik7IFxyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci50by1wcmVjaXNpb24uanNcbiAqKiBtb2R1bGUgaWQgPSA5M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMS4yLjEgTnVtYmVyLkVQU0lMT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge0VQU0lMT046IE1hdGgucG93KDIsIC01Mil9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmVwc2lsb24uanNcbiAqKiBtb2R1bGUgaWQgPSA5NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMS4yLjIgTnVtYmVyLmlzRmluaXRlKG51bWJlcilcbnZhciAkZXhwb3J0ICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIF9pc0Zpbml0ZSA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmlzRmluaXRlO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNGaW5pdGU6IGZ1bmN0aW9uIGlzRmluaXRlKGl0KXtcbiAgICByZXR1cm4gdHlwZW9mIGl0ID09ICdudW1iZXInICYmIF9pc0Zpbml0ZShpdCk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtZmluaXRlLmpzXG4gKiogbW9kdWxlIGlkID0gOTVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjEuMi4zIE51bWJlci5pc0ludGVnZXIobnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7aXNJbnRlZ2VyOiByZXF1aXJlKCcuL19pcy1pbnRlZ2VyJyl9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWludGVnZXIuanNcbiAqKiBtb2R1bGUgaWQgPSA5NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGZsb29yICAgID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNJbnRlZ2VyKGl0KXtcbiAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pcy1pbnRlZ2VyLmpzXG4gKiogbW9kdWxlIGlkID0gOTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjEuMi40IE51bWJlci5pc05hTihudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNOYU46IGZ1bmN0aW9uIGlzTmFOKG51bWJlcil7XG4gICAgcmV0dXJuIG51bWJlciAhPSBudW1iZXI7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuLmpzXG4gKiogbW9kdWxlIGlkID0gOThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjEuMi41IE51bWJlci5pc1NhZmVJbnRlZ2VyKG51bWJlcilcbnZhciAkZXhwb3J0ICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGlzSW50ZWdlciA9IHJlcXVpcmUoJy4vX2lzLWludGVnZXInKVxuICAsIGFicyAgICAgICA9IE1hdGguYWJzO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNTYWZlSW50ZWdlcjogZnVuY3Rpb24gaXNTYWZlSW50ZWdlcihudW1iZXIpe1xuICAgIHJldHVybiBpc0ludGVnZXIobnVtYmVyKSAmJiBhYnMobnVtYmVyKSA8PSAweDFmZmZmZmZmZmZmZmZmO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLXNhZmUtaW50ZWdlci5qc1xuICoqIG1vZHVsZSBpZCA9IDk5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4xLjIuNiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7TUFYX1NBRkVfSU5URUdFUjogMHgxZmZmZmZmZmZmZmZmZn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIubWF4LXNhZmUtaW50ZWdlci5qc1xuICoqIG1vZHVsZSBpZCA9IDEwMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMS4yLjEwIE51bWJlci5NSU5fU0FGRV9JTlRFR0VSXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtNSU5fU0FGRV9JTlRFR0VSOiAtMHgxZmZmZmZmZmZmZmZmZn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIubWluLXNhZmUtaW50ZWdlci5qc1xuICoqIG1vZHVsZSBpZCA9IDEwMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyICRleHBvcnQgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4vX3BhcnNlLWZsb2F0Jyk7XG4vLyAyMC4xLjIuMTIgTnVtYmVyLnBhcnNlRmxvYXQoc3RyaW5nKVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTnVtYmVyLnBhcnNlRmxvYXQgIT0gJHBhcnNlRmxvYXQpLCAnTnVtYmVyJywge3BhcnNlRmxvYXQ6ICRwYXJzZUZsb2F0fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1mbG9hdC5qc1xuICoqIG1vZHVsZSBpZCA9IDEwMlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fcGFyc2UtaW50Jyk7XG4vLyAyMC4xLjIuMTMgTnVtYmVyLnBhcnNlSW50KHN0cmluZywgcmFkaXgpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChOdW1iZXIucGFyc2VJbnQgIT0gJHBhcnNlSW50KSwgJ051bWJlcicsIHtwYXJzZUludDogJHBhcnNlSW50fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1pbnQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMDNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4zIE1hdGguYWNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBsb2cxcCAgID0gcmVxdWlyZSgnLi9fbWF0aC1sb2cxcCcpXG4gICwgc3FydCAgICA9IE1hdGguc3FydFxuICAsICRhY29zaCAgPSBNYXRoLmFjb3NoO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoJGFjb3NoXG4gIC8vIFY4IGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTM1MDlcbiAgJiYgTWF0aC5mbG9vcigkYWNvc2goTnVtYmVyLk1BWF9WQUxVRSkpID09IDcxMFxuICAvLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYWNvc2goSW5maW5pdHkpIC0+IE5hTiBcbiAgJiYgJGFjb3NoKEluZmluaXR5KSA9PSBJbmZpbml0eVxuKSwgJ01hdGgnLCB7XG4gIGFjb3NoOiBmdW5jdGlvbiBhY29zaCh4KXtcbiAgICByZXR1cm4gKHggPSAreCkgPCAxID8gTmFOIDogeCA+IDk0OTA2MjY1LjYyNDI1MTU2XG4gICAgICA/IE1hdGgubG9nKHgpICsgTWF0aC5MTjJcbiAgICAgIDogbG9nMXAoeCAtIDEgKyBzcXJ0KHggLSAxKSAqIHNxcnQoeCArIDEpKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYWNvc2guanNcbiAqKiBtb2R1bGUgaWQgPSAxMDRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4yMCBNYXRoLmxvZzFwKHgpXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgubG9nMXAgfHwgZnVuY3Rpb24gbG9nMXAoeCl7XG4gIHJldHVybiAoeCA9ICt4KSA+IC0xZS04ICYmIHggPCAxZS04ID8geCAtIHggKiB4IC8gMiA6IE1hdGgubG9nKDEgKyB4KTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX21hdGgtbG9nMXAuanNcbiAqKiBtb2R1bGUgaWQgPSAxMDVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi41IE1hdGguYXNpbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkYXNpbmggID0gTWF0aC5hc2luaDtcblxuZnVuY3Rpb24gYXNpbmgoeCl7XG4gIHJldHVybiAhaXNGaW5pdGUoeCA9ICt4KSB8fCB4ID09IDAgPyB4IDogeCA8IDAgPyAtYXNpbmgoLXgpIDogTWF0aC5sb2coeCArIE1hdGguc3FydCh4ICogeCArIDEpKTtcbn1cblxuLy8gVG9yIEJyb3dzZXIgYnVnOiBNYXRoLmFzaW5oKDApIC0+IC0wIFxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKCRhc2luaCAmJiAxIC8gJGFzaW5oKDApID4gMCksICdNYXRoJywge2FzaW5oOiBhc2luaH0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmFzaW5oLmpzXG4gKiogbW9kdWxlIGlkID0gMTA2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4yLjIuNyBNYXRoLmF0YW5oKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJGF0YW5oICA9IE1hdGguYXRhbmg7XG5cbi8vIFRvciBCcm93c2VyIGJ1ZzogTWF0aC5hdGFuaCgtMCkgLT4gMCBcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogISgkYXRhbmggJiYgMSAvICRhdGFuaCgtMCkgPCAwKSwgJ01hdGgnLCB7XG4gIGF0YW5oOiBmdW5jdGlvbiBhdGFuaCh4KXtcbiAgICByZXR1cm4gKHggPSAreCkgPT0gMCA/IHggOiBNYXRoLmxvZygoMSArIHgpIC8gKDEgLSB4KSkgLyAyO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hdGFuaC5qc1xuICoqIG1vZHVsZSBpZCA9IDEwN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjkgTWF0aC5jYnJ0KHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgc2lnbiAgICA9IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNicnQ6IGZ1bmN0aW9uIGNicnQoeCl7XG4gICAgcmV0dXJuIHNpZ24oeCA9ICt4KSAqIE1hdGgucG93KE1hdGguYWJzKHgpLCAxIC8gMyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNicnQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMDhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4yOCBNYXRoLnNpZ24oeClcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5zaWduIHx8IGZ1bmN0aW9uIHNpZ24oeCl7XG4gIHJldHVybiAoeCA9ICt4KSA9PSAwIHx8IHggIT0geCA/IHggOiB4IDwgMCA/IC0xIDogMTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX21hdGgtc2lnbi5qc1xuICoqIG1vZHVsZSBpZCA9IDEwOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjExIE1hdGguY2x6MzIoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgY2x6MzI6IGZ1bmN0aW9uIGNsejMyKHgpe1xuICAgIHJldHVybiAoeCA+Pj49IDApID8gMzEgLSBNYXRoLmZsb29yKE1hdGgubG9nKHggKyAwLjUpICogTWF0aC5MT0cyRSkgOiAzMjtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY2x6MzIuanNcbiAqKiBtb2R1bGUgaWQgPSAxMTBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4xMiBNYXRoLmNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBleHAgICAgID0gTWF0aC5leHA7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgY29zaDogZnVuY3Rpb24gY29zaCh4KXtcbiAgICByZXR1cm4gKGV4cCh4ID0gK3gpICsgZXhwKC14KSkgLyAyO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jb3NoLmpzXG4gKiogbW9kdWxlIGlkID0gMTExXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4yLjIuMTQgTWF0aC5leHBtMSh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsICRleHBtMSAgPSByZXF1aXJlKCcuL19tYXRoLWV4cG0xJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCRleHBtMSAhPSBNYXRoLmV4cG0xKSwgJ01hdGgnLCB7ZXhwbTE6ICRleHBtMX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmV4cG0xLmpzXG4gKiogbW9kdWxlIGlkID0gMTEyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4yLjIuMTQgTWF0aC5leHBtMSh4KVxudmFyICRleHBtMSA9IE1hdGguZXhwbTE7XG5tb2R1bGUuZXhwb3J0cyA9ICghJGV4cG0xXG4gIC8vIE9sZCBGRiBidWdcbiAgfHwgJGV4cG0xKDEwKSA+IDIyMDI1LjQ2NTc5NDgwNjcxOSB8fCAkZXhwbTEoMTApIDwgMjIwMjUuNDY1Nzk0ODA2NzE2NTE2OFxuICAvLyBUb3IgQnJvd3NlciBidWdcbiAgfHwgJGV4cG0xKC0yZS0xNykgIT0gLTJlLTE3XG4pID8gZnVuY3Rpb24gZXhwbTEoeCl7XG4gIHJldHVybiAoeCA9ICt4KSA9PSAwID8geCA6IHggPiAtMWUtNiAmJiB4IDwgMWUtNiA/IHggKyB4ICogeCAvIDIgOiBNYXRoLmV4cCh4KSAtIDE7XG59IDogJGV4cG0xO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19tYXRoLWV4cG0xLmpzXG4gKiogbW9kdWxlIGlkID0gMTEzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4yLjIuMTYgTWF0aC5mcm91bmQoeClcbnZhciAkZXhwb3J0ICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHNpZ24gICAgICA9IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpXG4gICwgcG93ICAgICAgID0gTWF0aC5wb3dcbiAgLCBFUFNJTE9OICAgPSBwb3coMiwgLTUyKVxuICAsIEVQU0lMT04zMiA9IHBvdygyLCAtMjMpXG4gICwgTUFYMzIgICAgID0gcG93KDIsIDEyNykgKiAoMiAtIEVQU0lMT04zMilcbiAgLCBNSU4zMiAgICAgPSBwb3coMiwgLTEyNik7XG5cbnZhciByb3VuZFRpZXNUb0V2ZW4gPSBmdW5jdGlvbihuKXtcbiAgcmV0dXJuIG4gKyAxIC8gRVBTSUxPTiAtIDEgLyBFUFNJTE9OO1xufTtcblxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGZyb3VuZDogZnVuY3Rpb24gZnJvdW5kKHgpe1xuICAgIHZhciAkYWJzICA9IE1hdGguYWJzKHgpXG4gICAgICAsICRzaWduID0gc2lnbih4KVxuICAgICAgLCBhLCByZXN1bHQ7XG4gICAgaWYoJGFicyA8IE1JTjMyKXJldHVybiAkc2lnbiAqIHJvdW5kVGllc1RvRXZlbigkYWJzIC8gTUlOMzIgLyBFUFNJTE9OMzIpICogTUlOMzIgKiBFUFNJTE9OMzI7XG4gICAgYSA9ICgxICsgRVBTSUxPTjMyIC8gRVBTSUxPTikgKiAkYWJzO1xuICAgIHJlc3VsdCA9IGEgLSAoYSAtICRhYnMpO1xuICAgIGlmKHJlc3VsdCA+IE1BWDMyIHx8IHJlc3VsdCAhPSByZXN1bHQpcmV0dXJuICRzaWduICogSW5maW5pdHk7XG4gICAgcmV0dXJuICRzaWduICogcmVzdWx0O1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5mcm91bmQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMTRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4xNyBNYXRoLmh5cG90KFt2YWx1ZTFbLCB2YWx1ZTJbLCDigKYgXV1dKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGFicyAgICAgPSBNYXRoLmFicztcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBoeXBvdDogZnVuY3Rpb24gaHlwb3QodmFsdWUxLCB2YWx1ZTIpeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIHN1bSAgPSAwXG4gICAgICAsIGkgICAgPSAwXG4gICAgICAsIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAsIGxhcmcgPSAwXG4gICAgICAsIGFyZywgZGl2O1xuICAgIHdoaWxlKGkgPCBhTGVuKXtcbiAgICAgIGFyZyA9IGFicyhhcmd1bWVudHNbaSsrXSk7XG4gICAgICBpZihsYXJnIDwgYXJnKXtcbiAgICAgICAgZGl2ICA9IGxhcmcgLyBhcmc7XG4gICAgICAgIHN1bSAgPSBzdW0gKiBkaXYgKiBkaXYgKyAxO1xuICAgICAgICBsYXJnID0gYXJnO1xuICAgICAgfSBlbHNlIGlmKGFyZyA+IDApe1xuICAgICAgICBkaXYgID0gYXJnIC8gbGFyZztcbiAgICAgICAgc3VtICs9IGRpdiAqIGRpdjtcbiAgICAgIH0gZWxzZSBzdW0gKz0gYXJnO1xuICAgIH1cbiAgICByZXR1cm4gbGFyZyA9PT0gSW5maW5pdHkgPyBJbmZpbml0eSA6IGxhcmcgKiBNYXRoLnNxcnQoc3VtKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaHlwb3QuanNcbiAqKiBtb2R1bGUgaWQgPSAxMTVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4xOCBNYXRoLmltdWwoeCwgeSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkaW11bCAgID0gTWF0aC5pbXVsO1xuXG4vLyBzb21lIFdlYktpdCB2ZXJzaW9ucyBmYWlscyB3aXRoIGJpZyBudW1iZXJzLCBzb21lIGhhcyB3cm9uZyBhcml0eVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiAkaW11bCgweGZmZmZmZmZmLCA1KSAhPSAtNSB8fCAkaW11bC5sZW5ndGggIT0gMjtcbn0pLCAnTWF0aCcsIHtcbiAgaW11bDogZnVuY3Rpb24gaW11bCh4LCB5KXtcbiAgICB2YXIgVUlOVDE2ID0gMHhmZmZmXG4gICAgICAsIHhuID0gK3hcbiAgICAgICwgeW4gPSAreVxuICAgICAgLCB4bCA9IFVJTlQxNiAmIHhuXG4gICAgICAsIHlsID0gVUlOVDE2ICYgeW47XG4gICAgcmV0dXJuIDAgfCB4bCAqIHlsICsgKChVSU5UMTYgJiB4biA+Pj4gMTYpICogeWwgKyB4bCAqIChVSU5UMTYgJiB5biA+Pj4gMTYpIDw8IDE2ID4+PiAwKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaW11bC5qc1xuICoqIG1vZHVsZSBpZCA9IDExNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjIxIE1hdGgubG9nMTAoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgbG9nMTA6IGZ1bmN0aW9uIGxvZzEwKHgpe1xuICAgIHJldHVybiBNYXRoLmxvZyh4KSAvIE1hdGguTE4xMDtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMTAuanNcbiAqKiBtb2R1bGUgaWQgPSAxMTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4yMCBNYXRoLmxvZzFwKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7bG9nMXA6IHJlcXVpcmUoJy4vX21hdGgtbG9nMXAnKX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzFwLmpzXG4gKiogbW9kdWxlIGlkID0gMTE4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMC4yLjIuMjIgTWF0aC5sb2cyKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGxvZzI6IGZ1bmN0aW9uIGxvZzIoeCl7XG4gICAgcmV0dXJuIE1hdGgubG9nKHgpIC8gTWF0aC5MTjI7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzIuanNcbiAqKiBtb2R1bGUgaWQgPSAxMTlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4yOCBNYXRoLnNpZ24oeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtzaWduOiByZXF1aXJlKCcuL19tYXRoLXNpZ24nKX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnNpZ24uanNcbiAqKiBtb2R1bGUgaWQgPSAxMjBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4zMCBNYXRoLnNpbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBleHBtMSAgID0gcmVxdWlyZSgnLi9fbWF0aC1leHBtMScpXG4gICwgZXhwICAgICA9IE1hdGguZXhwO1xuXG4vLyBWOCBuZWFyIENocm9taXVtIDM4IGhhcyBhIHByb2JsZW0gd2l0aCB2ZXJ5IHNtYWxsIG51bWJlcnNcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gIU1hdGguc2luaCgtMmUtMTcpICE9IC0yZS0xNztcbn0pLCAnTWF0aCcsIHtcbiAgc2luaDogZnVuY3Rpb24gc2luaCh4KXtcbiAgICByZXR1cm4gTWF0aC5hYnMoeCA9ICt4KSA8IDFcbiAgICAgID8gKGV4cG0xKHgpIC0gZXhwbTEoLXgpKSAvIDJcbiAgICAgIDogKGV4cCh4IC0gMSkgLSBleHAoLXggLSAxKSkgKiAoTWF0aC5FIC8gMik7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnNpbmguanNcbiAqKiBtb2R1bGUgaWQgPSAxMjFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjIuMi4zMyBNYXRoLnRhbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBleHBtMSAgID0gcmVxdWlyZSgnLi9fbWF0aC1leHBtMScpXG4gICwgZXhwICAgICA9IE1hdGguZXhwO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIHRhbmg6IGZ1bmN0aW9uIHRhbmgoeCl7XG4gICAgdmFyIGEgPSBleHBtMSh4ID0gK3gpXG4gICAgICAsIGIgPSBleHBtMSgteCk7XG4gICAgcmV0dXJuIGEgPT0gSW5maW5pdHkgPyAxIDogYiA9PSBJbmZpbml0eSA/IC0xIDogKGEgLSBiKSAvIChleHAoeCkgKyBleHAoLXgpKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudGFuaC5qc1xuICoqIG1vZHVsZSBpZCA9IDEyMlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjAuMi4yLjM0IE1hdGgudHJ1bmMoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgdHJ1bmM6IGZ1bmN0aW9uIHRydW5jKGl0KXtcbiAgICByZXR1cm4gKGl0ID4gMCA/IE1hdGguZmxvb3IgOiBNYXRoLmNlaWwpKGl0KTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudHJ1bmMuanNcbiAqKiBtb2R1bGUgaWQgPSAxMjNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciAkZXhwb3J0ICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgdG9JbmRleCAgICAgICAgPSByZXF1aXJlKCcuL190by1pbmRleCcpXG4gICwgZnJvbUNoYXJDb2RlICAgPSBTdHJpbmcuZnJvbUNoYXJDb2RlXG4gICwgJGZyb21Db2RlUG9pbnQgPSBTdHJpbmcuZnJvbUNvZGVQb2ludDtcblxuLy8gbGVuZ3RoIHNob3VsZCBiZSAxLCBvbGQgRkYgcHJvYmxlbVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoISEkZnJvbUNvZGVQb2ludCAmJiAkZnJvbUNvZGVQb2ludC5sZW5ndGggIT0gMSksICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMi4yIFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLmNvZGVQb2ludHMpXG4gIGZyb21Db2RlUG9pbnQ6IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoeCl7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgcmVzICA9IFtdXG4gICAgICAsIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAsIGkgICAgPSAwXG4gICAgICAsIGNvZGU7XG4gICAgd2hpbGUoYUxlbiA+IGkpe1xuICAgICAgY29kZSA9ICthcmd1bWVudHNbaSsrXTtcbiAgICAgIGlmKHRvSW5kZXgoY29kZSwgMHgxMGZmZmYpICE9PSBjb2RlKXRocm93IFJhbmdlRXJyb3IoY29kZSArICcgaXMgbm90IGEgdmFsaWQgY29kZSBwb2ludCcpO1xuICAgICAgcmVzLnB1c2goY29kZSA8IDB4MTAwMDBcbiAgICAgICAgPyBmcm9tQ2hhckNvZGUoY29kZSlcbiAgICAgICAgOiBmcm9tQ2hhckNvZGUoKChjb2RlIC09IDB4MTAwMDApID4+IDEwKSArIDB4ZDgwMCwgY29kZSAlIDB4NDAwICsgMHhkYzAwKVxuICAgICAgKTtcbiAgICB9IHJldHVybiByZXMuam9pbignJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZnJvbS1jb2RlLXBvaW50LmpzXG4gKiogbW9kdWxlIGlkID0gMTI0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMi40IFN0cmluZy5yYXcoY2FsbFNpdGUsIC4uLnN1YnN0aXR1dGlvbnMpXG4gIHJhdzogZnVuY3Rpb24gcmF3KGNhbGxTaXRlKXtcbiAgICB2YXIgdHBsICA9IHRvSU9iamVjdChjYWxsU2l0ZS5yYXcpXG4gICAgICAsIGxlbiAgPSB0b0xlbmd0aCh0cGwubGVuZ3RoKVxuICAgICAgLCBhTGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgLCByZXMgID0gW11cbiAgICAgICwgaSAgICA9IDA7XG4gICAgd2hpbGUobGVuID4gaSl7XG4gICAgICByZXMucHVzaChTdHJpbmcodHBsW2krK10pKTtcbiAgICAgIGlmKGkgPCBhTGVuKXJlcy5wdXNoKFN0cmluZyhhcmd1bWVudHNbaV0pKTtcbiAgICB9IHJldHVybiByZXMuam9pbignJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcucmF3LmpzXG4gKiogbW9kdWxlIGlkID0gMTI1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyAyMS4xLjMuMjUgU3RyaW5nLnByb3RvdHlwZS50cmltKClcbnJlcXVpcmUoJy4vX3N0cmluZy10cmltJykoJ3RyaW0nLCBmdW5jdGlvbigkdHJpbSl7XG4gIHJldHVybiBmdW5jdGlvbiB0cmltKCl7XG4gICAgcmV0dXJuICR0cmltKHRoaXMsIDMpO1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy50cmltLmpzXG4gKiogbW9kdWxlIGlkID0gMTI2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ICA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uKGl0ZXJhdGVkKXtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwgaW5kZXggPSB0aGlzLl9pXG4gICAgLCBwb2ludDtcbiAgaWYoaW5kZXggPj0gTy5sZW5ndGgpcmV0dXJuIHt2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHt2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3IuanNcbiAqKiBtb2R1bGUgaWQgPSAxMjdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBkZWZpbmVkICAgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUT19TVFJJTkcpe1xuICByZXR1cm4gZnVuY3Rpb24odGhhdCwgcG9zKXtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKVxuICAgICAgLCBpID0gdG9JbnRlZ2VyKHBvcylcbiAgICAgICwgbCA9IHMubGVuZ3RoXG4gICAgICAsIGEsIGI7XG4gICAgaWYoaSA8IDAgfHwgaSA+PSBsKXJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctYXQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMjhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCByZWRlZmluZSAgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBoaWRlICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBJdGVyYXRvcnMgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgJGl0ZXJDcmVhdGUgICAgPSByZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBJVEVSQVRPUiAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgQlVHR1kgICAgICAgICAgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSkgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICAsIEZGX0lURVJBVE9SICAgID0gJ0BAaXRlcmF0b3InXG4gICwgS0VZUyAgICAgICAgICAgPSAna2V5cydcbiAgLCBWQUxVRVMgICAgICAgICA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCl7XG4gICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcbiAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uKGtpbmQpe1xuICAgIGlmKCFCVUdHWSAmJiBraW5kIGluIHByb3RvKXJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2goa2luZCl7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgfTtcbiAgdmFyIFRBRyAgICAgICAgPSBOQU1FICsgJyBJdGVyYXRvcidcbiAgICAsIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFU1xuICAgICwgVkFMVUVTX0JVRyA9IGZhbHNlXG4gICAgLCBwcm90byAgICAgID0gQmFzZS5wcm90b3R5cGVcbiAgICAsICRuYXRpdmUgICAgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF1cbiAgICAsICRkZWZhdWx0ICAgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKVxuICAgICwgJGVudHJpZXMgICA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWRcbiAgICAsICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlXG4gICAgLCBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmKCRhbnlOYXRpdmUpe1xuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKSk7XG4gICAgaWYoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpe1xuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG4gICAgICAvLyBmaXggZm9yIHNvbWUgb2xkIGVuZ2luZXNcbiAgICAgIGlmKCFMSUJSQVJZICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSloaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKXtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZigoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSl7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSAgPSByZXR1cm5UaGlzO1xuICBpZihERUZBVUxUKXtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiAgREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiAgICBJU19TRVQgICAgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiAkZW50cmllc1xuICAgIH07XG4gICAgaWYoRk9SQ0VEKWZvcihrZXkgaW4gbWV0aG9kcyl7XG4gICAgICBpZighKGtleSBpbiBwcm90bykpcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcbiAgICB9IGVsc2UgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoQlVHR1kgfHwgVkFMVUVTX0JVRyksIE5BTUUsIG1ldGhvZHMpO1xuICB9XG4gIHJldHVybiBtZXRob2RzO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanNcbiAqKiBtb2R1bGUgaWQgPSAxMjlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0ge307XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXJhdG9ycy5qc1xuICoqIG1vZHVsZSBpZCA9IDEzMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpXG4gICwgZGVzY3JpcHRvciAgICAgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJylcbiAgLCBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKSwgZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KXtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7bmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KX0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzXG4gKiogbW9kdWxlIGlkID0gMTMxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJGF0ICAgICA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKGZhbHNlKTtcbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjMuMyBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KHBvcylcbiAgY29kZVBvaW50QXQ6IGZ1bmN0aW9uIGNvZGVQb2ludEF0KHBvcyl7XG4gICAgcmV0dXJuICRhdCh0aGlzLCBwb3MpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMzJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIxLjEuMy42IFN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGgoc2VhcmNoU3RyaW5nIFssIGVuZFBvc2l0aW9uXSlcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgY29udGV4dCAgID0gcmVxdWlyZSgnLi9fc3RyaW5nLWNvbnRleHQnKVxuICAsIEVORFNfV0lUSCA9ICdlbmRzV2l0aCdcbiAgLCAkZW5kc1dpdGggPSAnJ1tFTkRTX1dJVEhdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKEVORFNfV0lUSCksICdTdHJpbmcnLCB7XG4gIGVuZHNXaXRoOiBmdW5jdGlvbiBlbmRzV2l0aChzZWFyY2hTdHJpbmcgLyosIGVuZFBvc2l0aW9uID0gQGxlbmd0aCAqLyl7XG4gICAgdmFyIHRoYXQgPSBjb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgRU5EU19XSVRIKVxuICAgICAgLCBlbmRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkXG4gICAgICAsIGxlbiAgICA9IHRvTGVuZ3RoKHRoYXQubGVuZ3RoKVxuICAgICAgLCBlbmQgICAgPSBlbmRQb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gbGVuIDogTWF0aC5taW4odG9MZW5ndGgoZW5kUG9zaXRpb24pLCBsZW4pXG4gICAgICAsIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiAkZW5kc1dpdGhcbiAgICAgID8gJGVuZHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBlbmQpXG4gICAgICA6IHRoYXQuc2xpY2UoZW5kIC0gc2VhcmNoLmxlbmd0aCwgZW5kKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmVuZHMtd2l0aC5qc1xuICoqIG1vZHVsZSBpZCA9IDEzM1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gaGVscGVyIGZvciBTdHJpbmcje3N0YXJ0c1dpdGgsIGVuZHNXaXRoLCBpbmNsdWRlc31cbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpXG4gICwgZGVmaW5lZCAgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odGhhdCwgc2VhcmNoU3RyaW5nLCBOQU1FKXtcbiAgaWYoaXNSZWdFeHAoc2VhcmNoU3RyaW5nKSl0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZyMnICsgTkFNRSArIFwiIGRvZXNuJ3QgYWNjZXB0IHJlZ2V4IVwiKTtcbiAgcmV0dXJuIFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1jb250ZXh0LmpzXG4gKiogbW9kdWxlIGlkID0gMTM0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyA3LjIuOCBJc1JlZ0V4cChhcmd1bWVudClcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgY29mICAgICAgPSByZXF1aXJlKCcuL19jb2YnKVxuICAsIE1BVENIICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ21hdGNoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIGlzUmVnRXhwO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmICgoaXNSZWdFeHAgPSBpdFtNQVRDSF0pICE9PSB1bmRlZmluZWQgPyAhIWlzUmVnRXhwIDogY29mKGl0KSA9PSAnUmVnRXhwJyk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pcy1yZWdleHAuanNcbiAqKiBtb2R1bGUgaWQgPSAxMzVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBNQVRDSCA9IHJlcXVpcmUoJy4vX3drcycpKCdtYXRjaCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVkpe1xuICB2YXIgcmUgPSAvLi87XG4gIHRyeSB7XG4gICAgJy8uLydbS0VZXShyZSk7XG4gIH0gY2F0Y2goZSl7XG4gICAgdHJ5IHtcbiAgICAgIHJlW01BVENIXSA9IGZhbHNlO1xuICAgICAgcmV0dXJuICEnLy4vJ1tLRVldKHJlKTtcbiAgICB9IGNhdGNoKGYpeyAvKiBlbXB0eSAqLyB9XG4gIH0gcmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19mYWlscy1pcy1yZWdleHAuanNcbiAqKiBtb2R1bGUgaWQgPSAxMzZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIxLjEuMy43IFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMoc2VhcmNoU3RyaW5nLCBwb3NpdGlvbiA9IDApXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGNvbnRleHQgID0gcmVxdWlyZSgnLi9fc3RyaW5nLWNvbnRleHQnKVxuICAsIElOQ0xVREVTID0gJ2luY2x1ZGVzJztcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscy1pcy1yZWdleHAnKShJTkNMVURFUyksICdTdHJpbmcnLCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hTdHJpbmcgLyosIHBvc2l0aW9uID0gMCAqLyl7XG4gICAgcmV0dXJuICEhfmNvbnRleHQodGhpcywgc2VhcmNoU3RyaW5nLCBJTkNMVURFUylcbiAgICAgIC5pbmRleE9mKHNlYXJjaFN0cmluZywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmluY2x1ZGVzLmpzXG4gKiogbW9kdWxlIGlkID0gMTM3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4zLjEzIFN0cmluZy5wcm90b3R5cGUucmVwZWF0KGNvdW50KVxuICByZXBlYXQ6IHJlcXVpcmUoJy4vX3N0cmluZy1yZXBlYXQnKVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5yZXBlYXQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMzhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIxLjEuMy4xOCBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIFssIHBvc2l0aW9uIF0pXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHRvTGVuZ3RoICAgID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCBjb250ZXh0ICAgICA9IHJlcXVpcmUoJy4vX3N0cmluZy1jb250ZXh0JylcbiAgLCBTVEFSVFNfV0lUSCA9ICdzdGFydHNXaXRoJ1xuICAsICRzdGFydHNXaXRoID0gJydbU1RBUlRTX1dJVEhdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKFNUQVJUU19XSVRIKSwgJ1N0cmluZycsIHtcbiAgc3RhcnRzV2l0aDogZnVuY3Rpb24gc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcgLyosIHBvc2l0aW9uID0gMCAqLyl7XG4gICAgdmFyIHRoYXQgICA9IGNvbnRleHQodGhpcywgc2VhcmNoU3RyaW5nLCBTVEFSVFNfV0lUSClcbiAgICAgICwgaW5kZXggID0gdG9MZW5ndGgoTWF0aC5taW4oYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRoYXQubGVuZ3RoKSlcbiAgICAgICwgc2VhcmNoID0gU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuICRzdGFydHNXaXRoXG4gICAgICA/ICRzdGFydHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBpbmRleClcbiAgICAgIDogdGhhdC5zbGljZShpbmRleCwgaW5kZXggKyBzZWFyY2gubGVuZ3RoKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN0YXJ0cy13aXRoLmpzXG4gKiogbW9kdWxlIGlkID0gMTM5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4yIFN0cmluZy5wcm90b3R5cGUuYW5jaG9yKG5hbWUpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdhbmNob3InLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGFuY2hvcihuYW1lKXtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYScsICduYW1lJywgbmFtZSk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYW5jaG9yLmpzXG4gKiogbW9kdWxlIGlkID0gMTQwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgZmFpbHMgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJylcbiAgLCBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpXG4gICwgcXVvdCAgICA9IC9cIi9nO1xuLy8gQi4yLjMuMi4xIENyZWF0ZUhUTUwoc3RyaW5nLCB0YWcsIGF0dHJpYnV0ZSwgdmFsdWUpXG52YXIgY3JlYXRlSFRNTCA9IGZ1bmN0aW9uKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gIHZhciBTICA9IFN0cmluZyhkZWZpbmVkKHN0cmluZykpXG4gICAgLCBwMSA9ICc8JyArIHRhZztcbiAgaWYoYXR0cmlidXRlICE9PSAnJylwMSArPSAnICcgKyBhdHRyaWJ1dGUgKyAnPVwiJyArIFN0cmluZyh2YWx1ZSkucmVwbGFjZShxdW90LCAnJnF1b3Q7JykgKyAnXCInO1xuICByZXR1cm4gcDEgKyAnPicgKyBTICsgJzwvJyArIHRhZyArICc+Jztcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE5BTUUsIGV4ZWMpe1xuICB2YXIgTyA9IHt9O1xuICBPW05BTUVdID0gZXhlYyhjcmVhdGVIVE1MKTtcbiAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbigpe1xuICAgIHZhciB0ZXN0ID0gJydbTkFNRV0oJ1wiJyk7XG4gICAgcmV0dXJuIHRlc3QgIT09IHRlc3QudG9Mb3dlckNhc2UoKSB8fCB0ZXN0LnNwbGl0KCdcIicpLmxlbmd0aCA+IDM7XG4gIH0pLCAnU3RyaW5nJywgTyk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctaHRtbC5qc1xuICoqIG1vZHVsZSBpZCA9IDE0MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMyBTdHJpbmcucHJvdG90eXBlLmJpZygpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdiaWcnLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJpZygpe1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdiaWcnLCAnJywgJycpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJpZy5qc1xuICoqIG1vZHVsZSBpZCA9IDE0MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNCBTdHJpbmcucHJvdG90eXBlLmJsaW5rKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2JsaW5rJywgZnVuY3Rpb24oY3JlYXRlSFRNTCl7XG4gIHJldHVybiBmdW5jdGlvbiBibGluaygpe1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdibGluaycsICcnLCAnJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYmxpbmsuanNcbiAqKiBtb2R1bGUgaWQgPSAxNDNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjUgU3RyaW5nLnByb3RvdHlwZS5ib2xkKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2JvbGQnLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJvbGQoKXtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYicsICcnLCAnJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYm9sZC5qc1xuICoqIG1vZHVsZSBpZCA9IDE0NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNiBTdHJpbmcucHJvdG90eXBlLmZpeGVkKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2ZpeGVkJywgZnVuY3Rpb24oY3JlYXRlSFRNTCl7XG4gIHJldHVybiBmdW5jdGlvbiBmaXhlZCgpe1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICd0dCcsICcnLCAnJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZml4ZWQuanNcbiAqKiBtb2R1bGUgaWQgPSAxNDVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjcgU3RyaW5nLnByb3RvdHlwZS5mb250Y29sb3IoY29sb3IpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdmb250Y29sb3InLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZvbnRjb2xvcihjb2xvcil7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2ZvbnQnLCAnY29sb3InLCBjb2xvcik7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZm9udGNvbG9yLmpzXG4gKiogbW9kdWxlIGlkID0gMTQ2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy44IFN0cmluZy5wcm90b3R5cGUuZm9udHNpemUoc2l6ZSlcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2ZvbnRzaXplJywgZnVuY3Rpb24oY3JlYXRlSFRNTCl7XG4gIHJldHVybiBmdW5jdGlvbiBmb250c2l6ZShzaXplKXtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnZm9udCcsICdzaXplJywgc2l6ZSk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZm9udHNpemUuanNcbiAqKiBtb2R1bGUgaWQgPSAxNDdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjkgU3RyaW5nLnByb3RvdHlwZS5pdGFsaWNzKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2l0YWxpY3MnLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGl0YWxpY3MoKXtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnaScsICcnLCAnJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRhbGljcy5qc1xuICoqIG1vZHVsZSBpZCA9IDE0OFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTAgU3RyaW5nLnByb3RvdHlwZS5saW5rKHVybClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2xpbmsnLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGxpbmsodXJsKXtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYScsICdocmVmJywgdXJsKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5saW5rLmpzXG4gKiogbW9kdWxlIGlkID0gMTQ5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMSBTdHJpbmcucHJvdG90eXBlLnNtYWxsKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3NtYWxsJywgZnVuY3Rpb24oY3JlYXRlSFRNTCl7XG4gIHJldHVybiBmdW5jdGlvbiBzbWFsbCgpe1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzbWFsbCcsICcnLCAnJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc21hbGwuanNcbiAqKiBtb2R1bGUgaWQgPSAxNTBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjEyIFN0cmluZy5wcm90b3R5cGUuc3RyaWtlKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N0cmlrZScsIGZ1bmN0aW9uKGNyZWF0ZUhUTUwpe1xuICByZXR1cm4gZnVuY3Rpb24gc3RyaWtlKCl7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N0cmlrZScsICcnLCAnJyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3RyaWtlLmpzXG4gKiogbW9kdWxlIGlkID0gMTUxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMyBTdHJpbmcucHJvdG90eXBlLnN1YigpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdzdWInLCBmdW5jdGlvbihjcmVhdGVIVE1MKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHN1Yigpe1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdWInLCAnJywgJycpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN1Yi5qc1xuICoqIG1vZHVsZSBpZCA9IDE1MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTQgU3RyaW5nLnByb3RvdHlwZS5zdXAoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnc3VwJywgZnVuY3Rpb24oY3JlYXRlSFRNTCl7XG4gIHJldHVybiBmdW5jdGlvbiBzdXAoKXtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc3VwJywgJycsICcnKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdXAuanNcbiAqKiBtb2R1bGUgaWQgPSAxNTNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIwLjMuMy4xIC8gMTUuOS40LjQgRGF0ZS5ub3coKVxyXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlMsICdEYXRlJywge25vdzogZnVuY3Rpb24oKXsgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOyB9fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUubm93LmpzXG4gKiogbW9kdWxlIGlkID0gMTU0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHRvT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcbiAgLCB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIG5ldyBEYXRlKE5hTikudG9KU09OKCkgIT09IG51bGwgfHwgRGF0ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoe3RvSVNPU3RyaW5nOiBmdW5jdGlvbigpeyByZXR1cm4gMTsgfX0pICE9PSAxO1xufSksICdEYXRlJywge1xuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTihrZXkpe1xuICAgIHZhciBPICA9IHRvT2JqZWN0KHRoaXMpXG4gICAgICAsIHB2ID0gdG9QcmltaXRpdmUoTyk7XG4gICAgcmV0dXJuIHR5cGVvZiBwdiA9PSAnbnVtYmVyJyAmJiAhaXNGaW5pdGUocHYpID8gbnVsbCA6IE8udG9JU09TdHJpbmcoKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUudG8tanNvbi5qc1xuICoqIG1vZHVsZSBpZCA9IDE1NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG4vLyAyMC4zLjQuMzYgLyAxNS45LjUuNDMgRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcoKVxyXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCBmYWlscyAgID0gcmVxdWlyZSgnLi9fZmFpbHMnKVxyXG4gICwgZ2V0VGltZSA9IERhdGUucHJvdG90eXBlLmdldFRpbWU7XHJcblxyXG52YXIgbHogPSBmdW5jdGlvbihudW0pe1xyXG4gIHJldHVybiBudW0gPiA5ID8gbnVtIDogJzAnICsgbnVtO1xyXG59O1xyXG5cclxuLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb25zXHJcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKGZhaWxzKGZ1bmN0aW9uKCl7XHJcbiAgcmV0dXJuIG5ldyBEYXRlKC01ZTEzIC0gMSkudG9JU09TdHJpbmcoKSAhPSAnMDM4NS0wNy0yNVQwNzowNjozOS45OTlaJztcclxufSkgfHwgIWZhaWxzKGZ1bmN0aW9uKCl7XHJcbiAgbmV3IERhdGUoTmFOKS50b0lTT1N0cmluZygpO1xyXG59KSksICdEYXRlJywge1xyXG4gIHRvSVNPU3RyaW5nOiBmdW5jdGlvbiB0b0lTT1N0cmluZygpe1xyXG4gICAgaWYoIWlzRmluaXRlKGdldFRpbWUuY2FsbCh0aGlzKSkpdGhyb3cgUmFuZ2VFcnJvcignSW52YWxpZCB0aW1lIHZhbHVlJyk7XHJcbiAgICB2YXIgZCA9IHRoaXNcclxuICAgICAgLCB5ID0gZC5nZXRVVENGdWxsWWVhcigpXHJcbiAgICAgICwgbSA9IGQuZ2V0VVRDTWlsbGlzZWNvbmRzKClcclxuICAgICAgLCBzID0geSA8IDAgPyAnLScgOiB5ID4gOTk5OSA/ICcrJyA6ICcnO1xyXG4gICAgcmV0dXJuIHMgKyAoJzAwMDAwJyArIE1hdGguYWJzKHkpKS5zbGljZShzID8gLTYgOiAtNCkgK1xyXG4gICAgICAnLScgKyBseihkLmdldFVUQ01vbnRoKCkgKyAxKSArICctJyArIGx6KGQuZ2V0VVRDRGF0ZSgpKSArXHJcbiAgICAgICdUJyArIGx6KGQuZ2V0VVRDSG91cnMoKSkgKyAnOicgKyBseihkLmdldFVUQ01pbnV0ZXMoKSkgK1xyXG4gICAgICAnOicgKyBseihkLmdldFVUQ1NlY29uZHMoKSkgKyAnLicgKyAobSA+IDk5ID8gbSA6ICcwJyArIGx6KG0pKSArICdaJztcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLWlzby1zdHJpbmcuanNcbiAqKiBtb2R1bGUgaWQgPSAxNTZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBEYXRlUHJvdG8gICAgPSBEYXRlLnByb3RvdHlwZVxuICAsIElOVkFMSURfREFURSA9ICdJbnZhbGlkIERhdGUnXG4gICwgVE9fU1RSSU5HICAgID0gJ3RvU3RyaW5nJ1xuICAsICR0b1N0cmluZyAgICA9IERhdGVQcm90b1tUT19TVFJJTkddXG4gICwgZ2V0VGltZSAgICAgID0gRGF0ZVByb3RvLmdldFRpbWU7XG5pZihuZXcgRGF0ZShOYU4pICsgJycgIT0gSU5WQUxJRF9EQVRFKXtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShEYXRlUHJvdG8sIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgICB2YXIgdmFsdWUgPSBnZXRUaW1lLmNhbGwodGhpcyk7XG4gICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/ICR0b1N0cmluZy5jYWxsKHRoaXMpIDogSU5WQUxJRF9EQVRFO1xuICB9KTtcbn1cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1zdHJpbmcuanNcbiAqKiBtb2R1bGUgaWQgPSAxNTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBUT19QUklNSVRJVkUgPSByZXF1aXJlKCcuL193a3MnKSgndG9QcmltaXRpdmUnKVxyXG4gICwgcHJvdG8gICAgICAgID0gRGF0ZS5wcm90b3R5cGU7XHJcblxyXG5pZighKFRPX1BSSU1JVElWRSBpbiBwcm90bykpcmVxdWlyZSgnLi9faGlkZScpKHByb3RvLCBUT19QUklNSVRJVkUsIHJlcXVpcmUoJy4vX2RhdGUtdG8tcHJpbWl0aXZlJykpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLXByaW1pdGl2ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDE1OFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxyXG4gICwgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxyXG4gICwgTlVNQkVSICAgICAgPSAnbnVtYmVyJztcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaGludCl7XHJcbiAgaWYoaGludCAhPT0gJ3N0cmluZycgJiYgaGludCAhPT0gTlVNQkVSICYmIGhpbnQgIT09ICdkZWZhdWx0Jyl0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBoaW50Jyk7XHJcbiAgcmV0dXJuIHRvUHJpbWl0aXZlKGFuT2JqZWN0KHRoaXMpLCBoaW50ICE9IE5VTUJFUik7XHJcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2RhdGUtdG8tcHJpbWl0aXZlLmpzXG4gKiogbW9kdWxlIGlkID0gMTU5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMi4xLjIuMiAvIDE1LjQuMy4yIEFycmF5LmlzQXJyYXkoYXJnKVxyXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlMsICdBcnJheScsIHtpc0FycmF5OiByZXF1aXJlKCcuL19pcy1hcnJheScpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmlzLWFycmF5LmpzXG4gKiogbW9kdWxlIGlkID0gMTYwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgY3R4ICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCB0b09iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgY2FsbCAgICAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKVxuICAsIGlzQXJyYXlJdGVyICAgID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpXG4gICwgdG9MZW5ndGggICAgICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5JylcbiAgLCBnZXRJdGVyRm4gICAgICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24oaXRlcil7IEFycmF5LmZyb20oaXRlcik7IH0pLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMi4xIEFycmF5LmZyb20oYXJyYXlMaWtlLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgZnJvbTogZnVuY3Rpb24gZnJvbShhcnJheUxpa2UvKiwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQqLyl7XG4gICAgdmFyIE8gICAgICAgPSB0b09iamVjdChhcnJheUxpa2UpXG4gICAgICAsIEMgICAgICAgPSB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5XG4gICAgICAsIGFMZW4gICAgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAsIG1hcGZuICAgPSBhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZFxuICAgICAgLCBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZFxuICAgICAgLCBpbmRleCAgID0gMFxuICAgICAgLCBpdGVyRm4gID0gZ2V0SXRlckZuKE8pXG4gICAgICAsIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvcjtcbiAgICBpZihtYXBwaW5nKW1hcGZuID0gY3R4KG1hcGZuLCBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7XG4gICAgLy8gaWYgb2JqZWN0IGlzbid0IGl0ZXJhYmxlIG9yIGl0J3MgYXJyYXkgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIHNpbXBsZSBjYXNlXG4gICAgaWYoaXRlckZuICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXIoaXRlckZuKSkpe1xuICAgICAgZm9yKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoTyksIHJlc3VsdCA9IG5ldyBDOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4Kyspe1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gY2FsbChpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICAgIGZvcihyZXN1bHQgPSBuZXcgQyhsZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKyl7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZnJvbS5qc1xuICoqIG1vZHVsZSBpZCA9IDE2MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIGVudHJpZXMpe1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2goZSl7XG4gICAgdmFyIHJldCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZihyZXQgIT09IHVuZGVmaW5lZClhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2l0ZXItY2FsbC5qc1xuICoqIG1vZHVsZSBpZCA9IDE2MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsIElURVJBVE9SICAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qc1xuICoqIG1vZHVsZSBpZCA9IDE2M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcclxuICAsIGNyZWF0ZURlc2MgICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBpbmRleCwgdmFsdWUpe1xyXG4gIGlmKGluZGV4IGluIG9iamVjdCkkZGVmaW5lUHJvcGVydHkuZihvYmplY3QsIGluZGV4LCBjcmVhdGVEZXNjKDAsIHZhbHVlKSk7XHJcbiAgZWxzZSBvYmplY3RbaW5kZXhdID0gdmFsdWU7XHJcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NyZWF0ZS1wcm9wZXJ0eS5qc1xuICoqIG1vZHVsZSBpZCA9IDE2NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGNsYXNzb2YgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIElURVJBVE9SICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoaXQgIT0gdW5kZWZpbmVkKXJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzXG4gKiogbW9kdWxlIGlkID0gMTY1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgSVRFUkFUT1IgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbigpeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbigpeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjLCBza2lwQ2xvc2luZyl7XG4gIGlmKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKXJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyICA9IFs3XVxuICAgICAgLCBpdGVyID0gYXJyW0lURVJBVE9SXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uKCl7IHJldHVybiB7ZG9uZTogc2FmZSA9IHRydWV9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbigpeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLWRldGVjdC5qc1xuICoqIG1vZHVsZSBpZCA9IDE2NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2NyZWF0ZS1wcm9wZXJ0eScpO1xuXG4vLyBXZWJLaXQgQXJyYXkub2YgaXNuJ3QgZ2VuZXJpY1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIGZ1bmN0aW9uIEYoKXt9XG4gIHJldHVybiAhKEFycmF5Lm9mLmNhbGwoRikgaW5zdGFuY2VvZiBGKTtcbn0pLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMi4zIEFycmF5Lm9mKCAuLi5pdGVtcylcbiAgb2Y6IGZ1bmN0aW9uIG9mKC8qIC4uLmFyZ3MgKi8pe1xuICAgIHZhciBpbmRleCAgPSAwXG4gICAgICAsIGFMZW4gICA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICwgcmVzdWx0ID0gbmV3ICh0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5KShhTGVuKTtcbiAgICB3aGlsZShhTGVuID4gaW5kZXgpY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICByZXN1bHQubGVuZ3RoID0gYUxlbjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkub2YuanNcbiAqKiBtb2R1bGUgaWQgPSAxNjdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5qb2luKHNlcGFyYXRvcilcclxudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcclxuICAsIGFycmF5Sm9pbiA9IFtdLmpvaW47XHJcblxyXG4vLyBmYWxsYmFjayBmb3Igbm90IGFycmF5LWxpa2Ugc3RyaW5nc1xyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChyZXF1aXJlKCcuL19pb2JqZWN0JykgIT0gT2JqZWN0IHx8ICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoYXJyYXlKb2luKSksICdBcnJheScsIHtcclxuICBqb2luOiBmdW5jdGlvbiBqb2luKHNlcGFyYXRvcil7XHJcbiAgICByZXR1cm4gYXJyYXlKb2luLmNhbGwodG9JT2JqZWN0KHRoaXMpLCBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCA/ICcsJyA6IHNlcGFyYXRvcik7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuam9pbi5qc1xuICoqIG1vZHVsZSBpZCA9IDE2OFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obWV0aG9kLCBhcmcpe1xyXG4gIHJldHVybiAhIW1ldGhvZCAmJiBmYWlscyhmdW5jdGlvbigpe1xyXG4gICAgYXJnID8gbWV0aG9kLmNhbGwobnVsbCwgZnVuY3Rpb24oKXt9LCAxKSA6IG1ldGhvZC5jYWxsKG51bGwpO1xyXG4gIH0pO1xyXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpY3QtbWV0aG9kLmpzXG4gKiogbW9kdWxlIGlkID0gMTY5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnZhciAkZXhwb3J0ICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsIGh0bWwgICAgICAgPSByZXF1aXJlKCcuL19odG1sJylcclxuICAsIGNvZiAgICAgICAgPSByZXF1aXJlKCcuL19jb2YnKVxyXG4gICwgdG9JbmRleCAgICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4JylcclxuICAsIHRvTGVuZ3RoICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxyXG4gICwgYXJyYXlTbGljZSA9IFtdLnNsaWNlO1xyXG5cclxuLy8gZmFsbGJhY2sgZm9yIG5vdCBhcnJheS1saWtlIEVTMyBzdHJpbmdzIGFuZCBET00gb2JqZWN0c1xyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcclxuICBpZihodG1sKWFycmF5U2xpY2UuY2FsbChodG1sKTtcclxufSksICdBcnJheScsIHtcclxuICBzbGljZTogZnVuY3Rpb24gc2xpY2UoYmVnaW4sIGVuZCl7XHJcbiAgICB2YXIgbGVuICAgPSB0b0xlbmd0aCh0aGlzLmxlbmd0aClcclxuICAgICAgLCBrbGFzcyA9IGNvZih0aGlzKTtcclxuICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogZW5kO1xyXG4gICAgaWYoa2xhc3MgPT0gJ0FycmF5JylyZXR1cm4gYXJyYXlTbGljZS5jYWxsKHRoaXMsIGJlZ2luLCBlbmQpO1xyXG4gICAgdmFyIHN0YXJ0ICA9IHRvSW5kZXgoYmVnaW4sIGxlbilcclxuICAgICAgLCB1cFRvICAgPSB0b0luZGV4KGVuZCwgbGVuKVxyXG4gICAgICAsIHNpemUgICA9IHRvTGVuZ3RoKHVwVG8gLSBzdGFydClcclxuICAgICAgLCBjbG9uZWQgPSBBcnJheShzaXplKVxyXG4gICAgICAsIGkgICAgICA9IDA7XHJcbiAgICBmb3IoOyBpIDwgc2l6ZTsgaSsrKWNsb25lZFtpXSA9IGtsYXNzID09ICdTdHJpbmcnXHJcbiAgICAgID8gdGhpcy5jaGFyQXQoc3RhcnQgKyBpKVxyXG4gICAgICA6IHRoaXNbc3RhcnQgKyBpXTtcclxuICAgIHJldHVybiBjbG9uZWQ7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc2xpY2UuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcclxuICAsIHRvT2JqZWN0ICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXHJcbiAgLCBmYWlscyAgICAgPSByZXF1aXJlKCcuL19mYWlscycpXHJcbiAgLCAkc29ydCAgICAgPSBbXS5zb3J0XHJcbiAgLCB0ZXN0ICAgICAgPSBbMSwgMiwgM107XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChmYWlscyhmdW5jdGlvbigpe1xyXG4gIC8vIElFOC1cclxuICB0ZXN0LnNvcnQodW5kZWZpbmVkKTtcclxufSkgfHwgIWZhaWxzKGZ1bmN0aW9uKCl7XHJcbiAgLy8gVjggYnVnXHJcbiAgdGVzdC5zb3J0KG51bGwpO1xyXG4gIC8vIE9sZCBXZWJLaXRcclxufSkgfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKSgkc29ydCkpLCAnQXJyYXknLCB7XHJcbiAgLy8gMjIuMS4zLjI1IEFycmF5LnByb3RvdHlwZS5zb3J0KGNvbXBhcmVmbilcclxuICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVmbil7XHJcbiAgICByZXR1cm4gY29tcGFyZWZuID09PSB1bmRlZmluZWRcclxuICAgICAgPyAkc29ydC5jYWxsKHRvT2JqZWN0KHRoaXMpKVxyXG4gICAgICA6ICRzb3J0LmNhbGwodG9PYmplY3QodGhpcyksIGFGdW5jdGlvbihjb21wYXJlZm4pKTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zb3J0LmpzXG4gKiogbW9kdWxlIGlkID0gMTcxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCAkZm9yRWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgwKVxyXG4gICwgU1RSSUNUICAgPSByZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10uZm9yRWFjaCwgdHJ1ZSk7XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFTVFJJQ1QsICdBcnJheScsIHtcclxuICAvLyAyMi4xLjMuMTAgLyAxNS40LjQuMTggQXJyYXkucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcclxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKXtcclxuICAgIHJldHVybiAkZm9yRWFjaCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZvci1lYWNoLmpzXG4gKiogbW9kdWxlIGlkID0gMTcyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAwIC0+IEFycmF5I2ZvckVhY2hcbi8vIDEgLT4gQXJyYXkjbWFwXG4vLyAyIC0+IEFycmF5I2ZpbHRlclxuLy8gMyAtPiBBcnJheSNzb21lXG4vLyA0IC0+IEFycmF5I2V2ZXJ5XG4vLyA1IC0+IEFycmF5I2ZpbmRcbi8vIDYgLT4gQXJyYXkjZmluZEluZGV4XG52YXIgY3R4ICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIElPYmplY3QgID0gcmVxdWlyZSgnLi9faW9iamVjdCcpXG4gICwgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCBhc2MgICAgICA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKFRZUEUsICRjcmVhdGUpe1xuICB2YXIgSVNfTUFQICAgICAgICA9IFRZUEUgPT0gMVxuICAgICwgSVNfRklMVEVSICAgICA9IFRZUEUgPT0gMlxuICAgICwgSVNfU09NRSAgICAgICA9IFRZUEUgPT0gM1xuICAgICwgSVNfRVZFUlkgICAgICA9IFRZUEUgPT0gNFxuICAgICwgSVNfRklORF9JTkRFWCA9IFRZUEUgPT0gNlxuICAgICwgTk9fSE9MRVMgICAgICA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYXG4gICAgLCBjcmVhdGUgICAgICAgID0gJGNyZWF0ZSB8fCBhc2M7XG4gIHJldHVybiBmdW5jdGlvbigkdGhpcywgY2FsbGJhY2tmbiwgdGhhdCl7XG4gICAgdmFyIE8gICAgICA9IHRvT2JqZWN0KCR0aGlzKVxuICAgICAgLCBzZWxmICAgPSBJT2JqZWN0KE8pXG4gICAgICAsIGYgICAgICA9IGN0eChjYWxsYmFja2ZuLCB0aGF0LCAzKVxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChzZWxmLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gMFxuICAgICAgLCByZXN1bHQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkXG4gICAgICAsIHZhbCwgcmVzO1xuICAgIGZvcig7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspaWYoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZil7XG4gICAgICB2YWwgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlcyA9IGYodmFsLCBpbmRleCwgTyk7XG4gICAgICBpZihUWVBFKXtcbiAgICAgICAgaWYoSVNfTUFQKXJlc3VsdFtpbmRleF0gPSByZXM7ICAgICAgICAgICAgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYocmVzKXN3aXRjaChUWVBFKXtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbDsgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgICAgICAgIC8vIGZpbmRJbmRleFxuICAgICAgICAgIGNhc2UgMjogcmVzdWx0LnB1c2godmFsKTsgICAgICAgICAgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmKElTX0VWRVJZKXJldHVybiBmYWxzZTsgICAgICAgICAgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHJlc3VsdDtcbiAgfTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LW1ldGhvZHMuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDkuNC4yLjMgQXJyYXlTcGVjaWVzQ3JlYXRlKG9yaWdpbmFsQXJyYXksIGxlbmd0aClcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19hcnJheS1zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob3JpZ2luYWwsIGxlbmd0aCl7XG4gIHJldHVybiBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihvcmlnaW5hbCkpKGxlbmd0aCk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1zcGVjaWVzLWNyZWF0ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDE3NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcclxuICAsIGlzQXJyYXkgID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKVxyXG4gICwgU1BFQ0lFUyAgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcmlnaW5hbCl7XHJcbiAgdmFyIEM7XHJcbiAgaWYoaXNBcnJheShvcmlnaW5hbCkpe1xyXG4gICAgQyA9IG9yaWdpbmFsLmNvbnN0cnVjdG9yO1xyXG4gICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcclxuICAgIGlmKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSlDID0gdW5kZWZpbmVkO1xyXG4gICAgaWYoaXNPYmplY3QoQykpe1xyXG4gICAgICBDID0gQ1tTUEVDSUVTXTtcclxuICAgICAgaWYoQyA9PT0gbnVsbClDID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH0gcmV0dXJuIEMgPT09IHVuZGVmaW5lZCA/IEFycmF5IDogQztcclxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qc1xuICoqIG1vZHVsZSBpZCA9IDE3NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCAkbWFwICAgID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDEpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLm1hcCwgdHJ1ZSksICdBcnJheScsIHtcclxuICAvLyAyMi4xLjMuMTUgLyAxNS40LjQuMTkgQXJyYXkucHJvdG90eXBlLm1hcChjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxyXG4gIG1hcDogZnVuY3Rpb24gbWFwKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKXtcclxuICAgIHJldHVybiAkbWFwKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkubWFwLmpzXG4gKiogbW9kdWxlIGlkID0gMTc2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJGZpbHRlciA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgyKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLmZpbHRlciwgdHJ1ZSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjcgLyAxNS40LjQuMjAgQXJyYXkucHJvdG90eXBlLmZpbHRlcihjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLyl7XG4gICAgcmV0dXJuICRmaWx0ZXIodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbHRlci5qc1xuICoqIG1vZHVsZSBpZCA9IDE3N1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCAkc29tZSAgID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDMpO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLnNvbWUsIHRydWUpLCAnQXJyYXknLCB7XHJcbiAgLy8gMjIuMS4zLjIzIC8gMTUuNC40LjE3IEFycmF5LnByb3RvdHlwZS5zb21lKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXHJcbiAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLyl7XHJcbiAgICByZXR1cm4gJHNvbWUodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zb21lLmpzXG4gKiogbW9kdWxlIGlkID0gMTc4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsICRldmVyeSAgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoNCk7XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10uZXZlcnksIHRydWUpLCAnQXJyYXknLCB7XHJcbiAgLy8gMjIuMS4zLjUgLyAxNS40LjQuMTYgQXJyYXkucHJvdG90eXBlLmV2ZXJ5KGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXHJcbiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKXtcclxuICAgIHJldHVybiAkZXZlcnkodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5ldmVyeS5qc1xuICoqIG1vZHVsZSBpZCA9IDE3OVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCAkcmVkdWNlID0gcmVxdWlyZSgnLi9fYXJyYXktcmVkdWNlJyk7XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10ucmVkdWNlLCB0cnVlKSwgJ0FycmF5Jywge1xyXG4gIC8vIDIyLjEuMy4xOCAvIDE1LjQuNC4yMSBBcnJheS5wcm90b3R5cGUucmVkdWNlKGNhbGxiYWNrZm4gWywgaW5pdGlhbFZhbHVlXSlcclxuICByZWR1Y2U6IGZ1bmN0aW9uIHJlZHVjZShjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKXtcclxuICAgIHJldHVybiAkcmVkdWNlKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50c1sxXSwgZmFsc2UpO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS5qc1xuICoqIG1vZHVsZSBpZCA9IDE4MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxyXG4gICwgdG9PYmplY3QgID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcclxuICAsIElPYmplY3QgICA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKVxyXG4gICwgdG9MZW5ndGggID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHRoYXQsIGNhbGxiYWNrZm4sIGFMZW4sIG1lbW8sIGlzUmlnaHQpe1xyXG4gIGFGdW5jdGlvbihjYWxsYmFja2ZuKTtcclxuICB2YXIgTyAgICAgID0gdG9PYmplY3QodGhhdClcclxuICAgICwgc2VsZiAgID0gSU9iamVjdChPKVxyXG4gICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcclxuICAgICwgaW5kZXggID0gaXNSaWdodCA/IGxlbmd0aCAtIDEgOiAwXHJcbiAgICAsIGkgICAgICA9IGlzUmlnaHQgPyAtMSA6IDE7XHJcbiAgaWYoYUxlbiA8IDIpZm9yKDs7KXtcclxuICAgIGlmKGluZGV4IGluIHNlbGYpe1xyXG4gICAgICBtZW1vID0gc2VsZltpbmRleF07XHJcbiAgICAgIGluZGV4ICs9IGk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgaW5kZXggKz0gaTtcclxuICAgIGlmKGlzUmlnaHQgPyBpbmRleCA8IDAgOiBsZW5ndGggPD0gaW5kZXgpe1xyXG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcclxuICAgIH1cclxuICB9XHJcbiAgZm9yKDtpc1JpZ2h0ID8gaW5kZXggPj0gMCA6IGxlbmd0aCA+IGluZGV4OyBpbmRleCArPSBpKWlmKGluZGV4IGluIHNlbGYpe1xyXG4gICAgbWVtbyA9IGNhbGxiYWNrZm4obWVtbywgc2VsZltpbmRleF0sIGluZGV4LCBPKTtcclxuICB9XHJcbiAgcmV0dXJuIG1lbW87XHJcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2FycmF5LXJlZHVjZS5qc1xuICoqIG1vZHVsZSBpZCA9IDE4MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCAkcmVkdWNlID0gcmVxdWlyZSgnLi9fYXJyYXktcmVkdWNlJyk7XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10ucmVkdWNlUmlnaHQsIHRydWUpLCAnQXJyYXknLCB7XHJcbiAgLy8gMjIuMS4zLjE5IC8gMTUuNC40LjIyIEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodChjYWxsYmFja2ZuIFssIGluaXRpYWxWYWx1ZV0pXHJcbiAgcmVkdWNlUmlnaHQ6IGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pe1xyXG4gICAgcmV0dXJuICRyZWR1Y2UodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCwgYXJndW1lbnRzWzFdLCB0cnVlKTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UtcmlnaHQuanNcbiAqKiBtb2R1bGUgaWQgPSAxODJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgJGluZGV4T2YgICAgICA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpXHJcbiAgLCAkbmF0aXZlICAgICAgID0gW10uaW5kZXhPZlxyXG4gICwgTkVHQVRJVkVfWkVSTyA9ICEhJG5hdGl2ZSAmJiAxIC8gWzFdLmluZGV4T2YoMSwgLTApIDwgMDtcclxuXHJcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKE5FR0FUSVZFX1pFUk8gfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKSgkbmF0aXZlKSksICdBcnJheScsIHtcclxuICAvLyAyMi4xLjMuMTEgLyAxNS40LjQuMTQgQXJyYXkucHJvdG90eXBlLmluZGV4T2Yoc2VhcmNoRWxlbWVudCBbLCBmcm9tSW5kZXhdKVxyXG4gIGluZGV4T2Y6IGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiwgZnJvbUluZGV4ID0gMCAqLyl7XHJcbiAgICByZXR1cm4gTkVHQVRJVkVfWkVST1xyXG4gICAgICAvLyBjb252ZXJ0IC0wIHRvICswXHJcbiAgICAgID8gJG5hdGl2ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IDBcclxuICAgICAgOiAkaW5kZXhPZih0aGlzLCBzZWFyY2hFbGVtZW50LCBhcmd1bWVudHNbMV0pO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmluZGV4LW9mLmpzXG4gKiogbW9kdWxlIGlkID0gMTgzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnZhciAkZXhwb3J0ICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsIHRvSU9iamVjdCAgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcclxuICAsIHRvSW50ZWdlciAgICAgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcclxuICAsIHRvTGVuZ3RoICAgICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxyXG4gICwgJG5hdGl2ZSAgICAgICA9IFtdLmxhc3RJbmRleE9mXHJcbiAgLCBORUdBVElWRV9aRVJPID0gISEkbmF0aXZlICYmIDEgLyBbMV0ubGFzdEluZGV4T2YoMSwgLTApIDwgMDtcclxuXHJcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKE5FR0FUSVZFX1pFUk8gfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKSgkbmF0aXZlKSksICdBcnJheScsIHtcclxuICAvLyAyMi4xLjMuMTQgLyAxNS40LjQuMTUgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgWywgZnJvbUluZGV4XSlcclxuICBsYXN0SW5kZXhPZjogZnVuY3Rpb24gbGFzdEluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiwgZnJvbUluZGV4ID0gQFsqLTFdICovKXtcclxuICAgIC8vIGNvbnZlcnQgLTAgdG8gKzBcclxuICAgIGlmKE5FR0FUSVZFX1pFUk8pcmV0dXJuICRuYXRpdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCAwO1xyXG4gICAgdmFyIE8gICAgICA9IHRvSU9iamVjdCh0aGlzKVxyXG4gICAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKVxyXG4gICAgICAsIGluZGV4ICA9IGxlbmd0aCAtIDE7XHJcbiAgICBpZihhcmd1bWVudHMubGVuZ3RoID4gMSlpbmRleCA9IE1hdGgubWluKGluZGV4LCB0b0ludGVnZXIoYXJndW1lbnRzWzFdKSk7XHJcbiAgICBpZihpbmRleCA8IDApaW5kZXggPSBsZW5ndGggKyBpbmRleDtcclxuICAgIGZvcig7aW5kZXggPj0gMDsgaW5kZXgtLSlpZihpbmRleCBpbiBPKWlmKE9baW5kZXhdID09PSBzZWFyY2hFbGVtZW50KXJldHVybiBpbmRleCB8fCAwO1xyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lmxhc3QtaW5kZXgtb2YuanNcbiAqKiBtb2R1bGUgaWQgPSAxODRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIyLjEuMy4zIEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluKHRhcmdldCwgc3RhcnQsIGVuZCA9IHRoaXMubGVuZ3RoKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHtjb3B5V2l0aGluOiByZXF1aXJlKCcuL19hcnJheS1jb3B5LXdpdGhpbicpfSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdjb3B5V2l0aGluJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluLmpzXG4gKiogbW9kdWxlIGlkID0gMTg1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbid1c2Ugc3RyaWN0JztcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgdG9JbmRleCAgPSByZXF1aXJlKCcuL190by1pbmRleCcpXG4gICwgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBbXS5jb3B5V2l0aGluIHx8IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0Lyo9IDAqLywgc3RhcnQvKj0gMCwgZW5kID0gQGxlbmd0aCovKXtcbiAgdmFyIE8gICAgID0gdG9PYmplY3QodGhpcylcbiAgICAsIGxlbiAgID0gdG9MZW5ndGgoTy5sZW5ndGgpXG4gICAgLCB0byAgICA9IHRvSW5kZXgodGFyZ2V0LCBsZW4pXG4gICAgLCBmcm9tICA9IHRvSW5kZXgoc3RhcnQsIGxlbilcbiAgICAsIGVuZCAgID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWRcbiAgICAsIGNvdW50ID0gTWF0aC5taW4oKGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogdG9JbmRleChlbmQsIGxlbikpIC0gZnJvbSwgbGVuIC0gdG8pXG4gICAgLCBpbmMgICA9IDE7XG4gIGlmKGZyb20gPCB0byAmJiB0byA8IGZyb20gKyBjb3VudCl7XG4gICAgaW5jICA9IC0xO1xuICAgIGZyb20gKz0gY291bnQgLSAxO1xuICAgIHRvICAgKz0gY291bnQgLSAxO1xuICB9XG4gIHdoaWxlKGNvdW50LS0gPiAwKXtcbiAgICBpZihmcm9tIGluIE8pT1t0b10gPSBPW2Zyb21dO1xuICAgIGVsc2UgZGVsZXRlIE9bdG9dO1xuICAgIHRvICAgKz0gaW5jO1xuICAgIGZyb20gKz0gaW5jO1xuICB9IHJldHVybiBPO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYXJyYXktY29weS13aXRoaW4uanNcbiAqKiBtb2R1bGUgaWQgPSAxODZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIyLjEuMy4zMSBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbnZhciBVTlNDT1BBQkxFUyA9IHJlcXVpcmUoJy4vX3drcycpKCd1bnNjb3BhYmxlcycpXG4gICwgQXJyYXlQcm90byAgPSBBcnJheS5wcm90b3R5cGU7XG5pZihBcnJheVByb3RvW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpcmVxdWlyZSgnLi9faGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzXG4gKiogbW9kdWxlIGlkID0gMTg3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMi4xLjMuNiBBcnJheS5wcm90b3R5cGUuZmlsbCh2YWx1ZSwgc3RhcnQgPSAwLCBlbmQgPSB0aGlzLmxlbmd0aClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7ZmlsbDogcmVxdWlyZSgnLi9fYXJyYXktZmlsbCcpfSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdmaWxsJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbGwuanNcbiAqKiBtb2R1bGUgaWQgPSAxODhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDIyLjEuMy42IEFycmF5LnByb3RvdHlwZS5maWxsKHZhbHVlLCBzdGFydCA9IDAsIGVuZCA9IHRoaXMubGVuZ3RoKVxuJ3VzZSBzdHJpY3QnO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcbiAgLCB0b0luZGV4ICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4JylcbiAgLCB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmaWxsKHZhbHVlIC8qLCBzdGFydCA9IDAsIGVuZCA9IEBsZW5ndGggKi8pe1xuICB2YXIgTyAgICAgID0gdG9PYmplY3QodGhpcylcbiAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKVxuICAgICwgYUxlbiAgID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgaW5kZXggID0gdG9JbmRleChhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgbGVuZ3RoKVxuICAgICwgZW5kICAgID0gYUxlbiA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWRcbiAgICAsIGVuZFBvcyA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9JbmRleChlbmQsIGxlbmd0aCk7XG4gIHdoaWxlKGVuZFBvcyA+IGluZGV4KU9baW5kZXgrK10gPSB2YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1maWxsLmpzXG4gKiogbW9kdWxlIGlkID0gMTg5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOCBBcnJheS5wcm90b3R5cGUuZmluZChwcmVkaWNhdGUsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJGZpbmQgICA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSg1KVxuICAsIEtFWSAgICAgPSAnZmluZCdcbiAgLCBmb3JjZWQgID0gdHJ1ZTtcbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG5pZihLRVkgaW4gW10pQXJyYXkoMSlbS0VZXShmdW5jdGlvbigpeyBmb3JjZWQgPSBmYWxzZTsgfSk7XG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZvcmNlZCwgJ0FycmF5Jywge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4vKiwgdGhhdCA9IHVuZGVmaW5lZCAqLyl7XG4gICAgcmV0dXJuICRmaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKShLRVkpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maW5kLmpzXG4gKiogbW9kdWxlIGlkID0gMTkwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOSBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4KHByZWRpY2F0ZSwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkZmluZCAgID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDYpXG4gICwgS0VZICAgICA9ICdmaW5kSW5kZXgnXG4gICwgZm9yY2VkICA9IHRydWU7XG4vLyBTaG91bGRuJ3Qgc2tpcCBob2xlc1xuaWYoS0VZIGluIFtdKUFycmF5KDEpW0tFWV0oZnVuY3Rpb24oKXsgZm9yY2VkID0gZmFsc2U7IH0pO1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmb3JjZWQsICdBcnJheScsIHtcbiAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgoY2FsbGJhY2tmbi8qLCB0aGF0ID0gdW5kZWZpbmVkICovKXtcbiAgICByZXR1cm4gJGZpbmQodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKEtFWSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbmQtaW5kZXguanNcbiAqKiBtb2R1bGUgaWQgPSAxOTFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoJ0FycmF5Jyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNwZWNpZXMuanNcbiAqKiBtb2R1bGUgaWQgPSAxOTJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgZFAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKVxuICAsIFNQRUNJRVMgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVkpe1xuICB2YXIgQyA9IGdsb2JhbFtLRVldO1xuICBpZihERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKWRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fc2V0LXNwZWNpZXMuanNcbiAqKiBtb2R1bGUgaWQgPSAxOTNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJylcbiAgLCBzdGVwICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJylcbiAgLCBJdGVyYXRvcnMgICAgICAgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCB0b0lPYmplY3QgICAgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKXtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbigpe1xuICB2YXIgTyAgICAgPSB0aGlzLl90XG4gICAgLCBraW5kICA9IHRoaXMuX2tcbiAgICAsIGluZGV4ID0gdGhpcy5faSsrO1xuICBpZighTyB8fCBpbmRleCA+PSBPLmxlbmd0aCl7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZihraW5kID09ICdrZXlzJyAgKXJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYoa2luZCA9PSAndmFsdWVzJylyZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzXG4gKiogbW9kdWxlIGlkID0gMTk0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbmUsIHZhbHVlKXtcbiAgcmV0dXJuIHt2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZX07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19pdGVyLXN0ZXAuanNcbiAqKiBtb2R1bGUgaWQgPSAxOTVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBnbG9iYWwgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuL19pbmhlcml0LWlmLXJlcXVpcmVkJylcbiAgLCBkUCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZcbiAgLCBnT1BOICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZlxuICAsIGlzUmVnRXhwICAgICAgICAgID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJylcbiAgLCAkZmxhZ3MgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2ZsYWdzJylcbiAgLCAkUmVnRXhwICAgICAgICAgICA9IGdsb2JhbC5SZWdFeHBcbiAgLCBCYXNlICAgICAgICAgICAgICA9ICRSZWdFeHBcbiAgLCBwcm90byAgICAgICAgICAgICA9ICRSZWdFeHAucHJvdG90eXBlXG4gICwgcmUxICAgICAgICAgICAgICAgPSAvYS9nXG4gICwgcmUyICAgICAgICAgICAgICAgPSAvYS9nXG4gIC8vIFwibmV3XCIgY3JlYXRlcyBhIG5ldyBvYmplY3QsIG9sZCB3ZWJraXQgYnVnZ3kgaGVyZVxuICAsIENPUlJFQ1RfTkVXICAgICAgID0gbmV3ICRSZWdFeHAocmUxKSAhPT0gcmUxO1xuXG5pZihyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICghQ09SUkVDVF9ORVcgfHwgcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZTJbcmVxdWlyZSgnLi9fd2tzJykoJ21hdGNoJyldID0gZmFsc2U7XG4gIC8vIFJlZ0V4cCBjb25zdHJ1Y3RvciBjYW4gYWx0ZXIgZmxhZ3MgYW5kIElzUmVnRXhwIHdvcmtzIGNvcnJlY3Qgd2l0aCBAQG1hdGNoXG4gIHJldHVybiAkUmVnRXhwKHJlMSkgIT0gcmUxIHx8ICRSZWdFeHAocmUyKSA9PSByZTIgfHwgJFJlZ0V4cChyZTEsICdpJykgIT0gJy9hL2knO1xufSkpKXtcbiAgJFJlZ0V4cCA9IGZ1bmN0aW9uIFJlZ0V4cChwLCBmKXtcbiAgICB2YXIgdGlSRSA9IHRoaXMgaW5zdGFuY2VvZiAkUmVnRXhwXG4gICAgICAsIHBpUkUgPSBpc1JlZ0V4cChwKVxuICAgICAgLCBmaVUgID0gZiA9PT0gdW5kZWZpbmVkO1xuICAgIHJldHVybiAhdGlSRSAmJiBwaVJFICYmIHAuY29uc3RydWN0b3IgPT09ICRSZWdFeHAgJiYgZmlVID8gcFxuICAgICAgOiBpbmhlcml0SWZSZXF1aXJlZChDT1JSRUNUX05FV1xuICAgICAgICA/IG5ldyBCYXNlKHBpUkUgJiYgIWZpVSA/IHAuc291cmNlIDogcCwgZilcbiAgICAgICAgOiBCYXNlKChwaVJFID0gcCBpbnN0YW5jZW9mICRSZWdFeHApID8gcC5zb3VyY2UgOiBwLCBwaVJFICYmIGZpVSA/ICRmbGFncy5jYWxsKHApIDogZilcbiAgICAgICwgdGlSRSA/IHRoaXMgOiBwcm90bywgJFJlZ0V4cCk7XG4gIH07XG4gIHZhciBwcm94eSA9IGZ1bmN0aW9uKGtleSl7XG4gICAga2V5IGluICRSZWdFeHAgfHwgZFAoJFJlZ0V4cCwga2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBCYXNlW2tleV07IH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKGl0KXsgQmFzZVtrZXldID0gaXQ7IH1cbiAgICB9KTtcbiAgfTtcbiAgZm9yKHZhciBrZXlzID0gZ09QTihCYXNlKSwgaSA9IDA7IGtleXMubGVuZ3RoID4gaTsgKXByb3h5KGtleXNbaSsrXSk7XG4gIHByb3RvLmNvbnN0cnVjdG9yID0gJFJlZ0V4cDtcbiAgJFJlZ0V4cC5wcm90b3R5cGUgPSBwcm90bztcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShnbG9iYWwsICdSZWdFeHAnLCAkUmVnRXhwKTtcbn1cblxucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKSgnUmVnRXhwJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5jb25zdHJ1Y3Rvci5qc1xuICoqIG1vZHVsZSBpZCA9IDE5NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjEuMi41LjMgZ2V0IFJlZ0V4cC5wcm90b3R5cGUuZmxhZ3NcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpe1xuICB2YXIgdGhhdCAgID0gYW5PYmplY3QodGhpcylcbiAgICAsIHJlc3VsdCA9ICcnO1xuICBpZih0aGF0Lmdsb2JhbCkgICAgIHJlc3VsdCArPSAnZyc7XG4gIGlmKHRoYXQuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcbiAgaWYodGhhdC5tdWx0aWxpbmUpICByZXN1bHQgKz0gJ20nO1xuICBpZih0aGF0LnVuaWNvZGUpICAgIHJlc3VsdCArPSAndSc7XG4gIGlmKHRoYXQuc3RpY2t5KSAgICAgcmVzdWx0ICs9ICd5JztcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2ZsYWdzLmpzXG4gKiogbW9kdWxlIGlkID0gMTk3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnJlcXVpcmUoJy4vZXM2LnJlZ2V4cC5mbGFncycpO1xyXG52YXIgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxyXG4gICwgJGZsYWdzICAgICAgPSByZXF1aXJlKCcuL19mbGFncycpXHJcbiAgLCBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJylcclxuICAsIFRPX1NUUklORyAgID0gJ3RvU3RyaW5nJ1xyXG4gICwgJHRvU3RyaW5nICAgPSAvLi9bVE9fU1RSSU5HXTtcclxuXHJcbnZhciBkZWZpbmUgPSBmdW5jdGlvbihmbil7XHJcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShSZWdFeHAucHJvdG90eXBlLCBUT19TVFJJTkcsIGZuLCB0cnVlKTtcclxufTtcclxuXHJcbi8vIDIxLjIuNS4xNCBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nKClcclxuaWYocmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpeyByZXR1cm4gJHRvU3RyaW5nLmNhbGwoe3NvdXJjZTogJ2EnLCBmbGFnczogJ2InfSkgIT0gJy9hL2InOyB9KSl7XHJcbiAgZGVmaW5lKGZ1bmN0aW9uIHRvU3RyaW5nKCl7XHJcbiAgICB2YXIgUiA9IGFuT2JqZWN0KHRoaXMpO1xyXG4gICAgcmV0dXJuICcvJy5jb25jYXQoUi5zb3VyY2UsICcvJyxcclxuICAgICAgJ2ZsYWdzJyBpbiBSID8gUi5mbGFncyA6ICFERVNDUklQVE9SUyAmJiBSIGluc3RhbmNlb2YgUmVnRXhwID8gJGZsYWdzLmNhbGwoUikgOiB1bmRlZmluZWQpO1xyXG4gIH0pO1xyXG4vLyBGRjQ0LSBSZWdFeHAjdG9TdHJpbmcgaGFzIGEgd3JvbmcgbmFtZVxyXG59IGVsc2UgaWYoJHRvU3RyaW5nLm5hbWUgIT0gVE9fU1RSSU5HKXtcclxuICBkZWZpbmUoZnVuY3Rpb24gdG9TdHJpbmcoKXtcclxuICAgIHJldHVybiAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcclxuICB9KTtcclxufVxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAudG8tc3RyaW5nLmpzXG4gKiogbW9kdWxlIGlkID0gMTk4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyMS4yLjUuMyBnZXQgUmVnRXhwLnByb3RvdHlwZS5mbGFncygpXG5pZihyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmIC8uL2cuZmxhZ3MgIT0gJ2cnKXJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmYoUmVnRXhwLnByb3RvdHlwZSwgJ2ZsYWdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogcmVxdWlyZSgnLi9fZmxhZ3MnKVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5mbGFncy5qc1xuICoqIG1vZHVsZSBpZCA9IDE5OVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gQEBtYXRjaCBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdtYXRjaCcsIDEsIGZ1bmN0aW9uKGRlZmluZWQsIE1BVENILCAkbWF0Y2gpe1xuICAvLyAyMS4xLjMuMTEgU3RyaW5nLnByb3RvdHlwZS5tYXRjaChyZWdleHApXG4gIHJldHVybiBbZnVuY3Rpb24gbWF0Y2gocmVnZXhwKXtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gID0gZGVmaW5lZCh0aGlzKVxuICAgICAgLCBmbiA9IHJlZ2V4cCA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWdleHBbTUFUQ0hdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkID8gZm4uY2FsbChyZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW01BVENIXShTdHJpbmcoTykpO1xuICB9LCAkbWF0Y2hdO1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaC5qc1xuICoqIG1vZHVsZSBpZCA9IDIwMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGhpZGUgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgZmFpbHMgICAgPSByZXF1aXJlKCcuL19mYWlscycpXG4gICwgZGVmaW5lZCAgPSByZXF1aXJlKCcuL19kZWZpbmVkJylcbiAgLCB3a3MgICAgICA9IHJlcXVpcmUoJy4vX3drcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSwgbGVuZ3RoLCBleGVjKXtcbiAgdmFyIFNZTUJPTCAgID0gd2tzKEtFWSlcbiAgICAsIGZucyAgICAgID0gZXhlYyhkZWZpbmVkLCBTWU1CT0wsICcnW0tFWV0pXG4gICAgLCBzdHJmbiAgICA9IGZuc1swXVxuICAgICwgcnhmbiAgICAgPSBmbnNbMV07XG4gIGlmKGZhaWxzKGZ1bmN0aW9uKCl7XG4gICAgdmFyIE8gPSB7fTtcbiAgICBPW1NZTUJPTF0gPSBmdW5jdGlvbigpeyByZXR1cm4gNzsgfTtcbiAgICByZXR1cm4gJydbS0VZXShPKSAhPSA3O1xuICB9KSl7XG4gICAgcmVkZWZpbmUoU3RyaW5nLnByb3RvdHlwZSwgS0VZLCBzdHJmbik7XG4gICAgaGlkZShSZWdFeHAucHJvdG90eXBlLCBTWU1CT0wsIGxlbmd0aCA9PSAyXG4gICAgICAvLyAyMS4yLjUuOCBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV0oc3RyaW5nLCByZXBsYWNlVmFsdWUpXG4gICAgICAvLyAyMS4yLjUuMTEgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XShzdHJpbmcsIGxpbWl0KVxuICAgICAgPyBmdW5jdGlvbihzdHJpbmcsIGFyZyl7IHJldHVybiByeGZuLmNhbGwoc3RyaW5nLCB0aGlzLCBhcmcpOyB9XG4gICAgICAvLyAyMS4yLjUuNiBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdKHN0cmluZylcbiAgICAgIC8vIDIxLjIuNS45IFJlZ0V4cC5wcm90b3R5cGVbQEBzZWFyY2hdKHN0cmluZylcbiAgICAgIDogZnVuY3Rpb24oc3RyaW5nKXsgcmV0dXJuIHJ4Zm4uY2FsbChzdHJpbmcsIHRoaXMpOyB9XG4gICAgKTtcbiAgfVxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZml4LXJlLXdrcy5qc1xuICoqIG1vZHVsZSBpZCA9IDIwMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gQEByZXBsYWNlIGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ3JlcGxhY2UnLCAyLCBmdW5jdGlvbihkZWZpbmVkLCBSRVBMQUNFLCAkcmVwbGFjZSl7XG4gIC8vIDIxLjEuMy4xNCBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSlcbiAgcmV0dXJuIFtmdW5jdGlvbiByZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpe1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICB2YXIgTyAgPSBkZWZpbmVkKHRoaXMpXG4gICAgICAsIGZuID0gc2VhcmNoVmFsdWUgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VhcmNoVmFsdWVbUkVQTEFDRV07XG4gICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWRcbiAgICAgID8gZm4uY2FsbChzZWFyY2hWYWx1ZSwgTywgcmVwbGFjZVZhbHVlKVxuICAgICAgOiAkcmVwbGFjZS5jYWxsKFN0cmluZyhPKSwgc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSk7XG4gIH0sICRyZXBsYWNlXTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAucmVwbGFjZS5qc1xuICoqIG1vZHVsZSBpZCA9IDIwMlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gQEBzZWFyY2ggbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnc2VhcmNoJywgMSwgZnVuY3Rpb24oZGVmaW5lZCwgU0VBUkNILCAkc2VhcmNoKXtcbiAgLy8gMjEuMS4zLjE1IFN0cmluZy5wcm90b3R5cGUuc2VhcmNoKHJlZ2V4cClcbiAgcmV0dXJuIFtmdW5jdGlvbiBzZWFyY2gocmVnZXhwKXtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gID0gZGVmaW5lZCh0aGlzKVxuICAgICAgLCBmbiA9IHJlZ2V4cCA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWdleHBbU0VBUkNIXTtcbiAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtTRUFSQ0hdKFN0cmluZyhPKSk7XG4gIH0sICRzZWFyY2hdO1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zZWFyY2guanNcbiAqKiBtb2R1bGUgaWQgPSAyMDNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIEBAc3BsaXQgbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnc3BsaXQnLCAyLCBmdW5jdGlvbihkZWZpbmVkLCBTUExJVCwgJHNwbGl0KXtcbiAgJ3VzZSBzdHJpY3QnO1xuICB2YXIgaXNSZWdFeHAgICA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpXG4gICAgLCBfc3BsaXQgICAgID0gJHNwbGl0XG4gICAgLCAkcHVzaCAgICAgID0gW10ucHVzaFxuICAgICwgJFNQTElUICAgICA9ICdzcGxpdCdcbiAgICAsIExFTkdUSCAgICAgPSAnbGVuZ3RoJ1xuICAgICwgTEFTVF9JTkRFWCA9ICdsYXN0SW5kZXgnO1xuICBpZihcbiAgICAnYWJiYydbJFNQTElUXSgvKGIpKi8pWzFdID09ICdjJyB8fFxuICAgICd0ZXN0J1skU1BMSVRdKC8oPzopLywgLTEpW0xFTkdUSF0gIT0gNCB8fFxuICAgICdhYidbJFNQTElUXSgvKD86YWIpKi8pW0xFTkdUSF0gIT0gMiB8fFxuICAgICcuJ1skU1BMSVRdKC8oLj8pKC4/KS8pW0xFTkdUSF0gIT0gNCB8fFxuICAgICcuJ1skU1BMSVRdKC8oKSgpLylbTEVOR1RIXSA+IDEgfHxcbiAgICAnJ1skU1BMSVRdKC8uPy8pW0xFTkdUSF1cbiAgKXtcbiAgICB2YXIgTlBDRyA9IC8oKT8/Ly5leGVjKCcnKVsxXSA9PT0gdW5kZWZpbmVkOyAvLyBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cFxuICAgIC8vIGJhc2VkIG9uIGVzNS1zaGltIGltcGxlbWVudGF0aW9uLCBuZWVkIHRvIHJld29yayBpdFxuICAgICRzcGxpdCA9IGZ1bmN0aW9uKHNlcGFyYXRvciwgbGltaXQpe1xuICAgICAgdmFyIHN0cmluZyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIGlmKHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwKXJldHVybiBbXTtcbiAgICAgIC8vIElmIGBzZXBhcmF0b3JgIGlzIG5vdCBhIHJlZ2V4LCB1c2UgbmF0aXZlIHNwbGl0XG4gICAgICBpZighaXNSZWdFeHAoc2VwYXJhdG9yKSlyZXR1cm4gX3NwbGl0LmNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICAgIHZhciBmbGFncyA9IChzZXBhcmF0b3IuaWdub3JlQ2FzZSA/ICdpJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLm11bHRpbGluZSA/ICdtJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLnVuaWNvZGUgPyAndScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5zdGlja3kgPyAneScgOiAnJyk7XG4gICAgICB2YXIgbGFzdExhc3RJbmRleCA9IDA7XG4gICAgICB2YXIgc3BsaXRMaW1pdCA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyA0Mjk0OTY3Mjk1IDogbGltaXQgPj4+IDA7XG4gICAgICAvLyBNYWtlIGBnbG9iYWxgIGFuZCBhdm9pZCBgbGFzdEluZGV4YCBpc3N1ZXMgYnkgd29ya2luZyB3aXRoIGEgY29weVxuICAgICAgdmFyIHNlcGFyYXRvckNvcHkgPSBuZXcgUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIGZsYWdzICsgJ2cnKTtcbiAgICAgIHZhciBzZXBhcmF0b3IyLCBtYXRjaCwgbGFzdEluZGV4LCBsYXN0TGVuZ3RoLCBpO1xuICAgICAgLy8gRG9lc24ndCBuZWVkIGZsYWdzIGd5LCBidXQgdGhleSBkb24ndCBodXJ0XG4gICAgICBpZighTlBDRylzZXBhcmF0b3IyID0gbmV3IFJlZ0V4cCgnXicgKyBzZXBhcmF0b3JDb3B5LnNvdXJjZSArICckKD8hXFxcXHMpJywgZmxhZ3MpO1xuICAgICAgd2hpbGUobWF0Y2ggPSBzZXBhcmF0b3JDb3B5LmV4ZWMoc3RyaW5nKSl7XG4gICAgICAgIC8vIGBzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleGAgaXMgbm90IHJlbGlhYmxlIGNyb3NzLWJyb3dzZXJcbiAgICAgICAgbGFzdEluZGV4ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXVtMRU5HVEhdO1xuICAgICAgICBpZihsYXN0SW5kZXggPiBsYXN0TGFzdEluZGV4KXtcbiAgICAgICAgICBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCwgbWF0Y2guaW5kZXgpKTtcbiAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYCBmb3IgTlBDR1xuICAgICAgICAgIGlmKCFOUENHICYmIG1hdGNoW0xFTkdUSF0gPiAxKW1hdGNoWzBdLnJlcGxhY2Uoc2VwYXJhdG9yMiwgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGZvcihpID0gMTsgaSA8IGFyZ3VtZW50c1tMRU5HVEhdIC0gMjsgaSsrKWlmKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKW1hdGNoW2ldID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmKG1hdGNoW0xFTkdUSF0gPiAxICYmIG1hdGNoLmluZGV4IDwgc3RyaW5nW0xFTkdUSF0pJHB1c2guYXBwbHkob3V0cHV0LCBtYXRjaC5zbGljZSgxKSk7XG4gICAgICAgICAgbGFzdExlbmd0aCA9IG1hdGNoWzBdW0xFTkdUSF07XG4gICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICBpZihvdXRwdXRbTEVOR1RIXSA+PSBzcGxpdExpbWl0KWJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmKHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF0gPT09IG1hdGNoLmluZGV4KXNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF0rKzsgLy8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcFxuICAgICAgfVxuICAgICAgaWYobGFzdExhc3RJbmRleCA9PT0gc3RyaW5nW0xFTkdUSF0pe1xuICAgICAgICBpZihsYXN0TGVuZ3RoIHx8ICFzZXBhcmF0b3JDb3B5LnRlc3QoJycpKW91dHB1dC5wdXNoKCcnKTtcbiAgICAgIH0gZWxzZSBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCkpO1xuICAgICAgcmV0dXJuIG91dHB1dFtMRU5HVEhdID4gc3BsaXRMaW1pdCA/IG91dHB1dC5zbGljZSgwLCBzcGxpdExpbWl0KSA6IG91dHB1dDtcbiAgICB9O1xuICAvLyBDaGFrcmEsIFY4XG4gIH0gZWxzZSBpZignMCdbJFNQTElUXSh1bmRlZmluZWQsIDApW0xFTkdUSF0pe1xuICAgICRzcGxpdCA9IGZ1bmN0aW9uKHNlcGFyYXRvciwgbGltaXQpe1xuICAgICAgcmV0dXJuIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwID8gW10gOiBfc3BsaXQuY2FsbCh0aGlzLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9O1xuICB9XG4gIC8vIDIxLjEuMy4xNyBTdHJpbmcucHJvdG90eXBlLnNwbGl0KHNlcGFyYXRvciwgbGltaXQpXG4gIHJldHVybiBbZnVuY3Rpb24gc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCl7XG4gICAgdmFyIE8gID0gZGVmaW5lZCh0aGlzKVxuICAgICAgLCBmbiA9IHNlcGFyYXRvciA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzZXBhcmF0b3JbU1BMSVRdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkID8gZm4uY2FsbChzZXBhcmF0b3IsIE8sIGxpbWl0KSA6ICRzcGxpdC5jYWxsKFN0cmluZyhPKSwgc2VwYXJhdG9yLCBsaW1pdCk7XG4gIH0sICRzcGxpdF07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNwbGl0LmpzXG4gKiogbW9kdWxlIGlkID0gMjA0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbGlicmFyeScpXG4gICwgZ2xvYmFsICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjdHggICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGNsYXNzb2YgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsICRleHBvcnQgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgaXNPYmplY3QgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBhbk9iamVjdCAgICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiAgICAgICAgICA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIGFuSW5zdGFuY2UgICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcbiAgLCBmb3JPZiAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19mb3Itb2YnKVxuICAsIHNldFByb3RvICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3NldC1wcm90bycpLnNldFxuICAsIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKVxuICAsIHRhc2sgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXRcbiAgLCBtaWNyb3Rhc2sgICAgICAgICAgPSByZXF1aXJlKCcuL19taWNyb3Rhc2snKSgpXG4gICwgUFJPTUlTRSAgICAgICAgICAgID0gJ1Byb21pc2UnXG4gICwgVHlwZUVycm9yICAgICAgICAgID0gZ2xvYmFsLlR5cGVFcnJvclxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgJFByb21pc2UgICAgICAgICAgID0gZ2xvYmFsW1BST01JU0VdXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBpc05vZGUgICAgICAgICAgICAgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJ1xuICAsIGVtcHR5ICAgICAgICAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cbiAgLCBJbnRlcm5hbCwgR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5LCBXcmFwcGVyO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24oKXtcbiAgdHJ5IHtcbiAgICAvLyBjb3JyZWN0IHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgICB2YXIgcHJvbWlzZSAgICAgPSAkUHJvbWlzZS5yZXNvbHZlKDEpXG4gICAgICAsIEZha2VQcm9taXNlID0gKHByb21pc2UuY29uc3RydWN0b3IgPSB7fSlbcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKV0gPSBmdW5jdGlvbihleGVjKXsgZXhlYyhlbXB0eSwgZW1wdHkpOyB9O1xuICAgIC8vIHVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgICByZXR1cm4gKGlzTm9kZSB8fCB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbicpICYmIHByb21pc2UudGhlbihlbXB0eSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgc2FtZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24oYSwgYil7XG4gIC8vIHdpdGggbGlicmFyeSB3cmFwcGVyIHNwZWNpYWwgY2FzZVxuICByZXR1cm4gYSA9PT0gYiB8fCBhID09PSAkUHJvbWlzZSAmJiBiID09PSBXcmFwcGVyO1xufTtcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKEMpe1xuICByZXR1cm4gc2FtZUNvbnN0cnVjdG9yKCRQcm9taXNlLCBDKVxuICAgID8gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgOiBuZXcgR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbnZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IEdlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKEMpe1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbigkJHJlc29sdmUsICQkcmVqZWN0KXtcbiAgICBpZihyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ICA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCAgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn07XG52YXIgcGVyZm9ybSA9IGZ1bmN0aW9uKGV4ZWMpe1xuICB0cnkge1xuICAgIGV4ZWMoKTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4ge2Vycm9yOiBlfTtcbiAgfVxufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbihwcm9taXNlLCBpc1JlamVjdCl7XG4gIGlmKHByb21pc2UuX24pcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uKCl7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdlxuICAgICAgLCBvayAgICA9IHByb21pc2UuX3MgPT0gMVxuICAgICAgLCBpICAgICA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uKHJlYWN0aW9uKXtcbiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWxcbiAgICAgICAgLCByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZVxuICAgICAgICAsIHJlamVjdCAgPSByZWFjdGlvbi5yZWplY3RcbiAgICAgICAgLCBkb21haW4gID0gcmVhY3Rpb24uZG9tYWluXG4gICAgICAgICwgcmVzdWx0LCB0aGVuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYoaGFuZGxlcil7XG4gICAgICAgICAgaWYoIW9rKXtcbiAgICAgICAgICAgIGlmKHByb21pc2UuX2ggPT0gMilvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihoYW5kbGVyID09PSB0cnVlKXJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYoZG9tYWluKWRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICBpZihkb21haW4pZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKXtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpe1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlKGNoYWluLmxlbmd0aCA+IGkpcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHByb21pc2UuX2MgPSBbXTtcbiAgICBwcm9taXNlLl9uID0gZmFsc2U7XG4gICAgaWYoaXNSZWplY3QgJiYgIXByb21pc2UuX2gpb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbigpe1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3ZcbiAgICAgICwgYWJydXB0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmKGlzVW5oYW5kbGVkKHByb21pc2UpKXtcbiAgICAgIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoaXNOb2RlKXtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmKGhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pe1xuICAgICAgICAgIGhhbmRsZXIoe3Byb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWV9KTtcbiAgICAgICAgfSBlbHNlIGlmKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3Ipe1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgcHJvbWlzZS5faCA9IGlzTm9kZSB8fCBpc1VuaGFuZGxlZChwcm9taXNlKSA/IDIgOiAxO1xuICAgIH0gcHJvbWlzZS5fYSA9IHVuZGVmaW5lZDtcbiAgICBpZihhYnJ1cHQpdGhyb3cgYWJydXB0LmVycm9yO1xuICB9KTtcbn07XG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbihwcm9taXNlKXtcbiAgaWYocHJvbWlzZS5faCA9PSAxKXJldHVybiBmYWxzZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYSB8fCBwcm9taXNlLl9jXG4gICAgLCBpICAgICA9IDBcbiAgICAsIHJlYWN0aW9uO1xuICB3aGlsZShjaGFpbi5sZW5ndGggPiBpKXtcbiAgICByZWFjdGlvbiA9IGNoYWluW2krK107XG4gICAgaWYocmVhY3Rpb24uZmFpbCB8fCAhaXNVbmhhbmRsZWQocmVhY3Rpb24ucHJvbWlzZSkpcmV0dXJuIGZhbHNlO1xuICB9IHJldHVybiB0cnVlO1xufTtcbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbigpe1xuICAgIHZhciBoYW5kbGVyO1xuICAgIGlmKGlzTm9kZSl7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgaWYoaGFuZGxlciA9IGdsb2JhbC5vbnJlamVjdGlvbmhhbmRsZWQpe1xuICAgICAgaGFuZGxlcih7cHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiBwcm9taXNlLl92fSk7XG4gICAgfVxuICB9KTtcbn07XG52YXIgJHJlamVjdCA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICBpZihwcm9taXNlLl9kKXJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZighcHJvbWlzZS5fYSlwcm9taXNlLl9hID0gcHJvbWlzZS5fYy5zbGljZSgpO1xuICBub3RpZnkocHJvbWlzZSwgdHJ1ZSk7XG59O1xudmFyICRyZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgcHJvbWlzZSA9IHRoaXNcbiAgICAsIHRoZW47XG4gIGlmKHByb21pc2UuX2QpcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHRyeSB7XG4gICAgaWYocHJvbWlzZSA9PT0gdmFsdWUpdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYodGhlbiA9IGlzVGhlbmFibGUodmFsdWUpKXtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbigpe1xuICAgICAgICB2YXIgd3JhcHBlciA9IHtfdzogcHJvbWlzZSwgX2Q6IGZhbHNlfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAkcmVqZWN0LmNhbGwod3JhcHBlciwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlLl92ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zID0gMTtcbiAgICAgIG5vdGlmeShwcm9taXNlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoKGUpe1xuICAgICRyZWplY3QuY2FsbCh7X3c6IHByb21pc2UsIF9kOiBmYWxzZX0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZighVVNFX05BVElWRSl7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gICRQcm9taXNlID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcil7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2goZXJyKXtcbiAgICAgICRyZWplY3QuY2FsbCh0aGlzLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKXtcbiAgICB0aGlzLl9jID0gW107ICAgICAgICAgICAgIC8vIDwtIGF3YWl0aW5nIHJlYWN0aW9uc1xuICAgIHRoaXMuX2EgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gY2hlY2tlZCBpbiBpc1VuaGFuZGxlZCByZWFjdGlvbnNcbiAgICB0aGlzLl9zID0gMDsgICAgICAgICAgICAgIC8vIDwtIHN0YXRlXG4gICAgdGhpcy5fZCA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBkb25lXG4gICAgdGhpcy5fdiA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSB2YWx1ZVxuICAgIHRoaXMuX2ggPSAwOyAgICAgICAgICAgICAgLy8gPC0gcmVqZWN0aW9uIHN0YXRlLCAwIC0gZGVmYXVsdCwgMSAtIGhhbmRsZWQsIDIgLSB1bmhhbmRsZWRcbiAgICB0aGlzLl9uID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIG5vdGlmeVxuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKSgkUHJvbWlzZS5wcm90b3R5cGUsIHtcbiAgICAvLyAyNS40LjUuMyBQcm9taXNlLnByb3RvdHlwZS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpe1xuICAgICAgdmFyIHJlYWN0aW9uICAgID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsICRQcm9taXNlKSk7XG4gICAgICByZWFjdGlvbi5vayAgICAgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgICA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IGlzTm9kZSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmKHRoaXMuX2EpdGhpcy5fYS5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmKHRoaXMuX3Mpbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbihvblJlamVjdGVkKXtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKCl7XG4gICAgdmFyIHByb21pc2UgID0gbmV3IEludGVybmFsO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gY3R4KCRyZXNvbHZlLCBwcm9taXNlLCAxKTtcbiAgICB0aGlzLnJlamVjdCAgPSBjdHgoJHJlamVjdCwgcHJvbWlzZSwgMSk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHtQcm9taXNlOiAkUHJvbWlzZX0pO1xucmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKSgkUHJvbWlzZSwgUFJPTUlTRSk7XG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKFBST01JU0UpO1xuV3JhcHBlciA9IHJlcXVpcmUoJy4vX2NvcmUnKVtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKXtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpXG4gICAgICAsICQkcmVqZWN0ICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICAkJHJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKExJQlJBUlkgfHwgIVVTRV9OQVRJVkUpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC42IFByb21pc2UucmVzb2x2ZSh4KVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpe1xuICAgIC8vIGluc3RhbmNlb2YgaW5zdGVhZCBvZiBpbnRlcm5hbCBzbG90IGNoZWNrIGJlY2F1c2Ugd2Ugc2hvdWxkIGZpeCBpdCB3aXRob3V0IHJlcGxhY2VtZW50IG5hdGl2ZSBQcm9taXNlIGNvcmVcbiAgICBpZih4IGluc3RhbmNlb2YgJFByb21pc2UgJiYgc2FtZUNvbnN0cnVjdG9yKHguY29uc3RydWN0b3IsIHRoaXMpKXJldHVybiB4O1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcylcbiAgICAgICwgJCRyZXNvbHZlICA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICAkJHJlc29sdmUoeCk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoVVNFX05BVElWRSAmJiByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpKGZ1bmN0aW9uKGl0ZXIpe1xuICAkUHJvbWlzZS5hbGwoaXRlcilbJ2NhdGNoJ10oZW1wdHkpO1xufSkpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC4xIFByb21pc2UuYWxsKGl0ZXJhYmxlKVxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSl7XG4gICAgdmFyIEMgICAgICAgICAgPSB0aGlzXG4gICAgICAsIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgLCByZXNvbHZlICAgID0gY2FwYWJpbGl0eS5yZXNvbHZlXG4gICAgICAsIHJlamVjdCAgICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgdmFyIHZhbHVlcyAgICA9IFtdXG4gICAgICAgICwgaW5kZXggICAgID0gMFxuICAgICAgICAsIHJlbWFpbmluZyA9IDE7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uKHByb21pc2Upe1xuICAgICAgICB2YXIgJGluZGV4ICAgICAgICA9IGluZGV4KytcbiAgICAgICAgICAsIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAgICAgICBpZihhbHJlYWR5Q2FsbGVkKXJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkICA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZihhYnJ1cHQpcmVqZWN0KGFicnVwdC5lcnJvcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKXtcbiAgICB2YXIgQyAgICAgICAgICA9IHRoaXNcbiAgICAgICwgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICAsIHJlamVjdCAgICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbihwcm9taXNlKXtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYoYWJydXB0KXJlamVjdChhYnJ1cHQuZXJyb3IpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzXG4gKiogbW9kdWxlIGlkID0gMjA1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgY3R4ICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGNhbGwgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJylcbiAgLCBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKVxuICAsIGFuT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgZ2V0SXRlckZuICAgPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpXG4gICwgQlJFQUsgICAgICAgPSB7fVxuICAsIFJFVFVSTiAgICAgID0ge307XG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUil7XG4gIHZhciBpdGVyRm4gPSBJVEVSQVRPUiA/IGZ1bmN0aW9uKCl7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSlcbiAgICAsIGYgICAgICA9IGN0eChmbiwgdGhhdCwgZW50cmllcyA/IDIgOiAxKVxuICAgICwgaW5kZXggID0gMFxuICAgICwgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZih0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ZXJhYmxlICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIC8vIGZhc3QgY2FzZSBmb3IgYXJyYXlzIHdpdGggZGVmYXVsdCBpdGVyYXRvclxuICBpZihpc0FycmF5SXRlcihpdGVyRm4pKWZvcihsZW5ndGggPSB0b0xlbmd0aChpdGVyYWJsZS5sZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKyl7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIGZvcihpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOyApe1xuICAgIHJlc3VsdCA9IGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcbmV4cG9ydHMuQlJFQUsgID0gQlJFQUs7XG5leHBvcnRzLlJFVFVSTiA9IFJFVFVSTjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fZm9yLW9mLmpzXG4gKiogbW9kdWxlIGlkID0gMjA2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyA3LjMuMjAgU3BlY2llc0NvbnN0cnVjdG9yKE8sIGRlZmF1bHRDb25zdHJ1Y3RvcilcbnZhciBhbk9iamVjdCAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIFNQRUNJRVMgICA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE8sIEQpe1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yLCBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzXG4gKiogbW9kdWxlIGlkID0gMjA3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgY3R4ICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBpbnZva2UgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19pbnZva2UnKVxuICAsIGh0bWwgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2h0bWwnKVxuICAsIGNlbCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKVxuICAsIGdsb2JhbCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBzZXRUYXNrICAgICAgICAgICAgPSBnbG9iYWwuc2V0SW1tZWRpYXRlXG4gICwgY2xlYXJUYXNrICAgICAgICAgID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlXG4gICwgTWVzc2FnZUNoYW5uZWwgICAgID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsXG4gICwgY291bnRlciAgICAgICAgICAgID0gMFxuICAsIHF1ZXVlICAgICAgICAgICAgICA9IHt9XG4gICwgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSdcbiAgLCBkZWZlciwgY2hhbm5lbCwgcG9ydDtcbnZhciBydW4gPSBmdW5jdGlvbigpe1xuICB2YXIgaWQgPSArdGhpcztcbiAgaWYocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKXtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQpe1xuICBydW4uY2FsbChldmVudC5kYXRhKTtcbn07XG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZighc2V0VGFzayB8fCAhY2xlYXJUYXNrKXtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbil7XG4gICAgdmFyIGFyZ3MgPSBbXSwgaSA9IDE7XG4gICAgd2hpbGUoYXJndW1lbnRzLmxlbmd0aCA+IGkpYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24oKXtcbiAgICAgIGludm9rZSh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhclRhc2sgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCl7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmKHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJyl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYoTWVzc2FnZUNoYW5uZWwpe1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWw7XG4gICAgcG9ydCAgICA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGN0eChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZihnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjZWwoJ3NjcmlwdCcpKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY2VsKCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIHNldFRpbWVvdXQoY3R4KHJ1biwgaWQsIDEpLCAwKTtcbiAgICB9O1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiAgIHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3Rhc2suanNcbiAqKiBtb2R1bGUgaWQgPSAyMDhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXRcbiAgLCBPYnNlcnZlciAgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlclxuICAsIHByb2Nlc3MgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgUHJvbWlzZSAgID0gZ2xvYmFsLlByb21pc2VcbiAgLCBpc05vZGUgICAgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKXtcbiAgdmFyIGhlYWQsIGxhc3QsIG5vdGlmeTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbigpe1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmKGlzTm9kZSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKXBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUoaGVhZCl7XG4gICAgICBmbiAgID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgaWYoaGVhZClub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZihwYXJlbnQpcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZihpc05vZGUpe1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXJcbiAgfSBlbHNlIGlmKE9ic2VydmVyKXtcbiAgICB2YXIgdG9nZ2xlID0gdHJ1ZVxuICAgICAgLCBub2RlICAgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHtjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKXtcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBwcm9taXNlLnRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihmbil7XG4gICAgdmFyIHRhc2sgPSB7Zm46IGZuLCBuZXh0OiB1bmRlZmluZWR9O1xuICAgIGlmKGxhc3QpbGFzdC5uZXh0ID0gdGFzaztcbiAgICBpZighaGVhZCl7XG4gICAgICBoZWFkID0gdGFzaztcbiAgICAgIG5vdGlmeSgpO1xuICAgIH0gbGFzdCA9IHRhc2s7XG4gIH07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19taWNyb3Rhc2suanNcbiAqKiBtb2R1bGUgaWQgPSAyMDlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHRhcmdldCwgc3JjLCBzYWZlKXtcbiAgZm9yKHZhciBrZXkgaW4gc3JjKXJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgc2FmZSk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanNcbiAqKiBtb2R1bGUgaWQgPSAyMTBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJvbmcgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXN0cm9uZycpO1xuXG4vLyAyMy4xIE1hcCBPYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKSgnTWFwJywgZnVuY3Rpb24oZ2V0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIE1hcCgpeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpe1xuICAgIHZhciBlbnRyeSA9IHN0cm9uZy5nZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52O1xuICB9LFxuICAvLyAyMy4xLjMuOSBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKXtcbiAgICByZXR1cm4gc3Ryb25nLmRlZih0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gIH1cbn0sIHN0cm9uZywgdHJ1ZSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hcC5qc1xuICoqIG1vZHVsZSBpZCA9IDIxMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRQICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZlxuICAsIGNyZWF0ZSAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpXG4gICwgaGlkZSAgICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpXG4gICwgY3R4ICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGFuSW5zdGFuY2UgID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKVxuICAsIGRlZmluZWQgICAgID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpXG4gICwgZm9yT2YgICAgICAgPSByZXF1aXJlKCcuL19mb3Itb2YnKVxuICAsICRpdGVyRGVmaW5lID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKVxuICAsIHN0ZXAgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJylcbiAgLCBzZXRTcGVjaWVzICA9IHJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJylcbiAgLCBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJylcbiAgLCBmYXN0S2V5ICAgICA9IHJlcXVpcmUoJy4vX21ldGEnKS5mYXN0S2V5XG4gICwgU0laRSAgICAgICAgPSBERVNDUklQVE9SUyA/ICdfcycgOiAnc2l6ZSc7XG5cbnZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uKHRoYXQsIGtleSl7XG4gIC8vIGZhc3QgY2FzZVxuICB2YXIgaW5kZXggPSBmYXN0S2V5KGtleSksIGVudHJ5O1xuICBpZihpbmRleCAhPT0gJ0YnKXJldHVybiB0aGF0Ll9pW2luZGV4XTtcbiAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gIGZvcihlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pe1xuICAgIGlmKGVudHJ5LmsgPT0ga2V5KXJldHVybiBlbnRyeTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbih3cmFwcGVyLCBOQU1FLCBJU19NQVAsIEFEREVSKXtcbiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24odGhhdCwgaXRlcmFibGUpe1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBDLCBOQU1FLCAnX2knKTtcbiAgICAgIHRoYXQuX2kgPSBjcmVhdGUobnVsbCk7IC8vIGluZGV4XG4gICAgICB0aGF0Ll9mID0gdW5kZWZpbmVkOyAgICAvLyBmaXJzdCBlbnRyeVxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgICAgLy8gbGFzdCBlbnRyeVxuICAgICAgdGhhdFtTSVpFXSA9IDA7ICAgICAgICAgLy8gc2l6ZVxuICAgICAgaWYoaXRlcmFibGUgIT0gdW5kZWZpbmVkKWZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMS4zLjEgTWFwLnByb3RvdHlwZS5jbGVhcigpXG4gICAgICAvLyAyMy4yLjMuMiBTZXQucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpe1xuICAgICAgICBmb3IodmFyIHRoYXQgPSB0aGlzLCBkYXRhID0gdGhhdC5faSwgZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKXtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZihlbnRyeS5wKWVudHJ5LnAgPSBlbnRyeS5wLm4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIGRhdGFbZW50cnkuaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhhdC5fZiA9IHRoYXQuX2wgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoYXRbU0laRV0gPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy4zIE1hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uKGtleSl7XG4gICAgICAgIHZhciB0aGF0ICA9IHRoaXNcbiAgICAgICAgICAsIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYoZW50cnkpe1xuICAgICAgICAgIHZhciBuZXh0ID0gZW50cnkublxuICAgICAgICAgICAgLCBwcmV2ID0gZW50cnkucDtcbiAgICAgICAgICBkZWxldGUgdGhhdC5faVtlbnRyeS5pXTtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZihwcmV2KXByZXYubiA9IG5leHQ7XG4gICAgICAgICAgaWYobmV4dCluZXh0LnAgPSBwcmV2O1xuICAgICAgICAgIGlmKHRoYXQuX2YgPT0gZW50cnkpdGhhdC5fZiA9IG5leHQ7XG4gICAgICAgICAgaWYodGhhdC5fbCA9PSBlbnRyeSl0aGF0Ll9sID0gcHJldjtcbiAgICAgICAgICB0aGF0W1NJWkVdLS07XG4gICAgICAgIH0gcmV0dXJuICEhZW50cnk7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMi4zLjYgU2V0LnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICAvLyAyMy4xLjMuNSBNYXAucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiwgdGhhdCA9IHVuZGVmaW5lZCAqLyl7XG4gICAgICAgIGFuSW5zdGFuY2UodGhpcywgQywgJ2ZvckVhY2gnKTtcbiAgICAgICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpXG4gICAgICAgICAgLCBlbnRyeTtcbiAgICAgICAgd2hpbGUoZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm4gOiB0aGlzLl9mKXtcbiAgICAgICAgICBmKGVudHJ5LnYsIGVudHJ5LmssIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlKGVudHJ5ICYmIGVudHJ5LnIpZW50cnkgPSBlbnRyeS5wO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjcgTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuMi4zLjcgU2V0LnByb3RvdHlwZS5oYXModmFsdWUpXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpe1xuICAgICAgICByZXR1cm4gISFnZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmKERFU0NSSVBUT1JTKWRQKEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIGRlZmluZWQodGhpc1tTSVpFXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24odGhhdCwga2V5LCB2YWx1ZSl7XG4gICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KVxuICAgICAgLCBwcmV2LCBpbmRleDtcbiAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgZW50cnlcbiAgICBpZihlbnRyeSl7XG4gICAgICBlbnRyeS52ID0gdmFsdWU7XG4gICAgLy8gY3JlYXRlIG5ldyBlbnRyeVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGF0Ll9sID0gZW50cnkgPSB7XG4gICAgICAgIGk6IGluZGV4ID0gZmFzdEtleShrZXksIHRydWUpLCAvLyA8LSBpbmRleFxuICAgICAgICBrOiBrZXksICAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0ga2V5XG4gICAgICAgIHY6IHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAvLyA8LSB2YWx1ZVxuICAgICAgICBwOiBwcmV2ID0gdGhhdC5fbCwgICAgICAgICAgICAgLy8gPC0gcHJldmlvdXMgZW50cnlcbiAgICAgICAgbjogdW5kZWZpbmVkLCAgICAgICAgICAgICAgICAgIC8vIDwtIG5leHQgZW50cnlcbiAgICAgICAgcjogZmFsc2UgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHJlbW92ZWRcbiAgICAgIH07XG4gICAgICBpZighdGhhdC5fZil0aGF0Ll9mID0gZW50cnk7XG4gICAgICBpZihwcmV2KXByZXYubiA9IGVudHJ5O1xuICAgICAgdGhhdFtTSVpFXSsrO1xuICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICBpZihpbmRleCAhPT0gJ0YnKXRoYXQuX2lbaW5kZXhdID0gZW50cnk7XG4gICAgfSByZXR1cm4gdGhhdDtcbiAgfSxcbiAgZ2V0RW50cnk6IGdldEVudHJ5LFxuICBzZXRTdHJvbmc6IGZ1bmN0aW9uKEMsIE5BTUUsIElTX01BUCl7XG4gICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdXG4gICAgLy8gMjMuMS4zLjQsIDIzLjEuMy44LCAyMy4xLjMuMTEsIDIzLjEuMy4xMiwgMjMuMi4zLjUsIDIzLjIuMy44LCAyMy4yLjMuMTAsIDIzLjIuMy4xMVxuICAgICRpdGVyRGVmaW5lKEMsIE5BTUUsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKXtcbiAgICAgIHRoaXMuX3QgPSBpdGVyYXRlZDsgIC8vIHRhcmdldFxuICAgICAgdGhpcy5fayA9IGtpbmQ7ICAgICAgLy8ga2luZFxuICAgICAgdGhpcy5fbCA9IHVuZGVmaW5lZDsgLy8gcHJldmlvdXNcbiAgICB9LCBmdW5jdGlvbigpe1xuICAgICAgdmFyIHRoYXQgID0gdGhpc1xuICAgICAgICAsIGtpbmQgID0gdGhhdC5fa1xuICAgICAgICAsIGVudHJ5ID0gdGhhdC5fbDtcbiAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgd2hpbGUoZW50cnkgJiYgZW50cnkucillbnRyeSA9IGVudHJ5LnA7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYoIXRoYXQuX3QgfHwgISh0aGF0Ll9sID0gZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm4gOiB0aGF0Ll90Ll9mKSl7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHRoYXQuX3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBzdGVwKDEpO1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYoa2luZCA9PSAna2V5cycgIClyZXR1cm4gc3RlcCgwLCBlbnRyeS5rKTtcbiAgICAgIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgZW50cnkudik7XG4gICAgICByZXR1cm4gc3RlcCgwLCBbZW50cnkuaywgZW50cnkudl0pO1xuICAgIH0sIElTX01BUCA/ICdlbnRyaWVzJyA6ICd2YWx1ZXMnICwgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBhZGQgW0BAc3BlY2llc10sIDIzLjEuMi4yLCAyMy4yLjIuMlxuICAgIHNldFNwZWNpZXMoTkFNRSk7XG4gIH1cbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24tc3Ryb25nLmpzXG4gKiogbW9kdWxlIGlkID0gMjEyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsICAgICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsICRleHBvcnQgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCByZWRlZmluZSAgICAgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCByZWRlZmluZUFsbCAgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpXG4gICwgbWV0YSAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19tZXRhJylcbiAgLCBmb3JPZiAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2Zvci1vZicpXG4gICwgYW5JbnN0YW5jZSAgICAgICAgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpXG4gICwgaXNPYmplY3QgICAgICAgICAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGZhaWxzICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZmFpbHMnKVxuICAsICRpdGVyRGV0ZWN0ICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKVxuICAsIHNldFRvU3RyaW5nVGFnICAgID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi9faW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE5BTUUsIHdyYXBwZXIsIG1ldGhvZHMsIGNvbW1vbiwgSVNfTUFQLCBJU19XRUFLKXtcbiAgdmFyIEJhc2UgID0gZ2xvYmFsW05BTUVdXG4gICAgLCBDICAgICA9IEJhc2VcbiAgICAsIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJ1xuICAgICwgcHJvdG8gPSBDICYmIEMucHJvdG90eXBlXG4gICAgLCBPICAgICA9IHt9O1xuICB2YXIgZml4TWV0aG9kID0gZnVuY3Rpb24oS0VZKXtcbiAgICB2YXIgZm4gPSBwcm90b1tLRVldO1xuICAgIHJlZGVmaW5lKHByb3RvLCBLRVksXG4gICAgICBLRVkgPT0gJ2RlbGV0ZScgPyBmdW5jdGlvbihhKXtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGEpID8gZmFsc2UgOiBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7XG4gICAgICB9IDogS0VZID09ICdoYXMnID8gZnVuY3Rpb24gaGFzKGEpe1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyBmYWxzZSA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2dldCcgPyBmdW5jdGlvbiBnZXQoYSl7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChhKSA/IHVuZGVmaW5lZCA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2FkZCcgPyBmdW5jdGlvbiBhZGQoYSl7IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTsgcmV0dXJuIHRoaXM7IH1cbiAgICAgICAgOiBmdW5jdGlvbiBzZXQoYSwgYil7IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhLCBiKTsgcmV0dXJuIHRoaXM7IH1cbiAgICApO1xuICB9O1xuICBpZih0eXBlb2YgQyAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBwcm90by5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbigpe1xuICAgIG5ldyBDKCkuZW50cmllcygpLm5leHQoKTtcbiAgfSkpKXtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIEMgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUik7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICAgIG1ldGEuTkVFRCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGluc3RhbmNlICAgICAgICAgICAgID0gbmV3IENcbiAgICAgIC8vIGVhcmx5IGltcGxlbWVudGF0aW9ucyBub3Qgc3VwcG9ydHMgY2hhaW5pbmdcbiAgICAgICwgSEFTTlRfQ0hBSU5JTkcgICAgICAgPSBpbnN0YW5jZVtBRERFUl0oSVNfV0VBSyA/IHt9IDogLTAsIDEpICE9IGluc3RhbmNlXG4gICAgICAvLyBWOCB+ICBDaHJvbWl1bSA0MC0gd2Vhay1jb2xsZWN0aW9ucyB0aHJvd3Mgb24gcHJpbWl0aXZlcywgYnV0IHNob3VsZCByZXR1cm4gZmFsc2VcbiAgICAgICwgVEhST1dTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbigpeyBpbnN0YW5jZS5oYXMoMSk7IH0pXG4gICAgICAvLyBtb3N0IGVhcmx5IGltcGxlbWVudGF0aW9ucyBkb2Vzbid0IHN1cHBvcnRzIGl0ZXJhYmxlcywgbW9zdCBtb2Rlcm4gLSBub3QgY2xvc2UgaXQgY29ycmVjdGx5XG4gICAgICAsIEFDQ0VQVF9JVEVSQUJMRVMgICAgID0gJGl0ZXJEZXRlY3QoZnVuY3Rpb24oaXRlcil7IG5ldyBDKGl0ZXIpOyB9KSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgICAgLy8gZm9yIGVhcmx5IGltcGxlbWVudGF0aW9ucyAtMCBhbmQgKzAgbm90IHRoZSBzYW1lXG4gICAgICAsIEJVR0dZX1pFUk8gPSAhSVNfV0VBSyAmJiBmYWlscyhmdW5jdGlvbigpe1xuICAgICAgICAvLyBWOCB+IENocm9taXVtIDQyLSBmYWlscyBvbmx5IHdpdGggNSsgZWxlbWVudHNcbiAgICAgICAgdmFyICRpbnN0YW5jZSA9IG5ldyBDKClcbiAgICAgICAgICAsIGluZGV4ICAgICA9IDU7XG4gICAgICAgIHdoaWxlKGluZGV4LS0pJGluc3RhbmNlW0FEREVSXShpbmRleCwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gISRpbnN0YW5jZS5oYXMoLTApO1xuICAgICAgfSk7XG4gICAgaWYoIUFDQ0VQVF9JVEVSQUJMRVMpeyBcbiAgICAgIEMgPSB3cmFwcGVyKGZ1bmN0aW9uKHRhcmdldCwgaXRlcmFibGUpe1xuICAgICAgICBhbkluc3RhbmNlKHRhcmdldCwgQywgTkFNRSk7XG4gICAgICAgIHZhciB0aGF0ID0gaW5oZXJpdElmUmVxdWlyZWQobmV3IEJhc2UsIHRhcmdldCwgQyk7XG4gICAgICAgIGlmKGl0ZXJhYmxlICE9IHVuZGVmaW5lZClmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0aGF0W0FEREVSXSwgdGhhdCk7XG4gICAgICAgIHJldHVybiB0aGF0O1xuICAgICAgfSk7XG4gICAgICBDLnByb3RvdHlwZSA9IHByb3RvO1xuICAgICAgcHJvdG8uY29uc3RydWN0b3IgPSBDO1xuICAgIH1cbiAgICBpZihUSFJPV1NfT05fUFJJTUlUSVZFUyB8fCBCVUdHWV9aRVJPKXtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuICAgIGlmKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpZml4TWV0aG9kKEFEREVSKTtcbiAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIHNob3VsZCBub3QgY29udGFpbnMgLmNsZWFyIG1ldGhvZFxuICAgIGlmKElTX1dFQUsgJiYgcHJvdG8uY2xlYXIpZGVsZXRlIHByb3RvLmNsZWFyO1xuICB9XG5cbiAgc2V0VG9TdHJpbmdUYWcoQywgTkFNRSk7XG5cbiAgT1tOQU1FXSA9IEM7XG4gICRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogKEMgIT0gQmFzZSksIE8pO1xuXG4gIGlmKCFJU19XRUFLKWNvbW1vbi5zZXRTdHJvbmcoQywgTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24uanNcbiAqKiBtb2R1bGUgaWQgPSAyMTNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJvbmcgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXN0cm9uZycpO1xuXG4vLyAyMy4yIFNldCBPYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKSgnU2V0JywgZnVuY3Rpb24oZ2V0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIFNldCgpeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMi4zLjEgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKXtcbiAgICByZXR1cm4gc3Ryb25nLmRlZih0aGlzLCB2YWx1ZSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlLCB2YWx1ZSk7XG4gIH1cbn0sIHN0cm9uZyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnNldC5qc1xuICoqIG1vZHVsZSBpZCA9IDIxNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGVhY2ggICAgICAgICA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgwKVxuICAsIHJlZGVmaW5lICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBtZXRhICAgICAgICAgPSByZXF1aXJlKCcuL19tZXRhJylcbiAgLCBhc3NpZ24gICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJylcbiAgLCB3ZWFrICAgICAgICAgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXdlYWsnKVxuICAsIGlzT2JqZWN0ICAgICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgaGFzICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBnZXRXZWFrICAgICAgPSBtZXRhLmdldFdlYWtcbiAgLCBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlXG4gICwgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IHdlYWsudWZzdG9yZVxuICAsIHRtcCAgICAgICAgICA9IHt9XG4gICwgSW50ZXJuYWxNYXA7XG5cbnZhciB3cmFwcGVyID0gZnVuY3Rpb24oZ2V0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdlYWtNYXAoKXtcbiAgICByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgfTtcbn07XG5cbnZhciBtZXRob2RzID0ge1xuICAvLyAyMy4zLjMuMyBXZWFrTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpe1xuICAgIGlmKGlzT2JqZWN0KGtleSkpe1xuICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrKGtleSk7XG4gICAgICBpZihkYXRhID09PSB0cnVlKXJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHRoaXMpLmdldChrZXkpO1xuICAgICAgcmV0dXJuIGRhdGEgPyBkYXRhW3RoaXMuX2ldIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfSxcbiAgLy8gMjMuMy4zLjUgV2Vha01hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpe1xuICAgIHJldHVybiB3ZWFrLmRlZih0aGlzLCBrZXksIHZhbHVlKTtcbiAgfVxufTtcblxuLy8gMjMuMyBXZWFrTWFwIE9iamVjdHNcbnZhciAkV2Vha01hcCA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKCdXZWFrTWFwJywgd3JhcHBlciwgbWV0aG9kcywgd2VhaywgdHJ1ZSwgdHJ1ZSk7XG5cbi8vIElFMTEgV2Vha01hcCBmcm96ZW4ga2V5cyBmaXhcbmlmKG5ldyAkV2Vha01hcCgpLnNldCgoT2JqZWN0LmZyZWV6ZSB8fCBPYmplY3QpKHRtcCksIDcpLmdldCh0bXApICE9IDcpe1xuICBJbnRlcm5hbE1hcCA9IHdlYWsuZ2V0Q29uc3RydWN0b3Iod3JhcHBlcik7XG4gIGFzc2lnbihJbnRlcm5hbE1hcC5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICBtZXRhLk5FRUQgPSB0cnVlO1xuICBlYWNoKFsnZGVsZXRlJywgJ2hhcycsICdnZXQnLCAnc2V0J10sIGZ1bmN0aW9uKGtleSl7XG4gICAgdmFyIHByb3RvICA9ICRXZWFrTWFwLnByb3RvdHlwZVxuICAgICAgLCBtZXRob2QgPSBwcm90b1trZXldO1xuICAgIHJlZGVmaW5lKHByb3RvLCBrZXksIGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgLy8gc3RvcmUgZnJvemVuIG9iamVjdHMgb24gaW50ZXJuYWwgd2Vha21hcCBzaGltXG4gICAgICBpZihpc09iamVjdChhKSAmJiAhaXNFeHRlbnNpYmxlKGEpKXtcbiAgICAgICAgaWYoIXRoaXMuX2YpdGhpcy5fZiA9IG5ldyBJbnRlcm5hbE1hcDtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2Zba2V5XShhLCBiKTtcbiAgICAgICAgcmV0dXJuIGtleSA9PSAnc2V0JyA/IHRoaXMgOiByZXN1bHQ7XG4gICAgICAvLyBzdG9yZSBhbGwgdGhlIHJlc3Qgb24gbmF0aXZlIHdlYWttYXBcbiAgICAgIH0gcmV0dXJuIG1ldGhvZC5jYWxsKHRoaXMsIGEsIGIpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYud2Vhay1tYXAuanNcbiAqKiBtb2R1bGUgaWQgPSAyMTVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciByZWRlZmluZUFsbCAgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpXG4gICwgZ2V0V2VhayAgICAgICAgICAgPSByZXF1aXJlKCcuL19tZXRhJykuZ2V0V2Vha1xuICAsIGFuT2JqZWN0ICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBpc09iamVjdCAgICAgICAgICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgYW5JbnN0YW5jZSAgICAgICAgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpXG4gICwgZm9yT2YgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19mb3Itb2YnKVxuICAsIGNyZWF0ZUFycmF5TWV0aG9kID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpXG4gICwgJGhhcyAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIGFycmF5RmluZCAgICAgICAgID0gY3JlYXRlQXJyYXlNZXRob2QoNSlcbiAgLCBhcnJheUZpbmRJbmRleCAgICA9IGNyZWF0ZUFycmF5TWV0aG9kKDYpXG4gICwgaWQgICAgICAgICAgICAgICAgPSAwO1xuXG4vLyBmYWxsYmFjayBmb3IgdW5jYXVnaHQgZnJvemVuIGtleXNcbnZhciB1bmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24odGhhdCl7XG4gIHJldHVybiB0aGF0Ll9sIHx8ICh0aGF0Ll9sID0gbmV3IFVuY2F1Z2h0RnJvemVuU3RvcmUpO1xufTtcbnZhciBVbmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24oKXtcbiAgdGhpcy5hID0gW107XG59O1xudmFyIGZpbmRVbmNhdWdodEZyb3plbiA9IGZ1bmN0aW9uKHN0b3JlLCBrZXkpe1xuICByZXR1cm4gYXJyYXlGaW5kKHN0b3JlLmEsIGZ1bmN0aW9uKGl0KXtcbiAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgfSk7XG59O1xuVW5jYXVnaHRGcm96ZW5TdG9yZS5wcm90b3R5cGUgPSB7XG4gIGdldDogZnVuY3Rpb24oa2V5KXtcbiAgICB2YXIgZW50cnkgPSBmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgICBpZihlbnRyeSlyZXR1cm4gZW50cnlbMV07XG4gIH0sXG4gIGhhczogZnVuY3Rpb24oa2V5KXtcbiAgICByZXR1cm4gISFmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKXtcbiAgICB2YXIgZW50cnkgPSBmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgICBpZihlbnRyeSllbnRyeVsxXSA9IHZhbHVlO1xuICAgIGVsc2UgdGhpcy5hLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSxcbiAgJ2RlbGV0ZSc6IGZ1bmN0aW9uKGtleSl7XG4gICAgdmFyIGluZGV4ID0gYXJyYXlGaW5kSW5kZXgodGhpcy5hLCBmdW5jdGlvbihpdCl7XG4gICAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgICB9KTtcbiAgICBpZih+aW5kZXgpdGhpcy5hLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuICEhfmluZGV4O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpe1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbih0aGF0LCBpdGVyYWJsZSl7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIEMsIE5BTUUsICdfaScpO1xuICAgICAgdGhhdC5faSA9IGlkKys7ICAgICAgLy8gY29sbGVjdGlvbiBpZFxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgLy8gbGVhayBzdG9yZSBmb3IgdW5jYXVnaHQgZnJvemVuIG9iamVjdHNcbiAgICAgIGlmKGl0ZXJhYmxlICE9IHVuZGVmaW5lZClmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0aGF0W0FEREVSXSwgdGhhdCk7XG4gICAgfSk7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHtcbiAgICAgIC8vIDIzLjMuMy4yIFdlYWtNYXAucHJvdG90eXBlLmRlbGV0ZShrZXkpXG4gICAgICAvLyAyMy40LjMuMyBXZWFrU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24oa2V5KXtcbiAgICAgICAgaWYoIWlzT2JqZWN0KGtleSkpcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgICAgaWYoZGF0YSA9PT0gdHJ1ZSlyZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh0aGlzKVsnZGVsZXRlJ10oa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCB0aGlzLl9pKSAmJiBkZWxldGUgZGF0YVt0aGlzLl9pXTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4zLjMuNCBXZWFrTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuNC4zLjQgV2Vha1NldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KXtcbiAgICAgICAgaWYoIWlzT2JqZWN0KGtleSkpcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgICAgaWYoZGF0YSA9PT0gdHJ1ZSlyZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh0aGlzKS5oYXMoa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCB0aGlzLl9pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbih0aGF0LCBrZXksIHZhbHVlKXtcbiAgICB2YXIgZGF0YSA9IGdldFdlYWsoYW5PYmplY3Qoa2V5KSwgdHJ1ZSk7XG4gICAgaWYoZGF0YSA9PT0gdHJ1ZSl1bmNhdWdodEZyb3plblN0b3JlKHRoYXQpLnNldChrZXksIHZhbHVlKTtcbiAgICBlbHNlIGRhdGFbdGhhdC5faV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhhdDtcbiAgfSxcbiAgdWZzdG9yZTogdW5jYXVnaHRGcm96ZW5TdG9yZVxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi13ZWFrLmpzXG4gKiogbW9kdWxlIGlkID0gMjE2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgd2VhayA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24td2VhaycpO1xuXG4vLyAyMy40IFdlYWtTZXQgT2JqZWN0c1xucmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKCdXZWFrU2V0JywgZnVuY3Rpb24oZ2V0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdlYWtTZXQoKXsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjQuMy4xIFdlYWtTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlcbiAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpe1xuICAgIHJldHVybiB3ZWFrLmRlZih0aGlzLCB2YWx1ZSwgdHJ1ZSk7XG4gIH1cbn0sIHdlYWssIGZhbHNlLCB0cnVlKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYud2Vhay1zZXQuanNcbiAqKiBtb2R1bGUgaWQgPSAyMTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsICR0eXBlZCAgICAgICA9IHJlcXVpcmUoJy4vX3R5cGVkJylcbiAgLCBidWZmZXIgICAgICAgPSByZXF1aXJlKCcuL190eXBlZC1idWZmZXInKVxuICAsIGFuT2JqZWN0ICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgdG9JbmRleCAgICAgID0gcmVxdWlyZSgnLi9fdG8taW5kZXgnKVxuICAsIHRvTGVuZ3RoICAgICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgaXNPYmplY3QgICAgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBUWVBFRF9BUlJBWSAgPSByZXF1aXJlKCcuL193a3MnKSgndHlwZWRfYXJyYXknKVxuICAsIEFycmF5QnVmZmVyICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLkFycmF5QnVmZmVyXG4gICwgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpXG4gICwgJEFycmF5QnVmZmVyID0gYnVmZmVyLkFycmF5QnVmZmVyXG4gICwgJERhdGFWaWV3ICAgID0gYnVmZmVyLkRhdGFWaWV3XG4gICwgJGlzVmlldyAgICAgID0gJHR5cGVkLkFCViAmJiBBcnJheUJ1ZmZlci5pc1ZpZXdcbiAgLCAkc2xpY2UgICAgICAgPSAkQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlXG4gICwgVklFVyAgICAgICAgID0gJHR5cGVkLlZJRVdcbiAgLCBBUlJBWV9CVUZGRVIgPSAnQXJyYXlCdWZmZXInO1xuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqIChBcnJheUJ1ZmZlciAhPT0gJEFycmF5QnVmZmVyKSwge0FycmF5QnVmZmVyOiAkQXJyYXlCdWZmZXJ9KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhJHR5cGVkLkNPTlNUUiwgQVJSQVlfQlVGRkVSLCB7XG4gIC8vIDI0LjEuMy4xIEFycmF5QnVmZmVyLmlzVmlldyhhcmcpXG4gIGlzVmlldzogZnVuY3Rpb24gaXNWaWV3KGl0KXtcbiAgICByZXR1cm4gJGlzVmlldyAmJiAkaXNWaWV3KGl0KSB8fCBpc09iamVjdChpdCkgJiYgVklFVyBpbiBpdDtcbiAgfVxufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5VICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gIW5ldyAkQXJyYXlCdWZmZXIoMikuc2xpY2UoMSwgdW5kZWZpbmVkKS5ieXRlTGVuZ3RoO1xufSksIEFSUkFZX0JVRkZFUiwge1xuICAvLyAyNC4xLjQuMyBBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2Uoc3RhcnQsIGVuZClcbiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpe1xuICAgIGlmKCRzbGljZSAhPT0gdW5kZWZpbmVkICYmIGVuZCA9PT0gdW5kZWZpbmVkKXJldHVybiAkc2xpY2UuY2FsbChhbk9iamVjdCh0aGlzKSwgc3RhcnQpOyAvLyBGRiBmaXhcbiAgICB2YXIgbGVuICAgID0gYW5PYmplY3QodGhpcykuYnl0ZUxlbmd0aFxuICAgICAgLCBmaXJzdCAgPSB0b0luZGV4KHN0YXJ0LCBsZW4pXG4gICAgICAsIGZpbmFsICA9IHRvSW5kZXgoZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiBlbmQsIGxlbilcbiAgICAgICwgcmVzdWx0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJEFycmF5QnVmZmVyKSkodG9MZW5ndGgoZmluYWwgLSBmaXJzdCkpXG4gICAgICAsIHZpZXdTICA9IG5ldyAkRGF0YVZpZXcodGhpcylcbiAgICAgICwgdmlld1QgID0gbmV3ICREYXRhVmlldyhyZXN1bHQpXG4gICAgICAsIGluZGV4ICA9IDA7XG4gICAgd2hpbGUoZmlyc3QgPCBmaW5hbCl7XG4gICAgICB2aWV3VC5zZXRVaW50OChpbmRleCsrLCB2aWV3Uy5nZXRVaW50OChmaXJzdCsrKSk7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcblxucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKShBUlJBWV9CVUZGRVIpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5hcnJheS1idWZmZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAyMThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGhpZGUgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIHVpZCAgICA9IHJlcXVpcmUoJy4vX3VpZCcpXG4gICwgVFlQRUQgID0gdWlkKCd0eXBlZF9hcnJheScpXG4gICwgVklFVyAgID0gdWlkKCd2aWV3JylcbiAgLCBBQlYgICAgPSAhIShnbG9iYWwuQXJyYXlCdWZmZXIgJiYgZ2xvYmFsLkRhdGFWaWV3KVxuICAsIENPTlNUUiA9IEFCVlxuICAsIGkgPSAwLCBsID0gOSwgVHlwZWQ7XG5cbnZhciBUeXBlZEFycmF5Q29uc3RydWN0b3JzID0gKFxuICAnSW50OEFycmF5LFVpbnQ4QXJyYXksVWludDhDbGFtcGVkQXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXknXG4pLnNwbGl0KCcsJyk7XG5cbndoaWxlKGkgPCBsKXtcbiAgaWYoVHlwZWQgPSBnbG9iYWxbVHlwZWRBcnJheUNvbnN0cnVjdG9yc1tpKytdXSl7XG4gICAgaGlkZShUeXBlZC5wcm90b3R5cGUsIFRZUEVELCB0cnVlKTtcbiAgICBoaWRlKFR5cGVkLnByb3RvdHlwZSwgVklFVywgdHJ1ZSk7XG4gIH0gZWxzZSBDT05TVFIgPSBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEFCVjogICAgQUJWLFxuICBDT05TVFI6IENPTlNUUixcbiAgVFlQRUQ6ICBUWVBFRCxcbiAgVklFVzogICBWSUVXXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL190eXBlZC5qc1xuICoqIG1vZHVsZSBpZCA9IDIxOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBERVNDUklQVE9SUyAgICA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJylcbiAgLCBMSUJSQVJZICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAsICR0eXBlZCAgICAgICAgID0gcmVxdWlyZSgnLi9fdHlwZWQnKVxuICAsIGhpZGUgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgcmVkZWZpbmVBbGwgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKVxuICAsIGZhaWxzICAgICAgICAgID0gcmVxdWlyZSgnLi9fZmFpbHMnKVxuICAsIGFuSW5zdGFuY2UgICAgID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKVxuICAsIHRvSW50ZWdlciAgICAgID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgdG9MZW5ndGggICAgICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIGdPUE4gICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mXG4gICwgZFAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgYXJyYXlGaWxsICAgICAgPSByZXF1aXJlKCcuL19hcnJheS1maWxsJylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJylcbiAgLCBBUlJBWV9CVUZGRVIgICA9ICdBcnJheUJ1ZmZlcidcbiAgLCBEQVRBX1ZJRVcgICAgICA9ICdEYXRhVmlldydcbiAgLCBQUk9UT1RZUEUgICAgICA9ICdwcm90b3R5cGUnXG4gICwgV1JPTkdfTEVOR1RIICAgPSAnV3JvbmcgbGVuZ3RoISdcbiAgLCBXUk9OR19JTkRFWCAgICA9ICdXcm9uZyBpbmRleCEnXG4gICwgJEFycmF5QnVmZmVyICAgPSBnbG9iYWxbQVJSQVlfQlVGRkVSXVxuICAsICREYXRhVmlldyAgICAgID0gZ2xvYmFsW0RBVEFfVklFV11cbiAgLCBNYXRoICAgICAgICAgICA9IGdsb2JhbC5NYXRoXG4gICwgcGFyc2VJbnQgICAgICAgPSBnbG9iYWwucGFyc2VJbnRcbiAgLCBSYW5nZUVycm9yICAgICA9IGdsb2JhbC5SYW5nZUVycm9yXG4gICwgSW5maW5pdHkgICAgICAgPSBnbG9iYWwuSW5maW5pdHlcbiAgLCBCYXNlQnVmZmVyICAgICA9ICRBcnJheUJ1ZmZlclxuICAsIGFicyAgICAgICAgICAgID0gTWF0aC5hYnNcbiAgLCBwb3cgICAgICAgICAgICA9IE1hdGgucG93XG4gICwgbWluICAgICAgICAgICAgPSBNYXRoLm1pblxuICAsIGZsb29yICAgICAgICAgID0gTWF0aC5mbG9vclxuICAsIGxvZyAgICAgICAgICAgID0gTWF0aC5sb2dcbiAgLCBMTjIgICAgICAgICAgICA9IE1hdGguTE4yXG4gICwgQlVGRkVSICAgICAgICAgPSAnYnVmZmVyJ1xuICAsIEJZVEVfTEVOR1RIICAgID0gJ2J5dGVMZW5ndGgnXG4gICwgQllURV9PRkZTRVQgICAgPSAnYnl0ZU9mZnNldCdcbiAgLCAkQlVGRkVSICAgICAgICA9IERFU0NSSVBUT1JTID8gJ19iJyA6IEJVRkZFUlxuICAsICRMRU5HVEggICAgICAgID0gREVTQ1JJUFRPUlMgPyAnX2wnIDogQllURV9MRU5HVEhcbiAgLCAkT0ZGU0VUICAgICAgICA9IERFU0NSSVBUT1JTID8gJ19vJyA6IEJZVEVfT0ZGU0VUO1xuXG4vLyBJRUVFNzU0IGNvbnZlcnNpb25zIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvaWVlZTc1NFxudmFyIHBhY2tJRUVFNzU0ID0gZnVuY3Rpb24odmFsdWUsIG1MZW4sIG5CeXRlcyl7XG4gIHZhciBidWZmZXIgPSBBcnJheShuQnl0ZXMpXG4gICAgLCBlTGVuICAgPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgICAsIGVNYXggICA9ICgxIDw8IGVMZW4pIC0gMVxuICAgICwgZUJpYXMgID0gZU1heCA+PiAxXG4gICAgLCBydCAgICAgPSBtTGVuID09PSAyMyA/IHBvdygyLCAtMjQpIC0gcG93KDIsIC03NykgOiAwXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCBzICAgICAgPSB2YWx1ZSA8IDAgfHwgdmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCA/IDEgOiAwXG4gICAgLCBlLCBtLCBjO1xuICB2YWx1ZSA9IGFicyh2YWx1ZSlcbiAgaWYodmFsdWUgIT0gdmFsdWUgfHwgdmFsdWUgPT09IEluZmluaXR5KXtcbiAgICBtID0gdmFsdWUgIT0gdmFsdWUgPyAxIDogMDtcbiAgICBlID0gZU1heDtcbiAgfSBlbHNlIHtcbiAgICBlID0gZmxvb3IobG9nKHZhbHVlKSAvIExOMik7XG4gICAgaWYodmFsdWUgKiAoYyA9IHBvdygyLCAtZSkpIDwgMSl7XG4gICAgICBlLS07XG4gICAgICBjICo9IDI7XG4gICAgfVxuICAgIGlmKGUgKyBlQmlhcyA+PSAxKXtcbiAgICAgIHZhbHVlICs9IHJ0IC8gYztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBwb3coMiwgMSAtIGVCaWFzKTtcbiAgICB9XG4gICAgaWYodmFsdWUgKiBjID49IDIpe1xuICAgICAgZSsrO1xuICAgICAgYyAvPSAyO1xuICAgIH1cbiAgICBpZihlICsgZUJpYXMgPj0gZU1heCl7XG4gICAgICBtID0gMDtcbiAgICAgIGUgPSBlTWF4O1xuICAgIH0gZWxzZSBpZihlICsgZUJpYXMgPj0gMSl7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogcG93KDIsIG1MZW4pO1xuICAgICAgZSA9IGUgKyBlQmlhcztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogcG93KDIsIGVCaWFzIC0gMSkgKiBwb3coMiwgbUxlbik7XG4gICAgICBlID0gMDtcbiAgICB9XG4gIH1cbiAgZm9yKDsgbUxlbiA+PSA4OyBidWZmZXJbaSsrXSA9IG0gJiAyNTUsIG0gLz0gMjU2LCBtTGVuIC09IDgpO1xuICBlID0gZSA8PCBtTGVuIHwgbTtcbiAgZUxlbiArPSBtTGVuO1xuICBmb3IoOyBlTGVuID4gMDsgYnVmZmVyW2krK10gPSBlICYgMjU1LCBlIC89IDI1NiwgZUxlbiAtPSA4KTtcbiAgYnVmZmVyWy0taV0gfD0gcyAqIDEyODtcbiAgcmV0dXJuIGJ1ZmZlcjtcbn07XG52YXIgdW5wYWNrSUVFRTc1NCA9IGZ1bmN0aW9uKGJ1ZmZlciwgbUxlbiwgbkJ5dGVzKXtcbiAgdmFyIGVMZW4gID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gICAgLCBlTWF4ICA9ICgxIDw8IGVMZW4pIC0gMVxuICAgICwgZUJpYXMgPSBlTWF4ID4+IDFcbiAgICAsIG5CaXRzID0gZUxlbiAtIDdcbiAgICAsIGkgICAgID0gbkJ5dGVzIC0gMVxuICAgICwgcyAgICAgPSBidWZmZXJbaS0tXVxuICAgICwgZSAgICAgPSBzICYgMTI3XG4gICAgLCBtO1xuICBzID4+PSA3O1xuICBmb3IoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW2ldLCBpLS0sIG5CaXRzIC09IDgpO1xuICBtID0gZSAmICgxIDw8IC1uQml0cykgLSAxO1xuICBlID4+PSAtbkJpdHM7XG4gIG5CaXRzICs9IG1MZW47XG4gIGZvcig7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXJbaV0sIGktLSwgbkJpdHMgLT0gOCk7XG4gIGlmKGUgPT09IDApe1xuICAgIGUgPSAxIC0gZUJpYXM7XG4gIH0gZWxzZSBpZihlID09PSBlTWF4KXtcbiAgICByZXR1cm4gbSA/IE5hTiA6IHMgPyAtSW5maW5pdHkgOiBJbmZpbml0eTtcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIHBvdygyLCBtTGVuKTtcbiAgICBlID0gZSAtIGVCaWFzO1xuICB9IHJldHVybiAocyA/IC0xIDogMSkgKiBtICogcG93KDIsIGUgLSBtTGVuKTtcbn07XG5cbnZhciB1bnBhY2tJMzIgPSBmdW5jdGlvbihieXRlcyl7XG4gIHJldHVybiBieXRlc1szXSA8PCAyNCB8IGJ5dGVzWzJdIDw8IDE2IHwgYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdO1xufTtcbnZhciBwYWNrSTggPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBbaXQgJiAweGZmXTtcbn07XG52YXIgcGFja0kxNiA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIFtpdCAmIDB4ZmYsIGl0ID4+IDggJiAweGZmXTtcbn07XG52YXIgcGFja0kzMiA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIFtpdCAmIDB4ZmYsIGl0ID4+IDggJiAweGZmLCBpdCA+PiAxNiAmIDB4ZmYsIGl0ID4+IDI0ICYgMHhmZl07XG59O1xudmFyIHBhY2tGNjQgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBwYWNrSUVFRTc1NChpdCwgNTIsIDgpO1xufTtcbnZhciBwYWNrRjMyID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gcGFja0lFRUU3NTQoaXQsIDIzLCA0KTtcbn07XG5cbnZhciBhZGRHZXR0ZXIgPSBmdW5jdGlvbihDLCBrZXksIGludGVybmFsKXtcbiAgZFAoQ1tQUk9UT1RZUEVdLCBrZXksIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzW2ludGVybmFsXTsgfX0pO1xufTtcblxudmFyIGdldCA9IGZ1bmN0aW9uKHZpZXcsIGJ5dGVzLCBpbmRleCwgaXNMaXR0bGVFbmRpYW4pe1xuICB2YXIgbnVtSW5kZXggPSAraW5kZXhcbiAgICAsIGludEluZGV4ID0gdG9JbnRlZ2VyKG51bUluZGV4KTtcbiAgaWYobnVtSW5kZXggIT0gaW50SW5kZXggfHwgaW50SW5kZXggPCAwIHx8IGludEluZGV4ICsgYnl0ZXMgPiB2aWV3WyRMRU5HVEhdKXRocm93IFJhbmdlRXJyb3IoV1JPTkdfSU5ERVgpO1xuICB2YXIgc3RvcmUgPSB2aWV3WyRCVUZGRVJdLl9iXG4gICAgLCBzdGFydCA9IGludEluZGV4ICsgdmlld1skT0ZGU0VUXVxuICAgICwgcGFjayAgPSBzdG9yZS5zbGljZShzdGFydCwgc3RhcnQgKyBieXRlcyk7XG4gIHJldHVybiBpc0xpdHRsZUVuZGlhbiA/IHBhY2sgOiBwYWNrLnJldmVyc2UoKTtcbn07XG52YXIgc2V0ID0gZnVuY3Rpb24odmlldywgYnl0ZXMsIGluZGV4LCBjb252ZXJzaW9uLCB2YWx1ZSwgaXNMaXR0bGVFbmRpYW4pe1xuICB2YXIgbnVtSW5kZXggPSAraW5kZXhcbiAgICAsIGludEluZGV4ID0gdG9JbnRlZ2VyKG51bUluZGV4KTtcbiAgaWYobnVtSW5kZXggIT0gaW50SW5kZXggfHwgaW50SW5kZXggPCAwIHx8IGludEluZGV4ICsgYnl0ZXMgPiB2aWV3WyRMRU5HVEhdKXRocm93IFJhbmdlRXJyb3IoV1JPTkdfSU5ERVgpO1xuICB2YXIgc3RvcmUgPSB2aWV3WyRCVUZGRVJdLl9iXG4gICAgLCBzdGFydCA9IGludEluZGV4ICsgdmlld1skT0ZGU0VUXVxuICAgICwgcGFjayAgPSBjb252ZXJzaW9uKCt2YWx1ZSk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBieXRlczsgaSsrKXN0b3JlW3N0YXJ0ICsgaV0gPSBwYWNrW2lzTGl0dGxlRW5kaWFuID8gaSA6IGJ5dGVzIC0gaSAtIDFdO1xufTtcblxudmFyIHZhbGlkYXRlQXJyYXlCdWZmZXJBcmd1bWVudHMgPSBmdW5jdGlvbih0aGF0LCBsZW5ndGgpe1xuICBhbkluc3RhbmNlKHRoYXQsICRBcnJheUJ1ZmZlciwgQVJSQVlfQlVGRkVSKTtcbiAgdmFyIG51bWJlckxlbmd0aCA9ICtsZW5ndGhcbiAgICAsIGJ5dGVMZW5ndGggICA9IHRvTGVuZ3RoKG51bWJlckxlbmd0aCk7XG4gIGlmKG51bWJlckxlbmd0aCAhPSBieXRlTGVuZ3RoKXRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgcmV0dXJuIGJ5dGVMZW5ndGg7XG59O1xuXG5pZighJHR5cGVkLkFCVil7XG4gICRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIEFycmF5QnVmZmVyKGxlbmd0aCl7XG4gICAgdmFyIGJ5dGVMZW5ndGggPSB2YWxpZGF0ZUFycmF5QnVmZmVyQXJndW1lbnRzKHRoaXMsIGxlbmd0aCk7XG4gICAgdGhpcy5fYiAgICAgICA9IGFycmF5RmlsbC5jYWxsKEFycmF5KGJ5dGVMZW5ndGgpLCAwKTtcbiAgICB0aGlzWyRMRU5HVEhdID0gYnl0ZUxlbmd0aDtcbiAgfTtcblxuICAkRGF0YVZpZXcgPSBmdW5jdGlvbiBEYXRhVmlldyhidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpe1xuICAgIGFuSW5zdGFuY2UodGhpcywgJERhdGFWaWV3LCBEQVRBX1ZJRVcpO1xuICAgIGFuSW5zdGFuY2UoYnVmZmVyLCAkQXJyYXlCdWZmZXIsIERBVEFfVklFVyk7XG4gICAgdmFyIGJ1ZmZlckxlbmd0aCA9IGJ1ZmZlclskTEVOR1RIXVxuICAgICAgLCBvZmZzZXQgICAgICAgPSB0b0ludGVnZXIoYnl0ZU9mZnNldCk7XG4gICAgaWYob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXJMZW5ndGgpdGhyb3cgUmFuZ2VFcnJvcignV3Jvbmcgb2Zmc2V0IScpO1xuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID09PSB1bmRlZmluZWQgPyBidWZmZXJMZW5ndGggLSBvZmZzZXQgOiB0b0xlbmd0aChieXRlTGVuZ3RoKTtcbiAgICBpZihvZmZzZXQgKyBieXRlTGVuZ3RoID4gYnVmZmVyTGVuZ3RoKXRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICB0aGlzWyRCVUZGRVJdID0gYnVmZmVyO1xuICAgIHRoaXNbJE9GRlNFVF0gPSBvZmZzZXQ7XG4gICAgdGhpc1skTEVOR1RIXSA9IGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgaWYoREVTQ1JJUFRPUlMpe1xuICAgIGFkZEdldHRlcigkQXJyYXlCdWZmZXIsIEJZVEVfTEVOR1RILCAnX2wnKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCBCVUZGRVIsICdfYicpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsIEJZVEVfTEVOR1RILCAnX2wnKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCBCWVRFX09GRlNFVCwgJ19vJyk7XG4gIH1cblxuICByZWRlZmluZUFsbCgkRGF0YVZpZXdbUFJPVE9UWVBFXSwge1xuICAgIGdldEludDg6IGZ1bmN0aW9uIGdldEludDgoYnl0ZU9mZnNldCl7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQpWzBdIDw8IDI0ID4+IDI0O1xuICAgIH0sXG4gICAgZ2V0VWludDg6IGZ1bmN0aW9uIGdldFVpbnQ4KGJ5dGVPZmZzZXQpe1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCAxLCBieXRlT2Zmc2V0KVswXTtcbiAgICB9LFxuICAgIGdldEludDE2OiBmdW5jdGlvbiBnZXRJbnQxNihieXRlT2Zmc2V0IC8qLCBsaXR0bGVFbmRpYW4gKi8pe1xuICAgICAgdmFyIGJ5dGVzID0gZ2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSk7XG4gICAgICByZXR1cm4gKGJ5dGVzWzFdIDw8IDggfCBieXRlc1swXSkgPDwgMTYgPj4gMTY7XG4gICAgfSxcbiAgICBnZXRVaW50MTY6IGZ1bmN0aW9uIGdldFVpbnQxNihieXRlT2Zmc2V0IC8qLCBsaXR0bGVFbmRpYW4gKi8pe1xuICAgICAgdmFyIGJ5dGVzID0gZ2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSk7XG4gICAgICByZXR1cm4gYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdO1xuICAgIH0sXG4gICAgZ2V0SW50MzI6IGZ1bmN0aW9uIGdldEludDMyKGJ5dGVPZmZzZXQgLyosIGxpdHRsZUVuZGlhbiAqLyl7XG4gICAgICByZXR1cm4gdW5wYWNrSTMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pKTtcbiAgICB9LFxuICAgIGdldFVpbnQzMjogZnVuY3Rpb24gZ2V0VWludDMyKGJ5dGVPZmZzZXQgLyosIGxpdHRsZUVuZGlhbiAqLyl7XG4gICAgICByZXR1cm4gdW5wYWNrSTMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pKSA+Pj4gMDtcbiAgICB9LFxuICAgIGdldEZsb2F0MzI6IGZ1bmN0aW9uIGdldEZsb2F0MzIoYnl0ZU9mZnNldCAvKiwgbGl0dGxlRW5kaWFuICovKXtcbiAgICAgIHJldHVybiB1bnBhY2tJRUVFNzU0KGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pLCAyMywgNCk7XG4gICAgfSxcbiAgICBnZXRGbG9hdDY0OiBmdW5jdGlvbiBnZXRGbG9hdDY0KGJ5dGVPZmZzZXQgLyosIGxpdHRsZUVuZGlhbiAqLyl7XG4gICAgICByZXR1cm4gdW5wYWNrSUVFRTc1NChnZXQodGhpcywgOCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSwgNTIsIDgpO1xuICAgIH0sXG4gICAgc2V0SW50ODogZnVuY3Rpb24gc2V0SW50OChieXRlT2Zmc2V0LCB2YWx1ZSl7XG4gICAgICBzZXQodGhpcywgMSwgYnl0ZU9mZnNldCwgcGFja0k4LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZXRVaW50ODogZnVuY3Rpb24gc2V0VWludDgoYnl0ZU9mZnNldCwgdmFsdWUpe1xuICAgICAgc2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQsIHBhY2tJOCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0SW50MTY6IGZ1bmN0aW9uIHNldEludDE2KGJ5dGVPZmZzZXQsIHZhbHVlIC8qLCBsaXR0bGVFbmRpYW4gKi8pe1xuICAgICAgc2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIHBhY2tJMTYsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0VWludDE2OiBmdW5jdGlvbiBzZXRVaW50MTYoYnl0ZU9mZnNldCwgdmFsdWUgLyosIGxpdHRsZUVuZGlhbiAqLyl7XG4gICAgICBzZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgcGFja0kxNiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRJbnQzMjogZnVuY3Rpb24gc2V0SW50MzIoYnl0ZU9mZnNldCwgdmFsdWUgLyosIGxpdHRsZUVuZGlhbiAqLyl7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0kzMiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRVaW50MzI6IGZ1bmN0aW9uIHNldFVpbnQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiwgbGl0dGxlRW5kaWFuICovKXtcbiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrSTMyLCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldEZsb2F0MzI6IGZ1bmN0aW9uIHNldEZsb2F0MzIoYnl0ZU9mZnNldCwgdmFsdWUgLyosIGxpdHRsZUVuZGlhbiAqLyl7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0YzMiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRGbG9hdDY0OiBmdW5jdGlvbiBzZXRGbG9hdDY0KGJ5dGVPZmZzZXQsIHZhbHVlIC8qLCBsaXR0bGVFbmRpYW4gKi8pe1xuICAgICAgc2V0KHRoaXMsIDgsIGJ5dGVPZmZzZXQsIHBhY2tGNjQsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH1cbiAgfSk7XG59IGVsc2Uge1xuICBpZighZmFpbHMoZnVuY3Rpb24oKXtcbiAgICBuZXcgJEFycmF5QnVmZmVyOyAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgfSkgfHwgIWZhaWxzKGZ1bmN0aW9uKCl7XG4gICAgbmV3ICRBcnJheUJ1ZmZlciguNSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gIH0pKXtcbiAgICAkQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiBBcnJheUJ1ZmZlcihsZW5ndGgpe1xuICAgICAgcmV0dXJuIG5ldyBCYXNlQnVmZmVyKHZhbGlkYXRlQXJyYXlCdWZmZXJBcmd1bWVudHModGhpcywgbGVuZ3RoKSk7XG4gICAgfTtcbiAgICB2YXIgQXJyYXlCdWZmZXJQcm90byA9ICRBcnJheUJ1ZmZlcltQUk9UT1RZUEVdID0gQmFzZUJ1ZmZlcltQUk9UT1RZUEVdO1xuICAgIGZvcih2YXIga2V5cyA9IGdPUE4oQmFzZUJ1ZmZlciksIGogPSAwLCBrZXk7IGtleXMubGVuZ3RoID4gajsgKXtcbiAgICAgIGlmKCEoKGtleSA9IGtleXNbaisrXSkgaW4gJEFycmF5QnVmZmVyKSloaWRlKCRBcnJheUJ1ZmZlciwga2V5LCBCYXNlQnVmZmVyW2tleV0pO1xuICAgIH07XG4gICAgaWYoIUxJQlJBUlkpQXJyYXlCdWZmZXJQcm90by5jb25zdHJ1Y3RvciA9ICRBcnJheUJ1ZmZlcjtcbiAgfVxuICAvLyBpT1MgU2FmYXJpIDcueCBidWdcbiAgdmFyIHZpZXcgPSBuZXcgJERhdGFWaWV3KG5ldyAkQXJyYXlCdWZmZXIoMikpXG4gICAgLCAkc2V0SW50OCA9ICREYXRhVmlld1tQUk9UT1RZUEVdLnNldEludDg7XG4gIHZpZXcuc2V0SW50OCgwLCAyMTQ3NDgzNjQ4KTtcbiAgdmlldy5zZXRJbnQ4KDEsIDIxNDc0ODM2NDkpO1xuICBpZih2aWV3LmdldEludDgoMCkgfHwgIXZpZXcuZ2V0SW50OCgxKSlyZWRlZmluZUFsbCgkRGF0YVZpZXdbUFJPVE9UWVBFXSwge1xuICAgIHNldEludDg6IGZ1bmN0aW9uIHNldEludDgoYnl0ZU9mZnNldCwgdmFsdWUpe1xuICAgICAgJHNldEludDguY2FsbCh0aGlzLCBieXRlT2Zmc2V0LCB2YWx1ZSA8PCAyNCA+PiAyNCk7XG4gICAgfSxcbiAgICBzZXRVaW50ODogZnVuY3Rpb24gc2V0VWludDgoYnl0ZU9mZnNldCwgdmFsdWUpe1xuICAgICAgJHNldEludDguY2FsbCh0aGlzLCBieXRlT2Zmc2V0LCB2YWx1ZSA8PCAyNCA+PiAyNCk7XG4gICAgfVxuICB9LCB0cnVlKTtcbn1cbnNldFRvU3RyaW5nVGFnKCRBcnJheUJ1ZmZlciwgQVJSQVlfQlVGRkVSKTtcbnNldFRvU3RyaW5nVGFnKCREYXRhVmlldywgREFUQV9WSUVXKTtcbmhpZGUoJERhdGFWaWV3W1BST1RPVFlQRV0sICR0eXBlZC5WSUVXLCB0cnVlKTtcbmV4cG9ydHNbQVJSQVlfQlVGRkVSXSA9ICRBcnJheUJ1ZmZlcjtcbmV4cG9ydHNbREFUQV9WSUVXXSA9ICREYXRhVmlldztcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fdHlwZWQtYnVmZmVyLmpzXG4gKiogbW9kdWxlIGlkID0gMjIwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fdHlwZWQnKS5BQlYsIHtcbiAgRGF0YVZpZXc6IHJlcXVpcmUoJy4vX3R5cGVkLWJ1ZmZlcicpLkRhdGFWaWV3XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZGF0YS12aWV3LmpzXG4gKiogbW9kdWxlIGlkID0gMjIxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdJbnQ4JywgMSwgZnVuY3Rpb24oaW5pdCl7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQ4QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKXtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmludDgtYXJyYXkuanNcbiAqKiBtb2R1bGUgaWQgPSAyMjJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcbmlmKHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykpe1xuICB2YXIgTElCUkFSWSAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAgICwgZ2xvYmFsICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICAgLCBmYWlscyAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZmFpbHMnKVxuICAgICwgJGV4cG9ydCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICAgLCAkdHlwZWQgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdHlwZWQnKVxuICAgICwgJGJ1ZmZlciAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3R5cGVkLWJ1ZmZlcicpXG4gICAgLCBjdHggICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgICAsIGFuSW5zdGFuY2UgICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpXG4gICAgLCBwcm9wZXJ0eURlc2MgICAgICAgID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpXG4gICAgLCBoaWRlICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICAgLCByZWRlZmluZUFsbCAgICAgICAgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJylcbiAgICAsIGlzSW50ZWdlciAgICAgICAgICAgPSByZXF1aXJlKCcuL19pcy1pbnRlZ2VyJylcbiAgICAsIHRvSW50ZWdlciAgICAgICAgICAgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgICAsIHRvTGVuZ3RoICAgICAgICAgICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAgICwgdG9JbmRleCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4JylcbiAgICAsIHRvUHJpbWl0aXZlICAgICAgICAgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxuICAgICwgaGFzICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICAgLCBzYW1lICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fc2FtZS12YWx1ZScpXG4gICAgLCBjbGFzc29mICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpXG4gICAgLCBpc09iamVjdCAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgICAsIHRvT2JqZWN0ICAgICAgICAgICAgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAgICwgaXNBcnJheUl0ZXIgICAgICAgICA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKVxuICAgICwgY3JlYXRlICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKVxuICAgICwgZ2V0UHJvdG90eXBlT2YgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKVxuICAgICwgZ09QTiAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZlxuICAgICwgaXNJdGVyYWJsZSAgICAgICAgICA9IHJlcXVpcmUoJy4vY29yZS5pcy1pdGVyYWJsZScpXG4gICAgLCBnZXRJdGVyRm4gICAgICAgICAgID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKVxuICAgICwgdWlkICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpXG4gICAgLCB3a3MgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fd2tzJylcbiAgICAsIGNyZWF0ZUFycmF5TWV0aG9kICAgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJylcbiAgICAsIGNyZWF0ZUFycmF5SW5jbHVkZXMgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpXG4gICAgLCBzcGVjaWVzQ29uc3RydWN0b3IgID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpXG4gICAgLCBBcnJheUl0ZXJhdG9ycyAgICAgID0gcmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKVxuICAgICwgSXRlcmF0b3JzICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICAgLCAkaXRlckRldGVjdCAgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKVxuICAgICwgc2V0U3BlY2llcyAgICAgICAgICA9IHJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJylcbiAgICAsIGFycmF5RmlsbCAgICAgICAgICAgPSByZXF1aXJlKCcuL19hcnJheS1maWxsJylcbiAgICAsIGFycmF5Q29weVdpdGhpbiAgICAgPSByZXF1aXJlKCcuL19hcnJheS1jb3B5LXdpdGhpbicpXG4gICAgLCAkRFAgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgICAsICRHT1BEICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpXG4gICAgLCBkUCAgICAgICAgICAgICAgICAgID0gJERQLmZcbiAgICAsIGdPUEQgICAgICAgICAgICAgICAgPSAkR09QRC5mXG4gICAgLCBSYW5nZUVycm9yICAgICAgICAgID0gZ2xvYmFsLlJhbmdlRXJyb3JcbiAgICAsIFR5cGVFcnJvciAgICAgICAgICAgPSBnbG9iYWwuVHlwZUVycm9yXG4gICAgLCBVaW50OEFycmF5ICAgICAgICAgID0gZ2xvYmFsLlVpbnQ4QXJyYXlcbiAgICAsIEFSUkFZX0JVRkZFUiAgICAgICAgPSAnQXJyYXlCdWZmZXInXG4gICAgLCBTSEFSRURfQlVGRkVSICAgICAgID0gJ1NoYXJlZCcgKyBBUlJBWV9CVUZGRVJcbiAgICAsIEJZVEVTX1BFUl9FTEVNRU5UICAgPSAnQllURVNfUEVSX0VMRU1FTlQnXG4gICAgLCBQUk9UT1RZUEUgICAgICAgICAgID0gJ3Byb3RvdHlwZSdcbiAgICAsIEFycmF5UHJvdG8gICAgICAgICAgPSBBcnJheVtQUk9UT1RZUEVdXG4gICAgLCAkQXJyYXlCdWZmZXIgICAgICAgID0gJGJ1ZmZlci5BcnJheUJ1ZmZlclxuICAgICwgJERhdGFWaWV3ICAgICAgICAgICA9ICRidWZmZXIuRGF0YVZpZXdcbiAgICAsIGFycmF5Rm9yRWFjaCAgICAgICAgPSBjcmVhdGVBcnJheU1ldGhvZCgwKVxuICAgICwgYXJyYXlGaWx0ZXIgICAgICAgICA9IGNyZWF0ZUFycmF5TWV0aG9kKDIpXG4gICAgLCBhcnJheVNvbWUgICAgICAgICAgID0gY3JlYXRlQXJyYXlNZXRob2QoMylcbiAgICAsIGFycmF5RXZlcnkgICAgICAgICAgPSBjcmVhdGVBcnJheU1ldGhvZCg0KVxuICAgICwgYXJyYXlGaW5kICAgICAgICAgICA9IGNyZWF0ZUFycmF5TWV0aG9kKDUpXG4gICAgLCBhcnJheUZpbmRJbmRleCAgICAgID0gY3JlYXRlQXJyYXlNZXRob2QoNilcbiAgICAsIGFycmF5SW5jbHVkZXMgICAgICAgPSBjcmVhdGVBcnJheUluY2x1ZGVzKHRydWUpXG4gICAgLCBhcnJheUluZGV4T2YgICAgICAgID0gY3JlYXRlQXJyYXlJbmNsdWRlcyhmYWxzZSlcbiAgICAsIGFycmF5VmFsdWVzICAgICAgICAgPSBBcnJheUl0ZXJhdG9ycy52YWx1ZXNcbiAgICAsIGFycmF5S2V5cyAgICAgICAgICAgPSBBcnJheUl0ZXJhdG9ycy5rZXlzXG4gICAgLCBhcnJheUVudHJpZXMgICAgICAgID0gQXJyYXlJdGVyYXRvcnMuZW50cmllc1xuICAgICwgYXJyYXlMYXN0SW5kZXhPZiAgICA9IEFycmF5UHJvdG8ubGFzdEluZGV4T2ZcbiAgICAsIGFycmF5UmVkdWNlICAgICAgICAgPSBBcnJheVByb3RvLnJlZHVjZVxuICAgICwgYXJyYXlSZWR1Y2VSaWdodCAgICA9IEFycmF5UHJvdG8ucmVkdWNlUmlnaHRcbiAgICAsIGFycmF5Sm9pbiAgICAgICAgICAgPSBBcnJheVByb3RvLmpvaW5cbiAgICAsIGFycmF5U29ydCAgICAgICAgICAgPSBBcnJheVByb3RvLnNvcnRcbiAgICAsIGFycmF5U2xpY2UgICAgICAgICAgPSBBcnJheVByb3RvLnNsaWNlXG4gICAgLCBhcnJheVRvU3RyaW5nICAgICAgID0gQXJyYXlQcm90by50b1N0cmluZ1xuICAgICwgYXJyYXlUb0xvY2FsZVN0cmluZyA9IEFycmF5UHJvdG8udG9Mb2NhbGVTdHJpbmdcbiAgICAsIElURVJBVE9SICAgICAgICAgICAgPSB3a3MoJ2l0ZXJhdG9yJylcbiAgICAsIFRBRyAgICAgICAgICAgICAgICAgPSB3a3MoJ3RvU3RyaW5nVGFnJylcbiAgICAsIFRZUEVEX0NPTlNUUlVDVE9SICAgPSB1aWQoJ3R5cGVkX2NvbnN0cnVjdG9yJylcbiAgICAsIERFRl9DT05TVFJVQ1RPUiAgICAgPSB1aWQoJ2RlZl9jb25zdHJ1Y3RvcicpXG4gICAgLCBBTExfQ09OU1RSVUNUT1JTICAgID0gJHR5cGVkLkNPTlNUUlxuICAgICwgVFlQRURfQVJSQVkgICAgICAgICA9ICR0eXBlZC5UWVBFRFxuICAgICwgVklFVyAgICAgICAgICAgICAgICA9ICR0eXBlZC5WSUVXXG4gICAgLCBXUk9OR19MRU5HVEggICAgICAgID0gJ1dyb25nIGxlbmd0aCEnO1xuXG4gIHZhciAkbWFwID0gY3JlYXRlQXJyYXlNZXRob2QoMSwgZnVuY3Rpb24oTywgbGVuZ3RoKXtcbiAgICByZXR1cm4gYWxsb2NhdGUoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE9bREVGX0NPTlNUUlVDVE9SXSksIGxlbmd0aCk7XG4gIH0pO1xuXG4gIHZhciBMSVRUTEVfRU5ESUFOID0gZmFpbHMoZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobmV3IFVpbnQxNkFycmF5KFsxXSkuYnVmZmVyKVswXSA9PT0gMTtcbiAgfSk7XG5cbiAgdmFyIEZPUkNFRF9TRVQgPSAhIVVpbnQ4QXJyYXkgJiYgISFVaW50OEFycmF5W1BST1RPVFlQRV0uc2V0ICYmIGZhaWxzKGZ1bmN0aW9uKCl7XG4gICAgbmV3IFVpbnQ4QXJyYXkoMSkuc2V0KHt9KTtcbiAgfSk7XG5cbiAgdmFyIHN0cmljdFRvTGVuZ3RoID0gZnVuY3Rpb24oaXQsIFNBTUUpe1xuICAgIGlmKGl0ID09PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgdmFyIG51bWJlciA9ICtpdFxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChpdCk7XG4gICAgaWYoU0FNRSAmJiAhc2FtZShudW1iZXIsIGxlbmd0aCkpdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgIHJldHVybiBsZW5ndGg7XG4gIH07XG5cbiAgdmFyIHRvT2Zmc2V0ID0gZnVuY3Rpb24oaXQsIEJZVEVTKXtcbiAgICB2YXIgb2Zmc2V0ID0gdG9JbnRlZ2VyKGl0KTtcbiAgICBpZihvZmZzZXQgPCAwIHx8IG9mZnNldCAlIEJZVEVTKXRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCEnKTtcbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9O1xuXG4gIHZhciB2YWxpZGF0ZSA9IGZ1bmN0aW9uKGl0KXtcbiAgICBpZihpc09iamVjdChpdCkgJiYgVFlQRURfQVJSQVkgaW4gaXQpcmV0dXJuIGl0O1xuICAgIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgdHlwZWQgYXJyYXkhJyk7XG4gIH07XG5cbiAgdmFyIGFsbG9jYXRlID0gZnVuY3Rpb24oQywgbGVuZ3RoKXtcbiAgICBpZighKGlzT2JqZWN0KEMpICYmIFRZUEVEX0NPTlNUUlVDVE9SIGluIEMpKXtcbiAgICAgIHRocm93IFR5cGVFcnJvcignSXQgaXMgbm90IGEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3IhJyk7XG4gICAgfSByZXR1cm4gbmV3IEMobGVuZ3RoKTtcbiAgfTtcblxuICB2YXIgc3BlY2llc0Zyb21MaXN0ID0gZnVuY3Rpb24oTywgbGlzdCl7XG4gICAgcmV0dXJuIGZyb21MaXN0KHNwZWNpZXNDb25zdHJ1Y3RvcihPLCBPW0RFRl9DT05TVFJVQ1RPUl0pLCBsaXN0KTtcbiAgfTtcblxuICB2YXIgZnJvbUxpc3QgPSBmdW5jdGlvbihDLCBsaXN0KXtcbiAgICB2YXIgaW5kZXggID0gMFxuICAgICAgLCBsZW5ndGggPSBsaXN0Lmxlbmd0aFxuICAgICAgLCByZXN1bHQgPSBhbGxvY2F0ZShDLCBsZW5ndGgpO1xuICAgIHdoaWxlKGxlbmd0aCA+IGluZGV4KXJlc3VsdFtpbmRleF0gPSBsaXN0W2luZGV4KytdO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uKGl0LCBrZXksIGludGVybmFsKXtcbiAgICBkUChpdCwga2V5LCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gdGhpcy5fZFtpbnRlcm5hbF07IH19KTtcbiAgfTtcblxuICB2YXIgJGZyb20gPSBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiwgbWFwZm4sIHRoaXNBcmcgKi8pe1xuICAgIHZhciBPICAgICAgID0gdG9PYmplY3Qoc291cmNlKVxuICAgICAgLCBhTGVuICAgID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgLCBtYXBmbiAgID0gYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWRcbiAgICAgICwgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWRcbiAgICAgICwgaXRlckZuICA9IGdldEl0ZXJGbihPKVxuICAgICAgLCBpLCBsZW5ndGgsIHZhbHVlcywgcmVzdWx0LCBzdGVwLCBpdGVyYXRvcjtcbiAgICBpZihpdGVyRm4gIT0gdW5kZWZpbmVkICYmICFpc0FycmF5SXRlcihpdGVyRm4pKXtcbiAgICAgIGZvcihpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKE8pLCB2YWx1ZXMgPSBbXSwgaSA9IDA7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaSsrKXtcbiAgICAgICAgdmFsdWVzLnB1c2goc3RlcC52YWx1ZSk7XG4gICAgICB9IE8gPSB2YWx1ZXM7XG4gICAgfVxuICAgIGlmKG1hcHBpbmcgJiYgYUxlbiA+IDIpbWFwZm4gPSBjdHgobWFwZm4sIGFyZ3VtZW50c1syXSwgMik7XG4gICAgZm9yKGkgPSAwLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCksIHJlc3VsdCA9IGFsbG9jYXRlKHRoaXMsIGxlbmd0aCk7IGxlbmd0aCA+IGk7IGkrKyl7XG4gICAgICByZXN1bHRbaV0gPSBtYXBwaW5nID8gbWFwZm4oT1tpXSwgaSkgOiBPW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHZhciAkb2YgPSBmdW5jdGlvbiBvZigvKi4uLml0ZW1zKi8pe1xuICAgIHZhciBpbmRleCAgPSAwXG4gICAgICAsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICwgcmVzdWx0ID0gYWxsb2NhdGUodGhpcywgbGVuZ3RoKTtcbiAgICB3aGlsZShsZW5ndGggPiBpbmRleClyZXN1bHRbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4KytdO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gaU9TIFNhZmFyaSA2LnggZmFpbHMgaGVyZVxuICB2YXIgVE9fTE9DQUxFX0JVRyA9ICEhVWludDhBcnJheSAmJiBmYWlscyhmdW5jdGlvbigpeyBhcnJheVRvTG9jYWxlU3RyaW5nLmNhbGwobmV3IFVpbnQ4QXJyYXkoMSkpOyB9KTtcblxuICB2YXIgJHRvTG9jYWxlU3RyaW5nID0gZnVuY3Rpb24gdG9Mb2NhbGVTdHJpbmcoKXtcbiAgICByZXR1cm4gYXJyYXlUb0xvY2FsZVN0cmluZy5hcHBseShUT19MT0NBTEVfQlVHID8gYXJyYXlTbGljZS5jYWxsKHZhbGlkYXRlKHRoaXMpKSA6IHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIHZhciBwcm90byA9IHtcbiAgICBjb3B5V2l0aGluOiBmdW5jdGlvbiBjb3B5V2l0aGluKHRhcmdldCwgc3RhcnQgLyosIGVuZCAqLyl7XG4gICAgICByZXR1cm4gYXJyYXlDb3B5V2l0aGluLmNhbGwodmFsaWRhdGUodGhpcyksIHRhcmdldCwgc3RhcnQsIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGV2ZXJ5OiBmdW5jdGlvbiBldmVyeShjYWxsYmFja2ZuIC8qLCB0aGlzQXJnICovKXtcbiAgICAgIHJldHVybiBhcnJheUV2ZXJ5KHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBmaWxsOiBmdW5jdGlvbiBmaWxsKHZhbHVlIC8qLCBzdGFydCwgZW5kICovKXsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5RmlsbC5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrZm4gLyosIHRoaXNBcmcgKi8pe1xuICAgICAgcmV0dXJuIHNwZWNpZXNGcm9tTGlzdCh0aGlzLCBhcnJheUZpbHRlcih2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbixcbiAgICAgICAgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpKTtcbiAgICB9LFxuICAgIGZpbmQ6IGZ1bmN0aW9uIGZpbmQocHJlZGljYXRlIC8qLCB0aGlzQXJnICovKXtcbiAgICAgIHJldHVybiBhcnJheUZpbmQodmFsaWRhdGUodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgocHJlZGljYXRlIC8qLCB0aGlzQXJnICovKXtcbiAgICAgIHJldHVybiBhcnJheUZpbmRJbmRleCh2YWxpZGF0ZSh0aGlzKSwgcHJlZGljYXRlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyosIHRoaXNBcmcgKi8pe1xuICAgICAgYXJyYXlGb3JFYWNoKHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBpbmRleE9mOiBmdW5jdGlvbiBpbmRleE9mKHNlYXJjaEVsZW1lbnQgLyosIGZyb21JbmRleCAqLyl7XG4gICAgICByZXR1cm4gYXJyYXlJbmRleE9mKHZhbGlkYXRlKHRoaXMpLCBzZWFyY2hFbGVtZW50LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoRWxlbWVudCAvKiwgZnJvbUluZGV4ICovKXtcbiAgICAgIHJldHVybiBhcnJheUluY2x1ZGVzKHZhbGlkYXRlKHRoaXMpLCBzZWFyY2hFbGVtZW50LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBqb2luOiBmdW5jdGlvbiBqb2luKHNlcGFyYXRvcil7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheUpvaW4uYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBsYXN0SW5kZXhPZjogZnVuY3Rpb24gbGFzdEluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiwgZnJvbUluZGV4ICovKXsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5TGFzdEluZGV4T2YuYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBtYXA6IGZ1bmN0aW9uIG1hcChtYXBmbiAvKiwgdGhpc0FyZyAqLyl7XG4gICAgICByZXR1cm4gJG1hcCh2YWxpZGF0ZSh0aGlzKSwgbWFwZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGNhbGxiYWNrZm4gLyosIGluaXRpYWxWYWx1ZSAqLyl7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheVJlZHVjZS5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHJlZHVjZVJpZ2h0OiBmdW5jdGlvbiByZWR1Y2VSaWdodChjYWxsYmFja2ZuIC8qLCBpbml0aWFsVmFsdWUgKi8peyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlSZWR1Y2VSaWdodC5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHJldmVyc2U6IGZ1bmN0aW9uIHJldmVyc2UoKXtcbiAgICAgIHZhciB0aGF0ICAgPSB0aGlzXG4gICAgICAgICwgbGVuZ3RoID0gdmFsaWRhdGUodGhhdCkubGVuZ3RoXG4gICAgICAgICwgbWlkZGxlID0gTWF0aC5mbG9vcihsZW5ndGggLyAyKVxuICAgICAgICAsIGluZGV4ICA9IDBcbiAgICAgICAgLCB2YWx1ZTtcbiAgICAgIHdoaWxlKGluZGV4IDwgbWlkZGxlKXtcbiAgICAgICAgdmFsdWUgICAgICAgICA9IHRoYXRbaW5kZXhdO1xuICAgICAgICB0aGF0W2luZGV4KytdID0gdGhhdFstLWxlbmd0aF07XG4gICAgICAgIHRoYXRbbGVuZ3RoXSAgPSB2YWx1ZTtcbiAgICAgIH0gcmV0dXJuIHRoYXQ7XG4gICAgfSxcbiAgICBzb21lOiBmdW5jdGlvbiBzb21lKGNhbGxiYWNrZm4gLyosIHRoaXNBcmcgKi8pe1xuICAgICAgcmV0dXJuIGFycmF5U29tZSh2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgc29ydDogZnVuY3Rpb24gc29ydChjb21wYXJlZm4pe1xuICAgICAgcmV0dXJuIGFycmF5U29ydC5jYWxsKHZhbGlkYXRlKHRoaXMpLCBjb21wYXJlZm4pO1xuICAgIH0sXG4gICAgc3ViYXJyYXk6IGZ1bmN0aW9uIHN1YmFycmF5KGJlZ2luLCBlbmQpe1xuICAgICAgdmFyIE8gICAgICA9IHZhbGlkYXRlKHRoaXMpXG4gICAgICAgICwgbGVuZ3RoID0gTy5sZW5ndGhcbiAgICAgICAgLCAkYmVnaW4gPSB0b0luZGV4KGJlZ2luLCBsZW5ndGgpO1xuICAgICAgcmV0dXJuIG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE9bREVGX0NPTlNUUlVDVE9SXSkpKFxuICAgICAgICBPLmJ1ZmZlcixcbiAgICAgICAgTy5ieXRlT2Zmc2V0ICsgJGJlZ2luICogTy5CWVRFU19QRVJfRUxFTUVOVCxcbiAgICAgICAgdG9MZW5ndGgoKGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9JbmRleChlbmQsIGxlbmd0aCkpIC0gJGJlZ2luKVxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyICRzbGljZSA9IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpe1xuICAgIHJldHVybiBzcGVjaWVzRnJvbUxpc3QodGhpcywgYXJyYXlTbGljZS5jYWxsKHZhbGlkYXRlKHRoaXMpLCBzdGFydCwgZW5kKSk7XG4gIH07XG5cbiAgdmFyICRzZXQgPSBmdW5jdGlvbiBzZXQoYXJyYXlMaWtlIC8qLCBvZmZzZXQgKi8pe1xuICAgIHZhbGlkYXRlKHRoaXMpO1xuICAgIHZhciBvZmZzZXQgPSB0b09mZnNldChhcmd1bWVudHNbMV0sIDEpXG4gICAgICAsIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgICAsIHNyYyAgICA9IHRvT2JqZWN0KGFycmF5TGlrZSlcbiAgICAgICwgbGVuICAgID0gdG9MZW5ndGgoc3JjLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gMDtcbiAgICBpZihsZW4gKyBvZmZzZXQgPiBsZW5ndGgpdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgIHdoaWxlKGluZGV4IDwgbGVuKXRoaXNbb2Zmc2V0ICsgaW5kZXhdID0gc3JjW2luZGV4KytdO1xuICB9O1xuXG4gIHZhciAkaXRlcmF0b3JzID0ge1xuICAgIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoKXtcbiAgICAgIHJldHVybiBhcnJheUVudHJpZXMuY2FsbCh2YWxpZGF0ZSh0aGlzKSk7XG4gICAgfSxcbiAgICBrZXlzOiBmdW5jdGlvbiBrZXlzKCl7XG4gICAgICByZXR1cm4gYXJyYXlLZXlzLmNhbGwodmFsaWRhdGUodGhpcykpO1xuICAgIH0sXG4gICAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoKXtcbiAgICAgIHJldHVybiBhcnJheVZhbHVlcy5jYWxsKHZhbGlkYXRlKHRoaXMpKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGlzVEFJbmRleCA9IGZ1bmN0aW9uKHRhcmdldCwga2V5KXtcbiAgICByZXR1cm4gaXNPYmplY3QodGFyZ2V0KVxuICAgICAgJiYgdGFyZ2V0W1RZUEVEX0FSUkFZXVxuICAgICAgJiYgdHlwZW9mIGtleSAhPSAnc3ltYm9sJ1xuICAgICAgJiYga2V5IGluIHRhcmdldFxuICAgICAgJiYgU3RyaW5nKCtrZXkpID09IFN0cmluZyhrZXkpO1xuICB9O1xuICB2YXIgJGdldERlc2MgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpe1xuICAgIHJldHVybiBpc1RBSW5kZXgodGFyZ2V0LCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKVxuICAgICAgPyBwcm9wZXJ0eURlc2MoMiwgdGFyZ2V0W2tleV0pXG4gICAgICA6IGdPUEQodGFyZ2V0LCBrZXkpO1xuICB9O1xuICB2YXIgJHNldERlc2MgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzYyl7XG4gICAgaWYoaXNUQUluZGV4KHRhcmdldCwga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSlcbiAgICAgICYmIGlzT2JqZWN0KGRlc2MpXG4gICAgICAmJiBoYXMoZGVzYywgJ3ZhbHVlJylcbiAgICAgICYmICFoYXMoZGVzYywgJ2dldCcpXG4gICAgICAmJiAhaGFzKGRlc2MsICdzZXQnKVxuICAgICAgLy8gVE9ETzogYWRkIHZhbGlkYXRpb24gZGVzY3JpcHRvciB3L28gY2FsbGluZyBhY2Nlc3NvcnNcbiAgICAgICYmICFkZXNjLmNvbmZpZ3VyYWJsZVxuICAgICAgJiYgKCFoYXMoZGVzYywgJ3dyaXRhYmxlJykgfHwgZGVzYy53cml0YWJsZSlcbiAgICAgICYmICghaGFzKGRlc2MsICdlbnVtZXJhYmxlJykgfHwgZGVzYy5lbnVtZXJhYmxlKVxuICAgICl7XG4gICAgICB0YXJnZXRba2V5XSA9IGRlc2MudmFsdWU7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0gZWxzZSByZXR1cm4gZFAodGFyZ2V0LCBrZXksIGRlc2MpO1xuICB9O1xuXG4gIGlmKCFBTExfQ09OU1RSVUNUT1JTKXtcbiAgICAkR09QRC5mID0gJGdldERlc2M7XG4gICAgJERQLmYgICA9ICRzZXREZXNjO1xuICB9XG5cbiAgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhQUxMX0NPTlNUUlVDVE9SUywgJ09iamVjdCcsIHtcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXREZXNjLFxuICAgIGRlZmluZVByb3BlcnR5OiAgICAgICAgICAgJHNldERlc2NcbiAgfSk7XG5cbiAgaWYoZmFpbHMoZnVuY3Rpb24oKXsgYXJyYXlUb1N0cmluZy5jYWxsKHt9KTsgfSkpe1xuICAgIGFycmF5VG9TdHJpbmcgPSBhcnJheVRvTG9jYWxlU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgICAgIHJldHVybiBhcnJheUpvaW4uY2FsbCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICB2YXIgJFR5cGVkQXJyYXlQcm90b3R5cGUkID0gcmVkZWZpbmVBbGwoe30sIHByb3RvKTtcbiAgcmVkZWZpbmVBbGwoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAkaXRlcmF0b3JzKTtcbiAgaGlkZSgkVHlwZWRBcnJheVByb3RvdHlwZSQsIElURVJBVE9SLCAkaXRlcmF0b3JzLnZhbHVlcyk7XG4gIHJlZGVmaW5lQWxsKCRUeXBlZEFycmF5UHJvdG90eXBlJCwge1xuICAgIHNsaWNlOiAgICAgICAgICAkc2xpY2UsXG4gICAgc2V0OiAgICAgICAgICAgICRzZXQsXG4gICAgY29uc3RydWN0b3I6ICAgIGZ1bmN0aW9uKCl7IC8qIG5vb3AgKi8gfSxcbiAgICB0b1N0cmluZzogICAgICAgYXJyYXlUb1N0cmluZyxcbiAgICB0b0xvY2FsZVN0cmluZzogJHRvTG9jYWxlU3RyaW5nXG4gIH0pO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnYnVmZmVyJywgJ2InKTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2J5dGVPZmZzZXQnLCAnbycpO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnYnl0ZUxlbmd0aCcsICdsJyk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdsZW5ndGgnLCAnZScpO1xuICBkUCgkVHlwZWRBcnJheVByb3RvdHlwZSQsIFRBRywge1xuICAgIGdldDogZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXNbVFlQRURfQVJSQVldOyB9XG4gIH0pO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oS0VZLCBCWVRFUywgd3JhcHBlciwgQ0xBTVBFRCl7XG4gICAgQ0xBTVBFRCA9ICEhQ0xBTVBFRDtcbiAgICB2YXIgTkFNRSAgICAgICA9IEtFWSArIChDTEFNUEVEID8gJ0NsYW1wZWQnIDogJycpICsgJ0FycmF5J1xuICAgICAgLCBJU05UX1VJTlQ4ID0gTkFNRSAhPSAnVWludDhBcnJheSdcbiAgICAgICwgR0VUVEVSICAgICA9ICdnZXQnICsgS0VZXG4gICAgICAsIFNFVFRFUiAgICAgPSAnc2V0JyArIEtFWVxuICAgICAgLCBUeXBlZEFycmF5ID0gZ2xvYmFsW05BTUVdXG4gICAgICAsIEJhc2UgICAgICAgPSBUeXBlZEFycmF5IHx8IHt9XG4gICAgICAsIFRBQyAgICAgICAgPSBUeXBlZEFycmF5ICYmIGdldFByb3RvdHlwZU9mKFR5cGVkQXJyYXkpXG4gICAgICAsIEZPUkNFRCAgICAgPSAhVHlwZWRBcnJheSB8fCAhJHR5cGVkLkFCVlxuICAgICAgLCBPICAgICAgICAgID0ge31cbiAgICAgICwgVHlwZWRBcnJheVByb3RvdHlwZSA9IFR5cGVkQXJyYXkgJiYgVHlwZWRBcnJheVtQUk9UT1RZUEVdO1xuICAgIHZhciBnZXR0ZXIgPSBmdW5jdGlvbih0aGF0LCBpbmRleCl7XG4gICAgICB2YXIgZGF0YSA9IHRoYXQuX2Q7XG4gICAgICByZXR1cm4gZGF0YS52W0dFVFRFUl0oaW5kZXggKiBCWVRFUyArIGRhdGEubywgTElUVExFX0VORElBTik7XG4gICAgfTtcbiAgICB2YXIgc2V0dGVyID0gZnVuY3Rpb24odGhhdCwgaW5kZXgsIHZhbHVlKXtcbiAgICAgIHZhciBkYXRhID0gdGhhdC5fZDtcbiAgICAgIGlmKENMQU1QRUQpdmFsdWUgPSAodmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlKSkgPCAwID8gMCA6IHZhbHVlID4gMHhmZiA/IDB4ZmYgOiB2YWx1ZSAmIDB4ZmY7XG4gICAgICBkYXRhLnZbU0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5vLCB2YWx1ZSwgTElUVExFX0VORElBTik7XG4gICAgfTtcbiAgICB2YXIgYWRkRWxlbWVudCA9IGZ1bmN0aW9uKHRoYXQsIGluZGV4KXtcbiAgICAgIGRQKHRoYXQsIGluZGV4LCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24oKXtcbiAgICAgICAgICByZXR1cm4gZ2V0dGVyKHRoaXMsIGluZGV4KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSl7XG4gICAgICAgICAgcmV0dXJuIHNldHRlcih0aGlzLCBpbmRleCwgdmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuICAgIGlmKEZPUkNFRCl7XG4gICAgICBUeXBlZEFycmF5ID0gd3JhcHBlcihmdW5jdGlvbih0aGF0LCBkYXRhLCAkb2Zmc2V0LCAkbGVuZ3RoKXtcbiAgICAgICAgYW5JbnN0YW5jZSh0aGF0LCBUeXBlZEFycmF5LCBOQU1FLCAnX2QnKTtcbiAgICAgICAgdmFyIGluZGV4ICA9IDBcbiAgICAgICAgICAsIG9mZnNldCA9IDBcbiAgICAgICAgICAsIGJ1ZmZlciwgYnl0ZUxlbmd0aCwgbGVuZ3RoLCBrbGFzcztcbiAgICAgICAgaWYoIWlzT2JqZWN0KGRhdGEpKXtcbiAgICAgICAgICBsZW5ndGggICAgID0gc3RyaWN0VG9MZW5ndGgoZGF0YSwgdHJ1ZSlcbiAgICAgICAgICBieXRlTGVuZ3RoID0gbGVuZ3RoICogQllURVM7XG4gICAgICAgICAgYnVmZmVyICAgICA9IG5ldyAkQXJyYXlCdWZmZXIoYnl0ZUxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSBpZihkYXRhIGluc3RhbmNlb2YgJEFycmF5QnVmZmVyIHx8IChrbGFzcyA9IGNsYXNzb2YoZGF0YSkpID09IEFSUkFZX0JVRkZFUiB8fCBrbGFzcyA9PSBTSEFSRURfQlVGRkVSKXtcbiAgICAgICAgICBidWZmZXIgPSBkYXRhO1xuICAgICAgICAgIG9mZnNldCA9IHRvT2Zmc2V0KCRvZmZzZXQsIEJZVEVTKTtcbiAgICAgICAgICB2YXIgJGxlbiA9IGRhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICBpZigkbGVuZ3RoID09PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgaWYoJGxlbiAlIEJZVEVTKXRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICAgIGJ5dGVMZW5ndGggPSAkbGVuIC0gb2Zmc2V0O1xuICAgICAgICAgICAgaWYoYnl0ZUxlbmd0aCA8IDApdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBieXRlTGVuZ3RoID0gdG9MZW5ndGgoJGxlbmd0aCkgKiBCWVRFUztcbiAgICAgICAgICAgIGlmKGJ5dGVMZW5ndGggKyBvZmZzZXQgPiAkbGVuKXRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGVuZ3RoID0gYnl0ZUxlbmd0aCAvIEJZVEVTO1xuICAgICAgICB9IGVsc2UgaWYoVFlQRURfQVJSQVkgaW4gZGF0YSl7XG4gICAgICAgICAgcmV0dXJuIGZyb21MaXN0KFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAkZnJvbS5jYWxsKFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGhpZGUodGhhdCwgJ19kJywge1xuICAgICAgICAgIGI6IGJ1ZmZlcixcbiAgICAgICAgICBvOiBvZmZzZXQsXG4gICAgICAgICAgbDogYnl0ZUxlbmd0aCxcbiAgICAgICAgICBlOiBsZW5ndGgsXG4gICAgICAgICAgdjogbmV3ICREYXRhVmlldyhidWZmZXIpXG4gICAgICAgIH0pO1xuICAgICAgICB3aGlsZShpbmRleCA8IGxlbmd0aClhZGRFbGVtZW50KHRoYXQsIGluZGV4KyspO1xuICAgICAgfSk7XG4gICAgICBUeXBlZEFycmF5UHJvdG90eXBlID0gVHlwZWRBcnJheVtQUk9UT1RZUEVdID0gY3JlYXRlKCRUeXBlZEFycmF5UHJvdG90eXBlJCk7XG4gICAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIFR5cGVkQXJyYXkpO1xuICAgIH0gZWxzZSBpZighJGl0ZXJEZXRlY3QoZnVuY3Rpb24oaXRlcil7XG4gICAgICAvLyBWOCB3b3JrcyB3aXRoIGl0ZXJhdG9ycywgYnV0IGZhaWxzIGluIG1hbnkgb3RoZXIgY2FzZXNcbiAgICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00NTUyXG4gICAgICBuZXcgVHlwZWRBcnJheShudWxsKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIG5ldyBUeXBlZEFycmF5KGl0ZXIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIH0sIHRydWUpKXtcbiAgICAgIFR5cGVkQXJyYXkgPSB3cmFwcGVyKGZ1bmN0aW9uKHRoYXQsIGRhdGEsICRvZmZzZXQsICRsZW5ndGgpe1xuICAgICAgICBhbkluc3RhbmNlKHRoYXQsIFR5cGVkQXJyYXksIE5BTUUpO1xuICAgICAgICB2YXIga2xhc3M7XG4gICAgICAgIC8vIGB3c2AgbW9kdWxlIGJ1ZywgdGVtcG9yYXJpbHkgcmVtb3ZlIHZhbGlkYXRpb24gbGVuZ3RoIGZvciBVaW50OEFycmF5XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJzb2NrZXRzL3dzL3B1bGwvNjQ1XG4gICAgICAgIGlmKCFpc09iamVjdChkYXRhKSlyZXR1cm4gbmV3IEJhc2Uoc3RyaWN0VG9MZW5ndGgoZGF0YSwgSVNOVF9VSU5UOCkpO1xuICAgICAgICBpZihkYXRhIGluc3RhbmNlb2YgJEFycmF5QnVmZmVyIHx8IChrbGFzcyA9IGNsYXNzb2YoZGF0YSkpID09IEFSUkFZX0JVRkZFUiB8fCBrbGFzcyA9PSBTSEFSRURfQlVGRkVSKXtcbiAgICAgICAgICByZXR1cm4gJGxlbmd0aCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IG5ldyBCYXNlKGRhdGEsIHRvT2Zmc2V0KCRvZmZzZXQsIEJZVEVTKSwgJGxlbmd0aClcbiAgICAgICAgICAgIDogJG9mZnNldCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gbmV3IEJhc2UoZGF0YSwgdG9PZmZzZXQoJG9mZnNldCwgQllURVMpKVxuICAgICAgICAgICAgICA6IG5ldyBCYXNlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmKFRZUEVEX0FSUkFZIGluIGRhdGEpcmV0dXJuIGZyb21MaXN0KFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgICByZXR1cm4gJGZyb20uY2FsbChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgIH0pO1xuICAgICAgYXJyYXlGb3JFYWNoKFRBQyAhPT0gRnVuY3Rpb24ucHJvdG90eXBlID8gZ09QTihCYXNlKS5jb25jYXQoZ09QTihUQUMpKSA6IGdPUE4oQmFzZSksIGZ1bmN0aW9uKGtleSl7XG4gICAgICAgIGlmKCEoa2V5IGluIFR5cGVkQXJyYXkpKWhpZGUoVHlwZWRBcnJheSwga2V5LCBCYXNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgICBUeXBlZEFycmF5W1BST1RPVFlQRV0gPSBUeXBlZEFycmF5UHJvdG90eXBlO1xuICAgICAgaWYoIUxJQlJBUlkpVHlwZWRBcnJheVByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR5cGVkQXJyYXk7XG4gICAgfVxuICAgIHZhciAkbmF0aXZlSXRlcmF0b3IgICA9IFR5cGVkQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgICAsIENPUlJFQ1RfSVRFUl9OQU1FID0gISEkbmF0aXZlSXRlcmF0b3IgJiYgKCRuYXRpdmVJdGVyYXRvci5uYW1lID09ICd2YWx1ZXMnIHx8ICRuYXRpdmVJdGVyYXRvci5uYW1lID09IHVuZGVmaW5lZClcbiAgICAgICwgJGl0ZXJhdG9yICAgICAgICAgPSAkaXRlcmF0b3JzLnZhbHVlcztcbiAgICBoaWRlKFR5cGVkQXJyYXksIFRZUEVEX0NPTlNUUlVDVE9SLCB0cnVlKTtcbiAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIFRZUEVEX0FSUkFZLCBOQU1FKTtcbiAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIFZJRVcsIHRydWUpO1xuICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgREVGX0NPTlNUUlVDVE9SLCBUeXBlZEFycmF5KTtcblxuICAgIGlmKENMQU1QRUQgPyBuZXcgVHlwZWRBcnJheSgxKVtUQUddICE9IE5BTUUgOiAhKFRBRyBpbiBUeXBlZEFycmF5UHJvdG90eXBlKSl7XG4gICAgICBkUChUeXBlZEFycmF5UHJvdG90eXBlLCBUQUcsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbigpeyByZXR1cm4gTkFNRTsgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgT1tOQU1FXSA9IFR5cGVkQXJyYXk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqIChUeXBlZEFycmF5ICE9IEJhc2UpLCBPKTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5TLCBOQU1FLCB7XG4gICAgICBCWVRFU19QRVJfRUxFTUVOVDogQllURVMsXG4gICAgICBmcm9tOiAkZnJvbSxcbiAgICAgIG9mOiAkb2ZcbiAgICB9KTtcblxuICAgIGlmKCEoQllURVNfUEVSX0VMRU1FTlQgaW4gVHlwZWRBcnJheVByb3RvdHlwZSkpaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBCWVRFU19QRVJfRUxFTUVOVCwgQllURVMpO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAsIE5BTUUsIHByb3RvKTtcblxuICAgIHNldFNwZWNpZXMoTkFNRSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIEZPUkNFRF9TRVQsIE5BTUUsIHtzZXQ6ICRzZXR9KTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIUNPUlJFQ1RfSVRFUl9OQU1FLCBOQU1FLCAkaXRlcmF0b3JzKTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKFR5cGVkQXJyYXlQcm90b3R5cGUudG9TdHJpbmcgIT0gYXJyYXlUb1N0cmluZyksIE5BTUUsIHt0b1N0cmluZzogYXJyYXlUb1N0cmluZ30pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbigpe1xuICAgICAgbmV3IFR5cGVkQXJyYXkoMSkuc2xpY2UoKTtcbiAgICB9KSwgTkFNRSwge3NsaWNlOiAkc2xpY2V9KTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKGZhaWxzKGZ1bmN0aW9uKCl7XG4gICAgICByZXR1cm4gWzEsIDJdLnRvTG9jYWxlU3RyaW5nKCkgIT0gbmV3IFR5cGVkQXJyYXkoWzEsIDJdKS50b0xvY2FsZVN0cmluZygpXG4gICAgfSkgfHwgIWZhaWxzKGZ1bmN0aW9uKCl7XG4gICAgICBUeXBlZEFycmF5UHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nLmNhbGwoWzEsIDJdKTtcbiAgICB9KSksIE5BTUUsIHt0b0xvY2FsZVN0cmluZzogJHRvTG9jYWxlU3RyaW5nfSk7XG5cbiAgICBJdGVyYXRvcnNbTkFNRV0gPSBDT1JSRUNUX0lURVJfTkFNRSA/ICRuYXRpdmVJdGVyYXRvciA6ICRpdGVyYXRvcjtcbiAgICBpZighTElCUkFSWSAmJiAhQ09SUkVDVF9JVEVSX05BTUUpaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBJVEVSQVRPUiwgJGl0ZXJhdG9yKTtcbiAgfTtcbn0gZWxzZSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvX3R5cGVkLWFycmF5LmpzXG4gKiogbW9kdWxlIGlkID0gMjIzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgY2xhc3NvZiAgID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpXG4gICwgSVRFUkFUT1IgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29yZScpLmlzSXRlcmFibGUgPSBmdW5jdGlvbihpdCl7XG4gIHZhciBPID0gT2JqZWN0KGl0KTtcbiAgcmV0dXJuIE9bSVRFUkFUT1JdICE9PSB1bmRlZmluZWRcbiAgICB8fCAnQEBpdGVyYXRvcicgaW4gT1xuICAgIHx8IEl0ZXJhdG9ycy5oYXNPd25Qcm9wZXJ0eShjbGFzc29mKE8pKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvY29yZS5pcy1pdGVyYWJsZS5qc1xuICoqIG1vZHVsZSBpZCA9IDIyNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnVWludDgnLCAxLCBmdW5jdGlvbihpbml0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQ4QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKXtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWFycmF5LmpzXG4gKiogbW9kdWxlIGlkID0gMjI1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50OCcsIDEsIGZ1bmN0aW9uKGluaXQpe1xuICByZXR1cm4gZnVuY3Rpb24gVWludDhDbGFtcGVkQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKXtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSwgdHJ1ZSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWNsYW1wZWQtYXJyYXkuanNcbiAqKiBtb2R1bGUgaWQgPSAyMjZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0ludDE2JywgMiwgZnVuY3Rpb24oaW5pdCl7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQxNkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCl7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQxNi1hcnJheS5qc1xuICoqIG1vZHVsZSBpZCA9IDIyN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnVWludDE2JywgMiwgZnVuY3Rpb24oaW5pdCl7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50MTZBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpe1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDE2LWFycmF5LmpzXG4gKiogbW9kdWxlIGlkID0gMjI4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdJbnQzMicsIDQsIGZ1bmN0aW9uKGluaXQpe1xuICByZXR1cm4gZnVuY3Rpb24gSW50MzJBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpe1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50MzItYXJyYXkuanNcbiAqKiBtb2R1bGUgaWQgPSAyMjlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ1VpbnQzMicsIDQsIGZ1bmN0aW9uKGluaXQpe1xuICByZXR1cm4gZnVuY3Rpb24gVWludDMyQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKXtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQzMi1hcnJheS5qc1xuICoqIG1vZHVsZSBpZCA9IDIzMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnRmxvYXQzMicsIDQsIGZ1bmN0aW9uKGluaXQpe1xuICByZXR1cm4gZnVuY3Rpb24gRmxvYXQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCl7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDMyLWFycmF5LmpzXG4gKiogbW9kdWxlIGlkID0gMjMxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdGbG9hdDY0JywgOCwgZnVuY3Rpb24oaW5pdCl7XG4gIHJldHVybiBmdW5jdGlvbiBGbG9hdDY0QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKXtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmZsb2F0NjQtYXJyYXkuanNcbiAqKiBtb2R1bGUgaWQgPSAyMzJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDI2LjEuMSBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KVxudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpXG4gICwgYW5PYmplY3QgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBfYXBwbHkgICAgPSBGdW5jdGlvbi5hcHBseTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBhcHBseTogZnVuY3Rpb24gYXBwbHkodGFyZ2V0LCB0aGlzQXJndW1lbnQsIGFyZ3VtZW50c0xpc3Qpe1xuICAgIHJldHVybiBfYXBwbHkuY2FsbChhRnVuY3Rpb24odGFyZ2V0KSwgdGhpc0FyZ3VtZW50LCBhbk9iamVjdChhcmd1bWVudHNMaXN0KSk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmFwcGx5LmpzXG4gKiogbW9kdWxlIGlkID0gMjMzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyNi4xLjIgUmVmbGVjdC5jb25zdHJ1Y3QodGFyZ2V0LCBhcmd1bWVudHNMaXN0IFssIG5ld1RhcmdldF0pXG52YXIgJGV4cG9ydCAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBjcmVhdGUgICAgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJylcbiAgLCBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcbiAgLCBhbk9iamVjdCAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGlzT2JqZWN0ICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgYmluZCAgICAgID0gcmVxdWlyZSgnLi9fYmluZCcpO1xuXG4vLyBNUyBFZGdlIHN1cHBvcnRzIG9ubHkgMiBhcmd1bWVudHNcbi8vIEZGIE5pZ2h0bHkgc2V0cyB0aGlyZCBhcmd1bWVudCBhcyBgbmV3LnRhcmdldGAsIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYHRoaXNgIGZyb20gaXRcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICBmdW5jdGlvbiBGKCl7fVxuICByZXR1cm4gIShSZWZsZWN0LmNvbnN0cnVjdChmdW5jdGlvbigpe30sIFtdLCBGKSBpbnN0YW5jZW9mIEYpO1xufSksICdSZWZsZWN0Jywge1xuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIGNvbnN0cnVjdChUYXJnZXQsIGFyZ3MgLyosIG5ld1RhcmdldCovKXtcbiAgICBhRnVuY3Rpb24oVGFyZ2V0KTtcbiAgICBhbk9iamVjdChhcmdzKTtcbiAgICB2YXIgbmV3VGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyBUYXJnZXQgOiBhRnVuY3Rpb24oYXJndW1lbnRzWzJdKTtcbiAgICBpZihUYXJnZXQgPT0gbmV3VGFyZ2V0KXtcbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgb3B0aW1pemF0aW9uIGZvciAwLTQgYXJndW1lbnRzXG4gICAgICBzd2l0Y2goYXJncy5sZW5ndGgpe1xuICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgVGFyZ2V0O1xuICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0pO1xuICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICAgICAgfVxuICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBsb3Qgb2YgYXJndW1lbnRzIGNhc2VcbiAgICAgIHZhciAkYXJncyA9IFtudWxsXTtcbiAgICAgICRhcmdzLnB1c2guYXBwbHkoJGFyZ3MsIGFyZ3MpO1xuICAgICAgcmV0dXJuIG5ldyAoYmluZC5hcHBseShUYXJnZXQsICRhcmdzKSk7XG4gICAgfVxuICAgIC8vIHdpdGggYWx0ZXJlZCBuZXdUYXJnZXQsIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGNvbnN0cnVjdG9yc1xuICAgIHZhciBwcm90byAgICA9IG5ld1RhcmdldC5wcm90b3R5cGVcbiAgICAgICwgaW5zdGFuY2UgPSBjcmVhdGUoaXNPYmplY3QocHJvdG8pID8gcHJvdG8gOiBPYmplY3QucHJvdG90eXBlKVxuICAgICAgLCByZXN1bHQgICA9IEZ1bmN0aW9uLmFwcGx5LmNhbGwoVGFyZ2V0LCBpbnN0YW5jZSwgYXJncyk7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBpbnN0YW5jZTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuY29uc3RydWN0LmpzXG4gKiogbW9kdWxlIGlkID0gMjM0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyNi4xLjMgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKVxudmFyIGRQICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCAkZXhwb3J0ICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG5cbi8vIE1TIEVkZ2UgaGFzIGJyb2tlbiBSZWZsZWN0LmRlZmluZVByb3BlcnR5IC0gdGhyb3dpbmcgaW5zdGVhZCBvZiByZXR1cm5pbmcgZmFsc2VcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KGRQLmYoe30sIDEsIHt2YWx1ZTogMX0pLCAxLCB7dmFsdWU6IDJ9KTtcbn0pLCAnUmVmbGVjdCcsIHtcbiAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpe1xuICAgIGFuT2JqZWN0KHRhcmdldCk7XG4gICAgcHJvcGVydHlLZXkgPSB0b1ByaW1pdGl2ZShwcm9wZXJ0eUtleSwgdHJ1ZSk7XG4gICAgYW5PYmplY3QoYXR0cmlidXRlcyk7XG4gICAgdHJ5IHtcbiAgICAgIGRQLmYodGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVmaW5lLXByb3BlcnR5LmpzXG4gKiogbW9kdWxlIGlkID0gMjM1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyNi4xLjQgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyICRleHBvcnQgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBnT1BEICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZlxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkpe1xuICAgIHZhciBkZXNjID0gZ09QRChhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gICAgcmV0dXJuIGRlc2MgJiYgIWRlc2MuY29uZmlndXJhYmxlID8gZmFsc2UgOiBkZWxldGUgdGFyZ2V0W3Byb3BlcnR5S2V5XTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5LmpzXG4gKiogbW9kdWxlIGlkID0gMjM2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyAyNi4xLjUgUmVmbGVjdC5lbnVtZXJhdGUodGFyZ2V0KVxudmFyICRleHBvcnQgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIEVudW1lcmF0ZSA9IGZ1bmN0aW9uKGl0ZXJhdGVkKXtcbiAgdGhpcy5fdCA9IGFuT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdmFyIGtleXMgPSB0aGlzLl9rID0gW10gICAgICAgLy8ga2V5c1xuICAgICwga2V5O1xuICBmb3Ioa2V5IGluIGl0ZXJhdGVkKWtleXMucHVzaChrZXkpO1xufTtcbnJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJykoRW51bWVyYXRlLCAnT2JqZWN0JywgZnVuY3Rpb24oKXtcbiAgdmFyIHRoYXQgPSB0aGlzXG4gICAgLCBrZXlzID0gdGhhdC5fa1xuICAgICwga2V5O1xuICBkbyB7XG4gICAgaWYodGhhdC5faSA+PSBrZXlzLmxlbmd0aClyZXR1cm4ge3ZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWV9O1xuICB9IHdoaWxlKCEoKGtleSA9IGtleXNbdGhhdC5faSsrXSkgaW4gdGhhdC5fdCkpO1xuICByZXR1cm4ge3ZhbHVlOiBrZXksIGRvbmU6IGZhbHNlfTtcbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGVudW1lcmF0ZTogZnVuY3Rpb24gZW51bWVyYXRlKHRhcmdldCl7XG4gICAgcmV0dXJuIG5ldyBFbnVtZXJhdGUodGFyZ2V0KTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZW51bWVyYXRlLmpzXG4gKiogbW9kdWxlIGlkID0gMjM3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyAyNi4xLjYgUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSBbLCByZWNlaXZlcl0pXG52YXIgZ09QRCAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpXG4gICwgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgJGV4cG9ydCAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGlzT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBhbk9iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xuXG5mdW5jdGlvbiBnZXQodGFyZ2V0LCBwcm9wZXJ0eUtleS8qLCByZWNlaXZlciovKXtcbiAgdmFyIHJlY2VpdmVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB0YXJnZXQgOiBhcmd1bWVudHNbMl1cbiAgICAsIGRlc2MsIHByb3RvO1xuICBpZihhbk9iamVjdCh0YXJnZXQpID09PSByZWNlaXZlcilyZXR1cm4gdGFyZ2V0W3Byb3BlcnR5S2V5XTtcbiAgaWYoZGVzYyA9IGdPUEQuZih0YXJnZXQsIHByb3BlcnR5S2V5KSlyZXR1cm4gaGFzKGRlc2MsICd2YWx1ZScpXG4gICAgPyBkZXNjLnZhbHVlXG4gICAgOiBkZXNjLmdldCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGRlc2MuZ2V0LmNhbGwocmVjZWl2ZXIpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgaWYoaXNPYmplY3QocHJvdG8gPSBnZXRQcm90b3R5cGVPZih0YXJnZXQpKSlyZXR1cm4gZ2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpO1xufVxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7Z2V0OiBnZXR9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQuanNcbiAqKiBtb2R1bGUgaWQgPSAyMzhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDI2LjEuNyBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyIGdPUEQgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKVxuICAsICRleHBvcnQgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpe1xuICAgIHJldHVybiBnT1BELmYoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcbiAqKiBtb2R1bGUgaWQgPSAyMzlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDI2LjEuOCBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldClcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgZ2V0UHJvdG8gPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGdldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZih0YXJnZXQpe1xuICAgIHJldHVybiBnZXRQcm90byhhbk9iamVjdCh0YXJnZXQpKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LXByb3RvdHlwZS1vZi5qc1xuICoqIG1vZHVsZSBpZCA9IDI0MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjYuMS45IFJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcGVydHlLZXkpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGhhczogZnVuY3Rpb24gaGFzKHRhcmdldCwgcHJvcGVydHlLZXkpe1xuICAgIHJldHVybiBwcm9wZXJ0eUtleSBpbiB0YXJnZXQ7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0Lmhhcy5qc1xuICoqIG1vZHVsZSBpZCA9IDI0MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjYuMS4xMCBSZWZsZWN0LmlzRXh0ZW5zaWJsZSh0YXJnZXQpXG52YXIgJGV4cG9ydCAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgYW5PYmplY3QgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgJGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgaXNFeHRlbnNpYmxlOiBmdW5jdGlvbiBpc0V4dGVuc2libGUodGFyZ2V0KXtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHJldHVybiAkaXNFeHRlbnNpYmxlID8gJGlzRXh0ZW5zaWJsZSh0YXJnZXQpIDogdHJ1ZTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuaXMtZXh0ZW5zaWJsZS5qc1xuICoqIG1vZHVsZSBpZCA9IDI0MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjYuMS4xMSBSZWZsZWN0Lm93bktleXModGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge293bktleXM6IHJlcXVpcmUoJy4vX293bi1rZXlzJyl9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5vd24ta2V5cy5qc1xuICoqIG1vZHVsZSBpZCA9IDI0M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xudmFyIGdPUE4gICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKVxuICAsIGdPUFMgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBSZWZsZWN0ICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlJlZmxlY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IFJlZmxlY3QgJiYgUmVmbGVjdC5vd25LZXlzIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpe1xuICB2YXIga2V5cyAgICAgICA9IGdPUE4uZihhbk9iamVjdChpdCkpXG4gICAgLCBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICByZXR1cm4gZ2V0U3ltYm9scyA/IGtleXMuY29uY2F0KGdldFN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vd24ta2V5cy5qc1xuICoqIG1vZHVsZSBpZCA9IDI0NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjYuMS4xMiBSZWZsZWN0LnByZXZlbnRFeHRlbnNpb25zKHRhcmdldClcbnZhciAkZXhwb3J0ICAgICAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGFuT2JqZWN0ICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgJHByZXZlbnRFeHRlbnNpb25zID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIHByZXZlbnRFeHRlbnNpb25zOiBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpe1xuICAgIGFuT2JqZWN0KHRhcmdldCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmKCRwcmV2ZW50RXh0ZW5zaW9ucykkcHJldmVudEV4dGVuc2lvbnModGFyZ2V0KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanNcbiAqKiBtb2R1bGUgaWQgPSAyNDVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIDI2LjEuMTMgUmVmbGVjdC5zZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSwgViBbLCByZWNlaXZlcl0pXG52YXIgZFAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIGdPUEQgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKVxuICAsIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpXG4gICwgaGFzICAgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBjcmVhdGVEZXNjICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIGFuT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBpc09iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5mdW5jdGlvbiBzZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSwgVi8qLCByZWNlaXZlciovKXtcbiAgdmFyIHJlY2VpdmVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDQgPyB0YXJnZXQgOiBhcmd1bWVudHNbM11cbiAgICAsIG93bkRlc2MgID0gZ09QRC5mKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KVxuICAgICwgZXhpc3RpbmdEZXNjcmlwdG9yLCBwcm90bztcbiAgaWYoIW93bkRlc2Mpe1xuICAgIGlmKGlzT2JqZWN0KHByb3RvID0gZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSkpe1xuICAgICAgcmV0dXJuIHNldChwcm90bywgcHJvcGVydHlLZXksIFYsIHJlY2VpdmVyKTtcbiAgICB9XG4gICAgb3duRGVzYyA9IGNyZWF0ZURlc2MoMCk7XG4gIH1cbiAgaWYoaGFzKG93bkRlc2MsICd2YWx1ZScpKXtcbiAgICBpZihvd25EZXNjLndyaXRhYmxlID09PSBmYWxzZSB8fCAhaXNPYmplY3QocmVjZWl2ZXIpKXJldHVybiBmYWxzZTtcbiAgICBleGlzdGluZ0Rlc2NyaXB0b3IgPSBnT1BELmYocmVjZWl2ZXIsIHByb3BlcnR5S2V5KSB8fCBjcmVhdGVEZXNjKDApO1xuICAgIGV4aXN0aW5nRGVzY3JpcHRvci52YWx1ZSA9IFY7XG4gICAgZFAuZihyZWNlaXZlciwgcHJvcGVydHlLZXksIGV4aXN0aW5nRGVzY3JpcHRvcik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIG93bkRlc2Muc2V0ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IChvd25EZXNjLnNldC5jYWxsKHJlY2VpdmVyLCBWKSwgdHJ1ZSk7XG59XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtzZXQ6IHNldH0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldC5qc1xuICoqIG1vZHVsZSBpZCA9IDI0NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gMjYuMS4xNCBSZWZsZWN0LnNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pXG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHNldFByb3RvID0gcmVxdWlyZSgnLi9fc2V0LXByb3RvJyk7XG5cbmlmKHNldFByb3RvKSRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgc2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pe1xuICAgIHNldFByb3RvLmNoZWNrKHRhcmdldCwgcHJvdG8pO1xuICAgIHRyeSB7XG4gICAgICBzZXRQcm90by5zZXQodGFyZ2V0LCBwcm90byk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZi5qc1xuICoqIG1vZHVsZSBpZCA9IDI0N1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG52YXIgJGV4cG9ydCAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkaW5jbHVkZXMgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5Jywge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoZWwgLyosIGZyb21JbmRleCA9IDAgKi8pe1xuICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdpbmNsdWRlcycpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5hcnJheS5pbmNsdWRlcy5qc1xuICoqIG1vZHVsZSBpZCA9IDI0OFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLnByb3RvdHlwZS5hdFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsICRhdCAgICAgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIGF0OiBmdW5jdGlvbiBhdChwb3Mpe1xuICAgIHJldHVybiAkYXQodGhpcywgcG9zKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5hdC5qc1xuICoqIG1vZHVsZSBpZCA9IDI0OVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLXBhZC1zdGFydC1lbmRcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkcGFkICAgID0gcmVxdWlyZSgnLi9fc3RyaW5nLXBhZCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgcGFkU3RhcnQ6IGZ1bmN0aW9uIHBhZFN0YXJ0KG1heExlbmd0aCAvKiwgZmlsbFN0cmluZyA9ICcgJyAqLyl7XG4gICAgcmV0dXJuICRwYWQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLXN0YXJ0LmpzXG4gKiogbW9kdWxlIGlkID0gMjUwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCByZXBlYXQgICA9IHJlcXVpcmUoJy4vX3N0cmluZy1yZXBlYXQnKVxuICAsIGRlZmluZWQgID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHRoYXQsIG1heExlbmd0aCwgZmlsbFN0cmluZywgbGVmdCl7XG4gIHZhciBTICAgICAgICAgICAgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSlcbiAgICAsIHN0cmluZ0xlbmd0aCA9IFMubGVuZ3RoXG4gICAgLCBmaWxsU3RyICAgICAgPSBmaWxsU3RyaW5nID09PSB1bmRlZmluZWQgPyAnICcgOiBTdHJpbmcoZmlsbFN0cmluZylcbiAgICAsIGludE1heExlbmd0aCA9IHRvTGVuZ3RoKG1heExlbmd0aCk7XG4gIGlmKGludE1heExlbmd0aCA8PSBzdHJpbmdMZW5ndGggfHwgZmlsbFN0ciA9PSAnJylyZXR1cm4gUztcbiAgdmFyIGZpbGxMZW4gPSBpbnRNYXhMZW5ndGggLSBzdHJpbmdMZW5ndGhcbiAgICAsIHN0cmluZ0ZpbGxlciA9IHJlcGVhdC5jYWxsKGZpbGxTdHIsIE1hdGguY2VpbChmaWxsTGVuIC8gZmlsbFN0ci5sZW5ndGgpKTtcbiAgaWYoc3RyaW5nRmlsbGVyLmxlbmd0aCA+IGZpbGxMZW4pc3RyaW5nRmlsbGVyID0gc3RyaW5nRmlsbGVyLnNsaWNlKDAsIGZpbGxMZW4pO1xuICByZXR1cm4gbGVmdCA/IHN0cmluZ0ZpbGxlciArIFMgOiBTICsgc3RyaW5nRmlsbGVyO1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19zdHJpbmctcGFkLmpzXG4gKiogbW9kdWxlIGlkID0gMjUxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsICRwYWQgICAgPSByZXF1aXJlKCcuL19zdHJpbmctcGFkJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICBwYWRFbmQ6IGZ1bmN0aW9uIHBhZEVuZChtYXhMZW5ndGggLyosIGZpbGxTdHJpbmcgPSAnICcgKi8pe1xuICAgIHJldHVybiAkcGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGZhbHNlKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtZW5kLmpzXG4gKiogbW9kdWxlIGlkID0gMjUyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vc2VibWFya2JhZ2UvZWNtYXNjcmlwdC1zdHJpbmctbGVmdC1yaWdodC10cmltXG5yZXF1aXJlKCcuL19zdHJpbmctdHJpbScpKCd0cmltTGVmdCcsIGZ1bmN0aW9uKCR0cmltKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW1MZWZ0KCl7XG4gICAgcmV0dXJuICR0cmltKHRoaXMsIDEpO1xuICB9O1xufSwgJ3RyaW1TdGFydCcpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1sZWZ0LmpzXG4gKiogbW9kdWxlIGlkID0gMjUzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vc2VibWFya2JhZ2UvZWNtYXNjcmlwdC1zdHJpbmctbGVmdC1yaWdodC10cmltXG5yZXF1aXJlKCcuL19zdHJpbmctdHJpbScpKCd0cmltUmlnaHQnLCBmdW5jdGlvbigkdHJpbSl7XG4gIHJldHVybiBmdW5jdGlvbiB0cmltUmlnaHQoKXtcbiAgICByZXR1cm4gJHRyaW0odGhpcywgMik7XG4gIH07XG59LCAndHJpbUVuZCcpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1yaWdodC5qc1xuICoqIG1vZHVsZSBpZCA9IDI1NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL1N0cmluZy5wcm90b3R5cGUubWF0Y2hBbGwvXHJcbnZhciAkZXhwb3J0ICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCBkZWZpbmVkICAgICA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKVxyXG4gICwgdG9MZW5ndGggICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxyXG4gICwgaXNSZWdFeHAgICAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKVxyXG4gICwgZ2V0RmxhZ3MgICAgPSByZXF1aXJlKCcuL19mbGFncycpXHJcbiAgLCBSZWdFeHBQcm90byA9IFJlZ0V4cC5wcm90b3R5cGU7XHJcblxyXG52YXIgJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yID0gZnVuY3Rpb24ocmVnZXhwLCBzdHJpbmcpe1xyXG4gIHRoaXMuX3IgPSByZWdleHA7XHJcbiAgdGhpcy5fcyA9IHN0cmluZztcclxufTtcclxuXHJcbnJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJykoJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yLCAnUmVnRXhwIFN0cmluZycsIGZ1bmN0aW9uIG5leHQoKXtcclxuICB2YXIgbWF0Y2ggPSB0aGlzLl9yLmV4ZWModGhpcy5fcyk7XHJcbiAgcmV0dXJuIHt2YWx1ZTogbWF0Y2gsIGRvbmU6IG1hdGNoID09PSBudWxsfTtcclxufSk7XHJcblxyXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcclxuICBtYXRjaEFsbDogZnVuY3Rpb24gbWF0Y2hBbGwocmVnZXhwKXtcclxuICAgIGRlZmluZWQodGhpcyk7XHJcbiAgICBpZighaXNSZWdFeHAocmVnZXhwKSl0aHJvdyBUeXBlRXJyb3IocmVnZXhwICsgJyBpcyBub3QgYSByZWdleHAhJyk7XHJcbiAgICB2YXIgUyAgICAgPSBTdHJpbmcodGhpcylcclxuICAgICAgLCBmbGFncyA9ICdmbGFncycgaW4gUmVnRXhwUHJvdG8gPyBTdHJpbmcocmVnZXhwLmZsYWdzKSA6IGdldEZsYWdzLmNhbGwocmVnZXhwKVxyXG4gICAgICAsIHJ4ICAgID0gbmV3IFJlZ0V4cChyZWdleHAuc291cmNlLCB+ZmxhZ3MuaW5kZXhPZignZycpID8gZmxhZ3MgOiAnZycgKyBmbGFncyk7XHJcbiAgICByeC5sYXN0SW5kZXggPSB0b0xlbmd0aChyZWdleHAubGFzdEluZGV4KTtcclxuICAgIHJldHVybiBuZXcgJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yKHJ4LCBTKTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcubWF0Y2gtYWxsLmpzXG4gKiogbW9kdWxlIGlkID0gMjU1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ2FzeW5jSXRlcmF0b3InKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yLmpzXG4gKiogbW9kdWxlIGlkID0gMjU2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ29ic2VydmFibGUnKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3ltYm9sLm9ic2VydmFibGUuanNcbiAqKiBtb2R1bGUgaWQgPSAyNTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JzXG52YXIgJGV4cG9ydCAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIG93bktleXMgICAgICAgID0gcmVxdWlyZSgnLi9fb3duLWtleXMnKVxuICAsIHRvSU9iamVjdCAgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgZ09QRCAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpXG4gICwgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuL19jcmVhdGUtcHJvcGVydHknKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnM6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KXtcbiAgICB2YXIgTyAgICAgICA9IHRvSU9iamVjdChvYmplY3QpXG4gICAgICAsIGdldERlc2MgPSBnT1BELmZcbiAgICAgICwga2V5cyAgICA9IG93bktleXMoTylcbiAgICAgICwgcmVzdWx0ICA9IHt9XG4gICAgICAsIGkgICAgICAgPSAwXG4gICAgICAsIGtleSwgRDtcbiAgICB3aGlsZShrZXlzLmxlbmd0aCA+IGkpY3JlYXRlUHJvcGVydHkocmVzdWx0LCBrZXkgPSBrZXlzW2krK10sIGdldERlc2MoTywga2V5KSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzLmpzXG4gKiogbW9kdWxlIGlkID0gMjU4XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtdmFsdWVzLWVudHJpZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkdmFsdWVzID0gcmVxdWlyZSgnLi9fb2JqZWN0LXRvLWFycmF5JykoZmFsc2UpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoaXQpe1xuICAgIHJldHVybiAkdmFsdWVzKGl0KTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC52YWx1ZXMuanNcbiAqKiBtb2R1bGUgaWQgPSAyNTlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBnZXRLZXlzICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgaXNFbnVtICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpLmY7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGlzRW50cmllcyl7XG4gIHJldHVybiBmdW5jdGlvbihpdCl7XG4gICAgdmFyIE8gICAgICA9IHRvSU9iamVjdChpdClcbiAgICAgICwga2V5cyAgID0gZ2V0S2V5cyhPKVxuICAgICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICAgLCBpICAgICAgPSAwXG4gICAgICAsIHJlc3VsdCA9IFtdXG4gICAgICAsIGtleTtcbiAgICB3aGlsZShsZW5ndGggPiBpKWlmKGlzRW51bS5jYWxsKE8sIGtleSA9IGtleXNbaSsrXSkpe1xuICAgICAgcmVzdWx0LnB1c2goaXNFbnRyaWVzID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXRvLWFycmF5LmpzXG4gKiogbW9kdWxlIGlkID0gMjYwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtdmFsdWVzLWVudHJpZXNcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJGVudHJpZXMgPSByZXF1aXJlKCcuL19vYmplY3QtdG8tYXJyYXknKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoaXQpe1xuICAgIHJldHVybiAkZW50cmllcyhpdCk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcy5qc1xuICoqIG1vZHVsZSBpZCA9IDI2MVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCAgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsIHRvT2JqZWN0ICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXHJcbiAgLCBhRnVuY3Rpb24gICAgICAgPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcclxuICAsICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xyXG5cclxuLy8gQi4yLjIuMiBPYmplY3QucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oUCwgZ2V0dGVyKVxyXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcclxuICBfX2RlZmluZUdldHRlcl9fOiBmdW5jdGlvbiBfX2RlZmluZUdldHRlcl9fKFAsIGdldHRlcil7XHJcbiAgICAkZGVmaW5lUHJvcGVydHkuZih0b09iamVjdCh0aGlzKSwgUCwge2dldDogYUZ1bmN0aW9uKGdldHRlciksIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0pO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtZ2V0dGVyLmpzXG4gKiogbW9kdWxlIGlkID0gMjYyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBGb3JjZWQgcmVwbGFjZW1lbnQgcHJvdG90eXBlIGFjY2Vzc29ycyBtZXRob2RzXHJcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fbGlicmFyeScpfHwgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcclxuICB2YXIgSyA9IE1hdGgucmFuZG9tKCk7XHJcbiAgLy8gSW4gRkYgdGhyb3dzIG9ubHkgZGVmaW5lIG1ldGhvZHNcclxuICBfX2RlZmluZVNldHRlcl9fLmNhbGwobnVsbCwgSywgZnVuY3Rpb24oKXsgLyogZW1wdHkgKi99KTtcclxuICBkZWxldGUgcmVxdWlyZSgnLi9fZ2xvYmFsJylbS107XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZm9yY2VkLXBhbS5qc1xuICoqIG1vZHVsZSBpZCA9IDI2M1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xyXG52YXIgJGV4cG9ydCAgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcclxuICAsIHRvT2JqZWN0ICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXHJcbiAgLCBhRnVuY3Rpb24gICAgICAgPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcclxuICAsICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xyXG5cclxuLy8gQi4yLjIuMyBPYmplY3QucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oUCwgc2V0dGVyKVxyXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcclxuICBfX2RlZmluZVNldHRlcl9fOiBmdW5jdGlvbiBfX2RlZmluZVNldHRlcl9fKFAsIHNldHRlcil7XHJcbiAgICAkZGVmaW5lUHJvcGVydHkuZih0b09iamVjdCh0aGlzKSwgUCwge3NldDogYUZ1bmN0aW9uKHNldHRlciksIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0pO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtc2V0dGVyLmpzXG4gKiogbW9kdWxlIGlkID0gMjY0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XHJcbnZhciAkZXhwb3J0ICAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgdG9PYmplY3QgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcclxuICAsIHRvUHJpbWl0aXZlICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpXHJcbiAgLCBnZXRQcm90b3R5cGVPZiAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcclxuICAsIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcclxuXHJcbi8vIEIuMi4yLjQgT2JqZWN0LnByb3RvdHlwZS5fX2xvb2t1cEdldHRlcl9fKFApXHJcbnJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgJGV4cG9ydCgkZXhwb3J0LlAgKyByZXF1aXJlKCcuL19vYmplY3QtZm9yY2VkLXBhbScpLCAnT2JqZWN0Jywge1xyXG4gIF9fbG9va3VwR2V0dGVyX186IGZ1bmN0aW9uIF9fbG9va3VwR2V0dGVyX18oUCl7XHJcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpXHJcbiAgICAgICwgSyA9IHRvUHJpbWl0aXZlKFAsIHRydWUpXHJcbiAgICAgICwgRDtcclxuICAgIGRvIHtcclxuICAgICAgaWYoRCA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBLKSlyZXR1cm4gRC5nZXQ7XHJcbiAgICB9IHdoaWxlKE8gPSBnZXRQcm90b3R5cGVPZihPKSk7XHJcbiAgfVxyXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0Lmxvb2t1cC1nZXR0ZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAyNjVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxudmFyICRleHBvcnQgICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXHJcbiAgLCB0b09iamVjdCAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxyXG4gICwgdG9QcmltaXRpdmUgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcclxuICAsIGdldFByb3RvdHlwZU9mICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKVxyXG4gICwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xyXG5cclxuLy8gQi4yLjIuNSBPYmplY3QucHJvdG90eXBlLl9fbG9va3VwU2V0dGVyX18oUClcclxucmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAkZXhwb3J0KCRleHBvcnQuUCArIHJlcXVpcmUoJy4vX29iamVjdC1mb3JjZWQtcGFtJyksICdPYmplY3QnLCB7XHJcbiAgX19sb29rdXBTZXR0ZXJfXzogZnVuY3Rpb24gX19sb29rdXBTZXR0ZXJfXyhQKXtcclxuICAgIHZhciBPID0gdG9PYmplY3QodGhpcylcclxuICAgICAgLCBLID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSlcclxuICAgICAgLCBEO1xyXG4gICAgZG8ge1xyXG4gICAgICBpZihEID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIEspKXJldHVybiBELnNldDtcclxuICAgIH0gd2hpbGUoTyA9IGdldFByb3RvdHlwZU9mKE8pKTtcclxuICB9XHJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QubG9va3VwLXNldHRlci5qc1xuICoqIG1vZHVsZSBpZCA9IDI2NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyICRleHBvcnQgID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnTWFwJywge3RvSlNPTjogcmVxdWlyZSgnLi9fY29sbGVjdGlvbi10by1qc29uJykoJ01hcCcpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC50by1qc29uLmpzXG4gKiogbW9kdWxlIGlkID0gMjY3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIGZyb20gICAgPSByZXF1aXJlKCcuL19hcnJheS1mcm9tLWl0ZXJhYmxlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE5BTUUpe1xuICByZXR1cm4gZnVuY3Rpb24gdG9KU09OKCl7XG4gICAgaWYoY2xhc3NvZih0aGlzKSAhPSBOQU1FKXRocm93IFR5cGVFcnJvcihOQU1FICsgXCIjdG9KU09OIGlzbid0IGdlbmVyaWNcIik7XG4gICAgcmV0dXJuIGZyb20odGhpcyk7XG4gIH07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLXRvLWpzb24uanNcbiAqKiBtb2R1bGUgaWQgPSAyNjhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXIsIElURVJBVE9SKXtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3JPZihpdGVyLCBmYWxzZSwgcmVzdWx0LnB1c2gsIHJlc3VsdCwgSVRFUkFUT1IpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19hcnJheS1mcm9tLWl0ZXJhYmxlLmpzXG4gKiogbW9kdWxlIGlkID0gMjY5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LlIsICdTZXQnLCB7dG9KU09OOiByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXRvLWpzb24nKSgnU2V0Jyl9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuc2V0LnRvLWpzb24uanNcbiAqKiBtb2R1bGUgaWQgPSAyNzBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvcHJvcG9zYWwtZ2xvYmFsXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1N5c3RlbScsIHtnbG9iYWw6IHJlcXVpcmUoJy4vX2dsb2JhbCcpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN5c3RlbS5nbG9iYWwuanNcbiAqKiBtb2R1bGUgaWQgPSAyNzFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvcHJvcG9zYWwtaXMtZXJyb3JcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBjb2YgICAgID0gcmVxdWlyZSgnLi9fY29mJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnRXJyb3InLCB7XG4gIGlzRXJyb3I6IGZ1bmN0aW9uIGlzRXJyb3IoaXQpe1xuICAgIHJldHVybiBjb2YoaXQpID09PSAnRXJyb3InO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcuZXJyb3IuaXMtZXJyb3IuanNcbiAqKiBtb2R1bGUgaWQgPSAyNzJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyZW5kYW5FaWNoLzQyOTRkNWMyMTJhNmQyMjU0NzAzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGlhZGRoOiBmdW5jdGlvbiBpYWRkaCh4MCwgeDEsIHkwLCB5MSl7XG4gICAgdmFyICR4MCA9IHgwID4+PiAwXG4gICAgICAsICR4MSA9IHgxID4+PiAwXG4gICAgICAsICR5MCA9IHkwID4+PiAwO1xuICAgIHJldHVybiAkeDEgKyAoeTEgPj4+IDApICsgKCgkeDAgJiAkeTAgfCAoJHgwIHwgJHkwKSAmIH4oJHgwICsgJHkwID4+PiAwKSkgPj4+IDMxKSB8IDA7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmlhZGRoLmpzXG4gKiogbW9kdWxlIGlkID0gMjczXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBpc3ViaDogZnVuY3Rpb24gaXN1YmgoeDAsIHgxLCB5MCwgeTEpe1xuICAgIHZhciAkeDAgPSB4MCA+Pj4gMFxuICAgICAgLCAkeDEgPSB4MSA+Pj4gMFxuICAgICAgLCAkeTAgPSB5MCA+Pj4gMDtcbiAgICByZXR1cm4gJHgxIC0gKHkxID4+PiAwKSAtICgofiR4MCAmICR5MCB8IH4oJHgwIF4gJHkwKSAmICR4MCAtICR5MCA+Pj4gMCkgPj4+IDMxKSB8IDA7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmlzdWJoLmpzXG4gKiogbW9kdWxlIGlkID0gMjc0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBpbXVsaDogZnVuY3Rpb24gaW11bGgodSwgdil7XG4gICAgdmFyIFVJTlQxNiA9IDB4ZmZmZlxuICAgICAgLCAkdSA9ICt1XG4gICAgICAsICR2ID0gK3ZcbiAgICAgICwgdTAgPSAkdSAmIFVJTlQxNlxuICAgICAgLCB2MCA9ICR2ICYgVUlOVDE2XG4gICAgICAsIHUxID0gJHUgPj4gMTZcbiAgICAgICwgdjEgPSAkdiA+PiAxNlxuICAgICAgLCB0ICA9ICh1MSAqIHYwID4+PiAwKSArICh1MCAqIHYwID4+PiAxNik7XG4gICAgcmV0dXJuIHUxICogdjEgKyAodCA+PiAxNikgKyAoKHUwICogdjEgPj4+IDApICsgKHQgJiBVSU5UMTYpID4+IDE2KTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguaW11bGguanNcbiAqKiBtb2R1bGUgaWQgPSAyNzVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyZW5kYW5FaWNoLzQyOTRkNWMyMTJhNmQyMjU0NzAzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIHVtdWxoOiBmdW5jdGlvbiB1bXVsaCh1LCB2KXtcbiAgICB2YXIgVUlOVDE2ID0gMHhmZmZmXG4gICAgICAsICR1ID0gK3VcbiAgICAgICwgJHYgPSArdlxuICAgICAgLCB1MCA9ICR1ICYgVUlOVDE2XG4gICAgICAsIHYwID0gJHYgJiBVSU5UMTZcbiAgICAgICwgdTEgPSAkdSA+Pj4gMTZcbiAgICAgICwgdjEgPSAkdiA+Pj4gMTZcbiAgICAgICwgdCAgPSAodTEgKiB2MCA+Pj4gMCkgKyAodTAgKiB2MCA+Pj4gMTYpO1xuICAgIHJldHVybiB1MSAqIHYxICsgKHQgPj4+IDE2KSArICgodTAgKiB2MSA+Pj4gMCkgKyAodCAmIFVJTlQxNikgPj4+IDE2KTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGgudW11bGguanNcbiAqKiBtb2R1bGUgaWQgPSAyNzZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBtZXRhZGF0YSAgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKVxuICAsIGFuT2JqZWN0ICAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIHRvTWV0YUtleSAgICAgICAgICAgICAgICAgPSBtZXRhZGF0YS5rZXlcbiAgLCBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhID0gbWV0YWRhdGEuc2V0O1xuXG5tZXRhZGF0YS5leHAoe2RlZmluZU1ldGFkYXRhOiBmdW5jdGlvbiBkZWZpbmVNZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCB0YXJnZXRLZXkpe1xuICBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCBhbk9iamVjdCh0YXJnZXQpLCB0b01ldGFLZXkodGFyZ2V0S2V5KSk7XG59fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVmaW5lLW1ldGFkYXRhLmpzXG4gKiogbW9kdWxlIGlkID0gMjc3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgTWFwICAgICA9IHJlcXVpcmUoJy4vZXM2Lm1hcCcpXG4gICwgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgc2hhcmVkICA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdtZXRhZGF0YScpXG4gICwgc3RvcmUgICA9IHNoYXJlZC5zdG9yZSB8fCAoc2hhcmVkLnN0b3JlID0gbmV3IChyZXF1aXJlKCcuL2VzNi53ZWFrLW1hcCcpKSk7XG5cbnZhciBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwID0gZnVuY3Rpb24odGFyZ2V0LCB0YXJnZXRLZXksIGNyZWF0ZSl7XG4gIHZhciB0YXJnZXRNZXRhZGF0YSA9IHN0b3JlLmdldCh0YXJnZXQpO1xuICBpZighdGFyZ2V0TWV0YWRhdGEpe1xuICAgIGlmKCFjcmVhdGUpcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBzdG9yZS5zZXQodGFyZ2V0LCB0YXJnZXRNZXRhZGF0YSA9IG5ldyBNYXApO1xuICB9XG4gIHZhciBrZXlNZXRhZGF0YSA9IHRhcmdldE1ldGFkYXRhLmdldCh0YXJnZXRLZXkpO1xuICBpZigha2V5TWV0YWRhdGEpe1xuICAgIGlmKCFjcmVhdGUpcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB0YXJnZXRNZXRhZGF0YS5zZXQodGFyZ2V0S2V5LCBrZXlNZXRhZGF0YSA9IG5ldyBNYXApO1xuICB9IHJldHVybiBrZXlNZXRhZGF0YTtcbn07XG52YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IGZ1bmN0aW9uKE1ldGFkYXRhS2V5LCBPLCBQKXtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCBmYWxzZSk7XG4gIHJldHVybiBtZXRhZGF0YU1hcCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBtZXRhZGF0YU1hcC5oYXMoTWV0YWRhdGFLZXkpO1xufTtcbnZhciBvcmRpbmFyeUdldE93bk1ldGFkYXRhID0gZnVuY3Rpb24oTWV0YWRhdGFLZXksIE8sIFApe1xuICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIGZhbHNlKTtcbiAgcmV0dXJuIG1ldGFkYXRhTWFwID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBtZXRhZGF0YU1hcC5nZXQoTWV0YWRhdGFLZXkpO1xufTtcbnZhciBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhID0gZnVuY3Rpb24oTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApe1xuICBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIHRydWUpLnNldChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSk7XG59O1xudmFyIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzID0gZnVuY3Rpb24odGFyZ2V0LCB0YXJnZXRLZXkpe1xuICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKHRhcmdldCwgdGFyZ2V0S2V5LCBmYWxzZSlcbiAgICAsIGtleXMgICAgICAgID0gW107XG4gIGlmKG1ldGFkYXRhTWFwKW1ldGFkYXRhTWFwLmZvckVhY2goZnVuY3Rpb24oXywga2V5KXsga2V5cy5wdXNoKGtleSk7IH0pO1xuICByZXR1cm4ga2V5cztcbn07XG52YXIgdG9NZXRhS2V5ID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6IFN0cmluZyhpdCk7XG59O1xudmFyIGV4cCA9IGZ1bmN0aW9uKE8pe1xuICAkZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCBPKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzdG9yZTogc3RvcmUsXG4gIG1hcDogZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCxcbiAgaGFzOiBvcmRpbmFyeUhhc093bk1ldGFkYXRhLFxuICBnZXQ6IG9yZGluYXJ5R2V0T3duTWV0YWRhdGEsXG4gIHNldDogb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSxcbiAga2V5czogb3JkaW5hcnlPd25NZXRhZGF0YUtleXMsXG4gIGtleTogdG9NZXRhS2V5LFxuICBleHA6IGV4cFxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fbWV0YWRhdGEuanNcbiAqKiBtb2R1bGUgaWQgPSAyNzhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBtZXRhZGF0YSAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKVxuICAsIGFuT2JqZWN0ICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIHRvTWV0YUtleSAgICAgICAgICAgICAgPSBtZXRhZGF0YS5rZXlcbiAgLCBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwID0gbWV0YWRhdGEubWFwXG4gICwgc3RvcmUgICAgICAgICAgICAgICAgICA9IG1ldGFkYXRhLnN0b3JlO1xuXG5tZXRhZGF0YS5leHAoe2RlbGV0ZU1ldGFkYXRhOiBmdW5jdGlvbiBkZWxldGVNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qLCB0YXJnZXRLZXkgKi8pe1xuICB2YXIgdGFyZ2V0S2V5ICAgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMl0pXG4gICAgLCBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoYW5PYmplY3QodGFyZ2V0KSwgdGFyZ2V0S2V5LCBmYWxzZSk7XG4gIGlmKG1ldGFkYXRhTWFwID09PSB1bmRlZmluZWQgfHwgIW1ldGFkYXRhTWFwWydkZWxldGUnXShtZXRhZGF0YUtleSkpcmV0dXJuIGZhbHNlO1xuICBpZihtZXRhZGF0YU1hcC5zaXplKXJldHVybiB0cnVlO1xuICB2YXIgdGFyZ2V0TWV0YWRhdGEgPSBzdG9yZS5nZXQodGFyZ2V0KTtcbiAgdGFyZ2V0TWV0YWRhdGFbJ2RlbGV0ZSddKHRhcmdldEtleSk7XG4gIHJldHVybiAhIXRhcmdldE1ldGFkYXRhLnNpemUgfHwgc3RvcmVbJ2RlbGV0ZSddKHRhcmdldCk7XG59fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVsZXRlLW1ldGFkYXRhLmpzXG4gKiogbW9kdWxlIGlkID0gMjc5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgbWV0YWRhdGEgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJylcbiAgLCBhbk9iamVjdCAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBnZXRQcm90b3R5cGVPZiAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpXG4gICwgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IG1ldGFkYXRhLmhhc1xuICAsIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEgPSBtZXRhZGF0YS5nZXRcbiAgLCB0b01ldGFLZXkgICAgICAgICAgICAgID0gbWV0YWRhdGEua2V5O1xuXG52YXIgb3JkaW5hcnlHZXRNZXRhZGF0YSA9IGZ1bmN0aW9uKE1ldGFkYXRhS2V5LCBPLCBQKXtcbiAgdmFyIGhhc093biA9IG9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICBpZihoYXNPd24pcmV0dXJuIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7XG4gIHJldHVybiBwYXJlbnQgIT09IG51bGwgPyBvcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApIDogdW5kZWZpbmVkO1xufTtcblxubWV0YWRhdGEuZXhwKHtnZXRNZXRhZGF0YTogZnVuY3Rpb24gZ2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiwgdGFyZ2V0S2V5ICovKXtcbiAgcmV0dXJuIG9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YS5qc1xuICoqIG1vZHVsZSBpZCA9IDI4MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIFNldCAgICAgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9lczYuc2V0JylcbiAgLCBmcm9tICAgICAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2FycmF5LWZyb20taXRlcmFibGUnKVxuICAsIG1ldGFkYXRhICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKVxuICAsIGFuT2JqZWN0ICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBnZXRQcm90b3R5cGVPZiAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKVxuICAsIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzID0gbWV0YWRhdGEua2V5c1xuICAsIHRvTWV0YUtleSAgICAgICAgICAgICAgID0gbWV0YWRhdGEua2V5O1xuXG52YXIgb3JkaW5hcnlNZXRhZGF0YUtleXMgPSBmdW5jdGlvbihPLCBQKXtcbiAgdmFyIG9LZXlzICA9IG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApXG4gICAgLCBwYXJlbnQgPSBnZXRQcm90b3R5cGVPZihPKTtcbiAgaWYocGFyZW50ID09PSBudWxsKXJldHVybiBvS2V5cztcbiAgdmFyIHBLZXlzICA9IG9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7XG4gIHJldHVybiBwS2V5cy5sZW5ndGggPyBvS2V5cy5sZW5ndGggPyBmcm9tKG5ldyBTZXQob0tleXMuY29uY2F0KHBLZXlzKSkpIDogcEtleXMgOiBvS2V5cztcbn07XG5cbm1ldGFkYXRhLmV4cCh7Z2V0TWV0YWRhdGFLZXlzOiBmdW5jdGlvbiBnZXRNZXRhZGF0YUtleXModGFyZ2V0IC8qLCB0YXJnZXRLZXkgKi8pe1xuICByZXR1cm4gb3JkaW5hcnlNZXRhZGF0YUtleXMoYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzFdKSk7XG59fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLWtleXMuanNcbiAqKiBtb2R1bGUgaWQgPSAyODFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBtZXRhZGF0YSAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKVxuICAsIGFuT2JqZWN0ICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEgPSBtZXRhZGF0YS5nZXRcbiAgLCB0b01ldGFLZXkgICAgICAgICAgICAgID0gbWV0YWRhdGEua2V5O1xuXG5tZXRhZGF0YS5leHAoe2dldE93bk1ldGFkYXRhOiBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qLCB0YXJnZXRLZXkgKi8pe1xuICByZXR1cm4gb3JkaW5hcnlHZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgYW5PYmplY3QodGFyZ2V0KVxuICAgICwgYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzJdKSk7XG59fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS5qc1xuICoqIG1vZHVsZSBpZCA9IDI4MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIG1ldGFkYXRhICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKVxuICAsIGFuT2JqZWN0ICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IG1ldGFkYXRhLmtleXNcbiAgLCB0b01ldGFLZXkgICAgICAgICAgICAgICA9IG1ldGFkYXRhLmtleTtcblxubWV0YWRhdGEuZXhwKHtnZXRPd25NZXRhZGF0YUtleXM6IGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhS2V5cyh0YXJnZXQgLyosIHRhcmdldEtleSAqLyl7XG4gIHJldHVybiBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhhbk9iamVjdCh0YXJnZXQpLCBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMV0pKTtcbn19KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhLWtleXMuanNcbiAqKiBtb2R1bGUgaWQgPSAyODNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBtZXRhZGF0YSAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKVxuICAsIGFuT2JqZWN0ICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGdldFByb3RvdHlwZU9mICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gbWV0YWRhdGEuaGFzXG4gICwgdG9NZXRhS2V5ICAgICAgICAgICAgICA9IG1ldGFkYXRhLmtleTtcblxudmFyIG9yZGluYXJ5SGFzTWV0YWRhdGEgPSBmdW5jdGlvbihNZXRhZGF0YUtleSwgTywgUCl7XG4gIHZhciBoYXNPd24gPSBvcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgaWYoaGFzT3duKXJldHVybiB0cnVlO1xuICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7XG4gIHJldHVybiBwYXJlbnQgIT09IG51bGwgPyBvcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApIDogZmFsc2U7XG59O1xuXG5tZXRhZGF0YS5leHAoe2hhc01ldGFkYXRhOiBmdW5jdGlvbiBoYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qLCB0YXJnZXRLZXkgKi8pe1xuICByZXR1cm4gb3JkaW5hcnlIYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzJdKSk7XG59fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuaGFzLW1ldGFkYXRhLmpzXG4gKiogbW9kdWxlIGlkID0gMjg0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgbWV0YWRhdGEgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJylcbiAgLCBhbk9iamVjdCAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gbWV0YWRhdGEuaGFzXG4gICwgdG9NZXRhS2V5ICAgICAgICAgICAgICA9IG1ldGFkYXRhLmtleTtcblxubWV0YWRhdGEuZXhwKHtoYXNPd25NZXRhZGF0YTogZnVuY3Rpb24gaGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiwgdGFyZ2V0S2V5ICovKXtcbiAgcmV0dXJuIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldClcbiAgICAsIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1vd24tbWV0YWRhdGEuanNcbiAqKiBtb2R1bGUgaWQgPSAyODVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBtZXRhZGF0YSAgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKVxuICAsIGFuT2JqZWN0ICAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcbiAgLCB0b01ldGFLZXkgICAgICAgICAgICAgICAgID0gbWV0YWRhdGEua2V5XG4gICwgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IG1ldGFkYXRhLnNldDtcblxubWV0YWRhdGEuZXhwKHttZXRhZGF0YTogZnVuY3Rpb24gbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpe1xuICByZXR1cm4gZnVuY3Rpb24gZGVjb3JhdG9yKHRhcmdldCwgdGFyZ2V0S2V5KXtcbiAgICBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKFxuICAgICAgbWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsXG4gICAgICAodGFyZ2V0S2V5ICE9PSB1bmRlZmluZWQgPyBhbk9iamVjdCA6IGFGdW5jdGlvbikodGFyZ2V0KSxcbiAgICAgIHRvTWV0YUtleSh0YXJnZXRLZXkpXG4gICAgKTtcbiAgfTtcbn19KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5tZXRhZGF0YS5qc1xuICoqIG1vZHVsZSBpZCA9IDI4NlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3J3YWxkcm9uL3RjMzktbm90ZXMvYmxvYi9tYXN0ZXIvZXM2LzIwMTQtMDkvc2VwdC0yNS5tZCM1MTAtZ2xvYmFsYXNhcC1mb3ItZW5xdWV1aW5nLWEtbWljcm90YXNrXHJcbnZhciAkZXhwb3J0ICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgbWljcm90YXNrID0gcmVxdWlyZSgnLi9fbWljcm90YXNrJykoKVxyXG4gICwgcHJvY2VzcyAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykucHJvY2Vzc1xyXG4gICwgaXNOb2RlICAgID0gcmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xyXG5cclxuJGV4cG9ydCgkZXhwb3J0LkcsIHtcclxuICBhc2FwOiBmdW5jdGlvbiBhc2FwKGZuKXtcclxuICAgIHZhciBkb21haW4gPSBpc05vZGUgJiYgcHJvY2Vzcy5kb21haW47XHJcbiAgICBtaWNyb3Rhc2soZG9tYWluID8gZG9tYWluLmJpbmQoZm4pIDogZm4pO1xyXG4gIH1cclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvZXM3LmFzYXAuanNcbiAqKiBtb2R1bGUgaWQgPSAyODdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3plbnBhcnNpbmcvZXMtb2JzZXJ2YWJsZVxyXG52YXIgJGV4cG9ydCAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxyXG4gICwgZ2xvYmFsICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxyXG4gICwgY29yZSAgICAgICAgPSByZXF1aXJlKCcuL19jb3JlJylcclxuICAsIG1pY3JvdGFzayAgID0gcmVxdWlyZSgnLi9fbWljcm90YXNrJykoKVxyXG4gICwgT0JTRVJWQUJMRSAgPSByZXF1aXJlKCcuL193a3MnKSgnb2JzZXJ2YWJsZScpXHJcbiAgLCBhRnVuY3Rpb24gICA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxyXG4gICwgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxyXG4gICwgYW5JbnN0YW5jZSAgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpXHJcbiAgLCByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpXHJcbiAgLCBoaWRlICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxyXG4gICwgZm9yT2YgICAgICAgPSByZXF1aXJlKCcuL19mb3Itb2YnKVxyXG4gICwgUkVUVVJOICAgICAgPSBmb3JPZi5SRVRVUk47XHJcblxyXG52YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24oZm4pe1xyXG4gIHJldHVybiBmbiA9PSBudWxsID8gdW5kZWZpbmVkIDogYUZ1bmN0aW9uKGZuKTtcclxufTtcclxuXHJcbnZhciBjbGVhbnVwU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24oc3Vic2NyaXB0aW9uKXtcclxuICB2YXIgY2xlYW51cCA9IHN1YnNjcmlwdGlvbi5fYztcclxuICBpZihjbGVhbnVwKXtcclxuICAgIHN1YnNjcmlwdGlvbi5fYyA9IHVuZGVmaW5lZDtcclxuICAgIGNsZWFudXAoKTtcclxuICB9XHJcbn07XHJcblxyXG52YXIgc3Vic2NyaXB0aW9uQ2xvc2VkID0gZnVuY3Rpb24oc3Vic2NyaXB0aW9uKXtcclxuICByZXR1cm4gc3Vic2NyaXB0aW9uLl9vID09PSB1bmRlZmluZWQ7XHJcbn07XHJcblxyXG52YXIgY2xvc2VTdWJzY3JpcHRpb24gPSBmdW5jdGlvbihzdWJzY3JpcHRpb24pe1xyXG4gIGlmKCFzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uKSl7XHJcbiAgICBzdWJzY3JpcHRpb24uX28gPSB1bmRlZmluZWQ7XHJcbiAgICBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XHJcbiAgfVxyXG59O1xyXG5cclxudmFyIFN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uKG9ic2VydmVyLCBzdWJzY3JpYmVyKXtcclxuICBhbk9iamVjdChvYnNlcnZlcik7XHJcbiAgdGhpcy5fYyA9IHVuZGVmaW5lZDtcclxuICB0aGlzLl9vID0gb2JzZXJ2ZXI7XHJcbiAgb2JzZXJ2ZXIgPSBuZXcgU3Vic2NyaXB0aW9uT2JzZXJ2ZXIodGhpcyk7XHJcbiAgdHJ5IHtcclxuICAgIHZhciBjbGVhbnVwICAgICAgPSBzdWJzY3JpYmVyKG9ic2VydmVyKVxyXG4gICAgICAsIHN1YnNjcmlwdGlvbiA9IGNsZWFudXA7XHJcbiAgICBpZihjbGVhbnVwICE9IG51bGwpe1xyXG4gICAgICBpZih0eXBlb2YgY2xlYW51cC51bnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJyljbGVhbnVwID0gZnVuY3Rpb24oKXsgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7IH07XHJcbiAgICAgIGVsc2UgYUZ1bmN0aW9uKGNsZWFudXApO1xyXG4gICAgICB0aGlzLl9jID0gY2xlYW51cDtcclxuICAgIH1cclxuICB9IGNhdGNoKGUpe1xyXG4gICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XHJcbiAgICByZXR1cm47XHJcbiAgfSBpZihzdWJzY3JpcHRpb25DbG9zZWQodGhpcykpY2xlYW51cFN1YnNjcmlwdGlvbih0aGlzKTtcclxufTtcclxuXHJcblN1YnNjcmlwdGlvbi5wcm90b3R5cGUgPSByZWRlZmluZUFsbCh7fSwge1xyXG4gIHVuc3Vic2NyaWJlOiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpeyBjbG9zZVN1YnNjcmlwdGlvbih0aGlzKTsgfVxyXG59KTtcclxuXHJcbnZhciBTdWJzY3JpcHRpb25PYnNlcnZlciA9IGZ1bmN0aW9uKHN1YnNjcmlwdGlvbil7XHJcbiAgdGhpcy5fcyA9IHN1YnNjcmlwdGlvbjtcclxufTtcclxuXHJcblN1YnNjcmlwdGlvbk9ic2VydmVyLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKHt9LCB7XHJcbiAgbmV4dDogZnVuY3Rpb24gbmV4dCh2YWx1ZSl7XHJcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fcztcclxuICAgIGlmKCFzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uKSl7XHJcbiAgICAgIHZhciBvYnNlcnZlciA9IHN1YnNjcmlwdGlvbi5fbztcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB2YXIgbSA9IGdldE1ldGhvZChvYnNlcnZlci5uZXh0KTtcclxuICAgICAgICBpZihtKXJldHVybiBtLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKTtcclxuICAgICAgfSBjYXRjaChlKXtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY2xvc2VTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LFxyXG4gIGVycm9yOiBmdW5jdGlvbiBlcnJvcih2YWx1ZSl7XHJcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fcztcclxuICAgIGlmKHN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb24pKXRocm93IHZhbHVlO1xyXG4gICAgdmFyIG9ic2VydmVyID0gc3Vic2NyaXB0aW9uLl9vO1xyXG4gICAgc3Vic2NyaXB0aW9uLl9vID0gdW5kZWZpbmVkO1xyXG4gICAgdHJ5IHtcclxuICAgICAgdmFyIG0gPSBnZXRNZXRob2Qob2JzZXJ2ZXIuZXJyb3IpO1xyXG4gICAgICBpZighbSl0aHJvdyB2YWx1ZTtcclxuICAgICAgdmFsdWUgPSBtLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKTtcclxuICAgIH0gY2F0Y2goZSl7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIHRocm93IGU7XHJcbiAgICAgIH1cclxuICAgIH0gY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH0sXHJcbiAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKHZhbHVlKXtcclxuICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLl9zO1xyXG4gICAgaWYoIXN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb24pKXtcclxuICAgICAgdmFyIG9ic2VydmVyID0gc3Vic2NyaXB0aW9uLl9vO1xyXG4gICAgICBzdWJzY3JpcHRpb24uX28gPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdmFyIG0gPSBnZXRNZXRob2Qob2JzZXJ2ZXIuY29tcGxldGUpO1xyXG4gICAgICAgIHZhbHVlID0gbSA/IG0uY2FsbChvYnNlcnZlciwgdmFsdWUpIDogdW5kZWZpbmVkO1xyXG4gICAgICB9IGNhdGNoKGUpe1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxufSk7XHJcblxyXG52YXIgJE9ic2VydmFibGUgPSBmdW5jdGlvbiBPYnNlcnZhYmxlKHN1YnNjcmliZXIpe1xyXG4gIGFuSW5zdGFuY2UodGhpcywgJE9ic2VydmFibGUsICdPYnNlcnZhYmxlJywgJ19mJykuX2YgPSBhRnVuY3Rpb24oc3Vic2NyaWJlcik7XHJcbn07XHJcblxyXG5yZWRlZmluZUFsbCgkT2JzZXJ2YWJsZS5wcm90b3R5cGUsIHtcclxuICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcil7XHJcbiAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbihvYnNlcnZlciwgdGhpcy5fZik7XHJcbiAgfSxcclxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGZuKXtcclxuICAgIHZhciB0aGF0ID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgKGNvcmUuUHJvbWlzZSB8fCBnbG9iYWwuUHJvbWlzZSkoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcclxuICAgICAgYUZ1bmN0aW9uKGZuKTtcclxuICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoYXQuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0IDogZnVuY3Rpb24odmFsdWUpe1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIGZuKHZhbHVlKTtcclxuICAgICAgICAgIH0gY2F0Y2goZSl7XHJcbiAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogcmVqZWN0LFxyXG4gICAgICAgIGNvbXBsZXRlOiByZXNvbHZlXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59KTtcclxuXHJcbnJlZGVmaW5lQWxsKCRPYnNlcnZhYmxlLCB7XHJcbiAgZnJvbTogZnVuY3Rpb24gZnJvbSh4KXtcclxuICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogJE9ic2VydmFibGU7XHJcbiAgICB2YXIgbWV0aG9kID0gZ2V0TWV0aG9kKGFuT2JqZWN0KHgpW09CU0VSVkFCTEVdKTtcclxuICAgIGlmKG1ldGhvZCl7XHJcbiAgICAgIHZhciBvYnNlcnZhYmxlID0gYW5PYmplY3QobWV0aG9kLmNhbGwoeCkpO1xyXG4gICAgICByZXR1cm4gb2JzZXJ2YWJsZS5jb25zdHJ1Y3RvciA9PT0gQyA/IG9ic2VydmFibGUgOiBuZXcgQyhmdW5jdGlvbihvYnNlcnZlcil7XHJcbiAgICAgICAgcmV0dXJuIG9ic2VydmFibGUuc3Vic2NyaWJlKG9ic2VydmVyKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IEMoZnVuY3Rpb24ob2JzZXJ2ZXIpe1xyXG4gICAgICB2YXIgZG9uZSA9IGZhbHNlO1xyXG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24oKXtcclxuICAgICAgICBpZighZG9uZSl7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZihmb3JPZih4LCBmYWxzZSwgZnVuY3Rpb24oaXQpe1xyXG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoaXQpO1xyXG4gICAgICAgICAgICAgIGlmKGRvbmUpcmV0dXJuIFJFVFVSTjtcclxuICAgICAgICAgICAgfSkgPT09IFJFVFVSTilyZXR1cm47XHJcbiAgICAgICAgICB9IGNhdGNoKGUpe1xyXG4gICAgICAgICAgICBpZihkb25lKXRocm93IGU7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9IG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCl7IGRvbmUgPSB0cnVlOyB9O1xyXG4gICAgfSk7XHJcbiAgfSxcclxuICBvZjogZnVuY3Rpb24gb2YoKXtcclxuICAgIGZvcih2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoLCBpdGVtcyA9IEFycmF5KGwpOyBpIDwgbDspaXRlbXNbaV0gPSBhcmd1bWVudHNbaSsrXTtcclxuICAgIHJldHVybiBuZXcgKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6ICRPYnNlcnZhYmxlKShmdW5jdGlvbihvYnNlcnZlcil7XHJcbiAgICAgIHZhciBkb25lID0gZmFsc2U7XHJcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbigpe1xyXG4gICAgICAgIGlmKCFkb25lKXtcclxuICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSl7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoaXRlbXNbaV0pO1xyXG4gICAgICAgICAgICBpZihkb25lKXJldHVybjtcclxuICAgICAgICAgIH0gb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKXsgZG9uZSA9IHRydWU7IH07XHJcbiAgICB9KTtcclxuICB9XHJcbn0pO1xyXG5cclxuaGlkZSgkT2JzZXJ2YWJsZS5wcm90b3R5cGUsIE9CU0VSVkFCTEUsIGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9KTtcclxuXHJcbiRleHBvcnQoJGV4cG9ydC5HLCB7T2JzZXJ2YWJsZTogJE9ic2VydmFibGV9KTtcclxuXHJcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoJ09ic2VydmFibGUnKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JzZXJ2YWJsZS5qc1xuICoqIG1vZHVsZSBpZCA9IDI4OFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gaWU5LSBzZXRUaW1lb3V0ICYgc2V0SW50ZXJ2YWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZpeFxudmFyIGdsb2JhbCAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsICRleHBvcnQgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGludm9rZSAgICAgPSByZXF1aXJlKCcuL19pbnZva2UnKVxuICAsIHBhcnRpYWwgICAgPSByZXF1aXJlKCcuL19wYXJ0aWFsJylcbiAgLCBuYXZpZ2F0b3IgID0gZ2xvYmFsLm5hdmlnYXRvclxuICAsIE1TSUUgICAgICAgPSAhIW5hdmlnYXRvciAmJiAvTVNJRSAuXFwuLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOyAvLyA8LSBkaXJ0eSBpZTktIGNoZWNrXG52YXIgd3JhcCA9IGZ1bmN0aW9uKHNldCl7XG4gIHJldHVybiBNU0lFID8gZnVuY3Rpb24oZm4sIHRpbWUgLyosIC4uLmFyZ3MgKi8pe1xuICAgIHJldHVybiBzZXQoaW52b2tlKFxuICAgICAgcGFydGlhbCxcbiAgICAgIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSxcbiAgICAgIHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbilcbiAgICApLCB0aW1lKTtcbiAgfSA6IHNldDtcbn07XG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuQiArICRleHBvcnQuRiAqIE1TSUUsIHtcbiAgc2V0VGltZW91dDogIHdyYXAoZ2xvYmFsLnNldFRpbWVvdXQpLFxuICBzZXRJbnRlcnZhbDogd3JhcChnbG9iYWwuc2V0SW50ZXJ2YWwpXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy93ZWIudGltZXJzLmpzXG4gKiogbW9kdWxlIGlkID0gMjg5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG52YXIgcGF0aCAgICAgID0gcmVxdWlyZSgnLi9fcGF0aCcpXG4gICwgaW52b2tlICAgID0gcmVxdWlyZSgnLi9faW52b2tlJylcbiAgLCBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKC8qIC4uLnBhcmdzICovKXtcbiAgdmFyIGZuICAgICA9IGFGdW5jdGlvbih0aGlzKVxuICAgICwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgcGFyZ3MgID0gQXJyYXkobGVuZ3RoKVxuICAgICwgaSAgICAgID0gMFxuICAgICwgXyAgICAgID0gcGF0aC5fXG4gICAgLCBob2xkZXIgPSBmYWxzZTtcbiAgd2hpbGUobGVuZ3RoID4gaSlpZigocGFyZ3NbaV0gPSBhcmd1bWVudHNbaSsrXSkgPT09IF8paG9sZGVyID0gdHJ1ZTtcbiAgcmV0dXJuIGZ1bmN0aW9uKC8qIC4uLmFyZ3MgKi8pe1xuICAgIHZhciB0aGF0ID0gdGhpc1xuICAgICAgLCBhTGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgLCBqID0gMCwgayA9IDAsIGFyZ3M7XG4gICAgaWYoIWhvbGRlciAmJiAhYUxlbilyZXR1cm4gaW52b2tlKGZuLCBwYXJncywgdGhhdCk7XG4gICAgYXJncyA9IHBhcmdzLnNsaWNlKCk7XG4gICAgaWYoaG9sZGVyKWZvcig7bGVuZ3RoID4gajsgaisrKWlmKGFyZ3Nbal0gPT09IF8pYXJnc1tqXSA9IGFyZ3VtZW50c1trKytdO1xuICAgIHdoaWxlKGFMZW4gPiBrKWFyZ3MucHVzaChhcmd1bWVudHNbaysrXSk7XG4gICAgcmV0dXJuIGludm9rZShmbiwgYXJncywgdGhhdCk7XG4gIH07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19wYXJ0aWFsLmpzXG4gKiogbW9kdWxlIGlkID0gMjkwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2JhYmVsLXBvbHlmaWxsL34vY29yZS1qcy9tb2R1bGVzL19wYXRoLmpzXG4gKiogbW9kdWxlIGlkID0gMjkxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJHRhc2sgICA9IHJlcXVpcmUoJy4vX3Rhc2snKTtcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5CLCB7XG4gIHNldEltbWVkaWF0ZTogICAkdGFzay5zZXQsXG4gIGNsZWFySW1tZWRpYXRlOiAkdGFzay5jbGVhclxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvd2ViLmltbWVkaWF0ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDI5MlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyICRpdGVyYXRvcnMgICAgPSByZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpXG4gICwgcmVkZWZpbmUgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBnbG9iYWwgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBoaWRlICAgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgSXRlcmF0b3JzICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgd2tzICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpXG4gICwgSVRFUkFUT1IgICAgICA9IHdrcygnaXRlcmF0b3InKVxuICAsIFRPX1NUUklOR19UQUcgPSB3a3MoJ3RvU3RyaW5nVGFnJylcbiAgLCBBcnJheVZhbHVlcyAgID0gSXRlcmF0b3JzLkFycmF5O1xuXG5mb3IodmFyIGNvbGxlY3Rpb25zID0gWydOb2RlTGlzdCcsICdET01Ub2tlbkxpc3QnLCAnTWVkaWFMaXN0JywgJ1N0eWxlU2hlZXRMaXN0JywgJ0NTU1J1bGVMaXN0J10sIGkgPSAwOyBpIDwgNTsgaSsrKXtcbiAgdmFyIE5BTUUgICAgICAgPSBjb2xsZWN0aW9uc1tpXVxuICAgICwgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXVxuICAgICwgcHJvdG8gICAgICA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGVcbiAgICAsIGtleTtcbiAgaWYocHJvdG8pe1xuICAgIGlmKCFwcm90b1tJVEVSQVRPUl0paGlkZShwcm90bywgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICBpZighcHJvdG9bVE9fU1RSSU5HX1RBR10paGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gICAgSXRlcmF0b3JzW05BTUVdID0gQXJyYXlWYWx1ZXM7XG4gICAgZm9yKGtleSBpbiAkaXRlcmF0b3JzKWlmKCFwcm90b1trZXldKXJlZGVmaW5lKHByb3RvLCBrZXksICRpdGVyYXRvcnNba2V5XSwgdHJ1ZSk7XG4gIH1cbn1cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzXG4gKiogbW9kdWxlIGlkID0gMjkzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBodHRwczovL3Jhdy5naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL21hc3Rlci9MSUNFTlNFIGZpbGUuIEFuXG4gKiBhZGRpdGlvbmFsIGdyYW50IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW5cbiAqIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4hKGZ1bmN0aW9uKGdsb2JhbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciBpdGVyYXRvclN5bWJvbCA9XG4gICAgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcblxuICB2YXIgaW5Nb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiO1xuICB2YXIgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIGlmIChydW50aW1lKSB7XG4gICAgaWYgKGluTW9kdWxlKSB7XG4gICAgICAvLyBJZiByZWdlbmVyYXRvclJ1bnRpbWUgaXMgZGVmaW5lZCBnbG9iYWxseSBhbmQgd2UncmUgaW4gYSBtb2R1bGUsXG4gICAgICAvLyBtYWtlIHRoZSBleHBvcnRzIG9iamVjdCBpZGVudGljYWwgdG8gcmVnZW5lcmF0b3JSdW50aW1lLlxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuICAgIH1cbiAgICAvLyBEb24ndCBib3RoZXIgZXZhbHVhdGluZyB0aGUgcmVzdCBvZiB0aGlzIGZpbGUgaWYgdGhlIHJ1bnRpbWUgd2FzXG4gICAgLy8gYWxyZWFkeSBkZWZpbmVkIGdsb2JhbGx5LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZmluZSB0aGUgcnVudGltZSBnbG9iYWxseSAoYXMgZXhwZWN0ZWQgYnkgZ2VuZXJhdGVkIGNvZGUpIGFzIGVpdGhlclxuICAvLyBtb2R1bGUuZXhwb3J0cyAoaWYgd2UncmUgaW4gYSBtb2R1bGUpIG9yIGEgbmV3LCBlbXB0eSBvYmplY3QuXG4gIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lID0gaW5Nb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA6IHt9O1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKChvdXRlckZuIHx8IEdlbmVyYXRvcikucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBydW50aW1lLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBwcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBydW50aW1lLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGB2YWx1ZSBpbnN0YW5jZW9mIEF3YWl0QXJndW1lbnRgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLiBTb21lIG1heSBjb25zaWRlciB0aGUgbmFtZSBvZiB0aGlzIG1ldGhvZCB0b29cbiAgLy8gY3V0ZXN5LCBidXQgdGhleSBhcmUgY3VybXVkZ2VvbnMuXG4gIHJ1bnRpbWUuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gbmV3IEF3YWl0QXJndW1lbnQoYXJnKTtcbiAgfTtcblxuICBmdW5jdGlvbiBBd2FpdEFyZ3VtZW50KGFyZykge1xuICAgIHRoaXMuYXJnID0gYXJnO1xuICB9XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IpIHtcbiAgICAvLyBUaGlzIGludm9rZSBmdW5jdGlvbiBpcyB3cml0dGVuIGluIGEgc3R5bGUgdGhhdCBhc3N1bWVzIHNvbWVcbiAgICAvLyBjYWxsaW5nIGZ1bmN0aW9uIChvciBQcm9taXNlKSB3aWxsIGhhbmRsZSBleGNlcHRpb25zLlxuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgdmFyIHJlc3VsdCA9IGdlbmVyYXRvclttZXRob2RdKGFyZyk7XG4gICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBBd2FpdEFyZ3VtZW50XG4gICAgICAgID8gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLmFyZykudGhlbihpbnZva2VOZXh0LCBpbnZva2VUaHJvdylcbiAgICAgICAgOiBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi4gSWYgdGhlIFByb21pc2UgaXMgcmVqZWN0ZWQsIGhvd2V2ZXIsIHRoZVxuICAgICAgICAgICAgLy8gcmVzdWx0IGZvciB0aGlzIGl0ZXJhdGlvbiB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIHNhbWVcbiAgICAgICAgICAgIC8vIHJlYXNvbi4gTm90ZSB0aGF0IHJlamVjdGlvbnMgb2YgeWllbGRlZCBQcm9taXNlcyBhcmUgbm90XG4gICAgICAgICAgICAvLyB0aHJvd24gYmFjayBpbnRvIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIGFzIGlzIHRoZSBjYXNlXG4gICAgICAgICAgICAvLyB3aGVuIGFuIGF3YWl0ZWQgUHJvbWlzZSBpcyByZWplY3RlZC4gVGhpcyBkaWZmZXJlbmNlIGluXG4gICAgICAgICAgICAvLyBiZWhhdmlvciBiZXR3ZWVuIHlpZWxkIGFuZCBhd2FpdCBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXRcbiAgICAgICAgICAgIC8vIGFsbG93cyB0aGUgY29uc3VtZXIgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgeWllbGRlZFxuICAgICAgICAgICAgLy8gcmVqZWN0aW9uIChzd2FsbG93IGl0IGFuZCBjb250aW51ZSwgbWFudWFsbHkgLnRocm93IGl0IGJhY2tcbiAgICAgICAgICAgIC8vIGludG8gdGhlIGdlbmVyYXRvciwgYWJhbmRvbiBpdGVyYXRpb24sIHdoYXRldmVyKS4gV2l0aFxuICAgICAgICAgICAgLy8gYXdhaXQsIGJ5IGNvbnRyYXN0LCB0aGVyZSBpcyBubyBvcHBvcnR1bml0eSB0byBleGFtaW5lIHRoZVxuICAgICAgICAgICAgLy8gcmVqZWN0aW9uIHJlYXNvbiBvdXRzaWRlIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIHNvIHRoZVxuICAgICAgICAgICAgLy8gb25seSBvcHRpb24gaXMgdG8gdGhyb3cgaXQgZnJvbSB0aGUgYXdhaXQgZXhwcmVzc2lvbiwgYW5kXG4gICAgICAgICAgICAvLyBsZXQgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBoYW5kbGUgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmIHByb2Nlc3MuZG9tYWluKSB7XG4gICAgICBpbnZva2UgPSBwcm9jZXNzLmRvbWFpbi5iaW5kKGludm9rZSk7XG4gICAgfVxuXG4gICAgdmFyIGludm9rZU5leHQgPSBpbnZva2UuYmluZChnZW5lcmF0b3IsIFwibmV4dFwiKTtcbiAgICB2YXIgaW52b2tlVGhyb3cgPSBpbnZva2UuYmluZChnZW5lcmF0b3IsIFwidGhyb3dcIik7XG4gICAgdmFyIGludm9rZVJldHVybiA9IGludm9rZS5iaW5kKGdlbmVyYXRvciwgXCJyZXR1cm5cIik7XG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gaW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIGlmIChtZXRob2QgPT09IFwicmV0dXJuXCIgfHxcbiAgICAgICAgICAgICAgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiICYmIGRlbGVnYXRlLml0ZXJhdG9yW21ldGhvZF0gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIC8vIEEgcmV0dXJuIG9yIHRocm93ICh3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gdGhyb3dcbiAgICAgICAgICAgIC8vIG1ldGhvZCkgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICAgIHZhciByZXR1cm5NZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXTtcbiAgICAgICAgICAgIGlmIChyZXR1cm5NZXRob2QpIHtcbiAgICAgICAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKHJldHVybk1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGFyZyk7XG4gICAgICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJldHVybiBtZXRob2QgdGhyZXcgYW4gZXhjZXB0aW9uLCBsZXQgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiBwcmV2YWlsIG92ZXIgdGhlIG9yaWdpbmFsIHJldHVybiBvciB0aHJvdy5cbiAgICAgICAgICAgICAgICBtZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgICAgICAgYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggdGhlIG91dGVyIHJldHVybiwgbm93IHRoYXQgdGhlIGRlbGVnYXRlXG4gICAgICAgICAgICAgIC8vIGl0ZXJhdG9yIGhhcyBiZWVuIHRlcm1pbmF0ZWQuXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChcbiAgICAgICAgICAgIGRlbGVnYXRlLml0ZXJhdG9yW21ldGhvZF0sXG4gICAgICAgICAgICBkZWxlZ2F0ZS5pdGVyYXRvcixcbiAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIExpa2UgcmV0dXJuaW5nIGdlbmVyYXRvci50aHJvdyh1bmNhdWdodCksIGJ1dCB3aXRob3V0IHRoZVxuICAgICAgICAgICAgLy8gb3ZlcmhlYWQgb2YgYW4gZXh0cmEgZnVuY3Rpb24gY2FsbC5cbiAgICAgICAgICAgIG1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICAgIGFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBEZWxlZ2F0ZSBnZW5lcmF0b3IgcmFuIGFuZCBoYW5kbGVkIGl0cyBvd24gZXhjZXB0aW9ucyBzb1xuICAgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgbWV0aG9kIHdhcywgd2UgY29udGludWUgYXMgaWYgaXQgaXNcbiAgICAgICAgICAvLyBcIm5leHRcIiB3aXRoIGFuIHVuZGVmaW5lZCBhcmcuXG4gICAgICAgICAgbWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuICAgICAgICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgICAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuICAgICAgICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuICAgICAgICAgICAgcmV0dXJuIGluZm87XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIGNvbnRleHQuX3NlbnQgPSBhcmc7XG5cbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkWWllbGQpIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2VudCA9IGFyZztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dC5zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihhcmcpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICAgIG1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgICAgYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgdmFyIGluZm8gPSB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuZGVsZWdhdGUgJiYgbWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgICAgICAgIGFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGluZm87XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIG1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBhcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBHcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgcnVudGltZS5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIHJ1bnRpbWUudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICB0aGlzLnNlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG4gICAgICAgIHJldHVybiAhIWNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG59KShcbiAgLy8gQW1vbmcgdGhlIHZhcmlvdXMgdHJpY2tzIGZvciBvYnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbFxuICAvLyBvYmplY3QsIHRoaXMgc2VlbXMgdG8gYmUgdGhlIG1vc3QgcmVsaWFibGUgdGVjaG5pcXVlIHRoYXQgZG9lcyBub3RcbiAgLy8gdXNlIGluZGlyZWN0IGV2YWwgKHdoaWNoIHZpb2xhdGVzIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5KS5cbiAgdHlwZW9mIGdsb2JhbCA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbCA6XG4gIHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgPyB3aW5kb3cgOlxuICB0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiA/IHNlbGYgOiB0aGlzXG4pO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9iYWJlbC1yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanNcbiAqKiBtb2R1bGUgaWQgPSAyOTRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBzZXRUaW1lb3V0KGRyYWluUXVldWUsIDApO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAod2VicGFjaykvfi9ub2RlLWxpYnMtYnJvd3Nlci9+L3Byb2Nlc3MvYnJvd3Nlci5qc1xuICoqIG1vZHVsZSBpZCA9IDI5NVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9jb3JlLnJlZ2V4cC5lc2NhcGUnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLlJlZ0V4cC5lc2NhcGU7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL2ZuL3JlZ2V4cC9lc2NhcGUuanNcbiAqKiBtb2R1bGUgaWQgPSAyOTZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZW5qYW1pbmdyL1JleEV4cC5lc2NhcGVcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkcmUgICAgID0gcmVxdWlyZSgnLi9fcmVwbGFjZXInKSgvW1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWdFeHAnLCB7ZXNjYXBlOiBmdW5jdGlvbiBlc2NhcGUoaXQpeyByZXR1cm4gJHJlKGl0KTsgfX0pO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvfi9jb3JlLWpzL21vZHVsZXMvY29yZS5yZWdleHAuZXNjYXBlLmpzXG4gKiogbW9kdWxlIGlkID0gMjk3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHJlZ0V4cCwgcmVwbGFjZSl7XG4gIHZhciByZXBsYWNlciA9IHJlcGxhY2UgPT09IE9iamVjdChyZXBsYWNlKSA/IGZ1bmN0aW9uKHBhcnQpe1xuICAgIHJldHVybiByZXBsYWNlW3BhcnRdO1xuICB9IDogcmVwbGFjZTtcbiAgcmV0dXJuIGZ1bmN0aW9uKGl0KXtcbiAgICByZXR1cm4gU3RyaW5nKGl0KS5yZXBsYWNlKHJlZ0V4cCwgcmVwbGFjZXIpO1xuICB9O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9iYWJlbC1wb2x5ZmlsbC9+L2NvcmUtanMvbW9kdWxlcy9fcmVwbGFjZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAyOThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmV4cG9ydCBjb25zdCBMb2cgPSByZXF1aXJlKCcuL3NyYy9Mb2cnKTtcbmV4cG9ydCBjb25zdCBPaWRjQ2xpZW50ID0gcmVxdWlyZSgnLi9zcmMvT2lkY0NsaWVudCcpO1xuZXhwb3J0IGNvbnN0IFdlYlN0b3JhZ2VTdGF0ZVN0b3JlID0gcmVxdWlyZSgnLi9zcmMvV2ViU3RvcmFnZVN0YXRlU3RvcmUnKTtcbmV4cG9ydCBjb25zdCBJbk1lbW9yeVdlYlN0b3JhZ2UgPSByZXF1aXJlKCcuL3NyYy9Jbk1lbW9yeVdlYlN0b3JhZ2UnKTtcbmV4cG9ydCBjb25zdCBVc2VyTWFuYWdlciA9IHJlcXVpcmUoJy4vc3JjL1VzZXJNYW5hZ2VyJyk7XG5leHBvcnQgY29uc3QgQWNjZXNzVG9rZW5FdmVudHMgPSByZXF1aXJlKCcuL3NyYy9BY2Nlc3NUb2tlbkV2ZW50cycpO1xuZXhwb3J0IGNvbnN0IE1ldGFkYXRhU2VydmljZSA9IHJlcXVpcmUoJy4vc3JjL01ldGFkYXRhU2VydmljZScpO1xuZXhwb3J0IGNvbnN0IENvcmRvdmFQb3B1cE5hdmlnYXRvciA9IHJlcXVpcmUoJy4vc3JjL0NvcmRvdmFQb3B1cE5hdmlnYXRvcicpO1xuZXhwb3J0IGNvbnN0IENvcmRvdmFJRnJhbWVOYXZpZ2F0b3IgPSByZXF1aXJlKCcuL3NyYy9Db3Jkb3ZhSUZyYW1lTmF2aWdhdG9yJyk7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBMb2csXG4gICAgT2lkY0NsaWVudCxcbiAgICBXZWJTdG9yYWdlU3RhdGVTdG9yZSxcbiAgICBJbk1lbW9yeVdlYlN0b3JhZ2UsXG4gICAgVXNlck1hbmFnZXIsXG4gICAgQWNjZXNzVG9rZW5FdmVudHMsXG4gICAgTWV0YWRhdGFTZXJ2aWNlLFxuICAgIENvcmRvdmFQb3B1cE5hdmlnYXRvcixcbiAgICBDb3Jkb3ZhSUZyYW1lTmF2aWdhdG9yXG59O1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9pbmRleC5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmxldCBub3BMb2dnZXIgPSB7XG4gICAgaW5mbygpe30sXG4gICAgd2Fybigpe30sXG4gICAgZXJyb3IoKXt9XG59O1xuXG5jb25zdCBOT05FID0gMDtcbmNvbnN0IEVSUk9SID0gMTtcbmNvbnN0IFdBUk4gPSAyO1xuY29uc3QgSU5GTyA9IDM7XG5cbmxldCBsb2dnZXI7XG5sZXQgbGV2ZWw7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvZyB7XG4gICAgc3RhdGljIGdldCBOT05FKCkge3JldHVybiBOT05FfTtcbiAgICBzdGF0aWMgZ2V0IEVSUk9SKCkge3JldHVybiBFUlJPUn07XG4gICAgc3RhdGljIGdldCBXQVJOKCkge3JldHVybiBXQVJOfTtcbiAgICBzdGF0aWMgZ2V0IElORk8oKSB7cmV0dXJuIElORk99O1xuICAgIFxuICAgIHN0YXRpYyByZXNldCgpe1xuICAgICAgICBsZXZlbCA9IElORk87XG4gICAgICAgIGxvZ2dlciA9IG5vcExvZ2dlcjtcbiAgICB9XG4gICAgXG4gICAgc3RhdGljIGdldCBsZXZlbCgpe1xuICAgICAgICByZXR1cm4gbGV2ZWw7XG4gICAgfVxuICAgIHN0YXRpYyBzZXQgbGV2ZWwodmFsdWUpe1xuICAgICAgICBpZiAoTk9ORSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBJTkZPKXtcbiAgICAgICAgICAgIGxldmVsID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxvZyBsZXZlbFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZ2V0IGxvZ2dlcigpe1xuICAgICAgICByZXR1cm4gbG9nZ2VyO1xuICAgIH1cbiAgICBzdGF0aWMgc2V0IGxvZ2dlcih2YWx1ZSl7XG4gICAgICAgIGlmICh2YWx1ZS5pbmZvICYmIHZhbHVlLndhcm4gJiYgdmFsdWUuZXJyb3Ipe1xuICAgICAgICAgICAgbG9nZ2VyID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxvZ2dlclwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgaW5mbyguLi5hcmdzKXtcbiAgICAgICAgaWYgKGxldmVsID49IElORk8pe1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8uYXBwbHkobG9nZ2VyLCBBcnJheS5mcm9tKGFyZ3MpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgd2FybiguLi5hcmdzKXtcbiAgICAgICAgaWYgKGxldmVsID49IFdBUk4pe1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4uYXBwbHkobG9nZ2VyLCBBcnJheS5mcm9tKGFyZ3MpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZXJyb3IoLi4uYXJncyl7XG4gICAgICAgIGlmIChsZXZlbCA+PSBFUlJPUil7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IuYXBwbHkobG9nZ2VyLCBBcnJheS5mcm9tKGFyZ3MpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuTG9nLnJlc2V0KCk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvTG9nLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgT2lkY0NsaWVudFNldHRpbmdzIGZyb20gJy4vT2lkY0NsaWVudFNldHRpbmdzJztcbmltcG9ydCBFcnJvclJlc3BvbnNlIGZyb20gJy4vRXJyb3JSZXNwb25zZSc7XG5pbXBvcnQgU2lnbmluUmVxdWVzdCBmcm9tICcuL1NpZ25pblJlcXVlc3QnO1xuaW1wb3J0IFNpZ25pblJlc3BvbnNlIGZyb20gJy4vU2lnbmluUmVzcG9uc2UnO1xuaW1wb3J0IFNpZ25vdXRSZXF1ZXN0IGZyb20gJy4vU2lnbm91dFJlcXVlc3QnO1xuaW1wb3J0IFNpZ25vdXRSZXNwb25zZSBmcm9tICcuL1NpZ25vdXRSZXNwb25zZSc7XG5pbXBvcnQgU2lnbmluU3RhdGUgZnJvbSAnLi9TaWduaW5TdGF0ZSc7XG5pbXBvcnQgU3RhdGUgZnJvbSAnLi9TdGF0ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9pZGNDbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzID0ge30pIHtcbiAgICAgICAgaWYgKHNldHRpbmdzIGluc3RhbmNlb2YgT2lkY0NsaWVudFNldHRpbmdzKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBuZXcgT2lkY0NsaWVudFNldHRpbmdzKHNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBfc3RhdGVTdG9yZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3Muc3RhdGVTdG9yZTtcbiAgICB9XG4gICAgZ2V0IF92YWxpZGF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnZhbGlkYXRvcjtcbiAgICB9XG4gICAgZ2V0IF9tZXRhZGF0YVNlcnZpY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLm1ldGFkYXRhU2VydmljZTtcbiAgICB9XG5cbiAgICBnZXQgc2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncztcbiAgICB9XG4gICAgZ2V0IG1ldGFkYXRhU2VydmljZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZTtcbiAgICB9XG5cbiAgICBjcmVhdGVTaWduaW5SZXF1ZXN0KHtcbiAgICAgICAgcmVzcG9uc2VfdHlwZSwgc2NvcGUsIHJlZGlyZWN0X3VyaSwgZGF0YSxcbiAgICAgICAgcHJvbXB0LCBkaXNwbGF5LCBtYXhfYWdlLCB1aV9sb2NhbGVzLCBpZF90b2tlbl9oaW50LCBsb2dpbl9oaW50LCBhY3JfdmFsdWVzfSA9IHt9LFxuICAgICAgICBzdGF0ZVN0b3JlXG4gICAgKSB7XG4gICAgICAgIExvZy5pbmZvKFwiT2lkY0NsaWVudC5jcmVhdGVTaWduaW5SZXF1ZXN0XCIpO1xuXG4gICAgICAgIGxldCBjbGllbnRfaWQgPSB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQ7XG4gICAgICAgIHJlc3BvbnNlX3R5cGUgPSByZXNwb25zZV90eXBlIHx8IHRoaXMuX3NldHRpbmdzLnJlc3BvbnNlX3R5cGU7XG4gICAgICAgIHNjb3BlID0gc2NvcGUgfHwgdGhpcy5fc2V0dGluZ3Muc2NvcGU7XG4gICAgICAgIHJlZGlyZWN0X3VyaSA9IHJlZGlyZWN0X3VyaSB8fCB0aGlzLl9zZXR0aW5ncy5yZWRpcmVjdF91cmk7XG5cbiAgICAgICAgLy8gaWRfdG9rZW5faGludCwgbG9naW5faGludCBhcmVuJ3QgYWxsb3dlZCBvbiBfc2V0dGluZ3NcbiAgICAgICAgcHJvbXB0ID0gcHJvbXB0IHx8IHRoaXMuX3NldHRpbmdzLnByb21wdDtcbiAgICAgICAgZGlzcGxheSA9IGRpc3BsYXkgfHwgdGhpcy5fc2V0dGluZ3MuZGlzcGxheTtcbiAgICAgICAgbWF4X2FnZSA9IG1heF9hZ2UgfHwgdGhpcy5fc2V0dGluZ3MubWF4X2FnZTtcbiAgICAgICAgdWlfbG9jYWxlcyA9IHVpX2xvY2FsZXMgfHwgdGhpcy5fc2V0dGluZ3MudWlfbG9jYWxlcztcbiAgICAgICAgYWNyX3ZhbHVlcyA9IGFjcl92YWx1ZXMgfHwgdGhpcy5fc2V0dGluZ3MuYWNyX3ZhbHVlcztcbiAgICAgICAgXG4gICAgICAgIGxldCBhdXRob3JpdHkgPSB0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhU2VydmljZS5nZXRBdXRob3JpemF0aW9uRW5kcG9pbnQoKS50aGVuKHVybCA9PiB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcIlJlY2VpdmVkIGF1dGhvcml6YXRpb24gZW5kcG9pbnRcIiwgdXJsKTtcblxuICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgU2lnbmluUmVxdWVzdCh7XG4gICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgIGNsaWVudF9pZCxcbiAgICAgICAgICAgICAgICByZWRpcmVjdF91cmksXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VfdHlwZSxcbiAgICAgICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgIGF1dGhvcml0eSxcbiAgICAgICAgICAgICAgICBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQsIGFjcl92YWx1ZXNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2YXIgc3RhdGUgPSByZXF1ZXN0LnN0YXRlO1xuICAgICAgICAgICAgc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmUgfHwgdGhpcy5fc3RhdGVTdG9yZTtcblxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlU3RvcmUuc2V0KHN0YXRlLmlkLCBzdGF0ZS50b1N0b3JhZ2VTdHJpbmcoKSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvY2Vzc1NpZ25pblJlc3BvbnNlKHVybCwgc3RhdGVTdG9yZSkge1xuICAgICAgICBMb2cuaW5mbyhcIk9pZGNDbGllbnQucHJvY2Vzc1NpZ25pblJlc3BvbnNlXCIpO1xuXG4gICAgICAgIHZhciByZXNwb25zZSA9IG5ldyBTaWduaW5SZXNwb25zZSh1cmwpO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2Uuc3RhdGUpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHN0YXRlIGluIHJlc3BvbnNlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHN0YXRlIGluIHJlc3BvbnNlXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlIHx8IHRoaXMuX3N0YXRlU3RvcmU7XG5cbiAgICAgICAgcmV0dXJuIHN0YXRlU3RvcmUucmVtb3ZlKHJlc3BvbnNlLnN0YXRlKS50aGVuKHN0b3JlZFN0YXRlU3RyaW5nID0+IHtcbiAgICAgICAgICAgIGlmICghc3RvcmVkU3RhdGVTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBtYXRjaGluZyBzdGF0ZSBmb3VuZCBpbiBzdG9yYWdlXCIpO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG1hdGNoaW5nIHN0YXRlIGZvdW5kIGluIHN0b3JhZ2VcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IFNpZ25pblN0YXRlLmZyb21TdG9yYWdlU3RyaW5nKHN0b3JlZFN0YXRlU3RyaW5nKTtcblxuICAgICAgICAgICAgTG9nLmluZm8oXCJSZWNlaXZlZCBzdGF0ZSBmcm9tIHN0b3JhZ2U7IHZhbGlkYXRpbmcgcmVzcG9uc2VcIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9yLnZhbGlkYXRlU2lnbmluUmVzcG9uc2Uoc3RhdGUsIHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY3JlYXRlU2lnbm91dFJlcXVlc3Qoe2lkX3Rva2VuX2hpbnQsIGRhdGEsIHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaX0gPSB7fSxcbiAgICAgICAgc3RhdGVTdG9yZVxuICAgICkge1xuICAgICAgICBMb2cuaW5mbyhcIk9pZGNDbGllbnQuY3JlYXRlU2lnbm91dFJlcXVlc3RcIik7XG5cbiAgICAgICAgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpID0gcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpIHx8IHRoaXMuX3NldHRpbmdzLnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldEVuZFNlc3Npb25FbmRwb2ludCgpLnRoZW4odXJsID0+IHtcbiAgICAgICAgICAgIGlmICghdXJsKSB7XG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gZW5kIHNlc3Npb24gZW5kcG9pbnQgdXJsIHJldHVybmVkXCIpO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vIGVuZCBzZXNzaW9uIGVuZHBvaW50XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBMb2cuaW5mbyhcIlJlY2VpdmVkIGVuZCBzZXNzaW9uIGVuZHBvaW50XCIsIHVybCk7XG5cbiAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFNpZ25vdXRSZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgaWRfdG9rZW5faGludCxcbiAgICAgICAgICAgICAgICBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmksXG4gICAgICAgICAgICAgICAgZGF0YVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHJlcXVlc3Quc3RhdGU7XG4gICAgICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIlNpZ25vdXQgcmVxdWVzdCBoYXMgc3RhdGUgdG8gcGVyc2lzdFwiKTtcblxuICAgICAgICAgICAgICAgIHN0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlIHx8IHRoaXMuX3N0YXRlU3RvcmU7XG4gICAgICAgICAgICAgICAgc3RhdGVTdG9yZS5zZXQoc3RhdGUuaWQsIHN0YXRlLnRvU3RvcmFnZVN0cmluZygpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb2Nlc3NTaWdub3V0UmVzcG9uc2UodXJsLCBzdGF0ZVN0b3JlKSB7XG4gICAgICAgIExvZy5pbmZvKFwiT2lkY0NsaWVudC5wcm9jZXNzU2lnbm91dFJlc3BvbnNlXCIpO1xuXG4gICAgICAgIHZhciByZXNwb25zZSA9IG5ldyBTaWdub3V0UmVzcG9uc2UodXJsKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5zdGF0ZSkge1xuICAgICAgICAgICAgTG9nLmluZm8oXCJObyBzdGF0ZSBpbiByZXNwb25zZVwiKTtcblxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgTG9nLndhcm4oXCJSZXNwb25zZSB3YXMgZXJyb3JcIiwgcmVzcG9uc2UuZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3JSZXNwb25zZShyZXNwb25zZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdGF0ZUtleSA9IHJlc3BvbnNlLnN0YXRlO1xuXG4gICAgICAgIHN0YXRlU3RvcmUgPSBzdGF0ZVN0b3JlIHx8IHRoaXMuX3N0YXRlU3RvcmU7XG5cbiAgICAgICAgcmV0dXJuIHN0YXRlU3RvcmUucmVtb3ZlKHN0YXRlS2V5KS50aGVuKHN0b3JlZFN0YXRlU3RyaW5nID0+IHtcbiAgICAgICAgICAgIGlmICghc3RvcmVkU3RhdGVTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBtYXRjaGluZyBzdGF0ZSBmb3VuZCBpbiBzdG9yYWdlXCIpO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG1hdGNoaW5nIHN0YXRlIGZvdW5kIGluIHN0b3JhZ2VcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IFN0YXRlLmZyb21TdG9yYWdlU3RyaW5nKHN0b3JlZFN0YXRlU3RyaW5nKTtcblxuICAgICAgICAgICAgTG9nLmluZm8oXCJSZWNlaXZlZCBzdGF0ZSBmcm9tIHN0b3JhZ2U7IHZhbGlkYXRpbmcgcmVzcG9uc2VcIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9yLnZhbGlkYXRlU2lnbm91dFJlc3BvbnNlKHN0YXRlLCByZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNsZWFyU3RhbGVTdGF0ZShzdGF0ZVN0b3JlKSB7XG4gICAgICAgIExvZy5pbmZvKFwiT2lkY0NsaWVudC5jbGVhclN0YWxlU3RhdGVcIik7XG5cbiAgICAgICAgc3RhdGVTdG9yZSA9IHN0YXRlU3RvcmUgfHwgdGhpcy5fc3RhdGVTdG9yZTtcblxuICAgICAgICByZXR1cm4gU3RhdGUuY2xlYXJTdGFsZVN0YXRlKHN0YXRlU3RvcmUsIHRoaXMuc2V0dGluZ3Muc3RhbGVTdGF0ZUFnZSk7XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvT2lkY0NsaWVudC5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IFdlYlN0b3JhZ2VTdGF0ZVN0b3JlIGZyb20gJy4vV2ViU3RvcmFnZVN0YXRlU3RvcmUnO1xuaW1wb3J0IFJlc3BvbnNlVmFsaWRhdG9yIGZyb20gJy4vUmVzcG9uc2VWYWxpZGF0b3InO1xuaW1wb3J0IE1ldGFkYXRhU2VydmljZSBmcm9tICcuL01ldGFkYXRhU2VydmljZSc7XG5cbmNvbnN0IE9pZGNNZXRhZGF0YVVybFBhdGggPSAnLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb24nO1xuXG5jb25zdCBEZWZhdWx0UmVzcG9uc2VUeXBlID0gXCJpZF90b2tlblwiO1xuY29uc3QgRGVmYXVsdFNjb3BlID0gXCJvcGVuaWRcIjtcbmNvbnN0IERlZmF1bHRTdGFsZVN0YXRlQWdlID0gNjA7IC8vIHNlY29uZHNcbmNvbnN0IERlZmF1bHRDbG9ja1NrZXdJblNlY29uZHMgPSA2MCAqIDU7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9pZGNDbGllbnRTZXR0aW5ncyB7XG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICAvLyBtZXRhZGF0YSByZWxhdGVkXG4gICAgICAgIGF1dGhvcml0eSwgbWV0YWRhdGFVcmwsIG1ldGFkYXRhLCBzaWduaW5nS2V5cyxcbiAgICAgICAgLy8gY2xpZW50IHJlbGF0ZWRcbiAgICAgICAgY2xpZW50X2lkLCByZXNwb25zZV90eXBlID0gRGVmYXVsdFJlc3BvbnNlVHlwZSwgc2NvcGUgPSBEZWZhdWx0U2NvcGUsXG4gICAgICAgIHJlZGlyZWN0X3VyaSwgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpLFxuICAgICAgICAvLyBvcHRpb25hbCBwcm90b2NvbFxuICAgICAgICBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGFjcl92YWx1ZXMsXG4gICAgICAgIC8vIGJlaGF2aW9yIGZsYWdzXG4gICAgICAgIGZpbHRlclByb3RvY29sQ2xhaW1zID0gdHJ1ZSwgbG9hZFVzZXJJbmZvID0gdHJ1ZSxcbiAgICAgICAgc3RhbGVTdGF0ZUFnZSA9IERlZmF1bHRTdGFsZVN0YXRlQWdlLCBjbG9ja1NrZXcgPSBEZWZhdWx0Q2xvY2tTa2V3SW5TZWNvbmRzLFxuICAgICAgICAvLyBvdGhlciBiZWhhdmlvclxuICAgICAgICBzdGF0ZVN0b3JlID0gbmV3IFdlYlN0b3JhZ2VTdGF0ZVN0b3JlKCksXG4gICAgICAgIFJlc3BvbnNlVmFsaWRhdG9yQ3RvciA9IFJlc3BvbnNlVmFsaWRhdG9yLFxuICAgICAgICBNZXRhZGF0YVNlcnZpY2VDdG9yID0gTWV0YWRhdGFTZXJ2aWNlXG4gICAgfSA9IHt9KSB7XG5cbiAgICAgICAgdGhpcy5fYXV0aG9yaXR5ID0gYXV0aG9yaXR5O1xuICAgICAgICB0aGlzLl9tZXRhZGF0YVVybCA9IG1ldGFkYXRhVXJsO1xuICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICAgICAgICB0aGlzLl9zaWduaW5nS2V5cyA9IHNpZ25pbmdLZXlzO1xuXG4gICAgICAgIHRoaXMuX2NsaWVudF9pZCA9IGNsaWVudF9pZDtcbiAgICAgICAgdGhpcy5fcmVzcG9uc2VfdHlwZSA9IHJlc3BvbnNlX3R5cGU7XG4gICAgICAgIHRoaXMuX3Njb3BlID0gc2NvcGU7XG4gICAgICAgIHRoaXMuX3JlZGlyZWN0X3VyaSA9IHJlZGlyZWN0X3VyaTtcbiAgICAgICAgdGhpcy5fcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpID0gcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpO1xuXG4gICAgICAgIHRoaXMuX3Byb21wdCA9IHByb21wdDtcbiAgICAgICAgdGhpcy5fZGlzcGxheSA9IGRpc3BsYXk7XG4gICAgICAgIHRoaXMuX21heF9hZ2UgPSBtYXhfYWdlO1xuICAgICAgICB0aGlzLl91aV9sb2NhbGVzID0gdWlfbG9jYWxlcztcbiAgICAgICAgdGhpcy5fYWNyX3ZhbHVlcyA9IGFjcl92YWx1ZXM7XG5cbiAgICAgICAgdGhpcy5fZmlsdGVyUHJvdG9jb2xDbGFpbXMgPSAhIWZpbHRlclByb3RvY29sQ2xhaW1zO1xuICAgICAgICB0aGlzLl9sb2FkVXNlckluZm8gPSAhIWxvYWRVc2VySW5mbztcbiAgICAgICAgdGhpcy5fc3RhbGVTdGF0ZUFnZSA9IHN0YWxlU3RhdGVBZ2U7XG4gICAgICAgIHRoaXMuX2Nsb2NrU2tldyA9IGNsb2NrU2tldztcblxuICAgICAgICB0aGlzLl9zdGF0ZVN0b3JlID0gc3RhdGVTdG9yZTtcbiAgICAgICAgdGhpcy5fdmFsaWRhdG9yID0gbmV3IFJlc3BvbnNlVmFsaWRhdG9yQ3Rvcih0aGlzKTtcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFTZXJ2aWNlID0gbmV3IE1ldGFkYXRhU2VydmljZUN0b3IodGhpcyk7XG4gICAgfVxuXG4gICAgLy8gY2xpZW50IGNvbmZpZ1xuICAgIGdldCBjbGllbnRfaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGllbnRfaWQ7XG4gICAgfVxuICAgIHNldCBjbGllbnRfaWQodmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jbGllbnRfaWQpIHtcbiAgICAgICAgICAgIC8vIG9uZS10aW1lIHNldCBvbmx5XG4gICAgICAgICAgICB0aGlzLl9jbGllbnRfaWQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcImNsaWVudF9pZCBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLlwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2xpZW50X2lkIGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQuXCIpXG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHJlc3BvbnNlX3R5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNwb25zZV90eXBlO1xuICAgIH1cbiAgICBnZXQgc2NvcGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zY29wZTtcbiAgICB9XG4gICAgZ2V0IHJlZGlyZWN0X3VyaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZGlyZWN0X3VyaTtcbiAgICB9XG4gICAgZ2V0IHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaTtcbiAgICB9XG5cblxuICAgIC8vIG9wdGlvbmFsIHByb3RvY29sIHBhcmFtc1xuICAgIGdldCBwcm9tcHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9tcHQ7XG4gICAgfVxuICAgIGdldCBkaXNwbGF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGxheTtcbiAgICB9XG4gICAgZ2V0IG1heF9hZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhfYWdlO1xuICAgIH1cbiAgICBnZXQgdWlfbG9jYWxlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VpX2xvY2FsZXM7XG4gICAgfVxuICAgIGdldCBhY3JfdmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWNyX3ZhbHVlcztcbiAgICB9XG5cblxuICAgIC8vIG1ldGFkYXRhXG4gICAgZ2V0IGF1dGhvcml0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dGhvcml0eTtcbiAgICB9XG4gICAgc2V0IGF1dGhvcml0eSh2YWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuX2F1dGhvcml0eSkge1xuICAgICAgICAgICAgLy8gb25lLXRpbWUgc2V0IG9ubHlcbiAgICAgICAgICAgIHRoaXMuX2F1dGhvcml0eSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiYXV0aG9yaXR5IGhhcyBhbHJlYWR5IGJlZW4gYXNzaWduZWQuXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdXRob3JpdHkgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZC5cIilcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbWV0YWRhdGFVcmwoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWV0YWRhdGFVcmwpIHtcbiAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsID0gdGhpcy5hdXRob3JpdHk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9tZXRhZGF0YVVybCAmJiB0aGlzLl9tZXRhZGF0YVVybC5pbmRleE9mKE9pZGNNZXRhZGF0YVVybFBhdGgpIDwgMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tZXRhZGF0YVVybFt0aGlzLl9tZXRhZGF0YVVybC5sZW5ndGggLSAxXSAhPT0gJy8nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhVXJsICs9ICcvJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFVcmwgKz0gT2lkY01ldGFkYXRhVXJsUGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVVybDtcbiAgICB9XG5cbiAgICAvLyBzZXR0YWJsZS9jYWNoYWJsZSBtZXRhZGF0YSB2YWx1ZXNcbiAgICBnZXQgbWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YTtcbiAgICB9XG4gICAgc2V0IG1ldGFkYXRhKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX21ldGFkYXRhID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IHNpZ25pbmdLZXlzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluZ0tleXM7XG4gICAgfVxuICAgIHNldCBzaWduaW5nS2V5cyh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9zaWduaW5nS2V5cyA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIGJlaGF2aW9yIGZsYWdzXG4gICAgZ2V0IGZpbHRlclByb3RvY29sQ2xhaW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyUHJvdG9jb2xDbGFpbXM7XG4gICAgfVxuICAgIGdldCBsb2FkVXNlckluZm8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkVXNlckluZm87XG4gICAgfVxuICAgIGdldCBzdGFsZVN0YXRlQWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhbGVTdGF0ZUFnZTtcbiAgICB9XG4gICAgZ2V0IGNsb2NrU2tldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb2NrU2tldztcbiAgICB9XG5cbiAgICBnZXQgc3RhdGVTdG9yZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlU3RvcmU7XG4gICAgfVxuICAgIGdldCB2YWxpZGF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3I7XG4gICAgfVxuICAgIGdldCBtZXRhZGF0YVNlcnZpY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2U7XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvT2lkY0NsaWVudFNldHRpbmdzLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViU3RvcmFnZVN0YXRlU3RvcmUge1xuICAgIGNvbnN0cnVjdG9yKHtwcmVmaXggPSBcIm9pZGMuXCIsIHN0b3JlID0gR2xvYmFsLmxvY2FsU3RvcmFnZX0gPSB7fSkge1xuICAgICAgICB0aGlzLl9zdG9yZSA9IHN0b3JlO1xuICAgICAgICB0aGlzLl9wcmVmaXggPSBwcmVmaXg7XG4gICAgfVxuXG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgTG9nLmluZm8oXCJXZWJTdG9yYWdlU3RhdGVTdG9yZS5zZXRcIiwga2V5KTtcblxuICAgICAgICBrZXkgPSB0aGlzLl9wcmVmaXggKyBrZXk7XG5cbiAgICAgICAgdGhpcy5fc3RvcmUuc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBnZXQoa2V5KSB7XG4gICAgICAgIExvZy5pbmZvKFwiV2ViU3RvcmFnZVN0YXRlU3RvcmUuZ2V0XCIsIGtleSk7XG5cbiAgICAgICAga2V5ID0gdGhpcy5fcHJlZml4ICsga2V5O1xuXG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5fc3RvcmUuZ2V0SXRlbShrZXkpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShpdGVtKTtcbiAgICB9XG5cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIExvZy5pbmZvKFwiV2ViU3RvcmFnZVN0YXRlU3RvcmUucmVtb3ZlXCIsIGtleSk7XG5cbiAgICAgICAga2V5ID0gdGhpcy5fcHJlZml4ICsga2V5O1xuXG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5fc3RvcmUuZ2V0SXRlbShrZXkpO1xuICAgICAgICB0aGlzLl9zdG9yZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGl0ZW0pO1xuICAgIH1cblxuICAgIGdldEFsbEtleXMoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiV2ViU3RvcmFnZVN0YXRlU3RvcmUuZ2V0QWxsS2V5c1wiKTtcblxuICAgICAgICB2YXIga2V5cyA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9zdG9yZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGxldCBrZXkgPSB0aGlzLl9zdG9yZS5rZXkoaW5kZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YodGhpcy5fcHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkuc3Vic3RyKHRoaXMuX3ByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShrZXlzKTtcbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9XZWJTdG9yYWdlU3RhdGVTdG9yZS5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmNvbnN0IHRpbWVyID0ge1xuICAgIHNldFRpbWVvdXQ6IGZ1bmN0aW9uIChjYiwgZHVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoY2IsIGR1cmF0aW9uKTtcbiAgICB9LFxuICAgIGNsZWFyVGltZW91dDogZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgfVxufTtcblxubGV0IHRlc3RpbmcgPSBmYWxzZTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2xvYmFsIHtcblxuICAgIHN0YXRpYyBfdGVzdGluZygpIHtcbiAgICAgICAgdGVzdGluZyA9IHRydWU7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBsb2NhdGlvbigpIHtcbiAgICAgICAgaWYgKCF0ZXN0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb247XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGdldCBsb2NhbFN0b3JhZ2UoKSB7XG4gICAgICAgIGlmICghdGVzdGluZykge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZ2V0IHNlc3Npb25TdG9yYWdlKCkge1xuICAgICAgICBpZiAoIXRlc3RpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZ2V0IFhNTEh0dHBSZXF1ZXN0KCkge1xuICAgICAgICBpZiAoIXRlc3RpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBYTUxIdHRwUmVxdWVzdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZ2V0IHRpbWVyKCkge1xuICAgICAgICBpZiAoIXRlc3RpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aW1lcjtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9HbG9iYWwuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBNZXRhZGF0YVNlcnZpY2UgZnJvbSAnLi9NZXRhZGF0YVNlcnZpY2UnO1xuaW1wb3J0IFVzZXJJbmZvU2VydmljZSBmcm9tICcuL1VzZXJJbmZvU2VydmljZSc7XG5pbXBvcnQgRXJyb3JSZXNwb25zZSBmcm9tICcuL0Vycm9yUmVzcG9uc2UnO1xuaW1wb3J0IEpvc2VVdGlsIGZyb20gJy4vSm9zZVV0aWwnO1xuXG5jb25zdCBQcm90b2NvbENsYWltcyA9IFtcIm5vbmNlXCIsIFwiYXRfaGFzaFwiLCBcImlhdFwiLCBcIm5iZlwiLCBcImV4cFwiLCBcImF1ZFwiLCBcImlzc1wiLCBcImNfaGFzaFwiXTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVzcG9uc2VWYWxpZGF0b3Ige1xuXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MsIE1ldGFkYXRhU2VydmljZUN0b3IgPSBNZXRhZGF0YVNlcnZpY2UsIFVzZXJJbmZvU2VydmljZUN0b3IgPSBVc2VySW5mb1NlcnZpY2UsIGpvc2VVdGlsID0gSm9zZVV0aWwpIHtcbiAgICAgICAgaWYgKCFzZXR0aW5ncykge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2V0dGluZ3MgcGFzc2VkIHRvIFJlc3BvbnNlVmFsaWRhdG9yXCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2V0dGluZ3NcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UgPSBuZXcgTWV0YWRhdGFTZXJ2aWNlQ3Rvcih0aGlzLl9zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvU2VydmljZSA9IG5ldyBVc2VySW5mb1NlcnZpY2VDdG9yKHRoaXMuX3NldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fam9zZVV0aWwgPSBqb3NlVXRpbDtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZVNpZ25pblJlc3BvbnNlKHN0YXRlLCByZXNwb25zZSkge1xuICAgICAgICBMb2cuaW5mbyhcIlJlc3BvbnNlVmFsaWRhdG9yLnZhbGlkYXRlU2lnbmluUmVzcG9uc2VcIik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NTaWduaW5QYXJhbXMoc3RhdGUsIHJlc3BvbnNlKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwic3RhdGUgcHJvY2Vzc2VkXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlVG9rZW5zKHN0YXRlLCByZXNwb25zZSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJ0b2tlbnMgdmFsaWRhdGVkXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzQ2xhaW1zKHJlc3BvbnNlKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJjbGFpbXMgcHJvY2Vzc2VkXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVTaWdub3V0UmVzcG9uc2Uoc3RhdGUsIHJlc3BvbnNlKSB7XG4gICAgICAgIExvZy5pbmZvKFwiUmVzcG9uc2VWYWxpZGF0b3IudmFsaWRhdGVTaWdub3V0UmVzcG9uc2VcIik7XG5cbiAgICAgICAgaWYgKHN0YXRlLmlkICE9PSByZXNwb25zZS5zdGF0ZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiU3RhdGUgZG9lcyBub3QgbWF0Y2hcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiU3RhdGUgZG9lcyBub3QgbWF0Y2hcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm93IHRoYXQgd2Uga25vdyB0aGUgc3RhdGUgbWF0Y2hlcywgdGFrZSB0aGUgc3RvcmVkIGRhdGFcbiAgICAgICAgLy8gYW5kIHNldCBpdCBpbnRvIHRoZSByZXNwb25zZSBzbyBjYWxsZXJzIGNhbiBnZXQgdGhlaXIgc3RhdGVcbiAgICAgICAgLy8gdGhpcyBpcyBpbXBvcnRhbnQgZm9yIGJvdGggc3VjY2VzcyAmIGVycm9yIG91dGNvbWVzXG4gICAgICAgIExvZy5pbmZvKFwic3RhdGUgdmFsaWRhdGVkXCIpO1xuICAgICAgICByZXNwb25zZS5zdGF0ZSA9IHN0YXRlLmRhdGE7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgICBMb2cud2FybihcIlJlc3BvbnNlIHdhcyBlcnJvclwiLCByZXNwb25zZS5lcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yUmVzcG9uc2UocmVzcG9uc2UpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xuICAgIH1cblxuICAgIF9wcm9jZXNzU2lnbmluUGFyYW1zKHN0YXRlLCByZXNwb25zZSkge1xuICAgICAgICBMb2cuaW5mbyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzU2lnbmluUGFyYW1zXCIpO1xuXG4gICAgICAgIGlmIChzdGF0ZS5pZCAhPT0gcmVzcG9uc2Uuc3RhdGUpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlN0YXRlIGRvZXMgbm90IG1hdGNoXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlN0YXRlIGRvZXMgbm90IG1hdGNoXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKCFzdGF0ZS5jbGllbnRfaWQpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGNsaWVudF9pZCBvbiBzdGF0ZVwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBjbGllbnRfaWQgb24gc3RhdGVcIikpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoIXN0YXRlLmF1dGhvcml0eSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gYXV0aG9yaXR5IG9uIHN0YXRlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGF1dGhvcml0eSBvbiBzdGF0ZVwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBhdXRob3JpdHkgdG8gYmUgbG9hZGVkIGZyb20gdGhlIHNpZ25pbiBzdGF0ZVxuICAgICAgICBpZiAoIXRoaXMuX3NldHRpbmdzLmF1dGhvcml0eSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3MuYXV0aG9yaXR5ID0gc3RhdGUuYXV0aG9yaXR5O1xuICAgICAgICB9XG4gICAgICAgIC8vIGVuc3VyZSB3ZSdyZSB1c2luZyB0aGUgY29ycmVjdCBhdXRob3JpdHkgaWYgdGhlIGF1dGhvcml0eSBpcyBub3QgbG9hZGVkIGZyb20gc2lnbmluIHN0YXRlXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3NldHRpbmdzLmF1dGhvcml0eSAmJiB0aGlzLl9zZXR0aW5ncy5hdXRob3JpdHkgIT09IHN0YXRlLmF1dGhvcml0eSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiYXV0aG9yaXR5IG1pc21hdGNoIG9uIHNldHRpbmdzIHZzLiBzaWduaW4gc3RhdGVcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiYXV0aG9yaXR5IG1pc21hdGNoIG9uIHNldHRpbmdzIHZzLiBzaWduaW4gc3RhdGVcIikpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBjbGllbnRfaWQgdG8gYmUgbG9hZGVkIGZyb20gdGhlIHNpZ25pbiBzdGF0ZVxuICAgICAgICBpZiAoIXRoaXMuX3NldHRpbmdzLmNsaWVudF9pZCkge1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3MuY2xpZW50X2lkID0gc3RhdGUuY2xpZW50X2lkO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVuc3VyZSB3ZSdyZSB1c2luZyB0aGUgY29ycmVjdCBjbGllbnRfaWQgaWYgdGhlIGNsaWVudF9pZCBpcyBub3QgbG9hZGVkIGZyb20gc2lnbmluIHN0YXRlXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3NldHRpbmdzLmNsaWVudF9pZCAmJiB0aGlzLl9zZXR0aW5ncy5jbGllbnRfaWQgIT09IHN0YXRlLmNsaWVudF9pZCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiY2xpZW50X2lkIG1pc21hdGNoIG9uIHNldHRpbmdzIHZzLiBzaWduaW4gc3RhdGVcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiY2xpZW50X2lkIG1pc21hdGNoIG9uIHNldHRpbmdzIHZzLiBzaWduaW4gc3RhdGVcIikpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBub3cgdGhhdCB3ZSBrbm93IHRoZSBzdGF0ZSBtYXRjaGVzLCB0YWtlIHRoZSBzdG9yZWQgZGF0YVxuICAgICAgICAvLyBhbmQgc2V0IGl0IGludG8gdGhlIHJlc3BvbnNlIHNvIGNhbGxlcnMgY2FuIGdldCB0aGVpciBzdGF0ZVxuICAgICAgICAvLyB0aGlzIGlzIGltcG9ydGFudCBmb3IgYm90aCBzdWNjZXNzICYgZXJyb3Igb3V0Y29tZXNcbiAgICAgICAgTG9nLmluZm8oXCJzdGF0ZSB2YWxpZGF0ZWRcIik7XG4gICAgICAgIHJlc3BvbnNlLnN0YXRlID0gc3RhdGUuZGF0YTtcblxuICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgICAgIExvZy53YXJuKFwiUmVzcG9uc2Ugd2FzIGVycm9yXCIsIHJlc3BvbnNlLmVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3JSZXNwb25zZShyZXNwb25zZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLm5vbmNlICYmICFyZXNwb25zZS5pZF90b2tlbikge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiRXhwZWN0aW5nIGlkX3Rva2VuIGluIHJlc3BvbnNlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGlkX3Rva2VuIGluIHJlc3BvbnNlXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc3RhdGUubm9uY2UgJiYgcmVzcG9uc2UuaWRfdG9rZW4pIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vdCBleHBlY3RpbmcgaWRfdG9rZW4gaW4gcmVzcG9uc2VcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5leHBlY3RlZCBpZF90b2tlbiBpbiByZXNwb25zZVwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICBfcHJvY2Vzc0NsYWltcyhyZXNwb25zZSkge1xuICAgICAgICBMb2cuaW5mbyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9wcm9jZXNzQ2xhaW1zXCIpO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5pc09wZW5JZENvbm5lY3QpIHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwicmVzcG9uc2UgaXMgT0lEQywgcHJvY2Vzc2luZyBjbGFpbXNcIik7XG5cbiAgICAgICAgICAgIHJlc3BvbnNlLnByb2ZpbGUgPSB0aGlzLl9maWx0ZXJQcm90b2NvbENsYWltcyhyZXNwb25zZS5wcm9maWxlKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLmxvYWRVc2VySW5mbyAmJiByZXNwb25zZS5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcImxvYWRpbmcgdXNlciBpbmZvXCIpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJJbmZvU2VydmljZS5nZXRDbGFpbXMocmVzcG9uc2UuYWNjZXNzX3Rva2VuKS50aGVuKGNsYWltcyA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucHJvZmlsZSA9IHRoaXMuX21lcmdlQ2xhaW1zKHJlc3BvbnNlLnByb2ZpbGUsIGNsYWltcyk7XG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwidXNlciBpbmZvIGNsYWltcyByZWNlaXZlZCwgdXBkYXRlZCBwcm9maWxlOlwiLCByZXNwb25zZS5wcm9maWxlKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIm5vdCBsb2FkaW5nIHVzZXIgaW5mb1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwicmVzcG9uc2UgaXMgbm90IE9JREMsIG5vdCBwcm9jZXNzaW5nIGNsYWltc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xuICAgIH1cblxuICAgIF9tZXJnZUNsYWltcyhjbGFpbXMxLCBjbGFpbXMyKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBjbGFpbXMxKTtcblxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGNsYWltczIpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBjbGFpbXMyW25hbWVdO1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0W25hbWVdKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0W25hbWVdLmluZGV4T2YodmFsdWUpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W25hbWVdLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdFtuYW1lXSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gW3Jlc3VsdFtuYW1lXSwgdmFsdWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgX2ZpbHRlclByb3RvY29sQ2xhaW1zKGNsYWltcykge1xuICAgICAgICBMb2cuaW5mbyhcIlJlc3BvbnNlVmFsaWRhdG9yLl9maWx0ZXJQcm90b2NvbENsYWltcywgaW5jb21pbmcgY2xhaW1zOlwiLCBjbGFpbXMpO1xuXG4gICAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBjbGFpbXMpO1xuXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5fZmlsdGVyUHJvdG9jb2xDbGFpbXMpIHtcbiAgICAgICAgICAgIFByb3RvY29sQ2xhaW1zLmZvckVhY2godHlwZSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdFt0eXBlXTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBMb2cuaW5mbyhcInByb3RvY29sIGNsYWltcyBmaWx0ZXJlZFwiLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTG9nLmluZm8oXCJwcm90b2NvbCBjbGFpbXMgbm90IGZpbHRlcmVkXCIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIF92YWxpZGF0ZVRva2VucyhzdGF0ZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgTG9nLmluZm8oXCJSZXNwb25zZVZhbGlkYXRvci5fdmFsaWRhdGVUb2tlbnNcIik7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLmlkX3Rva2VuKSB7XG5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIlZhbGlkYXRpbmcgaWRfdG9rZW4gYW5kIGFjY2Vzc190b2tlblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVJZFRva2VuQW5kQWNjZXNzVG9rZW4oc3RhdGUsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgTG9nLmluZm8oXCJWYWxpZGF0aW5nIGlkX3Rva2VuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlSWRUb2tlbihzdGF0ZSwgcmVzcG9uc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgTG9nLmluZm8oXCJObyBpZF90b2tlbiB0byB2YWxpZGF0ZVwiKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlSWRUb2tlbkFuZEFjY2Vzc1Rva2VuKHN0YXRlLCByZXNwb25zZSkge1xuICAgICAgICBMb2cuaW5mbyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUlkVG9rZW5BbmRBY2Nlc3NUb2tlblwiKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVJZFRva2VuKHN0YXRlLCByZXNwb25zZSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVBY2Nlc3NUb2tlbihyZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZUlkVG9rZW4oc3RhdGUsIHJlc3BvbnNlKSB7XG4gICAgICAgIExvZy5pbmZvKFwiUmVzcG9uc2VWYWxpZGF0b3IuX3ZhbGlkYXRlSWRUb2tlblwiKTtcblxuICAgICAgICBpZiAoIXN0YXRlLm5vbmNlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBub25jZSBvbiBzdGF0ZVwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBub25jZSBvbiBzdGF0ZVwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBqd3QgPSB0aGlzLl9qb3NlVXRpbC5wYXJzZUp3dChyZXNwb25zZS5pZF90b2tlbik7XG4gICAgICAgIGlmICghand0IHx8ICFqd3QuaGVhZGVyIHx8ICFqd3QucGF5bG9hZCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIGlkX3Rva2VuXCIsIGp3dCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIGlkX3Rva2VuXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZS5ub25jZSAhPT0gand0LnBheWxvYWQubm9uY2UpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkludmFsaWQgbm9uY2UgaW4gaWRfdG9rZW5cIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBub25jZSBpbiBpZF90b2tlblwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIga2lkID0gand0LmhlYWRlci5raWQ7XG4gICAgICAgIGlmICgha2lkKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBraWQgZm91bmQgaW4gaWRfdG9rZW5cIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8ga2lkIGZvdW5kIGluIGlkX3Rva2VuXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0SXNzdWVyKCkudGhlbihpc3N1ZXIgPT4ge1xuICAgICAgICAgICAgTG9nLmluZm8oXCJSZWNlaXZlZCBpc3N1ZXJcIik7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YVNlcnZpY2UuZ2V0U2lnbmluZ0tleXMoKS50aGVuKGtleXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmICgha2V5cykge1xuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBzaWduaW5nIGtleXMgZnJvbSBtZXRhZGF0YVwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHNpZ25pbmcga2V5cyBmcm9tIG1ldGFkYXRhXCIpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIlJlY2VpdmVkIHNpZ25pbmcga2V5c1wiKTtcblxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBrZXlzLmZpbHRlcihrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5LmtpZCA9PT0ga2lkO1xuICAgICAgICAgICAgICAgIH0pWzBdO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8ga2V5IG1hdGNoaW5nIGtpZCBmb3VuZCBpbiBzaWduaW5nIGtleXNcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBrZXkgbWF0Y2hpbmcga2lkIGZvdW5kIGluIHNpZ25pbmcga2V5c1wiKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGF1ZGllbmNlID0gc3RhdGUuY2xpZW50X2lkO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCBjbG9ja1NrZXdJblNlY29uZHMgPSB0aGlzLl9zZXR0aW5ncy5jbG9ja1NrZXc7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJWYWxpZGFpbmcgSldUOyB1c2luZyBjbG9jayBza2V3IChpbiBzZWNvbmRzKSBvZjogXCIsIGNsb2NrU2tld0luU2Vjb25kcyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fam9zZVV0aWwudmFsaWRhdGVKd3QocmVzcG9uc2UuaWRfdG9rZW4sIGtleSwgaXNzdWVyLCBhdWRpZW5jZSwgY2xvY2tTa2V3SW5TZWNvbmRzKS50aGVuKCgpPT57XG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiSldUIHZhbGlkYXRpb24gc3VjY2Vzc2Z1bFwiKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnByb2ZpbGUgPSBqd3QucGF5bG9hZDtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVBY2Nlc3NUb2tlbihyZXNwb25zZSkge1xuICAgICAgICBMb2cuaW5mbyhcIlJlc3BvbnNlVmFsaWRhdG9yLl92YWxpZGF0ZUFjY2Vzc1Rva2VuXCIpO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2UucHJvZmlsZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gcHJvZmlsZSBsb2FkZWQgZnJvbSBpZF90b2tlblwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBwcm9maWxlIGxvYWRlZCBmcm9tIGlkX3Rva2VuXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcmVzcG9uc2UucHJvZmlsZS5hdF9oYXNoKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBhdF9oYXNoIGluIGlkX3Rva2VuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIGF0X2hhc2ggaW4gaWRfdG9rZW5cIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5pZF90b2tlbikge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gaWRfdG9rZW5cIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gaWRfdG9rZW5cIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGp3dCA9IHRoaXMuX2pvc2VVdGlsLnBhcnNlSnd0KHJlc3BvbnNlLmlkX3Rva2VuKTtcbiAgICAgICAgaWYgKCFqd3QgfHwgIWp3dC5oZWFkZXIpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiLCBqd3QpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkZhaWxlZCB0byBwYXJzZSBpZF90b2tlblwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGFzaEFsZyA9IGp3dC5oZWFkZXIuYWxnO1xuICAgICAgICBpZiAoIWhhc2hBbGcgfHwgaGFzaEFsZy5sZW5ndGggIT09IDUpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIlVuc3VwcG9ydGVkIGFsZzpcIiwgaGFzaEFsZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOiBcIiArIGhhc2hBbGcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBoYXNoQml0cyA9IGhhc2hBbGcuc3Vic3RyKDIsIDMpO1xuICAgICAgICBpZiAoIWhhc2hCaXRzKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6XCIsIGhhc2hBbGcsIGhhc2hCaXRzKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBhbGc6IFwiICsgaGFzaEFsZykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaGFzaEJpdHMgPSBwYXJzZUludChoYXNoQml0cyk7XG4gICAgICAgIGlmIChoYXNoQml0cyAhPT0gMjU2ICYmIGhhc2hCaXRzICE9PSAzODQgJiYgaGFzaEJpdHMgIT09IDUxMikge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOlwiLCBoYXNoQWxnLCBoYXNoQml0cyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnOiBcIiArIGhhc2hBbGcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzaGEgPSBcInNoYVwiICsgaGFzaEJpdHM7XG4gICAgICAgIHZhciBoYXNoID0gdGhpcy5fam9zZVV0aWwuaGFzaFN0cmluZyhyZXNwb25zZS5hY2Nlc3NfdG9rZW4sIHNoYSk7XG4gICAgICAgIGlmICghaGFzaCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiYWNjZXNzX3Rva2VuIGhhc2ggZmFpbGVkOlwiLCBzaGEpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkZhaWxlZCB0byB2YWxpZGF0ZSBhdF9oYXNoXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsZWZ0ID0gaGFzaC5zdWJzdHIoMCwgaGFzaC5sZW5ndGggLyAyKTtcbiAgICAgICAgdmFyIGxlZnRfYjY0dSA9IHRoaXMuX2pvc2VVdGlsLmhleFRvQmFzZTY0VXJsKGxlZnQpO1xuICAgICAgICBpZiAobGVmdF9iNjR1ICE9PSByZXNwb25zZS5wcm9maWxlLmF0X2hhc2gpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIkZhaWxlZCB0byB2YWxpZGF0ZSBhdF9oYXNoXCIsIGxlZnRfYjY0dSwgcmVzcG9uc2UucHJvZmlsZS5hdF9oYXNoKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gdmFsaWRhdGUgYXRfaGFzaFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICB9XG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvUmVzcG9uc2VWYWxpZGF0b3IuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBKc29uU2VydmljZSBmcm9tICcuL0pzb25TZXJ2aWNlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWV0YWRhdGFTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncywgSnNvblNlcnZpY2VDdG9yID0gSnNvblNlcnZpY2UpIHtcbiAgICAgICAgaWYgKCFzZXR0aW5ncykge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2V0dGluZ3MgcGFzc2VkIHRvIE1ldGFkYXRhU2VydmljZVwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldHRpbmdzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgICAgdGhpcy5fanNvblNlcnZpY2UgPSBuZXcgSnNvblNlcnZpY2VDdG9yKCk7XG4gICAgfVxuXG4gICAgZ2V0TWV0YWRhdGEoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiTWV0YWRhdGFTZXJ2aWNlLmdldE1ldGFkYXRhXCIpO1xuXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YSkge1xuICAgICAgICAgICAgTG9nLmluZm8oXCJSZXR1cm5pbmcgbWV0YWRhdGEgZnJvbSBzZXR0aW5nc1wiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fc2V0dGluZ3MubWV0YWRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YVVybCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gbWV0YWRhdGFVcmwgY29uZmlndXJlZCBvbiBzZXR0aW5nc1wiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJObyBtZXRhZGF0YVVybCBjb25maWd1cmVkIG9uIHNldHRpbmdzXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIExvZy5pbmZvKFwiZ2V0dGluZyBtZXRhZGF0YSBmcm9tXCIsIHRoaXMuX3NldHRpbmdzLm1ldGFkYXRhVXJsKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fanNvblNlcnZpY2UuZ2V0SnNvbih0aGlzLl9zZXR0aW5ncy5tZXRhZGF0YVVybClcbiAgICAgICAgICAgIC50aGVuKG1ldGFkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcImpzb24gcmVjZWl2ZWRcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3MubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGE7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgZ2V0SXNzdWVyKCkge1xuICAgICAgICBMb2cuaW5mbyhcIk1ldGFkYXRhU2VydmljZS5nZXRJc3N1ZXJcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwiaXNzdWVyXCIpO1xuICAgIH1cblxuICAgIGdldEF1dGhvcml6YXRpb25FbmRwb2ludCgpIHtcbiAgICAgICAgTG9nLmluZm8oXCJNZXRhZGF0YVNlcnZpY2UuZ2V0QXV0aG9yaXphdGlvbkVuZHBvaW50XCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0YWRhdGFQcm9wZXJ0eShcImF1dGhvcml6YXRpb25fZW5kcG9pbnRcIik7XG4gICAgfVxuXG4gICAgZ2V0VXNlckluZm9FbmRwb2ludCgpIHtcbiAgICAgICAgTG9nLmluZm8oXCJNZXRhZGF0YVNlcnZpY2UuZ2V0VXNlckluZm9FbmRwb2ludFwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJ1c2VyaW5mb19lbmRwb2ludFwiKTtcbiAgICB9XG4gICAgXG4gICAgZ2V0Q2hlY2tTZXNzaW9uSWZyYW1lKCkge1xuICAgICAgICBMb2cuaW5mbyhcIk1ldGFkYXRhU2VydmljZS5nZXRDaGVja1Nlc3Npb25JZnJhbWVcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwiY2hlY2tfc2Vzc2lvbl9pZnJhbWVcIiwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgZ2V0RW5kU2Vzc2lvbkVuZHBvaW50KCkge1xuICAgICAgICBMb2cuaW5mbyhcIk1ldGFkYXRhU2VydmljZS5nZXRFbmRTZXNzaW9uRW5kcG9pbnRcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRhZGF0YVByb3BlcnR5KFwiZW5kX3Nlc3Npb25fZW5kcG9pbnRcIiwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgX2dldE1ldGFkYXRhUHJvcGVydHkobmFtZSwgb3B0aW9uYWw9ZmFsc2UpIHtcbiAgICAgICAgTG9nLmluZm8oXCJNZXRhZGF0YVNlcnZpY2UuX2dldE1ldGFkYXRhUHJvcGVydHlcIiwgbmFtZSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGEoKS50aGVuKG1ldGFkYXRhID0+IHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwibWV0YWRhdGEgcmVjaWV2ZWRcIik7XG5cbiAgICAgICAgICAgIGlmIChtZXRhZGF0YVtuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWwgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLndhcm4oXCJNZXRhZGF0YSBkb2VzIG5vdCBjb250YWluIG9wdGlvbmFsIHByb3BlcnR5IFwiICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJNZXRhZGF0YSBkb2VzIG5vdCBjb250YWluIHByb3BlcnR5IFwiICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGFkYXRhIGRvZXMgbm90IGNvbnRhaW4gcHJvcGVydHkgXCIgKyBuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YVtuYW1lXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0U2lnbmluZ0tleXMoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiTWV0YWRhdGFTZXJ2aWNlLmdldFNpZ25pbmdLZXlzXCIpO1xuXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5zaWduaW5nS2V5cykge1xuICAgICAgICAgICAgTG9nLmluZm8oXCJSZXR1cm5pbmcgc2lnbmluZ0tleXMgZnJvbSBzZXR0aW5nc1wiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fc2V0dGluZ3Muc2lnbmluZ0tleXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldGFkYXRhUHJvcGVydHkoXCJqd2tzX3VyaVwiKS50aGVuKGp3a3NfdXJpID0+IHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwiandrc191cmkgcmVjZWl2ZWRcIiwgandrc191cmkpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fanNvblNlcnZpY2UuZ2V0SnNvbihqd2tzX3VyaSkudGhlbihrZXlTZXQgPT4ge1xuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwia2V5IHNldCByZWNlaXZlZFwiLCBrZXlTZXQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFrZXlTZXQua2V5cykge1xuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJNaXNzaW5nIGtleXMgb24ga2V5c2V0XCIpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGtleXMgb24ga2V5c2V0XCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJlZEtleXMgPSB0aGlzLl9maWx0ZXJTaWduaW5nS2V5cyhrZXlTZXQua2V5cyk7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJmaWx0ZXJlZCBrZXlzXCIsIGZpbHRlcmVkS2V5cyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9zZXR0aW5ncy5zaWduaW5nS2V5cyA9IGZpbHRlcmVkS2V5cztcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3Muc2lnbmluZ0tleXM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2ZpbHRlclNpZ25pbmdLZXlzKGtleXMpIHtcbiAgICAgICAgTG9nLmluZm8oXCJNZXRhZGF0YVNlcnZpY2UuX2ZpbHRlclNpZ25pbmdLZXlzXCIsIGtleXMpO1xuXG4gICAgICAgIHJldHVybiBrZXlzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLnVzZSA9PT0gXCJzaWdcIjtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvTWV0YWRhdGFTZXJ2aWNlLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSnNvblNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKFhNTEh0dHBSZXF1ZXN0Q3RvciA9IEdsb2JhbC5YTUxIdHRwUmVxdWVzdCkge1xuICAgICAgICB0aGlzLl9YTUxIdHRwUmVxdWVzdCA9IFhNTEh0dHBSZXF1ZXN0Q3RvcjtcbiAgICB9XG4gICAgXG4gICAgZ2V0SnNvbih1cmwsIHRva2VuKSB7XG4gICAgICAgIExvZy5pbmZvKFwiSnNvblNlcnZpY2UuZ2V0SnNvblwiLCB1cmwpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCF1cmwpe1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gdXJsIHBhc3NlZFwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVybFwiKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHJlcSA9IG5ldyB0aGlzLl9YTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHVybCk7XG5cbiAgICAgICAgICAgIHJlcS5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIkhUVFAgcmVzcG9uc2UgcmVjZWl2ZWQsIHN0YXR1c1wiLCByZXEuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAocmVxLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoSlNPTi5wYXJzZShyZXEucmVzcG9uc2VUZXh0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IocmVxLnN0YXR1c1RleHQgKyBcIiAoXCIgKyByZXEuc3RhdHVzICsgXCIpXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIm5ldHdvcmsgZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKFwiTmV0d29yayBFcnJvclwiKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInRva2VuIHBhc3NlZCwgc2V0dGluZyBBdXRob3JpemF0aW9uIGhlYWRlclwiKTtcbiAgICAgICAgICAgICAgICByZXEuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIgKyB0b2tlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlcS5zZW5kKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9Kc29uU2VydmljZS5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBKc29uU2VydmljZSBmcm9tICcuL0pzb25TZXJ2aWNlJztcbmltcG9ydCBNZXRhZGF0YVNlcnZpY2UgZnJvbSAnLi9NZXRhZGF0YVNlcnZpY2UnO1xuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJJbmZvU2VydmljZSB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MsIEpzb25TZXJ2aWNlQ3RvciA9IEpzb25TZXJ2aWNlLCBNZXRhZGF0YVNlcnZpY2VDdG9yID0gTWV0YWRhdGFTZXJ2aWNlKSB7XG4gICAgICAgIGlmICghc2V0dGluZ3MpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHNldHRpbmdzIHBhc3NlZCB0byBVc2VySW5mb1NlcnZpY2VcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXR0aW5nc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX2pzb25TZXJ2aWNlID0gbmV3IEpzb25TZXJ2aWNlQ3RvcigpO1xuICAgICAgICB0aGlzLl9tZXRhZGF0YVNlcnZpY2UgPSBuZXcgTWV0YWRhdGFTZXJ2aWNlQ3Rvcih0aGlzLl9zZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgZ2V0Q2xhaW1zKHRva2VuKSB7XG4gICAgICAgIExvZy5pbmZvKFwiVXNlckluZm9TZXJ2aWNlLmdldENsYWltc1wiKTtcblxuICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyB0b2tlbiBwYXNzZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQSB0b2tlbiBpcyByZXF1aXJlZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFTZXJ2aWNlLmdldFVzZXJJbmZvRW5kcG9pbnQoKS50aGVuKHVybCA9PiB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcInJlY2VpdmVkIHVzZXJpbmZvIHVybFwiLCB1cmwpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fanNvblNlcnZpY2UuZ2V0SnNvbih1cmwsIHRva2VuKS50aGVuKGNsYWltcyA9PiB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJjbGFpbXMgcmVjZWl2ZWRcIiwgY2xhaW1zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhaW1zO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1VzZXJJbmZvU2VydmljZS5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFcnJvclJlc3BvbnNlIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHtlcnJvciwgZXJyb3JfZGVzY3JpcHRpb24sIGVycm9yX3VyaSwgc3RhdGV9PXt9XG4gICAgKSB7XG4gICAgICAgICBpZiAoIWVycm9yKXtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGVycm9yIHBhc3NlZCB0byBFcnJvclJlc3BvbnNlXCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXJyb3JcIik7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHN1cGVyKGVycm9yX2Rlc2NyaXB0aW9uIHx8IGVycm9yKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMubmFtZSA9IFwiRXJyb3JSZXNwb25zZVwiOyBcbiAgICAgICAgXG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5lcnJvcl9kZXNjcmlwdGlvbiA9IGVycm9yX2Rlc2NyaXB0aW9uO1xuICAgICAgICB0aGlzLmVycm9yX3VyaSA9IGVycm9yX3VyaTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9FcnJvclJlc3BvbnNlLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IHsgandzLCBLRVlVVElMIGFzIEtleVV0aWwsIFg1MDksIGNyeXB0bywgaGV4dG9iNjR1IH0gZnJvbSAnanNyc2FzaWduJztcbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5jb25zdCBBbGxvd2VkU2lnbmluZ0FsZ3MgPSBbJ1JTMjU2JywgJ1JTMzg0JywgJ1JTNTEyJywgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJywgJ0VTMjU2JywgJ0VTMzg0JywgJ0VTNTEyJ107XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpvc2VVdGlsIHtcblxuICAgIHN0YXRpYyBwYXJzZUp3dChqd3QpIHtcbiAgICAgICAgTG9nLmluZm8oXCJKb3NlVXRpbC5wYXJzZUp3dFwiKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciB0b2tlbiA9IGp3cy5KV1MucGFyc2Uoand0KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaGVhZGVyOiB0b2tlbi5oZWFkZXJPYmosXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogdG9rZW4ucGF5bG9hZE9ialxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGVKd3Qoand0LCBrZXksIGlzc3VlciwgYXVkaWVuY2UsIGNsb2NrU2tldywgbm93KSB7XG4gICAgICAgIExvZy5pbmZvKFwiSm9zZVV0aWwudmFsaWRhdGVKd3RcIik7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChrZXkua3R5ID09PSBcIlJTQVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleS5lICYmIGtleS5uKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IEtleVV0aWwuZ2V0S2V5KGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleS54NWMgJiYga2V5Lng1Yy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gS2V5VXRpbC5nZXRLZXkoWDUwOS5nZXRQdWJsaWNLZXlGcm9tQ2VydFBFTShrZXkueDVjWzBdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJSU0Ega2V5IG1pc3Npbmcga2V5IG1hdGVyaWFsXCIsIGtleSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJSU0Ega2V5IG1pc3Npbmcga2V5IG1hdGVyaWFsXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChrZXkua3R5ID09PSBcIkVDXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5LmNydiAmJiBrZXkueCAmJiBrZXkueSkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBLZXlVdGlsLmdldEtleShrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmVycm9yKFwiRUMga2V5IG1pc3Npbmcga2V5IG1hdGVyaWFsXCIsIGtleSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJFQyBrZXkgbWlzc2luZyBrZXkgbWF0ZXJpYWxcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIlVuc3VwcG9ydGVkIGtleSB0eXBlXCIsIGtleSAmJiBrZXkua3R5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQga2V5IHR5cGU6IFwiICsga2V5ICYmIGtleS5rdHkpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIEpvc2VVdGlsLl92YWxpZGF0ZUp3dChqd3QsIGtleSwgaXNzdWVyLCBhdWRpZW5jZSwgY2xvY2tTa2V3LCBub3cpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoZSAmJiBlLm1lc3NhZ2UgfHwgZSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJKV1QgdmFsaWRhdGlvbiBmYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgX3ZhbGlkYXRlSnd0KGp3dCwga2V5LCBpc3N1ZXIsIGF1ZGllbmNlLCBjbG9ja1NrZXcsIG5vdykge1xuICAgICAgICBMb2cuaW5mbyhcIkpvc2VVdGlsLl92YWxpZGF0ZUp3dFwiKTtcblxuICAgICAgICBpZiAoIWNsb2NrU2tldykge1xuICAgICAgICAgICAgY2xvY2tTa2V3ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbm93KSB7XG4gICAgICAgICAgICBub3cgPSBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGF5bG9hZCA9IEpvc2VVdGlsLnBhcnNlSnd0KGp3dCkucGF5bG9hZDtcblxuICAgICAgICBpZiAocGF5bG9hZC5pc3MgIT09IGlzc3Vlcikge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiSW52YWxpZCBpc3N1ZXIgaW4gdG9rZW5cIiwgcGF5bG9hZC5pc3MpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgaXNzdWVyIGluIHRva2VuOiBcIiArIHBheWxvYWQuaXNzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF5bG9hZC5hdWQgIT09IGF1ZGllbmNlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJJbnZhbGlkIGF1ZGllbmNlIGluIHRva2VuXCIsIHBheWxvYWQuYXVkKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIGF1ZGllbmNlIGluIHRva2VuOiBcIiArIHBheWxvYWQuYXVkKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG93ZXJOb3cgPSBub3cgKyBjbG9ja1NrZXc7XG4gICAgICAgIHZhciB1cHBlck5vdyA9IG5vdyAtIGNsb2NrU2tldztcblxuICAgICAgICBpZiAobG93ZXJOb3cgPCBwYXlsb2FkLmlhdCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiaWF0IGlzIGluIHRoZSBmdXR1cmVcIiwgcGF5bG9hZC5pYXQpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImlhdCBpcyBpbiB0aGUgZnV0dXJlOiBcIiArIHBheWxvYWQuaWF0KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG93ZXJOb3cgPCBwYXlsb2FkLm5iZikge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwibmJmIGlzIGluIHRoZSBmdXR1cmVcIiwgcGF5bG9hZC5uYmYpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIm5iZiBpcyBpbiB0aGUgZnV0dXJlOiBcIiArIHBheWxvYWQubmJmKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF5bG9hZC5leHAgPCB1cHBlck5vdykge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiZXhwIGlzIGluIHRoZSBwYXN0XCIsIHBheWxvYWQuZXhwKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJleHAgaXMgaW4gdGhlIHBhc3Q6XCIgKyBwYXlsb2FkLmV4cCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghandzLkpXUy52ZXJpZnkoand0LCBrZXksIEFsbG93ZWRTaWduaW5nQWxncykpIHtcbiAgICAgICAgICAgICAgICBMb2cuZXJyb3IoXCJzaWduYXR1cmUgdmFsaWRhdGlvbiBmYWlsZWRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcInNpZ25hdHVyZSB2YWxpZGF0aW9uIGZhaWxlZFwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihlICYmIGUubWVzc2FnZSB8fCBlKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJzaWduYXR1cmUgdmFsaWRhdGlvbiBmYWlsZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBoYXNoU3RyaW5nKHZhbHVlLCBhbGcpIHtcbiAgICAgICAgTG9nLmluZm8oXCJKb3NlVXRpbC5oYXNoU3RyaW5nXCIsIHZhbHVlLCBhbGcpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGNyeXB0by5VdGlsLmhhc2hTdHJpbmcodmFsdWUsIGFsZyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBoZXhUb0Jhc2U2NFVybCh2YWx1ZSkge1xuICAgICAgICBMb2cuaW5mbyhcIkpvc2VVdGlsLmhleFRvQmFzZTY0VXJsXCIsIHZhbHVlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBoZXh0b2I2NHUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9Kb3NlVXRpbC5qc1xuICoqLyIsIlxudmFyIG5hdmlnYXRvciA9IHt9O1xubmF2aWdhdG9yLnVzZXJBZ2VudCA9IGZhbHNlO1xuXG52YXIgd2luZG93ID0ge307XG4vKlxuICoganNyc2FzaWduIDUuMC4xMiAoYykgMjAxMC0yMDE2IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cblxuLypcbnlhaG9vLW1pbi5qc1xuQ29weXJpZ2h0IChjKSAyMDExLCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuQ29kZSBsaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2U6XG5odHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS95dWkvbGljZW5zZS5odG1sXG52ZXJzaW9uOiAyLjkuMFxuKi9cbmlmKHR5cGVvZiBZQUhPTz09XCJ1bmRlZmluZWRcInx8IVlBSE9PKXt2YXIgWUFIT089e307fVlBSE9PLm5hbWVzcGFjZT1mdW5jdGlvbigpe3ZhciBiPWFyZ3VtZW50cyxnPW51bGwsZSxjLGY7Zm9yKGU9MDtlPGIubGVuZ3RoO2U9ZSsxKXtmPShcIlwiK2JbZV0pLnNwbGl0KFwiLlwiKTtnPVlBSE9PO2ZvcihjPShmWzBdPT1cIllBSE9PXCIpPzE6MDtjPGYubGVuZ3RoO2M9YysxKXtnW2ZbY11dPWdbZltjXV18fHt9O2c9Z1tmW2NdXTt9fXJldHVybiBnO307WUFIT08ubG9nPWZ1bmN0aW9uKGQsYSxjKXt2YXIgYj1ZQUhPTy53aWRnZXQuTG9nZ2VyO2lmKGImJmIubG9nKXtyZXR1cm4gYi5sb2coZCxhLGMpO31lbHNle3JldHVybiBmYWxzZTt9fTtZQUhPTy5yZWdpc3Rlcj1mdW5jdGlvbihhLGYsZSl7dmFyIGs9WUFIT08uZW52Lm1vZHVsZXMsYyxqLGgsZyxkO2lmKCFrW2FdKXtrW2FdPXt2ZXJzaW9uczpbXSxidWlsZHM6W119O31jPWtbYV07aj1lLnZlcnNpb247aD1lLmJ1aWxkO2c9WUFIT08uZW52Lmxpc3RlbmVycztjLm5hbWU9YTtjLnZlcnNpb249ajtjLmJ1aWxkPWg7Yy52ZXJzaW9ucy5wdXNoKGopO2MuYnVpbGRzLnB1c2goaCk7Yy5tYWluQ2xhc3M9Zjtmb3IoZD0wO2Q8Zy5sZW5ndGg7ZD1kKzEpe2dbZF0oYyk7fWlmKGYpe2YuVkVSU0lPTj1qO2YuQlVJTEQ9aDt9ZWxzZXtZQUhPTy5sb2coXCJtYWluQ2xhc3MgaXMgdW5kZWZpbmVkIGZvciBtb2R1bGUgXCIrYSxcIndhcm5cIik7fX07WUFIT08uZW52PVlBSE9PLmVudnx8e21vZHVsZXM6W10sbGlzdGVuZXJzOltdfTtZQUhPTy5lbnYuZ2V0VmVyc2lvbj1mdW5jdGlvbihhKXtyZXR1cm4gWUFIT08uZW52Lm1vZHVsZXNbYV18fG51bGw7fTtZQUhPTy5lbnYucGFyc2VVQT1mdW5jdGlvbihkKXt2YXIgZT1mdW5jdGlvbihpKXt2YXIgaj0wO3JldHVybiBwYXJzZUZsb2F0KGkucmVwbGFjZSgvXFwuL2csZnVuY3Rpb24oKXtyZXR1cm4oaisrPT0xKT9cIlwiOlwiLlwiO30pKTt9LGg9bmF2aWdhdG9yLGc9e2llOjAsb3BlcmE6MCxnZWNrbzowLHdlYmtpdDowLGNocm9tZTowLG1vYmlsZTpudWxsLGFpcjowLGlwYWQ6MCxpcGhvbmU6MCxpcG9kOjAsaW9zOm51bGwsYW5kcm9pZDowLHdlYm9zOjAsY2FqYTpoJiZoLmNhamFWZXJzaW9uLHNlY3VyZTpmYWxzZSxvczpudWxsfSxjPWR8fChuYXZpZ2F0b3ImJm5hdmlnYXRvci51c2VyQWdlbnQpLGY9d2luZG93JiZ3aW5kb3cubG9jYXRpb24sYj1mJiZmLmhyZWYsYTtnLnNlY3VyZT1iJiYoYi50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJodHRwc1wiKT09PTApO2lmKGMpe2lmKCgvd2luZG93c3x3aW4zMi9pKS50ZXN0KGMpKXtnLm9zPVwid2luZG93c1wiO31lbHNle2lmKCgvbWFjaW50b3NoL2kpLnRlc3QoYykpe2cub3M9XCJtYWNpbnRvc2hcIjt9ZWxzZXtpZigoL3JoaW5vL2kpLnRlc3QoYykpe2cub3M9XCJyaGlub1wiO319fWlmKCgvS0hUTUwvKS50ZXN0KGMpKXtnLndlYmtpdD0xO31hPWMubWF0Y2goL0FwcGxlV2ViS2l0XFwvKFteXFxzXSopLyk7aWYoYSYmYVsxXSl7Zy53ZWJraXQ9ZShhWzFdKTtpZigvIE1vYmlsZVxcLy8udGVzdChjKSl7Zy5tb2JpbGU9XCJBcHBsZVwiO2E9Yy5tYXRjaCgvT1MgKFteXFxzXSopLyk7aWYoYSYmYVsxXSl7YT1lKGFbMV0ucmVwbGFjZShcIl9cIixcIi5cIikpO31nLmlvcz1hO2cuaXBhZD1nLmlwb2Q9Zy5pcGhvbmU9MDthPWMubWF0Y2goL2lQYWR8aVBvZHxpUGhvbmUvKTtpZihhJiZhWzBdKXtnW2FbMF0udG9Mb3dlckNhc2UoKV09Zy5pb3M7fX1lbHNle2E9Yy5tYXRjaCgvTm9raWFOW15cXC9dKnxBbmRyb2lkIFxcZFxcLlxcZHx3ZWJPU1xcL1xcZFxcLlxcZC8pO2lmKGEpe2cubW9iaWxlPWFbMF07fWlmKC93ZWJPUy8udGVzdChjKSl7Zy5tb2JpbGU9XCJXZWJPU1wiO2E9Yy5tYXRjaCgvd2ViT1NcXC8oW15cXHNdKik7Lyk7aWYoYSYmYVsxXSl7Zy53ZWJvcz1lKGFbMV0pO319aWYoLyBBbmRyb2lkLy50ZXN0KGMpKXtnLm1vYmlsZT1cIkFuZHJvaWRcIjthPWMubWF0Y2goL0FuZHJvaWQgKFteXFxzXSopOy8pO2lmKGEmJmFbMV0pe2cuYW5kcm9pZD1lKGFbMV0pO319fWE9Yy5tYXRjaCgvQ2hyb21lXFwvKFteXFxzXSopLyk7aWYoYSYmYVsxXSl7Zy5jaHJvbWU9ZShhWzFdKTt9ZWxzZXthPWMubWF0Y2goL0Fkb2JlQUlSXFwvKFteXFxzXSopLyk7aWYoYSl7Zy5haXI9YVswXTt9fX1pZighZy53ZWJraXQpe2E9Yy5tYXRjaCgvT3BlcmFbXFxzXFwvXShbXlxcc10qKS8pO2lmKGEmJmFbMV0pe2cub3BlcmE9ZShhWzFdKTthPWMubWF0Y2goL1ZlcnNpb25cXC8oW15cXHNdKikvKTtpZihhJiZhWzFdKXtnLm9wZXJhPWUoYVsxXSk7fWE9Yy5tYXRjaCgvT3BlcmEgTWluaVteO10qLyk7aWYoYSl7Zy5tb2JpbGU9YVswXTt9fWVsc2V7YT1jLm1hdGNoKC9NU0lFXFxzKFteO10qKS8pO2lmKGEmJmFbMV0pe2cuaWU9ZShhWzFdKTt9ZWxzZXthPWMubWF0Y2goL0dlY2tvXFwvKFteXFxzXSopLyk7aWYoYSl7Zy5nZWNrbz0xO2E9Yy5tYXRjaCgvcnY6KFteXFxzXFwpXSopLyk7aWYoYSYmYVsxXSl7Zy5nZWNrbz1lKGFbMV0pO319fX19fXJldHVybiBnO307WUFIT08uZW52LnVhPVlBSE9PLmVudi5wYXJzZVVBKCk7KGZ1bmN0aW9uKCl7WUFIT08ubmFtZXNwYWNlKFwidXRpbFwiLFwid2lkZ2V0XCIsXCJleGFtcGxlXCIpO2lmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgWUFIT09fY29uZmlnKXt2YXIgYj1ZQUhPT19jb25maWcubGlzdGVuZXIsYT1ZQUhPTy5lbnYubGlzdGVuZXJzLGQ9dHJ1ZSxjO2lmKGIpe2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspe2lmKGFbY109PWIpe2Q9ZmFsc2U7YnJlYWs7fX1pZihkKXthLnB1c2goYik7fX19fSkoKTtZQUhPTy5sYW5nPVlBSE9PLmxhbmd8fHt9OyhmdW5jdGlvbigpe3ZhciBmPVlBSE9PLmxhbmcsYT1PYmplY3QucHJvdG90eXBlLGM9XCJbb2JqZWN0IEFycmF5XVwiLGg9XCJbb2JqZWN0IEZ1bmN0aW9uXVwiLGk9XCJbb2JqZWN0IE9iamVjdF1cIixiPVtdLGc9e1wiJlwiOlwiJmFtcDtcIixcIjxcIjpcIiZsdDtcIixcIj5cIjpcIiZndDtcIiwnXCInOlwiJnF1b3Q7XCIsXCInXCI6XCImI3gyNztcIixcIi9cIjpcIiYjeDJGO1wiLFwiYFwiOlwiJiN4NjA7XCJ9LGQ9W1widG9TdHJpbmdcIixcInZhbHVlT2ZcIl0sZT17aXNBcnJheTpmdW5jdGlvbihqKXtyZXR1cm4gYS50b1N0cmluZy5hcHBseShqKT09PWM7fSxpc0Jvb2xlYW46ZnVuY3Rpb24oail7cmV0dXJuIHR5cGVvZiBqPT09XCJib29sZWFuXCI7fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGope3JldHVybih0eXBlb2Ygaj09PVwiZnVuY3Rpb25cIil8fGEudG9TdHJpbmcuYXBwbHkoaik9PT1oO30saXNOdWxsOmZ1bmN0aW9uKGope3JldHVybiBqPT09bnVsbDt9LGlzTnVtYmVyOmZ1bmN0aW9uKGope3JldHVybiB0eXBlb2Ygaj09PVwibnVtYmVyXCImJmlzRmluaXRlKGopO30saXNPYmplY3Q6ZnVuY3Rpb24oail7cmV0dXJuKGomJih0eXBlb2Ygaj09PVwib2JqZWN0XCJ8fGYuaXNGdW5jdGlvbihqKSkpfHxmYWxzZTt9LGlzU3RyaW5nOmZ1bmN0aW9uKGope3JldHVybiB0eXBlb2Ygaj09PVwic3RyaW5nXCI7fSxpc1VuZGVmaW5lZDpmdW5jdGlvbihqKXtyZXR1cm4gdHlwZW9mIGo9PT1cInVuZGVmaW5lZFwiO30sX0lFRW51bUZpeDooWUFIT08uZW52LnVhLmllKT9mdW5jdGlvbihsLGspe3ZhciBqLG4sbTtmb3Ioaj0wO2o8ZC5sZW5ndGg7aj1qKzEpe249ZFtqXTttPWtbbl07aWYoZi5pc0Z1bmN0aW9uKG0pJiZtIT1hW25dKXtsW25dPW07fX19OmZ1bmN0aW9uKCl7fSxlc2NhcGVIVE1MOmZ1bmN0aW9uKGope3JldHVybiBqLnJlcGxhY2UoL1smPD5cIidcXC9gXS9nLGZ1bmN0aW9uKGspe3JldHVybiBnW2tdO30pO30sZXh0ZW5kOmZ1bmN0aW9uKG0sbixsKXtpZighbnx8IW0pe3Rocm93IG5ldyBFcnJvcihcImV4dGVuZCBmYWlsZWQsIHBsZWFzZSBjaGVjayB0aGF0IFwiK1wiYWxsIGRlcGVuZGVuY2llcyBhcmUgaW5jbHVkZWQuXCIpO312YXIgaz1mdW5jdGlvbigpe30sajtrLnByb3RvdHlwZT1uLnByb3RvdHlwZTttLnByb3RvdHlwZT1uZXcgaygpO20ucHJvdG90eXBlLmNvbnN0cnVjdG9yPW07bS5zdXBlcmNsYXNzPW4ucHJvdG90eXBlO2lmKG4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPT1hLmNvbnN0cnVjdG9yKXtuLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1uO31pZihsKXtmb3IoaiBpbiBsKXtpZihmLmhhc093blByb3BlcnR5KGwsaikpe20ucHJvdG90eXBlW2pdPWxbal07fX1mLl9JRUVudW1GaXgobS5wcm90b3R5cGUsbCk7fX0sYXVnbWVudE9iamVjdDpmdW5jdGlvbihuLG0pe2lmKCFtfHwhbil7dGhyb3cgbmV3IEVycm9yKFwiQWJzb3JiIGZhaWxlZCwgdmVyaWZ5IGRlcGVuZGVuY2llcy5cIik7fXZhciBqPWFyZ3VtZW50cyxsLG8saz1qWzJdO2lmKGsmJmshPT10cnVlKXtmb3IobD0yO2w8ai5sZW5ndGg7bD1sKzEpe25baltsXV09bVtqW2xdXTt9fWVsc2V7Zm9yKG8gaW4gbSl7aWYoa3x8IShvIGluIG4pKXtuW29dPW1bb107fX1mLl9JRUVudW1GaXgobixtKTt9cmV0dXJuIG47fSxhdWdtZW50UHJvdG86ZnVuY3Rpb24obSxsKXtpZighbHx8IW0pe3Rocm93IG5ldyBFcnJvcihcIkF1Z21lbnQgZmFpbGVkLCB2ZXJpZnkgZGVwZW5kZW5jaWVzLlwiKTt9dmFyIGo9W20ucHJvdG90eXBlLGwucHJvdG90eXBlXSxrO2ZvcihrPTI7azxhcmd1bWVudHMubGVuZ3RoO2s9aysxKXtqLnB1c2goYXJndW1lbnRzW2tdKTt9Zi5hdWdtZW50T2JqZWN0LmFwcGx5KHRoaXMsaik7cmV0dXJuIG07fSxkdW1wOmZ1bmN0aW9uKGoscCl7dmFyIGwsbixyPVtdLHQ9XCJ7Li4ufVwiLGs9XCJmKCl7Li4ufVwiLHE9XCIsIFwiLG09XCIgPT4gXCI7aWYoIWYuaXNPYmplY3Qoaikpe3JldHVybiBqK1wiXCI7fWVsc2V7aWYoaiBpbnN0YW5jZW9mIERhdGV8fChcIm5vZGVUeXBlXCIgaW4gaiYmXCJ0YWdOYW1lXCIgaW4gaikpe3JldHVybiBqO31lbHNle2lmKGYuaXNGdW5jdGlvbihqKSl7cmV0dXJuIGs7fX19cD0oZi5pc051bWJlcihwKSk/cDozO2lmKGYuaXNBcnJheShqKSl7ci5wdXNoKFwiW1wiKTtmb3IobD0wLG49ai5sZW5ndGg7bDxuO2w9bCsxKXtpZihmLmlzT2JqZWN0KGpbbF0pKXtyLnB1c2goKHA+MCk/Zi5kdW1wKGpbbF0scC0xKTp0KTt9ZWxzZXtyLnB1c2goaltsXSk7fXIucHVzaChxKTt9aWYoci5sZW5ndGg+MSl7ci5wb3AoKTt9ci5wdXNoKFwiXVwiKTt9ZWxzZXtyLnB1c2goXCJ7XCIpO2ZvcihsIGluIGope2lmKGYuaGFzT3duUHJvcGVydHkoaixsKSl7ci5wdXNoKGwrbSk7aWYoZi5pc09iamVjdChqW2xdKSl7ci5wdXNoKChwPjApP2YuZHVtcChqW2xdLHAtMSk6dCk7fWVsc2V7ci5wdXNoKGpbbF0pO31yLnB1c2gocSk7fX1pZihyLmxlbmd0aD4xKXtyLnBvcCgpO31yLnB1c2goXCJ9XCIpO31yZXR1cm4gci5qb2luKFwiXCIpO30sc3Vic3RpdHV0ZTpmdW5jdGlvbih4LHksRSxsKXt2YXIgRCxDLEIsRyx0LHUsRj1bXSxwLHo9eC5sZW5ndGgsQT1cImR1bXBcIixyPVwiIFwiLHE9XCJ7XCIsbT1cIn1cIixuLHc7Zm9yKDs7KXtEPXgubGFzdEluZGV4T2YocSx6KTtpZihEPDApe2JyZWFrO31DPXguaW5kZXhPZihtLEQpO2lmKEQrMT5DKXticmVhazt9cD14LnN1YnN0cmluZyhEKzEsQyk7Rz1wO3U9bnVsbDtCPUcuaW5kZXhPZihyKTtpZihCPi0xKXt1PUcuc3Vic3RyaW5nKEIrMSk7Rz1HLnN1YnN0cmluZygwLEIpO310PXlbR107aWYoRSl7dD1FKEcsdCx1KTt9aWYoZi5pc09iamVjdCh0KSl7aWYoZi5pc0FycmF5KHQpKXt0PWYuZHVtcCh0LHBhcnNlSW50KHUsMTApKTt9ZWxzZXt1PXV8fFwiXCI7bj11LmluZGV4T2YoQSk7aWYobj4tMSl7dT11LnN1YnN0cmluZyg0KTt9dz10LnRvU3RyaW5nKCk7aWYodz09PWl8fG4+LTEpe3Q9Zi5kdW1wKHQscGFyc2VJbnQodSwxMCkpO31lbHNle3Q9dzt9fX1lbHNle2lmKCFmLmlzU3RyaW5nKHQpJiYhZi5pc051bWJlcih0KSl7dD1cIn4tXCIrRi5sZW5ndGgrXCItflwiO0ZbRi5sZW5ndGhdPXA7fX14PXguc3Vic3RyaW5nKDAsRCkrdCt4LnN1YnN0cmluZyhDKzEpO2lmKGw9PT1mYWxzZSl7ej1ELTE7fX1mb3IoRD1GLmxlbmd0aC0xO0Q+PTA7RD1ELTEpe3g9eC5yZXBsYWNlKG5ldyBSZWdFeHAoXCJ+LVwiK0QrXCItflwiKSxcIntcIitGW0RdK1wifVwiLFwiZ1wiKTt9cmV0dXJuIHg7fSx0cmltOmZ1bmN0aW9uKGope3RyeXtyZXR1cm4gai5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLFwiXCIpO31jYXRjaChrKXtyZXR1cm4gajtcbn19LG1lcmdlOmZ1bmN0aW9uKCl7dmFyIG49e30saz1hcmd1bWVudHMsaj1rLmxlbmd0aCxtO2ZvcihtPTA7bTxqO209bSsxKXtmLmF1Z21lbnRPYmplY3QobixrW21dLHRydWUpO31yZXR1cm4gbjt9LGxhdGVyOmZ1bmN0aW9uKHQsayx1LG4scCl7dD10fHwwO2s9a3x8e307dmFyIGw9dSxzPW4scSxqO2lmKGYuaXNTdHJpbmcodSkpe2w9a1t1XTt9aWYoIWwpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJtZXRob2QgdW5kZWZpbmVkXCIpO31pZighZi5pc1VuZGVmaW5lZChuKSYmIWYuaXNBcnJheShzKSl7cz1bbl07fXE9ZnVuY3Rpb24oKXtsLmFwcGx5KGssc3x8Yik7fTtqPShwKT9zZXRJbnRlcnZhbChxLHQpOnNldFRpbWVvdXQocSx0KTtyZXR1cm57aW50ZXJ2YWw6cCxjYW5jZWw6ZnVuY3Rpb24oKXtpZih0aGlzLmludGVydmFsKXtjbGVhckludGVydmFsKGopO31lbHNle2NsZWFyVGltZW91dChqKTt9fX07fSxpc1ZhbHVlOmZ1bmN0aW9uKGope3JldHVybihmLmlzT2JqZWN0KGopfHxmLmlzU3RyaW5nKGopfHxmLmlzTnVtYmVyKGopfHxmLmlzQm9vbGVhbihqKSk7fX07Zi5oYXNPd25Qcm9wZXJ0eT0oYS5oYXNPd25Qcm9wZXJ0eSk/ZnVuY3Rpb24oaixrKXtyZXR1cm4gaiYmai5oYXNPd25Qcm9wZXJ0eSYmai5oYXNPd25Qcm9wZXJ0eShrKTt9OmZ1bmN0aW9uKGosayl7cmV0dXJuICFmLmlzVW5kZWZpbmVkKGpba10pJiZqLmNvbnN0cnVjdG9yLnByb3RvdHlwZVtrXSE9PWpba107fTtlLmF1Z21lbnRPYmplY3QoZixlLHRydWUpO1lBSE9PLnV0aWwuTGFuZz1mO2YuYXVnbWVudD1mLmF1Z21lbnRQcm90bztZQUhPTy5hdWdtZW50PWYuYXVnbWVudFByb3RvO1lBSE9PLmV4dGVuZD1mLmV4dGVuZDt9KSgpO1lBSE9PLnJlZ2lzdGVyKFwieWFob29cIixZQUhPTyx7dmVyc2lvbjpcIjIuOS4wXCIsYnVpbGQ6XCIyODAwXCJ9KTtcblxuLyohIENyeXB0b0pTIHYzLjEuMiBjb3JlLWZpeC5qc1xuICogY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4gKiAoYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIGNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiAqIFRISVMgSVMgRklYIG9mICdjb3JlLmpzJyB0byBmaXggSG1hYyBpc3N1ZS5cbiAqIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL2lzc3Vlcy9kZXRhaWw/aWQ9ODRcbiAqIGh0dHBzOi8vY3J5cHRvLWpzLmdvb2dsZWNvZGUuY29tL3N2bi1oaXN0b3J5L3I2NjcvYnJhbmNoZXMvMy54L3NyYy9jb3JlLmpzXG4gKi9cbnZhciBDcnlwdG9KUz1DcnlwdG9KU3x8KGZ1bmN0aW9uKGUsZyl7dmFyIGE9e307dmFyIGI9YS5saWI9e307dmFyIGo9Yi5CYXNlPShmdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt9cmV0dXJue2V4dGVuZDpmdW5jdGlvbihwKXtuLnByb3RvdHlwZT10aGlzO3ZhciBvPW5ldyBuKCk7aWYocCl7by5taXhJbihwKX1pZighby5oYXNPd25Qcm9wZXJ0eShcImluaXRcIikpe28uaW5pdD1mdW5jdGlvbigpe28uJHN1cGVyLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1vLmluaXQucHJvdG90eXBlPW87by4kc3VwZXI9dGhpcztyZXR1cm4gb30sY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIG89dGhpcy5leHRlbmQoKTtvLmluaXQuYXBwbHkobyxhcmd1bWVudHMpO3JldHVybiBvfSxpbml0OmZ1bmN0aW9uKCl7fSxtaXhJbjpmdW5jdGlvbihwKXtmb3IodmFyIG8gaW4gcCl7aWYocC5oYXNPd25Qcm9wZXJ0eShvKSl7dGhpc1tvXT1wW29dfX1pZihwLmhhc093blByb3BlcnR5KFwidG9TdHJpbmdcIikpe3RoaXMudG9TdHJpbmc9cC50b1N0cmluZ319LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5pdC5wcm90b3R5cGUuZXh0ZW5kKHRoaXMpfX19KCkpO3ZhciBsPWIuV29yZEFycmF5PWouZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKG8sbil7bz10aGlzLndvcmRzPW98fFtdO2lmKG4hPWcpe3RoaXMuc2lnQnl0ZXM9bn1lbHNle3RoaXMuc2lnQnl0ZXM9by5sZW5ndGgqNH19LHRvU3RyaW5nOmZ1bmN0aW9uKG4pe3JldHVybihufHxoKS5zdHJpbmdpZnkodGhpcyl9LGNvbmNhdDpmdW5jdGlvbih0KXt2YXIgcT10aGlzLndvcmRzO3ZhciBwPXQud29yZHM7dmFyIG49dGhpcy5zaWdCeXRlczt2YXIgcz10LnNpZ0J5dGVzO3RoaXMuY2xhbXAoKTtpZihuJTQpe2Zvcih2YXIgcj0wO3I8cztyKyspe3ZhciBvPShwW3I+Pj4yXT4+PigyNC0ociU0KSo4KSkmMjU1O3FbKG4rcik+Pj4yXXw9bzw8KDI0LSgobityKSU0KSo4KX19ZWxzZXtmb3IodmFyIHI9MDtyPHM7cis9NCl7cVsobityKT4+PjJdPXBbcj4+PjJdfX10aGlzLnNpZ0J5dGVzKz1zO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbigpe3ZhciBvPXRoaXMud29yZHM7dmFyIG49dGhpcy5zaWdCeXRlcztvW24+Pj4yXSY9NDI5NDk2NzI5NTw8KDMyLShuJTQpKjgpO28ubGVuZ3RoPWUuY2VpbChuLzQpfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBuPWouY2xvbmUuY2FsbCh0aGlzKTtuLndvcmRzPXRoaXMud29yZHMuc2xpY2UoMCk7cmV0dXJuIG59LHJhbmRvbTpmdW5jdGlvbihwKXt2YXIgbz1bXTtmb3IodmFyIG49MDtuPHA7bis9NCl7by5wdXNoKChlLnJhbmRvbSgpKjQyOTQ5NjcyOTYpfDApfXJldHVybiBuZXcgbC5pbml0KG8scCl9fSk7dmFyIG09YS5lbmM9e307dmFyIGg9bS5IZXg9e3N0cmluZ2lmeTpmdW5jdGlvbihwKXt2YXIgcj1wLndvcmRzO3ZhciBvPXAuc2lnQnl0ZXM7dmFyIHE9W107Zm9yKHZhciBuPTA7bjxvO24rKyl7dmFyIHM9KHJbbj4+PjJdPj4+KDI0LShuJTQpKjgpKSYyNTU7cS5wdXNoKChzPj4+NCkudG9TdHJpbmcoMTYpKTtxLnB1c2goKHMmMTUpLnRvU3RyaW5nKDE2KSl9cmV0dXJuIHEuam9pbihcIlwiKX0scGFyc2U6ZnVuY3Rpb24ocCl7dmFyIG49cC5sZW5ndGg7dmFyIHE9W107Zm9yKHZhciBvPTA7bzxuO28rPTIpe3Fbbz4+PjNdfD1wYXJzZUludChwLnN1YnN0cihvLDIpLDE2KTw8KDI0LShvJTgpKjQpfXJldHVybiBuZXcgbC5pbml0KHEsbi8yKX19O3ZhciBkPW0uTGF0aW4xPXtzdHJpbmdpZnk6ZnVuY3Rpb24ocSl7dmFyIHI9cS53b3Jkczt2YXIgcD1xLnNpZ0J5dGVzO3ZhciBuPVtdO2Zvcih2YXIgbz0wO288cDtvKyspe3ZhciBzPShyW28+Pj4yXT4+PigyNC0obyU0KSo4KSkmMjU1O24ucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHMpKX1yZXR1cm4gbi5qb2luKFwiXCIpfSxwYXJzZTpmdW5jdGlvbihwKXt2YXIgbj1wLmxlbmd0aDt2YXIgcT1bXTtmb3IodmFyIG89MDtvPG47bysrKXtxW28+Pj4yXXw9KHAuY2hhckNvZGVBdChvKSYyNTUpPDwoMjQtKG8lNCkqOCl9cmV0dXJuIG5ldyBsLmluaXQocSxuKX19O3ZhciBjPW0uVXRmOD17c3RyaW5naWZ5OmZ1bmN0aW9uKG4pe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShkLnN0cmluZ2lmeShuKSkpfWNhdGNoKG8pe3Rocm93IG5ldyBFcnJvcihcIk1hbGZvcm1lZCBVVEYtOCBkYXRhXCIpfX0scGFyc2U6ZnVuY3Rpb24obil7cmV0dXJuIGQucGFyc2UodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KG4pKSl9fTt2YXIgaT1iLkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG09ai5leHRlbmQoe3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fZGF0YT1uZXcgbC5pbml0KCk7dGhpcy5fbkRhdGFCeXRlcz0wfSxfYXBwZW5kOmZ1bmN0aW9uKG4pe2lmKHR5cGVvZiBuPT1cInN0cmluZ1wiKXtuPWMucGFyc2Uobil9dGhpcy5fZGF0YS5jb25jYXQobik7dGhpcy5fbkRhdGFCeXRlcys9bi5zaWdCeXRlc30sX3Byb2Nlc3M6ZnVuY3Rpb24odyl7dmFyIHE9dGhpcy5fZGF0YTt2YXIgeD1xLndvcmRzO3ZhciBuPXEuc2lnQnl0ZXM7dmFyIHQ9dGhpcy5ibG9ja1NpemU7dmFyIHY9dCo0O3ZhciB1PW4vdjtpZih3KXt1PWUuY2VpbCh1KX1lbHNle3U9ZS5tYXgoKHV8MCktdGhpcy5fbWluQnVmZmVyU2l6ZSwwKX12YXIgcz11KnQ7dmFyIHI9ZS5taW4ocyo0LG4pO2lmKHMpe2Zvcih2YXIgcD0wO3A8cztwKz10KXt0aGlzLl9kb1Byb2Nlc3NCbG9jayh4LHApfXZhciBvPXguc3BsaWNlKDAscyk7cS5zaWdCeXRlcy09cn1yZXR1cm4gbmV3IGwuaW5pdChvLHIpfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBuPWouY2xvbmUuY2FsbCh0aGlzKTtuLl9kYXRhPXRoaXMuX2RhdGEuY2xvbmUoKTtyZXR1cm4gbn0sX21pbkJ1ZmZlclNpemU6MH0pO3ZhciBmPWIuSGFzaGVyPWkuZXh0ZW5kKHtjZmc6ai5leHRlbmQoKSxpbml0OmZ1bmN0aW9uKG4pe3RoaXMuY2ZnPXRoaXMuY2ZnLmV4dGVuZChuKTt0aGlzLnJlc2V0KCl9LHJlc2V0OmZ1bmN0aW9uKCl7aS5yZXNldC5jYWxsKHRoaXMpO3RoaXMuX2RvUmVzZXQoKX0sdXBkYXRlOmZ1bmN0aW9uKG4pe3RoaXMuX2FwcGVuZChuKTt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXN9LGZpbmFsaXplOmZ1bmN0aW9uKG4pe2lmKG4pe3RoaXMuX2FwcGVuZChuKX12YXIgbz10aGlzLl9kb0ZpbmFsaXplKCk7cmV0dXJuIG99LGJsb2NrU2l6ZTo1MTIvMzIsX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24ocCxvKXtyZXR1cm4gbmV3IG4uaW5pdChvKS5maW5hbGl6ZShwKX19LF9jcmVhdGVIbWFjSGVscGVyOmZ1bmN0aW9uKG4pe3JldHVybiBmdW5jdGlvbihwLG8pe3JldHVybiBuZXcgay5ITUFDLmluaXQobixvKS5maW5hbGl6ZShwKX19fSk7dmFyIGs9YS5hbGdvPXt9O3JldHVybiBhfShNYXRoKSk7XG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHg2NC1jb3JlLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oZyl7dmFyIGE9Q3J5cHRvSlMsZj1hLmxpYixlPWYuQmFzZSxoPWYuV29yZEFycmF5LGE9YS54NjQ9e307YS5Xb3JkPWUuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGIsYyl7dGhpcy5oaWdoPWI7dGhpcy5sb3c9Y319KTthLldvcmRBcnJheT1lLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihiLGMpe2I9dGhpcy53b3Jkcz1ifHxbXTt0aGlzLnNpZ0J5dGVzPWMhPWc/Yzo4KmIubGVuZ3RofSx0b1gzMjpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLndvcmRzLGM9Yi5sZW5ndGgsYT1bXSxkPTA7ZDxjO2QrKyl7dmFyIGU9YltkXTthLnB1c2goZS5oaWdoKTthLnB1c2goZS5sb3cpfXJldHVybiBoLmNyZWF0ZShhLHRoaXMuc2lnQnl0ZXMpfSxjbG9uZTpmdW5jdGlvbigpe2Zvcih2YXIgYj1lLmNsb25lLmNhbGwodGhpcyksYz1iLndvcmRzPXRoaXMud29yZHMuc2xpY2UoMCksYT1jLmxlbmd0aCxkPTA7ZDxhO2QrKyljW2RdPWNbZF0uY2xvbmUoKTtyZXR1cm4gYn19KX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgY2lwaGVyLWNvcmUtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbkNyeXB0b0pTLmxpYi5DaXBoZXJ8fGZ1bmN0aW9uKHUpe3ZhciBnPUNyeXB0b0pTLGY9Zy5saWIsaz1mLkJhc2UsbD1mLldvcmRBcnJheSxxPWYuQnVmZmVyZWRCbG9ja0FsZ29yaXRobSxyPWcuZW5jLkJhc2U2NCx2PWcuYWxnby5FdnBLREYsbj1mLkNpcGhlcj1xLmV4dGVuZCh7Y2ZnOmsuZXh0ZW5kKCksY3JlYXRlRW5jcnlwdG9yOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY3JlYXRlKHRoaXMuX0VOQ19YRk9STV9NT0RFLGEsYil9LGNyZWF0ZURlY3J5cHRvcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9ERUNfWEZPUk1fTU9ERSxhLGIpfSxpbml0OmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNmZz10aGlzLmNmZy5leHRlbmQoYyk7dGhpcy5feGZvcm1Nb2RlPWE7dGhpcy5fa2V5PWI7dGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe3EucmVzZXQuY2FsbCh0aGlzKTt0aGlzLl9kb1Jlc2V0KCl9LHByb2Nlc3M6ZnVuY3Rpb24oYSl7dGhpcy5fYXBwZW5kKGEpO1xucmV0dXJuIHRoaXMuX3Byb2Nlc3MoKX0sZmluYWxpemU6ZnVuY3Rpb24oYSl7YSYmdGhpcy5fYXBwZW5kKGEpO3JldHVybiB0aGlzLl9kb0ZpbmFsaXplKCl9LGtleVNpemU6NCxpdlNpemU6NCxfRU5DX1hGT1JNX01PREU6MSxfREVDX1hGT1JNX01PREU6MixfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKGEpe3JldHVybntlbmNyeXB0OmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4oXCJzdHJpbmdcIj09dHlwZW9mIGM/czpqKS5lbmNyeXB0KGEsYixjLGQpfSxkZWNyeXB0OmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4oXCJzdHJpbmdcIj09dHlwZW9mIGM/czpqKS5kZWNyeXB0KGEsYixjLGQpfX19fSk7Zi5TdHJlYW1DaXBoZXI9bi5leHRlbmQoe19kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb2Nlc3MoITApfSxibG9ja1NpemU6MX0pO3ZhciBtPWcubW9kZT17fSx0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLl9pdjtkP3RoaXMuX2l2PXU6ZD10aGlzLl9wcmV2QmxvY2s7Zm9yKHZhciBlPVxuMDtlPGM7ZSsrKWFbYitlXV49ZFtlXX0saD0oZi5CbG9ja0NpcGhlck1vZGU9ay5leHRlbmQoe2NyZWF0ZUVuY3J5cHRvcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLkVuY3J5cHRvci5jcmVhdGUoYSxiKX0sY3JlYXRlRGVjcnlwdG9yOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuRGVjcnlwdG9yLmNyZWF0ZShhLGIpfSxpbml0OmZ1bmN0aW9uKGEsYil7dGhpcy5fY2lwaGVyPWE7dGhpcy5faXY9Yn19KSkuZXh0ZW5kKCk7aC5FbmNyeXB0b3I9aC5leHRlbmQoe3Byb2Nlc3NCbG9jazpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2NpcGhlcixkPWMuYmxvY2tTaXplO3QuY2FsbCh0aGlzLGEsYixkKTtjLmVuY3J5cHRCbG9jayhhLGIpO3RoaXMuX3ByZXZCbG9jaz1hLnNsaWNlKGIsYitkKX19KTtoLkRlY3J5cHRvcj1oLmV4dGVuZCh7cHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fY2lwaGVyLGQ9Yy5ibG9ja1NpemUsZT1hLnNsaWNlKGIsYitkKTtjLmRlY3J5cHRCbG9jayhhLFxuYik7dC5jYWxsKHRoaXMsYSxiLGQpO3RoaXMuX3ByZXZCbG9jaz1lfX0pO209bS5DQkM9aDtoPShnLnBhZD17fSkuUGtjczc9e3BhZDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz00KmIsYz1jLWEuc2lnQnl0ZXMlYyxkPWM8PDI0fGM8PDE2fGM8PDh8YyxlPVtdLGY9MDtmPGM7Zis9NCllLnB1c2goZCk7Yz1sLmNyZWF0ZShlLGMpO2EuY29uY2F0KGMpfSx1bnBhZDpmdW5jdGlvbihhKXthLnNpZ0J5dGVzLT1hLndvcmRzW2Euc2lnQnl0ZXMtMT4+PjJdJjI1NX19O2YuQmxvY2tDaXBoZXI9bi5leHRlbmQoe2NmZzpuLmNmZy5leHRlbmQoe21vZGU6bSxwYWRkaW5nOmh9KSxyZXNldDpmdW5jdGlvbigpe24ucmVzZXQuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmNmZyxiPWEuaXYsYT1hLm1vZGU7aWYodGhpcy5feGZvcm1Nb2RlPT10aGlzLl9FTkNfWEZPUk1fTU9ERSl2YXIgYz1hLmNyZWF0ZUVuY3J5cHRvcjtlbHNlIGM9YS5jcmVhdGVEZWNyeXB0b3IsdGhpcy5fbWluQnVmZmVyU2l6ZT0xO1xudGhpcy5fbW9kZT1jLmNhbGwoYSx0aGlzLGImJmIud29yZHMpfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24oYSxiKXt0aGlzLl9tb2RlLnByb2Nlc3NCbG9jayhhLGIpfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY2ZnLnBhZGRpbmc7aWYodGhpcy5feGZvcm1Nb2RlPT10aGlzLl9FTkNfWEZPUk1fTU9ERSl7YS5wYWQodGhpcy5fZGF0YSx0aGlzLmJsb2NrU2l6ZSk7dmFyIGI9dGhpcy5fcHJvY2VzcyghMCl9ZWxzZSBiPXRoaXMuX3Byb2Nlc3MoITApLGEudW5wYWQoYik7cmV0dXJuIGJ9LGJsb2NrU2l6ZTo0fSk7dmFyIHA9Zi5DaXBoZXJQYXJhbXM9ay5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oYSl7dGhpcy5taXhJbihhKX0sdG9TdHJpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuKGF8fHRoaXMuZm9ybWF0dGVyKS5zdHJpbmdpZnkodGhpcyl9fSksbT0oZy5mb3JtYXQ9e30pLk9wZW5TU0w9e3N0cmluZ2lmeTpmdW5jdGlvbihhKXt2YXIgYj1hLmNpcGhlcnRleHQ7YT1hLnNhbHQ7XG5yZXR1cm4oYT9sLmNyZWF0ZShbMTM5ODg5MzY4NCwxNzAxMDc2ODMxXSkuY29uY2F0KGEpLmNvbmNhdChiKTpiKS50b1N0cmluZyhyKX0scGFyc2U6ZnVuY3Rpb24oYSl7YT1yLnBhcnNlKGEpO3ZhciBiPWEud29yZHM7aWYoMTM5ODg5MzY4ND09YlswXSYmMTcwMTA3NjgzMT09YlsxXSl7dmFyIGM9bC5jcmVhdGUoYi5zbGljZSgyLDQpKTtiLnNwbGljZSgwLDQpO2Euc2lnQnl0ZXMtPTE2fXJldHVybiBwLmNyZWF0ZSh7Y2lwaGVydGV4dDphLHNhbHQ6Y30pfX0saj1mLlNlcmlhbGl6YWJsZUNpcGhlcj1rLmV4dGVuZCh7Y2ZnOmsuZXh0ZW5kKHtmb3JtYXQ6bX0pLGVuY3J5cHQ6ZnVuY3Rpb24oYSxiLGMsZCl7ZD10aGlzLmNmZy5leHRlbmQoZCk7dmFyIGU9YS5jcmVhdGVFbmNyeXB0b3IoYyxkKTtiPWUuZmluYWxpemUoYik7ZT1lLmNmZztyZXR1cm4gcC5jcmVhdGUoe2NpcGhlcnRleHQ6YixrZXk6YyxpdjplLml2LGFsZ29yaXRobTphLG1vZGU6ZS5tb2RlLHBhZGRpbmc6ZS5wYWRkaW5nLFxuYmxvY2tTaXplOmEuYmxvY2tTaXplLGZvcm1hdHRlcjpkLmZvcm1hdH0pfSxkZWNyeXB0OmZ1bmN0aW9uKGEsYixjLGQpe2Q9dGhpcy5jZmcuZXh0ZW5kKGQpO2I9dGhpcy5fcGFyc2UoYixkLmZvcm1hdCk7cmV0dXJuIGEuY3JlYXRlRGVjcnlwdG9yKGMsZCkuZmluYWxpemUoYi5jaXBoZXJ0ZXh0KX0sX3BhcnNlOmZ1bmN0aW9uKGEsYil7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGE/Yi5wYXJzZShhLHRoaXMpOmF9fSksZz0oZy5rZGY9e30pLk9wZW5TU0w9e2V4ZWN1dGU6ZnVuY3Rpb24oYSxiLGMsZCl7ZHx8KGQ9bC5yYW5kb20oOCkpO2E9di5jcmVhdGUoe2tleVNpemU6YitjfSkuY29tcHV0ZShhLGQpO2M9bC5jcmVhdGUoYS53b3Jkcy5zbGljZShiKSw0KmMpO2Euc2lnQnl0ZXM9NCpiO3JldHVybiBwLmNyZWF0ZSh7a2V5OmEsaXY6YyxzYWx0OmR9KX19LHM9Zi5QYXNzd29yZEJhc2VkQ2lwaGVyPWouZXh0ZW5kKHtjZmc6ai5jZmcuZXh0ZW5kKHtrZGY6Z30pLGVuY3J5cHQ6ZnVuY3Rpb24oYSxcbmIsYyxkKXtkPXRoaXMuY2ZnLmV4dGVuZChkKTtjPWQua2RmLmV4ZWN1dGUoYyxhLmtleVNpemUsYS5pdlNpemUpO2QuaXY9Yy5pdjthPWouZW5jcnlwdC5jYWxsKHRoaXMsYSxiLGMua2V5LGQpO2EubWl4SW4oYyk7cmV0dXJuIGF9LGRlY3J5cHQ6ZnVuY3Rpb24oYSxiLGMsZCl7ZD10aGlzLmNmZy5leHRlbmQoZCk7Yj10aGlzLl9wYXJzZShiLGQuZm9ybWF0KTtjPWQua2RmLmV4ZWN1dGUoYyxhLmtleVNpemUsYS5pdlNpemUsYi5zYWx0KTtkLml2PWMuaXY7cmV0dXJuIGouZGVjcnlwdC5jYWxsKHRoaXMsYSxiLGMua2V5LGQpfX0pfSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIGFlcy1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7Zm9yKHZhciBxPUNyeXB0b0pTLHg9cS5saWIuQmxvY2tDaXBoZXIscj1xLmFsZ28saj1bXSx5PVtdLHo9W10sQT1bXSxCPVtdLEM9W10scz1bXSx1PVtdLHY9W10sdz1bXSxnPVtdLGs9MDsyNTY+aztrKyspZ1trXT0xMjg+az9rPDwxOms8PDFeMjgzO2Zvcih2YXIgbj0wLGw9MCxrPTA7MjU2Pms7aysrKXt2YXIgZj1sXmw8PDFebDw8Ml5sPDwzXmw8PDQsZj1mPj4+OF5mJjI1NV45OTtqW25dPWY7eVtmXT1uO3ZhciB0PWdbbl0sRD1nW3RdLEU9Z1tEXSxiPTI1NypnW2ZdXjE2ODQzMDA4KmY7eltuXT1iPDwyNHxiPj4+ODtBW25dPWI8PDE2fGI+Pj4xNjtCW25dPWI8PDh8Yj4+PjI0O0Nbbl09YjtiPTE2ODQzMDA5KkVeNjU1MzcqRF4yNTcqdF4xNjg0MzAwOCpuO3NbZl09Yjw8MjR8Yj4+Pjg7dVtmXT1iPDwxNnxiPj4+MTY7dltmXT1iPDw4fGI+Pj4yNDt3W2ZdPWI7bj8obj10XmdbZ1tnW0VedF1dXSxsXj1nW2dbbF1dKTpuPWw9MX12YXIgRj1bMCwxLDIsNCw4LFxuMTYsMzIsNjQsMTI4LDI3LDU0XSxyPXIuQUVTPXguZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe2Zvcih2YXIgYz10aGlzLl9rZXksZT1jLndvcmRzLGE9Yy5zaWdCeXRlcy80LGM9NCooKHRoaXMuX25Sb3VuZHM9YSs2KSsxKSxiPXRoaXMuX2tleVNjaGVkdWxlPVtdLGg9MDtoPGM7aCsrKWlmKGg8YSliW2hdPWVbaF07ZWxzZXt2YXIgZD1iW2gtMV07aCVhPzY8YSYmND09aCVhJiYoZD1qW2Q+Pj4yNF08PDI0fGpbZD4+PjE2JjI1NV08PDE2fGpbZD4+PjgmMjU1XTw8OHxqW2QmMjU1XSk6KGQ9ZDw8OHxkPj4+MjQsZD1qW2Q+Pj4yNF08PDI0fGpbZD4+PjE2JjI1NV08PDE2fGpbZD4+PjgmMjU1XTw8OHxqW2QmMjU1XSxkXj1GW2gvYXwwXTw8MjQpO2JbaF09YltoLWFdXmR9ZT10aGlzLl9pbnZLZXlTY2hlZHVsZT1bXTtmb3IoYT0wO2E8YzthKyspaD1jLWEsZD1hJTQ/YltoXTpiW2gtNF0sZVthXT00PmF8fDQ+PWg/ZDpzW2pbZD4+PjI0XV1edVtqW2Q+Pj4xNiYyNTVdXV52W2pbZD4+PlxuOCYyNTVdXV53W2pbZCYyNTVdXX0sZW5jcnlwdEJsb2NrOmZ1bmN0aW9uKGMsZSl7dGhpcy5fZG9DcnlwdEJsb2NrKGMsZSx0aGlzLl9rZXlTY2hlZHVsZSx6LEEsQixDLGopfSxkZWNyeXB0QmxvY2s6ZnVuY3Rpb24oYyxlKXt2YXIgYT1jW2UrMV07Y1tlKzFdPWNbZSszXTtjW2UrM109YTt0aGlzLl9kb0NyeXB0QmxvY2soYyxlLHRoaXMuX2ludktleVNjaGVkdWxlLHMsdSx2LHcseSk7YT1jW2UrMV07Y1tlKzFdPWNbZSszXTtjW2UrM109YX0sX2RvQ3J5cHRCbG9jazpmdW5jdGlvbihjLGUsYSxiLGgsZCxqLG0pe2Zvcih2YXIgbj10aGlzLl9uUm91bmRzLGY9Y1tlXV5hWzBdLGc9Y1tlKzFdXmFbMV0saz1jW2UrMl1eYVsyXSxwPWNbZSszXV5hWzNdLGw9NCx0PTE7dDxuO3QrKyl2YXIgcT1iW2Y+Pj4yNF1eaFtnPj4+MTYmMjU1XV5kW2s+Pj44JjI1NV1ealtwJjI1NV1eYVtsKytdLHI9YltnPj4+MjRdXmhbaz4+PjE2JjI1NV1eZFtwPj4+OCYyNTVdXmpbZiYyNTVdXmFbbCsrXSxzPVxuYltrPj4+MjRdXmhbcD4+PjE2JjI1NV1eZFtmPj4+OCYyNTVdXmpbZyYyNTVdXmFbbCsrXSxwPWJbcD4+PjI0XV5oW2Y+Pj4xNiYyNTVdXmRbZz4+PjgmMjU1XV5qW2smMjU1XV5hW2wrK10sZj1xLGc9cixrPXM7cT0obVtmPj4+MjRdPDwyNHxtW2c+Pj4xNiYyNTVdPDwxNnxtW2s+Pj44JjI1NV08PDh8bVtwJjI1NV0pXmFbbCsrXTtyPShtW2c+Pj4yNF08PDI0fG1baz4+PjE2JjI1NV08PDE2fG1bcD4+PjgmMjU1XTw8OHxtW2YmMjU1XSleYVtsKytdO3M9KG1baz4+PjI0XTw8MjR8bVtwPj4+MTYmMjU1XTw8MTZ8bVtmPj4+OCYyNTVdPDw4fG1bZyYyNTVdKV5hW2wrK107cD0obVtwPj4+MjRdPDwyNHxtW2Y+Pj4xNiYyNTVdPDwxNnxtW2c+Pj44JjI1NV08PDh8bVtrJjI1NV0pXmFbbCsrXTtjW2VdPXE7Y1tlKzFdPXI7Y1tlKzJdPXM7Y1tlKzNdPXB9LGtleVNpemU6OH0pO3EuQUVTPXguX2NyZWF0ZUhlbHBlcihyKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgdHJpcGxlZGVzLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXtmdW5jdGlvbiBqKGIsYyl7dmFyIGE9KHRoaXMuX2xCbG9jaz4+PmJedGhpcy5fckJsb2NrKSZjO3RoaXMuX3JCbG9ja149YTt0aGlzLl9sQmxvY2tePWE8PGJ9ZnVuY3Rpb24gbChiLGMpe3ZhciBhPSh0aGlzLl9yQmxvY2s+Pj5iXnRoaXMuX2xCbG9jaykmYzt0aGlzLl9sQmxvY2tePWE7dGhpcy5fckJsb2NrXj1hPDxifXZhciBoPUNyeXB0b0pTLGU9aC5saWIsbj1lLldvcmRBcnJheSxlPWUuQmxvY2tDaXBoZXIsZz1oLmFsZ28scT1bNTcsNDksNDEsMzMsMjUsMTcsOSwxLDU4LDUwLDQyLDM0LDI2LDE4LDEwLDIsNTksNTEsNDMsMzUsMjcsMTksMTEsMyw2MCw1Miw0NCwzNiw2Myw1NSw0NywzOSwzMSwyMywxNSw3LDYyLDU0LDQ2LDM4LDMwLDIyLDE0LDYsNjEsNTMsNDUsMzcsMjksMjEsMTMsNSwyOCwyMCwxMiw0XSxwPVsxNCwxNywxMSwyNCwxLDUsMywyOCwxNSw2LDIxLDEwLDIzLDE5LDEyLDQsMjYsOCwxNiw3LDI3LDIwLDEzLDIsNDEsNTIsMzEsMzcsNDcsXG41NSwzMCw0MCw1MSw0NSwzMyw0OCw0NCw0OSwzOSw1NiwzNCw1Myw0Niw0Miw1MCwzNiwyOSwzMl0scj1bMSwyLDQsNiw4LDEwLDEyLDE0LDE1LDE3LDE5LDIxLDIzLDI1LDI3LDI4XSxzPVt7XCIwXCI6ODQyMTg4OCwyNjg0MzU0NTY6MzI3NjgsNTM2ODcwOTEyOjg0MjEzNzgsODA1MzA2MzY4OjIsMTA3Mzc0MTgyNDo1MTIsMTM0MjE3NzI4MDo4NDIxODkwLDE2MTA2MTI3MzY6ODM4OTEyMiwxODc5MDQ4MTkyOjgzODg2MDgsMjE0NzQ4MzY0ODo1MTQsMjQxNTkxOTEwNDo4Mzg5MTIwLDI2ODQzNTQ1NjA6MzMyODAsMjk1Mjc5MDAxNjo4NDIxMzc2LDMyMjEyMjU0NzI6MzI3NzAsMzQ4OTY2MDkyODo4Mzg4NjEwLDM3NTgwOTYzODQ6MCw0MDI2NTMxODQwOjMzMjgyLDEzNDIxNzcyODowLDQwMjY1MzE4NDo4NDIxODkwLDY3MTA4ODY0MDozMzI4Miw5Mzk1MjQwOTY6MzI3NjgsMTIwNzk1OTU1Mjo4NDIxODg4LDE0NzYzOTUwMDg6NTEyLDE3NDQ4MzA0NjQ6ODQyMTM3OCwyMDEzMjY1OTIwOjIsXG4yMjgxNzAxMzc2OjgzODkxMjAsMjU1MDEzNjgzMjozMzI4MCwyODE4NTcyMjg4Ojg0MjEzNzYsMzA4NzAwNzc0NDo4Mzg5MTIyLDMzNTU0NDMyMDA6ODM4ODYxMCwzNjIzODc4NjU2OjMyNzcwLDM4OTIzMTQxMTI6NTE0LDQxNjA3NDk1Njg6ODM4ODYwOCwxOjMyNzY4LDI2ODQzNTQ1NzoyLDUzNjg3MDkxMzo4NDIxODg4LDgwNTMwNjM2OTo4Mzg4NjA4LDEwNzM3NDE4MjU6ODQyMTM3OCwxMzQyMTc3MjgxOjMzMjgwLDE2MTA2MTI3Mzc6NTEyLDE4NzkwNDgxOTM6ODM4OTEyMiwyMTQ3NDgzNjQ5Ojg0MjE4OTAsMjQxNTkxOTEwNTo4NDIxMzc2LDI2ODQzNTQ1NjE6ODM4ODYxMCwyOTUyNzkwMDE3OjMzMjgyLDMyMjEyMjU0NzM6NTE0LDM0ODk2NjA5Mjk6ODM4OTEyMCwzNzU4MDk2Mzg1OjMyNzcwLDQwMjY1MzE4NDE6MCwxMzQyMTc3Mjk6ODQyMTg5MCw0MDI2NTMxODU6ODQyMTM3Niw2NzEwODg2NDE6ODM4ODYwOCw5Mzk1MjQwOTc6NTEyLDEyMDc5NTk1NTM6MzI3NjgsMTQ3NjM5NTAwOTo4Mzg4NjEwLFxuMTc0NDgzMDQ2NToyLDIwMTMyNjU5MjE6MzMyODIsMjI4MTcwMTM3NzozMjc3MCwyNTUwMTM2ODMzOjgzODkxMjIsMjgxODU3MjI4OTo1MTQsMzA4NzAwNzc0NTo4NDIxODg4LDMzNTU0NDMyMDE6ODM4OTEyMCwzNjIzODc4NjU3OjAsMzg5MjMxNDExMzozMzI4MCw0MTYwNzQ5NTY5Ojg0MjEzNzh9LHtcIjBcIjoxMDc0MjgyNTEyLDE2Nzc3MjE2OjE2Mzg0LDMzNTU0NDMyOjUyNDI4OCw1MDMzMTY0ODoxMDc0MjY2MTI4LDY3MTA4ODY0OjEwNzM3NDE4NDAsODM4ODYwODA6MTA3NDI4MjQ5NiwxMDA2NjMyOTY6MTA3Mzc1ODIwOCwxMTc0NDA1MTI6MTYsMTM0MjE3NzI4OjU0MDY3MiwxNTA5OTQ5NDQ6MTA3Mzc1ODIyNCwxNjc3NzIxNjA6MTA3Mzc0MTgyNCwxODQ1NDkzNzY6NTQwNjg4LDIwMTMyNjU5Mjo1MjQzMDQsMjE4MTAzODA4OjAsMjM0ODgxMDI0OjE2NDAwLDI1MTY1ODI0MDoxMDc0MjY2MTEyLDgzODg2MDg6MTA3Mzc1ODIwOCwyNTE2NTgyNDo1NDA2ODgsNDE5NDMwNDA6MTYsNTg3MjAyNTY6MTA3Mzc1ODIyNCxcbjc1NDk3NDcyOjEwNzQyODI1MTIsOTIyNzQ2ODg6MTA3Mzc0MTgyNCwxMDkwNTE5MDQ6NTI0Mjg4LDEyNTgyOTEyMDoxMDc0MjY2MTI4LDE0MjYwNjMzNjo1MjQzMDQsMTU5MzgzNTUyOjAsMTc2MTYwNzY4OjE2Mzg0LDE5MjkzNzk4NDoxMDc0MjY2MTEyLDIwOTcxNTIwMDoxMDczNzQxODQwLDIyNjQ5MjQxNjo1NDA2NzIsMjQzMjY5NjMyOjEwNzQyODI0OTYsMjYwMDQ2ODQ4OjE2NDAwLDI2ODQzNTQ1NjowLDI4NTIxMjY3MjoxMDc0MjY2MTI4LDMwMTk4OTg4ODoxMDczNzU4MjI0LDMxODc2NzEwNDoxMDc0MjgyNDk2LDMzNTU0NDMyMDoxMDc0MjY2MTEyLDM1MjMyMTUzNjoxNiwzNjkwOTg3NTI6NTQwNjg4LDM4NTg3NTk2ODoxNjM4NCw0MDI2NTMxODQ6MTY0MDAsNDE5NDMwNDAwOjUyNDI4OCw0MzYyMDc2MTY6NTI0MzA0LDQ1Mjk4NDgzMjoxMDczNzQxODQwLDQ2OTc2MjA0ODo1NDA2NzIsNDg2NTM5MjY0OjEwNzM3NTgyMDgsNTAzMzE2NDgwOjEwNzM3NDE4MjQsNTIwMDkzNjk2OjEwNzQyODI1MTIsXG4yNzY4MjQwNjQ6NTQwNjg4LDI5MzYwMTI4MDo1MjQyODgsMzEwMzc4NDk2OjEwNzQyNjYxMTIsMzI3MTU1NzEyOjE2Mzg0LDM0MzkzMjkyODoxMDczNzU4MjA4LDM2MDcxMDE0NDoxMDc0MjgyNTEyLDM3NzQ4NzM2MDoxNiwzOTQyNjQ1NzY6MTA3Mzc0MTgyNCw0MTEwNDE3OTI6MTA3NDI4MjQ5Niw0Mjc4MTkwMDg6MTA3Mzc0MTg0MCw0NDQ1OTYyMjQ6MTA3Mzc1ODIyNCw0NjEzNzM0NDA6NTI0MzA0LDQ3ODE1MDY1NjowLDQ5NDkyNzg3MjoxNjQwMCw1MTE3MDUwODg6MTA3NDI2NjEyOCw1Mjg0ODIzMDQ6NTQwNjcyfSx7XCIwXCI6MjYwLDEwNDg1NzY6MCwyMDk3MTUyOjY3MTA5MTIwLDMxNDU3Mjg6NjU3OTYsNDE5NDMwNDo2NTU0MCw1MjQyODgwOjY3MTA4ODY4LDYyOTE0NTY6NjcxNzQ2NjAsNzM0MDAzMjo2NzE3NDQwMCw4Mzg4NjA4OjY3MTA4ODY0LDk0MzcxODQ6NjcxNzQ2NTYsMTA0ODU3NjA6NjU3OTIsMTE1MzQzMzY6NjcxNzQ0MDQsMTI1ODI5MTI6NjcxMDkxMjQsMTM2MzE0ODg6NjU1MzYsXG4xNDY4MDA2NDo0LDE1NzI4NjQwOjI1Niw1MjQyODg6NjcxNzQ2NTYsMTU3Mjg2NDo2NzE3NDQwNCwyNjIxNDQwOjAsMzY3MDAxNjo2NzEwOTEyMCw0NzE4NTkyOjY3MTA4ODY4LDU3NjcxNjg6NjU1MzYsNjgxNTc0NDo2NTU0MCw3ODY0MzIwOjI2MCw4OTEyODk2OjQsOTk2MTQ3MjoyNTYsMTEwMTAwNDg6NjcxNzQ0MDAsMTIwNTg2MjQ6NjU3OTYsMTMxMDcyMDA6NjU3OTIsMTQxNTU3NzY6NjcxMDkxMjQsMTUyMDQzNTI6NjcxNzQ2NjAsMTYyNTI5Mjg6NjcxMDg4NjQsMTY3NzcyMTY6NjcxNzQ2NTYsMTc4MjU3OTI6NjU1NDAsMTg4NzQzNjg6NjU1MzYsMTk5MjI5NDQ6NjcxMDkxMjAsMjA5NzE1MjA6MjU2LDIyMDIwMDk2OjY3MTc0NjYwLDIzMDY4NjcyOjY3MTA4ODY4LDI0MTE3MjQ4OjAsMjUxNjU4MjQ6NjcxMDkxMjQsMjYyMTQ0MDA6NjcxMDg4NjQsMjcyNjI5NzY6NCwyODMxMTU1Mjo2NTc5MiwyOTM2MDEyODo2NzE3NDQwMCwzMDQwODcwNDoyNjAsMzE0NTcyODA6NjU3OTYsMzI1MDU4NTY6NjcxNzQ0MDQsXG4xNzMwMTUwNDo2NzEwODg2NCwxODM1MDA4MDoyNjAsMTkzOTg2NTY6NjcxNzQ2NTYsMjA0NDcyMzI6MCwyMTQ5NTgwODo2NTU0MCwyMjU0NDM4NDo2NzEwOTEyMCwyMzU5Mjk2MDoyNTYsMjQ2NDE1MzY6NjcxNzQ0MDQsMjU2OTAxMTI6NjU1MzYsMjY3Mzg2ODg6NjcxNzQ2NjAsMjc3ODcyNjQ6NjU3OTYsMjg4MzU4NDA6NjcxMDg4NjgsMjk4ODQ0MTY6NjcxMDkxMjQsMzA5MzI5OTI6NjcxNzQ0MDAsMzE5ODE1Njg6NCwzMzAzMDE0NDo2NTc5Mn0se1wiMFwiOjIxNTE2ODIwNDgsNjU1MzY6MjE0NzQ4NzgwOCwxMzEwNzI6NDE5ODQ2NCwxOTY2MDg6MjE1MTY3Nzk1MiwyNjIxNDQ6MCwzMjc2ODA6NDE5ODQwMCwzOTMyMTY6MjE0NzQ4MzcxMiw0NTg3NTI6NDE5NDM2OCw1MjQyODg6MjE0NzQ4MzY0OCw1ODk4MjQ6NDE5NDMwNCw2NTUzNjA6NjQsNzIwODk2OjIxNDc0ODc3NDQsNzg2NDMyOjIxNTE2NzgwMTYsODUxOTY4OjQxNjAsOTE3NTA0OjQwOTYsOTgzMDQwOjIxNTE2ODIxMTIsMzI3Njg6MjE0NzQ4NzgwOCxcbjk4MzA0OjY0LDE2Mzg0MDoyMTUxNjc4MDE2LDIyOTM3NjoyMTQ3NDg3NzQ0LDI5NDkxMjo0MTk4NDAwLDM2MDQ0ODoyMTUxNjgyMTEyLDQyNTk4NDowLDQ5MTUyMDoyMTUxNjc3OTUyLDU1NzA1Njo0MDk2LDYyMjU5MjoyMTUxNjgyMDQ4LDY4ODEyODo0MTk0MzA0LDc1MzY2NDo0MTYwLDgxOTIwMDoyMTQ3NDgzNjQ4LDg4NDczNjo0MTk0MzY4LDk1MDI3Mjo0MTk4NDY0LDEwMTU4MDg6MjE0NzQ4MzcxMiwxMDQ4NTc2OjQxOTQzNjgsMTExNDExMjo0MTk4NDAwLDExNzk2NDg6MjE0NzQ4MzcxMiwxMjQ1MTg0OjAsMTMxMDcyMDo0MTYwLDEzNzYyNTY6MjE1MTY3ODAxNiwxNDQxNzkyOjIxNTE2ODIwNDgsMTUwNzMyODoyMTQ3NDg3ODA4LDE1NzI4NjQ6MjE1MTY4MjExMiwxNjM4NDAwOjIxNDc0ODM2NDgsMTcwMzkzNjoyMTUxNjc3OTUyLDE3Njk0NzI6NDE5ODQ2NCwxODM1MDA4OjIxNDc0ODc3NDQsMTkwMDU0NDo0MTk0MzA0LDE5NjYwODA6NjQsMjAzMTYxNjo0MDk2LDEwODEzNDQ6MjE1MTY3Nzk1MixcbjExNDY4ODA6MjE1MTY4MjExMiwxMjEyNDE2OjAsMTI3Nzk1Mjo0MTk4NDAwLDEzNDM0ODg6NDE5NDM2OCwxNDA5MDI0OjIxNDc0ODM2NDgsMTQ3NDU2MDoyMTQ3NDg3ODA4LDE1NDAwOTY6NjQsMTYwNTYzMjoyMTQ3NDgzNzEyLDE2NzExNjg6NDA5NiwxNzM2NzA0OjIxNDc0ODc3NDQsMTgwMjI0MDoyMTUxNjc4MDE2LDE4Njc3NzY6NDE2MCwxOTMzMzEyOjIxNTE2ODIwNDgsMTk5ODg0ODo0MTk0MzA0LDIwNjQzODQ6NDE5ODQ2NH0se1wiMFwiOjEyOCw0MDk2OjE3MDM5MzYwLDgxOTI6MjYyMTQ0LDEyMjg4OjUzNjg3MDkxMiwxNjM4NDo1MzcxMzMxODQsMjA0ODA6MTY3NzczNDQsMjQ1NzY6NTUzNjQ4MjU2LDI4NjcyOjI2MjI3MiwzMjc2ODoxNjc3NzIxNiwzNjg2NDo1MzcxMzMwNTYsNDA5NjA6NTM2ODcxMDQwLDQ1MDU2OjU1MzkxMDQwMCw0OTE1Mjo1NTM5MTAyNzIsNTMyNDg6MCw1NzM0NDoxNzAzOTQ4OCw2MTQ0MDo1NTM2NDgxMjgsMjA0ODoxNzAzOTQ4OCw2MTQ0OjU1MzY0ODI1NixcbjEwMjQwOjEyOCwxNDMzNjoxNzAzOTM2MCwxODQzMjoyNjIxNDQsMjI1Mjg6NTM3MTMzMTg0LDI2NjI0OjU1MzkxMDI3MiwzMDcyMDo1MzY4NzA5MTIsMzQ4MTY6NTM3MTMzMDU2LDM4OTEyOjAsNDMwMDg6NTUzOTEwNDAwLDQ3MTA0OjE2Nzc3MzQ0LDUxMjAwOjUzNjg3MTA0MCw1NTI5Njo1NTM2NDgxMjgsNTkzOTI6MTY3NzcyMTYsNjM0ODg6MjYyMjcyLDY1NTM2OjI2MjE0NCw2OTYzMjoxMjgsNzM3Mjg6NTM2ODcwOTEyLDc3ODI0OjU1MzY0ODI1Niw4MTkyMDoxNjc3NzM0NCw4NjAxNjo1NTM5MTAyNzIsOTAxMTI6NTM3MTMzMTg0LDk0MjA4OjE2Nzc3MjE2LDk4MzA0OjU1MzkxMDQwMCwxMDI0MDA6NTUzNjQ4MTI4LDEwNjQ5NjoxNzAzOTM2MCwxMTA1OTI6NTM3MTMzMDU2LDExNDY4ODoyNjIyNzIsMTE4Nzg0OjUzNjg3MTA0MCwxMjI4ODA6MCwxMjY5NzY6MTcwMzk0ODgsNjc1ODQ6NTUzNjQ4MjU2LDcxNjgwOjE2Nzc3MjE2LDc1Nzc2OjE3MDM5MzYwLDc5ODcyOjUzNzEzMzE4NCxcbjgzOTY4OjUzNjg3MDkxMiw4ODA2NDoxNzAzOTQ4OCw5MjE2MDoxMjgsOTYyNTY6NTUzOTEwMjcyLDEwMDM1MjoyNjIyNzIsMTA0NDQ4OjU1MzkxMDQwMCwxMDg1NDQ6MCwxMTI2NDA6NTUzNjQ4MTI4LDExNjczNjoxNjc3NzM0NCwxMjA4MzI6MjYyMTQ0LDEyNDkyODo1MzcxMzMwNTYsMTI5MDI0OjUzNjg3MTA0MH0se1wiMFwiOjI2ODQzNTQ2NCwyNTY6ODE5Miw1MTI6MjcwNTMyNjA4LDc2ODoyNzA1NDA4MDgsMTAyNDoyNjg0NDM2NDgsMTI4MDoyMDk3MTUyLDE1MzY6MjA5NzE2MCwxNzkyOjI2ODQzNTQ1NiwyMDQ4OjAsMjMwNDoyNjg0NDM2NTYsMjU2MDoyMTA1MzQ0LDI4MTY6OCwzMDcyOjI3MDUzMjYxNiwzMzI4OjIxMDUzNTIsMzU4NDo4MjAwLDM4NDA6MjcwNTQwODAwLDEyODoyNzA1MzI2MDgsMzg0OjI3MDU0MDgwOCw2NDA6OCw4OTY6MjA5NzE1MiwxMTUyOjIxMDUzNTIsMTQwODoyNjg0MzU0NjQsMTY2NDoyNjg0NDM2NDgsMTkyMDo4MjAwLDIxNzY6MjA5NzE2MCwyNDMyOjgxOTIsXG4yNjg4OjI2ODQ0MzY1NiwyOTQ0OjI3MDUzMjYxNiwzMjAwOjAsMzQ1NjoyNzA1NDA4MDAsMzcxMjoyMTA1MzQ0LDM5Njg6MjY4NDM1NDU2LDQwOTY6MjY4NDQzNjQ4LDQzNTI6MjcwNTMyNjE2LDQ2MDg6MjcwNTQwODA4LDQ4NjQ6ODIwMCw1MTIwOjIwOTcxNTIsNTM3NjoyNjg0MzU0NTYsNTYzMjoyNjg0MzU0NjQsNTg4ODoyMTA1MzQ0LDYxNDQ6MjEwNTM1Miw2NDAwOjAsNjY1Njo4LDY5MTI6MjcwNTMyNjA4LDcxNjg6ODE5Miw3NDI0OjI2ODQ0MzY1Niw3NjgwOjI3MDU0MDgwMCw3OTM2OjIwOTcxNjAsNDIyNDo4LDQ0ODA6MjEwNTM0NCw0NzM2OjIwOTcxNTIsNDk5MjoyNjg0MzU0NjQsNTI0ODoyNjg0NDM2NDgsNTUwNDo4MjAwLDU3NjA6MjcwNTQwODA4LDYwMTY6MjcwNTMyNjA4LDYyNzI6MjcwNTQwODAwLDY1Mjg6MjcwNTMyNjE2LDY3ODQ6ODE5Miw3MDQwOjIxMDUzNTIsNzI5NjoyMDk3MTYwLDc1NTI6MCw3ODA4OjI2ODQzNTQ1Niw4MDY0OjI2ODQ0MzY1Nn0se1wiMFwiOjEwNDg1NzYsXG4xNjozMzU1NTQ1NywzMjoxMDI0LDQ4OjEwNDk2MDEsNjQ6MzQ2MDQwMzMsODA6MCw5NjoxLDExMjozNDYwMzAwOSwxMjg6MzM1NTU0NTYsMTQ0OjEwNDg1NzcsMTYwOjMzNTU0NDMzLDE3NjozNDYwNDAzMiwxOTI6MzQ2MDMwMDgsMjA4OjEwMjUsMjI0OjEwNDk2MDAsMjQwOjMzNTU0NDMyLDg6MzQ2MDMwMDksMjQ6MCw0MDozMzU1NTQ1Nyw1NjozNDYwNDAzMiw3MjoxMDQ4NTc2LDg4OjMzNTU0NDMzLDEwNDozMzU1NDQzMiwxMjA6MTAyNSwxMzY6MTA0OTYwMSwxNTI6MzM1NTU0NTYsMTY4OjM0NjAzMDA4LDE4NDoxMDQ4NTc3LDIwMDoxMDI0LDIxNjozNDYwNDAzMywyMzI6MSwyNDg6MTA0OTYwMCwyNTY6MzM1NTQ0MzIsMjcyOjEwNDg1NzYsMjg4OjMzNTU1NDU3LDMwNDozNDYwMzAwOSwzMjA6MTA0ODU3NywzMzY6MzM1NTU0NTYsMzUyOjM0NjA0MDMyLDM2ODoxMDQ5NjAxLDM4NDoxMDI1LDQwMDozNDYwNDAzMyw0MTY6MTA0OTYwMCw0MzI6MSw0NDg6MCw0NjQ6MzQ2MDMwMDgsNDgwOjMzNTU0NDMzLFxuNDk2OjEwMjQsMjY0OjEwNDk2MDAsMjgwOjMzNTU1NDU3LDI5NjozNDYwMzAwOSwzMTI6MSwzMjg6MzM1NTQ0MzIsMzQ0OjEwNDg1NzYsMzYwOjEwMjUsMzc2OjM0NjA0MDMyLDM5MjozMzU1NDQzMyw0MDg6MzQ2MDMwMDgsNDI0OjAsNDQwOjM0NjA0MDMzLDQ1NjoxMDQ5NjAxLDQ3MjoxMDI0LDQ4ODozMzU1NTQ1Niw1MDQ6MTA0ODU3N30se1wiMFwiOjEzNDIxOTgwOCwxOjEzMTA3MiwyOjEzNDIxNzcyOCwzOjMyLDQ6MTMxMTA0LDU6MTM0MzUwODgwLDY6MTM0MzUwODQ4LDc6MjA0OCw4OjEzNDM0ODgwMCw5OjEzNDIxOTc3NiwxMDoxMzMxMjAsMTE6MTM0MzQ4ODMyLDEyOjIwODAsMTM6MCwxNDoxMzQyMTc3NjAsMTU6MTMzMTUyLDIxNDc0ODM2NDg6MjA0OCwyMTQ3NDgzNjQ5OjEzNDM1MDg4MCwyMTQ3NDgzNjUwOjEzNDIxOTgwOCwyMTQ3NDgzNjUxOjEzNDIxNzcyOCwyMTQ3NDgzNjUyOjEzNDM0ODgwMCwyMTQ3NDgzNjUzOjEzMzEyMCwyMTQ3NDgzNjU0OjEzMzE1MiwyMTQ3NDgzNjU1OjMyLFxuMjE0NzQ4MzY1NjoxMzQyMTc3NjAsMjE0NzQ4MzY1NzoyMDgwLDIxNDc0ODM2NTg6MTMxMTA0LDIxNDc0ODM2NTk6MTM0MzUwODQ4LDIxNDc0ODM2NjA6MCwyMTQ3NDgzNjYxOjEzNDM0ODgzMiwyMTQ3NDgzNjYyOjEzNDIxOTc3NiwyMTQ3NDgzNjYzOjEzMTA3MiwxNjoxMzMxNTIsMTc6MTM0MzUwODQ4LDE4OjMyLDE5OjIwNDgsMjA6MTM0MjE5Nzc2LDIxOjEzNDIxNzc2MCwyMjoxMzQzNDg4MzIsMjM6MTMxMDcyLDI0OjAsMjU6MTMxMTA0LDI2OjEzNDM0ODgwMCwyNzoxMzQyMTk4MDgsMjg6MTM0MzUwODgwLDI5OjEzMzEyMCwzMDoyMDgwLDMxOjEzNDIxNzcyOCwyMTQ3NDgzNjY0OjEzMTA3MiwyMTQ3NDgzNjY1OjIwNDgsMjE0NzQ4MzY2NjoxMzQzNDg4MzIsMjE0NzQ4MzY2NzoxMzMxNTIsMjE0NzQ4MzY2ODozMiwyMTQ3NDgzNjY5OjEzNDM0ODgwMCwyMTQ3NDgzNjcwOjEzNDIxNzcyOCwyMTQ3NDgzNjcxOjEzNDIxOTgwOCwyMTQ3NDgzNjcyOjEzNDM1MDg4MCwyMTQ3NDgzNjczOjEzNDIxNzc2MCxcbjIxNDc0ODM2NzQ6MTM0MjE5Nzc2LDIxNDc0ODM2NzU6MCwyMTQ3NDgzNjc2OjEzMzEyMCwyMTQ3NDgzNjc3OjIwODAsMjE0NzQ4MzY3ODoxMzExMDQsMjE0NzQ4MzY3OToxMzQzNTA4NDh9XSx0PVs0MTYwNzQ5NTY5LDUyODQ4MjMwNCwzMzAzMDE0NCwyMDY0Mzg0LDEyOTAyNCw4MDY0LDUwNCwyMTQ3NDgzNjc5XSxtPWcuREVTPWUuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLl9rZXkud29yZHMsYz1bXSxhPTA7NTY+YTthKyspe3ZhciBmPXFbYV0tMTtjW2FdPWJbZj4+PjVdPj4+MzEtZiUzMiYxfWI9dGhpcy5fc3ViS2V5cz1bXTtmb3IoZj0wOzE2PmY7ZisrKXtmb3IodmFyIGQ9YltmXT1bXSxlPXJbZl0sYT0wOzI0PmE7YSsrKWRbYS82fDBdfD1jWyhwW2FdLTErZSklMjhdPDwzMS1hJTYsZFs0KyhhLzZ8MCldfD1jWzI4KyhwW2ErMjRdLTErZSklMjhdPDwzMS1hJTY7ZFswXT1kWzBdPDwxfGRbMF0+Pj4zMTtmb3IoYT0xOzc+YTthKyspZFthXT4+Pj1cbjQqKGEtMSkrMztkWzddPWRbN108PDV8ZFs3XT4+PjI3fWM9dGhpcy5faW52U3ViS2V5cz1bXTtmb3IoYT0wOzE2PmE7YSsrKWNbYV09YlsxNS1hXX0sZW5jcnlwdEJsb2NrOmZ1bmN0aW9uKGIsYyl7dGhpcy5fZG9DcnlwdEJsb2NrKGIsYyx0aGlzLl9zdWJLZXlzKX0sZGVjcnlwdEJsb2NrOmZ1bmN0aW9uKGIsYyl7dGhpcy5fZG9DcnlwdEJsb2NrKGIsYyx0aGlzLl9pbnZTdWJLZXlzKX0sX2RvQ3J5cHRCbG9jazpmdW5jdGlvbihiLGMsYSl7dGhpcy5fbEJsb2NrPWJbY107dGhpcy5fckJsb2NrPWJbYysxXTtqLmNhbGwodGhpcyw0LDI1MjY0NTEzNSk7ai5jYWxsKHRoaXMsMTYsNjU1MzUpO2wuY2FsbCh0aGlzLDIsODU4OTkzNDU5KTtsLmNhbGwodGhpcyw4LDE2NzExOTM1KTtqLmNhbGwodGhpcywxLDE0MzE2NTU3NjUpO2Zvcih2YXIgZj0wOzE2PmY7ZisrKXtmb3IodmFyIGQ9YVtmXSxlPXRoaXMuX2xCbG9jayxoPXRoaXMuX3JCbG9jayxnPTAsaz0wOzg+aztrKyspZ3w9c1trXVsoKGheXG5kW2tdKSZ0W2tdKT4+PjBdO3RoaXMuX2xCbG9jaz1oO3RoaXMuX3JCbG9jaz1lXmd9YT10aGlzLl9sQmxvY2s7dGhpcy5fbEJsb2NrPXRoaXMuX3JCbG9jazt0aGlzLl9yQmxvY2s9YTtqLmNhbGwodGhpcywxLDE0MzE2NTU3NjUpO2wuY2FsbCh0aGlzLDgsMTY3MTE5MzUpO2wuY2FsbCh0aGlzLDIsODU4OTkzNDU5KTtqLmNhbGwodGhpcywxNiw2NTUzNSk7ai5jYWxsKHRoaXMsNCwyNTI2NDUxMzUpO2JbY109dGhpcy5fbEJsb2NrO2JbYysxXT10aGlzLl9yQmxvY2t9LGtleVNpemU6MixpdlNpemU6MixibG9ja1NpemU6Mn0pO2guREVTPWUuX2NyZWF0ZUhlbHBlcihtKTtnPWcuVHJpcGxlREVTPWUuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2tleS53b3Jkczt0aGlzLl9kZXMxPW0uY3JlYXRlRW5jcnlwdG9yKG4uY3JlYXRlKGIuc2xpY2UoMCwyKSkpO3RoaXMuX2RlczI9bS5jcmVhdGVFbmNyeXB0b3Iobi5jcmVhdGUoYi5zbGljZSgyLDQpKSk7dGhpcy5fZGVzMz1cbm0uY3JlYXRlRW5jcnlwdG9yKG4uY3JlYXRlKGIuc2xpY2UoNCw2KSkpfSxlbmNyeXB0QmxvY2s6ZnVuY3Rpb24oYixjKXt0aGlzLl9kZXMxLmVuY3J5cHRCbG9jayhiLGMpO3RoaXMuX2RlczIuZGVjcnlwdEJsb2NrKGIsYyk7dGhpcy5fZGVzMy5lbmNyeXB0QmxvY2soYixjKX0sZGVjcnlwdEJsb2NrOmZ1bmN0aW9uKGIsYyl7dGhpcy5fZGVzMy5kZWNyeXB0QmxvY2soYixjKTt0aGlzLl9kZXMyLmVuY3J5cHRCbG9jayhiLGMpO3RoaXMuX2RlczEuZGVjcnlwdEJsb2NrKGIsYyl9LGtleVNpemU6NixpdlNpemU6MixibG9ja1NpemU6Mn0pO2guVHJpcGxlREVTPWUuX2NyZWF0ZUhlbHBlcihnKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgZW5jLWJhc2U2NC1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIGg9Q3J5cHRvSlMsaj1oLmxpYi5Xb3JkQXJyYXk7aC5lbmMuQmFzZTY0PXtzdHJpbmdpZnk6ZnVuY3Rpb24oYil7dmFyIGU9Yi53b3JkcyxmPWIuc2lnQnl0ZXMsYz10aGlzLl9tYXA7Yi5jbGFtcCgpO2I9W107Zm9yKHZhciBhPTA7YTxmO2ErPTMpZm9yKHZhciBkPShlW2E+Pj4yXT4+PjI0LTgqKGElNCkmMjU1KTw8MTZ8KGVbYSsxPj4+Ml0+Pj4yNC04KigoYSsxKSU0KSYyNTUpPDw4fGVbYSsyPj4+Ml0+Pj4yNC04KigoYSsyKSU0KSYyNTUsZz0wOzQ+ZyYmYSswLjc1Kmc8ZjtnKyspYi5wdXNoKGMuY2hhckF0KGQ+Pj42KigzLWcpJjYzKSk7aWYoZT1jLmNoYXJBdCg2NCkpZm9yKDtiLmxlbmd0aCU0OyliLnB1c2goZSk7cmV0dXJuIGIuam9pbihcIlwiKX0scGFyc2U6ZnVuY3Rpb24oYil7dmFyIGU9Yi5sZW5ndGgsZj10aGlzLl9tYXAsYz1mLmNoYXJBdCg2NCk7YyYmKGM9Yi5pbmRleE9mKGMpLC0xIT1jJiYoZT1jKSk7Zm9yKHZhciBjPVtdLGE9MCxkPTA7ZDxcbmU7ZCsrKWlmKGQlNCl7dmFyIGc9Zi5pbmRleE9mKGIuY2hhckF0KGQtMSkpPDwyKihkJTQpLGg9Zi5pbmRleE9mKGIuY2hhckF0KGQpKT4+PjYtMiooZCU0KTtjW2E+Pj4yXXw9KGd8aCk8PDI0LTgqKGElNCk7YSsrfXJldHVybiBqLmNyZWF0ZShjLGEpfSxfbWFwOlwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIn19KSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIG1kNS1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKEUpe2Z1bmN0aW9uIGgoYSxmLGcsaixwLGgsayl7YT1hKyhmJmd8fmYmaikrcCtrO3JldHVybihhPDxofGE+Pj4zMi1oKStmfWZ1bmN0aW9uIGsoYSxmLGcsaixwLGgsayl7YT1hKyhmJmp8ZyZ+aikrcCtrO3JldHVybihhPDxofGE+Pj4zMi1oKStmfWZ1bmN0aW9uIGwoYSxmLGcsaixoLGssbCl7YT1hKyhmXmdeaikraCtsO3JldHVybihhPDxrfGE+Pj4zMi1rKStmfWZ1bmN0aW9uIG4oYSxmLGcsaixoLGssbCl7YT1hKyhnXihmfH5qKSkraCtsO3JldHVybihhPDxrfGE+Pj4zMi1rKStmfWZvcih2YXIgcj1DcnlwdG9KUyxxPXIubGliLEY9cS5Xb3JkQXJyYXkscz1xLkhhc2hlcixxPXIuYWxnbyxhPVtdLHQ9MDs2ND50O3QrKylhW3RdPTQyOTQ5NjcyOTYqRS5hYnMoRS5zaW4odCsxKSl8MDtxPXEuTUQ1PXMuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IEYuaW5pdChbMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4XSl9LFxuX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKG0sZil7Zm9yKHZhciBnPTA7MTY+ZztnKyspe3ZhciBqPWYrZyxwPW1bal07bVtqXT0ocDw8OHxwPj4+MjQpJjE2NzExOTM1fChwPDwyNHxwPj4+OCkmNDI3ODI1NTM2MH12YXIgZz10aGlzLl9oYXNoLndvcmRzLGo9bVtmKzBdLHA9bVtmKzFdLHE9bVtmKzJdLHI9bVtmKzNdLHM9bVtmKzRdLHQ9bVtmKzVdLHU9bVtmKzZdLHY9bVtmKzddLHc9bVtmKzhdLHg9bVtmKzldLHk9bVtmKzEwXSx6PW1bZisxMV0sQT1tW2YrMTJdLEI9bVtmKzEzXSxDPW1bZisxNF0sRD1tW2YrMTVdLGI9Z1swXSxjPWdbMV0sZD1nWzJdLGU9Z1szXSxiPWgoYixjLGQsZSxqLDcsYVswXSksZT1oKGUsYixjLGQscCwxMixhWzFdKSxkPWgoZCxlLGIsYyxxLDE3LGFbMl0pLGM9aChjLGQsZSxiLHIsMjIsYVszXSksYj1oKGIsYyxkLGUscyw3LGFbNF0pLGU9aChlLGIsYyxkLHQsMTIsYVs1XSksZD1oKGQsZSxiLGMsdSwxNyxhWzZdKSxjPWgoYyxkLGUsYix2LDIyLGFbN10pLFxuYj1oKGIsYyxkLGUsdyw3LGFbOF0pLGU9aChlLGIsYyxkLHgsMTIsYVs5XSksZD1oKGQsZSxiLGMseSwxNyxhWzEwXSksYz1oKGMsZCxlLGIseiwyMixhWzExXSksYj1oKGIsYyxkLGUsQSw3LGFbMTJdKSxlPWgoZSxiLGMsZCxCLDEyLGFbMTNdKSxkPWgoZCxlLGIsYyxDLDE3LGFbMTRdKSxjPWgoYyxkLGUsYixELDIyLGFbMTVdKSxiPWsoYixjLGQsZSxwLDUsYVsxNl0pLGU9ayhlLGIsYyxkLHUsOSxhWzE3XSksZD1rKGQsZSxiLGMseiwxNCxhWzE4XSksYz1rKGMsZCxlLGIsaiwyMCxhWzE5XSksYj1rKGIsYyxkLGUsdCw1LGFbMjBdKSxlPWsoZSxiLGMsZCx5LDksYVsyMV0pLGQ9ayhkLGUsYixjLEQsMTQsYVsyMl0pLGM9ayhjLGQsZSxiLHMsMjAsYVsyM10pLGI9ayhiLGMsZCxlLHgsNSxhWzI0XSksZT1rKGUsYixjLGQsQyw5LGFbMjVdKSxkPWsoZCxlLGIsYyxyLDE0LGFbMjZdKSxjPWsoYyxkLGUsYix3LDIwLGFbMjddKSxiPWsoYixjLGQsZSxCLDUsYVsyOF0pLGU9ayhlLGIsXG5jLGQscSw5LGFbMjldKSxkPWsoZCxlLGIsYyx2LDE0LGFbMzBdKSxjPWsoYyxkLGUsYixBLDIwLGFbMzFdKSxiPWwoYixjLGQsZSx0LDQsYVszMl0pLGU9bChlLGIsYyxkLHcsMTEsYVszM10pLGQ9bChkLGUsYixjLHosMTYsYVszNF0pLGM9bChjLGQsZSxiLEMsMjMsYVszNV0pLGI9bChiLGMsZCxlLHAsNCxhWzM2XSksZT1sKGUsYixjLGQscywxMSxhWzM3XSksZD1sKGQsZSxiLGMsdiwxNixhWzM4XSksYz1sKGMsZCxlLGIseSwyMyxhWzM5XSksYj1sKGIsYyxkLGUsQiw0LGFbNDBdKSxlPWwoZSxiLGMsZCxqLDExLGFbNDFdKSxkPWwoZCxlLGIsYyxyLDE2LGFbNDJdKSxjPWwoYyxkLGUsYix1LDIzLGFbNDNdKSxiPWwoYixjLGQsZSx4LDQsYVs0NF0pLGU9bChlLGIsYyxkLEEsMTEsYVs0NV0pLGQ9bChkLGUsYixjLEQsMTYsYVs0Nl0pLGM9bChjLGQsZSxiLHEsMjMsYVs0N10pLGI9bihiLGMsZCxlLGosNixhWzQ4XSksZT1uKGUsYixjLGQsdiwxMCxhWzQ5XSksZD1uKGQsZSxiLGMsXG5DLDE1LGFbNTBdKSxjPW4oYyxkLGUsYix0LDIxLGFbNTFdKSxiPW4oYixjLGQsZSxBLDYsYVs1Ml0pLGU9bihlLGIsYyxkLHIsMTAsYVs1M10pLGQ9bihkLGUsYixjLHksMTUsYVs1NF0pLGM9bihjLGQsZSxiLHAsMjEsYVs1NV0pLGI9bihiLGMsZCxlLHcsNixhWzU2XSksZT1uKGUsYixjLGQsRCwxMCxhWzU3XSksZD1uKGQsZSxiLGMsdSwxNSxhWzU4XSksYz1uKGMsZCxlLGIsQiwyMSxhWzU5XSksYj1uKGIsYyxkLGUscyw2LGFbNjBdKSxlPW4oZSxiLGMsZCx6LDEwLGFbNjFdKSxkPW4oZCxlLGIsYyxxLDE1LGFbNjJdKSxjPW4oYyxkLGUsYix4LDIxLGFbNjNdKTtnWzBdPWdbMF0rYnwwO2dbMV09Z1sxXStjfDA7Z1syXT1nWzJdK2R8MDtnWzNdPWdbM10rZXwwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2RhdGEsZj1hLndvcmRzLGc9OCp0aGlzLl9uRGF0YUJ5dGVzLGo9OCphLnNpZ0J5dGVzO2Zbaj4+PjVdfD0xMjg8PDI0LWolMzI7dmFyIGg9RS5mbG9vcihnL1xuNDI5NDk2NzI5Nik7Zlsoais2ND4+Pjk8PDQpKzE1XT0oaDw8OHxoPj4+MjQpJjE2NzExOTM1fChoPDwyNHxoPj4+OCkmNDI3ODI1NTM2MDtmWyhqKzY0Pj4+OTw8NCkrMTRdPShnPDw4fGc+Pj4yNCkmMTY3MTE5MzV8KGc8PDI0fGc+Pj44KSY0Mjc4MjU1MzYwO2Euc2lnQnl0ZXM9NCooZi5sZW5ndGgrMSk7dGhpcy5fcHJvY2VzcygpO2E9dGhpcy5faGFzaDtmPWEud29yZHM7Zm9yKGc9MDs0Pmc7ZysrKWo9ZltnXSxmW2ddPShqPDw4fGo+Pj4yNCkmMTY3MTE5MzV8KGo8PDI0fGo+Pj44KSY0Mjc4MjU1MzYwO3JldHVybiBhfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBhPXMuY2xvbmUuY2FsbCh0aGlzKTthLl9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKTtyZXR1cm4gYX19KTtyLk1ENT1zLl9jcmVhdGVIZWxwZXIocSk7ci5IbWFjTUQ1PXMuX2NyZWF0ZUhtYWNIZWxwZXIocSl9KShNYXRoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBzaGExLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgaz1DcnlwdG9KUyxiPWsubGliLG09Yi5Xb3JkQXJyYXksbD1iLkhhc2hlcixkPVtdLGI9ay5hbGdvLlNIQTE9bC5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgbS5pbml0KFsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzgsMzI4NTM3NzUyMF0pfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24obixwKXtmb3IodmFyIGE9dGhpcy5faGFzaC53b3JkcyxlPWFbMF0sZj1hWzFdLGg9YVsyXSxqPWFbM10sYj1hWzRdLGM9MDs4MD5jO2MrKyl7aWYoMTY+YylkW2NdPW5bcCtjXXwwO2Vsc2V7dmFyIGc9ZFtjLTNdXmRbYy04XV5kW2MtMTRdXmRbYy0xNl07ZFtjXT1nPDwxfGc+Pj4zMX1nPShlPDw1fGU+Pj4yNykrYitkW2NdO2c9MjA+Yz9nKygoZiZofH5mJmopKzE1MTg1MDAyNDkpOjQwPmM/ZysoKGZeaF5qKSsxODU5Nzc1MzkzKTo2MD5jP2crKChmJmh8ZiZqfGgmaiktMTg5NDAwNzU4OCk6ZysoKGZeaF5cbmopLTg5OTQ5NzUxNCk7Yj1qO2o9aDtoPWY8PDMwfGY+Pj4yO2Y9ZTtlPWd9YVswXT1hWzBdK2V8MDthWzFdPWFbMV0rZnwwO2FbMl09YVsyXStofDA7YVszXT1hWzNdK2p8MDthWzRdPWFbNF0rYnwwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2RhdGEsZD1iLndvcmRzLGE9OCp0aGlzLl9uRGF0YUJ5dGVzLGU9OCpiLnNpZ0J5dGVzO2RbZT4+PjVdfD0xMjg8PDI0LWUlMzI7ZFsoZSs2ND4+Pjk8PDQpKzE0XT1NYXRoLmZsb29yKGEvNDI5NDk2NzI5Nik7ZFsoZSs2ND4+Pjk8PDQpKzE1XT1hO2Iuc2lnQnl0ZXM9NCpkLmxlbmd0aDt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXMuX2hhc2h9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGI9bC5jbG9uZS5jYWxsKHRoaXMpO2IuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBifX0pO2suU0hBMT1sLl9jcmVhdGVIZWxwZXIoYik7ay5IbWFjU0hBMT1sLl9jcmVhdGVIbWFjSGVscGVyKGIpfSkoKTtcblxuLypcbkNyeXB0b0pTIHYzLjEuMiBzaGEyNTYtbWluLmpzXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanNcbihjKSAyMDA5LTIwMTMgYnkgSmVmZiBNb3R0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzL3dpa2kvTGljZW5zZVxuKi9cbihmdW5jdGlvbihrKXtmb3IodmFyIGc9Q3J5cHRvSlMsaD1nLmxpYix2PWguV29yZEFycmF5LGo9aC5IYXNoZXIsaD1nLmFsZ28scz1bXSx0PVtdLHU9ZnVuY3Rpb24ocSl7cmV0dXJuIDQyOTQ5NjcyOTYqKHEtKHF8MCkpfDB9LGw9MixiPTA7NjQ+Yjspe3ZhciBkO2E6e2Q9bDtmb3IodmFyIHc9ay5zcXJ0KGQpLHI9MjtyPD13O3IrKylpZighKGQlcikpe2Q9ITE7YnJlYWsgYX1kPSEwfWQmJig4PmImJihzW2JdPXUoay5wb3cobCwwLjUpKSksdFtiXT11KGsucG93KGwsMS8zKSksYisrKTtsKyt9dmFyIG49W10saD1oLlNIQTI1Nj1qLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW5ldyB2LmluaXQocy5zbGljZSgwKSl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihxLGgpe2Zvcih2YXIgYT10aGlzLl9oYXNoLndvcmRzLGM9YVswXSxkPWFbMV0sYj1hWzJdLGs9YVszXSxmPWFbNF0sZz1hWzVdLGo9YVs2XSxsPWFbN10sZT0wOzY0PmU7ZSsrKXtpZigxNj5lKW5bZV09XG5xW2grZV18MDtlbHNle3ZhciBtPW5bZS0xNV0scD1uW2UtMl07bltlXT0oKG08PDI1fG0+Pj43KV4obTw8MTR8bT4+PjE4KV5tPj4+MykrbltlLTddKygocDw8MTV8cD4+PjE3KV4ocDw8MTN8cD4+PjE5KV5wPj4+MTApK25bZS0xNl19bT1sKygoZjw8MjZ8Zj4+PjYpXihmPDwyMXxmPj4+MTEpXihmPDw3fGY+Pj4yNSkpKyhmJmdefmYmaikrdFtlXStuW2VdO3A9KChjPDwzMHxjPj4+MileKGM8PDE5fGM+Pj4xMyleKGM8PDEwfGM+Pj4yMikpKyhjJmReYyZiXmQmYik7bD1qO2o9ZztnPWY7Zj1rK218MDtrPWI7Yj1kO2Q9YztjPW0rcHwwfWFbMF09YVswXStjfDA7YVsxXT1hWzFdK2R8MDthWzJdPWFbMl0rYnwwO2FbM109YVszXStrfDA7YVs0XT1hWzRdK2Z8MDthWzVdPWFbNV0rZ3wwO2FbNl09YVs2XStqfDA7YVs3XT1hWzddK2x8MH0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLl9kYXRhLGI9ZC53b3JkcyxhPTgqdGhpcy5fbkRhdGFCeXRlcyxjPTgqZC5zaWdCeXRlcztcbmJbYz4+PjVdfD0xMjg8PDI0LWMlMzI7YlsoYys2ND4+Pjk8PDQpKzE0XT1rLmZsb29yKGEvNDI5NDk2NzI5Nik7YlsoYys2ND4+Pjk8PDQpKzE1XT1hO2Quc2lnQnl0ZXM9NCpiLmxlbmd0aDt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXMuX2hhc2h9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGI9ai5jbG9uZS5jYWxsKHRoaXMpO2IuX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpO3JldHVybiBifX0pO2cuU0hBMjU2PWouX2NyZWF0ZUhlbHBlcihoKTtnLkhtYWNTSEEyNTY9ai5fY3JlYXRlSG1hY0hlbHBlcihoKX0pKE1hdGgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHNoYTIyNC1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIGI9Q3J5cHRvSlMsZD1iLmxpYi5Xb3JkQXJyYXksYT1iLmFsZ28sYz1hLlNIQTI1NixhPWEuU0hBMjI0PWMuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IGQuaW5pdChbMzIzODM3MTAzMiw5MTQxNTA2NjMsODEyNzAyOTk5LDQxNDQ5MTI2OTcsNDI5MDc3NTg1NywxNzUwNjAzMDI1LDE2OTQwNzY4MzksMzIwNDA3NTQyOF0pfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPWMuX2RvRmluYWxpemUuY2FsbCh0aGlzKTthLnNpZ0J5dGVzLT00O3JldHVybiBhfX0pO2IuU0hBMjI0PWMuX2NyZWF0ZUhlbHBlcihhKTtiLkhtYWNTSEEyMjQ9Yy5fY3JlYXRlSG1hY0hlbHBlcihhKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgc2hhNTEyLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7cmV0dXJuIGQuY3JlYXRlLmFwcGx5KGQsYXJndW1lbnRzKX1mb3IodmFyIG49Q3J5cHRvSlMscj1uLmxpYi5IYXNoZXIsZT1uLng2NCxkPWUuV29yZCxUPWUuV29yZEFycmF5LGU9bi5hbGdvLGVhPVthKDExMTYzNTI0MDgsMzYwOTc2NzQ1OCksYSgxODk5NDQ3NDQxLDYwMjg5MTcyNSksYSgzMDQ5MzIzNDcxLDM5NjQ0ODQzOTkpLGEoMzkyMTAwOTU3MywyMTczMjk1NTQ4KSxhKDk2MTk4NzE2Myw0MDgxNjI4NDcyKSxhKDE1MDg5NzA5OTMsMzA1MzgzNDI2NSksYSgyNDUzNjM1NzQ4LDI5Mzc2NzE1NzkpLGEoMjg3MDc2MzIyMSwzNjY0NjA5NTYwKSxhKDM2MjQzODEwODAsMjczNDg4MzM5NCksYSgzMTA1OTg0MDEsMTE2NDk5NjU0MiksYSg2MDcyMjUyNzgsMTMyMzYxMDc2NCksYSgxNDI2ODgxOTg3LDM1OTAzMDQ5OTQpLGEoMTkyNTA3ODM4OCw0MDY4MTgyMzgzKSxhKDIxNjIwNzgyMDYsOTkxMzM2MTEzKSxhKDI2MTQ4ODgxMDMsNjMzODAzMzE3KSxcbmEoMzI0ODIyMjU4MCwzNDc5Nzc0ODY4KSxhKDM4MzUzOTA0MDEsMjY2NjYxMzQ1OCksYSg0MDIyMjI0Nzc0LDk0NDcxMTEzOSksYSgyNjQzNDcwNzgsMjM0MTI2Mjc3MyksYSg2MDQ4MDc2MjgsMjAwNzgwMDkzMyksYSg3NzAyNTU5ODMsMTQ5NTk5MDkwMSksYSgxMjQ5MTUwMTIyLDE4NTY0MzEyMzUpLGEoMTU1NTA4MTY5MiwzMTc1MjE4MTMyKSxhKDE5OTYwNjQ5ODYsMjE5ODk1MDgzNyksYSgyNTU0MjIwODgyLDM5OTk3MTkzMzkpLGEoMjgyMTgzNDM0OSw3NjY3ODQwMTYpLGEoMjk1Mjk5NjgwOCwyNTY2NTk0ODc5KSxhKDMyMTAzMTM2NzEsMzIwMzMzNzk1NiksYSgzMzM2NTcxODkxLDEwMzQ0NTcwMjYpLGEoMzU4NDUyODcxMSwyNDY2OTQ4OTAxKSxhKDExMzkyNjk5MywzNzU4MzI2MzgzKSxhKDMzODI0MTg5NSwxNjg3MTc5MzYpLGEoNjY2MzA3MjA1LDExODgxNzk5NjQpLGEoNzczNTI5OTEyLDE1NDYwNDU3MzQpLGEoMTI5NDc1NzM3MiwxNTIyODA1NDg1KSxhKDEzOTYxODIyOTEsXG4yNjQzODMzODIzKSxhKDE2OTUxODM3MDAsMjM0MzUyNzM5MCksYSgxOTg2NjYxMDUxLDEwMTQ0Nzc0ODApLGEoMjE3NzAyNjM1MCwxMjA2NzU5MTQyKSxhKDI0NTY5NTYwMzcsMzQ0MDc3NjI3KSxhKDI3MzA0ODU5MjEsMTI5MDg2MzQ2MCksYSgyODIwMzAyNDExLDMxNTg0NTQyNzMpLGEoMzI1OTczMDgwMCwzNTA1OTUyNjU3KSxhKDMzNDU3NjQ3NzEsMTA2MjE3MDA4KSxhKDM1MTYwNjU4MTcsMzYwNjAwODM0NCksYSgzNjAwMzUyODA0LDE0MzI3MjU3NzYpLGEoNDA5NDU3MTkwOSwxNDY3MDMxNTk0KSxhKDI3NTQyMzM0NCw4NTExNjk3MjApLGEoNDMwMjI3NzM0LDMxMDA4MjM3NTIpLGEoNTA2OTQ4NjE2LDEzNjMyNTgxOTUpLGEoNjU5MDYwNTU2LDM3NTA2ODU1OTMpLGEoODgzOTk3ODc3LDM3ODUwNTAyODApLGEoOTU4MTM5NTcxLDMzMTgzMDc0MjcpLGEoMTMyMjgyMjIxOCwzODEyNzIzNDAzKSxhKDE1MzcwMDIwNjMsMjAwMzAzNDk5NSksYSgxNzQ3ODczNzc5LDM2MDIwMzY4OTkpLFxuYSgxOTU1NTYyMjIyLDE1NzU5OTAwMTIpLGEoMjAyNDEwNDgxNSwxMTI1NTkyOTI4KSxhKDIyMjc3MzA0NTIsMjcxNjkwNDMwNiksYSgyMzYxODUyNDI0LDQ0Mjc3NjA0NCksYSgyNDI4NDM2NDc0LDU5MzY5ODM0NCksYSgyNzU2NzM0MTg3LDM3MzMxMTAyNDkpLGEoMzIwNDAzMTQ3OSwyOTk5MzUxNTczKSxhKDMzMjkzMjUyOTgsMzgxNTkyMDQyNyksYSgzMzkxNTY5NjE0LDM5MjgzODM5MDApLGEoMzUxNTI2NzI3MSw1NjYyODA3MTEpLGEoMzk0MDE4NzYwNiwzNDU0MDY5NTM0KSxhKDQxMTg2MzAyNzEsNDAwMDIzOTk5MiksYSgxMTY0MTg0NzQsMTkxNDEzODU1NCksYSgxNzQyOTI0MjEsMjczMTA1NTI3MCksYSgyODkzODAzNTYsMzIwMzk5MzAwNiksYSg0NjAzOTMyNjksMzIwNjIwMzE1KSxhKDY4NTQ3MTczMyw1ODc0OTY4MzYpLGEoODUyMTQyOTcxLDEwODY3OTI4NTEpLGEoMTAxNzAzNjI5OCwzNjU1NDMxMDApLGEoMTEyNjAwMDU4MCwyNjE4Mjk3Njc2KSxhKDEyODgwMzM0NzAsXG4zNDA5ODU1MTU4KSxhKDE1MDE1MDU5NDgsNDIzNDUwOTg2NiksYSgxNjA3MTY3OTE1LDk4NzE2NzQ2OCksYSgxODE2NDAyMzE2LDEyNDYxODk1OTEpXSx2PVtdLHc9MDs4MD53O3crKyl2W3ddPWEoKTtlPWUuU0hBNTEyPXIuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IFQuaW5pdChbbmV3IGQuaW5pdCgxNzc5MDMzNzAzLDQwODkyMzU3MjApLG5ldyBkLmluaXQoMzE0NDEzNDI3NywyMjI3ODczNTk1KSxuZXcgZC5pbml0KDEwMTM5MDQyNDIsNDI3MTE3NTcyMyksbmV3IGQuaW5pdCgyNzczNDgwNzYyLDE1OTU3NTAxMjkpLG5ldyBkLmluaXQoMTM1OTg5MzExOSwyOTE3NTY1MTM3KSxuZXcgZC5pbml0KDI2MDA4MjI5MjQsNzI1NTExMTk5KSxuZXcgZC5pbml0KDUyODczNDYzNSw0MjE1Mzg5NTQ3KSxuZXcgZC5pbml0KDE1NDE0NTkyMjUsMzI3MDMzMjA5KV0pfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24oYSxkKXtmb3IodmFyIGY9dGhpcy5faGFzaC53b3JkcyxcbkY9ZlswXSxlPWZbMV0sbj1mWzJdLHI9ZlszXSxHPWZbNF0sSD1mWzVdLEk9Zls2XSxmPWZbN10sdz1GLmhpZ2gsSj1GLmxvdyxYPWUuaGlnaCxLPWUubG93LFk9bi5oaWdoLEw9bi5sb3csWj1yLmhpZ2gsTT1yLmxvdywkPUcuaGlnaCxOPUcubG93LGFhPUguaGlnaCxPPUgubG93LGJhPUkuaGlnaCxQPUkubG93LGNhPWYuaGlnaCxRPWYubG93LGs9dyxnPUosej1YLHg9SyxBPVkseT1MLFU9WixCPU0sbD0kLGg9TixSPWFhLEM9TyxTPWJhLEQ9UCxWPWNhLEU9USxtPTA7ODA+bTttKyspe3ZhciBzPXZbbV07aWYoMTY+bSl2YXIgaj1zLmhpZ2g9YVtkKzIqbV18MCxiPXMubG93PWFbZCsyKm0rMV18MDtlbHNle3ZhciBqPXZbbS0xNV0sYj1qLmhpZ2gscD1qLmxvdyxqPShiPj4+MXxwPDwzMSleKGI+Pj44fHA8PDI0KV5iPj4+NyxwPShwPj4+MXxiPDwzMSleKHA+Pj44fGI8PDI0KV4ocD4+Pjd8Yjw8MjUpLHU9dlttLTJdLGI9dS5oaWdoLGM9dS5sb3csdT0oYj4+PjE5fGM8PDEzKV4oYjw8XG4zfGM+Pj4yOSleYj4+PjYsYz0oYz4+PjE5fGI8PDEzKV4oYzw8M3xiPj4+MjkpXihjPj4+NnxiPDwyNiksYj12W20tN10sVz1iLmhpZ2gsdD12W20tMTZdLHE9dC5oaWdoLHQ9dC5sb3csYj1wK2IubG93LGo9aitXKyhiPj4+MDxwPj4+MD8xOjApLGI9YitjLGo9ait1KyhiPj4+MDxjPj4+MD8xOjApLGI9Yit0LGo9aitxKyhiPj4+MDx0Pj4+MD8xOjApO3MuaGlnaD1qO3MubG93PWJ9dmFyIFc9bCZSXn5sJlMsdD1oJkNefmgmRCxzPWsmel5rJkFeeiZBLFQ9ZyZ4XmcmeV54JnkscD0oaz4+PjI4fGc8PDQpXihrPDwzMHxnPj4+MileKGs8PDI1fGc+Pj43KSx1PShnPj4+Mjh8azw8NCleKGc8PDMwfGs+Pj4yKV4oZzw8MjV8az4+PjcpLGM9ZWFbbV0sZmE9Yy5oaWdoLGRhPWMubG93LGM9RSsoKGg+Pj4xNHxsPDwxOCleKGg+Pj4xOHxsPDwxNCleKGg8PDIzfGw+Pj45KSkscT1WKygobD4+PjE0fGg8PDE4KV4obD4+PjE4fGg8PDE0KV4obDw8MjN8aD4+PjkpKSsoYz4+PjA8RT4+PjA/MTpcbjApLGM9Yyt0LHE9cStXKyhjPj4+MDx0Pj4+MD8xOjApLGM9YytkYSxxPXErZmErKGM+Pj4wPGRhPj4+MD8xOjApLGM9YytiLHE9cStqKyhjPj4+MDxiPj4+MD8xOjApLGI9dStULHM9cCtzKyhiPj4+MDx1Pj4+MD8xOjApLFY9UyxFPUQsUz1SLEQ9QyxSPWwsQz1oLGg9QitjfDAsbD1VK3ErKGg+Pj4wPEI+Pj4wPzE6MCl8MCxVPUEsQj15LEE9eix5PXgsej1rLHg9ZyxnPWMrYnwwLGs9cStzKyhnPj4+MDxjPj4+MD8xOjApfDB9Sj1GLmxvdz1KK2c7Ri5oaWdoPXcraysoSj4+PjA8Zz4+PjA/MTowKTtLPWUubG93PUsreDtlLmhpZ2g9WCt6KyhLPj4+MDx4Pj4+MD8xOjApO0w9bi5sb3c9TCt5O24uaGlnaD1ZK0ErKEw+Pj4wPHk+Pj4wPzE6MCk7TT1yLmxvdz1NK0I7ci5oaWdoPVorVSsoTT4+PjA8Qj4+PjA/MTowKTtOPUcubG93PU4raDtHLmhpZ2g9JCtsKyhOPj4+MDxoPj4+MD8xOjApO089SC5sb3c9TytDO0guaGlnaD1hYStSKyhPPj4+MDxDPj4+MD8xOjApO1A9SS5sb3c9UCtEO1xuSS5oaWdoPWJhK1MrKFA+Pj4wPEQ+Pj4wPzE6MCk7UT1mLmxvdz1RK0U7Zi5oaWdoPWNhK1YrKFE+Pj4wPEU+Pj4wPzE6MCl9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fZGF0YSxkPWEud29yZHMsZj04KnRoaXMuX25EYXRhQnl0ZXMsZT04KmEuc2lnQnl0ZXM7ZFtlPj4+NV18PTEyODw8MjQtZSUzMjtkWyhlKzEyOD4+PjEwPDw1KSszMF09TWF0aC5mbG9vcihmLzQyOTQ5NjcyOTYpO2RbKGUrMTI4Pj4+MTA8PDUpKzMxXT1mO2Euc2lnQnl0ZXM9NCpkLmxlbmd0aDt0aGlzLl9wcm9jZXNzKCk7cmV0dXJuIHRoaXMuX2hhc2gudG9YMzIoKX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgYT1yLmNsb25lLmNhbGwodGhpcyk7YS5faGFzaD10aGlzLl9oYXNoLmNsb25lKCk7cmV0dXJuIGF9LGJsb2NrU2l6ZTozMn0pO24uU0hBNTEyPXIuX2NyZWF0ZUhlbHBlcihlKTtuLkhtYWNTSEE1MTI9ci5fY3JlYXRlSG1hY0hlbHBlcihlKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgc2hhMzg0LW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oKXt2YXIgYz1DcnlwdG9KUyxhPWMueDY0LGI9YS5Xb3JkLGU9YS5Xb3JkQXJyYXksYT1jLmFsZ28sZD1hLlNIQTUxMixhPWEuU0hBMzg0PWQuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IGUuaW5pdChbbmV3IGIuaW5pdCgzNDE4MDcwMzY1LDMyMzgzNzEwMzIpLG5ldyBiLmluaXQoMTY1NDI3MDI1MCw5MTQxNTA2NjMpLG5ldyBiLmluaXQoMjQzODUyOTM3MCw4MTI3MDI5OTkpLG5ldyBiLmluaXQoMzU1NDYyMzYwLDQxNDQ5MTI2OTcpLG5ldyBiLmluaXQoMTczMTQwNTQxNSw0MjkwNzc1ODU3KSxuZXcgYi5pbml0KDIzOTQxODAyMzEsMTc1MDYwMzAyNSksbmV3IGIuaW5pdCgzNjc1MDA4NTI1LDE2OTQwNzY4MzkpLG5ldyBiLmluaXQoMTIwMzA2MjgxMywzMjA0MDc1NDI4KV0pfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPWQuX2RvRmluYWxpemUuY2FsbCh0aGlzKTthLnNpZ0J5dGVzLT0xNjtyZXR1cm4gYX19KTtjLlNIQTM4ND1cbmQuX2NyZWF0ZUhlbHBlcihhKTtjLkhtYWNTSEEzODQ9ZC5fY3JlYXRlSG1hY0hlbHBlcihhKX0pKCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgcmlwZW1kMTYwLW1pbi5qc1xuY29kZS5nb29nbGUuY29tL3AvY3J5cHRvLWpzXG4oYykgMjAwOS0yMDEzIGJ5IEplZmYgTW90dC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qcy93aWtpL0xpY2Vuc2VcbiovXG4vKlxuXG4oYykgMjAxMiBieSBDZWRyaWMgTWVzbmlsLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cbihmdW5jdGlvbigpe3ZhciBxPUNyeXB0b0pTLGQ9cS5saWIsbj1kLldvcmRBcnJheSxwPWQuSGFzaGVyLGQ9cS5hbGdvLHg9bi5jcmVhdGUoWzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsNyw0LDEzLDEsMTAsNiwxNSwzLDEyLDAsOSw1LDIsMTQsMTEsOCwzLDEwLDE0LDQsOSwxNSw4LDEsMiw3LDAsNiwxMywxMSw1LDEyLDEsOSwxMSwxMCwwLDgsMTIsNCwxMywzLDcsMTUsMTQsNSw2LDIsNCwwLDUsOSw3LDEyLDIsMTAsMTQsMSwzLDgsMTEsNiwxNSwxM10pLHk9bi5jcmVhdGUoWzUsMTQsNywwLDksMiwxMSw0LDEzLDYsMTUsOCwxLDEwLDMsMTIsNiwxMSwzLDcsMCwxMyw1LDEwLDE0LDE1LDgsMTIsNCw5LDEsMiwxNSw1LDEsMyw3LDE0LDYsOSwxMSw4LDEyLDIsMTAsMCw0LDEzLDgsNiw0LDEsMywxMSwxNSwwLDUsMTIsMiwxMyw5LDcsMTAsMTQsMTIsMTUsMTAsNCwxLDUsOCw3LDYsMiwxMywxNCwwLDMsOSwxMV0pLHo9bi5jcmVhdGUoWzExLDE0LDE1LDEyLFxuNSw4LDcsOSwxMSwxMywxNCwxNSw2LDcsOSw4LDcsNiw4LDEzLDExLDksNywxNSw3LDEyLDE1LDksMTEsNywxMywxMiwxMSwxMyw2LDcsMTQsOSwxMywxNSwxNCw4LDEzLDYsNSwxMiw3LDUsMTEsMTIsMTQsMTUsMTQsMTUsOSw4LDksMTQsNSw2LDgsNiw1LDEyLDksMTUsNSwxMSw2LDgsMTMsMTIsNSwxMiwxMywxNCwxMSw4LDUsNl0pLEE9bi5jcmVhdGUoWzgsOSw5LDExLDEzLDE1LDE1LDUsNyw3LDgsMTEsMTQsMTQsMTIsNiw5LDEzLDE1LDcsMTIsOCw5LDExLDcsNywxMiw3LDYsMTUsMTMsMTEsOSw3LDE1LDExLDgsNiw2LDE0LDEyLDEzLDUsMTQsMTMsMTMsNyw1LDE1LDUsOCwxMSwxNCwxNCw2LDE0LDYsOSwxMiw5LDEyLDUsMTUsOCw4LDUsMTIsOSwxMiw1LDE0LDYsOCwxMyw2LDUsMTUsMTMsMTEsMTFdKSxCPW4uY3JlYXRlKFswLDE1MTg1MDAyNDksMTg1OTc3NTM5MywyNDAwOTU5NzA4LDI4NDA4NTM4MzhdKSxDPW4uY3JlYXRlKFsxMzUyODI5OTI2LDE1NDg2MDM2ODQsMTgzNjA3MjY5MSxcbjIwNTM5OTQyMTcsMF0pLGQ9ZC5SSVBFTUQxNjA9cC5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uLmNyZWF0ZShbMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGUsdil7Zm9yKHZhciBiPTA7MTY+YjtiKyspe3ZhciBjPXYrYixmPWVbY107ZVtjXT0oZjw8OHxmPj4+MjQpJjE2NzExOTM1fChmPDwyNHxmPj4+OCkmNDI3ODI1NTM2MH12YXIgYz10aGlzLl9oYXNoLndvcmRzLGY9Qi53b3JkcyxkPUMud29yZHMsbj14LndvcmRzLHE9eS53b3JkcyxwPXoud29yZHMsdz1BLndvcmRzLHQsZyxoLGoscix1LGssbCxtLHM7dT10PWNbMF07az1nPWNbMV07bD1oPWNbMl07bT1qPWNbM107cz1yPWNbNF07Zm9yKHZhciBhLGI9MDs4MD5iO2IrPTEpYT10K2VbdituW2JdXXwwLGE9MTY+Yj9hKygoZ15oXmopK2ZbMF0pOjMyPmI/YSsoKGcmaHx+ZyZqKStmWzFdKTo0OD5iP1xuYSsoKChnfH5oKV5qKStmWzJdKTo2ND5iP2ErKChnJmp8aCZ+aikrZlszXSk6YSsoKGdeKGh8fmopKStmWzRdKSxhfD0wLGE9YTw8cFtiXXxhPj4+MzItcFtiXSxhPWErcnwwLHQ9cixyPWosaj1oPDwxMHxoPj4+MjIsaD1nLGc9YSxhPXUrZVt2K3FbYl1dfDAsYT0xNj5iP2ErKChrXihsfH5tKSkrZFswXSk6MzI+Yj9hKygoayZtfGwmfm0pK2RbMV0pOjQ4PmI/YSsoKChrfH5sKV5tKStkWzJdKTo2ND5iP2ErKChrJmx8fmsmbSkrZFszXSk6YSsoKGtebF5tKStkWzRdKSxhfD0wLGE9YTw8d1tiXXxhPj4+MzItd1tiXSxhPWErc3wwLHU9cyxzPW0sbT1sPDwxMHxsPj4+MjIsbD1rLGs9YTthPWNbMV0raCttfDA7Y1sxXT1jWzJdK2orc3wwO2NbMl09Y1szXStyK3V8MDtjWzNdPWNbNF0rdCtrfDA7Y1s0XT1jWzBdK2crbHwwO2NbMF09YX0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9kYXRhLGQ9ZS53b3JkcyxiPTgqdGhpcy5fbkRhdGFCeXRlcyxjPTgqZS5zaWdCeXRlcztcbmRbYz4+PjVdfD0xMjg8PDI0LWMlMzI7ZFsoYys2ND4+Pjk8PDQpKzE0XT0oYjw8OHxiPj4+MjQpJjE2NzExOTM1fChiPDwyNHxiPj4+OCkmNDI3ODI1NTM2MDtlLnNpZ0J5dGVzPTQqKGQubGVuZ3RoKzEpO3RoaXMuX3Byb2Nlc3MoKTtlPXRoaXMuX2hhc2g7ZD1lLndvcmRzO2ZvcihiPTA7NT5iO2IrKyljPWRbYl0sZFtiXT0oYzw8OHxjPj4+MjQpJjE2NzExOTM1fChjPDwyNHxjPj4+OCkmNDI3ODI1NTM2MDtyZXR1cm4gZX0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgZD1wLmNsb25lLmNhbGwodGhpcyk7ZC5faGFzaD10aGlzLl9oYXNoLmNsb25lKCk7cmV0dXJuIGR9fSk7cS5SSVBFTUQxNjA9cC5fY3JlYXRlSGVscGVyKGQpO3EuSG1hY1JJUEVNRDE2MD1wLl9jcmVhdGVIbWFjSGVscGVyKGQpfSkoTWF0aCk7XG5cbi8qXG5DcnlwdG9KUyB2My4xLjIgaG1hYy1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIGM9Q3J5cHRvSlMsaz1jLmVuYy5VdGY4O2MuYWxnby5ITUFDPWMubGliLkJhc2UuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKGEsYil7YT10aGlzLl9oYXNoZXI9bmV3IGEuaW5pdDtcInN0cmluZ1wiPT10eXBlb2YgYiYmKGI9ay5wYXJzZShiKSk7dmFyIGM9YS5ibG9ja1NpemUsZT00KmM7Yi5zaWdCeXRlcz5lJiYoYj1hLmZpbmFsaXplKGIpKTtiLmNsYW1wKCk7Zm9yKHZhciBmPXRoaXMuX29LZXk9Yi5jbG9uZSgpLGc9dGhpcy5faUtleT1iLmNsb25lKCksaD1mLndvcmRzLGo9Zy53b3JkcyxkPTA7ZDxjO2QrKyloW2RdXj0xNTQ5NTU2ODI4LGpbZF1ePTkwOTUyMjQ4NjtmLnNpZ0J5dGVzPWcuc2lnQnl0ZXM9ZTt0aGlzLnJlc2V0KCl9LHJlc2V0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5faGFzaGVyO2EucmVzZXQoKTthLnVwZGF0ZSh0aGlzLl9pS2V5KX0sdXBkYXRlOmZ1bmN0aW9uKGEpe3RoaXMuX2hhc2hlci51cGRhdGUoYSk7cmV0dXJuIHRoaXN9LGZpbmFsaXplOmZ1bmN0aW9uKGEpe3ZhciBiPVxudGhpcy5faGFzaGVyO2E9Yi5maW5hbGl6ZShhKTtiLnJlc2V0KCk7cmV0dXJuIGIuZmluYWxpemUodGhpcy5fb0tleS5jbG9uZSgpLmNvbmNhdChhKSl9fSl9KSgpO1xuXG4vKlxuQ3J5cHRvSlMgdjMuMS4yIHBia2RmMi1taW4uanNcbmNvZGUuZ29vZ2xlLmNvbS9wL2NyeXB0by1qc1xuKGMpIDIwMDktMjAxMyBieSBKZWZmIE1vdHQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5jb2RlLmdvb2dsZS5jb20vcC9jcnlwdG8tanMvd2lraS9MaWNlbnNlXG4qL1xuKGZ1bmN0aW9uKCl7dmFyIGI9Q3J5cHRvSlMsYT1iLmxpYixkPWEuQmFzZSxtPWEuV29yZEFycmF5LGE9Yi5hbGdvLHE9YS5ITUFDLGw9YS5QQktERjI9ZC5leHRlbmQoe2NmZzpkLmV4dGVuZCh7a2V5U2l6ZTo0LGhhc2hlcjphLlNIQTEsaXRlcmF0aW9uczoxfSksaW5pdDpmdW5jdGlvbihhKXt0aGlzLmNmZz10aGlzLmNmZy5leHRlbmQoYSl9LGNvbXB1dGU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9dGhpcy5jZmcsZj1xLmNyZWF0ZShjLmhhc2hlcixhKSxnPW0uY3JlYXRlKCksZD1tLmNyZWF0ZShbMV0pLGw9Zy53b3JkcyxyPWQud29yZHMsbj1jLmtleVNpemUsYz1jLml0ZXJhdGlvbnM7bC5sZW5ndGg8bjspe3ZhciBoPWYudXBkYXRlKGIpLmZpbmFsaXplKGQpO2YucmVzZXQoKTtmb3IodmFyIGo9aC53b3JkcyxzPWoubGVuZ3RoLGs9aCxwPTE7cDxjO3ArKyl7az1mLmZpbmFsaXplKGspO2YucmVzZXQoKTtmb3IodmFyIHQ9ay53b3JkcyxlPTA7ZTxzO2UrKylqW2VdXj10W2VdfWcuY29uY2F0KGgpO1xuclswXSsrfWcuc2lnQnl0ZXM9NCpuO3JldHVybiBnfX0pO2IuUEJLREYyPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbC5jcmVhdGUoYykuY29tcHV0ZShhLGIpfX0pKCk7XG5cbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG52YXIgYjY0bWFwPVwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiO3ZhciBiNjRwYWQ9XCI9XCI7ZnVuY3Rpb24gaGV4MmI2NChkKXt2YXIgYjt2YXIgZTt2YXIgYT1cIlwiO2ZvcihiPTA7YiszPD1kLmxlbmd0aDtiKz0zKXtlPXBhcnNlSW50KGQuc3Vic3RyaW5nKGIsYiszKSwxNik7YSs9YjY0bWFwLmNoYXJBdChlPj42KStiNjRtYXAuY2hhckF0KGUmNjMpfWlmKGIrMT09ZC5sZW5ndGgpe2U9cGFyc2VJbnQoZC5zdWJzdHJpbmcoYixiKzEpLDE2KTthKz1iNjRtYXAuY2hhckF0KGU8PDIpfWVsc2V7aWYoYisyPT1kLmxlbmd0aCl7ZT1wYXJzZUludChkLnN1YnN0cmluZyhiLGIrMiksMTYpO2ErPWI2NG1hcC5jaGFyQXQoZT4+MikrYjY0bWFwLmNoYXJBdCgoZSYzKTw8NCl9fWlmKGI2NHBhZCl7d2hpbGUoKGEubGVuZ3RoJjMpPjApe2ErPWI2NHBhZH19cmV0dXJuIGF9ZnVuY3Rpb24gYjY0dG9oZXgoZil7dmFyIGQ9XCJcIjt2YXIgZTt2YXIgYj0wO3ZhciBjO3ZhciBhO2ZvcihlPTA7ZTxmLmxlbmd0aDsrK2Upe2lmKGYuY2hhckF0KGUpPT1iNjRwYWQpe2JyZWFrfWE9YjY0bWFwLmluZGV4T2YoZi5jaGFyQXQoZSkpO2lmKGE8MCl7Y29udGludWV9aWYoYj09MCl7ZCs9aW50MmNoYXIoYT4+Mik7Yz1hJjM7Yj0xfWVsc2V7aWYoYj09MSl7ZCs9aW50MmNoYXIoKGM8PDIpfChhPj40KSk7Yz1hJjE1O2I9Mn1lbHNle2lmKGI9PTIpe2QrPWludDJjaGFyKGMpO2QrPWludDJjaGFyKGE+PjIpO2M9YSYzO2I9M31lbHNle2QrPWludDJjaGFyKChjPDwyKXwoYT4+NCkpO2QrPWludDJjaGFyKGEmMTUpO2I9MH19fX1pZihiPT0xKXtkKz1pbnQyY2hhcihjPDwyKX1yZXR1cm4gZH1mdW5jdGlvbiBiNjR0b0JBKGUpe3ZhciBkPWI2NHRvaGV4KGUpO3ZhciBjO3ZhciBiPW5ldyBBcnJheSgpO2ZvcihjPTA7MipjPGQubGVuZ3RoOysrYyl7YltjXT1wYXJzZUludChkLnN1YnN0cmluZygyKmMsMipjKzIpLDE2KX1yZXR1cm4gYn07XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xudmFyIGRiaXRzO3ZhciBjYW5hcnk9MjQ0ODM3ODE0MDk0NTkwO3ZhciBqX2xtPSgoY2FuYXJ5JjE2Nzc3MjE1KT09MTU3MTUwNzApO2Z1bmN0aW9uIEJpZ0ludGVnZXIoZSxkLGYpe2lmKGUhPW51bGwpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiBlKXt0aGlzLmZyb21OdW1iZXIoZSxkLGYpfWVsc2V7aWYoZD09bnVsbCYmXCJzdHJpbmdcIiE9dHlwZW9mIGUpe3RoaXMuZnJvbVN0cmluZyhlLDI1Nil9ZWxzZXt0aGlzLmZyb21TdHJpbmcoZSxkKX19fX1mdW5jdGlvbiBuYmkoKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIobnVsbCl9ZnVuY3Rpb24gYW0xKGYsYSxiLGUsaCxnKXt3aGlsZSgtLWc+PTApe3ZhciBkPWEqdGhpc1tmKytdK2JbZV0raDtoPU1hdGguZmxvb3IoZC82NzEwODg2NCk7YltlKytdPWQmNjcxMDg4NjN9cmV0dXJuIGh9ZnVuY3Rpb24gYW0yKGYscSxyLGUsbyxhKXt2YXIgaz1xJjMyNzY3LHA9cT4+MTU7d2hpbGUoLS1hPj0wKXt2YXIgZD10aGlzW2ZdJjMyNzY3O3ZhciBnPXRoaXNbZisrXT4+MTU7dmFyIGI9cCpkK2cqaztkPWsqZCsoKGImMzI3NjcpPDwxNSkrcltlXSsobyYxMDczNzQxODIzKTtvPShkPj4+MzApKyhiPj4+MTUpK3AqZysobz4+PjMwKTtyW2UrK109ZCYxMDczNzQxODIzfXJldHVybiBvfWZ1bmN0aW9uIGFtMyhmLHEscixlLG8sYSl7dmFyIGs9cSYxNjM4MyxwPXE+PjE0O3doaWxlKC0tYT49MCl7dmFyIGQ9dGhpc1tmXSYxNjM4Mzt2YXIgZz10aGlzW2YrK10+PjE0O3ZhciBiPXAqZCtnKms7ZD1rKmQrKChiJjE2MzgzKTw8MTQpK3JbZV0rbztvPShkPj4yOCkrKGI+PjE0KStwKmc7cltlKytdPWQmMjY4NDM1NDU1fXJldHVybiBvfWlmKGpfbG0mJihuYXZpZ2F0b3IuYXBwTmFtZT09XCJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXJcIikpe0JpZ0ludGVnZXIucHJvdG90eXBlLmFtPWFtMjtkYml0cz0zMH1lbHNle2lmKGpfbG0mJihuYXZpZ2F0b3IuYXBwTmFtZSE9XCJOZXRzY2FwZVwiKSl7QmlnSW50ZWdlci5wcm90b3R5cGUuYW09YW0xO2RiaXRzPTI2fWVsc2V7QmlnSW50ZWdlci5wcm90b3R5cGUuYW09YW0zO2RiaXRzPTI4fX1CaWdJbnRlZ2VyLnByb3RvdHlwZS5EQj1kYml0cztCaWdJbnRlZ2VyLnByb3RvdHlwZS5ETT0oKDE8PGRiaXRzKS0xKTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5EVj0oMTw8ZGJpdHMpO3ZhciBCSV9GUD01MjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5GVj1NYXRoLnBvdygyLEJJX0ZQKTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5GMT1CSV9GUC1kYml0cztCaWdJbnRlZ2VyLnByb3RvdHlwZS5GMj0yKmRiaXRzLUJJX0ZQO3ZhciBCSV9STT1cIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiO3ZhciBCSV9SQz1uZXcgQXJyYXkoKTt2YXIgcnIsdnY7cnI9XCIwXCIuY2hhckNvZGVBdCgwKTtmb3IodnY9MDt2djw9OTsrK3Z2KXtCSV9SQ1tycisrXT12dn1ycj1cImFcIi5jaGFyQ29kZUF0KDApO2Zvcih2dj0xMDt2djwzNjsrK3Z2KXtCSV9SQ1tycisrXT12dn1ycj1cIkFcIi5jaGFyQ29kZUF0KDApO2Zvcih2dj0xMDt2djwzNjsrK3Z2KXtCSV9SQ1tycisrXT12dn1mdW5jdGlvbiBpbnQyY2hhcihhKXtyZXR1cm4gQklfUk0uY2hhckF0KGEpfWZ1bmN0aW9uIGludEF0KGIsYSl7dmFyIGQ9QklfUkNbYi5jaGFyQ29kZUF0KGEpXTtyZXR1cm4oZD09bnVsbCk/LTE6ZH1mdW5jdGlvbiBibnBDb3B5VG8oYil7Zm9yKHZhciBhPXRoaXMudC0xO2E+PTA7LS1hKXtiW2FdPXRoaXNbYV19Yi50PXRoaXMudDtiLnM9dGhpcy5zfWZ1bmN0aW9uIGJucEZyb21JbnQoYSl7dGhpcy50PTE7dGhpcy5zPShhPDApPy0xOjA7aWYoYT4wKXt0aGlzWzBdPWF9ZWxzZXtpZihhPC0xKXt0aGlzWzBdPWErdGhpcy5EVn1lbHNle3RoaXMudD0wfX19ZnVuY3Rpb24gbmJ2KGEpe3ZhciBiPW5iaSgpO2IuZnJvbUludChhKTtyZXR1cm4gYn1mdW5jdGlvbiBibnBGcm9tU3RyaW5nKGgsYyl7dmFyIGU7aWYoYz09MTYpe2U9NH1lbHNle2lmKGM9PTgpe2U9M31lbHNle2lmKGM9PTI1Nil7ZT04fWVsc2V7aWYoYz09Mil7ZT0xfWVsc2V7aWYoYz09MzIpe2U9NX1lbHNle2lmKGM9PTQpe2U9Mn1lbHNle3RoaXMuZnJvbVJhZGl4KGgsYyk7cmV0dXJufX19fX19dGhpcy50PTA7dGhpcy5zPTA7dmFyIGc9aC5sZW5ndGgsZD1mYWxzZSxmPTA7d2hpbGUoLS1nPj0wKXt2YXIgYT0oZT09OCk/aFtnXSYyNTU6aW50QXQoaCxnKTtpZihhPDApe2lmKGguY2hhckF0KGcpPT1cIi1cIil7ZD10cnVlfWNvbnRpbnVlfWQ9ZmFsc2U7aWYoZj09MCl7dGhpc1t0aGlzLnQrK109YX1lbHNle2lmKGYrZT50aGlzLkRCKXt0aGlzW3RoaXMudC0xXXw9KGEmKCgxPDwodGhpcy5EQi1mKSktMSkpPDxmO3RoaXNbdGhpcy50KytdPShhPj4odGhpcy5EQi1mKSl9ZWxzZXt0aGlzW3RoaXMudC0xXXw9YTw8Zn19Zis9ZTtpZihmPj10aGlzLkRCKXtmLT10aGlzLkRCfX1pZihlPT04JiYoaFswXSYxMjgpIT0wKXt0aGlzLnM9LTE7aWYoZj4wKXt0aGlzW3RoaXMudC0xXXw9KCgxPDwodGhpcy5EQi1mKSktMSk8PGZ9fXRoaXMuY2xhbXAoKTtpZihkKXtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKX19ZnVuY3Rpb24gYm5wQ2xhbXAoKXt2YXIgYT10aGlzLnMmdGhpcy5ETTt3aGlsZSh0aGlzLnQ+MCYmdGhpc1t0aGlzLnQtMV09PWEpey0tdGhpcy50fX1mdW5jdGlvbiBiblRvU3RyaW5nKGMpe2lmKHRoaXMuczwwKXtyZXR1cm5cIi1cIit0aGlzLm5lZ2F0ZSgpLnRvU3RyaW5nKGMpfXZhciBlO2lmKGM9PTE2KXtlPTR9ZWxzZXtpZihjPT04KXtlPTN9ZWxzZXtpZihjPT0yKXtlPTF9ZWxzZXtpZihjPT0zMil7ZT01fWVsc2V7aWYoYz09NCl7ZT0yfWVsc2V7cmV0dXJuIHRoaXMudG9SYWRpeChjKX19fX19dmFyIGc9KDE8PGUpLTEsbCxhPWZhbHNlLGg9XCJcIixmPXRoaXMudDt2YXIgaj10aGlzLkRCLShmKnRoaXMuREIpJWU7aWYoZi0tPjApe2lmKGo8dGhpcy5EQiYmKGw9dGhpc1tmXT4+aik+MCl7YT10cnVlO2g9aW50MmNoYXIobCl9d2hpbGUoZj49MCl7aWYoajxlKXtsPSh0aGlzW2ZdJigoMTw8aiktMSkpPDwoZS1qKTtsfD10aGlzWy0tZl0+PihqKz10aGlzLkRCLWUpfWVsc2V7bD0odGhpc1tmXT4+KGotPWUpKSZnO2lmKGo8PTApe2orPXRoaXMuREI7LS1mfX1pZihsPjApe2E9dHJ1ZX1pZihhKXtoKz1pbnQyY2hhcihsKX19fXJldHVybiBhP2g6XCIwXCJ9ZnVuY3Rpb24gYm5OZWdhdGUoKXt2YXIgYT1uYmkoKTtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyxhKTtyZXR1cm4gYX1mdW5jdGlvbiBibkFicygpe3JldHVybih0aGlzLnM8MCk/dGhpcy5uZWdhdGUoKTp0aGlzfWZ1bmN0aW9uIGJuQ29tcGFyZVRvKGIpe3ZhciBkPXRoaXMucy1iLnM7aWYoZCE9MCl7cmV0dXJuIGR9dmFyIGM9dGhpcy50O2Q9Yy1iLnQ7aWYoZCE9MCl7cmV0dXJuKHRoaXMuczwwKT8tZDpkfXdoaWxlKC0tYz49MCl7aWYoKGQ9dGhpc1tjXS1iW2NdKSE9MCl7cmV0dXJuIGR9fXJldHVybiAwfWZ1bmN0aW9uIG5iaXRzKGEpe3ZhciBjPTEsYjtpZigoYj1hPj4+MTYpIT0wKXthPWI7Yys9MTZ9aWYoKGI9YT4+OCkhPTApe2E9YjtjKz04fWlmKChiPWE+PjQpIT0wKXthPWI7Yys9NH1pZigoYj1hPj4yKSE9MCl7YT1iO2MrPTJ9aWYoKGI9YT4+MSkhPTApe2E9YjtjKz0xfXJldHVybiBjfWZ1bmN0aW9uIGJuQml0TGVuZ3RoKCl7aWYodGhpcy50PD0wKXtyZXR1cm4gMH1yZXR1cm4gdGhpcy5EQioodGhpcy50LTEpK25iaXRzKHRoaXNbdGhpcy50LTFdXih0aGlzLnMmdGhpcy5ETSkpfWZ1bmN0aW9uIGJucERMU2hpZnRUbyhjLGIpe3ZhciBhO2ZvcihhPXRoaXMudC0xO2E+PTA7LS1hKXtiW2ErY109dGhpc1thXX1mb3IoYT1jLTE7YT49MDstLWEpe2JbYV09MH1iLnQ9dGhpcy50K2M7Yi5zPXRoaXMuc31mdW5jdGlvbiBibnBEUlNoaWZ0VG8oYyxiKXtmb3IodmFyIGE9YzthPHRoaXMudDsrK2Epe2JbYS1jXT10aGlzW2FdfWIudD1NYXRoLm1heCh0aGlzLnQtYywwKTtiLnM9dGhpcy5zfWZ1bmN0aW9uIGJucExTaGlmdFRvKGosZSl7dmFyIGI9aiV0aGlzLkRCO3ZhciBhPXRoaXMuREItYjt2YXIgZz0oMTw8YSktMTt2YXIgZj1NYXRoLmZsb29yKGovdGhpcy5EQiksaD0odGhpcy5zPDxiKSZ0aGlzLkRNLGQ7Zm9yKGQ9dGhpcy50LTE7ZD49MDstLWQpe2VbZCtmKzFdPSh0aGlzW2RdPj5hKXxoO2g9KHRoaXNbZF0mZyk8PGJ9Zm9yKGQ9Zi0xO2Q+PTA7LS1kKXtlW2RdPTB9ZVtmXT1oO2UudD10aGlzLnQrZisxO2Uucz10aGlzLnM7ZS5jbGFtcCgpfWZ1bmN0aW9uIGJucFJTaGlmdFRvKGcsZCl7ZC5zPXRoaXMuczt2YXIgZT1NYXRoLmZsb29yKGcvdGhpcy5EQik7aWYoZT49dGhpcy50KXtkLnQ9MDtyZXR1cm59dmFyIGI9ZyV0aGlzLkRCO3ZhciBhPXRoaXMuREItYjt2YXIgZj0oMTw8YiktMTtkWzBdPXRoaXNbZV0+PmI7Zm9yKHZhciBjPWUrMTtjPHRoaXMudDsrK2Mpe2RbYy1lLTFdfD0odGhpc1tjXSZmKTw8YTtkW2MtZV09dGhpc1tjXT4+Yn1pZihiPjApe2RbdGhpcy50LWUtMV18PSh0aGlzLnMmZik8PGF9ZC50PXRoaXMudC1lO2QuY2xhbXAoKX1mdW5jdGlvbiBibnBTdWJUbyhkLGYpe3ZhciBlPTAsZz0wLGI9TWF0aC5taW4oZC50LHRoaXMudCk7d2hpbGUoZTxiKXtnKz10aGlzW2VdLWRbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1pZihkLnQ8dGhpcy50KXtnLT1kLnM7d2hpbGUoZTx0aGlzLnQpe2crPXRoaXNbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1nKz10aGlzLnN9ZWxzZXtnKz10aGlzLnM7d2hpbGUoZTxkLnQpe2ctPWRbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1nLT1kLnN9Zi5zPShnPDApPy0xOjA7aWYoZzwtMSl7ZltlKytdPXRoaXMuRFYrZ31lbHNle2lmKGc+MCl7ZltlKytdPWd9fWYudD1lO2YuY2xhbXAoKX1mdW5jdGlvbiBibnBNdWx0aXBseVRvKGMsZSl7dmFyIGI9dGhpcy5hYnMoKSxmPWMuYWJzKCk7dmFyIGQ9Yi50O2UudD1kK2YudDt3aGlsZSgtLWQ+PTApe2VbZF09MH1mb3IoZD0wO2Q8Zi50OysrZCl7ZVtkK2IudF09Yi5hbSgwLGZbZF0sZSxkLDAsYi50KX1lLnM9MDtlLmNsYW1wKCk7aWYodGhpcy5zIT1jLnMpe0JpZ0ludGVnZXIuWkVSTy5zdWJUbyhlLGUpfX1mdW5jdGlvbiBibnBTcXVhcmVUbyhkKXt2YXIgYT10aGlzLmFicygpO3ZhciBiPWQudD0yKmEudDt3aGlsZSgtLWI+PTApe2RbYl09MH1mb3IoYj0wO2I8YS50LTE7KytiKXt2YXIgZT1hLmFtKGIsYVtiXSxkLDIqYiwwLDEpO2lmKChkW2IrYS50XSs9YS5hbShiKzEsMiphW2JdLGQsMipiKzEsZSxhLnQtYi0xKSk+PWEuRFYpe2RbYithLnRdLT1hLkRWO2RbYithLnQrMV09MX19aWYoZC50PjApe2RbZC50LTFdKz1hLmFtKGIsYVtiXSxkLDIqYiwwLDEpfWQucz0wO2QuY2xhbXAoKX1mdW5jdGlvbiBibnBEaXZSZW1UbyhuLGgsZyl7dmFyIHc9bi5hYnMoKTtpZih3LnQ8PTApe3JldHVybn12YXIgaz10aGlzLmFicygpO2lmKGsudDx3LnQpe2lmKGghPW51bGwpe2guZnJvbUludCgwKX1pZihnIT1udWxsKXt0aGlzLmNvcHlUbyhnKX1yZXR1cm59aWYoZz09bnVsbCl7Zz1uYmkoKX12YXIgZD1uYmkoKSxhPXRoaXMucyxsPW4uczt2YXIgdj10aGlzLkRCLW5iaXRzKHdbdy50LTFdKTtpZih2PjApe3cubFNoaWZ0VG8odixkKTtrLmxTaGlmdFRvKHYsZyl9ZWxzZXt3LmNvcHlUbyhkKTtrLmNvcHlUbyhnKX12YXIgcD1kLnQ7dmFyIGI9ZFtwLTFdO2lmKGI9PTApe3JldHVybn12YXIgbz1iKigxPDx0aGlzLkYxKSsoKHA+MSk/ZFtwLTJdPj50aGlzLkYyOjApO3ZhciBBPXRoaXMuRlYvbyx6PSgxPDx0aGlzLkYxKS9vLHg9MTw8dGhpcy5GMjt2YXIgdT1nLnQscz11LXAsZj0oaD09bnVsbCk/bmJpKCk6aDtkLmRsU2hpZnRUbyhzLGYpO2lmKGcuY29tcGFyZVRvKGYpPj0wKXtnW2cudCsrXT0xO2cuc3ViVG8oZixnKX1CaWdJbnRlZ2VyLk9ORS5kbFNoaWZ0VG8ocCxmKTtmLnN1YlRvKGQsZCk7d2hpbGUoZC50PHApe2RbZC50KytdPTB9d2hpbGUoLS1zPj0wKXt2YXIgYz0oZ1stLXVdPT1iKT90aGlzLkRNOk1hdGguZmxvb3IoZ1t1XSpBKyhnW3UtMV0reCkqeik7aWYoKGdbdV0rPWQuYW0oMCxjLGcscywwLHApKTxjKXtkLmRsU2hpZnRUbyhzLGYpO2cuc3ViVG8oZixnKTt3aGlsZShnW3VdPC0tYyl7Zy5zdWJUbyhmLGcpfX19aWYoaCE9bnVsbCl7Zy5kclNoaWZ0VG8ocCxoKTtpZihhIT1sKXtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8oaCxoKX19Zy50PXA7Zy5jbGFtcCgpO2lmKHY+MCl7Zy5yU2hpZnRUbyh2LGcpfWlmKGE8MCl7QmlnSW50ZWdlci5aRVJPLnN1YlRvKGcsZyl9fWZ1bmN0aW9uIGJuTW9kKGIpe3ZhciBjPW5iaSgpO3RoaXMuYWJzKCkuZGl2UmVtVG8oYixudWxsLGMpO2lmKHRoaXMuczwwJiZjLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPjApe2Iuc3ViVG8oYyxjKX1yZXR1cm4gY31mdW5jdGlvbiBDbGFzc2ljKGEpe3RoaXMubT1hfWZ1bmN0aW9uIGNDb252ZXJ0KGEpe2lmKGEuczwwfHxhLmNvbXBhcmVUbyh0aGlzLm0pPj0wKXtyZXR1cm4gYS5tb2QodGhpcy5tKX1lbHNle3JldHVybiBhfX1mdW5jdGlvbiBjUmV2ZXJ0KGEpe3JldHVybiBhfWZ1bmN0aW9uIGNSZWR1Y2UoYSl7YS5kaXZSZW1Ubyh0aGlzLm0sbnVsbCxhKX1mdW5jdGlvbiBjTXVsVG8oYSxjLGIpe2EubXVsdGlwbHlUbyhjLGIpO3RoaXMucmVkdWNlKGIpfWZ1bmN0aW9uIGNTcXJUbyhhLGIpe2Euc3F1YXJlVG8oYik7dGhpcy5yZWR1Y2UoYil9Q2xhc3NpYy5wcm90b3R5cGUuY29udmVydD1jQ29udmVydDtDbGFzc2ljLnByb3RvdHlwZS5yZXZlcnQ9Y1JldmVydDtDbGFzc2ljLnByb3RvdHlwZS5yZWR1Y2U9Y1JlZHVjZTtDbGFzc2ljLnByb3RvdHlwZS5tdWxUbz1jTXVsVG87Q2xhc3NpYy5wcm90b3R5cGUuc3FyVG89Y1NxclRvO2Z1bmN0aW9uIGJucEludkRpZ2l0KCl7aWYodGhpcy50PDEpe3JldHVybiAwfXZhciBhPXRoaXNbMF07aWYoKGEmMSk9PTApe3JldHVybiAwfXZhciBiPWEmMztiPShiKigyLShhJjE1KSpiKSkmMTU7Yj0oYiooMi0oYSYyNTUpKmIpKSYyNTU7Yj0oYiooMi0oKChhJjY1NTM1KSpiKSY2NTUzNSkpKSY2NTUzNTtiPShiKigyLWEqYiV0aGlzLkRWKSkldGhpcy5EVjtyZXR1cm4oYj4wKT90aGlzLkRWLWI6LWJ9ZnVuY3Rpb24gTW9udGdvbWVyeShhKXt0aGlzLm09YTt0aGlzLm1wPWEuaW52RGlnaXQoKTt0aGlzLm1wbD10aGlzLm1wJjMyNzY3O3RoaXMubXBoPXRoaXMubXA+PjE1O3RoaXMudW09KDE8PChhLkRCLTE1KSktMTt0aGlzLm10Mj0yKmEudH1mdW5jdGlvbiBtb250Q29udmVydChhKXt2YXIgYj1uYmkoKTthLmFicygpLmRsU2hpZnRUbyh0aGlzLm0udCxiKTtiLmRpdlJlbVRvKHRoaXMubSxudWxsLGIpO2lmKGEuczwwJiZiLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPjApe3RoaXMubS5zdWJUbyhiLGIpfXJldHVybiBifWZ1bmN0aW9uIG1vbnRSZXZlcnQoYSl7dmFyIGI9bmJpKCk7YS5jb3B5VG8oYik7dGhpcy5yZWR1Y2UoYik7cmV0dXJuIGJ9ZnVuY3Rpb24gbW9udFJlZHVjZShhKXt3aGlsZShhLnQ8PXRoaXMubXQyKXthW2EudCsrXT0wfWZvcih2YXIgYz0wO2M8dGhpcy5tLnQ7KytjKXt2YXIgYj1hW2NdJjMyNzY3O3ZhciBkPShiKnRoaXMubXBsKygoKGIqdGhpcy5tcGgrKGFbY10+PjE1KSp0aGlzLm1wbCkmdGhpcy51bSk8PDE1KSkmYS5ETTtiPWMrdGhpcy5tLnQ7YVtiXSs9dGhpcy5tLmFtKDAsZCxhLGMsMCx0aGlzLm0udCk7d2hpbGUoYVtiXT49YS5EVil7YVtiXS09YS5EVjthWysrYl0rK319YS5jbGFtcCgpO2EuZHJTaGlmdFRvKHRoaXMubS50LGEpO2lmKGEuY29tcGFyZVRvKHRoaXMubSk+PTApe2Euc3ViVG8odGhpcy5tLGEpfX1mdW5jdGlvbiBtb250U3FyVG8oYSxiKXthLnNxdWFyZVRvKGIpO3RoaXMucmVkdWNlKGIpfWZ1bmN0aW9uIG1vbnRNdWxUbyhhLGMsYil7YS5tdWx0aXBseVRvKGMsYik7dGhpcy5yZWR1Y2UoYil9TW9udGdvbWVyeS5wcm90b3R5cGUuY29udmVydD1tb250Q29udmVydDtNb250Z29tZXJ5LnByb3RvdHlwZS5yZXZlcnQ9bW9udFJldmVydDtNb250Z29tZXJ5LnByb3RvdHlwZS5yZWR1Y2U9bW9udFJlZHVjZTtNb250Z29tZXJ5LnByb3RvdHlwZS5tdWxUbz1tb250TXVsVG87TW9udGdvbWVyeS5wcm90b3R5cGUuc3FyVG89bW9udFNxclRvO2Z1bmN0aW9uIGJucElzRXZlbigpe3JldHVybigodGhpcy50PjApPyh0aGlzWzBdJjEpOnRoaXMucyk9PTB9ZnVuY3Rpb24gYm5wRXhwKGgsail7aWYoaD40Mjk0OTY3Mjk1fHxoPDEpe3JldHVybiBCaWdJbnRlZ2VyLk9ORX12YXIgZj1uYmkoKSxhPW5iaSgpLGQ9ai5jb252ZXJ0KHRoaXMpLGM9bmJpdHMoaCktMTtkLmNvcHlUbyhmKTt3aGlsZSgtLWM+PTApe2ouc3FyVG8oZixhKTtpZigoaCYoMTw8YykpPjApe2oubXVsVG8oYSxkLGYpfWVsc2V7dmFyIGI9ZjtmPWE7YT1ifX1yZXR1cm4gai5yZXZlcnQoZil9ZnVuY3Rpb24gYm5Nb2RQb3dJbnQoYixhKXt2YXIgYztpZihiPDI1Nnx8YS5pc0V2ZW4oKSl7Yz1uZXcgQ2xhc3NpYyhhKX1lbHNle2M9bmV3IE1vbnRnb21lcnkoYSl9cmV0dXJuIHRoaXMuZXhwKGIsYyl9QmlnSW50ZWdlci5wcm90b3R5cGUuY29weVRvPWJucENvcHlUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tSW50PWJucEZyb21JbnQ7QmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVN0cmluZz1ibnBGcm9tU3RyaW5nO0JpZ0ludGVnZXIucHJvdG90eXBlLmNsYW1wPWJucENsYW1wO0JpZ0ludGVnZXIucHJvdG90eXBlLmRsU2hpZnRUbz1ibnBETFNoaWZ0VG87QmlnSW50ZWdlci5wcm90b3R5cGUuZHJTaGlmdFRvPWJucERSU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5sU2hpZnRUbz1ibnBMU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5yU2hpZnRUbz1ibnBSU2hpZnRUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJUbz1ibnBTdWJUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVRvPWJucE11bHRpcGx5VG87QmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlVG89Ym5wU3F1YXJlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuZGl2UmVtVG89Ym5wRGl2UmVtVG87QmlnSW50ZWdlci5wcm90b3R5cGUuaW52RGlnaXQ9Ym5wSW52RGlnaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuaXNFdmVuPWJucElzRXZlbjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5leHA9Ym5wRXhwO0JpZ0ludGVnZXIucHJvdG90eXBlLnRvU3RyaW5nPWJuVG9TdHJpbmc7QmlnSW50ZWdlci5wcm90b3R5cGUubmVnYXRlPWJuTmVnYXRlO0JpZ0ludGVnZXIucHJvdG90eXBlLmFicz1ibkFicztCaWdJbnRlZ2VyLnByb3RvdHlwZS5jb21wYXJlVG89Ym5Db21wYXJlVG87QmlnSW50ZWdlci5wcm90b3R5cGUuYml0TGVuZ3RoPWJuQml0TGVuZ3RoO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZD1ibk1vZDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3dJbnQ9Ym5Nb2RQb3dJbnQ7QmlnSW50ZWdlci5aRVJPPW5idigwKTtCaWdJbnRlZ2VyLk9ORT1uYnYoMSk7XG4vKiEgKGMpIFRvbSBXdSB8IGh0dHA6Ly93d3ctY3Mtc3R1ZGVudHMuc3RhbmZvcmQuZWR1L350ancvanNibi9cbiAqL1xuZnVuY3Rpb24gYm5DbG9uZSgpe3ZhciBhPW5iaSgpO3RoaXMuY29weVRvKGEpO3JldHVybiBhfWZ1bmN0aW9uIGJuSW50VmFsdWUoKXtpZih0aGlzLnM8MCl7aWYodGhpcy50PT0xKXtyZXR1cm4gdGhpc1swXS10aGlzLkRWfWVsc2V7aWYodGhpcy50PT0wKXtyZXR1cm4gLTF9fX1lbHNle2lmKHRoaXMudD09MSl7cmV0dXJuIHRoaXNbMF19ZWxzZXtpZih0aGlzLnQ9PTApe3JldHVybiAwfX19cmV0dXJuKCh0aGlzWzFdJigoMTw8KDMyLXRoaXMuREIpKS0xKSk8PHRoaXMuREIpfHRoaXNbMF19ZnVuY3Rpb24gYm5CeXRlVmFsdWUoKXtyZXR1cm4odGhpcy50PT0wKT90aGlzLnM6KHRoaXNbMF08PDI0KT4+MjR9ZnVuY3Rpb24gYm5TaG9ydFZhbHVlKCl7cmV0dXJuKHRoaXMudD09MCk/dGhpcy5zOih0aGlzWzBdPDwxNik+PjE2fWZ1bmN0aW9uIGJucENodW5rU2l6ZShhKXtyZXR1cm4gTWF0aC5mbG9vcihNYXRoLkxOMip0aGlzLkRCL01hdGgubG9nKGEpKX1mdW5jdGlvbiBiblNpZ051bSgpe2lmKHRoaXMuczwwKXtyZXR1cm4gLTF9ZWxzZXtpZih0aGlzLnQ8PTB8fCh0aGlzLnQ9PTEmJnRoaXNbMF08PTApKXtyZXR1cm4gMH1lbHNle3JldHVybiAxfX19ZnVuY3Rpb24gYm5wVG9SYWRpeChjKXtpZihjPT1udWxsKXtjPTEwfWlmKHRoaXMuc2lnbnVtKCk9PTB8fGM8Mnx8Yz4zNil7cmV0dXJuXCIwXCJ9dmFyIGY9dGhpcy5jaHVua1NpemUoYyk7dmFyIGU9TWF0aC5wb3coYyxmKTt2YXIgaT1uYnYoZSksaj1uYmkoKSxoPW5iaSgpLGc9XCJcIjt0aGlzLmRpdlJlbVRvKGksaixoKTt3aGlsZShqLnNpZ251bSgpPjApe2c9KGUraC5pbnRWYWx1ZSgpKS50b1N0cmluZyhjKS5zdWJzdHIoMSkrZztqLmRpdlJlbVRvKGksaixoKX1yZXR1cm4gaC5pbnRWYWx1ZSgpLnRvU3RyaW5nKGMpK2d9ZnVuY3Rpb24gYm5wRnJvbVJhZGl4KG0saCl7dGhpcy5mcm9tSW50KDApO2lmKGg9PW51bGwpe2g9MTB9dmFyIGY9dGhpcy5jaHVua1NpemUoaCk7dmFyIGc9TWF0aC5wb3coaCxmKSxlPWZhbHNlLGE9MCxsPTA7Zm9yKHZhciBjPTA7YzxtLmxlbmd0aDsrK2Mpe3ZhciBrPWludEF0KG0sYyk7aWYoazwwKXtpZihtLmNoYXJBdChjKT09XCItXCImJnRoaXMuc2lnbnVtKCk9PTApe2U9dHJ1ZX1jb250aW51ZX1sPWgqbCtrO2lmKCsrYT49Zil7dGhpcy5kTXVsdGlwbHkoZyk7dGhpcy5kQWRkT2Zmc2V0KGwsMCk7YT0wO2w9MH19aWYoYT4wKXt0aGlzLmRNdWx0aXBseShNYXRoLnBvdyhoLGEpKTt0aGlzLmRBZGRPZmZzZXQobCwwKX1pZihlKXtCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKX19ZnVuY3Rpb24gYm5wRnJvbU51bWJlcihmLGUsaCl7aWYoXCJudW1iZXJcIj09dHlwZW9mIGUpe2lmKGY8Mil7dGhpcy5mcm9tSW50KDEpfWVsc2V7dGhpcy5mcm9tTnVtYmVyKGYsaCk7aWYoIXRoaXMudGVzdEJpdChmLTEpKXt0aGlzLmJpdHdpc2VUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoZi0xKSxvcF9vcix0aGlzKX1pZih0aGlzLmlzRXZlbigpKXt0aGlzLmRBZGRPZmZzZXQoMSwwKX13aGlsZSghdGhpcy5pc1Byb2JhYmxlUHJpbWUoZSkpe3RoaXMuZEFkZE9mZnNldCgyLDApO2lmKHRoaXMuYml0TGVuZ3RoKCk+Zil7dGhpcy5zdWJUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoZi0xKSx0aGlzKX19fX1lbHNle3ZhciBkPW5ldyBBcnJheSgpLGc9ZiY3O2QubGVuZ3RoPShmPj4zKSsxO2UubmV4dEJ5dGVzKGQpO2lmKGc+MCl7ZFswXSY9KCgxPDxnKS0xKX1lbHNle2RbMF09MH10aGlzLmZyb21TdHJpbmcoZCwyNTYpfX1mdW5jdGlvbiBiblRvQnl0ZUFycmF5KCl7dmFyIGI9dGhpcy50LGM9bmV3IEFycmF5KCk7Y1swXT10aGlzLnM7dmFyIGU9dGhpcy5EQi0oYip0aGlzLkRCKSU4LGYsYT0wO2lmKGItLT4wKXtpZihlPHRoaXMuREImJihmPXRoaXNbYl0+PmUpIT0odGhpcy5zJnRoaXMuRE0pPj5lKXtjW2ErK109ZnwodGhpcy5zPDwodGhpcy5EQi1lKSl9d2hpbGUoYj49MCl7aWYoZTw4KXtmPSh0aGlzW2JdJigoMTw8ZSktMSkpPDwoOC1lKTtmfD10aGlzWy0tYl0+PihlKz10aGlzLkRCLTgpfWVsc2V7Zj0odGhpc1tiXT4+KGUtPTgpKSYyNTU7aWYoZTw9MCl7ZSs9dGhpcy5EQjstLWJ9fWlmKChmJjEyOCkhPTApe2Z8PS0yNTZ9aWYoYT09MCYmKHRoaXMucyYxMjgpIT0oZiYxMjgpKXsrK2F9aWYoYT4wfHxmIT10aGlzLnMpe2NbYSsrXT1mfX19cmV0dXJuIGN9ZnVuY3Rpb24gYm5FcXVhbHMoYil7cmV0dXJuKHRoaXMuY29tcGFyZVRvKGIpPT0wKX1mdW5jdGlvbiBibk1pbihiKXtyZXR1cm4odGhpcy5jb21wYXJlVG8oYik8MCk/dGhpczpifWZ1bmN0aW9uIGJuTWF4KGIpe3JldHVybih0aGlzLmNvbXBhcmVUbyhiKT4wKT90aGlzOmJ9ZnVuY3Rpb24gYm5wQml0d2lzZVRvKGMsaCxlKXt2YXIgZCxnLGI9TWF0aC5taW4oYy50LHRoaXMudCk7Zm9yKGQ9MDtkPGI7KytkKXtlW2RdPWgodGhpc1tkXSxjW2RdKX1pZihjLnQ8dGhpcy50KXtnPWMucyZ0aGlzLkRNO2ZvcihkPWI7ZDx0aGlzLnQ7KytkKXtlW2RdPWgodGhpc1tkXSxnKX1lLnQ9dGhpcy50fWVsc2V7Zz10aGlzLnMmdGhpcy5ETTtmb3IoZD1iO2Q8Yy50OysrZCl7ZVtkXT1oKGcsY1tkXSl9ZS50PWMudH1lLnM9aCh0aGlzLnMsYy5zKTtlLmNsYW1wKCl9ZnVuY3Rpb24gb3BfYW5kKGEsYil7cmV0dXJuIGEmYn1mdW5jdGlvbiBibkFuZChiKXt2YXIgYz1uYmkoKTt0aGlzLmJpdHdpc2VUbyhiLG9wX2FuZCxjKTtyZXR1cm4gY31mdW5jdGlvbiBvcF9vcihhLGIpe3JldHVybiBhfGJ9ZnVuY3Rpb24gYm5PcihiKXt2YXIgYz1uYmkoKTt0aGlzLmJpdHdpc2VUbyhiLG9wX29yLGMpO3JldHVybiBjfWZ1bmN0aW9uIG9wX3hvcihhLGIpe3JldHVybiBhXmJ9ZnVuY3Rpb24gYm5Yb3IoYil7dmFyIGM9bmJpKCk7dGhpcy5iaXR3aXNlVG8oYixvcF94b3IsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gb3BfYW5kbm90KGEsYil7cmV0dXJuIGEmfmJ9ZnVuY3Rpb24gYm5BbmROb3QoYil7dmFyIGM9bmJpKCk7dGhpcy5iaXR3aXNlVG8oYixvcF9hbmRub3QsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5Ob3QoKXt2YXIgYj1uYmkoKTtmb3IodmFyIGE9MDthPHRoaXMudDsrK2Epe2JbYV09dGhpcy5ETSZ+dGhpc1thXX1iLnQ9dGhpcy50O2Iucz1+dGhpcy5zO3JldHVybiBifWZ1bmN0aW9uIGJuU2hpZnRMZWZ0KGIpe3ZhciBhPW5iaSgpO2lmKGI8MCl7dGhpcy5yU2hpZnRUbygtYixhKX1lbHNle3RoaXMubFNoaWZ0VG8oYixhKX1yZXR1cm4gYX1mdW5jdGlvbiBiblNoaWZ0UmlnaHQoYil7dmFyIGE9bmJpKCk7aWYoYjwwKXt0aGlzLmxTaGlmdFRvKC1iLGEpfWVsc2V7dGhpcy5yU2hpZnRUbyhiLGEpfXJldHVybiBhfWZ1bmN0aW9uIGxiaXQoYSl7aWYoYT09MCl7cmV0dXJuIC0xfXZhciBiPTA7aWYoKGEmNjU1MzUpPT0wKXthPj49MTY7Yis9MTZ9aWYoKGEmMjU1KT09MCl7YT4+PTg7Yis9OH1pZigoYSYxNSk9PTApe2E+Pj00O2IrPTR9aWYoKGEmMyk9PTApe2E+Pj0yO2IrPTJ9aWYoKGEmMSk9PTApeysrYn1yZXR1cm4gYn1mdW5jdGlvbiBibkdldExvd2VzdFNldEJpdCgpe2Zvcih2YXIgYT0wO2E8dGhpcy50OysrYSl7aWYodGhpc1thXSE9MCl7cmV0dXJuIGEqdGhpcy5EQitsYml0KHRoaXNbYV0pfX1pZih0aGlzLnM8MCl7cmV0dXJuIHRoaXMudCp0aGlzLkRCfXJldHVybiAtMX1mdW5jdGlvbiBjYml0KGEpe3ZhciBiPTA7d2hpbGUoYSE9MCl7YSY9YS0xOysrYn1yZXR1cm4gYn1mdW5jdGlvbiBibkJpdENvdW50KCl7dmFyIGM9MCxhPXRoaXMucyZ0aGlzLkRNO2Zvcih2YXIgYj0wO2I8dGhpcy50OysrYil7Yys9Y2JpdCh0aGlzW2JdXmEpfXJldHVybiBjfWZ1bmN0aW9uIGJuVGVzdEJpdChiKXt2YXIgYT1NYXRoLmZsb29yKGIvdGhpcy5EQik7aWYoYT49dGhpcy50KXtyZXR1cm4odGhpcy5zIT0wKX1yZXR1cm4oKHRoaXNbYV0mKDE8PChiJXRoaXMuREIpKSkhPTApfWZ1bmN0aW9uIGJucENoYW5nZUJpdChjLGIpe3ZhciBhPUJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChjKTt0aGlzLmJpdHdpc2VUbyhhLGIsYSk7cmV0dXJuIGF9ZnVuY3Rpb24gYm5TZXRCaXQoYSl7cmV0dXJuIHRoaXMuY2hhbmdlQml0KGEsb3Bfb3IpfWZ1bmN0aW9uIGJuQ2xlYXJCaXQoYSl7cmV0dXJuIHRoaXMuY2hhbmdlQml0KGEsb3BfYW5kbm90KX1mdW5jdGlvbiBibkZsaXBCaXQoYSl7cmV0dXJuIHRoaXMuY2hhbmdlQml0KGEsb3BfeG9yKX1mdW5jdGlvbiBibnBBZGRUbyhkLGYpe3ZhciBlPTAsZz0wLGI9TWF0aC5taW4oZC50LHRoaXMudCk7d2hpbGUoZTxiKXtnKz10aGlzW2VdK2RbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1pZihkLnQ8dGhpcy50KXtnKz1kLnM7d2hpbGUoZTx0aGlzLnQpe2crPXRoaXNbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1nKz10aGlzLnN9ZWxzZXtnKz10aGlzLnM7d2hpbGUoZTxkLnQpe2crPWRbZV07ZltlKytdPWcmdGhpcy5ETTtnPj49dGhpcy5EQn1nKz1kLnN9Zi5zPShnPDApPy0xOjA7aWYoZz4wKXtmW2UrK109Z31lbHNle2lmKGc8LTEpe2ZbZSsrXT10aGlzLkRWK2d9fWYudD1lO2YuY2xhbXAoKX1mdW5jdGlvbiBibkFkZChiKXt2YXIgYz1uYmkoKTt0aGlzLmFkZFRvKGIsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5TdWJ0cmFjdChiKXt2YXIgYz1uYmkoKTt0aGlzLnN1YlRvKGIsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5NdWx0aXBseShiKXt2YXIgYz1uYmkoKTt0aGlzLm11bHRpcGx5VG8oYixjKTtyZXR1cm4gY31mdW5jdGlvbiBiblNxdWFyZSgpe3ZhciBhPW5iaSgpO3RoaXMuc3F1YXJlVG8oYSk7cmV0dXJuIGF9ZnVuY3Rpb24gYm5EaXZpZGUoYil7dmFyIGM9bmJpKCk7dGhpcy5kaXZSZW1UbyhiLGMsbnVsbCk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5SZW1haW5kZXIoYil7dmFyIGM9bmJpKCk7dGhpcy5kaXZSZW1UbyhiLG51bGwsYyk7cmV0dXJuIGN9ZnVuY3Rpb24gYm5EaXZpZGVBbmRSZW1haW5kZXIoYil7dmFyIGQ9bmJpKCksYz1uYmkoKTt0aGlzLmRpdlJlbVRvKGIsZCxjKTtyZXR1cm4gbmV3IEFycmF5KGQsYyl9ZnVuY3Rpb24gYm5wRE11bHRpcGx5KGEpe3RoaXNbdGhpcy50XT10aGlzLmFtKDAsYS0xLHRoaXMsMCwwLHRoaXMudCk7Kyt0aGlzLnQ7dGhpcy5jbGFtcCgpfWZ1bmN0aW9uIGJucERBZGRPZmZzZXQoYixhKXtpZihiPT0wKXtyZXR1cm59d2hpbGUodGhpcy50PD1hKXt0aGlzW3RoaXMudCsrXT0wfXRoaXNbYV0rPWI7d2hpbGUodGhpc1thXT49dGhpcy5EVil7dGhpc1thXS09dGhpcy5EVjtpZigrK2E+PXRoaXMudCl7dGhpc1t0aGlzLnQrK109MH0rK3RoaXNbYV19fWZ1bmN0aW9uIE51bGxFeHAoKXt9ZnVuY3Rpb24gbk5vcChhKXtyZXR1cm4gYX1mdW5jdGlvbiBuTXVsVG8oYSxjLGIpe2EubXVsdGlwbHlUbyhjLGIpfWZ1bmN0aW9uIG5TcXJUbyhhLGIpe2Euc3F1YXJlVG8oYil9TnVsbEV4cC5wcm90b3R5cGUuY29udmVydD1uTm9wO051bGxFeHAucHJvdG90eXBlLnJldmVydD1uTm9wO051bGxFeHAucHJvdG90eXBlLm11bFRvPW5NdWxUbztOdWxsRXhwLnByb3RvdHlwZS5zcXJUbz1uU3FyVG87ZnVuY3Rpb24gYm5Qb3coYSl7cmV0dXJuIHRoaXMuZXhwKGEsbmV3IE51bGxFeHAoKSl9ZnVuY3Rpb24gYm5wTXVsdGlwbHlMb3dlclRvKGIsZixlKXt2YXIgZD1NYXRoLm1pbih0aGlzLnQrYi50LGYpO2Uucz0wO2UudD1kO3doaWxlKGQ+MCl7ZVstLWRdPTB9dmFyIGM7Zm9yKGM9ZS50LXRoaXMudDtkPGM7KytkKXtlW2QrdGhpcy50XT10aGlzLmFtKDAsYltkXSxlLGQsMCx0aGlzLnQpfWZvcihjPU1hdGgubWluKGIudCxmKTtkPGM7KytkKXt0aGlzLmFtKDAsYltkXSxlLGQsMCxmLWQpfWUuY2xhbXAoKX1mdW5jdGlvbiBibnBNdWx0aXBseVVwcGVyVG8oYixlLGQpey0tZTt2YXIgYz1kLnQ9dGhpcy50K2IudC1lO2Qucz0wO3doaWxlKC0tYz49MCl7ZFtjXT0wfWZvcihjPU1hdGgubWF4KGUtdGhpcy50LDApO2M8Yi50OysrYyl7ZFt0aGlzLnQrYy1lXT10aGlzLmFtKGUtYyxiW2NdLGQsMCwwLHRoaXMudCtjLWUpfWQuY2xhbXAoKTtkLmRyU2hpZnRUbygxLGQpfWZ1bmN0aW9uIEJhcnJldHQoYSl7dGhpcy5yMj1uYmkoKTt0aGlzLnEzPW5iaSgpO0JpZ0ludGVnZXIuT05FLmRsU2hpZnRUbygyKmEudCx0aGlzLnIyKTt0aGlzLm11PXRoaXMucjIuZGl2aWRlKGEpO3RoaXMubT1hfWZ1bmN0aW9uIGJhcnJldHRDb252ZXJ0KGEpe2lmKGEuczwwfHxhLnQ+Mip0aGlzLm0udCl7cmV0dXJuIGEubW9kKHRoaXMubSl9ZWxzZXtpZihhLmNvbXBhcmVUbyh0aGlzLm0pPDApe3JldHVybiBhfWVsc2V7dmFyIGI9bmJpKCk7YS5jb3B5VG8oYik7dGhpcy5yZWR1Y2UoYik7cmV0dXJuIGJ9fX1mdW5jdGlvbiBiYXJyZXR0UmV2ZXJ0KGEpe3JldHVybiBhfWZ1bmN0aW9uIGJhcnJldHRSZWR1Y2UoYSl7YS5kclNoaWZ0VG8odGhpcy5tLnQtMSx0aGlzLnIyKTtpZihhLnQ+dGhpcy5tLnQrMSl7YS50PXRoaXMubS50KzE7YS5jbGFtcCgpfXRoaXMubXUubXVsdGlwbHlVcHBlclRvKHRoaXMucjIsdGhpcy5tLnQrMSx0aGlzLnEzKTt0aGlzLm0ubXVsdGlwbHlMb3dlclRvKHRoaXMucTMsdGhpcy5tLnQrMSx0aGlzLnIyKTt3aGlsZShhLmNvbXBhcmVUbyh0aGlzLnIyKTwwKXthLmRBZGRPZmZzZXQoMSx0aGlzLm0udCsxKX1hLnN1YlRvKHRoaXMucjIsYSk7d2hpbGUoYS5jb21wYXJlVG8odGhpcy5tKT49MCl7YS5zdWJUbyh0aGlzLm0sYSl9fWZ1bmN0aW9uIGJhcnJldHRTcXJUbyhhLGIpe2Euc3F1YXJlVG8oYik7dGhpcy5yZWR1Y2UoYil9ZnVuY3Rpb24gYmFycmV0dE11bFRvKGEsYyxiKXthLm11bHRpcGx5VG8oYyxiKTt0aGlzLnJlZHVjZShiKX1CYXJyZXR0LnByb3RvdHlwZS5jb252ZXJ0PWJhcnJldHRDb252ZXJ0O0JhcnJldHQucHJvdG90eXBlLnJldmVydD1iYXJyZXR0UmV2ZXJ0O0JhcnJldHQucHJvdG90eXBlLnJlZHVjZT1iYXJyZXR0UmVkdWNlO0JhcnJldHQucHJvdG90eXBlLm11bFRvPWJhcnJldHRNdWxUbztCYXJyZXR0LnByb3RvdHlwZS5zcXJUbz1iYXJyZXR0U3FyVG87ZnVuY3Rpb24gYm5Nb2RQb3cocSxmKXt2YXIgbz1xLmJpdExlbmd0aCgpLGgsYj1uYnYoMSksdjtpZihvPD0wKXtyZXR1cm4gYn1lbHNle2lmKG88MTgpe2g9MX1lbHNle2lmKG88NDgpe2g9M31lbHNle2lmKG88MTQ0KXtoPTR9ZWxzZXtpZihvPDc2OCl7aD01fWVsc2V7aD02fX19fX1pZihvPDgpe3Y9bmV3IENsYXNzaWMoZil9ZWxzZXtpZihmLmlzRXZlbigpKXt2PW5ldyBCYXJyZXR0KGYpfWVsc2V7dj1uZXcgTW9udGdvbWVyeShmKX19dmFyIHA9bmV3IEFycmF5KCksZD0zLHM9aC0xLGE9KDE8PGgpLTE7cFsxXT12LmNvbnZlcnQodGhpcyk7aWYoaD4xKXt2YXIgQT1uYmkoKTt2LnNxclRvKHBbMV0sQSk7d2hpbGUoZDw9YSl7cFtkXT1uYmkoKTt2Lm11bFRvKEEscFtkLTJdLHBbZF0pO2QrPTJ9fXZhciBsPXEudC0xLHgsdT10cnVlLGM9bmJpKCkseTtvPW5iaXRzKHFbbF0pLTE7d2hpbGUobD49MCl7aWYobz49cyl7eD0ocVtsXT4+KG8tcykpJmF9ZWxzZXt4PShxW2xdJigoMTw8KG8rMSkpLTEpKTw8KHMtbyk7aWYobD4wKXt4fD1xW2wtMV0+Pih0aGlzLkRCK28tcyl9fWQ9aDt3aGlsZSgoeCYxKT09MCl7eD4+PTE7LS1kfWlmKChvLT1kKTwwKXtvKz10aGlzLkRCOy0tbH1pZih1KXtwW3hdLmNvcHlUbyhiKTt1PWZhbHNlfWVsc2V7d2hpbGUoZD4xKXt2LnNxclRvKGIsYyk7di5zcXJUbyhjLGIpO2QtPTJ9aWYoZD4wKXt2LnNxclRvKGIsYyl9ZWxzZXt5PWI7Yj1jO2M9eX12Lm11bFRvKGMscFt4XSxiKX13aGlsZShsPj0wJiYocVtsXSYoMTw8bykpPT0wKXt2LnNxclRvKGIsYyk7eT1iO2I9YztjPXk7aWYoLS1vPDApe289dGhpcy5EQi0xOy0tbH19fXJldHVybiB2LnJldmVydChiKX1mdW5jdGlvbiBibkdDRChjKXt2YXIgYj0odGhpcy5zPDApP3RoaXMubmVnYXRlKCk6dGhpcy5jbG9uZSgpO3ZhciBoPShjLnM8MCk/Yy5uZWdhdGUoKTpjLmNsb25lKCk7aWYoYi5jb21wYXJlVG8oaCk8MCl7dmFyIGU9YjtiPWg7aD1lfXZhciBkPWIuZ2V0TG93ZXN0U2V0Qml0KCksZj1oLmdldExvd2VzdFNldEJpdCgpO2lmKGY8MCl7cmV0dXJuIGJ9aWYoZDxmKXtmPWR9aWYoZj4wKXtiLnJTaGlmdFRvKGYsYik7aC5yU2hpZnRUbyhmLGgpfXdoaWxlKGIuc2lnbnVtKCk+MCl7aWYoKGQ9Yi5nZXRMb3dlc3RTZXRCaXQoKSk+MCl7Yi5yU2hpZnRUbyhkLGIpfWlmKChkPWguZ2V0TG93ZXN0U2V0Qml0KCkpPjApe2guclNoaWZ0VG8oZCxoKX1pZihiLmNvbXBhcmVUbyhoKT49MCl7Yi5zdWJUbyhoLGIpO2IuclNoaWZ0VG8oMSxiKX1lbHNle2guc3ViVG8oYixoKTtoLnJTaGlmdFRvKDEsaCl9fWlmKGY+MCl7aC5sU2hpZnRUbyhmLGgpfXJldHVybiBofWZ1bmN0aW9uIGJucE1vZEludChlKXtpZihlPD0wKXtyZXR1cm4gMH12YXIgYz10aGlzLkRWJWUsYj0odGhpcy5zPDApP2UtMTowO2lmKHRoaXMudD4wKXtpZihjPT0wKXtiPXRoaXNbMF0lZX1lbHNle2Zvcih2YXIgYT10aGlzLnQtMTthPj0wOy0tYSl7Yj0oYypiK3RoaXNbYV0pJWV9fX1yZXR1cm4gYn1mdW5jdGlvbiBibk1vZEludmVyc2UoZil7dmFyIGo9Zi5pc0V2ZW4oKTtpZigodGhpcy5pc0V2ZW4oKSYmail8fGYuc2lnbnVtKCk9PTApe3JldHVybiBCaWdJbnRlZ2VyLlpFUk99dmFyIGk9Zi5jbG9uZSgpLGg9dGhpcy5jbG9uZSgpO3ZhciBnPW5idigxKSxlPW5idigwKSxsPW5idigwKSxrPW5idigxKTt3aGlsZShpLnNpZ251bSgpIT0wKXt3aGlsZShpLmlzRXZlbigpKXtpLnJTaGlmdFRvKDEsaSk7aWYoail7aWYoIWcuaXNFdmVuKCl8fCFlLmlzRXZlbigpKXtnLmFkZFRvKHRoaXMsZyk7ZS5zdWJUbyhmLGUpfWcuclNoaWZ0VG8oMSxnKX1lbHNle2lmKCFlLmlzRXZlbigpKXtlLnN1YlRvKGYsZSl9fWUuclNoaWZ0VG8oMSxlKX13aGlsZShoLmlzRXZlbigpKXtoLnJTaGlmdFRvKDEsaCk7aWYoail7aWYoIWwuaXNFdmVuKCl8fCFrLmlzRXZlbigpKXtsLmFkZFRvKHRoaXMsbCk7ay5zdWJUbyhmLGspfWwuclNoaWZ0VG8oMSxsKX1lbHNle2lmKCFrLmlzRXZlbigpKXtrLnN1YlRvKGYsayl9fWsuclNoaWZ0VG8oMSxrKX1pZihpLmNvbXBhcmVUbyhoKT49MCl7aS5zdWJUbyhoLGkpO2lmKGope2cuc3ViVG8obCxnKX1lLnN1YlRvKGssZSl9ZWxzZXtoLnN1YlRvKGksaCk7aWYoail7bC5zdWJUbyhnLGwpfWsuc3ViVG8oZSxrKX19aWYoaC5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpIT0wKXtyZXR1cm4gQmlnSW50ZWdlci5aRVJPfWlmKGsuY29tcGFyZVRvKGYpPj0wKXtyZXR1cm4gay5zdWJ0cmFjdChmKX1pZihrLnNpZ251bSgpPDApe2suYWRkVG8oZixrKX1lbHNle3JldHVybiBrfWlmKGsuc2lnbnVtKCk8MCl7cmV0dXJuIGsuYWRkKGYpfWVsc2V7cmV0dXJuIGt9fXZhciBsb3dwcmltZXM9WzIsMyw1LDcsMTEsMTMsMTcsMTksMjMsMjksMzEsMzcsNDEsNDMsNDcsNTMsNTksNjEsNjcsNzEsNzMsNzksODMsODksOTcsMTAxLDEwMywxMDcsMTA5LDExMywxMjcsMTMxLDEzNywxMzksMTQ5LDE1MSwxNTcsMTYzLDE2NywxNzMsMTc5LDE4MSwxOTEsMTkzLDE5NywxOTksMjExLDIyMywyMjcsMjI5LDIzMywyMzksMjQxLDI1MSwyNTcsMjYzLDI2OSwyNzEsMjc3LDI4MSwyODMsMjkzLDMwNywzMTEsMzEzLDMxNywzMzEsMzM3LDM0NywzNDksMzUzLDM1OSwzNjcsMzczLDM3OSwzODMsMzg5LDM5Nyw0MDEsNDA5LDQxOSw0MjEsNDMxLDQzMyw0MzksNDQzLDQ0OSw0NTcsNDYxLDQ2Myw0NjcsNDc5LDQ4Nyw0OTEsNDk5LDUwMyw1MDksNTIxLDUyMyw1NDEsNTQ3LDU1Nyw1NjMsNTY5LDU3MSw1NzcsNTg3LDU5Myw1OTksNjAxLDYwNyw2MTMsNjE3LDYxOSw2MzEsNjQxLDY0Myw2NDcsNjUzLDY1OSw2NjEsNjczLDY3Nyw2ODMsNjkxLDcwMSw3MDksNzE5LDcyNyw3MzMsNzM5LDc0Myw3NTEsNzU3LDc2MSw3NjksNzczLDc4Nyw3OTcsODA5LDgxMSw4MjEsODIzLDgyNyw4MjksODM5LDg1Myw4NTcsODU5LDg2Myw4NzcsODgxLDg4Myw4ODcsOTA3LDkxMSw5MTksOTI5LDkzNyw5NDEsOTQ3LDk1Myw5NjcsOTcxLDk3Nyw5ODMsOTkxLDk5N107dmFyIGxwbGltPSgxPDwyNikvbG93cHJpbWVzW2xvd3ByaW1lcy5sZW5ndGgtMV07ZnVuY3Rpb24gYm5Jc1Byb2JhYmxlUHJpbWUoZSl7dmFyIGQsYj10aGlzLmFicygpO2lmKGIudD09MSYmYlswXTw9bG93cHJpbWVzW2xvd3ByaW1lcy5sZW5ndGgtMV0pe2ZvcihkPTA7ZDxsb3dwcmltZXMubGVuZ3RoOysrZCl7aWYoYlswXT09bG93cHJpbWVzW2RdKXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfWlmKGIuaXNFdmVuKCkpe3JldHVybiBmYWxzZX1kPTE7d2hpbGUoZDxsb3dwcmltZXMubGVuZ3RoKXt2YXIgYT1sb3dwcmltZXNbZF0sYz1kKzE7d2hpbGUoYzxsb3dwcmltZXMubGVuZ3RoJiZhPGxwbGltKXthKj1sb3dwcmltZXNbYysrXX1hPWIubW9kSW50KGEpO3doaWxlKGQ8Yyl7aWYoYSVsb3dwcmltZXNbZCsrXT09MCl7cmV0dXJuIGZhbHNlfX19cmV0dXJuIGIubWlsbGVyUmFiaW4oZSl9ZnVuY3Rpb24gYm5wTWlsbGVyUmFiaW4oZil7dmFyIGc9dGhpcy5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7dmFyIGM9Zy5nZXRMb3dlc3RTZXRCaXQoKTtpZihjPD0wKXtyZXR1cm4gZmFsc2V9dmFyIGg9Zy5zaGlmdFJpZ2h0KGMpO2Y9KGYrMSk+PjE7aWYoZj5sb3dwcmltZXMubGVuZ3RoKXtmPWxvd3ByaW1lcy5sZW5ndGh9dmFyIGI9bmJpKCk7Zm9yKHZhciBlPTA7ZTxmOysrZSl7Yi5mcm9tSW50KGxvd3ByaW1lc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbG93cHJpbWVzLmxlbmd0aCldKTt2YXIgbD1iLm1vZFBvdyhoLHRoaXMpO2lmKGwuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSE9MCYmbC5jb21wYXJlVG8oZykhPTApe3ZhciBkPTE7d2hpbGUoZCsrPGMmJmwuY29tcGFyZVRvKGcpIT0wKXtsPWwubW9kUG93SW50KDIsdGhpcyk7aWYobC5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpPT0wKXtyZXR1cm4gZmFsc2V9fWlmKGwuY29tcGFyZVRvKGcpIT0wKXtyZXR1cm4gZmFsc2V9fX1yZXR1cm4gdHJ1ZX1CaWdJbnRlZ2VyLnByb3RvdHlwZS5jaHVua1NpemU9Ym5wQ2h1bmtTaXplO0JpZ0ludGVnZXIucHJvdG90eXBlLnRvUmFkaXg9Ym5wVG9SYWRpeDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tUmFkaXg9Ym5wRnJvbVJhZGl4O0JpZ0ludGVnZXIucHJvdG90eXBlLmZyb21OdW1iZXI9Ym5wRnJvbU51bWJlcjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXR3aXNlVG89Ym5wQml0d2lzZVRvO0JpZ0ludGVnZXIucHJvdG90eXBlLmNoYW5nZUJpdD1ibnBDaGFuZ2VCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuYWRkVG89Ym5wQWRkVG87QmlnSW50ZWdlci5wcm90b3R5cGUuZE11bHRpcGx5PWJucERNdWx0aXBseTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5kQWRkT2Zmc2V0PWJucERBZGRPZmZzZXQ7QmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHlMb3dlclRvPWJucE11bHRpcGx5TG93ZXJUbztCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVVwcGVyVG89Ym5wTXVsdGlwbHlVcHBlclRvO0JpZ0ludGVnZXIucHJvdG90eXBlLm1vZEludD1ibnBNb2RJbnQ7QmlnSW50ZWdlci5wcm90b3R5cGUubWlsbGVyUmFiaW49Ym5wTWlsbGVyUmFiaW47QmlnSW50ZWdlci5wcm90b3R5cGUuY2xvbmU9Ym5DbG9uZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5pbnRWYWx1ZT1ibkludFZhbHVlO0JpZ0ludGVnZXIucHJvdG90eXBlLmJ5dGVWYWx1ZT1ibkJ5dGVWYWx1ZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaG9ydFZhbHVlPWJuU2hvcnRWYWx1ZTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaWdudW09Ym5TaWdOdW07QmlnSW50ZWdlci5wcm90b3R5cGUudG9CeXRlQXJyYXk9Ym5Ub0J5dGVBcnJheTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5lcXVhbHM9Ym5FcXVhbHM7QmlnSW50ZWdlci5wcm90b3R5cGUubWluPWJuTWluO0JpZ0ludGVnZXIucHJvdG90eXBlLm1heD1ibk1heDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbmQ9Ym5BbmQ7QmlnSW50ZWdlci5wcm90b3R5cGUub3I9Ym5PcjtCaWdJbnRlZ2VyLnByb3RvdHlwZS54b3I9Ym5Yb3I7QmlnSW50ZWdlci5wcm90b3R5cGUuYW5kTm90PWJuQW5kTm90O0JpZ0ludGVnZXIucHJvdG90eXBlLm5vdD1ibk5vdDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdExlZnQ9Ym5TaGlmdExlZnQ7QmlnSW50ZWdlci5wcm90b3R5cGUuc2hpZnRSaWdodD1iblNoaWZ0UmlnaHQ7QmlnSW50ZWdlci5wcm90b3R5cGUuZ2V0TG93ZXN0U2V0Qml0PWJuR2V0TG93ZXN0U2V0Qml0O0JpZ0ludGVnZXIucHJvdG90eXBlLmJpdENvdW50PWJuQml0Q291bnQ7QmlnSW50ZWdlci5wcm90b3R5cGUudGVzdEJpdD1iblRlc3RCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuc2V0Qml0PWJuU2V0Qml0O0JpZ0ludGVnZXIucHJvdG90eXBlLmNsZWFyQml0PWJuQ2xlYXJCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuZmxpcEJpdD1ibkZsaXBCaXQ7QmlnSW50ZWdlci5wcm90b3R5cGUuYWRkPWJuQWRkO0JpZ0ludGVnZXIucHJvdG90eXBlLnN1YnRyYWN0PWJuU3VidHJhY3Q7QmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHk9Ym5NdWx0aXBseTtCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZpZGU9Ym5EaXZpZGU7QmlnSW50ZWdlci5wcm90b3R5cGUucmVtYWluZGVyPWJuUmVtYWluZGVyO0JpZ0ludGVnZXIucHJvdG90eXBlLmRpdmlkZUFuZFJlbWFpbmRlcj1ibkRpdmlkZUFuZFJlbWFpbmRlcjtCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3c9Ym5Nb2RQb3c7QmlnSW50ZWdlci5wcm90b3R5cGUubW9kSW52ZXJzZT1ibk1vZEludmVyc2U7QmlnSW50ZWdlci5wcm90b3R5cGUucG93PWJuUG93O0JpZ0ludGVnZXIucHJvdG90eXBlLmdjZD1ibkdDRDtCaWdJbnRlZ2VyLnByb3RvdHlwZS5pc1Byb2JhYmxlUHJpbWU9Ym5Jc1Byb2JhYmxlUHJpbWU7QmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlPWJuU3F1YXJlO1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbmZ1bmN0aW9uIEFyY2ZvdXIoKXt0aGlzLmk9MDt0aGlzLmo9MDt0aGlzLlM9bmV3IEFycmF5KCl9ZnVuY3Rpb24gQVJDNGluaXQoZCl7dmFyIGMsYSxiO2ZvcihjPTA7YzwyNTY7KytjKXt0aGlzLlNbY109Y31hPTA7Zm9yKGM9MDtjPDI1NjsrK2Mpe2E9KGErdGhpcy5TW2NdK2RbYyVkLmxlbmd0aF0pJjI1NTtiPXRoaXMuU1tjXTt0aGlzLlNbY109dGhpcy5TW2FdO3RoaXMuU1thXT1ifXRoaXMuaT0wO3RoaXMuaj0wfWZ1bmN0aW9uIEFSQzRuZXh0KCl7dmFyIGE7dGhpcy5pPSh0aGlzLmkrMSkmMjU1O3RoaXMuaj0odGhpcy5qK3RoaXMuU1t0aGlzLmldKSYyNTU7YT10aGlzLlNbdGhpcy5pXTt0aGlzLlNbdGhpcy5pXT10aGlzLlNbdGhpcy5qXTt0aGlzLlNbdGhpcy5qXT1hO3JldHVybiB0aGlzLlNbKGErdGhpcy5TW3RoaXMuaV0pJjI1NV19QXJjZm91ci5wcm90b3R5cGUuaW5pdD1BUkM0aW5pdDtBcmNmb3VyLnByb3RvdHlwZS5uZXh0PUFSQzRuZXh0O2Z1bmN0aW9uIHBybmdfbmV3c3RhdGUoKXtyZXR1cm4gbmV3IEFyY2ZvdXIoKX12YXIgcm5nX3BzaXplPTI1Njtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG52YXIgcm5nX3N0YXRlO3ZhciBybmdfcG9vbDt2YXIgcm5nX3BwdHI7ZnVuY3Rpb24gcm5nX3NlZWRfaW50KGEpe3JuZ19wb29sW3JuZ19wcHRyKytdXj1hJjI1NTtybmdfcG9vbFtybmdfcHB0cisrXV49KGE+PjgpJjI1NTtybmdfcG9vbFtybmdfcHB0cisrXV49KGE+PjE2KSYyNTU7cm5nX3Bvb2xbcm5nX3BwdHIrK11ePShhPj4yNCkmMjU1O2lmKHJuZ19wcHRyPj1ybmdfcHNpemUpe3JuZ19wcHRyLT1ybmdfcHNpemV9fWZ1bmN0aW9uIHJuZ19zZWVkX3RpbWUoKXtybmdfc2VlZF9pbnQobmV3IERhdGUoKS5nZXRUaW1lKCkpfWlmKHJuZ19wb29sPT1udWxsKXtybmdfcG9vbD1uZXcgQXJyYXkoKTtybmdfcHB0cj0wO3ZhciB0O2lmKHdpbmRvdy5jcnlwdG8mJndpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXt2YXIgdWE9bmV3IFVpbnQ4QXJyYXkoMzIpO3dpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHVhKTtmb3IodD0wO3Q8MzI7Kyt0KXtybmdfcG9vbFtybmdfcHB0cisrXT11YVt0XX19aWYobmF2aWdhdG9yLmFwcE5hbWU9PVwiTmV0c2NhcGVcIiYmbmF2aWdhdG9yLmFwcFZlcnNpb248XCI1XCImJndpbmRvdy5jcnlwdG8pe3ZhciB6PXdpbmRvdy5jcnlwdG8ucmFuZG9tKDMyKTtmb3IodD0wO3Q8ei5sZW5ndGg7Kyt0KXtybmdfcG9vbFtybmdfcHB0cisrXT16LmNoYXJDb2RlQXQodCkmMjU1fX13aGlsZShybmdfcHB0cjxybmdfcHNpemUpe3Q9TWF0aC5mbG9vcig2NTUzNipNYXRoLnJhbmRvbSgpKTtybmdfcG9vbFtybmdfcHB0cisrXT10Pj4+ODtybmdfcG9vbFtybmdfcHB0cisrXT10JjI1NX1ybmdfcHB0cj0wO3JuZ19zZWVkX3RpbWUoKX1mdW5jdGlvbiBybmdfZ2V0X2J5dGUoKXtpZihybmdfc3RhdGU9PW51bGwpe3JuZ19zZWVkX3RpbWUoKTtybmdfc3RhdGU9cHJuZ19uZXdzdGF0ZSgpO3JuZ19zdGF0ZS5pbml0KHJuZ19wb29sKTtmb3Iocm5nX3BwdHI9MDtybmdfcHB0cjxybmdfcG9vbC5sZW5ndGg7KytybmdfcHB0cil7cm5nX3Bvb2xbcm5nX3BwdHJdPTB9cm5nX3BwdHI9MH1yZXR1cm4gcm5nX3N0YXRlLm5leHQoKX1mdW5jdGlvbiBybmdfZ2V0X2J5dGVzKGIpe3ZhciBhO2ZvcihhPTA7YTxiLmxlbmd0aDsrK2Epe2JbYV09cm5nX2dldF9ieXRlKCl9fWZ1bmN0aW9uIFNlY3VyZVJhbmRvbSgpe31TZWN1cmVSYW5kb20ucHJvdG90eXBlLm5leHRCeXRlcz1ybmdfZ2V0X2J5dGVzO1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQmlnSW50KGIsYSl7cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGIsYSl9ZnVuY3Rpb24gbGluZWJyayhjLGQpe3ZhciBhPVwiXCI7dmFyIGI9MDt3aGlsZShiK2Q8Yy5sZW5ndGgpe2ErPWMuc3Vic3RyaW5nKGIsYitkKStcIlxcblwiO2IrPWR9cmV0dXJuIGErYy5zdWJzdHJpbmcoYixjLmxlbmd0aCl9ZnVuY3Rpb24gYnl0ZTJIZXgoYSl7aWYoYTwxNil7cmV0dXJuXCIwXCIrYS50b1N0cmluZygxNil9ZWxzZXtyZXR1cm4gYS50b1N0cmluZygxNil9fWZ1bmN0aW9uIHBrY3MxcGFkMihlLGgpe2lmKGg8ZS5sZW5ndGgrMTEpe2FsZXJ0KFwiTWVzc2FnZSB0b28gbG9uZyBmb3IgUlNBXCIpO3JldHVybiBudWxsfXZhciBnPW5ldyBBcnJheSgpO3ZhciBkPWUubGVuZ3RoLTE7d2hpbGUoZD49MCYmaD4wKXt2YXIgZj1lLmNoYXJDb2RlQXQoZC0tKTtpZihmPDEyOCl7Z1stLWhdPWZ9ZWxzZXtpZigoZj4xMjcpJiYoZjwyMDQ4KSl7Z1stLWhdPShmJjYzKXwxMjg7Z1stLWhdPShmPj42KXwxOTJ9ZWxzZXtnWy0taF09KGYmNjMpfDEyODtnWy0taF09KChmPj42KSY2Myl8MTI4O2dbLS1oXT0oZj4+MTIpfDIyNH19fWdbLS1oXT0wO3ZhciBiPW5ldyBTZWN1cmVSYW5kb20oKTt2YXIgYT1uZXcgQXJyYXkoKTt3aGlsZShoPjIpe2FbMF09MDt3aGlsZShhWzBdPT0wKXtiLm5leHRCeXRlcyhhKX1nWy0taF09YVswXX1nWy0taF09MjtnWy0taF09MDtyZXR1cm4gbmV3IEJpZ0ludGVnZXIoZyl9ZnVuY3Rpb24gb2FlcF9tZ2YxX2FycihjLGEsZSl7dmFyIGI9XCJcIixkPTA7d2hpbGUoYi5sZW5ndGg8YSl7Yis9ZShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxjLmNvbmNhdChbKGQmNDI3ODE5MDA4MCk+PjI0LChkJjE2NzExNjgwKT4+MTYsKGQmNjUyODApPj44LGQmMjU1XSkpKTtkKz0xfXJldHVybiBifXZhciBTSEExX1NJWkU9MjA7ZnVuY3Rpb24gb2FlcF9wYWQobCxhLGMpe2lmKGwubGVuZ3RoKzIqU0hBMV9TSVpFKzI+YSl7dGhyb3dcIk1lc3NhZ2UgdG9vIGxvbmcgZm9yIFJTQVwifXZhciBoPVwiXCIsZDtmb3IoZD0wO2Q8YS1sLmxlbmd0aC0yKlNIQTFfU0laRS0yO2QrPTEpe2grPVwiXFx4MDBcIn12YXIgZT1yc3RyX3NoYTEoXCJcIikraCtcIlxceDAxXCIrbDt2YXIgZj1uZXcgQXJyYXkoU0hBMV9TSVpFKTtuZXcgU2VjdXJlUmFuZG9tKCkubmV4dEJ5dGVzKGYpO3ZhciBnPW9hZXBfbWdmMV9hcnIoZixlLmxlbmd0aCxjfHxyc3RyX3NoYTEpO3ZhciBrPVtdO2ZvcihkPTA7ZDxlLmxlbmd0aDtkKz0xKXtrW2RdPWUuY2hhckNvZGVBdChkKV5nLmNoYXJDb2RlQXQoZCl9dmFyIGo9b2FlcF9tZ2YxX2FycihrLGYubGVuZ3RoLHJzdHJfc2hhMSk7dmFyIGI9WzBdO2ZvcihkPTA7ZDxmLmxlbmd0aDtkKz0xKXtiW2QrMV09ZltkXV5qLmNoYXJDb2RlQXQoZCl9cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGIuY29uY2F0KGspKX1mdW5jdGlvbiBSU0FLZXkoKXt0aGlzLm49bnVsbDt0aGlzLmU9MDt0aGlzLmQ9bnVsbDt0aGlzLnA9bnVsbDt0aGlzLnE9bnVsbDt0aGlzLmRtcDE9bnVsbDt0aGlzLmRtcTE9bnVsbDt0aGlzLmNvZWZmPW51bGx9ZnVuY3Rpb24gUlNBU2V0UHVibGljKGIsYSl7dGhpcy5pc1B1YmxpYz10cnVlO2lmKHR5cGVvZiBiIT09XCJzdHJpbmdcIil7dGhpcy5uPWI7dGhpcy5lPWF9ZWxzZXtpZihiIT1udWxsJiZhIT1udWxsJiZiLmxlbmd0aD4wJiZhLmxlbmd0aD4wKXt0aGlzLm49cGFyc2VCaWdJbnQoYiwxNik7dGhpcy5lPXBhcnNlSW50KGEsMTYpfWVsc2V7YWxlcnQoXCJJbnZhbGlkIFJTQSBwdWJsaWMga2V5XCIpfX19ZnVuY3Rpb24gUlNBRG9QdWJsaWMoYSl7cmV0dXJuIGEubW9kUG93SW50KHRoaXMuZSx0aGlzLm4pfWZ1bmN0aW9uIFJTQUVuY3J5cHQoZCl7dmFyIGE9cGtjczFwYWQyKGQsKHRoaXMubi5iaXRMZW5ndGgoKSs3KT4+Myk7aWYoYT09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGU9dGhpcy5kb1B1YmxpYyhhKTtpZihlPT1udWxsKXtyZXR1cm4gbnVsbH12YXIgYj1lLnRvU3RyaW5nKDE2KTtpZigoYi5sZW5ndGgmMSk9PTApe3JldHVybiBifWVsc2V7cmV0dXJuXCIwXCIrYn19ZnVuY3Rpb24gUlNBRW5jcnlwdE9BRVAoZSxkKXt2YXIgYT1vYWVwX3BhZChlLCh0aGlzLm4uYml0TGVuZ3RoKCkrNyk+PjMsZCk7aWYoYT09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGY9dGhpcy5kb1B1YmxpYyhhKTtpZihmPT1udWxsKXtyZXR1cm4gbnVsbH12YXIgYj1mLnRvU3RyaW5nKDE2KTtpZigoYi5sZW5ndGgmMSk9PTApe3JldHVybiBifWVsc2V7cmV0dXJuXCIwXCIrYn19UlNBS2V5LnByb3RvdHlwZS5kb1B1YmxpYz1SU0FEb1B1YmxpYztSU0FLZXkucHJvdG90eXBlLnNldFB1YmxpYz1SU0FTZXRQdWJsaWM7UlNBS2V5LnByb3RvdHlwZS5lbmNyeXB0PVJTQUVuY3J5cHQ7UlNBS2V5LnByb3RvdHlwZS5lbmNyeXB0T0FFUD1SU0FFbmNyeXB0T0FFUDtSU0FLZXkucHJvdG90eXBlLnR5cGU9XCJSU0FcIjtcbi8qISAoYykgVG9tIFd1IHwgaHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfnRqdy9qc2JuL1xuICovXG5mdW5jdGlvbiBwa2NzMXVucGFkMihnLGope3ZhciBhPWcudG9CeXRlQXJyYXkoKTt2YXIgZj0wO3doaWxlKGY8YS5sZW5ndGgmJmFbZl09PTApeysrZn1pZihhLmxlbmd0aC1mIT1qLTF8fGFbZl0hPTIpe3JldHVybiBudWxsfSsrZjt3aGlsZShhW2ZdIT0wKXtpZigrK2Y+PWEubGVuZ3RoKXtyZXR1cm4gbnVsbH19dmFyIGU9XCJcIjt3aGlsZSgrK2Y8YS5sZW5ndGgpe3ZhciBoPWFbZl0mMjU1O2lmKGg8MTI4KXtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGgpfWVsc2V7aWYoKGg+MTkxKSYmKGg8MjI0KSl7ZSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoKGgmMzEpPDw2KXwoYVtmKzFdJjYzKSk7KytmfWVsc2V7ZSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoKGgmMTUpPDwxMil8KChhW2YrMV0mNjMpPDw2KXwoYVtmKzJdJjYzKSk7Zis9Mn19fXJldHVybiBlfWZ1bmN0aW9uIG9hZXBfbWdmMV9zdHIoYyxhLGUpe3ZhciBiPVwiXCIsZD0wO3doaWxlKGIubGVuZ3RoPGEpe2IrPWUoYytTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxbKGQmNDI3ODE5MDA4MCk+PjI0LChkJjE2NzExNjgwKT4+MTYsKGQmNjUyODApPj44LGQmMjU1XSkpO2QrPTF9cmV0dXJuIGJ9dmFyIFNIQTFfU0laRT0yMDtmdW5jdGlvbiBvYWVwX3VucGFkKGwsYixlKXtsPWwudG9CeXRlQXJyYXkoKTt2YXIgZjtmb3IoZj0wO2Y8bC5sZW5ndGg7Zis9MSl7bFtmXSY9MjU1fXdoaWxlKGwubGVuZ3RoPGIpe2wudW5zaGlmdCgwKX1sPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGwpO2lmKGwubGVuZ3RoPDIqU0hBMV9TSVpFKzIpe3Rocm93XCJDaXBoZXIgdG9vIHNob3J0XCJ9dmFyIGM9bC5zdWJzdHIoMSxTSEExX1NJWkUpO3ZhciBvPWwuc3Vic3RyKFNIQTFfU0laRSsxKTt2YXIgbT1vYWVwX21nZjFfc3RyKG8sU0hBMV9TSVpFLGV8fHJzdHJfc2hhMSk7dmFyIGg9W10sZjtmb3IoZj0wO2Y8Yy5sZW5ndGg7Zis9MSl7aFtmXT1jLmNoYXJDb2RlQXQoZilebS5jaGFyQ29kZUF0KGYpfXZhciBqPW9hZXBfbWdmMV9zdHIoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsaCksbC5sZW5ndGgtU0hBMV9TSVpFLHJzdHJfc2hhMSk7dmFyIGc9W107Zm9yKGY9MDtmPG8ubGVuZ3RoO2YrPTEpe2dbZl09by5jaGFyQ29kZUF0KGYpXmouY2hhckNvZGVBdChmKX1nPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGcpO2lmKGcuc3Vic3RyKDAsU0hBMV9TSVpFKSE9PXJzdHJfc2hhMShcIlwiKSl7dGhyb3dcIkhhc2ggbWlzbWF0Y2hcIn1nPWcuc3Vic3RyKFNIQTFfU0laRSk7dmFyIGE9Zy5pbmRleE9mKFwiXFx4MDFcIik7dmFyIGs9KGEhPS0xKT9nLnN1YnN0cigwLGEpLmxhc3RJbmRleE9mKFwiXFx4MDBcIik6LTE7aWYoaysxIT1hKXt0aHJvd1wiTWFsZm9ybWVkIGRhdGFcIn1yZXR1cm4gZy5zdWJzdHIoYSsxKX1mdW5jdGlvbiBSU0FTZXRQcml2YXRlKGMsYSxiKXt0aGlzLmlzUHJpdmF0ZT10cnVlO2lmKHR5cGVvZiBjIT09XCJzdHJpbmdcIil7dGhpcy5uPWM7dGhpcy5lPWE7dGhpcy5kPWJ9ZWxzZXtpZihjIT1udWxsJiZhIT1udWxsJiZjLmxlbmd0aD4wJiZhLmxlbmd0aD4wKXt0aGlzLm49cGFyc2VCaWdJbnQoYywxNik7dGhpcy5lPXBhcnNlSW50KGEsMTYpO3RoaXMuZD1wYXJzZUJpZ0ludChiLDE2KX1lbHNle2FsZXJ0KFwiSW52YWxpZCBSU0EgcHJpdmF0ZSBrZXlcIil9fX1mdW5jdGlvbiBSU0FTZXRQcml2YXRlRXgoZyxkLGUsYyxiLGEsaCxmKXt0aGlzLmlzUHJpdmF0ZT10cnVlO2lmKGc9PW51bGwpe3Rocm93XCJSU0FTZXRQcml2YXRlRXggTiA9PSBudWxsXCJ9aWYoZD09bnVsbCl7dGhyb3dcIlJTQVNldFByaXZhdGVFeCBFID09IG51bGxcIn1pZihnLmxlbmd0aD09MCl7dGhyb3dcIlJTQVNldFByaXZhdGVFeCBOLmxlbmd0aCA9PSAwXCJ9aWYoZC5sZW5ndGg9PTApe3Rocm93XCJSU0FTZXRQcml2YXRlRXggRS5sZW5ndGggPT0gMFwifWlmKGchPW51bGwmJmQhPW51bGwmJmcubGVuZ3RoPjAmJmQubGVuZ3RoPjApe3RoaXMubj1wYXJzZUJpZ0ludChnLDE2KTt0aGlzLmU9cGFyc2VJbnQoZCwxNik7dGhpcy5kPXBhcnNlQmlnSW50KGUsMTYpO3RoaXMucD1wYXJzZUJpZ0ludChjLDE2KTt0aGlzLnE9cGFyc2VCaWdJbnQoYiwxNik7dGhpcy5kbXAxPXBhcnNlQmlnSW50KGEsMTYpO3RoaXMuZG1xMT1wYXJzZUJpZ0ludChoLDE2KTt0aGlzLmNvZWZmPXBhcnNlQmlnSW50KGYsMTYpfWVsc2V7YWxlcnQoXCJJbnZhbGlkIFJTQSBwcml2YXRlIGtleSBpbiBSU0FTZXRQcml2YXRlRXhcIil9fWZ1bmN0aW9uIFJTQUdlbmVyYXRlKGIsaSl7dmFyIGE9bmV3IFNlY3VyZVJhbmRvbSgpO3ZhciBmPWI+PjE7dGhpcy5lPXBhcnNlSW50KGksMTYpO3ZhciBjPW5ldyBCaWdJbnRlZ2VyKGksMTYpO2Zvcig7Oyl7Zm9yKDs7KXt0aGlzLnA9bmV3IEJpZ0ludGVnZXIoYi1mLDEsYSk7aWYodGhpcy5wLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKS5nY2QoYykuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKT09MCYmdGhpcy5wLmlzUHJvYmFibGVQcmltZSgxMCkpe2JyZWFrfX1mb3IoOzspe3RoaXMucT1uZXcgQmlnSW50ZWdlcihmLDEsYSk7aWYodGhpcy5xLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKS5nY2QoYykuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKT09MCYmdGhpcy5xLmlzUHJvYmFibGVQcmltZSgxMCkpe2JyZWFrfX1pZih0aGlzLnAuY29tcGFyZVRvKHRoaXMucSk8PTApe3ZhciBoPXRoaXMucDt0aGlzLnA9dGhpcy5xO3RoaXMucT1ofXZhciBnPXRoaXMucC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7dmFyIGQ9dGhpcy5xLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTt2YXIgZT1nLm11bHRpcGx5KGQpO2lmKGUuZ2NkKGMpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk9PTApe3RoaXMubj10aGlzLnAubXVsdGlwbHkodGhpcy5xKTt0aGlzLmQ9Yy5tb2RJbnZlcnNlKGUpO3RoaXMuZG1wMT10aGlzLmQubW9kKGcpO3RoaXMuZG1xMT10aGlzLmQubW9kKGQpO3RoaXMuY29lZmY9dGhpcy5xLm1vZEludmVyc2UodGhpcy5wKTticmVha319fWZ1bmN0aW9uIFJTQURvUHJpdmF0ZShhKXtpZih0aGlzLnA9PW51bGx8fHRoaXMucT09bnVsbCl7cmV0dXJuIGEubW9kUG93KHRoaXMuZCx0aGlzLm4pfXZhciBjPWEubW9kKHRoaXMucCkubW9kUG93KHRoaXMuZG1wMSx0aGlzLnApO3ZhciBiPWEubW9kKHRoaXMucSkubW9kUG93KHRoaXMuZG1xMSx0aGlzLnEpO3doaWxlKGMuY29tcGFyZVRvKGIpPDApe2M9Yy5hZGQodGhpcy5wKX1yZXR1cm4gYy5zdWJ0cmFjdChiKS5tdWx0aXBseSh0aGlzLmNvZWZmKS5tb2QodGhpcy5wKS5tdWx0aXBseSh0aGlzLnEpLmFkZChiKX1mdW5jdGlvbiBSU0FEZWNyeXB0KGIpe3ZhciBkPXBhcnNlQmlnSW50KGIsMTYpO3ZhciBhPXRoaXMuZG9Qcml2YXRlKGQpO2lmKGE9PW51bGwpe3JldHVybiBudWxsfXJldHVybiBwa2NzMXVucGFkMihhLCh0aGlzLm4uYml0TGVuZ3RoKCkrNyk+PjMpfWZ1bmN0aW9uIFJTQURlY3J5cHRPQUVQKGQsYil7dmFyIGU9cGFyc2VCaWdJbnQoZCwxNik7dmFyIGE9dGhpcy5kb1ByaXZhdGUoZSk7aWYoYT09bnVsbCl7cmV0dXJuIG51bGx9cmV0dXJuIG9hZXBfdW5wYWQoYSwodGhpcy5uLmJpdExlbmd0aCgpKzcpPj4zLGIpfVJTQUtleS5wcm90b3R5cGUuZG9Qcml2YXRlPVJTQURvUHJpdmF0ZTtSU0FLZXkucHJvdG90eXBlLnNldFByaXZhdGU9UlNBU2V0UHJpdmF0ZTtSU0FLZXkucHJvdG90eXBlLnNldFByaXZhdGVFeD1SU0FTZXRQcml2YXRlRXg7UlNBS2V5LnByb3RvdHlwZS5nZW5lcmF0ZT1SU0FHZW5lcmF0ZTtSU0FLZXkucHJvdG90eXBlLmRlY3J5cHQ9UlNBRGVjcnlwdDtSU0FLZXkucHJvdG90eXBlLmRlY3J5cHRPQUVQPVJTQURlY3J5cHRPQUVQO1xuLyohIChjKSBUb20gV3UgfCBodHRwOi8vd3d3LWNzLXN0dWRlbnRzLnN0YW5mb3JkLmVkdS9+dGp3L2pzYm4vXG4gKi9cbmZ1bmN0aW9uIEVDRmllbGRFbGVtZW50RnAoYixhKXt0aGlzLng9YTt0aGlzLnE9Yn1mdW5jdGlvbiBmZUZwRXF1YWxzKGEpe2lmKGE9PXRoaXMpe3JldHVybiB0cnVlfXJldHVybih0aGlzLnEuZXF1YWxzKGEucSkmJnRoaXMueC5lcXVhbHMoYS54KSl9ZnVuY3Rpb24gZmVGcFRvQmlnSW50ZWdlcigpe3JldHVybiB0aGlzLnh9ZnVuY3Rpb24gZmVGcE5lZ2F0ZSgpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54Lm5lZ2F0ZSgpLm1vZCh0aGlzLnEpKX1mdW5jdGlvbiBmZUZwQWRkKGEpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54LmFkZChhLnRvQmlnSW50ZWdlcigpKS5tb2QodGhpcy5xKSl9ZnVuY3Rpb24gZmVGcFN1YnRyYWN0KGEpe3JldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsdGhpcy54LnN1YnRyYWN0KGEudG9CaWdJbnRlZ2VyKCkpLm1vZCh0aGlzLnEpKX1mdW5jdGlvbiBmZUZwTXVsdGlwbHkoYSl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSx0aGlzLngubXVsdGlwbHkoYS50b0JpZ0ludGVnZXIoKSkubW9kKHRoaXMucSkpfWZ1bmN0aW9uIGZlRnBTcXVhcmUoKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5zcXVhcmUoKS5tb2QodGhpcy5xKSl9ZnVuY3Rpb24gZmVGcERpdmlkZShhKXtyZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5tdWx0aXBseShhLnRvQmlnSW50ZWdlcigpLm1vZEludmVyc2UodGhpcy5xKSkubW9kKHRoaXMucSkpfUVDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLmVxdWFscz1mZUZwRXF1YWxzO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLnRvQmlnSW50ZWdlcj1mZUZwVG9CaWdJbnRlZ2VyO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLm5lZ2F0ZT1mZUZwTmVnYXRlO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLmFkZD1mZUZwQWRkO0VDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLnN1YnRyYWN0PWZlRnBTdWJ0cmFjdDtFQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5tdWx0aXBseT1mZUZwTXVsdGlwbHk7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuc3F1YXJlPWZlRnBTcXVhcmU7RUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuZGl2aWRlPWZlRnBEaXZpZGU7ZnVuY3Rpb24gRUNQb2ludEZwKGMsYSxkLGIpe3RoaXMuY3VydmU9Yzt0aGlzLng9YTt0aGlzLnk9ZDtpZihiPT1udWxsKXt0aGlzLno9QmlnSW50ZWdlci5PTkV9ZWxzZXt0aGlzLno9Yn10aGlzLnppbnY9bnVsbH1mdW5jdGlvbiBwb2ludEZwR2V0WCgpe2lmKHRoaXMuemludj09bnVsbCl7dGhpcy56aW52PXRoaXMuei5tb2RJbnZlcnNlKHRoaXMuY3VydmUucSl9cmV0dXJuIHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIodGhpcy54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMuemludikubW9kKHRoaXMuY3VydmUucSkpfWZ1bmN0aW9uIHBvaW50RnBHZXRZKCl7aWYodGhpcy56aW52PT1udWxsKXt0aGlzLnppbnY9dGhpcy56Lm1vZEludmVyc2UodGhpcy5jdXJ2ZS5xKX1yZXR1cm4gdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcih0aGlzLnkudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56aW52KS5tb2QodGhpcy5jdXJ2ZS5xKSl9ZnVuY3Rpb24gcG9pbnRGcEVxdWFscyhhKXtpZihhPT10aGlzKXtyZXR1cm4gdHJ1ZX1pZih0aGlzLmlzSW5maW5pdHkoKSl7cmV0dXJuIGEuaXNJbmZpbml0eSgpfWlmKGEuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCl9dmFyIGMsYjtjPWEueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnopLnN1YnRyYWN0KHRoaXMueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseShhLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtpZighYy5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKSl7cmV0dXJuIGZhbHNlfWI9YS54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KGEueikpLm1vZCh0aGlzLmN1cnZlLnEpO3JldHVybiBiLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pfWZ1bmN0aW9uIHBvaW50RnBJc0luZmluaXR5KCl7aWYoKHRoaXMueD09bnVsbCkmJih0aGlzLnk9PW51bGwpKXtyZXR1cm4gdHJ1ZX1yZXR1cm4gdGhpcy56LmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pJiYhdGhpcy55LnRvQmlnSW50ZWdlcigpLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pfWZ1bmN0aW9uIHBvaW50RnBOZWdhdGUoKXtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLHRoaXMueCx0aGlzLnkubmVnYXRlKCksdGhpcy56KX1mdW5jdGlvbiBwb2ludEZwQWRkKGwpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gbH1pZihsLmlzSW5maW5pdHkoKSl7cmV0dXJuIHRoaXN9dmFyIHA9bC55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KGwueikpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBvPWwueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnopLnN1YnRyYWN0KHRoaXMueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseShsLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtpZihCaWdJbnRlZ2VyLlpFUk8uZXF1YWxzKG8pKXtpZihCaWdJbnRlZ2VyLlpFUk8uZXF1YWxzKHApKXtyZXR1cm4gdGhpcy50d2ljZSgpfXJldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGo9bmV3IEJpZ0ludGVnZXIoXCIzXCIpO3ZhciBlPXRoaXMueC50b0JpZ0ludGVnZXIoKTt2YXIgbj10aGlzLnkudG9CaWdJbnRlZ2VyKCk7dmFyIGM9bC54LnRvQmlnSW50ZWdlcigpO3ZhciBrPWwueS50b0JpZ0ludGVnZXIoKTt2YXIgbT1vLnNxdWFyZSgpO3ZhciBpPW0ubXVsdGlwbHkobyk7dmFyIGQ9ZS5tdWx0aXBseShtKTt2YXIgZz1wLnNxdWFyZSgpLm11bHRpcGx5KHRoaXMueik7dmFyIGE9Zy5zdWJ0cmFjdChkLnNoaWZ0TGVmdCgxKSkubXVsdGlwbHkobC56KS5zdWJ0cmFjdChpKS5tdWx0aXBseShvKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgaD1kLm11bHRpcGx5KGopLm11bHRpcGx5KHApLnN1YnRyYWN0KG4ubXVsdGlwbHkoaSkpLnN1YnRyYWN0KGcubXVsdGlwbHkocCkpLm11bHRpcGx5KGwueikuYWRkKHAubXVsdGlwbHkoaSkpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBmPWkubXVsdGlwbHkodGhpcy56KS5tdWx0aXBseShsLnopLm1vZCh0aGlzLmN1cnZlLnEpO3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihhKSx0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKGgpLGYpfWZ1bmN0aW9uIHBvaW50RnBUd2ljZSgpe2lmKHRoaXMuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc31pZih0aGlzLnkudG9CaWdJbnRlZ2VyKCkuc2lnbnVtKCk9PTApe3JldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGc9bmV3IEJpZ0ludGVnZXIoXCIzXCIpO3ZhciBjPXRoaXMueC50b0JpZ0ludGVnZXIoKTt2YXIgaD10aGlzLnkudG9CaWdJbnRlZ2VyKCk7dmFyIGU9aC5tdWx0aXBseSh0aGlzLnopO3ZhciBqPWUubXVsdGlwbHkoaCkubW9kKHRoaXMuY3VydmUucSk7dmFyIGk9dGhpcy5jdXJ2ZS5hLnRvQmlnSW50ZWdlcigpO3ZhciBrPWMuc3F1YXJlKCkubXVsdGlwbHkoZyk7aWYoIUJpZ0ludGVnZXIuWkVSTy5lcXVhbHMoaSkpe2s9ay5hZGQodGhpcy56LnNxdWFyZSgpLm11bHRpcGx5KGkpKX1rPWsubW9kKHRoaXMuY3VydmUucSk7dmFyIGI9ay5zcXVhcmUoKS5zdWJ0cmFjdChjLnNoaWZ0TGVmdCgzKS5tdWx0aXBseShqKSkuc2hpZnRMZWZ0KDEpLm11bHRpcGx5KGUpLm1vZCh0aGlzLmN1cnZlLnEpO3ZhciBmPWsubXVsdGlwbHkoZykubXVsdGlwbHkoYykuc3VidHJhY3Qoai5zaGlmdExlZnQoMSkpLnNoaWZ0TGVmdCgyKS5tdWx0aXBseShqKS5zdWJ0cmFjdChrLnNxdWFyZSgpLm11bHRpcGx5KGspKS5tb2QodGhpcy5jdXJ2ZS5xKTt2YXIgZD1lLnNxdWFyZSgpLm11bHRpcGx5KGUpLnNoaWZ0TGVmdCgzKS5tb2QodGhpcy5jdXJ2ZS5xKTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoYiksdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihmKSxkKX1mdW5jdGlvbiBwb2ludEZwTXVsdGlwbHkoYil7aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzfWlmKGIuc2lnbnVtKCk9PTApe3JldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGc9Yjt2YXIgZj1nLm11bHRpcGx5KG5ldyBCaWdJbnRlZ2VyKFwiM1wiKSk7dmFyIGw9dGhpcy5uZWdhdGUoKTt2YXIgZD10aGlzO3ZhciBjO2ZvcihjPWYuYml0TGVuZ3RoKCktMjtjPjA7LS1jKXtkPWQudHdpY2UoKTt2YXIgYT1mLnRlc3RCaXQoYyk7dmFyIGo9Zy50ZXN0Qml0KGMpO2lmKGEhPWope2Q9ZC5hZGQoYT90aGlzOmwpfX1yZXR1cm4gZH1mdW5jdGlvbiBwb2ludEZwTXVsdGlwbHlUd28oYyxhLGIpe3ZhciBkO2lmKGMuYml0TGVuZ3RoKCk+Yi5iaXRMZW5ndGgoKSl7ZD1jLmJpdExlbmd0aCgpLTF9ZWxzZXtkPWIuYml0TGVuZ3RoKCktMX12YXIgZj10aGlzLmN1cnZlLmdldEluZmluaXR5KCk7dmFyIGU9dGhpcy5hZGQoYSk7d2hpbGUoZD49MCl7Zj1mLnR3aWNlKCk7aWYoYy50ZXN0Qml0KGQpKXtpZihiLnRlc3RCaXQoZCkpe2Y9Zi5hZGQoZSl9ZWxzZXtmPWYuYWRkKHRoaXMpfX1lbHNle2lmKGIudGVzdEJpdChkKSl7Zj1mLmFkZChhKX19LS1kfXJldHVybiBmfUVDUG9pbnRGcC5wcm90b3R5cGUuZ2V0WD1wb2ludEZwR2V0WDtFQ1BvaW50RnAucHJvdG90eXBlLmdldFk9cG9pbnRGcEdldFk7RUNQb2ludEZwLnByb3RvdHlwZS5lcXVhbHM9cG9pbnRGcEVxdWFscztFQ1BvaW50RnAucHJvdG90eXBlLmlzSW5maW5pdHk9cG9pbnRGcElzSW5maW5pdHk7RUNQb2ludEZwLnByb3RvdHlwZS5uZWdhdGU9cG9pbnRGcE5lZ2F0ZTtFQ1BvaW50RnAucHJvdG90eXBlLmFkZD1wb2ludEZwQWRkO0VDUG9pbnRGcC5wcm90b3R5cGUudHdpY2U9cG9pbnRGcFR3aWNlO0VDUG9pbnRGcC5wcm90b3R5cGUubXVsdGlwbHk9cG9pbnRGcE11bHRpcGx5O0VDUG9pbnRGcC5wcm90b3R5cGUubXVsdGlwbHlUd289cG9pbnRGcE11bHRpcGx5VHdvO2Z1bmN0aW9uIEVDQ3VydmVGcChlLGQsYyl7dGhpcy5xPWU7dGhpcy5hPXRoaXMuZnJvbUJpZ0ludGVnZXIoZCk7dGhpcy5iPXRoaXMuZnJvbUJpZ0ludGVnZXIoYyk7dGhpcy5pbmZpbml0eT1uZXcgRUNQb2ludEZwKHRoaXMsbnVsbCxudWxsKX1mdW5jdGlvbiBjdXJ2ZUZwR2V0USgpe3JldHVybiB0aGlzLnF9ZnVuY3Rpb24gY3VydmVGcEdldEEoKXtyZXR1cm4gdGhpcy5hfWZ1bmN0aW9uIGN1cnZlRnBHZXRCKCl7cmV0dXJuIHRoaXMuYn1mdW5jdGlvbiBjdXJ2ZUZwRXF1YWxzKGEpe2lmKGE9PXRoaXMpe3JldHVybiB0cnVlfXJldHVybih0aGlzLnEuZXF1YWxzKGEucSkmJnRoaXMuYS5lcXVhbHMoYS5hKSYmdGhpcy5iLmVxdWFscyhhLmIpKX1mdW5jdGlvbiBjdXJ2ZUZwR2V0SW5maW5pdHkoKXtyZXR1cm4gdGhpcy5pbmZpbml0eX1mdW5jdGlvbiBjdXJ2ZUZwRnJvbUJpZ0ludGVnZXIoYSl7cmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSxhKX1mdW5jdGlvbiBjdXJ2ZUZwRGVjb2RlUG9pbnRIZXgoZCl7c3dpdGNoKHBhcnNlSW50KGQuc3Vic3RyKDAsMiksMTYpKXtjYXNlIDA6cmV0dXJuIHRoaXMuaW5maW5pdHk7Y2FzZSAyOmNhc2UgMzpyZXR1cm4gbnVsbDtjYXNlIDQ6Y2FzZSA2OmNhc2UgNzp2YXIgYT0oZC5sZW5ndGgtMikvMjt2YXIgYz1kLnN1YnN0cigyLGEpO3ZhciBiPWQuc3Vic3RyKGErMixhKTtyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLHRoaXMuZnJvbUJpZ0ludGVnZXIobmV3IEJpZ0ludGVnZXIoYywxNikpLHRoaXMuZnJvbUJpZ0ludGVnZXIobmV3IEJpZ0ludGVnZXIoYiwxNikpKTtkZWZhdWx0OnJldHVybiBudWxsfX1FQ0N1cnZlRnAucHJvdG90eXBlLmdldFE9Y3VydmVGcEdldFE7RUNDdXJ2ZUZwLnByb3RvdHlwZS5nZXRBPWN1cnZlRnBHZXRBO0VDQ3VydmVGcC5wcm90b3R5cGUuZ2V0Qj1jdXJ2ZUZwR2V0QjtFQ0N1cnZlRnAucHJvdG90eXBlLmVxdWFscz1jdXJ2ZUZwRXF1YWxzO0VDQ3VydmVGcC5wcm90b3R5cGUuZ2V0SW5maW5pdHk9Y3VydmVGcEdldEluZmluaXR5O0VDQ3VydmVGcC5wcm90b3R5cGUuZnJvbUJpZ0ludGVnZXI9Y3VydmVGcEZyb21CaWdJbnRlZ2VyO0VDQ3VydmVGcC5wcm90b3R5cGUuZGVjb2RlUG9pbnRIZXg9Y3VydmVGcERlY29kZVBvaW50SGV4O1xuLyohIChjKSBTdGVmYW4gVGhvbWFzIHwgaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW5qcy9iaXRjb2luanMtbGliXG4gKi9cbkVDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLmdldEJ5dGVMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5mbG9vcigodGhpcy50b0JpZ0ludGVnZXIoKS5iaXRMZW5ndGgoKSs3KS84KX07RUNQb2ludEZwLnByb3RvdHlwZS5nZXRFbmNvZGVkPWZ1bmN0aW9uKGMpe3ZhciBkPWZ1bmN0aW9uKGgsZil7dmFyIGc9aC50b0J5dGVBcnJheVVuc2lnbmVkKCk7aWYoZjxnLmxlbmd0aCl7Zz1nLnNsaWNlKGcubGVuZ3RoLWYpfWVsc2V7d2hpbGUoZj5nLmxlbmd0aCl7Zy51bnNoaWZ0KDApfX1yZXR1cm4gZ307dmFyIGE9dGhpcy5nZXRYKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGU9dGhpcy5nZXRZKCkudG9CaWdJbnRlZ2VyKCk7dmFyIGI9ZChhLDMyKTtpZihjKXtpZihlLmlzRXZlbigpKXtiLnVuc2hpZnQoMil9ZWxzZXtiLnVuc2hpZnQoMyl9fWVsc2V7Yi51bnNoaWZ0KDQpO2I9Yi5jb25jYXQoZChlLDMyKSl9cmV0dXJuIGJ9O0VDUG9pbnRGcC5kZWNvZGVGcm9tPWZ1bmN0aW9uKGcsYyl7dmFyIGY9Y1swXTt2YXIgZT1jLmxlbmd0aC0xO3ZhciBkPWMuc2xpY2UoMSwxK2UvMik7dmFyIGI9Yy5zbGljZSgxK2UvMiwxK2UpO2QudW5zaGlmdCgwKTtiLnVuc2hpZnQoMCk7dmFyIGE9bmV3IEJpZ0ludGVnZXIoZCk7dmFyIGg9bmV3IEJpZ0ludGVnZXIoYik7cmV0dXJuIG5ldyBFQ1BvaW50RnAoZyxnLmZyb21CaWdJbnRlZ2VyKGEpLGcuZnJvbUJpZ0ludGVnZXIoaCkpfTtFQ1BvaW50RnAuZGVjb2RlRnJvbUhleD1mdW5jdGlvbihnLGMpe3ZhciBmPWMuc3Vic3RyKDAsMik7dmFyIGU9Yy5sZW5ndGgtMjt2YXIgZD1jLnN1YnN0cigyLGUvMik7dmFyIGI9Yy5zdWJzdHIoMitlLzIsZS8yKTt2YXIgYT1uZXcgQmlnSW50ZWdlcihkLDE2KTt2YXIgaD1uZXcgQmlnSW50ZWdlcihiLDE2KTtyZXR1cm4gbmV3IEVDUG9pbnRGcChnLGcuZnJvbUJpZ0ludGVnZXIoYSksZy5mcm9tQmlnSW50ZWdlcihoKSl9O0VDUG9pbnRGcC5wcm90b3R5cGUuYWRkMkQ9ZnVuY3Rpb24oYyl7aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiBjfWlmKGMuaXNJbmZpbml0eSgpKXtyZXR1cm4gdGhpc31pZih0aGlzLnguZXF1YWxzKGMueCkpe2lmKHRoaXMueS5lcXVhbHMoYy55KSl7cmV0dXJuIHRoaXMudHdpY2UoKX1yZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpfXZhciBnPWMueC5zdWJ0cmFjdCh0aGlzLngpO3ZhciBlPWMueS5zdWJ0cmFjdCh0aGlzLnkpO3ZhciBhPWUuZGl2aWRlKGcpO3ZhciBkPWEuc3F1YXJlKCkuc3VidHJhY3QodGhpcy54KS5zdWJ0cmFjdChjLngpO3ZhciBmPWEubXVsdGlwbHkodGhpcy54LnN1YnRyYWN0KGQpKS5zdWJ0cmFjdCh0aGlzLnkpO3JldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsZCxmKX07RUNQb2ludEZwLnByb3RvdHlwZS50d2ljZTJEPWZ1bmN0aW9uKCl7aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzfWlmKHRoaXMueS50b0JpZ0ludGVnZXIoKS5zaWdudW0oKT09MCl7cmV0dXJuIHRoaXMuY3VydmUuZ2V0SW5maW5pdHkoKX12YXIgYj10aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZigyKSk7dmFyIGU9dGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoMykpO3ZhciBhPXRoaXMueC5zcXVhcmUoKS5tdWx0aXBseShlKS5hZGQodGhpcy5jdXJ2ZS5hKS5kaXZpZGUodGhpcy55Lm11bHRpcGx5KGIpKTt2YXIgYz1hLnNxdWFyZSgpLnN1YnRyYWN0KHRoaXMueC5tdWx0aXBseShiKSk7dmFyIGQ9YS5tdWx0aXBseSh0aGlzLnguc3VidHJhY3QoYykpLnN1YnRyYWN0KHRoaXMueSk7cmV0dXJuIG5ldyBFQ1BvaW50RnAodGhpcy5jdXJ2ZSxjLGQpfTtFQ1BvaW50RnAucHJvdG90eXBlLm11bHRpcGx5MkQ9ZnVuY3Rpb24oYil7aWYodGhpcy5pc0luZmluaXR5KCkpe3JldHVybiB0aGlzfWlmKGIuc2lnbnVtKCk9PTApe3JldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCl9dmFyIGc9Yjt2YXIgZj1nLm11bHRpcGx5KG5ldyBCaWdJbnRlZ2VyKFwiM1wiKSk7dmFyIGw9dGhpcy5uZWdhdGUoKTt2YXIgZD10aGlzO3ZhciBjO2ZvcihjPWYuYml0TGVuZ3RoKCktMjtjPjA7LS1jKXtkPWQudHdpY2UoKTt2YXIgYT1mLnRlc3RCaXQoYyk7dmFyIGo9Zy50ZXN0Qml0KGMpO2lmKGEhPWope2Q9ZC5hZGQyRChhP3RoaXM6bCl9fXJldHVybiBkfTtFQ1BvaW50RnAucHJvdG90eXBlLmlzT25DdXJ2ZT1mdW5jdGlvbigpe3ZhciBkPXRoaXMuZ2V0WCgpLnRvQmlnSW50ZWdlcigpO3ZhciBpPXRoaXMuZ2V0WSgpLnRvQmlnSW50ZWdlcigpO3ZhciBmPXRoaXMuY3VydmUuZ2V0QSgpLnRvQmlnSW50ZWdlcigpO3ZhciBjPXRoaXMuY3VydmUuZ2V0QigpLnRvQmlnSW50ZWdlcigpO3ZhciBoPXRoaXMuY3VydmUuZ2V0USgpO3ZhciBlPWkubXVsdGlwbHkoaSkubW9kKGgpO3ZhciBnPWQubXVsdGlwbHkoZCkubXVsdGlwbHkoZCkuYWRkKGYubXVsdGlwbHkoZCkpLmFkZChjKS5tb2QoaCk7cmV0dXJuIGUuZXF1YWxzKGcpfTtFQ1BvaW50RnAucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCIoXCIrdGhpcy5nZXRYKCkudG9CaWdJbnRlZ2VyKCkudG9TdHJpbmcoKStcIixcIit0aGlzLmdldFkoKS50b0JpZ0ludGVnZXIoKS50b1N0cmluZygpK1wiKVwifTtFQ1BvaW50RnAucHJvdG90eXBlLnZhbGlkYXRlPWZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5jdXJ2ZS5nZXRRKCk7aWYodGhpcy5pc0luZmluaXR5KCkpe3Rocm93IG5ldyBFcnJvcihcIlBvaW50IGlzIGF0IGluZmluaXR5LlwiKX12YXIgYT10aGlzLmdldFgoKS50b0JpZ0ludGVnZXIoKTt2YXIgYj10aGlzLmdldFkoKS50b0JpZ0ludGVnZXIoKTtpZihhLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk8MHx8YS5jb21wYXJlVG8oYy5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpPjApe3Rocm93IG5ldyBFcnJvcihcInggY29vcmRpbmF0ZSBvdXQgb2YgYm91bmRzXCIpfWlmKGIuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKTwwfHxiLmNvbXBhcmVUbyhjLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk+MCl7dGhyb3cgbmV3IEVycm9yKFwieSBjb29yZGluYXRlIG91dCBvZiBib3VuZHNcIil9aWYoIXRoaXMuaXNPbkN1cnZlKCkpe3Rocm93IG5ldyBFcnJvcihcIlBvaW50IGlzIG5vdCBvbiB0aGUgY3VydmUuXCIpfWlmKHRoaXMubXVsdGlwbHkoYykuaXNJbmZpbml0eSgpKXt0aHJvdyBuZXcgRXJyb3IoXCJQb2ludCBpcyBub3QgYSBzY2FsYXIgbXVsdGlwbGUgb2YgRy5cIil9cmV0dXJuIHRydWV9O1xuLyohIE1pa2UgU2FtdWVsIChjKSAyMDA5IHwgY29kZS5nb29nbGUuY29tL3AvanNvbi1zYW5zLWV2YWxcbiAqL1xudmFyIGpzb25QYXJzZT0oZnVuY3Rpb24oKXt2YXIgZT1cIig/Oi0/XFxcXGIoPzowfFsxLTldWzAtOV0qKSg/OlxcXFwuWzAtOV0rKT8oPzpbZUVdWystXT9bMC05XSspP1xcXFxiKVwiO3ZhciBqPScoPzpbXlxcXFwwLVxcXFx4MDhcXFxceDBhLVxcXFx4MWZcIlxcXFxcXFxcXXxcXFxcXFxcXCg/OltcIi9cXFxcXFxcXGJmbnJ0XXx1WzAtOUEtRmEtZl17NH0pKSc7dmFyIGk9Jyg/OlwiJytqKycqXCIpJzt2YXIgZD1uZXcgUmVnRXhwKFwiKD86ZmFsc2V8dHJ1ZXxudWxsfFtcXFxce1xcXFx9XFxcXFtcXFxcXV18XCIrZStcInxcIitpK1wiKVwiLFwiZ1wiKTt2YXIgaz1uZXcgUmVnRXhwKFwiXFxcXFxcXFwoPzooW151XSl8dSguezR9KSlcIixcImdcIik7dmFyIGc9eydcIic6J1wiJyxcIi9cIjpcIi9cIixcIlxcXFxcIjpcIlxcXFxcIixiOlwiXFxiXCIsZjpcIlxcZlwiLG46XCJcXG5cIixyOlwiXFxyXCIsdDpcIlxcdFwifTtmdW5jdGlvbiBoKGwsbSxuKXtyZXR1cm4gbT9nW21dOlN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQobiwxNikpfXZhciBjPW5ldyBTdHJpbmcoXCJcIik7dmFyIGE9XCJcXFxcXCI7dmFyIGY9e1wie1wiOk9iamVjdCxcIltcIjpBcnJheX07dmFyIGI9T2JqZWN0Lmhhc093blByb3BlcnR5O3JldHVybiBmdW5jdGlvbih1LHEpe3ZhciBwPXUubWF0Y2goZCk7dmFyIHg7dmFyIHY9cFswXTt2YXIgbD1mYWxzZTtpZihcIntcIj09PXYpe3g9e319ZWxzZXtpZihcIltcIj09PXYpe3g9W119ZWxzZXt4PVtdO2w9dHJ1ZX19dmFyIHQ7dmFyIHI9W3hdO2Zvcih2YXIgbz0xLWwsbT1wLmxlbmd0aDtvPG07KytvKXt2PXBbb107dmFyIHc7c3dpdGNoKHYuY2hhckNvZGVBdCgwKSl7ZGVmYXVsdDp3PXJbMF07d1t0fHx3Lmxlbmd0aF09Kyh2KTt0PXZvaWQgMDticmVhaztjYXNlIDM0OnY9di5zdWJzdHJpbmcoMSx2Lmxlbmd0aC0xKTtpZih2LmluZGV4T2YoYSkhPT0tMSl7dj12LnJlcGxhY2UoayxoKX13PXJbMF07aWYoIXQpe2lmKHcgaW5zdGFuY2VvZiBBcnJheSl7dD13Lmxlbmd0aH1lbHNle3Q9dnx8YzticmVha319d1t0XT12O3Q9dm9pZCAwO2JyZWFrO2Nhc2UgOTE6dz1yWzBdO3IudW5zaGlmdCh3W3R8fHcubGVuZ3RoXT1bXSk7dD12b2lkIDA7YnJlYWs7Y2FzZSA5MzpyLnNoaWZ0KCk7YnJlYWs7Y2FzZSAxMDI6dz1yWzBdO3dbdHx8dy5sZW5ndGhdPWZhbHNlO3Q9dm9pZCAwO2JyZWFrO2Nhc2UgMTEwOnc9clswXTt3W3R8fHcubGVuZ3RoXT1udWxsO3Q9dm9pZCAwO2JyZWFrO2Nhc2UgMTE2Onc9clswXTt3W3R8fHcubGVuZ3RoXT10cnVlO3Q9dm9pZCAwO2JyZWFrO2Nhc2UgMTIzOnc9clswXTtyLnVuc2hpZnQod1t0fHx3Lmxlbmd0aF09e30pO3Q9dm9pZCAwO2JyZWFrO2Nhc2UgMTI1OnIuc2hpZnQoKTticmVha319aWYobCl7aWYoci5sZW5ndGghPT0xKXt0aHJvdyBuZXcgRXJyb3IoKX14PXhbMF19ZWxzZXtpZihyLmxlbmd0aCl7dGhyb3cgbmV3IEVycm9yKCl9fWlmKHEpe3ZhciBzPWZ1bmN0aW9uKEMsQil7dmFyIEQ9Q1tCXTtpZihEJiZ0eXBlb2YgRD09PVwib2JqZWN0XCIpe3ZhciBuPW51bGw7Zm9yKHZhciB6IGluIEQpe2lmKGIuY2FsbChELHopJiZEIT09Qyl7dmFyIHk9cyhELHopO2lmKHkhPT12b2lkIDApe0Rbel09eX1lbHNle2lmKCFuKXtuPVtdfW4ucHVzaCh6KX19fWlmKG4pe2Zvcih2YXIgQT1uLmxlbmd0aDstLUE+PTA7KXtkZWxldGUgRFtuW0FdXX19fXJldHVybiBxLmNhbGwoQyxCLEQpfTt4PXMoe1wiXCI6eH0sXCJcIil9cmV0dXJuIHh9fSkoKTtcbi8qISBhc24xLTEuMC45LmpzIChjKSAyMDEzLTIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1LSlVSLmFzbjEuQVNOMVV0aWw9bmV3IGZ1bmN0aW9uKCl7dGhpcy5pbnRlZ2VyVG9CeXRlSGV4PWZ1bmN0aW9uKGEpe3ZhciBiPWEudG9TdHJpbmcoMTYpO2lmKChiLmxlbmd0aCUyKT09MSl7Yj1cIjBcIitifXJldHVybiBifTt0aGlzLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4PWZ1bmN0aW9uKGope3ZhciBmPWoudG9TdHJpbmcoMTYpO2lmKGYuc3Vic3RyKDAsMSkhPVwiLVwiKXtpZihmLmxlbmd0aCUyPT0xKXtmPVwiMFwiK2Z9ZWxzZXtpZighZi5tYXRjaCgvXlswLTddLykpe2Y9XCIwMFwiK2Z9fX1lbHNle3ZhciBhPWYuc3Vic3RyKDEpO3ZhciBlPWEubGVuZ3RoO2lmKGUlMj09MSl7ZSs9MX1lbHNle2lmKCFmLm1hdGNoKC9eWzAtN10vKSl7ZSs9Mn19dmFyIGc9XCJcIjtmb3IodmFyIGQ9MDtkPGU7ZCsrKXtnKz1cImZcIn12YXIgYz1uZXcgQmlnSW50ZWdlcihnLDE2KTt2YXIgYj1jLnhvcihqKS5hZGQoQmlnSW50ZWdlci5PTkUpO2Y9Yi50b1N0cmluZygxNikucmVwbGFjZSgvXi0vLFwiXCIpfXJldHVybiBmfTt0aGlzLmdldFBFTVN0cmluZ0Zyb21IZXg9ZnVuY3Rpb24oYSxiKXt2YXIgYz1LSlVSLmFzbjE7dmFyIGY9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShhKTt2YXIgZD1DcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShmKTt2YXIgZT1kLnJlcGxhY2UoLyguezY0fSkvZyxcIiQxXFxyXFxuXCIpO2U9ZS5yZXBsYWNlKC9cXHJcXG4kLyxcIlwiKTtyZXR1cm5cIi0tLS0tQkVHSU4gXCIrYitcIi0tLS0tXFxyXFxuXCIrZStcIlxcclxcbi0tLS0tRU5EIFwiK2IrXCItLS0tLVxcclxcblwifTt0aGlzLm5ld09iamVjdD1mdW5jdGlvbihiKXt2YXIgZz1LSlVSLmFzbjE7dmFyIGs9T2JqZWN0LmtleXMoYik7aWYoay5sZW5ndGghPTEpe3Rocm93XCJrZXkgb2YgcGFyYW0gc2hhbGwgYmUgb25seSBvbmUuXCJ9dmFyIGo9a1swXTtpZihcIjpib29sOmludDpiaXRzdHI6b2N0c3RyOm51bGw6b2lkOmVudW06dXRmOHN0cjpudW1zdHI6cHJuc3RyOnRlbHN0cjppYTVzdHI6dXRjdGltZTpnZW50aW1lOnNlcTpzZXQ6dGFnOlwiLmluZGV4T2YoXCI6XCIraitcIjpcIik9PS0xKXt0aHJvd1widW5kZWZpbmVkIGtleTogXCIran1pZihqPT1cImJvb2xcIil7cmV0dXJuIG5ldyBnLkRFUkJvb2xlYW4oYltqXSl9aWYoaj09XCJpbnRcIil7cmV0dXJuIG5ldyBnLkRFUkludGVnZXIoYltqXSl9aWYoaj09XCJiaXRzdHJcIil7cmV0dXJuIG5ldyBnLkRFUkJpdFN0cmluZyhiW2pdKX1pZihqPT1cIm9jdHN0clwiKXtyZXR1cm4gbmV3IGcuREVST2N0ZXRTdHJpbmcoYltqXSl9aWYoaj09XCJudWxsXCIpe3JldHVybiBuZXcgZy5ERVJOdWxsKGJbal0pfWlmKGo9PVwib2lkXCIpe3JldHVybiBuZXcgZy5ERVJPYmplY3RJZGVudGlmaWVyKGJbal0pfWlmKGo9PVwiZW51bVwiKXtyZXR1cm4gbmV3IGcuREVSRW51bWVyYXRlZChiW2pdKX1pZihqPT1cInV0ZjhzdHJcIil7cmV0dXJuIG5ldyBnLkRFUlVURjhTdHJpbmcoYltqXSl9aWYoaj09XCJudW1zdHJcIil7cmV0dXJuIG5ldyBnLkRFUk51bWVyaWNTdHJpbmcoYltqXSl9aWYoaj09XCJwcm5zdHJcIil7cmV0dXJuIG5ldyBnLkRFUlByaW50YWJsZVN0cmluZyhiW2pdKX1pZihqPT1cInRlbHN0clwiKXtyZXR1cm4gbmV3IGcuREVSVGVsZXRleFN0cmluZyhiW2pdKX1pZihqPT1cImlhNXN0clwiKXtyZXR1cm4gbmV3IGcuREVSSUE1U3RyaW5nKGJbal0pfWlmKGo9PVwidXRjdGltZVwiKXtyZXR1cm4gbmV3IGcuREVSVVRDVGltZShiW2pdKX1pZihqPT1cImdlbnRpbWVcIil7cmV0dXJuIG5ldyBnLkRFUkdlbmVyYWxpemVkVGltZShiW2pdKX1pZihqPT1cInNlcVwiKXt2YXIgbT1iW2pdO3ZhciBoPVtdO2Zvcih2YXIgZT0wO2U8bS5sZW5ndGg7ZSsrKXt2YXIgbD1nLkFTTjFVdGlsLm5ld09iamVjdChtW2VdKTtoLnB1c2gobCl9cmV0dXJuIG5ldyBnLkRFUlNlcXVlbmNlKHthcnJheTpofSl9aWYoaj09XCJzZXRcIil7dmFyIG09YltqXTt2YXIgaD1bXTtmb3IodmFyIGU9MDtlPG0ubGVuZ3RoO2UrKyl7dmFyIGw9Zy5BU04xVXRpbC5uZXdPYmplY3QobVtlXSk7aC5wdXNoKGwpfXJldHVybiBuZXcgZy5ERVJTZXQoe2FycmF5Omh9KX1pZihqPT1cInRhZ1wiKXt2YXIgYz1iW2pdO2lmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjKT09PVwiW29iamVjdCBBcnJheV1cIiYmYy5sZW5ndGg9PTMpe3ZhciBkPWcuQVNOMVV0aWwubmV3T2JqZWN0KGNbMl0pO3JldHVybiBuZXcgZy5ERVJUYWdnZWRPYmplY3Qoe3RhZzpjWzBdLGV4cGxpY2l0OmNbMV0sb2JqOmR9KX1lbHNle3ZhciBmPXt9O2lmKGMuZXhwbGljaXQhPT11bmRlZmluZWQpe2YuZXhwbGljaXQ9Yy5leHBsaWNpdH1pZihjLnRhZyE9PXVuZGVmaW5lZCl7Zi50YWc9Yy50YWd9aWYoYy5vYmo9PT11bmRlZmluZWQpe3Rocm93XCJvYmogc2hhbGwgYmUgc3BlY2lmaWVkIGZvciAndGFnJy5cIn1mLm9iaj1nLkFTTjFVdGlsLm5ld09iamVjdChjLm9iaik7cmV0dXJuIG5ldyBnLkRFUlRhZ2dlZE9iamVjdChmKX19fTt0aGlzLmpzb25Ub0FTTjFIRVg9ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5uZXdPYmplY3QoYik7cmV0dXJuIGEuZ2V0RW5jb2RlZEhleCgpfX07S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50PWZ1bmN0aW9uKGEpe3ZhciBqPVwiXCI7dmFyIGs9cGFyc2VJbnQoYS5zdWJzdHIoMCwyKSwxNik7dmFyIGQ9TWF0aC5mbG9vcihrLzQwKTt2YXIgYz1rJTQwO3ZhciBqPWQrXCIuXCIrYzt2YXIgZT1cIlwiO2Zvcih2YXIgZj0yO2Y8YS5sZW5ndGg7Zis9Mil7dmFyIGc9cGFyc2VJbnQoYS5zdWJzdHIoZiwyKSwxNik7dmFyIGg9KFwiMDAwMDAwMDBcIitnLnRvU3RyaW5nKDIpKS5zbGljZSgtOCk7ZT1lK2guc3Vic3RyKDEsNyk7aWYoaC5zdWJzdHIoMCwxKT09XCIwXCIpe3ZhciBiPW5ldyBCaWdJbnRlZ2VyKGUsMik7aj1qK1wiLlwiK2IudG9TdHJpbmcoMTApO2U9XCJcIn19cmV0dXJuIGp9O0tKVVIuYXNuMS5BU04xVXRpbC5vaWRJbnRUb0hleD1mdW5jdGlvbihmKXt2YXIgZT1mdW5jdGlvbihhKXt2YXIgaz1hLnRvU3RyaW5nKDE2KTtpZihrLmxlbmd0aD09MSl7az1cIjBcIitrfXJldHVybiBrfTt2YXIgZD1mdW5jdGlvbihvKXt2YXIgbj1cIlwiO3ZhciBrPW5ldyBCaWdJbnRlZ2VyKG8sMTApO3ZhciBhPWsudG9TdHJpbmcoMik7dmFyIGw9Ny1hLmxlbmd0aCU3O2lmKGw9PTcpe2w9MH12YXIgcT1cIlwiO2Zvcih2YXIgbT0wO208bDttKyspe3ErPVwiMFwifWE9cSthO2Zvcih2YXIgbT0wO208YS5sZW5ndGgtMTttKz03KXt2YXIgcD1hLnN1YnN0cihtLDcpO2lmKG0hPWEubGVuZ3RoLTcpe3A9XCIxXCIrcH1uKz1lKHBhcnNlSW50KHAsMikpfXJldHVybiBufTtpZighZi5tYXRjaCgvXlswLTkuXSskLykpe3Rocm93XCJtYWxmb3JtZWQgb2lkIHN0cmluZzogXCIrZn12YXIgZz1cIlwiO3ZhciBiPWYuc3BsaXQoXCIuXCIpO3ZhciBqPXBhcnNlSW50KGJbMF0pKjQwK3BhcnNlSW50KGJbMV0pO2crPWUoaik7Yi5zcGxpY2UoMCwyKTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7Zys9ZChiW2NdKX1yZXR1cm4gZ307S0pVUi5hc24xLkFTTjFPYmplY3Q9ZnVuY3Rpb24oKXt2YXIgYz10cnVlO3ZhciBiPW51bGw7dmFyIGQ9XCIwMFwiO3ZhciBlPVwiMDBcIjt2YXIgYT1cIlwiO3RoaXMuZ2V0TGVuZ3RoSGV4RnJvbVZhbHVlPWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuaFY9PVwidW5kZWZpbmVkXCJ8fHRoaXMuaFY9PW51bGwpe3Rocm93XCJ0aGlzLmhWIGlzIG51bGwgb3IgdW5kZWZpbmVkLlwifWlmKHRoaXMuaFYubGVuZ3RoJTI9PTEpe3Rocm93XCJ2YWx1ZSBoZXggbXVzdCBiZSBldmVuIGxlbmd0aDogbj1cIithLmxlbmd0aCtcIix2PVwiK3RoaXMuaFZ9dmFyIGk9dGhpcy5oVi5sZW5ndGgvMjt2YXIgaD1pLnRvU3RyaW5nKDE2KTtpZihoLmxlbmd0aCUyPT0xKXtoPVwiMFwiK2h9aWYoaTwxMjgpe3JldHVybiBofWVsc2V7dmFyIGc9aC5sZW5ndGgvMjtpZihnPjE1KXt0aHJvd1wiQVNOLjEgbGVuZ3RoIHRvbyBsb25nIHRvIHJlcHJlc2VudCBieSA4eDogbiA9IFwiK2kudG9TdHJpbmcoMTYpfXZhciBmPTEyOCtnO3JldHVybiBmLnRvU3RyaW5nKDE2KStofX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5oVExWPT1udWxsfHx0aGlzLmlzTW9kaWZpZWQpe3RoaXMuaFY9dGhpcy5nZXRGcmVzaFZhbHVlSGV4KCk7dGhpcy5oTD10aGlzLmdldExlbmd0aEhleEZyb21WYWx1ZSgpO3RoaXMuaFRMVj10aGlzLmhUK3RoaXMuaEwrdGhpcy5oVjt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9cmV0dXJuIHRoaXMuaFRMVn07dGhpcy5nZXRWYWx1ZUhleD1mdW5jdGlvbigpe3RoaXMuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhWfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm5cIlwifX07S0pVUi5hc24xLkRFUkFic3RyYWN0U3RyaW5nPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgYT1udWxsO3RoaXMuZ2V0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc307dGhpcy5zZXRTdHJpbmc9ZnVuY3Rpb24oZCl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPWQ7dGhpcy5oVj1zdG9oZXgodGhpcy5zKX07dGhpcy5zZXRTdHJpbmdIZXg9ZnVuY3Rpb24oZCl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPW51bGw7dGhpcy5oVj1kfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjPT1cInN0cmluZ1wiKXt0aGlzLnNldFN0cmluZyhjKX1lbHNle2lmKHR5cGVvZiBjLnN0ciE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRTdHJpbmcoYy5zdHIpfWVsc2V7aWYodHlwZW9mIGMuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFN0cmluZ0hleChjLmhleCl9fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJBYnN0cmFjdFRpbWU9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLkRFUkFic3RyYWN0VGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGI9bnVsbDt2YXIgYT1udWxsO3RoaXMubG9jYWxEYXRlVG9VVEM9ZnVuY3Rpb24oZil7dXRjPWYuZ2V0VGltZSgpKyhmLmdldFRpbWV6b25lT2Zmc2V0KCkqNjAwMDApO3ZhciBlPW5ldyBEYXRlKHV0Yyk7cmV0dXJuIGV9O3RoaXMuZm9ybWF0RGF0ZT1mdW5jdGlvbihtLG8sZSl7dmFyIGc9dGhpcy56ZXJvUGFkZGluZzt2YXIgbj10aGlzLmxvY2FsRGF0ZVRvVVRDKG0pO3ZhciBwPVN0cmluZyhuLmdldEZ1bGxZZWFyKCkpO2lmKG89PVwidXRjXCIpe3A9cC5zdWJzdHIoMiwyKX12YXIgbD1nKFN0cmluZyhuLmdldE1vbnRoKCkrMSksMik7dmFyIHE9ZyhTdHJpbmcobi5nZXREYXRlKCkpLDIpO3ZhciBoPWcoU3RyaW5nKG4uZ2V0SG91cnMoKSksMik7dmFyIGk9ZyhTdHJpbmcobi5nZXRNaW51dGVzKCkpLDIpO3ZhciBqPWcoU3RyaW5nKG4uZ2V0U2Vjb25kcygpKSwyKTt2YXIgcj1wK2wrcStoK2krajtpZihlPT09dHJ1ZSl7dmFyIGY9bi5nZXRNaWxsaXNlY29uZHMoKTtpZihmIT0wKXt2YXIgaz1nKFN0cmluZyhmKSwzKTtrPWsucmVwbGFjZSgvWzBdKyQvLFwiXCIpO3I9citcIi5cIitrfX1yZXR1cm4gcitcIlpcIn07dGhpcy56ZXJvUGFkZGluZz1mdW5jdGlvbihlLGQpe2lmKGUubGVuZ3RoPj1kKXtyZXR1cm4gZX1yZXR1cm4gbmV3IEFycmF5KGQtZS5sZW5ndGgrMSkuam9pbihcIjBcIikrZX07dGhpcy5nZXRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfTt0aGlzLnNldFN0cmluZz1mdW5jdGlvbihkKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLnM9ZDt0aGlzLmhWPXN0b2hleChkKX07dGhpcy5zZXRCeURhdGVWYWx1ZT1mdW5jdGlvbihoLGosZSxkLGYsZyl7dmFyIGk9bmV3IERhdGUoRGF0ZS5VVEMoaCxqLTEsZSxkLGYsZywwKSk7dGhpcy5zZXRCeURhdGUoaSl9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZD1mdW5jdGlvbihiKXtLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5zZXRCeUFTTjFPYmplY3RBcnJheT1mdW5jdGlvbihjKXt0aGlzLmhUTFY9bnVsbDt0aGlzLmlzTW9kaWZpZWQ9dHJ1ZTt0aGlzLmFzbjFBcnJheT1jfTt0aGlzLmFwcGVuZEFTTjFPYmplY3Q9ZnVuY3Rpb24oYyl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5hc24xQXJyYXkucHVzaChjKX07dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmFycmF5IT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFBcnJheT1iLmFycmF5fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJCb29sZWFuPWZ1bmN0aW9uKCl7S0pVUi5hc24xLkRFUkJvb2xlYW4uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwMVwiO3RoaXMuaFRMVj1cIjAxMDFmZlwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSQm9vbGVhbixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkludGVnZXI9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUkludGVnZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwMlwiO3RoaXMuc2V0QnlCaWdJbnRlZ2VyPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuaFY9S0pVUi5hc24xLkFTTjFVdGlsLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4KGIpfTt0aGlzLnNldEJ5SW50ZWdlcj1mdW5jdGlvbihjKXt2YXIgYj1uZXcgQmlnSW50ZWdlcihTdHJpbmcoYyksMTApO3RoaXMuc2V0QnlCaWdJbnRlZ2VyKGIpfTt0aGlzLnNldFZhbHVlSGV4PWZ1bmN0aW9uKGIpe3RoaXMuaFY9Yn07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5iaWdpbnQhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlCaWdJbnRlZ2VyKGEuYmlnaW50KX1lbHNle2lmKHR5cGVvZiBhW1wiaW50XCJdIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5SW50ZWdlcihhW1wiaW50XCJdKX1lbHNle2lmKHR5cGVvZiBhPT1cIm51bWJlclwiKXt0aGlzLnNldEJ5SW50ZWdlcihhKX1lbHNle2lmKHR5cGVvZiBhLmhleCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRWYWx1ZUhleChhLmhleCl9fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkludGVnZXIsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJCaXRTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUkJpdFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjAzXCI7dGhpcy5zZXRIZXhWYWx1ZUluY2x1ZGluZ1VudXNlZEJpdHM9ZnVuY3Rpb24oYil7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1ifTt0aGlzLnNldFVudXNlZEJpdHNBbmRIZXhWYWx1ZT1mdW5jdGlvbihiLGQpe2lmKGI8MHx8NzxiKXt0aHJvd1widW51c2VkIGJpdHMgc2hhbGwgYmUgZnJvbSAwIHRvIDc6IHUgPSBcIitifXZhciBjPVwiMFwiK2I7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1jK2R9O3RoaXMuc2V0QnlCaW5hcnlTdHJpbmc9ZnVuY3Rpb24oZSl7ZT1lLnJlcGxhY2UoLzArJC8sXCJcIik7dmFyIGY9OC1lLmxlbmd0aCU4O2lmKGY9PTgpe2Y9MH1mb3IodmFyIGc9MDtnPD1mO2crKyl7ZSs9XCIwXCJ9dmFyIGo9XCJcIjtmb3IodmFyIGc9MDtnPGUubGVuZ3RoLTE7Zys9OCl7dmFyIGQ9ZS5zdWJzdHIoZyw4KTt2YXIgYz1wYXJzZUludChkLDIpLnRvU3RyaW5nKDE2KTtpZihjLmxlbmd0aD09MSl7Yz1cIjBcIitjfWorPWN9dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5oVj1cIjBcIitmK2p9O3RoaXMuc2V0QnlCb29sZWFuQXJyYXk9ZnVuY3Rpb24oZCl7dmFyIGM9XCJcIjtmb3IodmFyIGI9MDtiPGQubGVuZ3RoO2IrKyl7aWYoZFtiXT09dHJ1ZSl7Yys9XCIxXCJ9ZWxzZXtjKz1cIjBcIn19dGhpcy5zZXRCeUJpbmFyeVN0cmluZyhjKX07dGhpcy5uZXdGYWxzZUFycmF5PWZ1bmN0aW9uKGQpe3ZhciBiPW5ldyBBcnJheShkKTtmb3IodmFyIGM9MDtjPGQ7YysrKXtiW2NdPWZhbHNlfXJldHVybiBifTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhPT1cInN0cmluZ1wiJiZhLnRvTG93ZXJDYXNlKCkubWF0Y2goL15bMC05YS1mXSskLykpe3RoaXMuc2V0SGV4VmFsdWVJbmNsdWRpbmdVbnVzZWRCaXRzKGEpfWVsc2V7aWYodHlwZW9mIGEuaGV4IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEhleFZhbHVlSW5jbHVkaW5nVW51c2VkQml0cyhhLmhleCl9ZWxzZXtpZih0eXBlb2YgYS5iaW4hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlCaW5hcnlTdHJpbmcoYS5iaW4pfWVsc2V7aWYodHlwZW9mIGEuYXJyYXkhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlCb29sZWFuQXJyYXkoYS5hcnJheSl9fX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkJpdFN0cmluZyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJPY3RldFN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMDRcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cmluZyk7S0pVUi5hc24xLkRFUk51bGw9ZnVuY3Rpb24oKXtLSlVSLmFzbjEuREVSTnVsbC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5oVD1cIjA1XCI7dGhpcy5oVExWPVwiMDUwMFwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSTnVsbCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXI9ZnVuY3Rpb24oYyl7dmFyIGI9ZnVuY3Rpb24oZCl7dmFyIGU9ZC50b1N0cmluZygxNik7aWYoZS5sZW5ndGg9PTEpe2U9XCIwXCIrZX1yZXR1cm4gZX07dmFyIGE9ZnVuY3Rpb24oayl7dmFyIGo9XCJcIjt2YXIgZT1uZXcgQmlnSW50ZWdlcihrLDEwKTt2YXIgZD1lLnRvU3RyaW5nKDIpO3ZhciBmPTctZC5sZW5ndGglNztpZihmPT03KXtmPTB9dmFyIG09XCJcIjtmb3IodmFyIGc9MDtnPGY7ZysrKXttKz1cIjBcIn1kPW0rZDtmb3IodmFyIGc9MDtnPGQubGVuZ3RoLTE7Zys9Nyl7dmFyIGw9ZC5zdWJzdHIoZyw3KTtpZihnIT1kLmxlbmd0aC03KXtsPVwiMVwiK2x9ais9YihwYXJzZUludChsLDIpKX1yZXR1cm4gan07S0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwNlwiO3RoaXMuc2V0VmFsdWVIZXg9ZnVuY3Rpb24oZCl7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWU7dGhpcy5zPW51bGw7dGhpcy5oVj1kfTt0aGlzLnNldFZhbHVlT2lkU3RyaW5nPWZ1bmN0aW9uKGYpe2lmKCFmLm1hdGNoKC9eWzAtOS5dKyQvKSl7dGhyb3dcIm1hbGZvcm1lZCBvaWQgc3RyaW5nOiBcIitmfXZhciBnPVwiXCI7dmFyIGQ9Zi5zcGxpdChcIi5cIik7dmFyIGo9cGFyc2VJbnQoZFswXSkqNDArcGFyc2VJbnQoZFsxXSk7Zys9YihqKTtkLnNwbGljZSgwLDIpO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXtnKz1hKGRbZV0pfXRoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMucz1udWxsO3RoaXMuaFY9Z307dGhpcy5zZXRWYWx1ZU5hbWU9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIEtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3RbZV0hPVwidW5kZWZpbmVkXCIpe3ZhciBkPUtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3RbZV07dGhpcy5zZXRWYWx1ZU9pZFN0cmluZyhkKX1lbHNle3Rocm93XCJERVJPYmplY3RJZGVudGlmaWVyIG9pZE5hbWUgdW5kZWZpbmVkOiBcIitlfX07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYz09XCJzdHJpbmdcIiYmYy5tYXRjaCgvXlswLTJdLlswLTkuXSskLykpe3RoaXMuc2V0VmFsdWVPaWRTdHJpbmcoYyl9ZWxzZXtpZihLSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWRMaXN0W2NdIT09dW5kZWZpbmVkKXt0aGlzLnNldFZhbHVlT2lkU3RyaW5nKEtKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZExpc3RbY10pfWVsc2V7aWYodHlwZW9mIGMub2lkIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFZhbHVlT2lkU3RyaW5nKGMub2lkKX1lbHNle2lmKHR5cGVvZiBjLmhleCE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRWYWx1ZUhleChjLmhleCl9ZWxzZXtpZih0eXBlb2YgYy5uYW1lIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFZhbHVlTmFtZShjLm5hbWUpfX19fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLkRFUkVudW1lcmF0ZWQ9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUkVudW1lcmF0ZWQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuaFQ9XCIwYVwiO3RoaXMuc2V0QnlCaWdJbnRlZ2VyPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuaFY9S0pVUi5hc24xLkFTTjFVdGlsLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4KGIpfTt0aGlzLnNldEJ5SW50ZWdlcj1mdW5jdGlvbihjKXt2YXIgYj1uZXcgQmlnSW50ZWdlcihTdHJpbmcoYyksMTApO3RoaXMuc2V0QnlCaWdJbnRlZ2VyKGIpfTt0aGlzLnNldFZhbHVlSGV4PWZ1bmN0aW9uKGIpe3RoaXMuaFY9Yn07dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFZ9O2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYVtcImludFwiXSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeUludGVnZXIoYVtcImludFwiXSl9ZWxzZXtpZih0eXBlb2YgYT09XCJudW1iZXJcIil7dGhpcy5zZXRCeUludGVnZXIoYSl9ZWxzZXtpZih0eXBlb2YgYS5oZXghPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0VmFsdWVIZXgoYS5oZXgpfX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUkVudW1lcmF0ZWQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5ERVJVVEY4U3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJVVEY4U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIwY1wifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVVRGOFN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJOdW1lcmljU3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJOdW1lcmljU3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxMlwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSTnVtZXJpY1N0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJQcmludGFibGVTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlByaW50YWJsZVN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMTNcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlByaW50YWJsZVN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJUZWxldGV4U3RyaW5nPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJUZWxldGV4U3RyaW5nLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxNFwifTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVGVsZXRleFN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJJQTVTdHJpbmc9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUklBNVN0cmluZy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMTZcIn07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUklBNVN0cmluZyxLSlVSLmFzbjEuREVSQWJzdHJhY3RTdHJpbmcpO0tKVVIuYXNuMS5ERVJVVENUaW1lPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJVVENUaW1lLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuaFQ9XCIxN1wiO3RoaXMuc2V0QnlEYXRlPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuZGF0ZT1iO3RoaXMucz10aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLFwidXRjXCIpO3RoaXMuaFY9c3RvaGV4KHRoaXMucyl9O3RoaXMuZ2V0RnJlc2hWYWx1ZUhleD1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmRhdGU9PVwidW5kZWZpbmVkXCImJnR5cGVvZiB0aGlzLnM9PVwidW5kZWZpbmVkXCIpe3RoaXMuZGF0ZT1uZXcgRGF0ZSgpO3RoaXMucz10aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLFwidXRjXCIpO3RoaXMuaFY9c3RvaGV4KHRoaXMucyl9cmV0dXJuIHRoaXMuaFZ9O2lmKGEhPT11bmRlZmluZWQpe2lmKGEuc3RyIT09dW5kZWZpbmVkKXt0aGlzLnNldFN0cmluZyhhLnN0cil9ZWxzZXtpZih0eXBlb2YgYT09XCJzdHJpbmdcIiYmYS5tYXRjaCgvXlswLTldezEyfVokLykpe3RoaXMuc2V0U3RyaW5nKGEpfWVsc2V7aWYoYS5oZXghPT11bmRlZmluZWQpe3RoaXMuc2V0U3RyaW5nSGV4KGEuaGV4KX1lbHNle2lmKGEuZGF0ZSE9PXVuZGVmaW5lZCl7dGhpcy5zZXRCeURhdGUoYS5kYXRlKX19fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuREVSVVRDVGltZSxLSlVSLmFzbjEuREVSQWJzdHJhY3RUaW1lKTtLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsYSk7dGhpcy5oVD1cIjE4XCI7dGhpcy53aXRoTWlsbGlzPWZhbHNlO3RoaXMuc2V0QnlEYXRlPWZ1bmN0aW9uKGIpe3RoaXMuaFRMVj1udWxsO3RoaXMuaXNNb2RpZmllZD10cnVlO3RoaXMuZGF0ZT1iO3RoaXMucz10aGlzLmZvcm1hdERhdGUodGhpcy5kYXRlLFwiZ2VuXCIsdGhpcy53aXRoTWlsbGlzKTt0aGlzLmhWPXN0b2hleCh0aGlzLnMpfTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmRhdGU9PT11bmRlZmluZWQmJnRoaXMucz09PXVuZGVmaW5lZCl7dGhpcy5kYXRlPW5ldyBEYXRlKCk7dGhpcy5zPXRoaXMuZm9ybWF0RGF0ZSh0aGlzLmRhdGUsXCJnZW5cIix0aGlzLndpdGhNaWxsaXMpO3RoaXMuaFY9c3RvaGV4KHRoaXMucyl9cmV0dXJuIHRoaXMuaFZ9O2lmKGEhPT11bmRlZmluZWQpe2lmKGEuc3RyIT09dW5kZWZpbmVkKXt0aGlzLnNldFN0cmluZyhhLnN0cil9ZWxzZXtpZih0eXBlb2YgYT09XCJzdHJpbmdcIiYmYS5tYXRjaCgvXlswLTldezE0fVokLykpe3RoaXMuc2V0U3RyaW5nKGEpfWVsc2V7aWYoYS5oZXghPT11bmRlZmluZWQpe3RoaXMuc2V0U3RyaW5nSGV4KGEuaGV4KX1lbHNle2lmKGEuZGF0ZSE9PXVuZGVmaW5lZCl7dGhpcy5zZXRCeURhdGUoYS5kYXRlKX19fX1pZihhLm1pbGxpcz09PXRydWUpe3RoaXMud2l0aE1pbGxpcz10cnVlfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJHZW5lcmFsaXplZFRpbWUsS0pVUi5hc24xLkRFUkFic3RyYWN0VGltZSk7S0pVUi5hc24xLkRFUlNlcXVlbmNlPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS5ERVJTZXF1ZW5jZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMzBcIjt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXt2YXIgYz1cIlwiO2Zvcih2YXIgYj0wO2I8dGhpcy5hc24xQXJyYXkubGVuZ3RoO2IrKyl7dmFyIGQ9dGhpcy5hc24xQXJyYXlbYl07Yys9ZC5nZXRFbmNvZGVkSGV4KCl9dGhpcy5oVj1jO3JldHVybiB0aGlzLmhWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlNlcXVlbmNlLEtKVVIuYXNuMS5ERVJBYnN0cmFjdFN0cnVjdHVyZWQpO0tKVVIuYXNuMS5ERVJTZXQ9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLkRFUlNldC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmhUPVwiMzFcIjt0aGlzLnNvcnRGbGFnPXRydWU7dGhpcy5nZXRGcmVzaFZhbHVlSGV4PWZ1bmN0aW9uKCl7dmFyIGI9bmV3IEFycmF5KCk7Zm9yKHZhciBjPTA7Yzx0aGlzLmFzbjFBcnJheS5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmFzbjFBcnJheVtjXTtiLnB1c2goZC5nZXRFbmNvZGVkSGV4KCkpfWlmKHRoaXMuc29ydEZsYWc9PXRydWUpe2Iuc29ydCgpfXRoaXMuaFY9Yi5qb2luKFwiXCIpO3JldHVybiB0aGlzLmhWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuc29ydGZsYWchPVwidW5kZWZpbmVkXCImJmEuc29ydGZsYWc9PWZhbHNlKXt0aGlzLnNvcnRGbGFnPWZhbHNlfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5ERVJTZXQsS0pVUi5hc24xLkRFUkFic3RyYWN0U3RydWN0dXJlZCk7S0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdD1mdW5jdGlvbihhKXtLSlVSLmFzbjEuREVSVGFnZ2VkT2JqZWN0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmhUPVwiYTBcIjt0aGlzLmhWPVwiXCI7dGhpcy5pc0V4cGxpY2l0PXRydWU7dGhpcy5hc24xT2JqZWN0PW51bGw7dGhpcy5zZXRBU04xT2JqZWN0PWZ1bmN0aW9uKGIsYyxkKXt0aGlzLmhUPWM7dGhpcy5pc0V4cGxpY2l0PWI7dGhpcy5hc24xT2JqZWN0PWQ7aWYodGhpcy5pc0V4cGxpY2l0KXt0aGlzLmhWPXRoaXMuYXNuMU9iamVjdC5nZXRFbmNvZGVkSGV4KCk7dGhpcy5oVExWPW51bGw7dGhpcy5pc01vZGlmaWVkPXRydWV9ZWxzZXt0aGlzLmhWPW51bGw7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaFRMVj10aGlzLmhUTFYucmVwbGFjZSgvXi4uLyxjKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9fTt0aGlzLmdldEZyZXNoVmFsdWVIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oVn07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLnRhZyE9XCJ1bmRlZmluZWRcIil7dGhpcy5oVD1hLnRhZ31pZih0eXBlb2YgYS5leHBsaWNpdCE9XCJ1bmRlZmluZWRcIil7dGhpcy5pc0V4cGxpY2l0PWEuZXhwbGljaXR9aWYodHlwZW9mIGEub2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFPYmplY3Q9YS5vYmo7dGhpcy5zZXRBU04xT2JqZWN0KHRoaXMuaXNFeHBsaWNpdCx0aGlzLmhULHRoaXMuYXNuMU9iamVjdCl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7XG4vKiEgYXNuMWhleC0xLjEuNi5qcyAoYykgMjAxMi0yMDE1IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbnZhciBBU04xSEVYPW5ldyBmdW5jdGlvbigpe3RoaXMuZ2V0Qnl0ZUxlbmd0aE9mTF9BdE9iaj1mdW5jdGlvbihiLGMpe2lmKGIuc3Vic3RyaW5nKGMrMixjKzMpIT1cIjhcIil7cmV0dXJuIDF9dmFyIGE9cGFyc2VJbnQoYi5zdWJzdHJpbmcoYyszLGMrNCkpO2lmKGE9PTApe3JldHVybiAtMX1pZigwPGEmJmE8MTApe3JldHVybiBhKzF9cmV0dXJuIC0yfTt0aGlzLmdldEhleE9mTF9BdE9iaj1mdW5jdGlvbihiLGMpe3ZhciBhPXRoaXMuZ2V0Qnl0ZUxlbmd0aE9mTF9BdE9iaihiLGMpO2lmKGE8MSl7cmV0dXJuXCJcIn1yZXR1cm4gYi5zdWJzdHJpbmcoYysyLGMrMithKjIpfTt0aGlzLmdldEludE9mTF9BdE9iaj1mdW5jdGlvbihjLGQpe3ZhciBiPXRoaXMuZ2V0SGV4T2ZMX0F0T2JqKGMsZCk7aWYoYj09XCJcIil7cmV0dXJuIC0xfXZhciBhO2lmKHBhcnNlSW50KGIuc3Vic3RyaW5nKDAsMSkpPDgpe2E9bmV3IEJpZ0ludGVnZXIoYiwxNil9ZWxzZXthPW5ldyBCaWdJbnRlZ2VyKGIuc3Vic3RyaW5nKDIpLDE2KX1yZXR1cm4gYS5pbnRWYWx1ZSgpfTt0aGlzLmdldFN0YXJ0UG9zT2ZWX0F0T2JqPWZ1bmN0aW9uKGIsYyl7dmFyIGE9dGhpcy5nZXRCeXRlTGVuZ3RoT2ZMX0F0T2JqKGIsYyk7aWYoYTwwKXtyZXR1cm4gYX1yZXR1cm4gYysoYSsxKSoyfTt0aGlzLmdldEhleE9mVl9BdE9iaj1mdW5jdGlvbihjLGQpe3ZhciBiPXRoaXMuZ2V0U3RhcnRQb3NPZlZfQXRPYmooYyxkKTt2YXIgYT10aGlzLmdldEludE9mTF9BdE9iaihjLGQpO3JldHVybiBjLnN1YnN0cmluZyhiLGIrYSoyKX07dGhpcy5nZXRIZXhPZlRMVl9BdE9iaj1mdW5jdGlvbihjLGUpe3ZhciBiPWMuc3Vic3RyKGUsMik7dmFyIGQ9dGhpcy5nZXRIZXhPZkxfQXRPYmooYyxlKTt2YXIgYT10aGlzLmdldEhleE9mVl9BdE9iaihjLGUpO3JldHVybiBiK2QrYX07dGhpcy5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqPWZ1bmN0aW9uKGMsZCl7dmFyIGI9dGhpcy5nZXRTdGFydFBvc09mVl9BdE9iaihjLGQpO3ZhciBhPXRoaXMuZ2V0SW50T2ZMX0F0T2JqKGMsZCk7cmV0dXJuIGIrYSoyfTt0aGlzLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaj1mdW5jdGlvbihmLGope3ZhciBjPW5ldyBBcnJheSgpO3ZhciBpPXRoaXMuZ2V0U3RhcnRQb3NPZlZfQXRPYmooZixqKTtjLnB1c2goaSk7dmFyIGI9dGhpcy5nZXRJbnRPZkxfQXRPYmooZixqKTt2YXIgZz1pO3ZhciBkPTA7d2hpbGUoMSl7dmFyIGU9dGhpcy5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGYsZyk7aWYoZT09bnVsbHx8KGUtaT49KGIqMikpKXticmVha31pZihkPj0yMDApe2JyZWFrfWMucHVzaChlKTtnPWU7ZCsrfXJldHVybiBjfTt0aGlzLmdldE50aENoaWxkSW5kZXhfQXRPYmo9ZnVuY3Rpb24oZCxiLGUpe3ZhciBjPXRoaXMuZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQsYik7cmV0dXJuIGNbZV19O3RoaXMuZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3Q9ZnVuY3Rpb24oZSxkLGMpe2lmKGMubGVuZ3RoPT0wKXtyZXR1cm4gZH12YXIgZj1jLnNoaWZ0KCk7dmFyIGI9dGhpcy5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxkKTtyZXR1cm4gdGhpcy5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChlLGJbZl0sYyl9O3RoaXMuZ2V0RGVjZW5kYW50SGV4VExWQnlOdGhMaXN0PWZ1bmN0aW9uKGQsYyxiKXt2YXIgYT10aGlzLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0KGQsYyxiKTtyZXR1cm4gdGhpcy5nZXRIZXhPZlRMVl9BdE9iaihkLGEpfTt0aGlzLmdldERlY2VuZGFudEhleFZCeU50aExpc3Q9ZnVuY3Rpb24oZCxjLGIpe3ZhciBhPXRoaXMuZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3QoZCxjLGIpO3JldHVybiB0aGlzLmdldEhleE9mVl9BdE9iaihkLGEpfX07QVNOMUhFWC5nZXRWYnlMaXN0PWZ1bmN0aW9uKGQsYyxiLGUpe3ZhciBhPXRoaXMuZ2V0RGVjZW5kYW50SW5kZXhCeU50aExpc3QoZCxjLGIpO2lmKGE9PT11bmRlZmluZWQpe3Rocm93XCJjYW4ndCBmaW5kIG50aExpc3Qgb2JqZWN0XCJ9aWYoZSE9PXVuZGVmaW5lZCl7aWYoZC5zdWJzdHIoYSwyKSE9ZSl7dGhyb3dcImNoZWNraW5nIHRhZyBkb2Vzbid0IG1hdGNoOiBcIitkLnN1YnN0cihhLDIpK1wiIT1cIitlfX1yZXR1cm4gdGhpcy5nZXRIZXhPZlZfQXRPYmooZCxhKX07QVNOMUhFWC5oZXh0b29pZHN0cj1mdW5jdGlvbihlKXt2YXIgaD1mdW5jdGlvbihiLGEpe2lmKGIubGVuZ3RoPj1hKXtyZXR1cm4gYn1yZXR1cm4gbmV3IEFycmF5KGEtYi5sZW5ndGgrMSkuam9pbihcIjBcIikrYn07dmFyIGw9W107dmFyIG89ZS5zdWJzdHIoMCwyKTt2YXIgZj1wYXJzZUludChvLDE2KTtsWzBdPW5ldyBTdHJpbmcoTWF0aC5mbG9vcihmLzQwKSk7bFsxXT1uZXcgU3RyaW5nKGYlNDApO3ZhciBtPWUuc3Vic3RyKDIpO3ZhciBrPVtdO2Zvcih2YXIgZz0wO2c8bS5sZW5ndGgvMjtnKyspe2sucHVzaChwYXJzZUludChtLnN1YnN0cihnKjIsMiksMTYpKX12YXIgaj1bXTt2YXIgZD1cIlwiO2Zvcih2YXIgZz0wO2c8ay5sZW5ndGg7ZysrKXtpZihrW2ddJjEyOCl7ZD1kK2goKGtbZ10mMTI3KS50b1N0cmluZygyKSw3KX1lbHNle2Q9ZCtoKChrW2ddJjEyNykudG9TdHJpbmcoMiksNyk7ai5wdXNoKG5ldyBTdHJpbmcocGFyc2VJbnQoZCwyKSkpO2Q9XCJcIn19dmFyIG49bC5qb2luKFwiLlwiKTtpZihqLmxlbmd0aD4wKXtuPW4rXCIuXCIrai5qb2luKFwiLlwiKX1yZXR1cm4gbn07QVNOMUhFWC5kdW1wPWZ1bmN0aW9uKGUsYyxrLGcpe3ZhciBvPWZ1bmN0aW9uKHcsaSl7aWYody5sZW5ndGg8PWkqMil7cmV0dXJuIHd9ZWxzZXt2YXIgdj13LnN1YnN0cigwLGkpK1wiLi4odG90YWwgXCIrdy5sZW5ndGgvMitcImJ5dGVzKS4uXCIrdy5zdWJzdHIody5sZW5ndGgtaSxpKTtyZXR1cm4gdn19O2lmKGM9PT11bmRlZmluZWQpe2M9e29tbWl0X2xvbmdfb2N0ZXQ6MzJ9fWlmKGs9PT11bmRlZmluZWQpe2s9MH1pZihnPT09dW5kZWZpbmVkKXtnPVwiXCJ9dmFyIHI9Yy5vbW1pdF9sb25nX29jdGV0O2lmKGUuc3Vic3RyKGssMik9PVwiMDFcIil7dmFyIGg9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKTtpZihoPT1cIjAwXCIpe3JldHVybiBnK1wiQk9PTEVBTiBGQUxTRVxcblwifWVsc2V7cmV0dXJuIGcrXCJCT09MRUFOIFRSVUVcXG5cIn19aWYoZS5zdWJzdHIoaywyKT09XCIwMlwiKXt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspO3JldHVybiBnK1wiSU5URUdFUiBcIitvKGgscikrXCJcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjAzXCIpe3ZhciBoPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsayk7cmV0dXJuIGcrXCJCSVRTVFJJTkcgXCIrbyhoLHIpK1wiXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIwNFwiKXt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspO2lmKEFTTjFIRVguaXNBU04xSEVYKGgpKXt2YXIgaj1nK1wiT0NURVRTVFJJTkcsIGVuY2Fwc3VsYXRlc1xcblwiO2o9aitBU04xSEVYLmR1bXAoaCxjLDAsZytcIiAgXCIpO3JldHVybiBqfWVsc2V7cmV0dXJuIGcrXCJPQ1RFVFNUUklORyBcIitvKGgscikrXCJcXG5cIn19aWYoZS5zdWJzdHIoaywyKT09XCIwNVwiKXtyZXR1cm4gZytcIk5VTExcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjA2XCIpe3ZhciBsPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsayk7dmFyIGE9S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50KGwpO3ZhciBuPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShhKTt2YXIgYj1hLnJlcGxhY2UoL1xcLi9nLFwiIFwiKTtpZihuIT1cIlwiKXtyZXR1cm4gZytcIk9iamVjdElkZW50aWZpZXIgXCIrbitcIiAoXCIrYitcIilcXG5cIn1lbHNle3JldHVybiBnK1wiT2JqZWN0SWRlbnRpZmllciAoXCIrYitcIilcXG5cIn19aWYoZS5zdWJzdHIoaywyKT09XCIwY1wiKXtyZXR1cm4gZytcIlVURjhTdHJpbmcgJ1wiK2hleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspKStcIidcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjEzXCIpe3JldHVybiBnK1wiUHJpbnRhYmxlU3RyaW5nICdcIitoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKSkrXCInXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIxNFwiKXtyZXR1cm4gZytcIlRlbGV0ZXhTdHJpbmcgJ1wiK2hleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspKStcIidcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjE2XCIpe3JldHVybiBnK1wiSUE1U3RyaW5nICdcIitoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKSkrXCInXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIxN1wiKXtyZXR1cm4gZytcIlVUQ1RpbWUgXCIraGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGUsaykpK1wiXFxuXCJ9aWYoZS5zdWJzdHIoaywyKT09XCIxOFwiKXtyZXR1cm4gZytcIkdlbmVyYWxpemVkVGltZSBcIitoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxrKSkrXCJcXG5cIn1pZihlLnN1YnN0cihrLDIpPT1cIjMwXCIpe2lmKGUuc3Vic3RyKGssNCk9PVwiMzAwMFwiKXtyZXR1cm4gZytcIlNFUVVFTkNFIHt9XFxuXCJ9dmFyIGo9ZytcIlNFUVVFTkNFXFxuXCI7dmFyIGQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxrKTt2YXIgZj1jO2lmKChkLmxlbmd0aD09Mnx8ZC5sZW5ndGg9PTMpJiZlLnN1YnN0cihkWzBdLDIpPT1cIjA2XCImJmUuc3Vic3RyKGRbZC5sZW5ndGgtMV0sMik9PVwiMDRcIil7dmFyIHQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZSxkWzBdKTt2YXIgYT1LSlVSLmFzbjEuQVNOMVV0aWwub2lkSGV4VG9JbnQodCk7dmFyIG49S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGEpO3ZhciBwPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYykpO3AueDUwOUV4dE5hbWU9bjtmPXB9Zm9yKHZhciBxPTA7cTxkLmxlbmd0aDtxKyspe2o9aitBU04xSEVYLmR1bXAoZSxmLGRbcV0sZytcIiAgXCIpfXJldHVybiBqfWlmKGUuc3Vic3RyKGssMik9PVwiMzFcIil7dmFyIGo9ZytcIlNFVFxcblwiO3ZhciBkPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGUsayk7Zm9yKHZhciBxPTA7cTxkLmxlbmd0aDtxKyspe2o9aitBU04xSEVYLmR1bXAoZSxjLGRbcV0sZytcIiAgXCIpfXJldHVybiBqfXZhciB1PXBhcnNlSW50KGUuc3Vic3RyKGssMiksMTYpO2lmKCh1JjEyOCkhPTApe3ZhciBtPXUmMzE7aWYoKHUmMzIpIT0wKXt2YXIgaj1nK1wiW1wiK20rXCJdXFxuXCI7dmFyIGQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSxrKTtmb3IodmFyIHE9MDtxPGQubGVuZ3RoO3ErKyl7aj1qK0FTTjFIRVguZHVtcChlLGMsZFtxXSxnK1wiICBcIil9cmV0dXJuIGp9ZWxzZXt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspO2lmKGguc3Vic3RyKDAsOCk9PVwiNjg3NDc0NzBcIil7aD1oZXh0b3V0ZjgoaCl9aWYoYy54NTA5RXh0TmFtZT09PVwic3ViamVjdEFsdE5hbWVcIiYmbT09Mil7aD1oZXh0b3V0ZjgoaCl9dmFyIGo9ZytcIltcIittK1wiXSBcIitoK1wiXFxuXCI7cmV0dXJuIGp9fXJldHVybiBnK1wiVU5LTk9XTihcIitlLnN1YnN0cihrLDIpK1wiKSBcIitBU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGspK1wiXFxuXCJ9O0FTTjFIRVguaXNBU04xSEVYPWZ1bmN0aW9uKGQpe2lmKGQubGVuZ3RoJTI9PTEpe3JldHVybiBmYWxzZX12YXIgYz1BU04xSEVYLmdldEludE9mTF9BdE9iaihkLDApO3ZhciBiPWQuc3Vic3RyKDAsMik7dmFyIGU9QVNOMUhFWC5nZXRIZXhPZkxfQXRPYmooZCwwKTt2YXIgYT1kLmxlbmd0aC1iLmxlbmd0aC1lLmxlbmd0aDtpZihhPT1jKjIpe3JldHVybiB0cnVlfXJldHVybiBmYWxzZX07XG4vKiEgYXNuMXg1MDktMS4wLjE0LmpzIChjKSAyMDEzLTIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1pZih0eXBlb2YgS0pVUi5hc24xLng1MDk9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEueDUwOSl7S0pVUi5hc24xLng1MDk9e319S0pVUi5hc24xLng1MDkuQ2VydGlmaWNhdGU9ZnVuY3Rpb24oZyl7S0pVUi5hc24xLng1MDkuQ2VydGlmaWNhdGUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGQ9bnVsbDt2YXIgZj1udWxsO3ZhciBjPW51bGw7dmFyIGE9bnVsbDt2YXIgZT1udWxsO3RoaXMuc2V0UnNhUHJ2S2V5QnlQRU1hbmRQYXNzPWZ1bmN0aW9uKGksayl7dmFyIGg9UEtDUzVQS0VZLmdldERlY3J5cHRlZEtleUhleChpLGspO3ZhciBqPW5ldyBSU0FLZXkoKTtqLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcoaCk7dGhpcy5wcnZLZXk9an07dGhpcy5zaWduPWZ1bmN0aW9uKCl7dGhpcy5hc24xU2lnbmF0dXJlQWxnPXRoaXMuYXNuMVRCU0NlcnQuYXNuMVNpZ25hdHVyZUFsZztzaWc9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOlwiU0hBMXdpdGhSU0FcIn0pO3NpZy5pbml0KHRoaXMucHJ2S2V5KTtzaWcudXBkYXRlSGV4KHRoaXMuYXNuMVRCU0NlcnQuZ2V0RW5jb2RlZEhleCgpKTt0aGlzLmhleFNpZz1zaWcuc2lnbigpO3RoaXMuYXNuMVNpZz1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIit0aGlzLmhleFNpZ30pO3ZhciBoPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmFzbjFUQlNDZXJ0LHRoaXMuYXNuMVNpZ25hdHVyZUFsZyx0aGlzLmFzbjFTaWddfSk7dGhpcy5oVExWPWguZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZX07dGhpcy5zZXRTaWduYXR1cmVIZXg9ZnVuY3Rpb24oaCl7dGhpcy5hc24xU2lnbmF0dXJlQWxnPXRoaXMuYXNuMVRCU0NlcnQuYXNuMVNpZ25hdHVyZUFsZzt0aGlzLmhleFNpZz1oO3RoaXMuYXNuMVNpZz1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIit0aGlzLmhleFNpZ30pO3ZhciBpPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmFzbjFUQlNDZXJ0LHRoaXMuYXNuMVNpZ25hdHVyZUFsZyx0aGlzLmFzbjFTaWddfSk7dGhpcy5oVExWPWkuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5pc01vZGlmaWVkPT1mYWxzZSYmdGhpcy5oVExWIT1udWxsKXtyZXR1cm4gdGhpcy5oVExWfXRocm93XCJub3Qgc2lnbmVkIHlldFwifTt0aGlzLmdldFBFTVN0cmluZz1mdW5jdGlvbigpe3ZhciBqPXRoaXMuZ2V0RW5jb2RlZEhleCgpO3ZhciBoPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uoaik7dmFyIGk9Q3J5cHRvSlMuZW5jLkJhc2U2NC5zdHJpbmdpZnkoaCk7dmFyIGs9aS5yZXBsYWNlKC8oLns2NH0pL2csXCIkMVxcclxcblwiKTtyZXR1cm5cIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxcclxcblwiK2srXCJcXHJcXG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXFxyXFxuXCJ9O2lmKHR5cGVvZiBnIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZy50YnNjZXJ0b2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFUQlNDZXJ0PWcudGJzY2VydG9ian1pZih0eXBlb2YgZy5wcnZrZXlvYmohPVwidW5kZWZpbmVkXCIpe3RoaXMucHJ2S2V5PWcucHJ2a2V5b2JqfWVsc2V7aWYodHlwZW9mIGcucnNhcHJ2a2V5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnBydktleT1nLnJzYXBydmtleX1lbHNle2lmKCh0eXBlb2YgZy5yc2FwcnZwZW0hPVwidW5kZWZpbmVkXCIpJiYodHlwZW9mIGcucnNhcHJ2cGFzIT1cInVuZGVmaW5lZFwiKSl7dGhpcy5zZXRSc2FQcnZLZXlCeVBFTWFuZFBhc3MoZy5yc2FwcnZwZW0sZy5yc2FwcnZwYXMpfX19fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQ2VydGlmaWNhdGUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LlRCU0NlcnRpZmljYXRlPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LlRCU0NlcnRpZmljYXRlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLl9pbml0aWFsaXplPWZ1bmN0aW9uKCl7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7dGhpcy5hc24xVmVyc2lvbj1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7b2JqOm5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjoyfSl9KTt0aGlzLmFzbjFTZXJpYWxOdW1iZXI9bnVsbDt0aGlzLmFzbjFTaWduYXR1cmVBbGc9bnVsbDt0aGlzLmFzbjFJc3N1ZXI9bnVsbDt0aGlzLmFzbjFOb3RCZWZvcmU9bnVsbDt0aGlzLmFzbjFOb3RBZnRlcj1udWxsO3RoaXMuYXNuMVN1YmplY3Q9bnVsbDt0aGlzLmFzbjFTdWJqUEtleT1udWxsO3RoaXMuZXh0ZW5zaW9uc0FycmF5PW5ldyBBcnJheSgpfTt0aGlzLnNldFNlcmlhbE51bWJlckJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xU2VyaWFsTnVtYmVyPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcihiKX07dGhpcy5zZXRTaWduYXR1cmVBbGdCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMVNpZ25hdHVyZUFsZz1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcihiKX07dGhpcy5zZXRJc3N1ZXJCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUlzc3Vlcj1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYil9O3RoaXMuc2V0Tm90QmVmb3JlQnlQYXJhbT1mdW5jdGlvbihiKXt0aGlzLmFzbjFOb3RCZWZvcmU9bmV3IEtKVVIuYXNuMS54NTA5LlRpbWUoYil9O3RoaXMuc2V0Tm90QWZ0ZXJCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMU5vdEFmdGVyPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGIpfTt0aGlzLnNldFN1YmplY3RCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMVN1YmplY3Q9bmV3IEtKVVIuYXNuMS54NTA5Llg1MDBOYW1lKGIpfTt0aGlzLnNldFN1YmplY3RQdWJsaWNLZXlCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMVN1YmpQS2V5PW5ldyBLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyhiKX07dGhpcy5zZXRTdWJqZWN0UHVibGljS2V5QnlHZXRLZXk9ZnVuY3Rpb24oYyl7dmFyIGI9S0VZVVRJTC5nZXRLZXkoYyk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvKGIpfTt0aGlzLmFwcGVuZEV4dGVuc2lvbj1mdW5jdGlvbihiKXt0aGlzLmV4dGVuc2lvbnNBcnJheS5wdXNoKGIpfTt0aGlzLmFwcGVuZEV4dGVuc2lvbkJ5TmFtZT1mdW5jdGlvbihkLGIpe2lmKGQudG9Mb3dlckNhc2UoKT09XCJiYXNpY2NvbnN0cmFpbnRzXCIpe3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5CYXNpY0NvbnN0cmFpbnRzKGIpO3RoaXMuYXBwZW5kRXh0ZW5zaW9uKGMpfWVsc2V7aWYoZC50b0xvd2VyQ2FzZSgpPT1cImtleXVzYWdlXCIpe3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5LZXlVc2FnZShiKTt0aGlzLmFwcGVuZEV4dGVuc2lvbihjKX1lbHNle2lmKGQudG9Mb3dlckNhc2UoKT09XCJjcmxkaXN0cmlidXRpb25wb2ludHNcIil7dmFyIGM9bmV3IEtKVVIuYXNuMS54NTA5LkNSTERpc3RyaWJ1dGlvblBvaW50cyhiKTt0aGlzLmFwcGVuZEV4dGVuc2lvbihjKX1lbHNle2lmKGQudG9Mb3dlckNhc2UoKT09XCJleHRrZXl1c2FnZVwiKXt2YXIgYz1uZXcgS0pVUi5hc24xLng1MDkuRXh0S2V5VXNhZ2UoYik7dGhpcy5hcHBlbmRFeHRlbnNpb24oYyl9ZWxzZXtpZihkLnRvTG93ZXJDYXNlKCk9PVwiYXV0aG9yaXR5a2V5aWRlbnRpZmllclwiKXt2YXIgYz1uZXcgS0pVUi5hc24xLng1MDkuQXV0aG9yaXR5S2V5SWRlbnRpZmllcihiKTt0aGlzLmFwcGVuZEV4dGVuc2lvbihjKX1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBleHRlbnNpb24gbmFtZTogXCIrZH19fX19fTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmFzbjFOb3RCZWZvcmU9PW51bGx8fHRoaXMuYXNuMU5vdEFmdGVyPT1udWxsKXt0aHJvd1wibm90QmVmb3JlIGFuZC9vciBub3RBZnRlciBub3Qgc2V0XCJ9dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuYXNuMU5vdEJlZm9yZSx0aGlzLmFzbjFOb3RBZnRlcl19KTt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVZlcnNpb24pO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU2VyaWFsTnVtYmVyKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVNpZ25hdHVyZUFsZyk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFJc3N1ZXIpO3RoaXMuYXNuMUFycmF5LnB1c2goYyk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFTdWJqZWN0KTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVN1YmpQS2V5KTtpZih0aGlzLmV4dGVuc2lvbnNBcnJheS5sZW5ndGg+MCl7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5leHRlbnNpb25zQXJyYXl9KTt2YXIgYj1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6dHJ1ZSx0YWc6XCJhM1wiLG9iajpkfSk7dGhpcy5hc24xQXJyYXkucHVzaChiKX12YXIgZT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTp0aGlzLmFzbjFBcnJheX0pO3RoaXMuaFRMVj1lLmdldEVuY29kZWRIZXgoKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2U7cmV0dXJuIHRoaXMuaFRMVn07dGhpcy5faW5pdGlhbGl6ZSgpfTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5UQlNDZXJ0aWZpY2F0ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS54NTA5LkV4dGVuc2lvbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDp0aGlzLm9pZH0pO3ZhciBlPW5ldyBLSlVSLmFzbjEuREVST2N0ZXRTdHJpbmcoe2hleDp0aGlzLmdldEV4dG5WYWx1ZUhleCgpfSk7dmFyIGQ9bmV3IEFycmF5KCk7ZC5wdXNoKGYpO2lmKHRoaXMuY3JpdGljYWwpe2QucHVzaChuZXcgS0pVUi5hc24xLkRFUkJvb2xlYW4oKSl9ZC5wdXNoKGUpO3ZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OmR9KTtyZXR1cm4gYy5nZXRFbmNvZGVkSGV4KCl9O3RoaXMuY3JpdGljYWw9ZmFsc2U7aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmNyaXRpY2FsIT1cInVuZGVmaW5lZFwiKXt0aGlzLmNyaXRpY2FsPWIuY3JpdGljYWx9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuRXh0ZW5zaW9uLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5LZXlVc2FnZT1mdW5jdGlvbihhKXtLSlVSLmFzbjEueDUwOS5LZXlVc2FnZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmdldEV4dG5WYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFzbjFFeHRuVmFsdWUuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLm9pZD1cIjIuNS4yOS4xNVwiO2lmKHR5cGVvZiBhIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYS5iaW4hPVwidW5kZWZpbmVkXCIpe3RoaXMuYXNuMUV4dG5WYWx1ZT1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyhhKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5LZXlVc2FnZSxLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24pO0tKVVIuYXNuMS54NTA5LkJhc2ljQ29uc3RyYWludHM9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLng1MDkuQmFzaWNDb25zdHJhaW50cy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxjKTt2YXIgYT1mYWxzZTt2YXIgYj0tMTt0aGlzLmdldEV4dG5WYWx1ZUhleD1mdW5jdGlvbigpe3ZhciBlPW5ldyBBcnJheSgpO2lmKHRoaXMuY0Epe2UucHVzaChuZXcgS0pVUi5hc24xLkRFUkJvb2xlYW4oKSl9aWYodGhpcy5wYXRoTGVuPi0xKXtlLnB1c2gobmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOnRoaXMucGF0aExlbn0pKX12YXIgZD1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5hc24xRXh0blZhbHVlPWQ7cmV0dXJuIHRoaXMuYXNuMUV4dG5WYWx1ZS5nZXRFbmNvZGVkSGV4KCl9O3RoaXMub2lkPVwiMi41LjI5LjE5XCI7dGhpcy5jQT1mYWxzZTt0aGlzLnBhdGhMZW49LTE7aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLmNBIT1cInVuZGVmaW5lZFwiKXt0aGlzLmNBPWMuY0F9aWYodHlwZW9mIGMucGF0aExlbiE9XCJ1bmRlZmluZWRcIil7dGhpcy5wYXRoTGVuPWMucGF0aExlbn19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5CYXNpY0NvbnN0cmFpbnRzLEtKVVIuYXNuMS54NTA5LkV4dGVuc2lvbik7S0pVUi5hc24xLng1MDkuQ1JMRGlzdHJpYnV0aW9uUG9pbnRzPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LkNSTERpc3RyaWJ1dGlvblBvaW50cy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmdldEV4dG5WYWx1ZUhleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFzbjFFeHRuVmFsdWUuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLnNldEJ5RFBBcnJheT1mdW5jdGlvbihiKXt0aGlzLmFzbjFFeHRuVmFsdWU9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6Yn0pfTt0aGlzLnNldEJ5T25lVVJJPWZ1bmN0aW9uKGUpe3ZhciBiPW5ldyBLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMoW3t1cmk6ZX1dKTt2YXIgZD1uZXcgS0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnROYW1lKGIpO3ZhciBjPW5ldyBLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludCh7ZHBvYmo6ZH0pO3RoaXMuc2V0QnlEUEFycmF5KFtjXSl9O3RoaXMub2lkPVwiMi41LjI5LjMxXCI7aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLmFycmF5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5RFBBcnJheShhLmFycmF5KX1lbHNle2lmKHR5cGVvZiBhLnVyaSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeU9uZVVSSShhLnVyaSl9fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkNSTERpc3RyaWJ1dGlvblBvaW50cyxLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24pO0tKVVIuYXNuMS54NTA5LkV4dEtleVVzYWdlPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS54NTA5LkV4dEtleVVzYWdlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpO3RoaXMuc2V0UHVycG9zZUFycmF5PWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUV4dG5WYWx1ZT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKCk7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcihiW2NdKTt0aGlzLmFzbjFFeHRuVmFsdWUuYXBwZW5kQVNOMU9iamVjdChkKX19O3RoaXMuZ2V0RXh0blZhbHVlSGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXNuMUV4dG5WYWx1ZS5nZXRFbmNvZGVkSGV4KCl9O3RoaXMub2lkPVwiMi41LjI5LjM3XCI7aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBhLmFycmF5IT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFB1cnBvc2VBcnJheShhLmFycmF5KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5FeHRLZXlVc2FnZSxLSlVSLmFzbjEueDUwOS5FeHRlbnNpb24pO0tKVVIuYXNuMS54NTA5LkF1dGhvcml0eUtleUlkZW50aWZpZXI9ZnVuY3Rpb24oYSl7S0pVUi5hc24xLng1MDkuQXV0aG9yaXR5S2V5SWRlbnRpZmllci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhKTt0aGlzLmFzbjFLSUQ9bnVsbDt0aGlzLmFzbjFDZXJ0SXNzdWVyPW51bGw7dGhpcy5hc24xQ2VydFNOPW51bGw7dGhpcy5nZXRFeHRuVmFsdWVIZXg9ZnVuY3Rpb24oKXt2YXIgYz1uZXcgQXJyYXkoKTtpZih0aGlzLmFzbjFLSUQpe2MucHVzaChuZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOlwiODBcIixvYmo6dGhpcy5hc24xS0lEfSkpfWlmKHRoaXMuYXNuMUNlcnRJc3N1ZXIpe2MucHVzaChuZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOlwiYTFcIixvYmo6dGhpcy5hc24xQ2VydElzc3Vlcn0pKX1pZih0aGlzLmFzbjFDZXJ0U04pe2MucHVzaChuZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOlwiODJcIixvYmo6dGhpcy5hc24xQ2VydFNOfSkpfXZhciBiPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OmN9KTt0aGlzLmFzbjFFeHRuVmFsdWU9YjtyZXR1cm4gdGhpcy5hc24xRXh0blZhbHVlLmdldEVuY29kZWRIZXgoKX07dGhpcy5zZXRLSURCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUtJRD1uZXcgS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nKGIpfTt0aGlzLnNldENlcnRJc3N1ZXJCeVBhcmFtPWZ1bmN0aW9uKGIpe3RoaXMuYXNuMUNlcnRJc3N1ZXI9bmV3IEtKVVIuYXNuMS54NTA5Llg1MDBOYW1lKGIpfTt0aGlzLnNldENlcnRTTkJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xQ2VydFNOPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcihiKX07dGhpcy5vaWQ9XCIyLjUuMjkuMzVcIjtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEua2lkIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEtJREJ5UGFyYW0oYS5raWQpfWlmKHR5cGVvZiBhLmlzc3VlciE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRDZXJ0SXNzdWVyQnlQYXJhbShhLmlzc3Vlcil9aWYodHlwZW9mIGEuc24hPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0Q2VydFNOQnlQYXJhbShhLnNuKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5BdXRob3JpdHlLZXlJZGVudGlmaWVyLEtKVVIuYXNuMS54NTA5LkV4dGVuc2lvbik7S0pVUi5hc24xLng1MDkuQ1JMPWZ1bmN0aW9uKGYpe0tKVVIuYXNuMS54NTA5LkNSTC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt2YXIgYz1udWxsO3ZhciBlPW51bGw7dmFyIGI9bnVsbDt2YXIgZD1udWxsO3RoaXMuc2V0UnNhUHJ2S2V5QnlQRU1hbmRQYXNzPWZ1bmN0aW9uKGgsail7dmFyIGc9UEtDUzVQS0VZLmdldERlY3J5cHRlZEtleUhleChoLGopO3ZhciBpPW5ldyBSU0FLZXkoKTtpLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcoZyk7dGhpcy5yc2FQcnZLZXk9aX07dGhpcy5zaWduPWZ1bmN0aW9uKCl7dGhpcy5hc24xU2lnbmF0dXJlQWxnPXRoaXMuYXNuMVRCU0NlcnRMaXN0LmFzbjFTaWduYXR1cmVBbGc7c2lnPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpcIlNIQTF3aXRoUlNBXCIscHJvdjpcImNyeXB0b2pzL2pzcnNhXCJ9KTtzaWcuaW5pdFNpZ24odGhpcy5yc2FQcnZLZXkpO3NpZy51cGRhdGVIZXgodGhpcy5hc24xVEJTQ2VydExpc3QuZ2V0RW5jb2RlZEhleCgpKTt0aGlzLmhleFNpZz1zaWcuc2lnbigpO3RoaXMuYXNuMVNpZz1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIit0aGlzLmhleFNpZ30pO3ZhciBnPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmFzbjFUQlNDZXJ0TGlzdCx0aGlzLmFzbjFTaWduYXR1cmVBbGcsdGhpcy5hc24xU2lnXX0pO3RoaXMuaFRMVj1nLmdldEVuY29kZWRIZXgoKTt0aGlzLmlzTW9kaWZpZWQ9ZmFsc2V9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuaXNNb2RpZmllZD09ZmFsc2UmJnRoaXMuaFRMViE9bnVsbCl7cmV0dXJuIHRoaXMuaFRMVn10aHJvd1wibm90IHNpZ25lZCB5ZXRcIn07dGhpcy5nZXRQRU1TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgaT10aGlzLmdldEVuY29kZWRIZXgoKTt2YXIgZz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGkpO3ZhciBoPUNyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KGcpO3ZhciBqPWgucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7cmV0dXJuXCItLS0tLUJFR0lOIFg1MDkgQ1JMLS0tLS1cXHJcXG5cIitqK1wiXFxyXFxuLS0tLS1FTkQgWDUwOSBDUkwtLS0tLVxcclxcblwifTtpZih0eXBlb2YgZiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGYudGJzb2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFUQlNDZXJ0TGlzdD1mLnRic29ian1pZih0eXBlb2YgZi5yc2FwcnZrZXkhPVwidW5kZWZpbmVkXCIpe3RoaXMucnNhUHJ2S2V5PWYucnNhcHJ2a2V5fWlmKCh0eXBlb2YgZi5yc2FwcnZwZW0hPVwidW5kZWZpbmVkXCIpJiYodHlwZW9mIGYucnNhcHJ2cGFzIT1cInVuZGVmaW5lZFwiKSl7dGhpcy5zZXRSc2FQcnZLZXlCeVBFTWFuZFBhc3MoZi5yc2FwcnZwZW0sZi5yc2FwcnZwYXMpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkNSTCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuVEJTQ2VydExpc3Q9ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuVEJTQ2VydExpc3Quc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5zZXRTaWduYXR1cmVBbGdCeVBhcmFtPWZ1bmN0aW9uKGMpe3RoaXMuYXNuMVNpZ25hdHVyZUFsZz1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcihjKX07dGhpcy5zZXRJc3N1ZXJCeVBhcmFtPWZ1bmN0aW9uKGMpe3RoaXMuYXNuMUlzc3Vlcj1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYyl9O3RoaXMuc2V0VGhpc1VwZGF0ZUJ5UGFyYW09ZnVuY3Rpb24oYyl7dGhpcy5hc24xVGhpc1VwZGF0ZT1uZXcgS0pVUi5hc24xLng1MDkuVGltZShjKX07dGhpcy5zZXROZXh0VXBkYXRlQnlQYXJhbT1mdW5jdGlvbihjKXt0aGlzLmFzbjFOZXh0VXBkYXRlPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGMpfTt0aGlzLmFkZFJldm9rZWRDZXJ0PWZ1bmN0aW9uKGMsZCl7dmFyIGY9e307aWYoYyE9dW5kZWZpbmVkJiZjIT1udWxsKXtmLnNuPWN9aWYoZCE9dW5kZWZpbmVkJiZkIT1udWxsKXtmLnRpbWU9ZH12YXIgZT1uZXcgS0pVUi5hc24xLng1MDkuQ1JMRW50cnkoZik7dGhpcy5hUmV2b2tlZENlcnQucHVzaChlKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7aWYodGhpcy5hc24xVmVyc2lvbiE9bnVsbCl7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFWZXJzaW9uKX10aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVNpZ25hdHVyZUFsZyk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFJc3N1ZXIpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xVGhpc1VwZGF0ZSk7aWYodGhpcy5hc24xTmV4dFVwZGF0ZSE9bnVsbCl7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFOZXh0VXBkYXRlKX1pZih0aGlzLmFSZXZva2VkQ2VydC5sZW5ndGg+MCl7dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6dGhpcy5hUmV2b2tlZENlcnR9KTt0aGlzLmFzbjFBcnJheS5wdXNoKGMpfXZhciBkPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZTtyZXR1cm4gdGhpcy5oVExWfTt0aGlzLl9pbml0aWFsaXplPWZ1bmN0aW9uKCl7dGhpcy5hc24xVmVyc2lvbj1udWxsO3RoaXMuYXNuMVNpZ25hdHVyZUFsZz1udWxsO3RoaXMuYXNuMUlzc3Vlcj1udWxsO3RoaXMuYXNuMVRoaXNVcGRhdGU9bnVsbDt0aGlzLmFzbjFOZXh0VXBkYXRlPW51bGw7dGhpcy5hUmV2b2tlZENlcnQ9bmV3IEFycmF5KCl9O3RoaXMuX2luaXRpYWxpemUoKX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuVEJTQ2VydExpc3QsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkNSTEVudHJ5PWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS54NTA5LkNSTEVudHJ5LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYj1udWxsO3ZhciBhPW51bGw7dGhpcy5zZXRDZXJ0U2VyaWFsPWZ1bmN0aW9uKGQpe3RoaXMuc249bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKGQpfTt0aGlzLnNldFJldm9jYXRpb25EYXRlPWZ1bmN0aW9uKGQpe3RoaXMudGltZT1uZXcgS0pVUi5hc24xLng1MDkuVGltZShkKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuc24sdGhpcy50aW1lXX0pO3RoaXMuVExWPWQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLlRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnRpbWUhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0UmV2b2NhdGlvbkRhdGUoYy50aW1lKX1pZih0eXBlb2YgYy5zbiE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRDZXJ0U2VyaWFsKGMuc24pfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkNSTEVudHJ5LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5YNTAwTmFtZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5YNTAwTmFtZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7dGhpcy5zZXRCeVN0cmluZz1mdW5jdGlvbihjKXt2YXIgZD1jLnNwbGl0KFwiL1wiKTtkLnNoaWZ0KCk7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe3RoaXMuYXNuMUFycmF5LnB1c2gobmV3IEtKVVIuYXNuMS54NTA5LlJETih7c3RyOmRbZV19KSl9fTt0aGlzLnNldEJ5T2JqZWN0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgYyBpbiBlKXtpZihlLmhhc093blByb3BlcnR5KGMpKXt2YXIgZD1uZXcgS0pVUi5hc24xLng1MDkuUkROKHtzdHI6YytcIj1cIitlW2NdfSk7dGhpcy5hc24xQXJyYXk/dGhpcy5hc24xQXJyYXkucHVzaChkKTp0aGlzLmFzbjFBcnJheT1bZF19fX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuaFRMVj09XCJzdHJpbmdcIil7cmV0dXJuIHRoaXMuaFRMVn12YXIgYz1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTp0aGlzLmFzbjFBcnJheX0pO3RoaXMuaFRMVj1jLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuc3RyIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldEJ5U3RyaW5nKGIuc3RyKX1lbHNle2lmKHR5cGVvZiBiPT09XCJvYmplY3RcIil7dGhpcy5zZXRCeU9iamVjdChiKX19aWYodHlwZW9mIGIuY2VydGlzc3VlciE9XCJ1bmRlZmluZWRcIil7dmFyIGE9bmV3IFg1MDkoKTthLmhleD1YNTA5LnBlbVRvSGV4KGIuY2VydGlzc3Vlcik7dGhpcy5oVExWPWEuZ2V0SXNzdWVySGV4KCl9aWYodHlwZW9mIGIuY2VydHN1YmplY3QhPVwidW5kZWZpbmVkXCIpe3ZhciBhPW5ldyBYNTA5KCk7YS5oZXg9WDUwOS5wZW1Ub0hleChiLmNlcnRzdWJqZWN0KTt0aGlzLmhUTFY9YS5nZXRTdWJqZWN0SGV4KCl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuWDUwME5hbWUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LlJETj1mdW5jdGlvbihhKXtLSlVSLmFzbjEueDUwOS5SRE4uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuYXNuMUFycmF5PW5ldyBBcnJheSgpO3RoaXMuYWRkQnlTdHJpbmc9ZnVuY3Rpb24oYil7dGhpcy5hc24xQXJyYXkucHVzaChuZXcgS0pVUi5hc24xLng1MDkuQXR0cmlidXRlVHlwZUFuZFZhbHVlKHtzdHI6Yn0pKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJTZXQoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7dGhpcy5UTFY9Yi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuVExWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuc3RyIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFkZEJ5U3RyaW5nKGEuc3RyKX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5SRE4sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5BdHRyaWJ1dGVUeXBlQW5kVmFsdWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBkPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1cInV0ZjhcIjt0aGlzLnNldEJ5U3RyaW5nPWZ1bmN0aW9uKGUpe2lmKGUubWF0Y2goL14oW149XSspPSguKykkLykpe3RoaXMuc2V0QnlBdHRyVHlwZUFuZFZhbHVlU3RyKFJlZ0V4cC4kMSxSZWdFeHAuJDIpfWVsc2V7dGhyb3dcIm1hbGZvcm1lZCBhdHRyVHlwZUFuZFZhbHVlU3RyOiBcIitlfX07dGhpcy5zZXRCeUF0dHJUeXBlQW5kVmFsdWVTdHI9ZnVuY3Rpb24oZyxmKXt0aGlzLnR5cGVPYmo9S0pVUi5hc24xLng1MDkuT0lELmF0eXBlMm9iaihnKTt2YXIgZT1hO2lmKGc9PVwiQ1wiKXtlPVwicHJuXCJ9dGhpcy52YWx1ZU9iaj10aGlzLmdldFZhbHVlT2JqKGUsZil9O3RoaXMuZ2V0VmFsdWVPYmo9ZnVuY3Rpb24oZixlKXtpZihmPT1cInV0ZjhcIil7cmV0dXJuIG5ldyBLSlVSLmFzbjEuREVSVVRGOFN0cmluZyh7c3RyOmV9KX1pZihmPT1cInByblwiKXtyZXR1cm4gbmV3IEtKVVIuYXNuMS5ERVJQcmludGFibGVTdHJpbmcoe3N0cjplfSl9aWYoZj09XCJ0ZWxcIil7cmV0dXJuIG5ldyBLSlVSLmFzbjEuREVSVGVsZXRleFN0cmluZyh7c3RyOmV9KX1pZihmPT1cImlhNVwiKXtyZXR1cm4gbmV3IEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcoe3N0cjplfSl9dGhyb3dcInVuc3VwcG9ydGVkIGRpcmVjdG9yeSBzdHJpbmcgdHlwZTogdHlwZT1cIitmK1wiIHZhbHVlPVwiK2V9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBlPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLnR5cGVPYmosdGhpcy52YWx1ZU9ial19KTt0aGlzLlRMVj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5UTFZ9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5zdHIhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlTdHJpbmcoYi5zdHIpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm89ZnVuY3Rpb24oZCl7S0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1udWxsO3RoaXMuc2V0UlNBS2V5PWZ1bmN0aW9uKGUpe2lmKCFSU0FLZXkucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoZSkpe3Rocm93XCJhcmd1bWVudCBpcyBub3QgUlNBS2V5IGluc3RhbmNlXCJ9dGhpcy5yc2FLZXk9ZTt2YXIgZz1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDplLm59KTt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe1wiaW50XCI6ZS5lfSk7dmFyIGk9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W2csZl19KTt2YXIgaD1pLmdldEVuY29kZWRIZXgoKTt0aGlzLmFzbjFBbGdJZD1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpcInJzYUVuY3J5cHRpb25cIn0pO3RoaXMuYXNuMVN1YmpQS2V5PW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK2h9KX07dGhpcy5zZXRSU0FQRU09ZnVuY3Rpb24oZyl7aWYoZy5tYXRjaCgvLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0vKSl7dmFyIG49ZztuPW4ucmVwbGFjZSgvXi0tLS0tW14tXSstLS0tLS8sXCJcIik7bj1uLnJlcGxhY2UoLy0tLS0tW14tXSstLS0tLVxccyokLyxcIlwiKTt2YXIgbT1uLnJlcGxhY2UoL1xccysvZyxcIlwiKTt2YXIgZj1DcnlwdG9KUy5lbmMuQmFzZTY0LnBhcnNlKG0pO3ZhciBpPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KGYpO3ZhciBrPV9yc2FwZW1fZ2V0SGV4VmFsdWVBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGkpO3ZhciBoPWtbMV07dmFyIGw9aC5zdWJzdHIoMik7dmFyIGU9X3JzYXBlbV9nZXRIZXhWYWx1ZUFycmF5T2ZDaGlsZHJlbkZyb21IZXgobCk7dmFyIGo9bmV3IFJTQUtleSgpO2ouc2V0UHVibGljKGVbMF0sZVsxXSk7dGhpcy5zZXRSU0FLZXkoail9ZWxzZXt0aHJvd1wia2V5IG5vdCBzdXBwb3J0ZWRcIn19O3RoaXMuZ2V0QVNOMU9iamVjdD1mdW5jdGlvbigpe2lmKHRoaXMuYXNuMUFsZ0lkPT1udWxsfHx0aGlzLmFzbjFTdWJqUEtleT09bnVsbCl7dGhyb3dcImFsZ0lkIGFuZC9vciBzdWJqUHViS2V5IG5vdCBzZXRcIn12YXIgZT1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5hc24xQWxnSWQsdGhpcy5hc24xU3VialBLZXldfSk7cmV0dXJuIGV9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0QVNOMU9iamVjdCgpO3RoaXMuaFRMVj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTt0aGlzLl9zZXRSU0FLZXk9ZnVuY3Rpb24oZSl7dmFyIGc9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjp7YmlnaW50OmUubn19LHtcImludFwiOntcImludFwiOmUuZX19XX0pO3ZhciBmPWcuZ2V0RW5jb2RlZEhleCgpO3RoaXMuYXNuMUFsZ0lkPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOlwicnNhRW5jcnlwdGlvblwifSk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrZn0pfTt0aGlzLl9zZXRFQz1mdW5jdGlvbihlKXt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe25hbWU6ZS5jdXJ2ZU5hbWV9KTt0aGlzLmFzbjFBbGdJZD1uZXcgS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpcImVjUHVibGljS2V5XCIsYXNuMXBhcmFtczpmfSk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrZS5wdWJLZXlIZXh9KX07dGhpcy5fc2V0RFNBPWZ1bmN0aW9uKGUpe3ZhciBmPW5ldyBLSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOntiaWdpbnQ6ZS5wfX0se1wiaW50XCI6e2JpZ2ludDplLnF9fSx7XCJpbnRcIjp7YmlnaW50OmUuZ319XX0pO3RoaXMuYXNuMUFsZ0lkPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOlwiZHNhXCIsYXNuMXBhcmFtczpmfSk7dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6ZS55fSk7dGhpcy5hc24xU3VialBLZXk9bmV3IEtKVVIuYXNuMS5ERVJCaXRTdHJpbmcoe2hleDpcIjAwXCIrZy5nZXRFbmNvZGVkSGV4KCl9KX07aWYodHlwZW9mIGQhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmQgaW5zdGFuY2VvZiBSU0FLZXkpe3RoaXMuX3NldFJTQUtleShkKX1lbHNle2lmKHR5cGVvZiBLSlVSLmNyeXB0by5FQ0RTQSE9XCJ1bmRlZmluZWRcIiYmZCBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKXt0aGlzLl9zZXRFQyhkKX1lbHNle2lmKHR5cGVvZiBLSlVSLmNyeXB0by5EU0EhPVwidW5kZWZpbmVkXCImJmQgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0Epe3RoaXMuX3NldERTQShkKX1lbHNle2lmKHR5cGVvZiBkLnJzYWtleSE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRSU0FLZXkoZC5yc2FrZXkpfWVsc2V7aWYodHlwZW9mIGQucnNhcGVtIT1cInVuZGVmaW5lZFwiKXt0aGlzLnNldFJTQVBFTShkLnJzYXBlbSl9fX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LlN1YmplY3RQdWJsaWNLZXlJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5UaW1lPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS54NTA5LlRpbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBiPW51bGw7dmFyIGE9bnVsbDt0aGlzLnNldFRpbWVQYXJhbXM9ZnVuY3Rpb24oZCl7dGhpcy50aW1lUGFyYW1zPWR9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBkPW51bGw7aWYodGhpcy50aW1lUGFyYW1zIT1udWxsKXtpZih0aGlzLnR5cGU9PVwidXRjXCIpe2Q9bmV3IEtKVVIuYXNuMS5ERVJVVENUaW1lKHRoaXMudGltZVBhcmFtcyl9ZWxzZXtkPW5ldyBLSlVSLmFzbjEuREVSR2VuZXJhbGl6ZWRUaW1lKHRoaXMudGltZVBhcmFtcyl9fWVsc2V7aWYodGhpcy50eXBlPT1cInV0Y1wiKXtkPW5ldyBLSlVSLmFzbjEuREVSVVRDVGltZSgpfWVsc2V7ZD1uZXcgS0pVUi5hc24xLkRFUkdlbmVyYWxpemVkVGltZSgpfX10aGlzLlRMVj1kLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5UTFZ9O3RoaXMudHlwZT1cInV0Y1wiO2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy50eXBlIT1cInVuZGVmaW5lZFwiKXt0aGlzLnR5cGU9Yy50eXBlfWVsc2V7aWYodHlwZW9mIGMuc3RyIT1cInVuZGVmaW5lZFwiKXtpZihjLnN0ci5tYXRjaCgvXlswLTldezEyfVokLykpe3RoaXMudHlwZT1cInV0Y1wifWlmKGMuc3RyLm1hdGNoKC9eWzAtOV17MTR9WiQvKSl7dGhpcy50eXBlPVwiZ2VuXCJ9fX10aGlzLnRpbWVQYXJhbXM9Y319O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LlRpbWUsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXI9ZnVuY3Rpb24oZSl7S0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9bnVsbDt2YXIgZD1udWxsO3ZhciBiPW51bGw7dmFyIGM9ZmFsc2U7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5uYW1lQWxnPT1udWxsJiZ0aGlzLmFzbjFBbGc9PW51bGwpe3Rocm93XCJhbGdvcml0aG0gbm90IHNwZWNpZmllZFwifWlmKHRoaXMubmFtZUFsZyE9bnVsbCYmdGhpcy5hc24xQWxnPT1udWxsKXt0aGlzLmFzbjFBbGc9S0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2JqKHRoaXMubmFtZUFsZyl9dmFyIGY9W3RoaXMuYXNuMUFsZ107aWYoIXRoaXMucGFyYW1FbXB0eSl7Zi5wdXNoKHRoaXMuYXNuMVBhcmFtcyl9dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6Zn0pO3RoaXMuaFRMVj1nLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGUubmFtZSE9XCJ1bmRlZmluZWRcIil7dGhpcy5uYW1lQWxnPWUubmFtZX1pZih0eXBlb2YgZS5hc24xcGFyYW1zIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFQYXJhbXM9ZS5hc24xcGFyYW1zfWlmKHR5cGVvZiBlLnBhcmFtZW1wdHkhPVwidW5kZWZpbmVkXCIpe3RoaXMucGFyYW1FbXB0eT1lLnBhcmFtZW1wdHl9fWlmKHRoaXMuYXNuMVBhcmFtcz09bnVsbCl7dGhpcy5hc24xUGFyYW1zPW5ldyBLSlVSLmFzbjEuREVSTnVsbCgpfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLng1MDkuQWxnb3JpdGhtSWRlbnRpZmllcixLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWU9ZnVuY3Rpb24oZCl7S0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBjPW51bGw7dmFyIGI9bnVsbDt2YXIgYT17cmZjODIyOlwiODFcIixkbnM6XCI4MlwiLGRuOlwiYTRcIix1cmk6XCI4NlwifTt0aGlzLmV4cGxpY2l0PWZhbHNlO3RoaXMuc2V0QnlQYXJhbT1mdW5jdGlvbihrKXt2YXIgaj1udWxsO3ZhciBnPW51bGw7aWYodHlwZW9mIGs9PVwidW5kZWZpbmVkXCIpe3JldHVybn1pZih0eXBlb2Ygay5yZmM4MjIhPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1cInJmYzgyMlwiO2c9bmV3IEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcoe3N0cjprW3RoaXMudHlwZV19KX1pZih0eXBlb2Ygay5kbnMhPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1cImRuc1wiO2c9bmV3IEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcoe3N0cjprW3RoaXMudHlwZV19KX1pZih0eXBlb2Ygay51cmkhPVwidW5kZWZpbmVkXCIpe3RoaXMudHlwZT1cInVyaVwiO2c9bmV3IEtKVVIuYXNuMS5ERVJJQTVTdHJpbmcoe3N0cjprW3RoaXMudHlwZV19KX1pZih0eXBlb2Ygay5jZXJ0aXNzdWVyIT1cInVuZGVmaW5lZFwiKXt0aGlzLnR5cGU9XCJkblwiO3RoaXMuZXhwbGljaXQ9dHJ1ZTt2YXIgaD1rLmNlcnRpc3N1ZXI7dmFyIGY9bnVsbDtpZihoLm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXtmPT1ofWlmKGguaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpIT0tMSl7Zj1YNTA5LnBlbVRvSGV4KGgpfWlmKGY9PW51bGwpe3Rocm93XCJjZXJ0aXNzdWVyIHBhcmFtIG5vdCBjZXJ0XCJ9dmFyIGU9bmV3IFg1MDkoKTtlLmhleD1mO3ZhciBpPWUuZ2V0SXNzdWVySGV4KCk7Zz1uZXcgS0pVUi5hc24xLkFTTjFPYmplY3QoKTtnLmhUTFY9aX1pZih0eXBlb2Ygay5jZXJ0c3ViaiE9XCJ1bmRlZmluZWRcIil7dGhpcy50eXBlPVwiZG5cIjt0aGlzLmV4cGxpY2l0PXRydWU7dmFyIGg9ay5jZXJ0c3Viajt2YXIgZj1udWxsO2lmKGgubWF0Y2goL15bMC05QS1GYS1mXSskLykpe2Y9PWh9aWYoaC5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXtmPVg1MDkucGVtVG9IZXgoaCl9aWYoZj09bnVsbCl7dGhyb3dcImNlcnRzdWJqIHBhcmFtIG5vdCBjZXJ0XCJ9dmFyIGU9bmV3IFg1MDkoKTtlLmhleD1mO3ZhciBpPWUuZ2V0U3ViamVjdEhleCgpO2c9bmV3IEtKVVIuYXNuMS5BU04xT2JqZWN0KCk7Zy5oVExWPWl9aWYodGhpcy50eXBlPT1udWxsKXt0aHJvd1widW5zdXBwb3J0ZWQgdHlwZSBpbiBwYXJhbXM9XCIra310aGlzLmFzbjFPYmo9bmV3IEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Qoe2V4cGxpY2l0OnRoaXMuZXhwbGljaXQsdGFnOmFbdGhpcy50eXBlXSxvYmo6Z30pfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc24xT2JqLmdldEVuY29kZWRIZXgoKX07aWYodHlwZW9mIGQhPVwidW5kZWZpbmVkXCIpe3RoaXMuc2V0QnlQYXJhbShkKX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZXM9ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWVzLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1udWxsO3RoaXMuc2V0QnlQYXJhbUFycmF5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgYz0wO2M8ZS5sZW5ndGg7YysrKXt2YXIgZD1uZXcgS0pVUi5hc24xLng1MDkuR2VuZXJhbE5hbWUoZVtjXSk7dGhpcy5hc24xQXJyYXkucHVzaChkKX19O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7cmV0dXJuIGMuZ2V0RW5jb2RlZEhleCgpfTt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7dGhpcy5zZXRCeVBhcmFtQXJyYXkoYil9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEueDUwOS5HZW5lcmFsTmFtZXMsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50TmFtZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEueDUwOS5EaXN0cmlidXRpb25Qb2ludE5hbWUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBlPW51bGw7dmFyIGM9bnVsbDt2YXIgYT1udWxsO3ZhciBkPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy50eXBlIT1cImZ1bGxcIil7dGhyb3dcImN1cnJlbnRseSB0eXBlIHNoYWxsIGJlICdmdWxsJzogXCIrdGhpcy50eXBlfXRoaXMuYXNuMU9iaj1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6ZmFsc2UsdGFnOnRoaXMudGFnLG9iajp0aGlzLmFzbjFWfSk7dGhpcy5oVExWPXRoaXMuYXNuMU9iai5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKEtKVVIuYXNuMS54NTA5LkdlbmVyYWxOYW1lcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihiKSl7dGhpcy50eXBlPVwiZnVsbFwiO3RoaXMudGFnPVwiYTBcIjt0aGlzLmFzbjFWPWJ9ZWxzZXt0aHJvd1wiVGhpcyBjbGFzcyBzdXBwb3J0cyBHZW5lcmFsTmFtZXMgb25seSBhcyBhcmd1bWVudFwifX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50TmFtZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnQ9ZnVuY3Rpb24oYil7S0pVUi5hc24xLng1MDkuRGlzdHJpYnV0aW9uUG9pbnQuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGM9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSgpO2lmKHRoaXMuYXNuMURQIT1udWxsKXt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUlRhZ2dlZE9iamVjdCh7ZXhwbGljaXQ6dHJ1ZSx0YWc6XCJhMFwiLG9iajp0aGlzLmFzbjFEUH0pO2MuYXBwZW5kQVNOMU9iamVjdChkKX10aGlzLmhUTFY9Yy5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLmRwb2JqIT1cInVuZGVmaW5lZFwiKXt0aGlzLmFzbjFEUD1iLmRwb2JqfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS54NTA5LkRpc3RyaWJ1dGlvblBvaW50LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEueDUwOS5PSUQ9bmV3IGZ1bmN0aW9uKGEpe3RoaXMuYXR5cGUyb2lkTGlzdD17QzpcIjIuNS40LjZcIixPOlwiMi41LjQuMTBcIixPVTpcIjIuNS40LjExXCIsU1Q6XCIyLjUuNC44XCIsTDpcIjIuNS40LjdcIixDTjpcIjIuNS40LjNcIixTTjpcIjIuNS40LjRcIixETjpcIjIuNS40LjQ5XCIsREM6XCIwLjkuMjM0Mi4xOTIwMDMwMC4xMDAuMS4yNVwiLH07dGhpcy5uYW1lMm9pZExpc3Q9e3NoYTE6XCIxLjMuMTQuMy4yLjI2XCIsc2hhMjU2OlwiMi4xNi44NDAuMS4xMDEuMy40LjIuMVwiLHNoYTM4NDpcIjIuMTYuODQwLjEuMTAxLjMuNC4yLjJcIixzaGE1MTI6XCIyLjE2Ljg0MC4xLjEwMS4zLjQuMi4zXCIsc2hhMjI0OlwiMi4xNi44NDAuMS4xMDEuMy40LjIuNFwiLG1kNTpcIjEuMi44NDAuMTEzNTQ5LjIuNVwiLG1kMjpcIjEuMy4xNC43LjIuMi4xXCIscmlwZW1kMTYwOlwiMS4zLjM2LjMuMi4xXCIsTUQyd2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4yXCIsTUQ0d2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4zXCIsTUQ1d2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS40XCIsU0hBMXdpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuNVwiLFNIQTIyNHdpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuMTRcIixTSEEyNTZ3aXRoUlNBOlwiMS4yLjg0MC4xMTM1NDkuMS4xLjExXCIsU0hBMzg0d2l0aFJTQTpcIjEuMi44NDAuMTEzNTQ5LjEuMS4xMlwiLFNIQTUxMndpdGhSU0E6XCIxLjIuODQwLjExMzU0OS4xLjEuMTNcIixTSEExd2l0aEVDRFNBOlwiMS4yLjg0MC4xMDA0NS40LjFcIixTSEEyMjR3aXRoRUNEU0E6XCIxLjIuODQwLjEwMDQ1LjQuMy4xXCIsU0hBMjU2d2l0aEVDRFNBOlwiMS4yLjg0MC4xMDA0NS40LjMuMlwiLFNIQTM4NHdpdGhFQ0RTQTpcIjEuMi44NDAuMTAwNDUuNC4zLjNcIixTSEE1MTJ3aXRoRUNEU0E6XCIxLjIuODQwLjEwMDQ1LjQuMy40XCIsZHNhOlwiMS4yLjg0MC4xMDA0MC40LjFcIixTSEExd2l0aERTQTpcIjEuMi44NDAuMTAwNDAuNC4zXCIsU0hBMjI0d2l0aERTQTpcIjIuMTYuODQwLjEuMTAxLjMuNC4zLjFcIixTSEEyNTZ3aXRoRFNBOlwiMi4xNi44NDAuMS4xMDEuMy40LjMuMlwiLHJzYUVuY3J5cHRpb246XCIxLjIuODQwLjExMzU0OS4xLjEuMVwiLGNvdW50cnlOYW1lOlwiMi41LjQuNlwiLG9yZ2FuaXphdGlvbjpcIjIuNS40LjEwXCIsb3JnYW5pemF0aW9uYWxVbml0OlwiMi41LjQuMTFcIixzdGF0ZU9yUHJvdmluY2VOYW1lOlwiMi41LjQuOFwiLGxvY2FsaXR5OlwiMi41LjQuN1wiLGNvbW1vbk5hbWU6XCIyLjUuNC4zXCIsc3ViamVjdEtleUlkZW50aWZpZXI6XCIyLjUuMjkuMTRcIixrZXlVc2FnZTpcIjIuNS4yOS4xNVwiLHN1YmplY3RBbHROYW1lOlwiMi41LjI5LjE3XCIsYmFzaWNDb25zdHJhaW50czpcIjIuNS4yOS4xOVwiLG5hbWVDb25zdHJhaW50czpcIjIuNS4yOS4zMFwiLGNSTERpc3RyaWJ1dGlvblBvaW50czpcIjIuNS4yOS4zMVwiLGNlcnRpZmljYXRlUG9saWNpZXM6XCIyLjUuMjkuMzJcIixhdXRob3JpdHlLZXlJZGVudGlmaWVyOlwiMi41LjI5LjM1XCIscG9saWN5Q29uc3RyYWludHM6XCIyLjUuMjkuMzZcIixleHRLZXlVc2FnZTpcIjIuNS4yOS4zN1wiLGF1dGhvcml0eUluZm9BY2Nlc3M6XCIxLjMuNi4xLjUuNS43LjEuMVwiLGFueUV4dGVuZGVkS2V5VXNhZ2U6XCIyLjUuMjkuMzcuMFwiLHNlcnZlckF1dGg6XCIxLjMuNi4xLjUuNS43LjMuMVwiLGNsaWVudEF1dGg6XCIxLjMuNi4xLjUuNS43LjMuMlwiLGNvZGVTaWduaW5nOlwiMS4zLjYuMS41LjUuNy4zLjNcIixlbWFpbFByb3RlY3Rpb246XCIxLjMuNi4xLjUuNS43LjMuNFwiLHRpbWVTdGFtcGluZzpcIjEuMy42LjEuNS41LjcuMy44XCIsb2NzcFNpZ25pbmc6XCIxLjMuNi4xLjUuNS43LjMuOVwiLGVjUHVibGljS2V5OlwiMS4yLjg0MC4xMDA0NS4yLjFcIixzZWNwMjU2cjE6XCIxLjIuODQwLjEwMDQ1LjMuMS43XCIsc2VjcDI1NmsxOlwiMS4zLjEzMi4wLjEwXCIsc2VjcDM4NHIxOlwiMS4zLjEzMi4wLjM0XCIscGtjczVQQkVTMjpcIjEuMi44NDAuMTEzNTQ5LjEuNS4xM1wiLHBrY3M1UEJLREYyOlwiMS4yLjg0MC4xMTM1NDkuMS41LjEyXCIsXCJkZXMtRURFMy1DQkNcIjpcIjEuMi44NDAuMTEzNTQ5LjMuN1wiLGRhdGE6XCIxLjIuODQwLjExMzU0OS4xLjcuMVwiLFwic2lnbmVkLWRhdGFcIjpcIjEuMi44NDAuMTEzNTQ5LjEuNy4yXCIsXCJlbnZlbG9wZWQtZGF0YVwiOlwiMS4yLjg0MC4xMTM1NDkuMS43LjNcIixcImRpZ2VzdGVkLWRhdGFcIjpcIjEuMi44NDAuMTEzNTQ5LjEuNy41XCIsXCJlbmNyeXB0ZWQtZGF0YVwiOlwiMS4yLjg0MC4xMTM1NDkuMS43LjZcIixcImF1dGhlbnRpY2F0ZWQtZGF0YVwiOlwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjEuMlwiLHRzdGluZm86XCIxLjIuODQwLjExMzU0OS4xLjkuMTYuMS40XCIsfTt0aGlzLm9iakNhY2hlPXt9O3RoaXMubmFtZTJvYmo9ZnVuY3Rpb24oYil7aWYodHlwZW9mIHRoaXMub2JqQ2FjaGVbYl0hPVwidW5kZWZpbmVkXCIpe3JldHVybiB0aGlzLm9iakNhY2hlW2JdfWlmKHR5cGVvZiB0aGlzLm5hbWUyb2lkTGlzdFtiXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIk5hbWUgb2YgT2JqZWN0SWRlbnRpZmllciBub3QgZGVmaW5lZDogXCIrYn12YXIgYz10aGlzLm5hbWUyb2lkTGlzdFtiXTt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDpjfSk7dGhpcy5vYmpDYWNoZVtiXT1kO3JldHVybiBkfTt0aGlzLmF0eXBlMm9iaj1mdW5jdGlvbihiKXtpZih0eXBlb2YgdGhpcy5vYmpDYWNoZVtiXSE9XCJ1bmRlZmluZWRcIil7cmV0dXJuIHRoaXMub2JqQ2FjaGVbYl19aWYodHlwZW9mIHRoaXMuYXR5cGUyb2lkTGlzdFtiXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIkF0dHJpYnV0ZVR5cGUgbmFtZSB1bmRlZmluZWQ6IFwiK2J9dmFyIGM9dGhpcy5hdHlwZTJvaWRMaXN0W2JdO3ZhciBkPW5ldyBLSlVSLmFzbjEuREVST2JqZWN0SWRlbnRpZmllcih7b2lkOmN9KTt0aGlzLm9iakNhY2hlW2JdPWQ7cmV0dXJuIGR9fTtLSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWU9ZnVuY3Rpb24oYil7dmFyIGM9S0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkTGlzdDtmb3IodmFyIGEgaW4gYyl7aWYoY1thXT09Yil7cmV0dXJuIGF9fXJldHVyblwiXCJ9O0tKVVIuYXNuMS54NTA5Lk9JRC5uYW1lMm9pZD1mdW5jdGlvbihhKXt2YXIgYj1LSlVSLmFzbjEueDUwOS5PSUQubmFtZTJvaWRMaXN0O2lmKGJbYV09PT11bmRlZmluZWQpe3JldHVyblwiXCJ9cmV0dXJuIGJbYV19O0tKVVIuYXNuMS54NTA5Llg1MDlVdGlsPW5ldyBmdW5jdGlvbigpe3RoaXMuZ2V0UEtDUzhQdWJLZXlQRU1mcm9tUlNBS2V5PWZ1bmN0aW9uKGkpe3ZhciBoPW51bGw7dmFyIGY9S0pVUi5hc24xLkFTTjFVdGlsLmJpZ0ludFRvTWluVHdvc0NvbXBsZW1lbnRzSGV4KGkubik7dmFyIGo9S0pVUi5hc24xLkFTTjFVdGlsLmludGVnZXJUb0J5dGVIZXgoaS5lKTt2YXIgYT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2hleDpmfSk7dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtoZXg6an0pO3ZhciBsPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OlthLGddfSk7dmFyIGM9bC5nZXRFbmNvZGVkSGV4KCk7dmFyIGQ9bmV3IEtKVVIuYXNuMS54NTA5LkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6XCJyc2FFbmNyeXB0aW9uXCJ9KTt2YXIgYj1uZXcgS0pVUi5hc24xLkRFUkJpdFN0cmluZyh7aGV4OlwiMDBcIitjfSk7dmFyIGs9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W2QsYl19KTt2YXIgZT1rLmdldEVuY29kZWRIZXgoKTt2YXIgaD1LSlVSLmFzbjEuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChlLFwiUFVCTElDIEtFWVwiKTtyZXR1cm4gaH19O0tKVVIuYXNuMS54NTA5Llg1MDlVdGlsLm5ld0NlcnRQRU09ZnVuY3Rpb24oZil7dmFyIGM9S0pVUi5hc24xLng1MDk7dmFyIGU9bmV3IGMuVEJTQ2VydGlmaWNhdGUoKTtpZihmLnNlcmlhbCE9PXVuZGVmaW5lZCl7ZS5zZXRTZXJpYWxOdW1iZXJCeVBhcmFtKGYuc2VyaWFsKX1lbHNle3Rocm93XCJzZXJpYWwgbnVtYmVyIHVuZGVmaW5lZC5cIn1pZih0eXBlb2YgZi5zaWdhbGcubmFtZT09XCJzdHJpbmdcIil7ZS5zZXRTaWduYXR1cmVBbGdCeVBhcmFtKGYuc2lnYWxnKX1lbHNle3Rocm93XCJ1bnByb3BlciBzaWduYXR1cmUgYWxnb3JpdGhtIG5hbWVcIn1pZihmLmlzc3VlciE9PXVuZGVmaW5lZCl7ZS5zZXRJc3N1ZXJCeVBhcmFtKGYuaXNzdWVyKX1lbHNle3Rocm93XCJpc3N1ZXIgbmFtZSB1bmRlZmluZWQuXCJ9aWYoZi5ub3RiZWZvcmUhPT11bmRlZmluZWQpe2Uuc2V0Tm90QmVmb3JlQnlQYXJhbShmLm5vdGJlZm9yZSl9ZWxzZXt0aHJvd1wibm90YmVmb3JlIHVuZGVmaW5lZC5cIn1pZihmLm5vdGFmdGVyIT09dW5kZWZpbmVkKXtlLnNldE5vdEFmdGVyQnlQYXJhbShmLm5vdGFmdGVyKX1lbHNle3Rocm93XCJub3RhZnRlciB1bmRlZmluZWQuXCJ9aWYoZi5zdWJqZWN0IT09dW5kZWZpbmVkKXtlLnNldFN1YmplY3RCeVBhcmFtKGYuc3ViamVjdCl9ZWxzZXt0aHJvd1wic3ViamVjdCBuYW1lIHVuZGVmaW5lZC5cIn1pZihmLnNianB1YmtleSE9PXVuZGVmaW5lZCl7ZS5zZXRTdWJqZWN0UHVibGljS2V5QnlHZXRLZXkoZi5zYmpwdWJrZXkpfWVsc2V7dGhyb3dcInN1YmplY3QgcHVibGljIGtleSB1bmRlZmluZWQuXCJ9aWYoZi5leHQhPT11bmRlZmluZWQmJmYuZXh0Lmxlbmd0aCE9PXVuZGVmaW5lZCl7Zm9yKHZhciBiPTA7YjxmLmV4dC5sZW5ndGg7YisrKXtmb3Ioa2V5IGluIGYuZXh0W2JdKXtlLmFwcGVuZEV4dGVuc2lvbkJ5TmFtZShrZXksZi5leHRbYl1ba2V5XSl9fX1pZihmLmNha2V5PT09dW5kZWZpbmVkJiZmLnNpZ2hleD09PXVuZGVmaW5lZCl7dGhyb3dcInBhcmFtIGNha2V5IGFuZCBzaWdoZXggdW5kZWZpbmVkLlwifXZhciBkPW51bGw7dmFyIGE9bnVsbDtpZihmLmNha2V5KXtkPUtFWVVUSUwuZ2V0S2V5LmFwcGx5KG51bGwsZi5jYWtleSk7YT1uZXcgYy5DZXJ0aWZpY2F0ZSh7dGJzY2VydG9iajplLHBydmtleW9iajpkfSk7YS5zaWduKCl9aWYoZi5zaWdoZXgpe2E9bmV3IGMuQ2VydGlmaWNhdGUoe3Ric2NlcnRvYmo6ZX0pO2Euc2V0U2lnbmF0dXJlSGV4KGYuc2lnaGV4KX1yZXR1cm4gYS5nZXRQRU1TdHJpbmcoKX07XG4vKiEgYXNuMWNtcy0xLjAuMi5qcyAoYykgMjAxMy0yMDE0IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5hc24xPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xKXtLSlVSLmFzbjE9e319aWYodHlwZW9mIEtKVVIuYXNuMS5jbXM9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEuY21zKXtLSlVSLmFzbjEuY21zPXt9fUtKVVIuYXNuMS5jbXMuQXR0cmlidXRlPWZ1bmN0aW9uKGIpe0tKVVIuYXNuMS5jbXMuQXR0cmlidXRlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1bXTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZixlLGM7Zj1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDp0aGlzLmF0dHJUeXBlT2lkfSk7ZT1uZXcgS0pVUi5hc24xLkRFUlNldCh7YXJyYXk6dGhpcy52YWx1ZUxpc3R9KTt0cnl7ZS5nZXRFbmNvZGVkSGV4KCl9Y2F0Y2goZCl7dGhyb3dcImZhaWwgdmFsdWVTZXQuZ2V0RW5jb2RlZEhleCBpbiBBdHRyaWJ1dGUoMSkvXCIrZH1jPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OltmLGVdfSk7dHJ5e3RoaXMuaFRMVj1jLmdldEVuY29kZWRIZXgoKX1jYXRjaChkKXt0aHJvd1wiZmFpbGVkIHNlcS5nZXRFbmNvZGVkSGV4IGluIEF0dHJpYnV0ZSgyKS9cIitkfXJldHVybiB0aGlzLmhUTFZ9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5Db250ZW50VHlwZT1mdW5jdGlvbihiKXtLSlVSLmFzbjEuY21zLkNvbnRlbnRUeXBlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjNcIjt2YXIgYT1udWxsO2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXt2YXIgYT1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoYik7dGhpcy52YWx1ZUxpc3Q9W2FdfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5Db250ZW50VHlwZSxLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNtcy5NZXNzYWdlRGlnZXN0PWZ1bmN0aW9uKGUpe0tKVVIuYXNuMS5jbXMuTWVzc2FnZURpZ2VzdC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hdHRyVHlwZU9pZD1cIjEuMi44NDAuMTEzNTQ5LjEuOS40XCI7aWYodHlwZW9mIGUhPVwidW5kZWZpbmVkXCIpe2lmKGUuZWNpT2JqIGluc3RhbmNlb2YgS0pVUi5hc24xLmNtcy5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbyYmdHlwZW9mIGUuaGFzaEFsZz09XCJzdHJpbmdcIil7dmFyIGI9ZS5lY2lPYmouZUNvbnRlbnRWYWx1ZUhleDt2YXIgYT1lLmhhc2hBbGc7dmFyIGM9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGIsYSk7dmFyIGQ9bmV3IEtKVVIuYXNuMS5ERVJPY3RldFN0cmluZyh7aGV4OmN9KTtkLmdldEVuY29kZWRIZXgoKTt0aGlzLnZhbHVlTGlzdD1bZF19ZWxzZXt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUk9jdGV0U3RyaW5nKGUpO2QuZ2V0RW5jb2RlZEhleCgpO3RoaXMudmFsdWVMaXN0PVtkXX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLk1lc3NhZ2VEaWdlc3QsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jbXMuU2lnbmluZ1RpbWU9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNtcy5TaWduaW5nVGltZS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dGhpcy5hdHRyVHlwZU9pZD1cIjEuMi44NDAuMTEzNTQ5LjEuOS41XCI7aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe3ZhciBhPW5ldyBLSlVSLmFzbjEueDUwOS5UaW1lKGMpO3RyeXthLmdldEVuY29kZWRIZXgoKX1jYXRjaChiKXt0aHJvd1wiU2lnbmluZ1RpbWUuZ2V0RW5jb2RlZEhleCgpIGZhaWxlZC9cIitifXRoaXMudmFsdWVMaXN0PVthXX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmluZ1RpbWUsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlPWZ1bmN0aW9uKGQpe0tKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuMTJcIjt2YXIgYT1LSlVSLmFzbjE7dmFyIGM9S0pVUi5hc24xLmNtczt2YXIgYj1LSlVSLmNyeXB0bzt0aGlzLnNldENlcnRzPWZ1bmN0aW9uKGwpe3ZhciBqPVtdO2Zvcih2YXIgaD0wO2g8bC5sZW5ndGg7aCsrKXt2YXIgZj1LRVlVVElMLmdldEhleEZyb21QRU0obFtoXSk7dmFyIGU9Yi5VdGlsLmhhc2hIZXgoZixcInNoYTFcIik7dmFyIG09bmV3IGEuREVST2N0ZXRTdHJpbmcoe2hleDplfSk7bS5nZXRFbmNvZGVkSGV4KCk7dmFyIGs9bmV3IGMuSXNzdWVyQW5kU2VyaWFsTnVtYmVyKHtjZXJ0OmxbaF19KTtrLmdldEVuY29kZWRIZXgoKTt2YXIgbj1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6W20sa119KTtuLmdldEVuY29kZWRIZXgoKTtqLnB1c2gobil9dmFyIGc9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5Omp9KTtnLmdldEVuY29kZWRIZXgoKTt0aGlzLnZhbHVlTGlzdD1bZ119O2lmKHR5cGVvZiBkIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZC5hcnJheT09XCJvYmplY3RcIil7dGhpcy5zZXRDZXJ0cyhkLmFycmF5KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY21zLlNpZ25pbmdDZXJ0aWZpY2F0ZSxLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZSk7S0pVUi5hc24xLmNtcy5TaWduaW5nQ2VydGlmaWNhdGVWMj1mdW5jdGlvbihlKXtLSlVSLmFzbjEuY21zLlNpZ25pbmdDZXJ0aWZpY2F0ZVYyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuNDdcIjt2YXIgYj1LSlVSLmFzbjE7dmFyIGY9S0pVUi5hc24xLng1MDk7dmFyIGQ9S0pVUi5hc24xLmNtczt2YXIgYz1LSlVSLmNyeXB0bzt0aGlzLnNldENlcnRzPWZ1bmN0aW9uKHAsaCl7dmFyIG49W107Zm9yKHZhciBsPTA7bDxwLmxlbmd0aDtsKyspe3ZhciBqPUtFWVVUSUwuZ2V0SGV4RnJvbVBFTShwW2xdKTt2YXIgcj1bXTtpZihoIT1cInNoYTI1NlwiKXtyLnB1c2gobmV3IGYuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpofSkpfXZhciBnPWMuVXRpbC5oYXNoSGV4KGosaCk7dmFyIHE9bmV3IGIuREVST2N0ZXRTdHJpbmcoe2hleDpnfSk7cS5nZXRFbmNvZGVkSGV4KCk7ci5wdXNoKHEpO3ZhciBtPW5ldyBkLklzc3VlckFuZFNlcmlhbE51bWJlcih7Y2VydDpwW2xdfSk7bS5nZXRFbmNvZGVkSGV4KCk7ci5wdXNoKG0pO3ZhciBvPW5ldyBiLkRFUlNlcXVlbmNlKHthcnJheTpyfSk7by5nZXRFbmNvZGVkSGV4KCk7bi5wdXNoKG8pfXZhciBrPW5ldyBiLkRFUlNlcXVlbmNlKHthcnJheTpufSk7ay5nZXRFbmNvZGVkSGV4KCk7dGhpcy52YWx1ZUxpc3Q9W2tdfTtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGUuYXJyYXk9PVwib2JqZWN0XCIpe3ZhciBhPVwic2hhMjU2XCI7aWYodHlwZW9mIGUuaGFzaEFsZz09XCJzdHJpbmdcIil7YT1lLmhhc2hBbGd9dGhpcy5zZXRDZXJ0cyhlLmFycmF5LGEpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmluZ0NlcnRpZmljYXRlVjIsS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGUpO0tKVVIuYXNuMS5jbXMuSXNzdWVyQW5kU2VyaWFsTnVtYmVyPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jbXMuSXNzdWVyQW5kU2VyaWFsTnVtYmVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgZT1udWxsO3ZhciBiPW51bGw7dmFyIGE9S0pVUi5hc24xO3ZhciBkPWEueDUwOTt0aGlzLnNldEJ5Q2VydFBFTT1mdW5jdGlvbihpKXt2YXIgZz1LRVlVVElMLmdldEhleEZyb21QRU0oaSk7dmFyIGY9bmV3IFg1MDkoKTtmLmhleD1nO3ZhciBqPWYuZ2V0SXNzdWVySGV4KCk7dGhpcy5kSXNzdWVyPW5ldyBkLlg1MDBOYW1lKCk7dGhpcy5kSXNzdWVyLmhUTFY9ajt2YXIgaD1mLmdldFNlcmlhbE51bWJlckhleCgpO3RoaXMuZFNlcmlhbD1uZXcgYS5ERVJJbnRlZ2VyKHtoZXg6aH0pfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5kSXNzdWVyLHRoaXMuZFNlcmlhbF19KTt0aGlzLmhUTFY9Zi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjPT1cInN0cmluZ1wiJiZjLmluZGV4T2YoXCItLS0tLUJFR0lOIFwiKSE9LTEpe3RoaXMuc2V0QnlDZXJ0UEVNKGMpfWlmKGMuaXNzdWVyJiZjLnNlcmlhbCl7aWYoYy5pc3N1ZXIgaW5zdGFuY2VvZiBLSlVSLmFzbjEueDUwOS5YNTAwTmFtZSl7dGhpcy5kSXNzdWVyPWMuaXNzdWVyfWVsc2V7dGhpcy5kSXNzdWVyPW5ldyBLSlVSLmFzbjEueDUwOS5YNTAwTmFtZShjLmlzc3Vlcil9aWYoYy5zZXJpYWwgaW5zdGFuY2VvZiBLSlVSLmFzbjEuREVSSW50ZWdlcil7dGhpcy5kU2VyaWFsPWMuc2VyaWFsfWVsc2V7dGhpcy5kU2VyaWFsPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcihjLnNlcmlhbCl9fWlmKHR5cGVvZiBjLmNlcnQ9PVwic3RyaW5nXCIpe3RoaXMuc2V0QnlDZXJ0UEVNKGMuY2VydCl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jbXMuQXR0cmlidXRlTGlzdD1mdW5jdGlvbihhKXtLSlVSLmFzbjEuY21zLkF0dHJpYnV0ZUxpc3Quc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMubGlzdD1uZXcgQXJyYXkoKTt0aGlzLnNvcnRGbGFnPXRydWU7dGhpcy5hZGQ9ZnVuY3Rpb24oYil7aWYoYiBpbnN0YW5jZW9mIEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKXt0aGlzLmxpc3QucHVzaChiKX19O3RoaXMubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGlzdC5sZW5ndGh9O3RoaXMuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmxpc3Q9bmV3IEFycmF5KCk7dGhpcy5oVExWPW51bGw7dGhpcy5oVj1udWxsfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5oVExWPT1cInN0cmluZ1wiKXtyZXR1cm4gdGhpcy5oVExWfXZhciBiPW5ldyBLSlVSLmFzbjEuREVSU2V0KHthcnJheTp0aGlzLmxpc3Qsc29ydGZsYWc6dGhpcy5zb3J0RmxhZ30pO3RoaXMuaFRMVj1iLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGEuc29ydGZsYWchPVwidW5kZWZpbmVkXCImJmEuc29ydGZsYWc9PWZhbHNlKXt0aGlzLnNvcnRGbGFnPWZhbHNlfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlTGlzdCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5TaWduZXJJbmZvPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS5jbXMuU2lnbmVySW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS5jbXM7dmFyIGQ9S0pVUi5hc24xLng1MDk7dGhpcy5kQ01TVmVyc2lvbj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOjF9KTt0aGlzLmRTaWduZXJJZGVudGlmaWVyPW51bGw7dGhpcy5kRGlnZXN0QWxnb3JpdGhtPW51bGw7dGhpcy5kU2lnbmVkQXR0cnM9bmV3IGIuQXR0cmlidXRlTGlzdCgpO3RoaXMuZFNpZ0FsZz1udWxsO3RoaXMuZFNpZz1udWxsO3RoaXMuZFVuc2lnbmVkQXR0cnM9bmV3IGIuQXR0cmlidXRlTGlzdCgpO3RoaXMuc2V0U2lnbmVySWRlbnRpZmllcj1mdW5jdGlvbihmKXtpZih0eXBlb2YgZj09XCJzdHJpbmdcIiYmZi5pbmRleE9mKFwiQ0VSVElGSUNBVEVcIikhPS0xJiZmLmluZGV4T2YoXCJCRUdJTlwiKSE9LTEmJmYuaW5kZXhPZihcIkVORFwiKSE9LTEpe3ZhciBlPWY7dGhpcy5kU2lnbmVySWRlbnRpZmllcj1uZXcgYi5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIoe2NlcnQ6Zn0pfX07dGhpcy5zZXRGb3JDb250ZW50QW5kSGFzaD1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYoZS5lY2lPYmogaW5zdGFuY2VvZiBLSlVSLmFzbjEuY21zLkVuY2Fwc3VsYXRlZENvbnRlbnRJbmZvKXt0aGlzLmRTaWduZWRBdHRycy5hZGQobmV3IGIuQ29udGVudFR5cGUoe29pZDpcIjEuMi44NDAuMTEzNTQ5LjEuNy4xXCJ9KSk7dGhpcy5kU2lnbmVkQXR0cnMuYWRkKG5ldyBiLk1lc3NhZ2VEaWdlc3Qoe2VjaU9iajplLmVjaU9iaixoYXNoQWxnOmUuaGFzaEFsZ30pKX1pZih0eXBlb2YgZS5zZE9iaiE9XCJ1bmRlZmluZWRcIiYmZS5zZE9iaiBpbnN0YW5jZW9mIEtKVVIuYXNuMS5jbXMuU2lnbmVkRGF0YSl7aWYoZS5zZE9iai5kaWdlc3RBbGdOYW1lTGlzdC5qb2luKFwiOlwiKS5pbmRleE9mKGUuaGFzaEFsZyk9PS0xKXtlLnNkT2JqLmRpZ2VzdEFsZ05hbWVMaXN0LnB1c2goZS5oYXNoQWxnKX19aWYodHlwZW9mIGUuaGFzaEFsZz09XCJzdHJpbmdcIil7dGhpcy5kRGlnZXN0QWxnb3JpdGhtPW5ldyBkLkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6ZS5oYXNoQWxnfSl9fX07dGhpcy5zaWduPWZ1bmN0aW9uKGosZil7dGhpcy5kU2lnQWxnPW5ldyBkLkFsZ29yaXRobUlkZW50aWZpZXIoe25hbWU6Zn0pO3ZhciBnPXRoaXMuZFNpZ25lZEF0dHJzLmdldEVuY29kZWRIZXgoKTt2YXIgZT1LRVlVVElMLmdldEtleShqKTt2YXIgaT1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6Zn0pO2kuaW5pdChlKTtpLnVwZGF0ZUhleChnKTt2YXIgaD1pLnNpZ24oKTt0aGlzLmRTaWc9bmV3IGEuREVST2N0ZXRTdHJpbmcoe2hleDpofSl9O3RoaXMuYWRkVW5zaWduZWQ9ZnVuY3Rpb24oZSl7dGhpcy5oVExWPW51bGw7dGhpcy5kVW5zaWduZWRBdHRycy5oVExWPW51bGw7dGhpcy5kVW5zaWduZWRBdHRycy5hZGQoZSl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuZFNpZ25lZEF0dHJzIGluc3RhbmNlb2YgS0pVUi5hc24xLmNtcy5BdHRyaWJ1dGVMaXN0JiZ0aGlzLmRTaWduZWRBdHRycy5sZW5ndGgoKT09MCl7dGhyb3dcIlNpZ25lZEF0dHJzIGxlbmd0aCA9IDAgKGVtcHR5KVwifXZhciBlPW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOnRoaXMuZFNpZ25lZEF0dHJzLHRhZzpcImEwXCIsZXhwbGljaXQ6ZmFsc2V9KTt2YXIgaD1udWxsO2lmKHRoaXMuZFVuc2lnbmVkQXR0cnMubGVuZ3RoKCk+MCl7aD1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajp0aGlzLmRVbnNpZ25lZEF0dHJzLHRhZzpcImExXCIsZXhwbGljaXQ6ZmFsc2V9KX12YXIgZz1bdGhpcy5kQ01TVmVyc2lvbix0aGlzLmRTaWduZXJJZGVudGlmaWVyLHRoaXMuZERpZ2VzdEFsZ29yaXRobSxlLHRoaXMuZFNpZ0FsZyx0aGlzLmRTaWcsXTtpZihoIT1udWxsKXtnLnB1c2goaCl9dmFyIGY9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5Omd9KTt0aGlzLmhUTFY9Zi5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmVySW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbz1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY21zLkVuY2Fwc3VsYXRlZENvbnRlbnRJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNtczt2YXIgZD1LSlVSLmFzbjEueDUwOTt0aGlzLmRFQ29udGVudFR5cGU9bmV3IGEuREVST2JqZWN0SWRlbnRpZmllcih7bmFtZTpcImRhdGFcIn0pO3RoaXMuZEVDb250ZW50PW51bGw7dGhpcy5pc0RldGFjaGVkPWZhbHNlO3RoaXMuZUNvbnRlbnRWYWx1ZUhleD1udWxsO3RoaXMuc2V0Q29udGVudFR5cGU9ZnVuY3Rpb24oZSl7aWYoZS5tYXRjaCgvXlswLTJdWy5dWzAtOS5dKyQvKSl7dGhpcy5kRUNvbnRlbnRUeXBlPW5ldyBhLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDplfSl9ZWxzZXt0aGlzLmRFQ29udGVudFR5cGU9bmV3IGEuREVST2JqZWN0SWRlbnRpZmllcih7bmFtZTplfSl9fTt0aGlzLnNldENvbnRlbnRWYWx1ZT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGUuaGV4PT1cInN0cmluZ1wiKXt0aGlzLmVDb250ZW50VmFsdWVIZXg9ZS5oZXh9ZWxzZXtpZih0eXBlb2YgZS5zdHI9PVwic3RyaW5nXCIpe3RoaXMuZUNvbnRlbnRWYWx1ZUhleD11dGY4dG9oZXgoZS5zdHIpfX19fTt0aGlzLnNldENvbnRlbnRWYWx1ZUhleD1mdW5jdGlvbihlKXt0aGlzLmVDb250ZW50VmFsdWVIZXg9ZX07dGhpcy5zZXRDb250ZW50VmFsdWVTdHI9ZnVuY3Rpb24oZSl7dGhpcy5lQ29udGVudFZhbHVlSGV4PXV0Zjh0b2hleChlKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMuZUNvbnRlbnRWYWx1ZUhleCE9XCJzdHJpbmdcIil7dGhyb3dcImVDb250ZW50VmFsdWUgbm90IHlldCBzZXRcIn12YXIgZz1uZXcgYS5ERVJPY3RldFN0cmluZyh7aGV4OnRoaXMuZUNvbnRlbnRWYWx1ZUhleH0pO3RoaXMuZEVDb250ZW50PW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOmcsdGFnOlwiYTBcIixleHBsaWNpdDp0cnVlfSk7dmFyIGU9W3RoaXMuZEVDb250ZW50VHlwZV07aWYoIXRoaXMuaXNEZXRhY2hlZCl7ZS5wdXNoKHRoaXMuZEVDb250ZW50KX12YXIgZj1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6ZX0pO3RoaXMuaFRMVj1mLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNtcy5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5Db250ZW50SW5mbz1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY21zLkNvbnRlbnRJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNtczt2YXIgZD1LSlVSLmFzbjEueDUwOTt0aGlzLmRDb250ZW50VHlwZT1udWxsO3RoaXMuZENvbnRlbnQ9bnVsbDt0aGlzLnNldENvbnRlbnRUeXBlPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlPT1cInN0cmluZ1wiKXt0aGlzLmRDb250ZW50VHlwZT1kLk9JRC5uYW1lMm9iaihlKX19O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBmPW5ldyBhLkRFUlRhZ2dlZE9iamVjdCh7b2JqOnRoaXMuZENvbnRlbnQsdGFnOlwiYTBcIixleHBsaWNpdDp0cnVlfSk7dmFyIGU9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5Olt0aGlzLmRDb250ZW50VHlwZSxmXX0pO3RoaXMuaFRMVj1lLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYoYy50eXBlKXt0aGlzLnNldENvbnRlbnRUeXBlKGMudHlwZSl9aWYoYy5vYmomJmMub2JqIGluc3RhbmNlb2YgYS5BU04xT2JqZWN0KXt0aGlzLmRDb250ZW50PWMub2JqfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuQ29udGVudEluZm8sS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jbXMuU2lnbmVkRGF0YT1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY21zLlNpZ25lZERhdGEuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEuY21zO3ZhciBkPUtKVVIuYXNuMS54NTA5O3RoaXMuZENNU1ZlcnNpb249bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjoxfSk7dGhpcy5kRGlnZXN0QWxncz1udWxsO3RoaXMuZGlnZXN0QWxnTmFtZUxpc3Q9W107dGhpcy5kRW5jYXBDb250ZW50SW5mbz1uZXcgYi5FbmNhcHN1bGF0ZWRDb250ZW50SW5mbygpO3RoaXMuZENlcnRzPW51bGw7dGhpcy5jZXJ0aWZpY2F0ZUxpc3Q9W107dGhpcy5jcmxMaXN0PVtdO3RoaXMuc2lnbmVySW5mb0xpc3Q9W25ldyBiLlNpZ25lckluZm8oKV07dGhpcy5hZGRDZXJ0aWZpY2F0ZXNCeVBFTT1mdW5jdGlvbihlKXt2YXIgZj1LRVlVVElMLmdldEhleEZyb21QRU0oZSk7dmFyIGc9bmV3IGEuQVNOMU9iamVjdCgpO2cuaFRMVj1mO3RoaXMuY2VydGlmaWNhdGVMaXN0LnB1c2goZyl9O3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLmhUTFY9PVwic3RyaW5nXCIpe3JldHVybiB0aGlzLmhUTFZ9aWYodGhpcy5kRGlnZXN0QWxncz09bnVsbCl7dmFyIGs9W107Zm9yKHZhciBqPTA7ajx0aGlzLmRpZ2VzdEFsZ05hbWVMaXN0Lmxlbmd0aDtqKyspe3ZhciBoPXRoaXMuZGlnZXN0QWxnTmFtZUxpc3Rbal07dmFyIG09bmV3IGQuQWxnb3JpdGhtSWRlbnRpZmllcih7bmFtZTpofSk7ay5wdXNoKG0pfXRoaXMuZERpZ2VzdEFsZ3M9bmV3IGEuREVSU2V0KHthcnJheTprfSl9dmFyIGU9W3RoaXMuZENNU1ZlcnNpb24sdGhpcy5kRGlnZXN0QWxncyx0aGlzLmRFbmNhcENvbnRlbnRJbmZvXTtpZih0aGlzLmRDZXJ0cz09bnVsbCl7aWYodGhpcy5jZXJ0aWZpY2F0ZUxpc3QubGVuZ3RoPjApe3ZhciBsPW5ldyBhLkRFUlNldCh7YXJyYXk6dGhpcy5jZXJ0aWZpY2F0ZUxpc3R9KTt0aGlzLmRDZXJ0cz1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajpsLHRhZzpcImEwXCIsZXhwbGljaXQ6ZmFsc2V9KX19aWYodGhpcy5kQ2VydHMhPW51bGwpe2UucHVzaCh0aGlzLmRDZXJ0cyl9dmFyIGc9bmV3IGEuREVSU2V0KHthcnJheTp0aGlzLnNpZ25lckluZm9MaXN0fSk7ZS5wdXNoKGcpO3ZhciBmPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O3RoaXMuZ2V0Q29udGVudEluZm89ZnVuY3Rpb24oKXt0aGlzLmdldEVuY29kZWRIZXgoKTt2YXIgZT1uZXcgYi5Db250ZW50SW5mbyh7dHlwZTpcInNpZ25lZC1kYXRhXCIsb2JqOnRoaXN9KTtyZXR1cm4gZX07dGhpcy5nZXRDb250ZW50SW5mb0VuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldENvbnRlbnRJbmZvKCk7dmFyIGY9ZS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIGZ9O3RoaXMuZ2V0UEVNPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRDb250ZW50SW5mb0VuY29kZWRIZXgoKTt2YXIgZj1hLkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgoZSxcIkNNU1wiKTtyZXR1cm4gZn19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jbXMuU2lnbmVkRGF0YSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNtcy5DTVNVdGlsPW5ldyBmdW5jdGlvbigpe307S0pVUi5hc24xLmNtcy5DTVNVdGlsLm5ld1NpZ25lZERhdGE9ZnVuY3Rpb24oYSl7dmFyIGg9S0pVUi5hc24xLmNtczt2YXIgZz1LSlVSLmFzbjEuY2FkZXM7dmFyIGY9bmV3IGguU2lnbmVkRGF0YSgpO2YuZEVuY2FwQ29udGVudEluZm8uc2V0Q29udGVudFZhbHVlKGEuY29udGVudCk7aWYodHlwZW9mIGEuY2VydHM9PVwib2JqZWN0XCIpe2Zvcih2YXIgYj0wO2I8YS5jZXJ0cy5sZW5ndGg7YisrKXtmLmFkZENlcnRpZmljYXRlc0J5UEVNKGEuY2VydHNbYl0pfX1mLnNpZ25lckluZm9MaXN0PVtdO2Zvcih2YXIgYj0wO2I8YS5zaWduZXJJbmZvcy5sZW5ndGg7YisrKXt2YXIgZD1hLnNpZ25lckluZm9zW2JdO3ZhciBjPW5ldyBoLlNpZ25lckluZm8oKTtjLnNldFNpZ25lcklkZW50aWZpZXIoZC5zaWduZXJDZXJ0KTtjLnNldEZvckNvbnRlbnRBbmRIYXNoKHtzZE9iajpmLGVjaU9iajpmLmRFbmNhcENvbnRlbnRJbmZvLGhhc2hBbGc6ZC5oYXNoQWxnfSk7Zm9yKGF0dHJOYW1lIGluIGQuc0F0dHIpe3ZhciBqPWQuc0F0dHJbYXR0ck5hbWVdO2lmKGF0dHJOYW1lPT1cIlNpZ25pbmdUaW1lXCIpe3ZhciBlPW5ldyBoLlNpZ25pbmdUaW1lKGopO2MuZFNpZ25lZEF0dHJzLmFkZChlKX1pZihhdHRyTmFtZT09XCJTaWduaW5nQ2VydGlmaWNhdGVcIil7dmFyIGU9bmV3IGguU2lnbmluZ0NlcnRpZmljYXRlKGopO2MuZFNpZ25lZEF0dHJzLmFkZChlKX1pZihhdHRyTmFtZT09XCJTaWduaW5nQ2VydGlmaWNhdGVWMlwiKXt2YXIgZT1uZXcgaC5TaWduaW5nQ2VydGlmaWNhdGVWMihqKTtjLmRTaWduZWRBdHRycy5hZGQoZSl9aWYoYXR0ck5hbWU9PVwiU2lnbmF0dXJlUG9saWN5SWRlbnRpZmllclwiKXt2YXIgZT1uZXcgZy5TaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyKGopO2MuZFNpZ25lZEF0dHJzLmFkZChlKX19Yy5zaWduKGQuc2lnbmVyUHJ2S2V5LGQuc2lnQWxnKTtmLnNpZ25lckluZm9MaXN0LnB1c2goYyl9cmV0dXJuIGZ9O1xuLyohIGFzbjF0c3AtMS4wLjEuanMgKGMpIDIwMTQgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmFzbjE9PVwidW5kZWZpbmVkXCJ8fCFLSlVSLmFzbjEpe0tKVVIuYXNuMT17fX1pZih0eXBlb2YgS0pVUi5hc24xLnRzcD09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMS50c3Ape0tKVVIuYXNuMS50c3A9e319S0pVUi5hc24xLnRzcC5BY2N1cmFjeT1mdW5jdGlvbihiKXtLSlVSLmFzbjEudHNwLkFjY3VyYWN5LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dGhpcy5zZWNvbmRzPW51bGw7dGhpcy5taWxsaXM9bnVsbDt0aGlzLm1pY3Jvcz1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBlPW51bGw7dmFyIGc9bnVsbDt2YXIgaT1udWxsO3ZhciBjPVtdO2lmKHRoaXMuc2Vjb25kcyE9bnVsbCl7ZT1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOnRoaXMuc2Vjb25kc30pO2MucHVzaChlKX1pZih0aGlzLm1pbGxpcyE9bnVsbCl7dmFyIGg9bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjp0aGlzLm1pbGxpc30pO2c9bmV3IGEuREVSVGFnZ2VkT2JqZWN0KHtvYmo6aCx0YWc6XCI4MFwiLGV4cGxpY2l0OmZhbHNlfSk7Yy5wdXNoKGcpfWlmKHRoaXMubWljcm9zIT1udWxsKXt2YXIgZj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOnRoaXMubWljcm9zfSk7aT1uZXcgYS5ERVJUYWdnZWRPYmplY3Qoe29iajpmLHRhZzpcIjgxXCIsZXhwbGljaXQ6ZmFsc2V9KTtjLnB1c2goaSl9dmFyIGQ9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmN9KTt0aGlzLmhUTFY9ZC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGIhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBiLnNlY29uZHM9PVwibnVtYmVyXCIpe3RoaXMuc2Vjb25kcz1iLnNlY29uZHN9aWYodHlwZW9mIGIubWlsbGlzPT1cIm51bWJlclwiKXt0aGlzLm1pbGxpcz1iLm1pbGxpc31pZih0eXBlb2YgYi5taWNyb3M9PVwibnVtYmVyXCIpe3RoaXMubWljcm9zPWIubWljcm9zfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuQWNjdXJhY3ksS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS50c3AuTWVzc2FnZUltcHJpbnQ9ZnVuY3Rpb24oYil7S0pVUi5hc24xLnRzcC5NZXNzYWdlSW1wcmludC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBjPUtKVVIuYXNuMS54NTA5O3RoaXMuZEhhc2hBbGc9bnVsbDt0aGlzLmRIYXNoVmFsdWU9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcy5oVExWPT1cInN0cmluZ1wiKXtyZXR1cm4gdGhpcy5oVExWfXZhciBkPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5kSGFzaEFsZyx0aGlzLmRIYXNoVmFsdWVdfSk7cmV0dXJuIGQuZ2V0RW5jb2RlZEhleCgpfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuaGFzaEFsZz09XCJzdHJpbmdcIil7dGhpcy5kSGFzaEFsZz1uZXcgYy5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOmIuaGFzaEFsZ30pfWlmKHR5cGVvZiBiLmhhc2hWYWx1ZT09XCJzdHJpbmdcIil7dGhpcy5kSGFzaFZhbHVlPW5ldyBhLkRFUk9jdGV0U3RyaW5nKHtoZXg6Yi5oYXNoVmFsdWV9KX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLk1lc3NhZ2VJbXByaW50LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlcT1mdW5jdGlvbihjKXtLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlcS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS50c3A7dGhpcy5kVmVyc2lvbj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOjF9KTt0aGlzLmRNZXNzYWdlSW1wcmludD1udWxsO3RoaXMuZFBvbGljeT1udWxsO3RoaXMuZE5vbmNlPW51bGw7dGhpcy5jZXJ0UmVxPXRydWU7dGhpcy5zZXRNZXNzYWdlSW1wcmludD1mdW5jdGlvbihkKXtpZihkIGluc3RhbmNlb2YgS0pVUi5hc24xLnRzcC5NZXNzYWdlSW1wcmludCl7dGhpcy5kTWVzc2FnZUltcHJpbnQ9ZDtyZXR1cm59aWYodHlwZW9mIGQ9PVwib2JqZWN0XCIpe3RoaXMuZE1lc3NhZ2VJbXByaW50PW5ldyBiLk1lc3NhZ2VJbXByaW50KGQpfX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5kTWVzc2FnZUltcHJpbnQ9PW51bGwpe3Rocm93XCJtZXNzYWdlSW1wcmludCBzaGFsbCBiZSBzcGVjaWZpZWRcIn12YXIgZD1bdGhpcy5kVmVyc2lvbix0aGlzLmRNZXNzYWdlSW1wcmludF07aWYodGhpcy5kUG9saWN5IT1udWxsKXtkLnB1c2godGhpcy5kUG9saWN5KX1pZih0aGlzLmROb25jZSE9bnVsbCl7ZC5wdXNoKHRoaXMuZE5vbmNlKX1pZih0aGlzLmNlcnRSZXEpe2QucHVzaChuZXcgYS5ERVJCb29sZWFuKCkpfXZhciBlPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpkfSk7dGhpcy5oVExWPWUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5taT09XCJvYmplY3RcIil7dGhpcy5zZXRNZXNzYWdlSW1wcmludChjLm1pKX1pZih0eXBlb2YgYy5wb2xpY3k9PVwib2JqZWN0XCIpe3RoaXMuZFBvbGljeT1uZXcgYS5ERVJPYmplY3RJZGVudGlmaWVyKGMucG9saWN5KX1pZih0eXBlb2YgYy5ub25jZT09XCJvYmplY3RcIil7dGhpcy5kTm9uY2U9bmV3IGEuREVSSW50ZWdlcihjLm5vbmNlKX1pZih0eXBlb2YgYy5jZXJ0cmVxPT1cImJvb2xlYW5cIil7dGhpcy5jZXJ0UmVxPWMuY2VydHJlcX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlRpbWVTdGFtcFJlcSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5UU1RJbmZvPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS50c3AuVFNUSW5mby5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBkPUtKVVIuYXNuMS54NTA5O3ZhciBiPUtKVVIuYXNuMS50c3A7dGhpcy5kVmVyc2lvbj1uZXcgYS5ERVJJbnRlZ2VyKHtcImludFwiOjF9KTt0aGlzLmRQb2xpY3k9bnVsbDt0aGlzLmRNZXNzYWdlSW1wcmludD1udWxsO3RoaXMuZFNlcmlhbE51bWJlcj1udWxsO3RoaXMuZEdlblRpbWU9bnVsbDt0aGlzLmRBY2N1cmFjeT1udWxsO3RoaXMuZE9yZGVyaW5nPW51bGw7dGhpcy5kTm9uY2U9bnVsbDt0aGlzLmRUc2E9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXt2YXIgZT1bdGhpcy5kVmVyc2lvbl07aWYodGhpcy5kUG9saWN5PT1udWxsKXt0aHJvd1wicG9saWN5IHNoYWxsIGJlIHNwZWNpZmllZC5cIn1lLnB1c2godGhpcy5kUG9saWN5KTtpZih0aGlzLmRNZXNzYWdlSW1wcmludD09bnVsbCl7dGhyb3dcIm1lc3NhZ2VJbXByaW50IHNoYWxsIGJlIHNwZWNpZmllZC5cIn1lLnB1c2godGhpcy5kTWVzc2FnZUltcHJpbnQpO2lmKHRoaXMuZFNlcmlhbE51bWJlcj09bnVsbCl7dGhyb3dcInNlcmlhbE51bWJlciBzaGFsbCBiZSBzcGVjaWZpZWQuXCJ9ZS5wdXNoKHRoaXMuZFNlcmlhbE51bWJlcik7aWYodGhpcy5kR2VuVGltZT09bnVsbCl7dGhyb3dcImdlblRpbWUgc2hhbGwgYmUgc3BlY2lmaWVkLlwifWUucHVzaCh0aGlzLmRHZW5UaW1lKTtpZih0aGlzLmRBY2N1cmFjeSE9bnVsbCl7ZS5wdXNoKHRoaXMuZEFjY3VyYWN5KX1pZih0aGlzLmRPcmRlcmluZyE9bnVsbCl7ZS5wdXNoKHRoaXMuZE9yZGVyaW5nKX1pZih0aGlzLmROb25jZSE9bnVsbCl7ZS5wdXNoKHRoaXMuZE5vbmNlKX1pZih0aGlzLmRUc2EhPW51bGwpe2UucHVzaCh0aGlzLmRUc2EpfXZhciBmPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5wb2xpY3k9PVwic3RyaW5nXCIpe2lmKCFjLnBvbGljeS5tYXRjaCgvXlswLTkuXSskLykpe3Rocm93XCJwb2xpY3kgc2hhbGwgYmUgb2lkIGxpa2UgMC4xLjQuMTM0XCJ9dGhpcy5kUG9saWN5PW5ldyBhLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDpjLnBvbGljeX0pfWlmKHR5cGVvZiBjLm1lc3NhZ2VJbXByaW50IT1cInVuZGVmaW5lZFwiKXt0aGlzLmRNZXNzYWdlSW1wcmludD1uZXcgYi5NZXNzYWdlSW1wcmludChjLm1lc3NhZ2VJbXByaW50KX1pZih0eXBlb2YgYy5zZXJpYWxOdW1iZXIhPVwidW5kZWZpbmVkXCIpe3RoaXMuZFNlcmlhbE51bWJlcj1uZXcgYS5ERVJJbnRlZ2VyKGMuc2VyaWFsTnVtYmVyKX1pZih0eXBlb2YgYy5nZW5UaW1lIT1cInVuZGVmaW5lZFwiKXt0aGlzLmRHZW5UaW1lPW5ldyBhLkRFUkdlbmVyYWxpemVkVGltZShjLmdlblRpbWUpfWlmKHR5cGVvZiBjLmFjY3VyYWN5IT1cInVuZGVmaW5kXCIpe3RoaXMuZEFjY3VyYWN5PW5ldyBiLkFjY3VyYWN5KGMuYWNjdXJhY3kpfWlmKHR5cGVvZiBjLm9yZGVyaW5nIT1cInVuZGVmaW5lZFwiJiZjLm9yZGVyaW5nPT10cnVlKXt0aGlzLmRPcmRlcmluZz1uZXcgYS5ERVJCb29sZWFuKCl9aWYodHlwZW9mIGMubm9uY2UhPVwidW5kZWZpbmVkXCIpe3RoaXMuZE5vbmNlPW5ldyBhLkRFUkludGVnZXIoYy5ub25jZSl9aWYodHlwZW9mIGMudHNhIT1cInVuZGVmaW5lZFwiKXt0aGlzLmRUc2E9bmV3IGQuWDUwME5hbWUoYy50c2EpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuVFNUSW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5UaW1lU3RhbXBSZXNwPWZ1bmN0aW9uKGMpe0tKVVIuYXNuMS50c3AuVGltZVN0YW1wUmVzcC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS50c3A7dGhpcy5kU3RhdHVzPW51bGw7dGhpcy5kVFNUPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5kU3RhdHVzPT1udWxsKXt0aHJvd1wic3RhdHVzIHNoYWxsIGJlIHNwZWNpZmllZFwifXZhciBkPVt0aGlzLmRTdGF0dXNdO2lmKHRoaXMuZFRTVCE9bnVsbCl7ZC5wdXNoKHRoaXMuZFRTVCl9dmFyIGU9bmV3IGEuREVSU2VxdWVuY2Uoe2FycmF5OmR9KTt0aGlzLmhUTFY9ZS5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGMhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBjLnN0YXR1cz09XCJvYmplY3RcIil7dGhpcy5kU3RhdHVzPW5ldyBiLlBLSVN0YXR1c0luZm8oYy5zdGF0dXMpfWlmKHR5cGVvZiBjLnRzdCE9XCJ1bmRlZmluZWRcIiYmYy50c3QgaW5zdGFuY2VvZiBLSlVSLmFzbjEuQVNOMU9iamVjdCl7dGhpcy5kVFNUPWMudHN0LmdldENvbnRlbnRJbmZvKCl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLnRzcC5UaW1lU3RhbXBSZXNwLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSVN0YXR1c0luZm89ZnVuY3Rpb24oYyl7S0pVUi5hc24xLnRzcC5QS0lTdGF0dXNJbmZvLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLnRzcDt0aGlzLmRTdGF0dXM9bnVsbDt0aGlzLmRTdGF0dXNTdHJpbmc9bnVsbDt0aGlzLmRGYWlsdXJlSW5mbz1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe2lmKHRoaXMuZFN0YXR1cz09bnVsbCl7dGhyb3dcInN0YXR1cyBzaGFsbCBiZSBzcGVjaWZpZWRcIn12YXIgZD1bdGhpcy5kU3RhdHVzXTtpZih0aGlzLmRTdGF0dXNTdHJpbmchPW51bGwpe2QucHVzaCh0aGlzLmRTdGF0dXNTdHJpbmcpfWlmKHRoaXMuZEZhaWx1cmVJbmZvIT1udWxsKXtkLnB1c2godGhpcy5kRmFpbHVyZUluZm8pfXZhciBlPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpkfSk7dGhpcy5oVExWPWUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5zdGF0dXM9PVwib2JqZWN0XCIpe3RoaXMuZFN0YXR1cz1uZXcgYi5QS0lTdGF0dXMoYy5zdGF0dXMpfWlmKHR5cGVvZiBjLnN0YXRzdHI9PVwib2JqZWN0XCIpe3RoaXMuZFN0YXR1c1N0cmluZz1uZXcgYi5QS0lGcmVlVGV4dCh7YXJyYXk6Yy5zdGF0c3RyfSl9aWYodHlwZW9mIGMuZmFpbGluZm89PVwib2JqZWN0XCIpe3RoaXMuZEZhaWx1cmVJbmZvPW5ldyBiLlBLSUZhaWx1cmVJbmZvKGMuZmFpbGluZm8pfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuUEtJU3RhdHVzSW5mbyxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLnRzcC5QS0lTdGF0dXM9ZnVuY3Rpb24oZSl7S0pVUi5hc24xLnRzcC5QS0lTdGF0dXMuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEudHNwO3ZhciBkPW51bGw7dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dGhpcy5oVExWPXRoaXMuZFN0YXR1cy5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuaFRMVn07aWYodHlwZW9mIGUhPVwidW5kZWZpbmVkXCIpe2lmKHR5cGVvZiBlLm5hbWUhPVwidW5kZWZpbmVkXCIpe3ZhciBjPWIuUEtJU3RhdHVzLnZhbHVlTGlzdDtpZih0eXBlb2YgY1tlLm5hbWVdPT1cInVuZGVmaW5lZFwiKXt0aHJvd1wibmFtZSB1bmRlZmluZWQ6IFwiK2UubmFtZX10aGlzLmRTdGF0dXM9bmV3IGEuREVSSW50ZWdlcih7XCJpbnRcIjpjW2UubmFtZV19KX1lbHNle3RoaXMuZFN0YXR1cz1uZXcgYS5ERVJJbnRlZ2VyKGUpfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuUEtJU3RhdHVzLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSVN0YXR1cy52YWx1ZUxpc3Q9e2dyYW50ZWQ6MCxncmFudGVkV2l0aE1vZHM6MSxyZWplY3Rpb246Mix3YWl0aW5nOjMscmV2b2NhdGlvbldhcm5pbmc6NCxyZXZvY2F0aW9uTm90aWZpY2F0aW9uOjV9O0tKVVIuYXNuMS50c3AuUEtJRnJlZVRleHQ9ZnVuY3Rpb24oYil7S0pVUi5hc24xLnRzcC5QS0lGcmVlVGV4dC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3RoaXMudGV4dExpc3Q9W107dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dmFyIGM9W107Zm9yKHZhciBlPTA7ZTx0aGlzLnRleHRMaXN0Lmxlbmd0aDtlKyspe2MucHVzaChuZXcgYS5ERVJVVEY4U3RyaW5nKHtzdHI6dGhpcy50ZXh0TGlzdFtlXX0pKX12YXIgZD1uZXcgYS5ERVJTZXF1ZW5jZSh7YXJyYXk6Y30pO3RoaXMuaFRMVj1kLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgYiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGIuYXJyYXk9PVwib2JqZWN0XCIpe3RoaXMudGV4dExpc3Q9Yi5hcnJheX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlBLSUZyZWVUZXh0LEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSUZhaWx1cmVJbmZvPWZ1bmN0aW9uKGQpe0tKVVIuYXNuMS50c3AuUEtJRmFpbHVyZUluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3ZhciBhPUtKVVIuYXNuMTt2YXIgYj1LSlVSLmFzbjEudHNwO3RoaXMudmFsdWU9bnVsbDt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLnZhbHVlPT1udWxsKXt0aHJvd1widmFsdWUgc2hhbGwgYmUgc3BlY2lmaWVkXCJ9dmFyIGU9bmV3IE51bWJlcih0aGlzLnZhbHVlKS50b1N0cmluZygyKTt2YXIgZj1uZXcgYS5ERVJCaXRTdHJpbmcoKTtmLnNldEJ5QmluYXJ5U3RyaW5nKGUpO3RoaXMuaFRMVj1mLmdldEVuY29kZWRIZXgoKTtyZXR1cm4gdGhpcy5oVExWfTtpZih0eXBlb2YgZCE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGQubmFtZT09XCJzdHJpbmdcIil7dmFyIGM9Yi5QS0lGYWlsdXJlSW5mby52YWx1ZUxpc3Q7aWYodHlwZW9mIGNbZC5uYW1lXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcIm5hbWUgdW5kZWZpbmVkOiBcIitkLm5hbWV9dGhpcy52YWx1ZT1jW2QubmFtZV19ZWxzZXtpZih0eXBlb2YgZFtcImludFwiXT09XCJudW1iZXJcIil7dGhpcy52YWx1ZT1kW1wiaW50XCJdfX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlBLSUZhaWx1cmVJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEudHNwLlBLSUZhaWx1cmVJbmZvLnZhbHVlTGlzdD17YmFkQWxnOjAsYmFkUmVxdWVzdDoyLGJhZERhdGFGb3JtYXQ6NSx0aW1lTm90QXZhaWxhYmxlOjE0LHVuYWNjZXB0ZWRQb2xpY3k6MTUsdW5hY2NlcHRlZEV4dGVuc2lvbjoxNixhZGRJbmZvTm90QXZhaWxhYmxlOjE3LHN5c3RlbUZhaWx1cmU6MjV9O0tKVVIuYXNuMS50c3AuQWJzdHJhY3RUU0FBZGFwdGVyPWZ1bmN0aW9uKGEpe3RoaXMuZ2V0VFNUSGV4PWZ1bmN0aW9uKGMsYil7dGhyb3dcIm5vdCBpbXBsZW1lbnRlZCB5ZXRcIn19O0tKVVIuYXNuMS50c3AuU2ltcGxlVFNBQWRhcHRlcj1mdW5jdGlvbihhKXtLSlVSLmFzbjEudHNwLlNpbXBsZVRTQUFkYXB0ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMucGFyYW1zPW51bGw7dGhpcy5zZXJpYWw9MDt0aGlzLmdldFRTVEhleD1mdW5jdGlvbihjLGIpe3ZhciBlPUtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChjLGIpO3RoaXMucGFyYW1zLnRzdEluZm8ubWVzc2FnZUltcHJpbnQ9e2hhc2hBbGc6YixoYXNoVmFsdWU6ZX07dGhpcy5wYXJhbXMudHN0SW5mby5zZXJpYWxOdW1iZXI9e1wiaW50XCI6dGhpcy5zZXJpYWwrK307dmFyIGQ9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjEwMDAwMDAwMDApO3RoaXMucGFyYW1zLnRzdEluZm8ubm9uY2U9e1wiaW50XCI6ZH07dmFyIGY9S0pVUi5hc24xLnRzcC5UU1BVdGlsLm5ld1RpbWVTdGFtcFRva2VuKHRoaXMucGFyYW1zKTtyZXR1cm4gZi5nZXRDb250ZW50SW5mb0VuY29kZWRIZXgoKX07aWYodHlwZW9mIGEhPVwidW5kZWZpbmVkXCIpe3RoaXMucGFyYW1zPWF9fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEudHNwLlNpbXBsZVRTQUFkYXB0ZXIsS0pVUi5hc24xLnRzcC5BYnN0cmFjdFRTQUFkYXB0ZXIpO0tKVVIuYXNuMS50c3AuRml4ZWRUU0FBZGFwdGVyPWZ1bmN0aW9uKGEpe0tKVVIuYXNuMS50c3AuRml4ZWRUU0FBZGFwdGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLnBhcmFtcz1udWxsO3RoaXMuZ2V0VFNUSGV4PWZ1bmN0aW9uKGMsYil7dmFyIGQ9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGMsYik7dGhpcy5wYXJhbXMudHN0SW5mby5tZXNzYWdlSW1wcmludD17aGFzaEFsZzpiLGhhc2hWYWx1ZTpkfTt2YXIgZT1LSlVSLmFzbjEudHNwLlRTUFV0aWwubmV3VGltZVN0YW1wVG9rZW4odGhpcy5wYXJhbXMpO3JldHVybiBlLmdldENvbnRlbnRJbmZvRW5jb2RlZEhleCgpfTtpZih0eXBlb2YgYSE9XCJ1bmRlZmluZWRcIil7dGhpcy5wYXJhbXM9YX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS50c3AuRml4ZWRUU0FBZGFwdGVyLEtKVVIuYXNuMS50c3AuQWJzdHJhY3RUU0FBZGFwdGVyKTtLSlVSLmFzbjEudHNwLlRTUFV0aWw9bmV3IGZ1bmN0aW9uKCl7fTtLSlVSLmFzbjEudHNwLlRTUFV0aWwubmV3VGltZVN0YW1wVG9rZW49ZnVuY3Rpb24oYil7dmFyIGo9S0pVUi5hc24xLmNtczt2YXIgYT1LSlVSLmFzbjEudHNwO3ZhciBnPW5ldyBqLlNpZ25lZERhdGEoKTt2YXIgZT1uZXcgYS5UU1RJbmZvKGIudHN0SW5mbyk7dmFyIGY9ZS5nZXRFbmNvZGVkSGV4KCk7Zy5kRW5jYXBDb250ZW50SW5mby5zZXRDb250ZW50VmFsdWUoe2hleDpmfSk7Zy5kRW5jYXBDb250ZW50SW5mby5zZXRDb250ZW50VHlwZShcInRzdGluZm9cIik7aWYodHlwZW9mIGIuY2VydHM9PVwib2JqZWN0XCIpe2Zvcih2YXIgYz0wO2M8Yi5jZXJ0cy5sZW5ndGg7YysrKXtnLmFkZENlcnRpZmljYXRlc0J5UEVNKGIuY2VydHNbY10pfX12YXIgZD1nLnNpZ25lckluZm9MaXN0WzBdO2Quc2V0U2lnbmVySWRlbnRpZmllcihiLnNpZ25lckNlcnQpO2Quc2V0Rm9yQ29udGVudEFuZEhhc2goe3NkT2JqOmcsZWNpT2JqOmcuZEVuY2FwQ29udGVudEluZm8saGFzaEFsZzpiLmhhc2hBbGd9KTt2YXIgaD1uZXcgai5TaWduaW5nQ2VydGlmaWNhdGUoe2FycmF5OltiLnNpZ25lckNlcnRdfSk7ZC5kU2lnbmVkQXR0cnMuYWRkKGgpO2Quc2lnbihiLnNpZ25lclBydktleSxiLnNpZ0FsZyk7cmV0dXJuIGd9O0tKVVIuYXNuMS50c3AuVFNQVXRpbC5wYXJzZVRpbWVTdGFtcFJlcT1mdW5jdGlvbihkKXt2YXIgZj17fTtmLmNlcnRyZXE9ZmFsc2U7dmFyIGg9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZCwwKTtpZihoLmxlbmd0aDwyKXt0aHJvd1wiVGltZVN0YW1wUmVxIG11c3QgaGF2ZSBhdCBsZWFzdCAyIGl0ZW1zXCJ9dmFyIGM9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGhbMV0pO2YubWk9S0pVUi5hc24xLnRzcC5UU1BVdGlsLnBhcnNlTWVzc2FnZUltcHJpbnQoYyk7Zm9yKHZhciBlPTI7ZTxoLmxlbmd0aDtlKyspe3ZhciBiPWhbZV07dmFyIGE9ZC5zdWJzdHIoYiwyKTtpZihhPT1cIjA2XCIpe3ZhciBnPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGQsYik7Zi5wb2xpY3k9QVNOMUhFWC5oZXh0b29pZHN0cihnKX1pZihhPT1cIjAyXCIpe2Yubm9uY2U9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZCxiKX1pZihhPT1cIjAxXCIpe2YuY2VydHJlcT10cnVlfX1yZXR1cm4gZn07S0pVUi5hc24xLnRzcC5UU1BVdGlsLnBhcnNlTWVzc2FnZUltcHJpbnQ9ZnVuY3Rpb24oYyl7dmFyIGg9e307aWYoYy5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wiaGVhZCBvZiBtZXNzYWdlSW1wcmludCBoZXggc2hhbGwgYmUgJzMwJ1wifXZhciBhPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGMsMCk7dmFyIGk9QVNOMUhFWC5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChjLDAsWzAsMF0pO3ZhciBkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMsaSk7dmFyIGU9QVNOMUhFWC5oZXh0b29pZHN0cihkKTt2YXIgZz1LSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWUoZSk7aWYoZz09XCJcIil7dGhyb3dcImhhc2hBbGcgbmFtZSB1bmRlZmluZWQ6IFwiK2V9dmFyIGI9Zzt2YXIgZj1BU04xSEVYLmdldERlY2VuZGFudEluZGV4QnlOdGhMaXN0KGMsMCxbMV0pO2guaGFzaEFsZz1iO2guaGFzaFZhbHVlPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMsZik7cmV0dXJuIGh9O1xuLyohIGFzbjFjYWRlcy0xLjAuMC5qcyAoYykgMjAxMy0yMDE0IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbmlmKHR5cGVvZiBLSlVSPT1cInVuZGVmaW5lZFwifHwhS0pVUil7S0pVUj17fX1pZih0eXBlb2YgS0pVUi5hc24xPT1cInVuZGVmaW5lZFwifHwhS0pVUi5hc24xKXtLSlVSLmFzbjE9e319aWYodHlwZW9mIEtKVVIuYXNuMS5jYWRlcz09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMS5jYWRlcyl7S0pVUi5hc24xLmNhZGVzPXt9fUtKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyPWZ1bmN0aW9uKGUpe0tKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuMTVcIjt2YXIgYj1LSlVSLmFzbjE7dmFyIGQ9S0pVUi5hc24xLmNhZGVzO2lmKHR5cGVvZiBlIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZS5vaWQ9PVwic3RyaW5nXCImJnR5cGVvZiBlLmhhc2g9PVwib2JqZWN0XCIpe3ZhciBmPW5ldyBiLkRFUk9iamVjdElkZW50aWZpZXIoe29pZDplLm9pZH0pO3ZhciBhPW5ldyBkLk90aGVySGFzaEFsZ0FuZFZhbHVlKGUuaGFzaCk7dmFyIGM9bmV3IGIuREVSU2VxdWVuY2Uoe2FycmF5OltmLGFdfSk7dGhpcy52YWx1ZUxpc3Q9W2NdfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5TaWduYXR1cmVQb2xpY3lJZGVudGlmaWVyLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY2FkZXMuT3RoZXJIYXNoQWxnQW5kVmFsdWU9ZnVuY3Rpb24oYil7S0pVUi5hc24xLmNhZGVzLk90aGVySGFzaEFsZ0FuZFZhbHVlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGM9S0pVUi5hc24xLng1MDk7dGhpcy5kQWxnPW51bGw7dGhpcy5kSGFzaD1udWxsO3RoaXMuZ2V0RW5jb2RlZEhleD1mdW5jdGlvbigpe3ZhciBkPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTpbdGhpcy5kQWxnLHRoaXMuZEhhc2hdfSk7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBiIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYi5hbGc9PVwic3RyaW5nXCImJnR5cGVvZiBiLmhhc2g9PVwic3RyaW5nXCIpe3RoaXMuZEFsZz1uZXcgYy5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOmIuYWxnfSk7dGhpcy5kSGFzaD1uZXcgYS5ERVJPY3RldFN0cmluZyh7aGV4OmIuaGFzaH0pfX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5PdGhlckhhc2hBbGdBbmRWYWx1ZSxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNhZGVzLlNpZ25hdHVyZVRpbWVTdGFtcD1mdW5jdGlvbihjKXtLSlVSLmFzbjEuY2FkZXMuU2lnbmF0dXJlVGltZVN0YW1wLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuMTRcIjt0aGlzLnRzdEhleD1udWxsO3ZhciBhPUtKVVIuYXNuMTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGMucmVzIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy5yZXM9PVwic3RyaW5nXCImJmMucmVzLm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXt9ZWxzZXtpZihjLnJlcyBpbnN0YW5jZW9mIEtKVVIuYXNuMS5BU04xT2JqZWN0KXt9ZWxzZXt0aHJvd1wicmVzIHBhcmFtIHNoYWxsIGJlIEFTTjFPYmplY3Qgb3IgaGV4IHN0cmluZ1wifX19aWYodHlwZW9mIGMudHN0IT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYy50c3Q9PVwic3RyaW5nXCImJmMudHN0Lm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXt2YXIgYj1uZXcgYS5BU04xT2JqZWN0KCk7dGhpcy50c3RIZXg9Yy50c3Q7Yi5oVExWPXRoaXMudHN0SGV4O2IuZ2V0RW5jb2RlZEhleCgpO3RoaXMudmFsdWVMaXN0PVtiXX1lbHNle2lmKGMudHN0IGluc3RhbmNlb2YgS0pVUi5hc24xLkFTTjFPYmplY3Qpe31lbHNle3Rocm93XCJ0c3QgcGFyYW0gc2hhbGwgYmUgQVNOMU9iamVjdCBvciBoZXggc3RyaW5nXCJ9fX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY2FkZXMuU2lnbmF0dXJlVGltZVN0YW1wLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY2FkZXMuQ29tcGxldGVDZXJ0aWZpY2F0ZVJlZnM9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNhZGVzLkNvbXBsZXRlQ2VydGlmaWNhdGVSZWZzLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt0aGlzLmF0dHJUeXBlT2lkPVwiMS4yLjg0MC4xMTM1NDkuMS45LjE2LjIuMjFcIjt2YXIgYT1LSlVSLmFzbjE7dmFyIGI9S0pVUi5hc24xLmNhZGVzO3RoaXMuc2V0QnlBcnJheT1mdW5jdGlvbihkKXt0aGlzLnZhbHVlTGlzdD1bXTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9bmV3IGIuT3RoZXJDZXJ0SUQoZFtlXSk7dGhpcy52YWx1ZUxpc3QucHVzaChmKX19O2lmKHR5cGVvZiBjIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgYz09XCJvYmplY3RcIiYmdHlwZW9mIGMubGVuZ3RoPT1cIm51bWJlclwiKXt0aGlzLnNldEJ5QXJyYXkoYyl9fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNhZGVzLkNvbXBsZXRlQ2VydGlmaWNhdGVSZWZzLEtKVVIuYXNuMS5jbXMuQXR0cmlidXRlKTtLSlVSLmFzbjEuY2FkZXMuT3RoZXJDZXJ0SUQ9ZnVuY3Rpb24oZCl7S0pVUi5hc24xLmNhZGVzLk90aGVyQ2VydElELnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYT1LSlVSLmFzbjE7dmFyIGM9S0pVUi5hc24xLmNtczt2YXIgYj1LSlVSLmFzbjEuY2FkZXM7dGhpcy5oYXNJc3N1ZXJTZXJpYWw9dHJ1ZTt0aGlzLmRPdGhlckNlcnRIYXNoPW51bGw7dGhpcy5kSXNzdWVyU2VyaWFsPW51bGw7dGhpcy5zZXRCeUNlcnRQRU09ZnVuY3Rpb24oZSl7dGhpcy5kT3RoZXJDZXJ0SGFzaD1uZXcgYi5PdGhlckhhc2goZSk7aWYodGhpcy5oYXNJc3N1ZXJTZXJpYWwpe3RoaXMuZElzc3VlclNlcmlhbD1uZXcgYy5Jc3N1ZXJBbmRTZXJpYWxOdW1iZXIoZSl9fTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmhUTFYhPW51bGwpe3JldHVybiB0aGlzLmhUTFZ9aWYodGhpcy5kT3RoZXJDZXJ0SGFzaD09bnVsbCl7dGhyb3dcIm90aGVyQ2VydEhhc2ggbm90IHNldFwifXZhciBlPVt0aGlzLmRPdGhlckNlcnRIYXNoXTtpZih0aGlzLmRJc3N1ZXJTZXJpYWwhPW51bGwpe2UucHVzaCh0aGlzLmRJc3N1ZXJTZXJpYWwpfXZhciBmPW5ldyBhLkRFUlNlcXVlbmNlKHthcnJheTplfSk7dGhpcy5oVExWPWYuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmhUTFZ9O2lmKHR5cGVvZiBkIT1cInVuZGVmaW5lZFwiKXtpZih0eXBlb2YgZD09XCJzdHJpbmdcIiYmZC5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXt0aGlzLnNldEJ5Q2VydFBFTShkKX1pZih0eXBlb2YgZD09XCJvYmplY3RcIil7aWYoZC5oYXNpcz09PWZhbHNlKXt0aGlzLmhhc0lzc3VlclNlcmlhbD1mYWxzZX1pZih0eXBlb2YgZC5jZXJ0PT1cInN0cmluZ1wiKXt0aGlzLnNldEJ5Q2VydFBFTShkLmNlcnQpfX19fTtZQUhPTy5sYW5nLmV4dGVuZChLSlVSLmFzbjEuY2FkZXMuT3RoZXJDZXJ0SUQsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jYWRlcy5PdGhlckhhc2g9ZnVuY3Rpb24oYyl7S0pVUi5hc24xLmNhZGVzLk90aGVySGFzaC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyk7dmFyIGE9S0pVUi5hc24xO3ZhciBiPUtKVVIuYXNuMS5jYWRlczt0aGlzLmFsZz1cInNoYTI1NlwiO3RoaXMuZE90aGVySGFzaD1udWxsO3RoaXMuc2V0QnlDZXJ0UEVNPWZ1bmN0aW9uKGQpe2lmKGQuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpPT0tMSl7dGhyb3dcImNlcnRQRU0gbm90IHRvIHNlZW0gUEVNIGZvcm1hdFwifXZhciBlPVg1MDkucGVtVG9IZXgoZCk7dmFyIGY9S0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGUsdGhpcy5hbGcpO3RoaXMuZE90aGVySGFzaD1uZXcgYi5PdGhlckhhc2hBbGdBbmRWYWx1ZSh7YWxnOnRoaXMuYWxnLGhhc2g6Zn0pfTt0aGlzLmdldEVuY29kZWRIZXg9ZnVuY3Rpb24oKXtpZih0aGlzLmRPdGhlckhhc2g9PW51bGwpe3Rocm93XCJPdGhlckhhc2ggbm90IHNldFwifXJldHVybiB0aGlzLmRPdGhlckhhc2guZ2V0RW5jb2RlZEhleCgpfTtpZih0eXBlb2YgYyE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGM9PVwic3RyaW5nXCIpe2lmKGMuaW5kZXhPZihcIi0tLS0tQkVHSU4gXCIpIT0tMSl7dGhpcy5zZXRCeUNlcnRQRU0oYyl9ZWxzZXtpZihjLm1hdGNoKC9eWzAtOUEtRmEtZl0rJC8pKXt0aGlzLmRPdGhlckhhc2g9bmV3IGEuREVST2N0ZXRTdHJpbmcoe2hleDpjfSl9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgc3RyaW5nIHZhbHVlIGZvciBwYXJhbXNcIn19fWVsc2V7aWYodHlwZW9mIGM9PVwib2JqZWN0XCIpe2lmKHR5cGVvZiBjLmNlcnQ9PVwic3RyaW5nXCIpe2lmKHR5cGVvZiBjLmFsZz09XCJzdHJpbmdcIil7dGhpcy5hbGc9Yy5hbGd9dGhpcy5zZXRCeUNlcnRQRU0oYy5jZXJ0KX1lbHNle3RoaXMuZE90aGVySGFzaD1uZXcgYi5PdGhlckhhc2hBbGdBbmRWYWx1ZShjKX19fX19O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jYWRlcy5PdGhlckhhc2gsS0pVUi5hc24xLkFTTjFPYmplY3QpO0tKVVIuYXNuMS5jYWRlcy5DQWRFU1V0aWw9bmV3IGZ1bmN0aW9uKCl7fTtLSlVSLmFzbjEuY2FkZXMuQ0FkRVNVdGlsLmFkZFNpZ1RTPWZ1bmN0aW9uKGMsYixhKXt9O0tKVVIuYXNuMS5jYWRlcy5DQWRFU1V0aWwucGFyc2VTaWduZWREYXRhRm9yQWRkaW5nVW5zaWduZWQ9ZnVuY3Rpb24oZCl7dmFyIHE9S0pVUi5hc24xO3ZhciBwPUtKVVIuYXNuMS5jbXM7dmFyIGM9S0pVUi5hc24xLmNhZGVzLkNBZEVTVXRpbDt2YXIgYT17fTtpZihBU04xSEVYLmdldERlY2VuZGFudEhleFRMVkJ5TnRoTGlzdChkLDAsWzBdKSE9XCIwNjA5MmE4NjQ4ODZmNzBkMDEwNzAyXCIpe3Rocm93XCJoZXggaXMgbm90IENNUyBTaWduZWREYXRhXCJ9dmFyIHM9QVNOMUhFWC5nZXREZWNlbmRhbnRJbmRleEJ5TnRoTGlzdChkLDAsWzEsMF0pO3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQscyk7aWYoYi5sZW5ndGg8NCl7dGhyb3dcIm51bSBvZiBTaWduZWREYXRhIGVsZW0gc2hhbGwgYmUgNCBhdCBsZWFzdFwifXZhciBmPWIuc2hpZnQoKTthLnZlcnNpb249QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGYpO3ZhciBsPWIuc2hpZnQoKTthLmFsZ3M9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGwpO3ZhciBtPWIuc2hpZnQoKTthLmVuY2FwY29udGVudD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsbSk7YS5jZXJ0cz1udWxsO2EucmV2cz1udWxsO2Euc2k9W107dmFyIG49Yi5zaGlmdCgpO2lmKGQuc3Vic3RyKG4sMik9PVwiYTBcIil7YS5jZXJ0cz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsbik7bj1iLnNoaWZ0KCl9aWYoZC5zdWJzdHIobiwyKT09XCJhMVwiKXthLnJldnM9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLG4pO249Yi5zaGlmdCgpfXZhciBrPW47aWYoZC5zdWJzdHIoaywyKSE9XCIzMVwiKXt0aHJvd1wiQ2FuJ3QgZmluZCBzaWduZXJJbmZvc1wifXZhciBqPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGQsayk7Zm9yKHZhciBoPTA7aDxqLmxlbmd0aDtoKyspe3ZhciBvPWpbaF07dmFyIGU9Yy5wYXJzZVNpZ25lckluZm9Gb3JBZGRpbmdVbnNpZ25lZChkLG8saCk7YS5zaVtoXT1lfXZhciBnPW51bGw7YS5vYmo9bmV3IHAuU2lnbmVkRGF0YSgpO2c9bmV3IHEuQVNOMU9iamVjdCgpO2cuaFRMVj1hLnZlcnNpb247YS5vYmouZENNU1ZlcnNpb249ZztnPW5ldyBxLkFTTjFPYmplY3QoKTtnLmhUTFY9YS5hbGdzO2Eub2JqLmREaWdlc3RBbGdzPWc7Zz1uZXcgcS5BU04xT2JqZWN0KCk7Zy5oVExWPWEuZW5jYXBjb250ZW50O2Eub2JqLmRFbmNhcENvbnRlbnRJbmZvPWc7Zz1uZXcgcS5BU04xT2JqZWN0KCk7Zy5oVExWPWEuY2VydHM7YS5vYmouZENlcnRzPWc7YS5vYmouc2lnbmVySW5mb0xpc3Q9W107Zm9yKHZhciBoPTA7aDxhLnNpLmxlbmd0aDtoKyspe2Eub2JqLnNpZ25lckluZm9MaXN0LnB1c2goYS5zaVtoXS5vYmopfXJldHVybiBhfTtLSlVSLmFzbjEuY2FkZXMuQ0FkRVNVdGlsLnBhcnNlU2lnbmVySW5mb0ZvckFkZGluZ1Vuc2lnbmVkPWZ1bmN0aW9uKGQsayxhKXt2YXIgbT1LSlVSLmFzbjE7dmFyIGw9S0pVUi5hc24xLmNtczt2YXIgYj17fTt2YXIgZT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihkLGspO2lmKGUubGVuZ3RoIT02KXt0aHJvd1wibm90IHN1cHBvcnRlZCBpdGVtcyBmb3IgU2lnbmVySW5mbyAoIT02KVwifXZhciBmPWUuc2hpZnQoKTtiLnZlcnNpb249QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGYpO3ZhciBuPWUuc2hpZnQoKTtiLnNpPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxuKTt2YXIgaD1lLnNoaWZ0KCk7Yi5kaWdhbGc9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGgpO3ZhciBjPWUuc2hpZnQoKTtiLnNhdHRycz1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGQsYyk7dmFyIGk9ZS5zaGlmdCgpO2Iuc2lnYWxnPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZCxpKTt2YXIgaj1lLnNoaWZ0KCk7Yi5zaWc9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihkLGopO2Iuc2lndmFsPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGQsaik7dmFyIGc9bnVsbDtiLm9iaj1uZXcgbC5TaWduZXJJbmZvKCk7Zz1uZXcgbS5BU04xT2JqZWN0KCk7Zy5oVExWPWIudmVyc2lvbjtiLm9iai5kQ01TVmVyc2lvbj1nO2c9bmV3IG0uQVNOMU9iamVjdCgpO2cuaFRMVj1iLnNpO2Iub2JqLmRTaWduZXJJZGVudGlmaWVyPWc7Zz1uZXcgbS5BU04xT2JqZWN0KCk7Zy5oVExWPWIuZGlnYWxnO2Iub2JqLmREaWdlc3RBbGdvcml0aG09ZztnPW5ldyBtLkFTTjFPYmplY3QoKTtnLmhUTFY9Yi5zYXR0cnM7Yi5vYmouZFNpZ25lZEF0dHJzPWc7Zz1uZXcgbS5BU04xT2JqZWN0KCk7Zy5oVExWPWIuc2lnYWxnO2Iub2JqLmRTaWdBbGc9ZztnPW5ldyBtLkFTTjFPYmplY3QoKTtnLmhUTFY9Yi5zaWc7Yi5vYmouZFNpZz1nO2Iub2JqLmRVbnNpZ25lZEF0dHJzPW5ldyBsLkF0dHJpYnV0ZUxpc3QoKTtyZXR1cm4gYn07XG4vKiEgYXNuMWNzci0xLjAuMC5qcyAoYykgMjAxNSBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUi5hc24xLmNzcj09XCJ1bmRlZmluZWRcInx8IUtKVVIuYXNuMS5jc3Ipe0tKVVIuYXNuMS5jc3I9e319S0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdD1mdW5jdGlvbihmKXtLSlVSLmFzbjEuY3NyLkNlcnRpZmljYXRpb25SZXF1ZXN0LnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgYj1udWxsO3ZhciBkPW51bGw7dmFyIGU9bnVsbDt2YXIgYz1udWxsO3ZhciBhPW51bGw7dGhpcy5zaWduPWZ1bmN0aW9uKGksaCl7aWYodGhpcy5wcnZLZXk9PW51bGwpe3RoaXMucHJ2S2V5PWh9dGhpcy5hc24xU2lnbmF0dXJlQWxnPW5ldyBLSlVSLmFzbjEueDUwOS5BbGdvcml0aG1JZGVudGlmaWVyKHtuYW1lOml9KTtzaWc9bmV3IEtKVVIuY3J5cHRvLlNpZ25hdHVyZSh7YWxnOml9KTtzaWcuaW5pdFNpZ24odGhpcy5wcnZLZXkpO3NpZy51cGRhdGVIZXgodGhpcy5hc24xQ1NSSW5mby5nZXRFbmNvZGVkSGV4KCkpO3RoaXMuaGV4U2lnPXNpZy5zaWduKCk7dGhpcy5hc24xU2lnPW5ldyBLSlVSLmFzbjEuREVSQml0U3RyaW5nKHtoZXg6XCIwMFwiK3RoaXMuaGV4U2lnfSk7dmFyIGc9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W3RoaXMuYXNuMUNTUkluZm8sdGhpcy5hc24xU2lnbmF0dXJlQWxnLHRoaXMuYXNuMVNpZ119KTt0aGlzLmhUTFY9Zy5nZXRFbmNvZGVkSGV4KCk7dGhpcy5pc01vZGlmaWVkPWZhbHNlfTt0aGlzLmdldFBFTVN0cmluZz1mdW5jdGlvbigpe3ZhciBnPUtKVVIuYXNuMS5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KHRoaXMuZ2V0RW5jb2RlZEhleCgpLFwiQ0VSVElGSUNBVEUgUkVRVUVTVFwiKTtyZXR1cm4gZ307dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7aWYodGhpcy5pc01vZGlmaWVkPT1mYWxzZSYmdGhpcy5oVExWIT1udWxsKXtyZXR1cm4gdGhpcy5oVExWfXRocm93XCJub3Qgc2lnbmVkIHlldFwifTtpZih0eXBlb2YgZiE9XCJ1bmRlZmluZWRcIil7aWYodHlwZW9mIGYuY3NyaW5mbyE9XCJ1bmRlZmluZWRcIil7dGhpcy5hc24xQ1NSSW5mbz1mLmNzcmluZm99fX07WUFIT08ubGFuZy5leHRlbmQoS0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdCxLSlVSLmFzbjEuQVNOMU9iamVjdCk7S0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm89ZnVuY3Rpb24oYSl7S0pVUi5hc24xLmNzci5DZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpO3RoaXMuX2luaXRpYWxpemU9ZnVuY3Rpb24oKXt0aGlzLmFzbjFBcnJheT1uZXcgQXJyYXkoKTt0aGlzLmFzbjFWZXJzaW9uPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjowfSk7dGhpcy5hc24xU3ViamVjdD1udWxsO3RoaXMuYXNuMVN1YmpQS2V5PW51bGw7dGhpcy5leHRlbnNpb25zQXJyYXk9bmV3IEFycmF5KCl9O3RoaXMuc2V0U3ViamVjdEJ5UGFyYW09ZnVuY3Rpb24oYil7dGhpcy5hc24xU3ViamVjdD1uZXcgS0pVUi5hc24xLng1MDkuWDUwME5hbWUoYil9O3RoaXMuc2V0U3ViamVjdFB1YmxpY0tleUJ5R2V0S2V5PWZ1bmN0aW9uKGMpe3ZhciBiPUtFWVVUSUwuZ2V0S2V5KGMpO3RoaXMuYXNuMVN1YmpQS2V5PW5ldyBLSlVSLmFzbjEueDUwOS5TdWJqZWN0UHVibGljS2V5SW5mbyhiKX07dGhpcy5nZXRFbmNvZGVkSGV4PWZ1bmN0aW9uKCl7dGhpcy5hc24xQXJyYXk9bmV3IEFycmF5KCk7dGhpcy5hc24xQXJyYXkucHVzaCh0aGlzLmFzbjFWZXJzaW9uKTt0aGlzLmFzbjFBcnJheS5wdXNoKHRoaXMuYXNuMVN1YmplY3QpO3RoaXMuYXNuMUFycmF5LnB1c2godGhpcy5hc24xU3VialBLZXkpO3ZhciBjPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuZXh0ZW5zaW9uc0FycmF5fSk7dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJUYWdnZWRPYmplY3Qoe2V4cGxpY2l0OmZhbHNlLHRhZzpcImEwXCIsb2JqOmN9KTt0aGlzLmFzbjFBcnJheS5wdXNoKGIpO3ZhciBkPW5ldyBLSlVSLmFzbjEuREVSU2VxdWVuY2Uoe2FycmF5OnRoaXMuYXNuMUFycmF5fSk7dGhpcy5oVExWPWQuZ2V0RW5jb2RlZEhleCgpO3RoaXMuaXNNb2RpZmllZD1mYWxzZTtyZXR1cm4gdGhpcy5oVExWfTt0aGlzLl9pbml0aWFsaXplKCl9O1lBSE9PLmxhbmcuZXh0ZW5kKEtKVVIuYXNuMS5jc3IuQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvLEtKVVIuYXNuMS5BU04xT2JqZWN0KTtLSlVSLmFzbjEuY3NyLkNTUlV0aWw9bmV3IGZ1bmN0aW9uKCl7fTtLSlVSLmFzbjEuY3NyLkNTUlV0aWwubmV3Q1NSUEVNPWZ1bmN0aW9uKGYpe3ZhciBjPUtKVVIuYXNuMS5jc3I7aWYoZi5zdWJqZWN0PT09dW5kZWZpbmVkKXt0aHJvd1wicGFyYW1ldGVyIHN1YmplY3QgdW5kZWZpbmVkXCJ9aWYoZi5zYmpwdWJrZXk9PT11bmRlZmluZWQpe3Rocm93XCJwYXJhbWV0ZXIgc2JqcHVia2V5IHVuZGVmaW5lZFwifWlmKGYuc2lnYWxnPT09dW5kZWZpbmVkKXt0aHJvd1wicGFyYW1ldGVyIHNpZ2FsZyB1bmRlZmluZWRcIn1pZihmLnNianBydmtleT09PXVuZGVmaW5lZCl7dGhyb3dcInBhcmFtZXRlciBzYmpwdWJrZXkgdW5kZWZpbmVkXCJ9dmFyIGI9bmV3IGMuQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvKCk7Yi5zZXRTdWJqZWN0QnlQYXJhbShmLnN1YmplY3QpO2Iuc2V0U3ViamVjdFB1YmxpY0tleUJ5R2V0S2V5KGYuc2JqcHVia2V5KTt2YXIgZD1uZXcgYy5DZXJ0aWZpY2F0aW9uUmVxdWVzdCh7Y3NyaW5mbzpifSk7dmFyIGE9S0VZVVRJTC5nZXRLZXkoZi5zYmpwcnZrZXkpO2Quc2lnbihmLnNpZ2FsZyxhKTt2YXIgZT1kLmdldFBFTVN0cmluZygpO3JldHVybiBlfTtcbi8qISBiYXNlNjR4LTEuMS42IChjKSAyMDEyLTIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gQmFzZTY0eCgpe31mdW5jdGlvbiBzdG9CQShkKXt2YXIgYj1uZXcgQXJyYXkoKTtmb3IodmFyIGM9MDtjPGQubGVuZ3RoO2MrKyl7YltjXT1kLmNoYXJDb2RlQXQoYyl9cmV0dXJuIGJ9ZnVuY3Rpb24gQkF0b3MoYil7dmFyIGQ9XCJcIjtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7ZD1kK1N0cmluZy5mcm9tQ2hhckNvZGUoYltjXSl9cmV0dXJuIGR9ZnVuY3Rpb24gQkF0b2hleChiKXt2YXIgZT1cIlwiO2Zvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgYz1iW2RdLnRvU3RyaW5nKDE2KTtpZihjLmxlbmd0aD09MSl7Yz1cIjBcIitjfWU9ZStjfXJldHVybiBlfWZ1bmN0aW9uIHN0b2hleChhKXtyZXR1cm4gQkF0b2hleChzdG9CQShhKSl9ZnVuY3Rpb24gc3RvYjY0KGEpe3JldHVybiBoZXgyYjY0KHN0b2hleChhKSl9ZnVuY3Rpb24gc3RvYjY0dShhKXtyZXR1cm4gYjY0dG9iNjR1KGhleDJiNjQoc3RvaGV4KGEpKSl9ZnVuY3Rpb24gYjY0dXRvcyhhKXtyZXR1cm4gQkF0b3MoYjY0dG9CQShiNjR1dG9iNjQoYSkpKX1mdW5jdGlvbiBiNjR0b2I2NHUoYSl7YT1hLnJlcGxhY2UoL1xcPS9nLFwiXCIpO2E9YS5yZXBsYWNlKC9cXCsvZyxcIi1cIik7YT1hLnJlcGxhY2UoL1xcLy9nLFwiX1wiKTtyZXR1cm4gYX1mdW5jdGlvbiBiNjR1dG9iNjQoYSl7aWYoYS5sZW5ndGglND09Mil7YT1hK1wiPT1cIn1lbHNle2lmKGEubGVuZ3RoJTQ9PTMpe2E9YStcIj1cIn19YT1hLnJlcGxhY2UoLy0vZyxcIitcIik7YT1hLnJlcGxhY2UoL18vZyxcIi9cIik7cmV0dXJuIGF9ZnVuY3Rpb24gaGV4dG9iNjR1KGEpe2lmKGEubGVuZ3RoJTI9PTEpe2E9XCIwXCIrYX1yZXR1cm4gYjY0dG9iNjR1KGhleDJiNjQoYSkpfWZ1bmN0aW9uIGI2NHV0b2hleChhKXtyZXR1cm4gYjY0dG9oZXgoYjY0dXRvYjY0KGEpKX12YXIgdXRmOHRvYjY0dSxiNjR1dG91dGY4O2lmKHR5cGVvZiBCdWZmZXI9PT1cImZ1bmN0aW9uXCIpe3V0Zjh0b2I2NHU9ZnVuY3Rpb24oYSl7cmV0dXJuIGI2NHRvYjY0dShuZXcgQnVmZmVyKGEsXCJ1dGY4XCIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpKX07YjY0dXRvdXRmOD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IEJ1ZmZlcihiNjR1dG9iNjQoYSksXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGY4XCIpfX1lbHNle3V0Zjh0b2I2NHU9ZnVuY3Rpb24oYSl7cmV0dXJuIGhleHRvYjY0dSh1cmljbXB0b2hleChlbmNvZGVVUklDb21wb25lbnRBbGwoYSkpKX07YjY0dXRvdXRmOD1mdW5jdGlvbihhKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGhleHRvdXJpY21wKGI2NHV0b2hleChhKSkpfX1mdW5jdGlvbiB1dGY4dG9iNjQoYSl7cmV0dXJuIGhleDJiNjQodXJpY21wdG9oZXgoZW5jb2RlVVJJQ29tcG9uZW50QWxsKGEpKSl9ZnVuY3Rpb24gYjY0dG91dGY4KGEpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoaGV4dG91cmljbXAoYjY0dG9oZXgoYSkpKX1mdW5jdGlvbiB1dGY4dG9oZXgoYSl7cmV0dXJuIHVyaWNtcHRvaGV4KGVuY29kZVVSSUNvbXBvbmVudEFsbChhKSl9ZnVuY3Rpb24gaGV4dG91dGY4KGEpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoaGV4dG91cmljbXAoYSkpfWZ1bmN0aW9uIGhleHRvcnN0cihjKXt2YXIgYj1cIlwiO2Zvcih2YXIgYT0wO2E8Yy5sZW5ndGgtMTthKz0yKXtiKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGMuc3Vic3RyKGEsMiksMTYpKX1yZXR1cm4gYn1mdW5jdGlvbiByc3RydG9oZXgoYyl7dmFyIGE9XCJcIjtmb3IodmFyIGI9MDtiPGMubGVuZ3RoO2IrKyl7YSs9KFwiMFwiK2MuY2hhckNvZGVBdChiKS50b1N0cmluZygxNikpLnNsaWNlKC0yKX1yZXR1cm4gYX1mdW5jdGlvbiBoZXh0b2I2NChhKXtyZXR1cm4gaGV4MmI2NChhKX1mdW5jdGlvbiBoZXh0b2I2NG5sKGIpe3ZhciBhPWhleHRvYjY0KGIpO3ZhciBjPWEucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7Yz1jLnJlcGxhY2UoL1xcclxcbiQvLFwiXCIpO3JldHVybiBjfWZ1bmN0aW9uIGI2NG5sdG9oZXgoYil7dmFyIGE9Yi5yZXBsYWNlKC9bXjAtOUEtWmEtelxcLys9XSovZyxcIlwiKTt2YXIgYz1iNjR0b2hleChhKTtyZXR1cm4gY31mdW5jdGlvbiB1cmljbXB0b2hleChhKXtyZXR1cm4gYS5yZXBsYWNlKC8lL2csXCJcIil9ZnVuY3Rpb24gaGV4dG91cmljbXAoYSl7cmV0dXJuIGEucmVwbGFjZSgvKC4uKS9nLFwiJSQxXCIpfWZ1bmN0aW9uIGVuY29kZVVSSUNvbXBvbmVudEFsbChhKXt2YXIgZD1lbmNvZGVVUklDb21wb25lbnQoYSk7dmFyIGI9XCJcIjtmb3IodmFyIGM9MDtjPGQubGVuZ3RoO2MrKyl7aWYoZFtjXT09XCIlXCIpe2I9YitkLnN1YnN0cihjLDMpO2M9YysyfWVsc2V7Yj1iK1wiJVwiK3N0b2hleChkW2NdKX19cmV0dXJuIGJ9ZnVuY3Rpb24gbmV3bGluZV90b1VuaXgoYSl7YT1hLnJlcGxhY2UoL1xcclxcbi9tZyxcIlxcblwiKTtyZXR1cm4gYX1mdW5jdGlvbiBuZXdsaW5lX3RvRG9zKGEpe2E9YS5yZXBsYWNlKC9cXHJcXG4vbWcsXCJcXG5cIik7YT1hLnJlcGxhY2UoL1xcbi9tZyxcIlxcclxcblwiKTtyZXR1cm4gYX1mdW5jdGlvbiBpbnRhcnlzdHJ0b2hleChiKXtiPWIucmVwbGFjZSgvXlxccypcXFtcXHMqLyxcIlwiKTtiPWIucmVwbGFjZSgvXFxzKlxcXVxccyokLyxcIlwiKTtiPWIucmVwbGFjZSgvXFxzKi9nLFwiXCIpO3RyeXt2YXIgYz1iLnNwbGl0KC8sLykubWFwKGZ1bmN0aW9uKGcsZSxoKXt2YXIgZj1wYXJzZUludChnKTtpZihmPDB8fDI1NTxmKXt0aHJvd1wiaW50ZWdlciBub3QgaW4gcmFuZ2UgMC0yNTVcIn12YXIgZD0oXCIwMFwiK2YudG9TdHJpbmcoMTYpKS5zbGljZSgtMik7cmV0dXJuIGR9KS5qb2luKFwiXCIpO3JldHVybiBjfWNhdGNoKGEpe3Rocm93XCJtYWxmb3JtZWQgaW50ZWdlciBhcnJheSBzdHJpbmc6IFwiK2F9fXZhciBzdHJkaWZmaWR4PWZ1bmN0aW9uKGMsYSl7dmFyIGQ9Yy5sZW5ndGg7aWYoYy5sZW5ndGg+YS5sZW5ndGgpe2Q9YS5sZW5ndGh9Zm9yKHZhciBiPTA7YjxkO2IrKyl7aWYoYy5jaGFyQ29kZUF0KGIpIT1hLmNoYXJDb2RlQXQoYikpe3JldHVybiBifX1pZihjLmxlbmd0aCE9YS5sZW5ndGgpe3JldHVybiBkfXJldHVybiAtMX07XG4vKiEgY3J5cHRvLTEuMS44LmpzIChjKSAyMDEzLTIwMTYgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmNyeXB0bz09XCJ1bmRlZmluZWRcInx8IUtKVVIuY3J5cHRvKXtLSlVSLmNyeXB0bz17fX1LSlVSLmNyeXB0by5VdGlsPW5ldyBmdW5jdGlvbigpe3RoaXMuRElHRVNUSU5GT0hFQUQ9e3NoYTE6XCIzMDIxMzAwOTA2MDUyYjBlMDMwMjFhMDUwMDA0MTRcIixzaGEyMjQ6XCIzMDJkMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDQwNTAwMDQxY1wiLHNoYTI1NjpcIjMwMzEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMTA1MDAwNDIwXCIsc2hhMzg0OlwiMzA0MTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAyMDUwMDA0MzBcIixzaGE1MTI6XCIzMDUxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDMwNTAwMDQ0MFwiLG1kMjpcIjMwMjAzMDBjMDYwODJhODY0ODg2ZjcwZDAyMDIwNTAwMDQxMFwiLG1kNTpcIjMwMjAzMDBjMDYwODJhODY0ODg2ZjcwZDAyMDUwNTAwMDQxMFwiLHJpcGVtZDE2MDpcIjMwMjEzMDA5MDYwNTJiMjQwMzAyMDEwNTAwMDQxNFwiLH07dGhpcy5ERUZBVUxUUFJPVklERVI9e21kNTpcImNyeXB0b2pzXCIsc2hhMTpcImNyeXB0b2pzXCIsc2hhMjI0OlwiY3J5cHRvanNcIixzaGEyNTY6XCJjcnlwdG9qc1wiLHNoYTM4NDpcImNyeXB0b2pzXCIsc2hhNTEyOlwiY3J5cHRvanNcIixyaXBlbWQxNjA6XCJjcnlwdG9qc1wiLGhtYWNtZDU6XCJjcnlwdG9qc1wiLGhtYWNzaGExOlwiY3J5cHRvanNcIixobWFjc2hhMjI0OlwiY3J5cHRvanNcIixobWFjc2hhMjU2OlwiY3J5cHRvanNcIixobWFjc2hhMzg0OlwiY3J5cHRvanNcIixobWFjc2hhNTEyOlwiY3J5cHRvanNcIixobWFjcmlwZW1kMTYwOlwiY3J5cHRvanNcIixNRDV3aXRoUlNBOlwiY3J5cHRvanMvanNyc2FcIixTSEExd2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjI0d2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMjU2d2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMzg0d2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBNTEyd2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsUklQRU1EMTYwd2l0aFJTQTpcImNyeXB0b2pzL2pzcnNhXCIsTUQ1d2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEExd2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEEyMjR3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTI1NndpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMzg0d2l0aEVDRFNBOlwiY3J5cHRvanMvanNyc2FcIixTSEE1MTJ3aXRoRUNEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFJJUEVNRDE2MHdpdGhFQ0RTQTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMXdpdGhEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTIyNHdpdGhEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTI1NndpdGhEU0E6XCJjcnlwdG9qcy9qc3JzYVwiLE1ENXdpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixTSEExd2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTIyNHdpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixTSEEyNTZ3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsU0hBMzg0d2l0aFJTQWFuZE1HRjE6XCJjcnlwdG9qcy9qc3JzYVwiLFNIQTUxMndpdGhSU0FhbmRNR0YxOlwiY3J5cHRvanMvanNyc2FcIixSSVBFTUQxNjB3aXRoUlNBYW5kTUdGMTpcImNyeXB0b2pzL2pzcnNhXCIsfTt0aGlzLkNSWVBUT0pTTUVTU0FHRURJR0VTVE5BTUU9e21kNTpDcnlwdG9KUy5hbGdvLk1ENSxzaGExOkNyeXB0b0pTLmFsZ28uU0hBMSxzaGEyMjQ6Q3J5cHRvSlMuYWxnby5TSEEyMjQsc2hhMjU2OkNyeXB0b0pTLmFsZ28uU0hBMjU2LHNoYTM4NDpDcnlwdG9KUy5hbGdvLlNIQTM4NCxzaGE1MTI6Q3J5cHRvSlMuYWxnby5TSEE1MTIscmlwZW1kMTYwOkNyeXB0b0pTLmFsZ28uUklQRU1EMTYwfTt0aGlzLmdldERpZ2VzdEluZm9IZXg9ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgdGhpcy5ESUdFU1RJTkZPSEVBRFtiXT09XCJ1bmRlZmluZWRcIil7dGhyb3dcImFsZyBub3Qgc3VwcG9ydGVkIGluIFV0aWwuRElHRVNUSU5GT0hFQUQ6IFwiK2J9cmV0dXJuIHRoaXMuRElHRVNUSU5GT0hFQURbYl0rYX07dGhpcy5nZXRQYWRkZWREaWdlc3RJbmZvSGV4PWZ1bmN0aW9uKGgsYSxqKXt2YXIgYz10aGlzLmdldERpZ2VzdEluZm9IZXgoaCxhKTt2YXIgZD1qLzQ7aWYoYy5sZW5ndGgrMjI+ZCl7dGhyb3dcImtleSBpcyB0b28gc2hvcnQgZm9yIFNpZ0FsZzoga2V5bGVuPVwiK2orXCIsXCIrYX12YXIgYj1cIjAwMDFcIjt2YXIgaz1cIjAwXCIrYzt2YXIgZz1cIlwiO3ZhciBsPWQtYi5sZW5ndGgtay5sZW5ndGg7Zm9yKHZhciBmPTA7ZjxsO2YrPTIpe2crPVwiZmZcIn12YXIgZT1iK2craztyZXR1cm4gZX07dGhpcy5oYXNoU3RyaW5nPWZ1bmN0aW9uKGEsYyl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpjfSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTt0aGlzLmhhc2hIZXg9ZnVuY3Rpb24oYixjKXt2YXIgYT1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOmN9KTtyZXR1cm4gYS5kaWdlc3RIZXgoYil9O3RoaXMuc2hhMT1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwic2hhMVwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTt0aGlzLnNoYTI1Nj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwic2hhMjU2XCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RTdHJpbmcoYSl9O3RoaXMuc2hhMjU2SGV4PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJzaGEyNTZcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdEhleChhKX07dGhpcy5zaGE1MTI9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcInNoYTUxMlwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTt0aGlzLnNoYTUxMkhleD1mdW5jdGlvbihhKXt2YXIgYj1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOlwic2hhNTEyXCIscHJvdjpcImNyeXB0b2pzXCJ9KTtyZXR1cm4gYi5kaWdlc3RIZXgoYSl9O3RoaXMubWQ1PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBLSlVSLmNyeXB0by5NZXNzYWdlRGlnZXN0KHthbGc6XCJtZDVcIixwcm92OlwiY3J5cHRvanNcIn0pO3JldHVybiBiLmRpZ2VzdFN0cmluZyhhKX07dGhpcy5yaXBlbWQxNjA9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IEtKVVIuY3J5cHRvLk1lc3NhZ2VEaWdlc3Qoe2FsZzpcInJpcGVtZDE2MFwiLHByb3Y6XCJjcnlwdG9qc1wifSk7cmV0dXJuIGIuZGlnZXN0U3RyaW5nKGEpfTt0aGlzLmdldENyeXB0b0pTTURCeU5hbWU9ZnVuY3Rpb24oYSl7fX07S0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdD1mdW5jdGlvbihjKXt2YXIgYj1udWxsO3ZhciBhPW51bGw7dmFyIGQ9bnVsbDt0aGlzLnNldEFsZ0FuZFByb3ZpZGVyPWZ1bmN0aW9uKGcsZil7aWYoZyE9bnVsbCYmZj09PXVuZGVmaW5lZCl7Zj1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUltnXX1pZihcIjptZDU6c2hhMTpzaGEyMjQ6c2hhMjU2OnNoYTM4NDpzaGE1MTI6cmlwZW1kMTYwOlwiLmluZGV4T2YoZykhPS0xJiZmPT1cImNyeXB0b2pzXCIpe3RyeXt0aGlzLm1kPUtKVVIuY3J5cHRvLlV0aWwuQ1JZUFRPSlNNRVNTQUdFRElHRVNUTkFNRVtnXS5jcmVhdGUoKX1jYXRjaChlKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgaGFzaCBhbGcgc2V0IGZhaWwgYWxnPVwiK2crXCIvXCIrZX10aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihoKXt0aGlzLm1kLnVwZGF0ZShoKX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24oaCl7dmFyIGk9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShoKTt0aGlzLm1kLnVwZGF0ZShpKX07dGhpcy5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgaD10aGlzLm1kLmZpbmFsaXplKCk7cmV0dXJuIGgudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLkhleCl9O3RoaXMuZGlnZXN0U3RyaW5nPWZ1bmN0aW9uKGgpe3RoaXMudXBkYXRlU3RyaW5nKGgpO3JldHVybiB0aGlzLmRpZ2VzdCgpfTt0aGlzLmRpZ2VzdEhleD1mdW5jdGlvbihoKXt0aGlzLnVwZGF0ZUhleChoKTtyZXR1cm4gdGhpcy5kaWdlc3QoKX19aWYoXCI6c2hhMjU2OlwiLmluZGV4T2YoZykhPS0xJiZmPT1cInNqY2xcIil7dHJ5e3RoaXMubWQ9bmV3IHNqY2wuaGFzaC5zaGEyNTYoKX1jYXRjaChlKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgaGFzaCBhbGcgc2V0IGZhaWwgYWxnPVwiK2crXCIvXCIrZX10aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihoKXt0aGlzLm1kLnVwZGF0ZShoKX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24oaSl7dmFyIGg9c2pjbC5jb2RlYy5oZXgudG9CaXRzKGkpO3RoaXMubWQudXBkYXRlKGgpfTt0aGlzLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBoPXRoaXMubWQuZmluYWxpemUoKTtyZXR1cm4gc2pjbC5jb2RlYy5oZXguZnJvbUJpdHMoaCl9O3RoaXMuZGlnZXN0U3RyaW5nPWZ1bmN0aW9uKGgpe3RoaXMudXBkYXRlU3RyaW5nKGgpO3JldHVybiB0aGlzLmRpZ2VzdCgpfTt0aGlzLmRpZ2VzdEhleD1mdW5jdGlvbihoKXt0aGlzLnVwZGF0ZUhleChoKTtyZXR1cm4gdGhpcy5kaWdlc3QoKX19fTt0aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihlKXt0aHJvd1widXBkYXRlU3RyaW5nKHN0cikgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdOYW1lK1wiL1wiK3RoaXMucHJvdk5hbWV9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKGUpe3Rocm93XCJ1cGRhdGVIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07dGhpcy5kaWdlc3Q9ZnVuY3Rpb24oKXt0aHJvd1wiZGlnZXN0KCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdOYW1lK1wiL1wiK3RoaXMucHJvdk5hbWV9O3RoaXMuZGlnZXN0U3RyaW5nPWZ1bmN0aW9uKGUpe3Rocm93XCJkaWdlc3RTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ05hbWUrXCIvXCIrdGhpcy5wcm92TmFtZX07dGhpcy5kaWdlc3RIZXg9ZnVuY3Rpb24oZSl7dGhyb3dcImRpZ2VzdEhleChoZXgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnTmFtZStcIi9cIit0aGlzLnByb3ZOYW1lfTtpZihjIT09dW5kZWZpbmVkKXtpZihjLmFsZyE9PXVuZGVmaW5lZCl7dGhpcy5hbGdOYW1lPWMuYWxnO2lmKGMucHJvdj09PXVuZGVmaW5lZCl7dGhpcy5wcm92TmFtZT1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUlt0aGlzLmFsZ05hbWVdfXRoaXMuc2V0QWxnQW5kUHJvdmlkZXIodGhpcy5hbGdOYW1lLHRoaXMucHJvdk5hbWUpfX19O0tKVVIuY3J5cHRvLk1hYz1mdW5jdGlvbihkKXt2YXIgZj1udWxsO3ZhciBjPW51bGw7dmFyIGE9bnVsbDt2YXIgZT1udWxsO3ZhciBiPW51bGw7dGhpcy5zZXRBbGdBbmRQcm92aWRlcj1mdW5jdGlvbihrLGkpe2s9ay50b0xvd2VyQ2FzZSgpO2lmKGs9PW51bGwpe2s9XCJobWFjc2hhMVwifWs9ay50b0xvd2VyQ2FzZSgpO2lmKGsuc3Vic3RyKDAsNCkhPVwiaG1hY1wiKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgdW5zdXBwb3J0ZWQgSE1BQyBhbGc6IFwiK2t9aWYoaT09PXVuZGVmaW5lZCl7aT1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUltrXX10aGlzLmFsZ1Byb3Y9aytcIi9cIitpO3ZhciBnPWsuc3Vic3RyKDQpO2lmKFwiOm1kNTpzaGExOnNoYTIyNDpzaGEyNTY6c2hhMzg0OnNoYTUxMjpyaXBlbWQxNjA6XCIuaW5kZXhPZihnKSE9LTEmJmk9PVwiY3J5cHRvanNcIil7dHJ5e3ZhciBqPUtKVVIuY3J5cHRvLlV0aWwuQ1JZUFRPSlNNRVNTQUdFRElHRVNUTkFNRVtnXTt0aGlzLm1hYz1DcnlwdG9KUy5hbGdvLkhNQUMuY3JlYXRlKGosdGhpcy5wYXNzKX1jYXRjaChoKXt0aHJvd1wic2V0QWxnQW5kUHJvdmlkZXIgaGFzaCBhbGcgc2V0IGZhaWwgaGFzaEFsZz1cIitnK1wiL1wiK2h9dGhpcy51cGRhdGVTdHJpbmc9ZnVuY3Rpb24obCl7dGhpcy5tYWMudXBkYXRlKGwpfTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbihsKXt2YXIgbT1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGwpO3RoaXMubWFjLnVwZGF0ZShtKX07dGhpcy5kb0ZpbmFsPWZ1bmN0aW9uKCl7dmFyIGw9dGhpcy5tYWMuZmluYWxpemUoKTtyZXR1cm4gbC50b1N0cmluZyhDcnlwdG9KUy5lbmMuSGV4KX07dGhpcy5kb0ZpbmFsU3RyaW5nPWZ1bmN0aW9uKGwpe3RoaXMudXBkYXRlU3RyaW5nKGwpO3JldHVybiB0aGlzLmRvRmluYWwoKX07dGhpcy5kb0ZpbmFsSGV4PWZ1bmN0aW9uKGwpe3RoaXMudXBkYXRlSGV4KGwpO3JldHVybiB0aGlzLmRvRmluYWwoKX19fTt0aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbihnKXt0aHJvd1widXBkYXRlU3RyaW5nKHN0cikgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdQcm92fTt0aGlzLnVwZGF0ZUhleD1mdW5jdGlvbihnKXt0aHJvd1widXBkYXRlSGV4KGhleCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdQcm92fTt0aGlzLmRvRmluYWw9ZnVuY3Rpb24oKXt0aHJvd1wiZGlnZXN0KCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGcvcHJvdjogXCIrdGhpcy5hbGdQcm92fTt0aGlzLmRvRmluYWxTdHJpbmc9ZnVuY3Rpb24oZyl7dGhyb3dcImRpZ2VzdFN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnL3Byb3Y6IFwiK3RoaXMuYWxnUHJvdn07dGhpcy5kb0ZpbmFsSGV4PWZ1bmN0aW9uKGcpe3Rocm93XCJkaWdlc3RIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZy9wcm92OiBcIit0aGlzLmFsZ1Byb3Z9O3RoaXMuc2V0UGFzc3dvcmQ9ZnVuY3Rpb24oaCl7aWYodHlwZW9mIGg9PVwic3RyaW5nXCIpe3ZhciBnPWg7aWYoaC5sZW5ndGglMj09MXx8IWgubWF0Y2goL15bMC05QS1GYS1mXSskLykpe2c9cnN0cnRvaGV4KGgpfXRoaXMucGFzcz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGcpO3JldHVybn1pZih0eXBlb2YgaCE9XCJvYmplY3RcIil7dGhyb3dcIktKVVIuY3J5cHRvLk1hYyB1bnN1cHBvcnRlZCBwYXNzd29yZCB0eXBlOiBcIitofXZhciBnPW51bGw7aWYoaC5oZXghPT11bmRlZmluZWQpe2lmKGguaGV4Lmxlbmd0aCUyIT0wfHwhaC5oZXgubWF0Y2goL15bMC05QS1GYS1mXSskLykpe3Rocm93XCJNYWM6IHdyb25nIGhleCBwYXNzd29yZDogXCIraC5oZXh9Zz1oLmhleH1pZihoLnV0ZjghPT11bmRlZmluZWQpe2c9dXRmOHRvaGV4KGgudXRmOCl9aWYoaC5yc3RyIT09dW5kZWZpbmVkKXtnPXJzdHJ0b2hleChoLnJzdHIpfWlmKGguYjY0IT09dW5kZWZpbmVkKXtnPWI2NHRvaGV4KGguYjY0KX1pZihoLmI2NHUhPT11bmRlZmluZWQpe2c9YjY0dXRvaGV4KGguYjY0dSl9aWYoZz09bnVsbCl7dGhyb3dcIktKVVIuY3J5cHRvLk1hYyB1bnN1cHBvcnRlZCBwYXNzd29yZCB0eXBlOiBcIitofXRoaXMucGFzcz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGcpfTtpZihkIT09dW5kZWZpbmVkKXtpZihkLnBhc3MhPT11bmRlZmluZWQpe3RoaXMuc2V0UGFzc3dvcmQoZC5wYXNzKX1pZihkLmFsZyE9PXVuZGVmaW5lZCl7dGhpcy5hbGdOYW1lPWQuYWxnO2lmKGQucHJvdj09PXVuZGVmaW5lZCl7dGhpcy5wcm92TmFtZT1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUlt0aGlzLmFsZ05hbWVdfXRoaXMuc2V0QWxnQW5kUHJvdmlkZXIodGhpcy5hbGdOYW1lLHRoaXMucHJvdk5hbWUpfX19O0tKVVIuY3J5cHRvLlNpZ25hdHVyZT1mdW5jdGlvbihvKXt2YXIgcT1udWxsO3ZhciBuPW51bGw7dmFyIHI9bnVsbDt2YXIgYz1udWxsO3ZhciBsPW51bGw7dmFyIGQ9bnVsbDt2YXIgaz1udWxsO3ZhciBoPW51bGw7dmFyIHA9bnVsbDt2YXIgZT1udWxsO3ZhciBiPS0xO3ZhciBnPW51bGw7dmFyIGo9bnVsbDt2YXIgYT1udWxsO3ZhciBpPW51bGw7dmFyIGY9bnVsbDt0aGlzLl9zZXRBbGdOYW1lcz1mdW5jdGlvbigpe2lmKHRoaXMuYWxnTmFtZS5tYXRjaCgvXiguKyl3aXRoKC4rKSQvKSl7dGhpcy5tZEFsZ05hbWU9UmVnRXhwLiQxLnRvTG93ZXJDYXNlKCk7dGhpcy5wdWJrZXlBbGdOYW1lPVJlZ0V4cC4kMi50b0xvd2VyQ2FzZSgpfX07dGhpcy5femVyb1BhZGRpbmdPZlNpZ25hdHVyZT1mdW5jdGlvbih4LHcpe3ZhciB2PVwiXCI7dmFyIHQ9dy80LXgubGVuZ3RoO2Zvcih2YXIgdT0wO3U8dDt1Kyspe3Y9ditcIjBcIn1yZXR1cm4gdit4fTt0aGlzLnNldEFsZ0FuZFByb3ZpZGVyPWZ1bmN0aW9uKHUsdCl7dGhpcy5fc2V0QWxnTmFtZXMoKTtpZih0IT1cImNyeXB0b2pzL2pzcnNhXCIpe3Rocm93XCJwcm92aWRlciBub3Qgc3VwcG9ydGVkOiBcIit0fWlmKFwiOm1kNTpzaGExOnNoYTIyNDpzaGEyNTY6c2hhMzg0OnNoYTUxMjpyaXBlbWQxNjA6XCIuaW5kZXhPZih0aGlzLm1kQWxnTmFtZSkhPS0xKXt0cnl7dGhpcy5tZD1uZXcgS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdCh7YWxnOnRoaXMubWRBbGdOYW1lfSl9Y2F0Y2gocyl7dGhyb3dcInNldEFsZ0FuZFByb3ZpZGVyIGhhc2ggYWxnIHNldCBmYWlsIGFsZz1cIit0aGlzLm1kQWxnTmFtZStcIi9cIitzfXRoaXMuaW5pdD1mdW5jdGlvbih3LHgpe3ZhciB5PW51bGw7dHJ5e2lmKHg9PT11bmRlZmluZWQpe3k9S0VZVVRJTC5nZXRLZXkodyl9ZWxzZXt5PUtFWVVUSUwuZ2V0S2V5KHcseCl9fWNhdGNoKHYpe3Rocm93XCJpbml0IGZhaWxlZDpcIit2fWlmKHkuaXNQcml2YXRlPT09dHJ1ZSl7dGhpcy5wcnZLZXk9eTt0aGlzLnN0YXRlPVwiU0lHTlwifWVsc2V7aWYoeS5pc1B1YmxpYz09PXRydWUpe3RoaXMucHViS2V5PXk7dGhpcy5zdGF0ZT1cIlZFUklGWVwifWVsc2V7dGhyb3dcImluaXQgZmFpbGVkLjpcIit5fX19O3RoaXMuaW5pdFNpZ249ZnVuY3Rpb24odil7aWYodHlwZW9mIHYuZWNwcnZoZXg9PVwic3RyaW5nXCImJnR5cGVvZiB2LmVjY3VydmVuYW1lPT1cInN0cmluZ1wiKXt0aGlzLmVjcHJ2aGV4PXYuZWNwcnZoZXg7dGhpcy5lY2N1cnZlbmFtZT12LmVjY3VydmVuYW1lfWVsc2V7dGhpcy5wcnZLZXk9dn10aGlzLnN0YXRlPVwiU0lHTlwifTt0aGlzLmluaXRWZXJpZnlCeVB1YmxpY0tleT1mdW5jdGlvbih2KXtpZih0eXBlb2Ygdi5lY3B1YmhleD09XCJzdHJpbmdcIiYmdHlwZW9mIHYuZWNjdXJ2ZW5hbWU9PVwic3RyaW5nXCIpe3RoaXMuZWNwdWJoZXg9di5lY3B1YmhleDt0aGlzLmVjY3VydmVuYW1lPXYuZWNjdXJ2ZW5hbWV9ZWxzZXtpZih2IGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0Epe3RoaXMucHViS2V5PXZ9ZWxzZXtpZih2IGluc3RhbmNlb2YgUlNBS2V5KXt0aGlzLnB1YktleT12fX19dGhpcy5zdGF0ZT1cIlZFUklGWVwifTt0aGlzLmluaXRWZXJpZnlCeUNlcnRpZmljYXRlUEVNPWZ1bmN0aW9uKHYpe3ZhciB3PW5ldyBYNTA5KCk7dy5yZWFkQ2VydFBFTSh2KTt0aGlzLnB1YktleT13LnN1YmplY3RQdWJsaWNLZXlSU0E7dGhpcy5zdGF0ZT1cIlZFUklGWVwifTt0aGlzLnVwZGF0ZVN0cmluZz1mdW5jdGlvbih2KXt0aGlzLm1kLnVwZGF0ZVN0cmluZyh2KX07dGhpcy51cGRhdGVIZXg9ZnVuY3Rpb24odil7dGhpcy5tZC51cGRhdGVIZXgodil9O3RoaXMuc2lnbj1mdW5jdGlvbigpe3RoaXMuc0hhc2hIZXg9dGhpcy5tZC5kaWdlc3QoKTtpZih0eXBlb2YgdGhpcy5lY3BydmhleCE9XCJ1bmRlZmluZWRcIiYmdHlwZW9mIHRoaXMuZWNjdXJ2ZW5hbWUhPVwidW5kZWZpbmVkXCIpe3ZhciB2PW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6dGhpcy5lY2N1cnZlbmFtZX0pO3RoaXMuaFNpZ249di5zaWduSGV4KHRoaXMuc0hhc2hIZXgsdGhpcy5lY3BydmhleCl9ZWxzZXtpZih0aGlzLnBydktleSBpbnN0YW5jZW9mIFJTQUtleSYmdGhpcy5wdWJrZXlBbGdOYW1lPT1cInJzYWFuZG1nZjFcIil7dGhpcy5oU2lnbj10aGlzLnBydktleS5zaWduV2l0aE1lc3NhZ2VIYXNoUFNTKHRoaXMuc0hhc2hIZXgsdGhpcy5tZEFsZ05hbWUsdGhpcy5wc3NTYWx0TGVuKX1lbHNle2lmKHRoaXMucHJ2S2V5IGluc3RhbmNlb2YgUlNBS2V5JiZ0aGlzLnB1YmtleUFsZ05hbWU9PVwicnNhXCIpe3RoaXMuaFNpZ249dGhpcy5wcnZLZXkuc2lnbldpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4LHRoaXMubWRBbGdOYW1lKX1lbHNle2lmKHRoaXMucHJ2S2V5IGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRUNEU0Epe3RoaXMuaFNpZ249dGhpcy5wcnZLZXkuc2lnbldpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4KX1lbHNle2lmKHRoaXMucHJ2S2V5IGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRFNBKXt0aGlzLmhTaWduPXRoaXMucHJ2S2V5LnNpZ25XaXRoTWVzc2FnZUhhc2godGhpcy5zSGFzaEhleCl9ZWxzZXt0aHJvd1wiU2lnbmF0dXJlOiB1bnN1cHBvcnRlZCBwdWJsaWMga2V5IGFsZzogXCIrdGhpcy5wdWJrZXlBbGdOYW1lfX19fX1yZXR1cm4gdGhpcy5oU2lnbn07dGhpcy5zaWduU3RyaW5nPWZ1bmN0aW9uKHYpe3RoaXMudXBkYXRlU3RyaW5nKHYpO3JldHVybiB0aGlzLnNpZ24oKX07dGhpcy5zaWduSGV4PWZ1bmN0aW9uKHYpe3RoaXMudXBkYXRlSGV4KHYpO3JldHVybiB0aGlzLnNpZ24oKX07dGhpcy52ZXJpZnk9ZnVuY3Rpb24odil7dGhpcy5zSGFzaEhleD10aGlzLm1kLmRpZ2VzdCgpO2lmKHR5cGVvZiB0aGlzLmVjcHViaGV4IT1cInVuZGVmaW5lZFwiJiZ0eXBlb2YgdGhpcy5lY2N1cnZlbmFtZSE9XCJ1bmRlZmluZWRcIil7dmFyIHc9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTp0aGlzLmVjY3VydmVuYW1lfSk7cmV0dXJuIHcudmVyaWZ5SGV4KHRoaXMuc0hhc2hIZXgsdix0aGlzLmVjcHViaGV4KX1lbHNle2lmKHRoaXMucHViS2V5IGluc3RhbmNlb2YgUlNBS2V5JiZ0aGlzLnB1YmtleUFsZ05hbWU9PVwicnNhYW5kbWdmMVwiKXtyZXR1cm4gdGhpcy5wdWJLZXkudmVyaWZ5V2l0aE1lc3NhZ2VIYXNoUFNTKHRoaXMuc0hhc2hIZXgsdix0aGlzLm1kQWxnTmFtZSx0aGlzLnBzc1NhbHRMZW4pfWVsc2V7aWYodGhpcy5wdWJLZXkgaW5zdGFuY2VvZiBSU0FLZXkmJnRoaXMucHVia2V5QWxnTmFtZT09XCJyc2FcIil7cmV0dXJuIHRoaXMucHViS2V5LnZlcmlmeVdpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4LHYpfWVsc2V7aWYodGhpcy5wdWJLZXkgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSl7cmV0dXJuIHRoaXMucHViS2V5LnZlcmlmeVdpdGhNZXNzYWdlSGFzaCh0aGlzLnNIYXNoSGV4LHYpfWVsc2V7aWYodGhpcy5wdWJLZXkgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0Epe3JldHVybiB0aGlzLnB1YktleS52ZXJpZnlXaXRoTWVzc2FnZUhhc2godGhpcy5zSGFzaEhleCx2KX1lbHNle3Rocm93XCJTaWduYXR1cmU6IHVuc3VwcG9ydGVkIHB1YmxpYyBrZXkgYWxnOiBcIit0aGlzLnB1YmtleUFsZ05hbWV9fX19fX19fTt0aGlzLmluaXQ9ZnVuY3Rpb24ocyx0KXt0aHJvd1wiaW5pdChrZXksIHBhc3MpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5pbml0VmVyaWZ5QnlQdWJsaWNLZXk9ZnVuY3Rpb24ocyl7dGhyb3dcImluaXRWZXJpZnlCeVB1YmxpY0tleShyc2FQdWJLZXl5KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuaW5pdFZlcmlmeUJ5Q2VydGlmaWNhdGVQRU09ZnVuY3Rpb24ocyl7dGhyb3dcImluaXRWZXJpZnlCeUNlcnRpZmljYXRlUEVNKGNlcnRQRU0pIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5pbml0U2lnbj1mdW5jdGlvbihzKXt0aHJvd1wiaW5pdFNpZ24ocHJ2S2V5KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMudXBkYXRlU3RyaW5nPWZ1bmN0aW9uKHMpe3Rocm93XCJ1cGRhdGVTdHJpbmcoc3RyKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMudXBkYXRlSGV4PWZ1bmN0aW9uKHMpe3Rocm93XCJ1cGRhdGVIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMuc2lnbj1mdW5jdGlvbigpe3Rocm93XCJzaWduKCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLnNpZ25TdHJpbmc9ZnVuY3Rpb24ocyl7dGhyb3dcImRpZ2VzdFN0cmluZyhzdHIpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYWxnOnByb3Y9XCIrdGhpcy5hbGdQcm92TmFtZX07dGhpcy5zaWduSGV4PWZ1bmN0aW9uKHMpe3Rocm93XCJkaWdlc3RIZXgoaGV4KSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGFsZzpwcm92PVwiK3RoaXMuYWxnUHJvdk5hbWV9O3RoaXMudmVyaWZ5PWZ1bmN0aW9uKHMpe3Rocm93XCJ2ZXJpZnkoaFNpZ1ZhbCkgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhbGc6cHJvdj1cIit0aGlzLmFsZ1Byb3ZOYW1lfTt0aGlzLmluaXRQYXJhbXM9bztpZihvIT09dW5kZWZpbmVkKXtpZihvLmFsZyE9PXVuZGVmaW5lZCl7dGhpcy5hbGdOYW1lPW8uYWxnO2lmKG8ucHJvdj09PXVuZGVmaW5lZCl7dGhpcy5wcm92TmFtZT1LSlVSLmNyeXB0by5VdGlsLkRFRkFVTFRQUk9WSURFUlt0aGlzLmFsZ05hbWVdfWVsc2V7dGhpcy5wcm92TmFtZT1vLnByb3Z9dGhpcy5hbGdQcm92TmFtZT10aGlzLmFsZ05hbWUrXCI6XCIrdGhpcy5wcm92TmFtZTt0aGlzLnNldEFsZ0FuZFByb3ZpZGVyKHRoaXMuYWxnTmFtZSx0aGlzLnByb3ZOYW1lKTt0aGlzLl9zZXRBbGdOYW1lcygpfWlmKG8ucHNzc2FsdGxlbiE9PXVuZGVmaW5lZCl7dGhpcy5wc3NTYWx0TGVuPW8ucHNzc2FsdGxlbn1pZihvLnBydmtleXBlbSE9PXVuZGVmaW5lZCl7aWYoby5wcnZrZXlwYXMhPT11bmRlZmluZWQpe3Rocm93XCJib3RoIHBydmtleXBlbSBhbmQgcHJ2a2V5cGFzIHBhcmFtZXRlcnMgbm90IHN1cHBvcnRlZFwifWVsc2V7dHJ5e3ZhciBxPW5ldyBSU0FLZXkoKTtxLnJlYWRQcml2YXRlS2V5RnJvbVBFTVN0cmluZyhvLnBydmtleXBlbSk7dGhpcy5pbml0U2lnbihxKX1jYXRjaChtKXt0aHJvd1wiZmF0YWwgZXJyb3IgdG8gbG9hZCBwZW0gcHJpdmF0ZSBrZXk6IFwiK219fX19fTtLSlVSLmNyeXB0by5PSUQ9bmV3IGZ1bmN0aW9uKCl7dGhpcy5vaWRoZXgybmFtZT17XCIyYTg2NDg4NmY3MGQwMTAxMDFcIjpcInJzYUVuY3J5cHRpb25cIixcIjJhODY0OGNlM2QwMjAxXCI6XCJlY1B1YmxpY0tleVwiLFwiMmE4NjQ4Y2UzODA0MDFcIjpcImRzYVwiLFwiMmE4NjQ4Y2UzZDAzMDEwN1wiOlwic2VjcDI1NnIxXCIsXCIyYjgxMDQwMDFmXCI6XCJzZWNwMTkyazFcIixcIjJiODEwNDAwMjFcIjpcInNlY3AyMjRyMVwiLFwiMmI4MTA0MDAwYVwiOlwic2VjcDI1NmsxXCIsXCIyYjgxMDQwMDIzXCI6XCJzZWNwNTIxcjFcIixcIjJiODEwNDAwMjJcIjpcInNlY3AzODRyMVwiLFwiMmE4NjQ4Y2UzODA0MDNcIjpcIlNIQTF3aXRoRFNBXCIsXCI2MDg2NDgwMTY1MDMwNDAzMDFcIjpcIlNIQTIyNHdpdGhEU0FcIixcIjYwODY0ODAxNjUwMzA0MDMwMlwiOlwiU0hBMjU2d2l0aERTQVwiLH19O1xuLyohIGVjZHNhLW1vZGlmaWVkLTEuMC40LmpzIChjKSBTdGVwaGFuIFRob21hcywgS2VuamkgVXJ1c2hpbWEgfCBnaXRodWIuY29tL2JpdGNvaW5qcy9iaXRjb2luanMtbGliL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmNyeXB0bz09XCJ1bmRlZmluZWRcInx8IUtKVVIuY3J5cHRvKXtLSlVSLmNyeXB0bz17fX1LSlVSLmNyeXB0by5FQ0RTQT1mdW5jdGlvbihoKXt2YXIgZT1cInNlY3AyNTZyMVwiO3ZhciBnPW51bGw7dmFyIGI9bnVsbDt2YXIgZj1udWxsO3ZhciBhPW5ldyBTZWN1cmVSYW5kb20oKTt2YXIgZD1udWxsO3RoaXMudHlwZT1cIkVDXCI7ZnVuY3Rpb24gYyhzLG8scixuKXt2YXIgaj1NYXRoLm1heChvLmJpdExlbmd0aCgpLG4uYml0TGVuZ3RoKCkpO3ZhciB0PXMuYWRkMkQocik7dmFyIHE9cy5jdXJ2ZS5nZXRJbmZpbml0eSgpO2Zvcih2YXIgcD1qLTE7cD49MDstLXApe3E9cS50d2ljZTJEKCk7cS56PUJpZ0ludGVnZXIuT05FO2lmKG8udGVzdEJpdChwKSl7aWYobi50ZXN0Qml0KHApKXtxPXEuYWRkMkQodCl9ZWxzZXtxPXEuYWRkMkQocyl9fWVsc2V7aWYobi50ZXN0Qml0KHApKXtxPXEuYWRkMkQocil9fX1yZXR1cm4gcX10aGlzLmdldEJpZ1JhbmRvbT1mdW5jdGlvbihpKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIoaS5iaXRMZW5ndGgoKSxhKS5tb2QoaS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpLmFkZChCaWdJbnRlZ2VyLk9ORSl9O3RoaXMuc2V0TmFtZWRDdXJ2ZT1mdW5jdGlvbihpKXt0aGlzLmVjcGFyYW1zPUtKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIuZ2V0QnlOYW1lKGkpO3RoaXMucHJ2S2V5SGV4PW51bGw7dGhpcy5wdWJLZXlIZXg9bnVsbDt0aGlzLmN1cnZlTmFtZT1pfTt0aGlzLnNldFByaXZhdGVLZXlIZXg9ZnVuY3Rpb24oaSl7dGhpcy5pc1ByaXZhdGU9dHJ1ZTt0aGlzLnBydktleUhleD1pfTt0aGlzLnNldFB1YmxpY0tleUhleD1mdW5jdGlvbihpKXt0aGlzLmlzUHVibGljPXRydWU7dGhpcy5wdWJLZXlIZXg9aX07dGhpcy5nZW5lcmF0ZUtleVBhaXJIZXg9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLmVjcGFyYW1zLm47dmFyIG49dGhpcy5nZXRCaWdSYW5kb20oayk7dmFyIGw9dGhpcy5lY3BhcmFtcy5HLm11bHRpcGx5KG4pO3ZhciBxPWwuZ2V0WCgpLnRvQmlnSW50ZWdlcigpO3ZhciBvPWwuZ2V0WSgpLnRvQmlnSW50ZWdlcigpO3ZhciBpPXRoaXMuZWNwYXJhbXMua2V5bGVuLzQ7dmFyIG09KFwiMDAwMDAwMDAwMFwiK24udG9TdHJpbmcoMTYpKS5zbGljZSgtaSk7dmFyIHI9KFwiMDAwMDAwMDAwMFwiK3EudG9TdHJpbmcoMTYpKS5zbGljZSgtaSk7dmFyIHA9KFwiMDAwMDAwMDAwMFwiK28udG9TdHJpbmcoMTYpKS5zbGljZSgtaSk7dmFyIGo9XCIwNFwiK3IrcDt0aGlzLnNldFByaXZhdGVLZXlIZXgobSk7dGhpcy5zZXRQdWJsaWNLZXlIZXgoaik7cmV0dXJue2VjcHJ2aGV4Om0sZWNwdWJoZXg6an19O3RoaXMuc2lnbldpdGhNZXNzYWdlSGFzaD1mdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5zaWduSGV4KGksdGhpcy5wcnZLZXlIZXgpfTt0aGlzLnNpZ25IZXg9ZnVuY3Rpb24obyxqKXt2YXIgdD1uZXcgQmlnSW50ZWdlcihqLDE2KTt2YXIgbD10aGlzLmVjcGFyYW1zLm47dmFyIHE9bmV3IEJpZ0ludGVnZXIobywxNik7ZG97dmFyIG09dGhpcy5nZXRCaWdSYW5kb20obCk7dmFyIHU9dGhpcy5lY3BhcmFtcy5HO3ZhciBwPXUubXVsdGlwbHkobSk7dmFyIGk9cC5nZXRYKCkudG9CaWdJbnRlZ2VyKCkubW9kKGwpfXdoaWxlKGkuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTyk8PTApO3ZhciB2PW0ubW9kSW52ZXJzZShsKS5tdWx0aXBseShxLmFkZCh0Lm11bHRpcGx5KGkpKSkubW9kKGwpO3JldHVybiBLSlVSLmNyeXB0by5FQ0RTQS5iaVJTU2lnVG9BU04xU2lnKGksdil9O3RoaXMuc2lnbj1mdW5jdGlvbihtLHUpe3ZhciBxPXU7dmFyIGo9dGhpcy5lY3BhcmFtcy5uO3ZhciBwPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKG0pO2Rve3ZhciBsPXRoaXMuZ2V0QmlnUmFuZG9tKGopO3ZhciB0PXRoaXMuZWNwYXJhbXMuRzt2YXIgbz10Lm11bHRpcGx5KGwpO3ZhciBpPW8uZ2V0WCgpLnRvQmlnSW50ZWdlcigpLm1vZChqKX13aGlsZShpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pPD0wKTt2YXIgdj1sLm1vZEludmVyc2UoaikubXVsdGlwbHkocC5hZGQocS5tdWx0aXBseShpKSkpLm1vZChqKTtyZXR1cm4gdGhpcy5zZXJpYWxpemVTaWcoaSx2KX07dGhpcy52ZXJpZnlXaXRoTWVzc2FnZUhhc2g9ZnVuY3Rpb24oaixpKXtyZXR1cm4gdGhpcy52ZXJpZnlIZXgoaixpLHRoaXMucHViS2V5SGV4KX07dGhpcy52ZXJpZnlIZXg9ZnVuY3Rpb24obSxpLHApe3ZhciBsLGo7dmFyIG89S0pVUi5jcnlwdG8uRUNEU0EucGFyc2VTaWdIZXgoaSk7bD1vLnI7aj1vLnM7dmFyIGs7az1FQ1BvaW50RnAuZGVjb2RlRnJvbUhleCh0aGlzLmVjcGFyYW1zLmN1cnZlLHApO3ZhciBuPW5ldyBCaWdJbnRlZ2VyKG0sMTYpO3JldHVybiB0aGlzLnZlcmlmeVJhdyhuLGwsaixrKX07dGhpcy52ZXJpZnk9ZnVuY3Rpb24obyxwLGope3ZhciBsLGk7aWYoQml0Y29pbi5VdGlsLmlzQXJyYXkocCkpe3ZhciBuPXRoaXMucGFyc2VTaWcocCk7bD1uLnI7aT1uLnN9ZWxzZXtpZihcIm9iamVjdFwiPT09dHlwZW9mIHAmJnAuciYmcC5zKXtsPXAucjtpPXAuc31lbHNle3Rocm93XCJJbnZhbGlkIHZhbHVlIGZvciBzaWduYXR1cmVcIn19dmFyIGs7aWYoaiBpbnN0YW5jZW9mIEVDUG9pbnRGcCl7az1qfWVsc2V7aWYoQml0Y29pbi5VdGlsLmlzQXJyYXkoaikpe2s9RUNQb2ludEZwLmRlY29kZUZyb20odGhpcy5lY3BhcmFtcy5jdXJ2ZSxqKX1lbHNle3Rocm93XCJJbnZhbGlkIGZvcm1hdCBmb3IgcHVia2V5IHZhbHVlLCBtdXN0IGJlIGJ5dGUgYXJyYXkgb3IgRUNQb2ludEZwXCJ9fXZhciBtPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKG8pO3JldHVybiB0aGlzLnZlcmlmeVJhdyhtLGwsaSxrKX07dGhpcy52ZXJpZnlSYXc9ZnVuY3Rpb24obyxpLHcsbSl7dmFyIGw9dGhpcy5lY3BhcmFtcy5uO3ZhciB1PXRoaXMuZWNwYXJhbXMuRztpZihpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk8MHx8aS5jb21wYXJlVG8obCk+PTApe3JldHVybiBmYWxzZX1pZih3LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSk8MHx8dy5jb21wYXJlVG8obCk+PTApe3JldHVybiBmYWxzZX12YXIgcD13Lm1vZEludmVyc2UobCk7dmFyIGs9by5tdWx0aXBseShwKS5tb2QobCk7dmFyIGo9aS5tdWx0aXBseShwKS5tb2QobCk7dmFyIHE9dS5tdWx0aXBseShrKS5hZGQobS5tdWx0aXBseShqKSk7dmFyIHQ9cS5nZXRYKCkudG9CaWdJbnRlZ2VyKCkubW9kKGwpO3JldHVybiB0LmVxdWFscyhpKX07dGhpcy5zZXJpYWxpemVTaWc9ZnVuY3Rpb24oayxqKXt2YXIgbD1rLnRvQnl0ZUFycmF5U2lnbmVkKCk7dmFyIGk9ai50b0J5dGVBcnJheVNpZ25lZCgpO3ZhciBtPVtdO20ucHVzaCgyKTttLnB1c2gobC5sZW5ndGgpO209bS5jb25jYXQobCk7bS5wdXNoKDIpO20ucHVzaChpLmxlbmd0aCk7bT1tLmNvbmNhdChpKTttLnVuc2hpZnQobS5sZW5ndGgpO20udW5zaGlmdCg0OCk7cmV0dXJuIG19O3RoaXMucGFyc2VTaWc9ZnVuY3Rpb24obil7dmFyIG07aWYoblswXSE9NDgpe3Rocm93IG5ldyBFcnJvcihcIlNpZ25hdHVyZSBub3QgYSB2YWxpZCBERVJTZXF1ZW5jZVwiKX1tPTI7aWYoblttXSE9Mil7dGhyb3cgbmV3IEVycm9yKFwiRmlyc3QgZWxlbWVudCBpbiBzaWduYXR1cmUgbXVzdCBiZSBhIERFUkludGVnZXJcIil9dmFyIGw9bi5zbGljZShtKzIsbSsyK25bbSsxXSk7bSs9MituW20rMV07aWYoblttXSE9Mil7dGhyb3cgbmV3IEVycm9yKFwiU2Vjb25kIGVsZW1lbnQgaW4gc2lnbmF0dXJlIG11c3QgYmUgYSBERVJJbnRlZ2VyXCIpfXZhciBpPW4uc2xpY2UobSsyLG0rMituW20rMV0pO20rPTIrblttKzFdO3ZhciBrPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKGwpO3ZhciBqPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKGkpO3JldHVybntyOmssczpqfX07dGhpcy5wYXJzZVNpZ0NvbXBhY3Q9ZnVuY3Rpb24obSl7aWYobS5sZW5ndGghPT02NSl7dGhyb3dcIlNpZ25hdHVyZSBoYXMgdGhlIHdyb25nIGxlbmd0aFwifXZhciBqPW1bMF0tMjc7aWYoajwwfHxqPjcpe3Rocm93XCJJbnZhbGlkIHNpZ25hdHVyZSB0eXBlXCJ9dmFyIG89dGhpcy5lY3BhcmFtcy5uO3ZhciBsPUJpZ0ludGVnZXIuZnJvbUJ5dGVBcnJheVVuc2lnbmVkKG0uc2xpY2UoMSwzMykpLm1vZChvKTt2YXIgaz1CaWdJbnRlZ2VyLmZyb21CeXRlQXJyYXlVbnNpZ25lZChtLnNsaWNlKDMzLDY1KSkubW9kKG8pO3JldHVybntyOmwsczprLGk6an19O2lmKGghPT11bmRlZmluZWQpe2lmKGguY3VydmUhPT11bmRlZmluZWQpe3RoaXMuY3VydmVOYW1lPWguY3VydmV9fWlmKHRoaXMuY3VydmVOYW1lPT09dW5kZWZpbmVkKXt0aGlzLmN1cnZlTmFtZT1lfXRoaXMuc2V0TmFtZWRDdXJ2ZSh0aGlzLmN1cnZlTmFtZSk7aWYoaCE9PXVuZGVmaW5lZCl7aWYoaC5wcnYhPT11bmRlZmluZWQpe3RoaXMuc2V0UHJpdmF0ZUtleUhleChoLnBydil9aWYoaC5wdWIhPT11bmRlZmluZWQpe3RoaXMuc2V0UHVibGljS2V5SGV4KGgucHViKX19fTtLSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleD1mdW5jdGlvbihhKXt2YXIgYj1LSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleEluSGV4UlMoYSk7dmFyIGQ9bmV3IEJpZ0ludGVnZXIoYi5yLDE2KTt2YXIgYz1uZXcgQmlnSW50ZWdlcihiLnMsMTYpO3JldHVybntyOmQsczpjfX07S0pVUi5jcnlwdG8uRUNEU0EucGFyc2VTaWdIZXhJbkhleFJTPWZ1bmN0aW9uKGMpe2lmKGMuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcInNpZ25hdHVyZSBpcyBub3QgYSBBU04uMSBzZXF1ZW5jZVwifXZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGMsMCk7aWYoYi5sZW5ndGghPTIpe3Rocm93XCJudW1iZXIgb2Ygc2lnbmF0dXJlIEFTTi4xIHNlcXVlbmNlIGVsZW1lbnRzIHNlZW0gd3JvbmdcIn12YXIgZz1iWzBdO3ZhciBmPWJbMV07aWYoYy5zdWJzdHIoZywyKSE9XCIwMlwiKXt0aHJvd1wiMXN0IGl0ZW0gb2Ygc2VxdWVuZSBvZiBzaWduYXR1cmUgaXMgbm90IEFTTi4xIGludGVnZXJcIn1pZihjLnN1YnN0cihmLDIpIT1cIjAyXCIpe3Rocm93XCIybmQgaXRlbSBvZiBzZXF1ZW5lIG9mIHNpZ25hdHVyZSBpcyBub3QgQVNOLjEgaW50ZWdlclwifXZhciBlPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMsZyk7dmFyIGQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYyxmKTtyZXR1cm57cjplLHM6ZH19O0tKVVIuY3J5cHRvLkVDRFNBLmFzbjFTaWdUb0NvbmNhdFNpZz1mdW5jdGlvbihjKXt2YXIgZD1LSlVSLmNyeXB0by5FQ0RTQS5wYXJzZVNpZ0hleEluSGV4UlMoYyk7dmFyIGI9ZC5yO3ZhciBhPWQucztpZihiLnN1YnN0cigwLDIpPT1cIjAwXCImJigoKGIubGVuZ3RoLzIpKjgpJSgxNio4KSk9PTgpe2I9Yi5zdWJzdHIoMil9aWYoYS5zdWJzdHIoMCwyKT09XCIwMFwiJiYoKChhLmxlbmd0aC8yKSo4KSUoMTYqOCkpPT04KXthPWEuc3Vic3RyKDIpfWlmKCgoKGIubGVuZ3RoLzIpKjgpJSgxNio4KSkhPTApe3Rocm93XCJ1bmtub3duIEVDRFNBIHNpZyByIGxlbmd0aCBlcnJvclwifWlmKCgoKGEubGVuZ3RoLzIpKjgpJSgxNio4KSkhPTApe3Rocm93XCJ1bmtub3duIEVDRFNBIHNpZyBzIGxlbmd0aCBlcnJvclwifXJldHVybiBiK2F9O0tKVVIuY3J5cHRvLkVDRFNBLmNvbmNhdFNpZ1RvQVNOMVNpZz1mdW5jdGlvbihhKXtpZigoKChhLmxlbmd0aC8yKSo4KSUoMTYqOCkpIT0wKXt0aHJvd1widW5rbm93biBFQ0RTQSBjb25jYXRpbmF0ZWQgci1zIHNpZyAgbGVuZ3RoIGVycm9yXCJ9dmFyIGM9YS5zdWJzdHIoMCxhLmxlbmd0aC8yKTt2YXIgYj1hLnN1YnN0cihhLmxlbmd0aC8yKTtyZXR1cm4gS0pVUi5jcnlwdG8uRUNEU0EuaGV4UlNTaWdUb0FTTjFTaWcoYyxiKX07S0pVUi5jcnlwdG8uRUNEU0EuaGV4UlNTaWdUb0FTTjFTaWc9ZnVuY3Rpb24oYixhKXt2YXIgZD1uZXcgQmlnSW50ZWdlcihiLDE2KTt2YXIgYz1uZXcgQmlnSW50ZWdlcihhLDE2KTtyZXR1cm4gS0pVUi5jcnlwdG8uRUNEU0EuYmlSU1NpZ1RvQVNOMVNpZyhkLGMpfTtLSlVSLmNyeXB0by5FQ0RTQS5iaVJTU2lnVG9BU04xU2lnPWZ1bmN0aW9uKGUsYyl7dmFyIGI9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6ZX0pO3ZhciBhPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OmN9KTt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbYixhXX0pO3JldHVybiBkLmdldEVuY29kZWRIZXgoKX07XG4vKiEgZWNwYXJhbS0xLjAuMC5qcyAoYykgMjAxMyBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuY3J5cHRvPT1cInVuZGVmaW5lZFwifHwhS0pVUi5jcnlwdG8pe0tKVVIuY3J5cHRvPXt9fUtKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREI9bmV3IGZ1bmN0aW9uKCl7dmFyIGI9e307dmFyIGM9e307ZnVuY3Rpb24gYShkKXtyZXR1cm4gbmV3IEJpZ0ludGVnZXIoZCwxNil9dGhpcy5nZXRCeU5hbWU9ZnVuY3Rpb24oZSl7dmFyIGQ9ZTtpZih0eXBlb2YgY1tkXSE9XCJ1bmRlZmluZWRcIil7ZD1jW2VdfWlmKHR5cGVvZiBiW2RdIT1cInVuZGVmaW5lZFwiKXtyZXR1cm4gYltkXX10aHJvd1widW5yZWdpc3RlcmVkIEVDIGN1cnZlIG5hbWU6IFwiK2R9O3RoaXMucmVnaXN0PWZ1bmN0aW9uKEEsbCxvLGcsbSxlLGosZixrLHUsZCx4KXtiW0FdPXt9O3ZhciBzPWEobyk7dmFyIHo9YShnKTt2YXIgeT1hKG0pO3ZhciB0PWEoZSk7dmFyIHc9YShqKTt2YXIgcj1uZXcgRUNDdXJ2ZUZwKHMseix5KTt2YXIgcT1yLmRlY29kZVBvaW50SGV4KFwiMDRcIitmK2spO2JbQV1bXCJuYW1lXCJdPUE7YltBXVtcImtleWxlblwiXT1sO2JbQV1bXCJjdXJ2ZVwiXT1yO2JbQV1bXCJHXCJdPXE7YltBXVtcIm5cIl09dDtiW0FdW1wiaFwiXT13O2JbQV1bXCJvaWRcIl09ZDtiW0FdW1wiaW5mb1wiXT14O2Zvcih2YXIgdj0wO3Y8dS5sZW5ndGg7disrKXtjW3Vbdl1dPUF9fX07S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMTI4cjFcIiwxMjgsXCJGRkZGRkZGREZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRlwiLFwiRkZGRkZGRkRGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkNcIixcIkU4NzU3OUMxMTA3OUY0M0REODI0OTkzQzJDRUU1RUQzXCIsXCJGRkZGRkZGRTAwMDAwMDAwNzVBMzBEMUI5MDM4QTExNVwiLFwiMVwiLFwiMTYxRkY3NTI4Qjg5OUIyRDBDMjg2MDdDQTUyQzVCODZcIixcIkNGNUFDODM5NUJBRkVCMTNDMDJEQTI5MkRERUQ3QTgzXCIsW10sXCJcIixcInNlY3AxMjhyMSA6IFNFQ0cgY3VydmUgb3ZlciBhIDEyOCBiaXQgcHJpbWUgZmllbGRcIik7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMTYwazFcIiwxNjAsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZBQzczXCIsXCIwXCIsXCI3XCIsXCIwMTAwMDAwMDAwMDAwMDAwMDAwMDAxQjhGQTE2REZBQjlBQ0ExNkI2QjNcIixcIjFcIixcIjNCNEMzODJDRTM3QUExOTJBNDAxOUU3NjMwMzZGNEY1REQ0RDdFQkJcIixcIjkzOENGOTM1MzE4RkRDRUQ2QkMyODI4NjUzMTczM0MzRjAzQzRGRUVcIixbXSxcIlwiLFwic2VjcDE2MGsxIDogU0VDRyBjdXJ2ZSBvdmVyIGEgMTYwIGJpdCBwcmltZSBmaWVsZFwiKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AxNjByMVwiLDE2MCxcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGN0ZGRkZGRkZcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGN0ZGRkZGRkNcIixcIjFDOTdCRUZDNTRCRDdBOEI2NUFDRjg5RjgxRDRENEFEQzU2NUZBNDVcIixcIjAxMDAwMDAwMDAwMDAwMDAwMDAwMDFGNEM4RjkyN0FFRDNDQTc1MjI1N1wiLFwiMVwiLFwiNEE5NkI1Njg4RUY1NzMyODQ2NjQ2OTg5NjhDMzhCQjkxM0NCRkM4MlwiLFwiMjNBNjI4NTUzMTY4OTQ3RDU5RENDOTEyMDQyMzUxMzc3QUM1RkIzMlwiLFtdLFwiXCIsXCJzZWNwMTYwcjEgOiBTRUNHIGN1cnZlIG92ZXIgYSAxNjAgYml0IHByaW1lIGZpZWxkXCIpO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDE5MmsxXCIsMTkyLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZFRTM3XCIsXCIwXCIsXCIzXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkUyNkYyRkMxNzBGNjk0NjZBNzRERUZEOERcIixcIjFcIixcIkRCNEZGMTBFQzA1N0U5QUUyNkIwN0QwMjgwQjdGNDM0MURBNUQxQjFFQUUwNkM3RFwiLFwiOUIyRjJGNkQ5QzU2MjhBNzg0NDE2M0QwMTVCRTg2MzQ0MDgyQUE4OEQ5NUUyRjlEXCIsW10pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDE5MnIxXCIsMTkyLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZGXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRkZGRkNcIixcIjY0MjEwNTE5RTU5QzgwRTcwRkE3RTlBQjcyMjQzMDQ5RkVCOERFRUNDMTQ2QjlCMVwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGOTlERUY4MzYxNDZCQzlCMUI0RDIyODMxXCIsXCIxXCIsXCIxODhEQTgwRUIwMzA5MEY2N0NCRjIwRUI0M0ExODgwMEY0RkYwQUZEODJGRjEwMTJcIixcIjA3MTkyQjk1RkZDOERBNzg2MzEwMTFFRDZCMjRDREQ1NzNGOTc3QTExRTc5NDgxMVwiLFtdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AyMjRyMVwiLDIyNCxcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxXCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRVwiLFwiQjQwNTBBODUwQzA0QjNBQkY1NDEzMjU2NTA0NEIwQjdEN0JGRDhCQTI3MEIzOTQzMjM1NUZGQjRcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYxNkEyRTBCOEYwM0UxM0REMjk0NTVDNUMyQTNEXCIsXCIxXCIsXCJCNzBFMENCRDZCQjRCRjdGMzIxMzkwQjk0QTAzQzFEMzU2QzIxMTIyMzQzMjgwRDYxMTVDMUQyMVwiLFwiQkQzNzYzODhCNUY3MjNGQjRDMjJERkU2Q0Q0Mzc1QTA1QTA3NDc2NDQ0RDU4MTk5ODUwMDdFMzRcIixbXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwMjU2azFcIiwyNTYsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGQzJGXCIsXCIwXCIsXCI3XCIsXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUJBQUVEQ0U2QUY0OEEwM0JCRkQyNUU4Q0QwMzY0MTQxXCIsXCIxXCIsXCI3OUJFNjY3RUY5RENCQkFDNTVBMDYyOTVDRTg3MEIwNzAyOUJGQ0RCMkRDRTI4RDk1OUYyODE1QjE2RjgxNzk4XCIsXCI0ODNBREE3NzI2QTNDNDY1NURBNEZCRkMwRTExMDhBOEZEMTdCNDQ4QTY4NTU0MTk5QzQ3RDA4RkZCMTBENEI4XCIsW10pO0tKVVIuY3J5cHRvLkVDUGFyYW1ldGVyREIucmVnaXN0KFwic2VjcDI1NnIxXCIsMjU2LFwiRkZGRkZGRkYwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRlwiLFwiRkZGRkZGRkYwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQ1wiLFwiNUFDNjM1RDhBQTNBOTNFN0IzRUJCRDU1NzY5ODg2QkM2NTFEMDZCMENDNTNCMEY2M0JDRTNDM0UyN0QyNjA0QlwiLFwiRkZGRkZGRkYwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZCQ0U2RkFBREE3MTc5RTg0RjNCOUNBQzJGQzYzMjU1MVwiLFwiMVwiLFwiNkIxN0QxRjJFMTJDNDI0N0Y4QkNFNkU1NjNBNDQwRjI3NzAzN0Q4MTJERUIzM0EwRjRBMTM5NDVEODk4QzI5NlwiLFwiNEZFMzQyRTJGRTFBN0Y5QjhFRTdFQjRBN0MwRjlFMTYyQkNFMzM1NzZCMzE1RUNFQ0JCNjQwNjgzN0JGNTFGNVwiLFtcIk5JU1QgUC0yNTZcIixcIlAtMjU2XCIsXCJwcmltZTI1NnYxXCJdKTtLSlVSLmNyeXB0by5FQ1BhcmFtZXRlckRCLnJlZ2lzdChcInNlY3AzODRyMVwiLDM4NCxcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRlwiLFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZDXCIsXCJCMzMxMkZBN0UyM0VFN0U0OTg4RTA1NkJFM0Y4MkQxOTE4MUQ5QzZFRkU4MTQxMTIwMzE0MDg4RjUwMTM4NzVBQzY1NjM5OEQ4QTJFRDE5RDJBODVDOEVERDNFQzJBRUZcIixcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkM3NjM0RDgxRjQzNzJEREY1ODFBMERCMjQ4QjBBNzdBRUNFQzE5NkFDQ0M1Mjk3M1wiLFwiMVwiLFwiQUE4N0NBMjJCRThCMDUzNzhFQjFDNzFFRjMyMEFENzQ2RTFEM0I2MjhCQTc5Qjk4NTlGNzQxRTA4MjU0MkEzODU1MDJGMjVEQkY1NTI5NkMzQTU0NUUzODcyNzYwQUI3XCIsXCIzNjE3ZGU0YTk2MjYyYzZmNWQ5ZTk4YmY5MjkyZGMyOWY4ZjQxZGJkMjg5YTE0N2NlOWRhMzExM2I1ZjBiOGMwMGE2MGIxY2UxZDdlODE5ZDdhNDMxZDdjOTBlYTBlNWZcIixbXCJOSVNUIFAtMzg0XCIsXCJQLTM4NFwiXSk7S0pVUi5jcnlwdG8uRUNQYXJhbWV0ZXJEQi5yZWdpc3QoXCJzZWNwNTIxcjFcIiw1MjEsXCIxRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRlwiLFwiMUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkNcIixcIjA1MTk1M0VCOTYxOEUxQzlBMUY5MjlBMjFBMEI2ODU0MEVFQTJEQTcyNUI5OUIzMTVGM0I4QjQ4OTkxOEVGMTA5RTE1NjE5Mzk1MUVDN0U5MzdCMTY1MkMwQkQzQkIxQkYwNzM1NzNERjg4M0QyQzM0RjFFRjQ1MUZENDZCNTAzRjAwXCIsXCIxRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZBNTE4Njg3ODNCRjJGOTY2QjdGQ0MwMTQ4RjcwOUE1RDAzQkI1QzlCODg5OUM0N0FFQkI2RkI3MUU5MTM4NjQwOVwiLFwiMVwiLFwiQzY4NThFMDZCNzA0MDRFOUNEOUUzRUNCNjYyMzk1QjQ0MjlDNjQ4MTM5MDUzRkI1MjFGODI4QUY2MDZCNEQzREJBQTE0QjVFNzdFRkU3NTkyOEZFMURDMTI3QTJGRkE4REUzMzQ4QjNDMTg1NkE0MjlCRjk3RTdFMzFDMkU1QkQ2NlwiLFwiMDExODM5Mjk2YTc4OWEzYmMwMDQ1YzhhNWZiNDJjN2QxYmQ5OThmNTQ0NDk1NzliNDQ2ODE3YWZiZDE3MjczZTY2MmM5N2VlNzI5OTVlZjQyNjQwYzU1MGI5MDEzZmFkMDc2MTM1M2M3MDg2YTI3MmMyNDA4OGJlOTQ3NjlmZDE2NjUwXCIsW1wiTklTVCBQLTUyMVwiLFwiUC01MjFcIl0pO1xuLyohIGRzYS1tb2RpZmllZC0xLjAuMS5qcyAoYykgUmVjdXJpdHkgTGFicyBHbWJILCBLZW5qaSBVcnVzaGltbWEgfCBnaXRodWIuY29tL29wZW5wZ3Bqcy9vcGVucGdwanMvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuY3J5cHRvPT1cInVuZGVmaW5lZFwifHwhS0pVUi5jcnlwdG8pe0tKVVIuY3J5cHRvPXt9fUtKVVIuY3J5cHRvLkRTQT1mdW5jdGlvbigpe3RoaXMucD1udWxsO3RoaXMucT1udWxsO3RoaXMuZz1udWxsO3RoaXMueT1udWxsO3RoaXMueD1udWxsO3RoaXMudHlwZT1cIkRTQVwiO3RoaXMuc2V0UHJpdmF0ZT1mdW5jdGlvbih6LHcsdixBLHUpe3RoaXMuaXNQcml2YXRlPXRydWU7dGhpcy5wPXo7dGhpcy5xPXc7dGhpcy5nPXY7dGhpcy55PUE7dGhpcy54PXV9O3RoaXMuc2V0UHVibGljPWZ1bmN0aW9uKHcsdix1LHope3RoaXMuaXNQdWJsaWM9dHJ1ZTt0aGlzLnA9dzt0aGlzLnE9djt0aGlzLmc9dTt0aGlzLnk9ejt0aGlzLng9bnVsbH07dGhpcy5zaWduV2l0aE1lc3NhZ2VIYXNoPWZ1bmN0aW9uKHope3ZhciB2PXRoaXMucDt2YXIgdT10aGlzLnE7dmFyIEM9dGhpcy5nO3ZhciBEPXRoaXMueTt2YXIgRT10aGlzLng7dmFyIEE9ei5zdWJzdHIoMCx1LmJpdExlbmd0aCgpLzQpO3ZhciBCPW5ldyBCaWdJbnRlZ2VyKHosMTYpO3ZhciB3PW4oQmlnSW50ZWdlci5PTkUuYWRkKEJpZ0ludGVnZXIuT05FKSx1LnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk7dmFyIEc9KEMubW9kUG93KHcsdikpLm1vZCh1KTt2YXIgRj0ody5tb2RJbnZlcnNlKHUpLm11bHRpcGx5KEIuYWRkKEUubXVsdGlwbHkoRykpKSkubW9kKHUpO3ZhciBIPUtKVVIuYXNuMS5BU04xVXRpbC5qc29uVG9BU04xSEVYKHtzZXE6W3tcImludFwiOntiaWdpbnQ6R319LHtcImludFwiOntiaWdpbnQ6Rn19XX0pO3JldHVybiBIfTt0aGlzLnZlcmlmeVdpdGhNZXNzYWdlSGFzaD1mdW5jdGlvbihDLEIpe3ZhciB6PXRoaXMucDt2YXIgdT10aGlzLnE7dmFyIEc9dGhpcy5nO3ZhciBIPXRoaXMueTt2YXIgRT10aGlzLnBhcnNlQVNOMVNpZ25hdHVyZShCKTt2YXIgSz1FWzBdO3ZhciBKPUVbMV07dmFyIEM9Qy5zdWJzdHIoMCx1LmJpdExlbmd0aCgpLzQpO3ZhciBEPW5ldyBCaWdJbnRlZ2VyKEMsMTYpO2lmKEJpZ0ludGVnZXIuWkVSTy5jb21wYXJlVG8oSyk+MHx8Sy5jb21wYXJlVG8odSk+MHx8QmlnSW50ZWdlci5aRVJPLmNvbXBhcmVUbyhKKT4wfHxKLmNvbXBhcmVUbyh1KT4wKXt0aHJvd1wiaW52YWxpZCBEU0Egc2lnbmF0dXJlXCJ9dmFyIEk9Si5tb2RJbnZlcnNlKHUpO3ZhciBBPUQubXVsdGlwbHkoSSkubW9kKHUpO3ZhciB2PUsubXVsdGlwbHkoSSkubW9kKHUpO3ZhciBGPUcubW9kUG93KEEseikubXVsdGlwbHkoSC5tb2RQb3codix6KSkubW9kKHopLm1vZCh1KTtyZXR1cm4gRi5jb21wYXJlVG8oSyk9PTB9O3RoaXMucGFyc2VBU04xU2lnbmF0dXJlPWZ1bmN0aW9uKHUpe3RyeXt2YXIgeT1uZXcgQmlnSW50ZWdlcihBU04xSEVYLmdldFZieUxpc3QodSwwLFswXSxcIjAyXCIpLDE2KTt2YXIgdj1uZXcgQmlnSW50ZWdlcihBU04xSEVYLmdldFZieUxpc3QodSwwLFsxXSxcIjAyXCIpLDE2KTtyZXR1cm5beSx2XX1jYXRjaCh3KXt0aHJvd1wibWFsZm9ybWVkIERTQSBzaWduYXR1cmVcIn19O2Z1bmN0aW9uIGQoRSx3LEIsdix1LEMpe3ZhciB6PUtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyh3LEUudG9Mb3dlckNhc2UoKSk7dmFyIHo9ei5zdWJzdHIoMCx1LmJpdExlbmd0aCgpLzQpO3ZhciBBPW5ldyBCaWdJbnRlZ2VyKHosMTYpO3ZhciB5PW4oQmlnSW50ZWdlci5PTkUuYWRkKEJpZ0ludGVnZXIuT05FKSx1LnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk7dmFyIEY9KEIubW9kUG93KHksdikpLm1vZCh1KTt2YXIgRD0oeS5tb2RJbnZlcnNlKHUpLm11bHRpcGx5KEEuYWRkKEMubXVsdGlwbHkoRikpKSkubW9kKHUpO3ZhciBHPW5ldyBBcnJheSgpO0dbMF09RjtHWzFdPUQ7cmV0dXJuIEd9ZnVuY3Rpb24gcih2KXt2YXIgdT1vcGVucGdwLmNvbmZpZy5jb25maWcucHJlZmVyX2hhc2hfYWxnb3JpdGhtO3N3aXRjaChNYXRoLnJvdW5kKHYuYml0TGVuZ3RoKCkvOCkpe2Nhc2UgMjA6aWYodSE9MiYmdT4xMSYmdSE9MTAmJnU8OCl7cmV0dXJuIDJ9cmV0dXJuIHU7Y2FzZSAyODppZih1PjExJiZ1PDgpe3JldHVybiAxMX1yZXR1cm4gdTtjYXNlIDMyOmlmKHU+MTAmJnU8OCl7cmV0dXJuIDh9cmV0dXJuIHU7ZGVmYXVsdDp1dGlsLnByaW50X2RlYnVnKFwiRFNBIHNlbGVjdCBoYXNoIGFsZ29yaXRobTogcmV0dXJuaW5nIG51bGwgZm9yIGFuIHVua25vd24gbGVuZ3RoIG9mIHFcIik7cmV0dXJuIG51bGx9fXRoaXMuc2VsZWN0X2hhc2hfYWxnb3JpdGhtPXI7ZnVuY3Rpb24gbShJLEssSixCLHosdSxGLEcpe3ZhciBDPUtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhCLEkudG9Mb3dlckNhc2UoKSk7dmFyIEM9Qy5zdWJzdHIoMCx1LmJpdExlbmd0aCgpLzQpO3ZhciBEPW5ldyBCaWdJbnRlZ2VyKEMsMTYpO2lmKEJpZ0ludGVnZXIuWkVSTy5jb21wYXJlVG8oSyk+MHx8Sy5jb21wYXJlVG8odSk+MHx8QmlnSW50ZWdlci5aRVJPLmNvbXBhcmVUbyhKKT4wfHxKLmNvbXBhcmVUbyh1KT4wKXt1dGlsLnByaW50X2Vycm9yKFwiaW52YWxpZCBEU0EgU2lnbmF0dXJlXCIpO3JldHVybiBudWxsfXZhciBIPUoubW9kSW52ZXJzZSh1KTt2YXIgQT1ELm11bHRpcGx5KEgpLm1vZCh1KTt2YXIgdj1LLm11bHRpcGx5KEgpLm1vZCh1KTt2YXIgRT1GLm1vZFBvdyhBLHopLm11bHRpcGx5KEcubW9kUG93KHYseikpLm1vZCh6KS5tb2QodSk7cmV0dXJuIEUuY29tcGFyZVRvKEspPT0wfWZ1bmN0aW9uIGEoeil7dmFyIEE9bmV3IEJpZ0ludGVnZXIoeixwcmltZUNlbnRlcmllKTt2YXIgeT1qKHEsNTEyKTt2YXIgdT10KHAscSx6KTt2YXIgdjtkb3t2PW5ldyBCaWdJbnRlZ2VyKHEuYml0Q291bnQoKSxyYW5kKX13aGlsZSh4LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pIT0xJiZ4LmNvbXBhcmVUbyhxKSE9LTEpO3ZhciB3PWcubW9kUG93KHgscCk7cmV0dXJue3g6dixxOkEscDp5LGc6dSx5Ond9fWZ1bmN0aW9uIGooeSx6LHcpe2lmKHolNjQhPTApe3JldHVybiBmYWxzZX12YXIgdTt2YXIgdjtkb3t1PXcoYml0Y291bnQsdHJ1ZSk7dj11LnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTt1PXUuc3VidHJhY3Qodi5yZW1haW5kZXIoeSkpfXdoaWxlKCF1LmlzUHJvYmFibGVQcmltZShwcmltZUNlbnRlcmllKXx8dS5iaXRMZW5ndGgoKSE9bCk7cmV0dXJuIHV9ZnVuY3Rpb24gdChCLHosQSx3KXt2YXIgdT1CLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTt2YXIgeT11LmRpdmlkZSh6KTt2YXIgdjtkb3t2PXcoQSl9d2hpbGUodi5jb21wYXJlVG8odSkhPS0xJiZ2LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkhPTEpO3JldHVybiB2Lm1vZFBvdyh5LEIpfWZ1bmN0aW9uIG8odyx5LHUpe3ZhciB2O2Rve3Y9dSh5LGZhbHNlKX13aGlsZSh2LmNvbXBhcmVUbyh3KSE9LTEmJnYuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykhPTEpO3JldHVybiB2fWZ1bmN0aW9uIGkodix3KXtrPW8odik7dmFyIHU9Zy5tb2RQb3coayx3KS5tb2Qodik7cmV0dXJuIHV9ZnVuY3Rpb24gaChCLHcseSx2LHosdSl7dmFyIEE9Qih2KTtzPSh3Lm1vZEludmVyc2UoeikubXVsdGlwbHkoQS5hZGQodS5tdWx0aXBseSh5KSkpKS5tb2Qoeik7cmV0dXJuIHN9dGhpcy5zaWduPWQ7dGhpcy52ZXJpZnk9bTtmdW5jdGlvbiBuKHcsdSl7aWYodS5jb21wYXJlVG8odyk8PTApe3JldHVybn12YXIgdj11LnN1YnRyYWN0KHcpO3ZhciB5PWUodi5iaXRMZW5ndGgoKSk7d2hpbGUoeT52KXt5PWUodi5iaXRMZW5ndGgoKSl9cmV0dXJuIHcuYWRkKHkpfWZ1bmN0aW9uIGUodyl7aWYodzwwKXtyZXR1cm4gbnVsbH12YXIgdT1NYXRoLmZsb29yKCh3KzcpLzgpO3ZhciB2PWModSk7aWYodyU4PjApe3Y9U3RyaW5nLmZyb21DaGFyQ29kZSgoTWF0aC5wb3coMix3JTgpLTEpJnYuY2hhckNvZGVBdCgwKSkrdi5zdWJzdHJpbmcoMSl9cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKGYodiksMTYpfWZ1bmN0aW9uIGModyl7dmFyIHU9XCJcIjtmb3IodmFyIHY9MDt2PHc7disrKXt1Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGIoKSl9cmV0dXJuIHV9ZnVuY3Rpb24gYigpe3ZhciB1PW5ldyBVaW50MzJBcnJheSgxKTt3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh1KTtyZXR1cm4gdVswXSYyNTV9ZnVuY3Rpb24gZih5KXtpZih5PT1udWxsKXtyZXR1cm5cIlwifXZhciB2PVtdO3ZhciB3PXkubGVuZ3RoO3ZhciB6PTA7dmFyIHU7d2hpbGUoejx3KXt1PXlbeisrXS5jaGFyQ29kZUF0KCkudG9TdHJpbmcoMTYpO3doaWxlKHUubGVuZ3RoPDIpe3U9XCIwXCIrdX12LnB1c2goXCJcIit1KX1yZXR1cm4gdi5qb2luKFwiXCIpfXRoaXMuZ2V0UmFuZG9tQmlnSW50ZWdlckluUmFuZ2U9bjt0aGlzLmdldFJhbmRvbUJpZ0ludGVnZXI9ZTt0aGlzLmdldFJhbmRvbUJ5dGVzPWN9O1xuLyohIHBrY3M1cGtleS0xLjAuNi5qcyAoYykgMjAxMy0yMDE0IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbnZhciBQS0NTNVBLRVk9ZnVuY3Rpb24oKXt2YXIgYz1mdW5jdGlvbihuLHAsbyl7cmV0dXJuIGkoQ3J5cHRvSlMuQUVTLG4scCxvKX07dmFyIGQ9ZnVuY3Rpb24obixwLG8pe3JldHVybiBpKENyeXB0b0pTLlRyaXBsZURFUyxuLHAsbyl9O3ZhciBpPWZ1bmN0aW9uKHEsdixzLG8pe3ZhciBwPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uodik7dmFyIHU9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZShzKTt2YXIgbj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKG8pO3ZhciByPXt9O3Iua2V5PXU7ci5pdj1uO3IuY2lwaGVydGV4dD1wO3ZhciB0PXEuZGVjcnlwdChyLHUse2l2Om59KTtyZXR1cm4gQ3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkodCl9O3ZhciBqPWZ1bmN0aW9uKG4scCxvKXtyZXR1cm4gZShDcnlwdG9KUy5BRVMsbixwLG8pfTt2YXIgbT1mdW5jdGlvbihuLHAsbyl7cmV0dXJuIGUoQ3J5cHRvSlMuVHJpcGxlREVTLG4scCxvKX07dmFyIGU9ZnVuY3Rpb24ocyx4LHYscCl7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh4KTt2YXIgdz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHYpO3ZhciBvPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocCk7dmFyIG49e307dmFyIHU9cy5lbmNyeXB0KHIsdyx7aXY6b30pO3ZhciBxPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UodS50b1N0cmluZygpKTt2YXIgdD1DcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShxKTtyZXR1cm4gdH07dmFyIGc9e1wiQUVTLTI1Ni1DQkNcIjp7cHJvYzpjLGVwcm9jOmosa2V5bGVuOjMyLGl2bGVuOjE2fSxcIkFFUy0xOTItQ0JDXCI6e3Byb2M6YyxlcHJvYzpqLGtleWxlbjoyNCxpdmxlbjoxNn0sXCJBRVMtMTI4LUNCQ1wiOntwcm9jOmMsZXByb2M6aixrZXlsZW46MTYsaXZsZW46MTZ9LFwiREVTLUVERTMtQ0JDXCI6e3Byb2M6ZCxlcHJvYzptLGtleWxlbjoyNCxpdmxlbjo4fX07dmFyIGI9ZnVuY3Rpb24obil7cmV0dXJuIGdbbl1bXCJwcm9jXCJdfTt2YXIgaz1mdW5jdGlvbihuKXt2YXIgcD1DcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbShuKTt2YXIgbz1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeShwKTtyZXR1cm4gb307dmFyIGw9ZnVuY3Rpb24ocSl7dmFyIHI9e307aWYocS5tYXRjaChuZXcgUmVnRXhwKFwiREVLLUluZm86IChbXixdKyksKFswLTlBLUZhLWZdKylcIixcIm1cIikpKXtyLmNpcGhlcj1SZWdFeHAuJDE7ci5pdnNhbHQ9UmVnRXhwLiQyfWlmKHEubWF0Y2gobmV3IFJlZ0V4cChcIi0tLS0tQkVHSU4gKFtBLVpdKykgUFJJVkFURSBLRVktLS0tLVwiKSkpe3IudHlwZT1SZWdFeHAuJDF9dmFyIHA9LTE7dmFyIHQ9MDtpZihxLmluZGV4T2YoXCJcXHJcXG5cXHJcXG5cIikhPS0xKXtwPXEuaW5kZXhPZihcIlxcclxcblxcclxcblwiKTt0PTJ9aWYocS5pbmRleE9mKFwiXFxuXFxuXCIpIT0tMSl7cD1xLmluZGV4T2YoXCJcXG5cXG5cIik7dD0xfXZhciBvPXEuaW5kZXhPZihcIi0tLS0tRU5EXCIpO2lmKHAhPS0xJiZvIT0tMSl7dmFyIG49cS5zdWJzdHJpbmcocCt0KjIsby10KTtuPW4ucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3IuZGF0YT1ufXJldHVybiByfTt2YXIgaD1mdW5jdGlvbihvLHcsbil7dmFyIHQ9bi5zdWJzdHJpbmcoMCwxNik7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh0KTt2YXIgcD1DcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSh3KTt2YXIgcz1nW29dW1wia2V5bGVuXCJdK2dbb11bXCJpdmxlblwiXTt2YXIgdj1cIlwiO3ZhciB1PW51bGw7Zm9yKDs7KXt2YXIgcT1DcnlwdG9KUy5hbGdvLk1ENS5jcmVhdGUoKTtpZih1IT1udWxsKXtxLnVwZGF0ZSh1KX1xLnVwZGF0ZShwKTtxLnVwZGF0ZShyKTt1PXEuZmluYWxpemUoKTt2PXYrQ3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkodSk7aWYodi5sZW5ndGg+PXMqMil7YnJlYWt9fXZhciB4PXt9O3gua2V5aGV4PXYuc3Vic3RyKDAsZ1tvXVtcImtleWxlblwiXSoyKTt4Lml2aGV4PXYuc3Vic3RyKGdbb11bXCJrZXlsZW5cIl0qMixnW29dW1wiaXZsZW5cIl0qMik7cmV0dXJuIHh9O3ZhciBhPWZ1bmN0aW9uKG4sdCxwLHUpe3ZhciBxPUNyeXB0b0pTLmVuYy5CYXNlNjQucGFyc2Uobik7dmFyIG89Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocSk7dmFyIHM9Z1t0XVtcInByb2NcIl07dmFyIHI9cyhvLHAsdSk7cmV0dXJuIHJ9O3ZhciBmPWZ1bmN0aW9uKG4scSxvLHMpe3ZhciBwPWdbcV1bXCJlcHJvY1wiXTt2YXIgcj1wKG4sbyxzKTtyZXR1cm4gcn07cmV0dXJue3ZlcnNpb246XCIxLjAuNVwiLGdldEhleEZyb21QRU06ZnVuY3Rpb24obyxyKXt2YXIgcD1vO2lmKHAuaW5kZXhPZihcIkJFR0lOIFwiK3IpPT0tMSl7dGhyb3dcImNhbid0IGZpbmQgUEVNIGhlYWRlcjogXCIrcn1wPXAucmVwbGFjZShcIi0tLS0tQkVHSU4gXCIrcitcIi0tLS0tXCIsXCJcIik7cD1wLnJlcGxhY2UoXCItLS0tLUVORCBcIityK1wiLS0tLS1cIixcIlwiKTt2YXIgcT1wLnJlcGxhY2UoL1xccysvZyxcIlwiKTt2YXIgbj1iNjR0b2hleChxKTtyZXR1cm4gbn0sZ2V0RGVjcnlwdGVkS2V5SGV4QnlLZXlJVjpmdW5jdGlvbihvLHIscSxwKXt2YXIgbj1iKHIpO3JldHVybiBuKG8scSxwKX0scGFyc2VQS0NTNVBFTTpmdW5jdGlvbihuKXtyZXR1cm4gbChuKX0sZ2V0S2V5QW5kVW51c2VkSXZCeVBhc3Njb2RlQW5kSXZzYWx0OmZ1bmN0aW9uKG8sbixwKXtyZXR1cm4gaChvLG4scCl9LGRlY3J5cHRLZXlCNjQ6ZnVuY3Rpb24obixwLG8scSl7cmV0dXJuIGEobixwLG8scSl9LGdldERlY3J5cHRlZEtleUhleDpmdW5jdGlvbih3LHYpe3ZhciBvPWwodyk7dmFyIHI9by50eXBlO3ZhciBwPW8uY2lwaGVyO3ZhciBuPW8uaXZzYWx0O3ZhciBxPW8uZGF0YTt2YXIgdT1oKHAsdixuKTt2YXIgdD11LmtleWhleDt2YXIgcz1hKHEscCx0LG4pO3JldHVybiBzfSxnZXRSU0FLZXlGcm9tRW5jcnlwdGVkUEtDUzVQRU06ZnVuY3Rpb24ocCxvKXt2YXIgcT10aGlzLmdldERlY3J5cHRlZEtleUhleChwLG8pO3ZhciBuPW5ldyBSU0FLZXkoKTtuLnJlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcocSk7cmV0dXJuIG59LGdldEVyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXg6ZnVuY3Rpb24ocSx4LHIscCl7dmFyIG49XCJcIjtpZih0eXBlb2Ygcj09XCJ1bmRlZmluZWRcInx8cj09bnVsbCl7cj1cIkFFUy0yNTYtQ0JDXCJ9aWYodHlwZW9mIGdbcl09PVwidW5kZWZpbmVkXCIpe3Rocm93XCJQS0NTNVBLRVkgdW5zdXBwb3J0ZWQgYWxnb3JpdGhtOiBcIityfWlmKHR5cGVvZiBwPT1cInVuZGVmaW5lZFwifHxwPT1udWxsKXt2YXIgdD1nW3JdW1wiaXZsZW5cIl07dmFyIHM9ayh0KTtwPXMudG9VcHBlckNhc2UoKX12YXIgdz1oKHIseCxwKTt2YXIgdj13LmtleWhleDt2YXIgdT1mKHEscix2LHApO3ZhciBvPXUucmVwbGFjZSgvKC57NjR9KS9nLFwiJDFcXHJcXG5cIik7dmFyIG49XCItLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tXFxyXFxuXCI7bis9XCJQcm9jLVR5cGU6IDQsRU5DUllQVEVEXFxyXFxuXCI7bis9XCJERUstSW5mbzogXCIrcitcIixcIitwK1wiXFxyXFxuXCI7bis9XCJcXHJcXG5cIjtuKz1vO24rPVwiXFxyXFxuLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS1cXHJcXG5cIjtyZXR1cm4gbn0sZ2V0RXJ5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleTpmdW5jdGlvbihDLEQsbyxzKXt2YXIgQT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe1wiaW50XCI6MH0pO3ZhciB2PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkMubn0pO3ZhciB6PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjpDLmV9KTt2YXIgQj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLmR9KTt2YXIgdD1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLnB9KTt2YXIgcj1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLnF9KTt2YXIgeT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLmRtcDF9KTt2YXIgdT1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLmRtcTF9KTt2YXIgeD1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDpDLmNvZWZmfSk7dmFyIEU9bmV3IEtKVVIuYXNuMS5ERVJTZXF1ZW5jZSh7YXJyYXk6W0Esdix6LEIsdCxyLHksdSx4XX0pO3ZhciB3PUUuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB0aGlzLmdldEVyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXgodyxELG8scyl9LG5ld0VuY3J5cHRlZFBLQ1M1UEVNOmZ1bmN0aW9uKG4sbyxyLHMpe2lmKHR5cGVvZiBvPT1cInVuZGVmaW5lZFwifHxvPT1udWxsKXtvPTEwMjR9aWYodHlwZW9mIHI9PVwidW5kZWZpbmVkXCJ8fHI9PW51bGwpe3I9XCIxMDAwMVwifXZhciBwPW5ldyBSU0FLZXkoKTtwLmdlbmVyYXRlKG8scik7dmFyIHE9bnVsbDtpZih0eXBlb2Ygcz09XCJ1bmRlZmluZWRcInx8cz09bnVsbCl7cT10aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleShwa2V5LG4pfWVsc2V7cT10aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleShwa2V5LG4scyl9cmV0dXJuIHF9LGdldFJTQUtleUZyb21QbGFpblBLQ1M4UEVNOmZ1bmN0aW9uKHApe2lmKHAubWF0Y2goL0VOQ1JZUFRFRC8pKXt0aHJvd1wicGVtIHNoYWxsIGJlIG5vdCBFTkNSWVBURURcIn12YXIgbz10aGlzLmdldEhleEZyb21QRU0ocCxcIlBSSVZBVEUgS0VZXCIpO3ZhciBuPXRoaXMuZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhIZXgobyk7cmV0dXJuIG59LGdldFJTQUtleUZyb21QbGFpblBLQ1M4SGV4OmZ1bmN0aW9uKHEpe3ZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEsMCk7aWYocC5sZW5ndGghPTMpe3Rocm93XCJvdXRlciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDMgZWxlbWVudHM6IFwiK3AubGVuZ3RofXZhciBvPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocSxwWzFdKTtpZihvIT1cIjMwMGQwNjA5MmE4NjQ4ODZmNzBkMDEwMTAxMDUwMFwiKXt0aHJvd1wiUEtDUzggQWxnb3JpdGhtSWRlbnRpZmllciBpcyBub3QgcnNhRW5jOiBcIitvfXZhciBvPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocSxwWzFdKTt2YXIgcj1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHEscFsyXSk7dmFyIHM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoociwwKTt2YXIgbj1uZXcgUlNBS2V5KCk7bi5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKHMpO3JldHVybiBufSxwYXJzZUhleE9mRW5jcnlwdGVkUEtDUzg6ZnVuY3Rpb24odSl7dmFyIHE9e307dmFyIHA9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSwwKTtpZihwLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDApLml0ZW1zICE9IDI6IFwiK3AubGVuZ3RofXEuY2lwaGVydGV4dD1BU04xSEVYLmdldEhleE9mVl9BdE9iaih1LHBbMV0pO3ZhciB3PUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHUscFswXSk7aWYody5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjApLml0ZW1zICE9IDI6IFwiK3cubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsd1swXSkhPVwiMmE4NjQ4ODZmNzBkMDEwNTBkXCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgcGtjczVQQkVTMlwifXZhciBuPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHUsd1sxXSk7aWYody5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMSkuaXRlbXMgIT0gMjogXCIrbi5sZW5ndGh9dmFyIG89QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSxuWzFdKTtpZihvLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjEpLml0ZW1zICE9IDI6IFwiK28ubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsb1swXSkhPVwiMmE4NjQ4ODZmNzBkMDMwN1wiKXt0aHJvd1widGhpcyBvbmx5IHN1cHBvcnRzIFRyaXBsZURFU1wifXEuZW5jcnlwdGlvblNjaGVtZUFsZz1cIlRyaXBsZURFU1wiO3EuZW5jcnlwdGlvblNjaGVtZUlWPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsb1sxXSk7dmFyIHI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodSxuWzBdKTtpZihyLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjApLml0ZW1zICE9IDI6IFwiK3IubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsclswXSkhPVwiMmE4NjQ4ODZmNzBkMDEwNTBjXCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgcGtjczVQQktERjJcIn12YXIgdj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih1LHJbMV0pO2lmKHYubGVuZ3RoPDIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMS4wLjEpLml0ZW1zIDwgMjogXCIrdi5sZW5ndGh9cS5wYmtkZjJTYWx0PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHUsdlswXSk7dmFyIHM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodSx2WzFdKTt0cnl7cS5wYmtkZjJJdGVyPXBhcnNlSW50KHMsMTYpfWNhdGNoKHQpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0IHBia2RmMkl0ZXI6IFwiK3N9cmV0dXJuIHF9LGdldFBCS0RGMktleUhleEZyb21QYXJhbTpmdW5jdGlvbihzLG4pe3ZhciByPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uocy5wYmtkZjJTYWx0KTt2YXIgbz1zLnBia2RmMkl0ZXI7dmFyIHE9Q3J5cHRvSlMuUEJLREYyKG4scix7a2V5U2l6ZToxOTIvMzIsaXRlcmF0aW9uczpvfSk7dmFyIHA9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocSk7cmV0dXJuIHB9LGdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24odix3KXt2YXIgcD10aGlzLmdldEhleEZyb21QRU0odixcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiKTt2YXIgbj10aGlzLnBhcnNlSGV4T2ZFbmNyeXB0ZWRQS0NTOChwKTt2YXIgcz1QS0NTNVBLRVkuZ2V0UEJLREYyS2V5SGV4RnJvbVBhcmFtKG4sdyk7dmFyIHQ9e307dC5jaXBoZXJ0ZXh0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uobi5jaXBoZXJ0ZXh0KTt2YXIgcj1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHMpO3ZhciBxPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uobi5lbmNyeXB0aW9uU2NoZW1lSVYpO3ZhciB1PUNyeXB0b0pTLlRyaXBsZURFUy5kZWNyeXB0KHQscix7aXY6cX0pO3ZhciBvPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHUpO3JldHVybiBvfSxnZXRSU0FLZXlGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24ocSxwKXt2YXIgbz10aGlzLmdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU0ocSxwKTt2YXIgbj10aGlzLmdldFJTQUtleUZyb21QbGFpblBLQ1M4SGV4KG8pO3JldHVybiBufSxnZXRLZXlGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24ocSxvKXt2YXIgbj10aGlzLmdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU0ocSxvKTt2YXIgcD10aGlzLmdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleChuKTtyZXR1cm4gcH0scGFyc2VQbGFpblByaXZhdGVQS0NTOEhleDpmdW5jdGlvbihxKXt2YXIgbz17fTtvLmFsZ3BhcmFtPW51bGw7aWYocS5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIHBsYWluIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAxKVwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEsMCk7aWYocC5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgcGxhaW4gUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDIpXCJ9aWYocS5zdWJzdHIocFsxXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAzKVwifXZhciBuPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEscFsxXSk7aWYobi5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHJpdmF0ZSBrZXkoY29kZTowMDQpXCJ9aWYocS5zdWJzdHIoblswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA1KVwifW8uYWxnb2lkPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEsblswXSk7aWYocS5zdWJzdHIoblsxXSwyKT09XCIwNlwiKXtvLmFsZ3BhcmFtPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEsblsxXSl9aWYocS5zdWJzdHIocFsyXSwyKSE9XCIwNFwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA2KVwifW8ua2V5aWR4PUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmoocSxwWzJdKTtyZXR1cm4gb30sZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4UEVNOmZ1bmN0aW9uKG8pe3ZhciBuPXRoaXMuZ2V0SGV4RnJvbVBFTShvLFwiUFJJVkFURSBLRVlcIik7dmFyIHA9dGhpcy5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXgobik7cmV0dXJuIHB9LGdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOEhleDpmdW5jdGlvbihuKXt2YXIgcD10aGlzLnBhcnNlUGxhaW5Qcml2YXRlUEtDUzhIZXgobik7aWYocC5hbGdvaWQ9PVwiMmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3RoaXMucGFyc2VQcml2YXRlUmF3UlNBS2V5SGV4QXRPYmoobixwKTt2YXIgbz1wLmtleTt2YXIgcT1uZXcgUlNBS2V5KCk7cS5zZXRQcml2YXRlRXgoby5uLG8uZSxvLmQsby5wLG8ucSxvLmRwLG8uZHEsby5jbyk7cmV0dXJuIHF9ZWxzZXtpZihwLmFsZ29pZD09XCIyYTg2NDhjZTNkMDIwMVwiKXt0aGlzLnBhcnNlUHJpdmF0ZVJhd0VDS2V5SGV4QXRPYmoobixwKTtpZihLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbcC5hbGdwYXJhbV09PT11bmRlZmluZWQpe3Rocm93XCJLSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWUgdW5kZWZpbmVkOiBcIitwLmFsZ3BhcmFtfXZhciByPUtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtwLmFsZ3BhcmFtXTt2YXIgcT1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOnIscHJ2OnAua2V5fSk7cmV0dXJuIHF9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXkgYWxnb3JpdGhtXCJ9fX0sZ2V0UlNBS2V5RnJvbVB1YmxpY1BLQ1M4UEVNOmZ1bmN0aW9uKG8pe3ZhciBwPXRoaXMuZ2V0SGV4RnJvbVBFTShvLFwiUFVCTElDIEtFWVwiKTt2YXIgbj10aGlzLmdldFJTQUtleUZyb21QdWJsaWNQS0NTOEhleChwKTtyZXR1cm4gbn0sZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4UEVNOmZ1bmN0aW9uKG8pe3ZhciBwPXRoaXMuZ2V0SGV4RnJvbVBFTShvLFwiUFVCTElDIEtFWVwiKTt2YXIgbj10aGlzLmdldEtleUZyb21QdWJsaWNQS0NTOEhleChwKTtyZXR1cm4gbn0sZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKG8pe3ZhciBuPXRoaXMucGFyc2VQdWJsaWNQS0NTOEhleChvKTtpZihuLmFsZ29pZD09XCIyYTg2NDg4NmY3MGQwMTAxMDFcIil7dmFyIHI9dGhpcy5wYXJzZVB1YmxpY1Jhd1JTQUtleUhleChuLmtleSk7dmFyIHA9bmV3IFJTQUtleSgpO3Auc2V0UHVibGljKHIubixyLmUpO3JldHVybiBwfWVsc2V7aWYobi5hbGdvaWQ9PVwiMmE4NjQ4Y2UzZDAyMDFcIil7aWYoS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW24uYWxncGFyYW1dPT09dW5kZWZpbmVkKXt0aHJvd1wiS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lIHVuZGVmaW5lZDogXCIrbi5hbGdwYXJhbX12YXIgcT1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbbi5hbGdwYXJhbV07dmFyIHA9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpxLHB1YjpuLmtleX0pO3JldHVybiBwfWVsc2V7dGhyb3dcInVuc3VwcG9ydGVkIHB1YmxpYyBrZXkgYWxnb3JpdGhtXCJ9fX0scGFyc2VQdWJsaWNSYXdSU0FLZXlIZXg6ZnVuY3Rpb24ocCl7dmFyIG49e307aWYocC5zdWJzdHIoMCwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDEpXCJ9dmFyIG89QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocCwwKTtpZihvLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDAyKVwifWlmKHAuc3Vic3RyKG9bMF0sMikhPVwiMDJcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDAzKVwifW4ubj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihwLG9bMF0pO2lmKHAuc3Vic3RyKG9bMV0sMikhPVwiMDJcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0Ega2V5KGNvZGU6MDA0KVwifW4uZT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihwLG9bMV0pO3JldHVybiBufSxwYXJzZVByaXZhdGVSYXdSU0FLZXlIZXhBdE9iajpmdW5jdGlvbihvLHEpe3ZhciBwPXEua2V5aWR4O2lmKG8uc3Vic3RyKHAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBSU0EgcHJpdmF0ZSBrZXkoY29kZTowMDEpXCJ9dmFyIG49QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoobyxwKTtpZihuLmxlbmd0aCE9OSl7dGhyb3dcIm1hbGZvcm1lZCBSU0EgcHJpdmF0ZSBrZXkoY29kZTowMDIpXCJ9cS5rZXk9e307cS5rZXkubj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bMV0pO3Eua2V5LmU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzJdKTtxLmtleS5kPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sblszXSk7cS5rZXkucD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bNF0pO3Eua2V5LnE9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzVdKTtxLmtleS5kcD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bNl0pO3Eua2V5LmRxPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKG8sbls3XSk7cS5rZXkuY289QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobyxuWzhdKX0scGFyc2VQcml2YXRlUmF3RUNLZXlIZXhBdE9iajpmdW5jdGlvbihvLHEpe3ZhciBwPXEua2V5aWR4O2lmKG8uc3Vic3RyKHAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBFQ0MgcHJpdmF0ZSBrZXkoY29kZTowMDEpXCJ9dmFyIG49QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoobyxwKTtpZihuLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBFQ0MgcHJpdmF0ZSBrZXkoY29kZTowMDIpXCJ9aWYoby5zdWJzdHIoblsxXSwyKSE9XCIwNFwiKXt0aHJvd1wibWFsZm9ybWVkIEVDQyBwcml2YXRlIGtleShjb2RlOjAwMylcIn1xLmtleT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihvLG5bMV0pfSxwYXJzZVB1YmxpY1BLQ1M4SGV4OmZ1bmN0aW9uKHEpe3ZhciBvPXt9O28uYWxncGFyYW09bnVsbDt2YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihxLDApO2lmKHAubGVuZ3RoIT0yKXt0aHJvd1wib3V0ZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIitwLmxlbmd0aH12YXIgcj1wWzBdO2lmKHEuc3Vic3RyKHIsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDAxKVwifXZhciBuPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHEscik7aWYobi5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMilcIn1pZihxLnN1YnN0cihuWzBdLDIpIT1cIjA2XCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMylcIn1vLmFsZ29pZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLG5bMF0pO2lmKHEuc3Vic3RyKG5bMV0sMik9PVwiMDZcIil7by5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLG5bMV0pfWlmKHEuc3Vic3RyKHBbMV0sMikhPVwiMDNcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwdWJsaWMga2V5KGNvZGU6MDA0KVwifW8ua2V5PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFsxXSkuc3Vic3RyKDIpO3JldHVybiBvfSxnZXRSU0FLZXlGcm9tUHVibGljUEtDUzhIZXg6ZnVuY3Rpb24ocil7dmFyIHE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoociwwKTtpZihxLmxlbmd0aCE9Mil7dGhyb3dcIm91dGVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMiBlbGVtZW50czogXCIrcS5sZW5ndGh9dmFyIHA9QVNOMUhFWC5nZXRIZXhPZlRMVl9BdE9iaihyLHFbMF0pO2lmKHAhPVwiMzAwZDA2MDkyYTg2NDg4NmY3MGQwMTAxMDEwNTAwXCIpe3Rocm93XCJQS0NTOCBBbGdvcml0aG1JZCBpcyBub3QgcnNhRW5jcnlwdGlvblwifWlmKHIuc3Vic3RyKHFbMV0sMikhPVwiMDNcIil7dGhyb3dcIlBLQ1M4IFB1YmxpYyBLZXkgaXMgbm90IEJJVFNUUklORyBlbmNhcHNsYXRlZC5cIn12YXIgdD1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKHIscVsxXSkrMjtpZihyLnN1YnN0cih0LDIpIT1cIjMwXCIpe3Rocm93XCJQS0NTOCBQdWJsaWMgS2V5IGlzIG5vdCBTRVFVRU5DRS5cIn12YXIgbj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihyLHQpO2lmKG4ubGVuZ3RoIT0yKXt0aHJvd1wiaW5uZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIituLmxlbmd0aH1pZihyLnN1YnN0cihuWzBdLDIpIT1cIjAyXCIpe3Rocm93XCJOIGlzIG5vdCBBU04uMSBJTlRFR0VSXCJ9aWYoci5zdWJzdHIoblsxXSwyKSE9XCIwMlwiKXt0aHJvd1wiRSBpcyBub3QgQVNOLjEgSU5URUdFUlwifXZhciB1PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHIsblswXSk7dmFyIHM9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocixuWzFdKTt2YXIgbz1uZXcgUlNBS2V5KCk7by5zZXRQdWJsaWModSxzKTtyZXR1cm4gb30sfX0oKTtcbi8qISBrZXl1dGlsLTEuMC4xMi5qcyAoYykgMjAxMy0yMDE1IEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbnZhciBLRVlVVElMPWZ1bmN0aW9uKCl7dmFyIGQ9ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBrKENyeXB0b0pTLkFFUyxwLHIscSl9O3ZhciBlPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gayhDcnlwdG9KUy5UcmlwbGVERVMscCxyLHEpfTt2YXIgYT1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGsoQ3J5cHRvSlMuREVTLHAscixxKX07dmFyIGs9ZnVuY3Rpb24ocyx4LHUscSl7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh4KTt2YXIgdz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHUpO3ZhciBwPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocSk7dmFyIHQ9e307dC5rZXk9dzt0Lml2PXA7dC5jaXBoZXJ0ZXh0PXI7dmFyIHY9cy5kZWNyeXB0KHQsdyx7aXY6cH0pO3JldHVybiBDcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh2KX07dmFyIGw9ZnVuY3Rpb24ocCxyLHEpe3JldHVybiBnKENyeXB0b0pTLkFFUyxwLHIscSl9O3ZhciBvPWZ1bmN0aW9uKHAscixxKXtyZXR1cm4gZyhDcnlwdG9KUy5UcmlwbGVERVMscCxyLHEpfTt2YXIgZj1mdW5jdGlvbihwLHIscSl7cmV0dXJuIGcoQ3J5cHRvSlMuREVTLHAscixxKX07dmFyIGc9ZnVuY3Rpb24odCx5LHYscSl7dmFyIHM9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh5KTt2YXIgeD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHYpO3ZhciBwPUNyeXB0b0pTLmVuYy5IZXgucGFyc2UocSk7dmFyIHc9dC5lbmNyeXB0KHMseCx7aXY6cH0pO3ZhciByPUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uody50b1N0cmluZygpKTt2YXIgdT1DcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShyKTtyZXR1cm4gdX07dmFyIGk9e1wiQUVTLTI1Ni1DQkNcIjp7cHJvYzpkLGVwcm9jOmwsa2V5bGVuOjMyLGl2bGVuOjE2fSxcIkFFUy0xOTItQ0JDXCI6e3Byb2M6ZCxlcHJvYzpsLGtleWxlbjoyNCxpdmxlbjoxNn0sXCJBRVMtMTI4LUNCQ1wiOntwcm9jOmQsZXByb2M6bCxrZXlsZW46MTYsaXZsZW46MTZ9LFwiREVTLUVERTMtQ0JDXCI6e3Byb2M6ZSxlcHJvYzpvLGtleWxlbjoyNCxpdmxlbjo4fSxcIkRFUy1DQkNcIjp7cHJvYzphLGVwcm9jOmYsa2V5bGVuOjgsaXZsZW46OH19O3ZhciBjPWZ1bmN0aW9uKHApe3JldHVybiBpW3BdW1wicHJvY1wiXX07dmFyIG09ZnVuY3Rpb24ocCl7dmFyIHI9Q3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20ocCk7dmFyIHE9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocik7cmV0dXJuIHF9O3ZhciBuPWZ1bmN0aW9uKHQpe3ZhciB1PXt9O2lmKHQubWF0Y2gobmV3IFJlZ0V4cChcIkRFSy1JbmZvOiAoW14sXSspLChbMC05QS1GYS1mXSspXCIsXCJtXCIpKSl7dS5jaXBoZXI9UmVnRXhwLiQxO3UuaXZzYWx0PVJlZ0V4cC4kMn1pZih0Lm1hdGNoKG5ldyBSZWdFeHAoXCItLS0tLUJFR0lOIChbQS1aXSspIFBSSVZBVEUgS0VZLS0tLS1cIikpKXt1LnR5cGU9UmVnRXhwLiQxfXZhciByPS0xO3ZhciB2PTA7aWYodC5pbmRleE9mKFwiXFxyXFxuXFxyXFxuXCIpIT0tMSl7cj10LmluZGV4T2YoXCJcXHJcXG5cXHJcXG5cIik7dj0yfWlmKHQuaW5kZXhPZihcIlxcblxcblwiKSE9LTEpe3I9dC5pbmRleE9mKFwiXFxuXFxuXCIpO3Y9MX12YXIgcT10LmluZGV4T2YoXCItLS0tLUVORFwiKTtpZihyIT0tMSYmcSE9LTEpe3ZhciBwPXQuc3Vic3RyaW5nKHIrdioyLHEtdik7cD1wLnJlcGxhY2UoL1xccysvZyxcIlwiKTt1LmRhdGE9cH1yZXR1cm4gdX07dmFyIGo9ZnVuY3Rpb24ocSx5LHApe3ZhciB2PXAuc3Vic3RyaW5nKDAsMTYpO3ZhciB0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2Uodik7dmFyIHI9Q3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoeSk7dmFyIHU9aVtxXVtcImtleWxlblwiXStpW3FdW1wiaXZsZW5cIl07dmFyIHg9XCJcIjt2YXIgdz1udWxsO2Zvcig7Oyl7dmFyIHM9Q3J5cHRvSlMuYWxnby5NRDUuY3JlYXRlKCk7aWYodyE9bnVsbCl7cy51cGRhdGUodyl9cy51cGRhdGUocik7cy51cGRhdGUodCk7dz1zLmZpbmFsaXplKCk7eD14K0NyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHcpO2lmKHgubGVuZ3RoPj11KjIpe2JyZWFrfX12YXIgej17fTt6LmtleWhleD14LnN1YnN0cigwLGlbcV1bXCJrZXlsZW5cIl0qMik7ei5pdmhleD14LnN1YnN0cihpW3FdW1wia2V5bGVuXCJdKjIsaVtxXVtcIml2bGVuXCJdKjIpO3JldHVybiB6fTt2YXIgYj1mdW5jdGlvbihwLHYscix3KXt2YXIgcz1DcnlwdG9KUy5lbmMuQmFzZTY0LnBhcnNlKHApO3ZhciBxPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHMpO3ZhciB1PWlbdl1bXCJwcm9jXCJdO3ZhciB0PXUocSxyLHcpO3JldHVybiB0fTt2YXIgaD1mdW5jdGlvbihwLHMscSx1KXt2YXIgcj1pW3NdW1wiZXByb2NcIl07dmFyIHQ9cihwLHEsdSk7cmV0dXJuIHR9O3JldHVybnt2ZXJzaW9uOlwiMS4wLjBcIixnZXRIZXhGcm9tUEVNOmZ1bmN0aW9uKHEsdSl7dmFyIHI9cTtpZihyLmluZGV4T2YoXCItLS0tLUJFR0lOIFwiKT09LTEpe3Rocm93XCJjYW4ndCBmaW5kIFBFTSBoZWFkZXI6IFwiK3V9aWYodHlwZW9mIHU9PVwic3RyaW5nXCImJnUhPVwiXCIpe3I9ci5yZXBsYWNlKFwiLS0tLS1CRUdJTiBcIit1K1wiLS0tLS1cIixcIlwiKTtyPXIucmVwbGFjZShcIi0tLS0tRU5EIFwiK3UrXCItLS0tLVwiLFwiXCIpfWVsc2V7cj1yLnJlcGxhY2UoLy0tLS0tQkVHSU4gW14tXSstLS0tLS8sXCJcIik7cj1yLnJlcGxhY2UoLy0tLS0tRU5EIFteLV0rLS0tLS0vLFwiXCIpfXZhciB0PXIucmVwbGFjZSgvXFxzKy9nLFwiXCIpO3ZhciBwPWI2NHRvaGV4KHQpO3JldHVybiBwfSxnZXREZWNyeXB0ZWRLZXlIZXhCeUtleUlWOmZ1bmN0aW9uKHEsdCxzLHIpe3ZhciBwPWModCk7cmV0dXJuIHAocSxzLHIpfSxwYXJzZVBLQ1M1UEVNOmZ1bmN0aW9uKHApe3JldHVybiBuKHApfSxnZXRLZXlBbmRVbnVzZWRJdkJ5UGFzc2NvZGVBbmRJdnNhbHQ6ZnVuY3Rpb24ocSxwLHIpe3JldHVybiBqKHEscCxyKX0sZGVjcnlwdEtleUI2NDpmdW5jdGlvbihwLHIscSxzKXtyZXR1cm4gYihwLHIscSxzKX0sZ2V0RGVjcnlwdGVkS2V5SGV4OmZ1bmN0aW9uKHkseCl7dmFyIHE9bih5KTt2YXIgdD1xLnR5cGU7dmFyIHI9cS5jaXBoZXI7dmFyIHA9cS5pdnNhbHQ7dmFyIHM9cS5kYXRhO3ZhciB3PWoocix4LHApO3ZhciB2PXcua2V5aGV4O3ZhciB1PWIocyxyLHYscCk7cmV0dXJuIHV9LGdldFJTQUtleUZyb21FbmNyeXB0ZWRQS0NTNVBFTTpmdW5jdGlvbihyLHEpe3ZhciBzPXRoaXMuZ2V0RGVjcnlwdGVkS2V5SGV4KHIscSk7dmFyIHA9bmV3IFJTQUtleSgpO3AucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhzKTtyZXR1cm4gcH0sZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4OmZ1bmN0aW9uKHgscyxBLHQscil7dmFyIHA9XCJcIjtpZih0eXBlb2YgdD09XCJ1bmRlZmluZWRcInx8dD09bnVsbCl7dD1cIkFFUy0yNTYtQ0JDXCJ9aWYodHlwZW9mIGlbdF09PVwidW5kZWZpbmVkXCIpe3Rocm93XCJLRVlVVElMIHVuc3VwcG9ydGVkIGFsZ29yaXRobTogXCIrdH1pZih0eXBlb2Ygcj09XCJ1bmRlZmluZWRcInx8cj09bnVsbCl7dmFyIHY9aVt0XVtcIml2bGVuXCJdO3ZhciB1PW0odik7cj11LnRvVXBwZXJDYXNlKCl9dmFyIHo9aih0LEEscik7dmFyIHk9ei5rZXloZXg7dmFyIHc9aChzLHQseSxyKTt2YXIgcT13LnJlcGxhY2UoLyguezY0fSkvZyxcIiQxXFxyXFxuXCIpO3ZhciBwPVwiLS0tLS1CRUdJTiBcIit4K1wiIFBSSVZBVEUgS0VZLS0tLS1cXHJcXG5cIjtwKz1cIlByb2MtVHlwZTogNCxFTkNSWVBURURcXHJcXG5cIjtwKz1cIkRFSy1JbmZvOiBcIit0K1wiLFwiK3IrXCJcXHJcXG5cIjtwKz1cIlxcclxcblwiO3ArPXE7cCs9XCJcXHJcXG4tLS0tLUVORCBcIit4K1wiIFBSSVZBVEUgS0VZLS0tLS1cXHJcXG5cIjtyZXR1cm4gcH0sZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUlNBS2V5OmZ1bmN0aW9uKEQsRSxyLHQpe3ZhciBCPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7XCJpbnRcIjowfSk7dmFyIHc9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtiaWdpbnQ6RC5ufSk7dmFyIEE9bmV3IEtKVVIuYXNuMS5ERVJJbnRlZ2VyKHtcImludFwiOkQuZX0pO3ZhciBDPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQuZH0pO3ZhciB1PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQucH0pO3ZhciBzPW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQucX0pO3ZhciB6PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQuZG1wMX0pO3ZhciB2PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQuZG1xMX0pO3ZhciB5PW5ldyBLSlVSLmFzbjEuREVSSW50ZWdlcih7YmlnaW50OkQuY29lZmZ9KTt2YXIgRj1uZXcgS0pVUi5hc24xLkRFUlNlcXVlbmNlKHthcnJheTpbQix3LEEsQyx1LHMseix2LHldfSk7dmFyIHg9Ri5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHRoaXMuZ2V0RW5jcnlwdGVkUEtDUzVQRU1Gcm9tUHJ2S2V5SGV4KFwiUlNBXCIseCxFLHIsdCl9LG5ld0VuY3J5cHRlZFBLQ1M1UEVNOmZ1bmN0aW9uKHAscSx0LHUpe2lmKHR5cGVvZiBxPT1cInVuZGVmaW5lZFwifHxxPT1udWxsKXtxPTEwMjR9aWYodHlwZW9mIHQ9PVwidW5kZWZpbmVkXCJ8fHQ9PW51bGwpe3Q9XCIxMDAwMVwifXZhciByPW5ldyBSU0FLZXkoKTtyLmdlbmVyYXRlKHEsdCk7dmFyIHM9bnVsbDtpZih0eXBlb2YgdT09XCJ1bmRlZmluZWRcInx8dT09bnVsbCl7cz10aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleShyLHApfWVsc2V7cz10aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVJTQUtleShyLHAsdSl9cmV0dXJuIHN9LGdldFJTQUtleUZyb21QbGFpblBLQ1M4UEVNOmZ1bmN0aW9uKHIpe2lmKHIubWF0Y2goL0VOQ1JZUFRFRC8pKXt0aHJvd1wicGVtIHNoYWxsIGJlIG5vdCBFTkNSWVBURURcIn12YXIgcT10aGlzLmdldEhleEZyb21QRU0ocixcIlBSSVZBVEUgS0VZXCIpO3ZhciBwPXRoaXMuZ2V0UlNBS2V5RnJvbVBsYWluUEtDUzhIZXgocSk7cmV0dXJuIHB9LGdldFJTQUtleUZyb21QbGFpblBLQ1M4SGV4OmZ1bmN0aW9uKHMpe3ZhciByPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHMsMCk7aWYoci5sZW5ndGghPTMpe3Rocm93XCJvdXRlciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDMgZWxlbWVudHM6IFwiK3IubGVuZ3RofXZhciBxPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocyxyWzFdKTtpZihxIT1cIjMwMGQwNjA5MmE4NjQ4ODZmNzBkMDEwMTAxMDUwMFwiKXt0aHJvd1wiUEtDUzggQWxnb3JpdGhtSWRlbnRpZmllciBpcyBub3QgcnNhRW5jOiBcIitxfXZhciBxPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoocyxyWzFdKTt2YXIgdD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHMsclsyXSk7dmFyIHU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodCwwKTt2YXIgcD1uZXcgUlNBS2V5KCk7cC5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKHUpO3JldHVybiBwfSxwYXJzZUhleE9mRW5jcnlwdGVkUEtDUzg6ZnVuY3Rpb24odyl7dmFyIHM9e307dmFyIHI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodywwKTtpZihyLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDApLml0ZW1zICE9IDI6IFwiK3IubGVuZ3RofXMuY2lwaGVydGV4dD1BU04xSEVYLmdldEhleE9mVl9BdE9iaih3LHJbMV0pO3ZhciB5PUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHcsclswXSk7aWYoeS5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjApLml0ZW1zICE9IDI6IFwiK3kubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcseVswXSkhPVwiMmE4NjQ4ODZmNzBkMDEwNTBkXCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgcGtjczVQQkVTMlwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHcseVsxXSk7aWYoeS5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMSkuaXRlbXMgIT0gMjogXCIrcC5sZW5ndGh9dmFyIHE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodyxwWzFdKTtpZihxLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjEpLml0ZW1zICE9IDI6IFwiK3EubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcscVswXSkhPVwiMmE4NjQ4ODZmNzBkMDMwN1wiKXt0aHJvd1widGhpcyBvbmx5IHN1cHBvcnRzIFRyaXBsZURFU1wifXMuZW5jcnlwdGlvblNjaGVtZUFsZz1cIlRyaXBsZURFU1wiO3MuZW5jcnlwdGlvblNjaGVtZUlWPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcscVsxXSk7dmFyIHQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoodyxwWzBdKTtpZih0Lmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBmb3JtYXQ6IFNFUVVFTkNFKDAuMC4xLjApLml0ZW1zICE9IDI6IFwiK3QubGVuZ3RofWlmKEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcsdFswXSkhPVwiMmE4NjQ4ODZmNzBkMDEwNTBjXCIpe3Rocm93XCJ0aGlzIG9ubHkgc3VwcG9ydHMgcGtjczVQQktERjJcIn12YXIgeD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih3LHRbMV0pO2lmKHgubGVuZ3RoPDIpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0OiBTRVFVRU5DRSgwLjAuMS4wLjEpLml0ZW1zIDwgMjogXCIreC5sZW5ndGh9cy5wYmtkZjJTYWx0PUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHcseFswXSk7dmFyIHU9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodyx4WzFdKTt0cnl7cy5wYmtkZjJJdGVyPXBhcnNlSW50KHUsMTYpfWNhdGNoKHYpe3Rocm93XCJtYWxmb3JtZWQgZm9ybWF0IHBia2RmMkl0ZXI6IFwiK3V9cmV0dXJuIHN9LGdldFBCS0RGMktleUhleEZyb21QYXJhbTpmdW5jdGlvbih1LHApe3ZhciB0PUNyeXB0b0pTLmVuYy5IZXgucGFyc2UodS5wYmtkZjJTYWx0KTt2YXIgcT11LnBia2RmMkl0ZXI7dmFyIHM9Q3J5cHRvSlMuUEJLREYyKHAsdCx7a2V5U2l6ZToxOTIvMzIsaXRlcmF0aW9uczpxfSk7dmFyIHI9Q3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkocyk7cmV0dXJuIHJ9LGdldFBsYWluUEtDUzhIZXhGcm9tRW5jcnlwdGVkUEtDUzhQRU06ZnVuY3Rpb24oeCx5KXt2YXIgcj10aGlzLmdldEhleEZyb21QRU0oeCxcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiKTt2YXIgcD10aGlzLnBhcnNlSGV4T2ZFbmNyeXB0ZWRQS0NTOChyKTt2YXIgdT1LRVlVVElMLmdldFBCS0RGMktleUhleEZyb21QYXJhbShwLHkpO3ZhciB2PXt9O3YuY2lwaGVydGV4dD1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHAuY2lwaGVydGV4dCk7dmFyIHQ9Q3J5cHRvSlMuZW5jLkhleC5wYXJzZSh1KTt2YXIgcz1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKHAuZW5jcnlwdGlvblNjaGVtZUlWKTt2YXIgdz1DcnlwdG9KUy5UcmlwbGVERVMuZGVjcnlwdCh2LHQse2l2OnN9KTt2YXIgcT1DcnlwdG9KUy5lbmMuSGV4LnN0cmluZ2lmeSh3KTtyZXR1cm4gcX0sZ2V0UlNBS2V5RnJvbUVuY3J5cHRlZFBLQ1M4UEVNOmZ1bmN0aW9uKHMscil7dmFyIHE9dGhpcy5nZXRQbGFpblBLQ1M4SGV4RnJvbUVuY3J5cHRlZFBLQ1M4UEVNKHMscik7dmFyIHA9dGhpcy5nZXRSU0FLZXlGcm9tUGxhaW5QS0NTOEhleChxKTtyZXR1cm4gcH0sZ2V0S2V5RnJvbUVuY3J5cHRlZFBLQ1M4UEVNOmZ1bmN0aW9uKHMscSl7dmFyIHA9dGhpcy5nZXRQbGFpblBLQ1M4SGV4RnJvbUVuY3J5cHRlZFBLQ1M4UEVNKHMscSk7dmFyIHI9dGhpcy5nZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXgocCk7cmV0dXJuIHJ9LHBhcnNlUGxhaW5Qcml2YXRlUEtDUzhIZXg6ZnVuY3Rpb24ocyl7dmFyIHE9e307cS5hbGdwYXJhbT1udWxsO2lmKHMuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBwbGFpbiBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwMSlcIn12YXIgcj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihzLDApO2lmKHIubGVuZ3RoIT0zKXt0aHJvd1wibWFsZm9ybWVkIHBsYWluIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDAyKVwifWlmKHMuc3Vic3RyKHJbMV0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwMylcIn12YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihzLHJbMV0pO2lmKHAubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHByaXZhdGUga2V5KGNvZGU6MDA0KVwifWlmKHMuc3Vic3RyKHBbMF0sMikhPVwiMDZcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwNSlcIn1xLmFsZ29pZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihzLHBbMF0pO2lmKHMuc3Vic3RyKHBbMV0sMik9PVwiMDZcIil7cS5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihzLHBbMV0pfWlmKHMuc3Vic3RyKHJbMl0sMikhPVwiMDRcIil7dGhyb3dcIm1hbGZvcm1lZCBQS0NTOCBwcml2YXRlIGtleShjb2RlOjAwNilcIn1xLmtleWlkeD1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKHMsclsyXSk7cmV0dXJuIHF9LGdldEtleUZyb21QbGFpblByaXZhdGVQS0NTOFBFTTpmdW5jdGlvbihxKXt2YXIgcD10aGlzLmdldEhleEZyb21QRU0ocSxcIlBSSVZBVEUgS0VZXCIpO3ZhciByPXRoaXMuZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4SGV4KHApO3JldHVybiByfSxnZXRLZXlGcm9tUGxhaW5Qcml2YXRlUEtDUzhIZXg6ZnVuY3Rpb24ocCl7dmFyIHc9dGhpcy5wYXJzZVBsYWluUHJpdmF0ZVBLQ1M4SGV4KHApO2lmKHcuYWxnb2lkPT1cIjJhODY0ODg2ZjcwZDAxMDEwMVwiKXt0aGlzLnBhcnNlUHJpdmF0ZVJhd1JTQUtleUhleEF0T2JqKHAsdyk7dmFyIHU9dy5rZXk7dmFyIHo9bmV3IFJTQUtleSgpO3ouc2V0UHJpdmF0ZUV4KHUubix1LmUsdS5kLHUucCx1LnEsdS5kcCx1LmRxLHUuY28pO3JldHVybiB6fWVsc2V7aWYody5hbGdvaWQ9PVwiMmE4NjQ4Y2UzZDAyMDFcIil7dGhpcy5wYXJzZVByaXZhdGVSYXdFQ0tleUhleEF0T2JqKHAsdyk7aWYoS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW3cuYWxncGFyYW1dPT09dW5kZWZpbmVkKXt0aHJvd1wiS0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lIHVuZGVmaW5lZDogXCIrdy5hbGdwYXJhbX12YXIgdj1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbdy5hbGdwYXJhbV07dmFyIHo9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTp2fSk7ei5zZXRQdWJsaWNLZXlIZXgody5wdWJrZXkpO3ouc2V0UHJpdmF0ZUtleUhleCh3LmtleSk7ei5pc1B1YmxpYz1mYWxzZTtyZXR1cm4gen1lbHNle2lmKHcuYWxnb2lkPT1cIjJhODY0OGNlMzgwNDAxXCIpe3ZhciB0PUFTTjFIRVguZ2V0VmJ5TGlzdChwLDAsWzEsMSwwXSxcIjAyXCIpO3ZhciBzPUFTTjFIRVguZ2V0VmJ5TGlzdChwLDAsWzEsMSwxXSxcIjAyXCIpO3ZhciB5PUFTTjFIRVguZ2V0VmJ5TGlzdChwLDAsWzEsMSwyXSxcIjAyXCIpO3ZhciBCPUFTTjFIRVguZ2V0VmJ5TGlzdChwLDAsWzIsMF0sXCIwMlwiKTt2YXIgcj1uZXcgQmlnSW50ZWdlcih0LDE2KTt2YXIgcT1uZXcgQmlnSW50ZWdlcihzLDE2KTt2YXIgeD1uZXcgQmlnSW50ZWdlcih5LDE2KTt2YXIgQT1uZXcgQmlnSW50ZWdlcihCLDE2KTt2YXIgej1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7ei5zZXRQcml2YXRlKHIscSx4LG51bGwsQSk7cmV0dXJuIHp9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXkgYWxnb3JpdGhtXCJ9fX19LGdldFJTQUtleUZyb21QdWJsaWNQS0NTOFBFTTpmdW5jdGlvbihxKXt2YXIgcj10aGlzLmdldEhleEZyb21QRU0ocSxcIlBVQkxJQyBLRVlcIik7dmFyIHA9dGhpcy5nZXRSU0FLZXlGcm9tUHVibGljUEtDUzhIZXgocik7cmV0dXJuIHB9LGdldEtleUZyb21QdWJsaWNQS0NTOFBFTTpmdW5jdGlvbihxKXt2YXIgcj10aGlzLmdldEhleEZyb21QRU0ocSxcIlBVQkxJQyBLRVlcIik7dmFyIHA9dGhpcy5nZXRLZXlGcm9tUHVibGljUEtDUzhIZXgocik7cmV0dXJuIHB9LGdldEtleUZyb21QdWJsaWNQS0NTOEhleDpmdW5jdGlvbihxKXt2YXIgcD10aGlzLnBhcnNlUHVibGljUEtDUzhIZXgocSk7aWYocC5hbGdvaWQ9PVwiMmE4NjQ4ODZmNzBkMDEwMTAxXCIpe3ZhciB1PXRoaXMucGFyc2VQdWJsaWNSYXdSU0FLZXlIZXgocC5rZXkpO3ZhciByPW5ldyBSU0FLZXkoKTtyLnNldFB1YmxpYyh1Lm4sdS5lKTtyZXR1cm4gcn1lbHNle2lmKHAuYWxnb2lkPT1cIjJhODY0OGNlM2QwMjAxXCIpe2lmKEtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtwLmFsZ3BhcmFtXT09PXVuZGVmaW5lZCl7dGhyb3dcIktKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZSB1bmRlZmluZWQ6IFwiK3AuYWxncGFyYW19dmFyIHM9S0pVUi5jcnlwdG8uT0lELm9pZGhleDJuYW1lW3AuYWxncGFyYW1dO3ZhciByPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6cyxwdWI6cC5rZXl9KTtyZXR1cm4gcn1lbHNle2lmKHAuYWxnb2lkPT1cIjJhODY0OGNlMzgwNDAxXCIpe3ZhciB0PXAuYWxncGFyYW07dmFyIHY9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocC5rZXksMCk7dmFyIHI9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO3Iuc2V0UHVibGljKG5ldyBCaWdJbnRlZ2VyKHQucCwxNiksbmV3IEJpZ0ludGVnZXIodC5xLDE2KSxuZXcgQmlnSW50ZWdlcih0LmcsMTYpLG5ldyBCaWdJbnRlZ2VyKHYsMTYpKTtyZXR1cm4gcn1lbHNle3Rocm93XCJ1bnN1cHBvcnRlZCBwdWJsaWMga2V5IGFsZ29yaXRobVwifX19fSxwYXJzZVB1YmxpY1Jhd1JTQUtleUhleDpmdW5jdGlvbihyKXt2YXIgcD17fTtpZihyLnN1YnN0cigwLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUlNBIGtleShjb2RlOjAwMSlcIn12YXIgcT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihyLDApO2lmKHEubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDIpXCJ9aWYoci5zdWJzdHIocVswXSwyKSE9XCIwMlwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDMpXCJ9cC5uPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHIscVswXSk7aWYoci5zdWJzdHIocVsxXSwyKSE9XCIwMlwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBrZXkoY29kZTowMDQpXCJ9cC5lPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHIscVsxXSk7cmV0dXJuIHB9LHBhcnNlUHJpdmF0ZVJhd1JTQUtleUhleEF0T2JqOmZ1bmN0aW9uKHEscyl7dmFyIHI9cy5rZXlpZHg7aWYocS5zdWJzdHIociwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFJTQSBwcml2YXRlIGtleShjb2RlOjAwMSlcIn12YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihxLHIpO2lmKHAubGVuZ3RoIT05KXt0aHJvd1wibWFsZm9ybWVkIFJTQSBwcml2YXRlIGtleShjb2RlOjAwMilcIn1zLmtleT17fTtzLmtleS5uPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFsxXSk7cy5rZXkuZT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbMl0pO3Mua2V5LmQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzNdKTtzLmtleS5wPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFs0XSk7cy5rZXkucT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbNV0pO3Mua2V5LmRwPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKHEscFs2XSk7cy5rZXkuZHE9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocSxwWzddKTtzLmtleS5jbz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihxLHBbOF0pfSxwYXJzZVByaXZhdGVSYXdFQ0tleUhleEF0T2JqOmZ1bmN0aW9uKHAsdCl7dmFyIHE9dC5rZXlpZHg7dmFyIHI9QVNOMUhFWC5nZXRWYnlMaXN0KHAscSxbMV0sXCIwNFwiKTt2YXIgcz1BU04xSEVYLmdldFZieUxpc3QocCxxLFsyLDBdLFwiMDNcIikuc3Vic3RyKDIpO3Qua2V5PXI7dC5wdWJrZXk9c30scGFyc2VQdWJsaWNQS0NTOEhleDpmdW5jdGlvbihzKXt2YXIgcT17fTtxLmFsZ3BhcmFtPW51bGw7dmFyIHI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoocywwKTtpZihyLmxlbmd0aCE9Mil7dGhyb3dcIm91dGVyIERFUlNlcXVlbmNlIHNoYWxsIGhhdmUgMiBlbGVtZW50czogXCIrci5sZW5ndGh9dmFyIHQ9clswXTtpZihzLnN1YnN0cih0LDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgUEtDUzggcHVibGljIGtleShjb2RlOjAwMSlcIn12YXIgcD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihzLHQpO2lmKHAubGVuZ3RoIT0yKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDIpXCJ9aWYocy5zdWJzdHIocFswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDMpXCJ9cS5hbGdvaWQ9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocyxwWzBdKTtpZihzLnN1YnN0cihwWzFdLDIpPT1cIjA2XCIpe3EuYWxncGFyYW09QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocyxwWzFdKX1lbHNle2lmKHMuc3Vic3RyKHBbMV0sMik9PVwiMzBcIil7cS5hbGdwYXJhbT17fTtxLmFsZ3BhcmFtLnA9QVNOMUhFWC5nZXRWYnlMaXN0KHMscFsxXSxbMF0sXCIwMlwiKTtxLmFsZ3BhcmFtLnE9QVNOMUhFWC5nZXRWYnlMaXN0KHMscFsxXSxbMV0sXCIwMlwiKTtxLmFsZ3BhcmFtLmc9QVNOMUhFWC5nZXRWYnlMaXN0KHMscFsxXSxbMl0sXCIwMlwiKX19aWYocy5zdWJzdHIoclsxXSwyKSE9XCIwM1wiKXt0aHJvd1wibWFsZm9ybWVkIFBLQ1M4IHB1YmxpYyBrZXkoY29kZTowMDQpXCJ9cS5rZXk9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoocyxyWzFdKS5zdWJzdHIoMik7cmV0dXJuIHF9LGdldFJTQUtleUZyb21QdWJsaWNQS0NTOEhleDpmdW5jdGlvbih0KXt2YXIgcz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaih0LDApO2lmKHMubGVuZ3RoIT0yKXt0aHJvd1wib3V0ZXIgREVSU2VxdWVuY2Ugc2hhbGwgaGF2ZSAyIGVsZW1lbnRzOiBcIitzLmxlbmd0aH12YXIgcj1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKHQsc1swXSk7aWYociE9XCIzMDBkMDYwOTJhODY0ODg2ZjcwZDAxMDEwMTA1MDBcIil7dGhyb3dcIlBLQ1M4IEFsZ29yaXRobUlkIGlzIG5vdCByc2FFbmNyeXB0aW9uXCJ9aWYodC5zdWJzdHIoc1sxXSwyKSE9XCIwM1wiKXt0aHJvd1wiUEtDUzggUHVibGljIEtleSBpcyBub3QgQklUU1RSSU5HIGVuY2Fwc2xhdGVkLlwifXZhciB2PUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmoodCxzWzFdKSsyO2lmKHQuc3Vic3RyKHYsMikhPVwiMzBcIil7dGhyb3dcIlBLQ1M4IFB1YmxpYyBLZXkgaXMgbm90IFNFUVVFTkNFLlwifXZhciBwPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKHQsdik7aWYocC5sZW5ndGghPTIpe3Rocm93XCJpbm5lciBERVJTZXF1ZW5jZSBzaGFsbCBoYXZlIDIgZWxlbWVudHM6IFwiK3AubGVuZ3RofWlmKHQuc3Vic3RyKHBbMF0sMikhPVwiMDJcIil7dGhyb3dcIk4gaXMgbm90IEFTTi4xIElOVEVHRVJcIn1pZih0LnN1YnN0cihwWzFdLDIpIT1cIjAyXCIpe3Rocm93XCJFIGlzIG5vdCBBU04uMSBJTlRFR0VSXCJ9dmFyIHc9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoodCxwWzBdKTt2YXIgdT1BU04xSEVYLmdldEhleE9mVl9BdE9iaih0LHBbMV0pO3ZhciBxPW5ldyBSU0FLZXkoKTtxLnNldFB1YmxpYyh3LHUpO3JldHVybiBxfSx9fSgpO0tFWVVUSUwuZ2V0S2V5PWZ1bmN0aW9uKGYsZSxoKXtpZih0eXBlb2YgUlNBS2V5IT1cInVuZGVmaW5lZFwiJiZmIGluc3RhbmNlb2YgUlNBS2V5KXtyZXR1cm4gZn1pZih0eXBlb2YgS0pVUi5jcnlwdG8uRUNEU0EhPVwidW5kZWZpbmVkXCImJmYgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5FQ0RTQSl7cmV0dXJuIGZ9aWYodHlwZW9mIEtKVVIuY3J5cHRvLkRTQSE9XCJ1bmRlZmluZWRcIiYmZiBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkRTQSl7cmV0dXJuIGZ9aWYoZi5jdXJ2ZSE9PXVuZGVmaW5lZCYmZi54eSE9PXVuZGVmaW5lZCYmZi5kPT09dW5kZWZpbmVkKXtyZXR1cm4gbmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtwdWI6Zi54eSxjdXJ2ZTpmLmN1cnZlfSl9aWYoZi5jdXJ2ZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkKXtyZXR1cm4gbmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtwcnY6Zi5kLGN1cnZlOmYuY3VydmV9KX1pZihmLmt0eT09PXVuZGVmaW5lZCYmZi5uIT09dW5kZWZpbmVkJiZmLmUhPT11bmRlZmluZWQmJmYuZD09PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHVibGljKGYubixmLmUpO3JldHVybiB3fWlmKGYua3R5PT09dW5kZWZpbmVkJiZmLm4hPT11bmRlZmluZWQmJmYuZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkJiZmLnAhPT11bmRlZmluZWQmJmYucSE9PXVuZGVmaW5lZCYmZi5kcCE9PXVuZGVmaW5lZCYmZi5kcSE9PXVuZGVmaW5lZCYmZi5jbyE9PXVuZGVmaW5lZCYmZi5xaT09PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHJpdmF0ZUV4KGYubixmLmUsZi5kLGYucCxmLnEsZi5kcCxmLmRxLGYuY28pO3JldHVybiB3fWlmKGYua3R5PT09dW5kZWZpbmVkJiZmLm4hPT11bmRlZmluZWQmJmYuZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkJiZmLnA9PT11bmRlZmluZWQpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnNldFByaXZhdGUoZi5uLGYuZSxmLmQpO3JldHVybiB3fWlmKGYucCE9PXVuZGVmaW5lZCYmZi5xIT09dW5kZWZpbmVkJiZmLmchPT11bmRlZmluZWQmJmYueSE9PXVuZGVmaW5lZCYmZi54PT09dW5kZWZpbmVkKXt2YXIgdz1uZXcgS0pVUi5jcnlwdG8uRFNBKCk7dy5zZXRQdWJsaWMoZi5wLGYucSxmLmcsZi55KTtyZXR1cm4gd31pZihmLnAhPT11bmRlZmluZWQmJmYucSE9PXVuZGVmaW5lZCYmZi5nIT09dW5kZWZpbmVkJiZmLnkhPT11bmRlZmluZWQmJmYueCE9PXVuZGVmaW5lZCl7dmFyIHc9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO3cuc2V0UHJpdmF0ZShmLnAsZi5xLGYuZyxmLnksZi54KTtyZXR1cm4gd31pZihmLmt0eT09PVwiUlNBXCImJmYubiE9PXVuZGVmaW5lZCYmZi5lIT09dW5kZWZpbmVkJiZmLmQ9PT11bmRlZmluZWQpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnNldFB1YmxpYyhiNjR1dG9oZXgoZi5uKSxiNjR1dG9oZXgoZi5lKSk7cmV0dXJuIHd9aWYoZi5rdHk9PT1cIlJTQVwiJiZmLm4hPT11bmRlZmluZWQmJmYuZSE9PXVuZGVmaW5lZCYmZi5kIT09dW5kZWZpbmVkJiZmLnAhPT11bmRlZmluZWQmJmYucSE9PXVuZGVmaW5lZCYmZi5kcCE9PXVuZGVmaW5lZCYmZi5kcSE9PXVuZGVmaW5lZCYmZi5xaSE9PXVuZGVmaW5lZCl7dmFyIHc9bmV3IFJTQUtleSgpO3cuc2V0UHJpdmF0ZUV4KGI2NHV0b2hleChmLm4pLGI2NHV0b2hleChmLmUpLGI2NHV0b2hleChmLmQpLGI2NHV0b2hleChmLnApLGI2NHV0b2hleChmLnEpLGI2NHV0b2hleChmLmRwKSxiNjR1dG9oZXgoZi5kcSksYjY0dXRvaGV4KGYucWkpKTtyZXR1cm4gd31pZihmLmt0eT09PVwiUlNBXCImJmYubiE9PXVuZGVmaW5lZCYmZi5lIT09dW5kZWZpbmVkJiZmLmQhPT11bmRlZmluZWQpe3ZhciB3PW5ldyBSU0FLZXkoKTt3LnNldFByaXZhdGUoYjY0dXRvaGV4KGYubiksYjY0dXRvaGV4KGYuZSksYjY0dXRvaGV4KGYuZCkpO3JldHVybiB3fWlmKGYua3R5PT09XCJFQ1wiJiZmLmNydiE9PXVuZGVmaW5lZCYmZi54IT09dW5kZWZpbmVkJiZmLnkhPT11bmRlZmluZWQmJmYuZD09PXVuZGVmaW5lZCl7dmFyIGQ9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpmLmNydn0pO3ZhciBsPWQuZWNwYXJhbXMua2V5bGVuLzQ7dmFyIHI9KFwiMDAwMDAwMDAwMFwiK2I2NHV0b2hleChmLngpKS5zbGljZSgtbCk7dmFyIG49KFwiMDAwMDAwMDAwMFwiK2I2NHV0b2hleChmLnkpKS5zbGljZSgtbCk7dmFyIG09XCIwNFwiK3IrbjtkLnNldFB1YmxpY0tleUhleChtKTtyZXR1cm4gZH1pZihmLmt0eT09PVwiRUNcIiYmZi5jcnYhPT11bmRlZmluZWQmJmYueCE9PXVuZGVmaW5lZCYmZi55IT09dW5kZWZpbmVkJiZmLmQhPT11bmRlZmluZWQpe3ZhciBkPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6Zi5jcnZ9KTt2YXIgbD1kLmVjcGFyYW1zLmtleWxlbi80O3ZhciBhPShcIjAwMDAwMDAwMDBcIitiNjR1dG9oZXgoZi5kKSkuc2xpY2UoLWwpO2Quc2V0UHJpdmF0ZUtleUhleChhKTtyZXR1cm4gZH1pZihmLmluZGV4T2YoXCItRU5EIENFUlRJRklDQVRFLVwiLDApIT0tMXx8Zi5pbmRleE9mKFwiLUVORCBYNTA5IENFUlRJRklDQVRFLVwiLDApIT0tMXx8Zi5pbmRleE9mKFwiLUVORCBUUlVTVEVEIENFUlRJRklDQVRFLVwiLDApIT0tMSl7cmV0dXJuIFg1MDkuZ2V0UHVibGljS2V5RnJvbUNlcnRQRU0oZil9aWYoaD09PVwicGtjczhwdWJcIil7cmV0dXJuIEtFWVVUSUwuZ2V0S2V5RnJvbVB1YmxpY1BLQ1M4SGV4KGYpfWlmKGYuaW5kZXhPZihcIi1FTkQgUFVCTElDIEtFWS1cIikhPS0xKXtyZXR1cm4gS0VZVVRJTC5nZXRLZXlGcm9tUHVibGljUEtDUzhQRU0oZil9aWYoaD09PVwicGtjczVwcnZcIil7dmFyIHc9bmV3IFJTQUtleSgpO3cucmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZyhmKTtyZXR1cm4gd31pZihoPT09XCJwa2NzNXBydlwiKXt2YXIgdz1uZXcgUlNBS2V5KCk7dy5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nKGYpO3JldHVybiB3fWlmKGYuaW5kZXhPZihcIi1FTkQgUlNBIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmYuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpPT0tMSl7dmFyIGk9S0VZVVRJTC5nZXRIZXhGcm9tUEVNKGYsXCJSU0EgUFJJVkFURSBLRVlcIik7cmV0dXJuIEtFWVVUSUwuZ2V0S2V5KGksbnVsbCxcInBrY3M1cHJ2XCIpfWlmKGYuaW5kZXhPZihcIi1FTkQgRFNBIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmYuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpPT0tMSl7dmFyIHU9dGhpcy5nZXRIZXhGcm9tUEVNKGYsXCJEU0EgUFJJVkFURSBLRVlcIik7dmFyIHQ9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMV0sXCIwMlwiKTt2YXIgcz1BU04xSEVYLmdldFZieUxpc3QodSwwLFsyXSxcIjAyXCIpO3ZhciB2PUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzNdLFwiMDJcIik7dmFyIGo9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbNF0sXCIwMlwiKTt2YXIgaz1BU04xSEVYLmdldFZieUxpc3QodSwwLFs1XSxcIjAyXCIpO3ZhciB3PW5ldyBLSlVSLmNyeXB0by5EU0EoKTt3LnNldFByaXZhdGUobmV3IEJpZ0ludGVnZXIodCwxNiksbmV3IEJpZ0ludGVnZXIocywxNiksbmV3IEJpZ0ludGVnZXIodiwxNiksbmV3IEJpZ0ludGVnZXIoaiwxNiksbmV3IEJpZ0ludGVnZXIoaywxNikpO3JldHVybiB3fWlmKGYuaW5kZXhPZihcIi1FTkQgUFJJVkFURSBLRVktXCIpIT0tMSl7cmV0dXJuIEtFWVVUSUwuZ2V0S2V5RnJvbVBsYWluUHJpdmF0ZVBLQ1M4UEVNKGYpfWlmKGYuaW5kZXhPZihcIi1FTkQgUlNBIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmYuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpIT0tMSl7cmV0dXJuIEtFWVVUSUwuZ2V0UlNBS2V5RnJvbUVuY3J5cHRlZFBLQ1M1UEVNKGYsZSl9aWYoZi5pbmRleE9mKFwiLUVORCBFQyBQUklWQVRFIEtFWS1cIikhPS0xJiZmLmluZGV4T2YoXCI0LEVOQ1JZUFRFRFwiKSE9LTEpe3ZhciB1PUtFWVVUSUwuZ2V0RGVjcnlwdGVkS2V5SGV4KGYsZSk7dmFyIHc9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMV0sXCIwNFwiKTt2YXIgYz1BU04xSEVYLmdldFZieUxpc3QodSwwLFsyLDBdLFwiMDZcIik7dmFyIG89QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbMywwXSxcIjAzXCIpLnN1YnN0cigyKTt2YXIgYj1cIlwiO2lmKEtKVVIuY3J5cHRvLk9JRC5vaWRoZXgybmFtZVtjXSE9PXVuZGVmaW5lZCl7Yj1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbY119ZWxzZXt0aHJvd1widW5kZWZpbmVkIE9JRChoZXgpIGluIEtKVVIuY3J5cHRvLk9JRDogXCIrY312YXIgZD1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe25hbWU6Yn0pO2Quc2V0UHVibGljS2V5SGV4KG8pO2Quc2V0UHJpdmF0ZUtleUhleCh3KTtkLmlzUHVibGljPWZhbHNlO3JldHVybiBkfWlmKGYuaW5kZXhPZihcIi1FTkQgRFNBIFBSSVZBVEUgS0VZLVwiKSE9LTEmJmYuaW5kZXhPZihcIjQsRU5DUllQVEVEXCIpIT0tMSl7dmFyIHU9S0VZVVRJTC5nZXREZWNyeXB0ZWRLZXlIZXgoZixlKTt2YXIgdD1BU04xSEVYLmdldFZieUxpc3QodSwwLFsxXSxcIjAyXCIpO3ZhciBzPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzJdLFwiMDJcIik7dmFyIHY9QVNOMUhFWC5nZXRWYnlMaXN0KHUsMCxbM10sXCIwMlwiKTt2YXIgaj1BU04xSEVYLmdldFZieUxpc3QodSwwLFs0XSxcIjAyXCIpO3ZhciBrPUFTTjFIRVguZ2V0VmJ5TGlzdCh1LDAsWzVdLFwiMDJcIik7dmFyIHc9bmV3IEtKVVIuY3J5cHRvLkRTQSgpO3cuc2V0UHJpdmF0ZShuZXcgQmlnSW50ZWdlcih0LDE2KSxuZXcgQmlnSW50ZWdlcihzLDE2KSxuZXcgQmlnSW50ZWdlcih2LDE2KSxuZXcgQmlnSW50ZWdlcihqLDE2KSxuZXcgQmlnSW50ZWdlcihrLDE2KSk7cmV0dXJuIHd9aWYoZi5pbmRleE9mKFwiLUVORCBFTkNSWVBURUQgUFJJVkFURSBLRVktXCIpIT0tMSl7cmV0dXJuIEtFWVVUSUwuZ2V0S2V5RnJvbUVuY3J5cHRlZFBLQ1M4UEVNKGYsZSl9dGhyb3dcIm5vdCBzdXBwb3J0ZWQgYXJndW1lbnRcIn07S0VZVVRJTC5nZW5lcmF0ZUtleXBhaXI9ZnVuY3Rpb24oYSxjKXtpZihhPT1cIlJTQVwiKXt2YXIgYj1jO3ZhciBoPW5ldyBSU0FLZXkoKTtoLmdlbmVyYXRlKGIsXCIxMDAwMVwiKTtoLmlzUHJpdmF0ZT10cnVlO2guaXNQdWJsaWM9dHJ1ZTt2YXIgZj1uZXcgUlNBS2V5KCk7dmFyIGU9aC5uLnRvU3RyaW5nKDE2KTt2YXIgaT1oLmUudG9TdHJpbmcoMTYpO2Yuc2V0UHVibGljKGUsaSk7Zi5pc1ByaXZhdGU9ZmFsc2U7Zi5pc1B1YmxpYz10cnVlO3ZhciBrPXt9O2sucHJ2S2V5T2JqPWg7ay5wdWJLZXlPYmo9ZjtyZXR1cm4ga31lbHNle2lmKGE9PVwiRUNcIil7dmFyIGQ9Yzt2YXIgZz1uZXcgS0pVUi5jcnlwdG8uRUNEU0Eoe2N1cnZlOmR9KTt2YXIgaj1nLmdlbmVyYXRlS2V5UGFpckhleCgpO3ZhciBoPW5ldyBLSlVSLmNyeXB0by5FQ0RTQSh7Y3VydmU6ZH0pO2guc2V0UHJpdmF0ZUtleUhleChqLmVjcHJ2aGV4KTtoLmlzUHJpdmF0ZT10cnVlO2guaXNQdWJsaWM9ZmFsc2U7dmFyIGY9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTpkfSk7Zi5zZXRQdWJsaWNLZXlIZXgoai5lY3B1YmhleCk7Zi5pc1ByaXZhdGU9ZmFsc2U7Zi5pc1B1YmxpYz10cnVlO3ZhciBrPXt9O2sucHJ2S2V5T2JqPWg7ay5wdWJLZXlPYmo9ZjtyZXR1cm4ga31lbHNle3Rocm93XCJ1bmtub3duIGFsZ29yaXRobTogXCIrYX19fTtLRVlVVElMLmdldFBFTT1mdW5jdGlvbihhLHIsbyxnLGope3ZhciB2PUtKVVIuYXNuMTt2YXIgdT1LSlVSLmNyeXB0bztmdW5jdGlvbiBwKHMpe3ZhciB3PUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MH0se1wiaW50XCI6e2JpZ2ludDpzLm59fSx7XCJpbnRcIjpzLmV9LHtcImludFwiOntiaWdpbnQ6cy5kfX0se1wiaW50XCI6e2JpZ2ludDpzLnB9fSx7XCJpbnRcIjp7YmlnaW50OnMucX19LHtcImludFwiOntiaWdpbnQ6cy5kbXAxfX0se1wiaW50XCI6e2JpZ2ludDpzLmRtcTF9fSx7XCJpbnRcIjp7YmlnaW50OnMuY29lZmZ9fV19KTtyZXR1cm4gd31mdW5jdGlvbiBxKHcpe3ZhciBzPUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MX0se29jdHN0cjp7aGV4OncucHJ2S2V5SGV4fX0se3RhZzpbXCJhMFwiLHRydWUse29pZDp7bmFtZTp3LmN1cnZlTmFtZX19XX0se3RhZzpbXCJhMVwiLHRydWUse2JpdHN0cjp7aGV4OlwiMDBcIit3LnB1YktleUhleH19XX1dfSk7cmV0dXJuIHN9ZnVuY3Rpb24gbihzKXt2YXIgdz1LSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOjB9LHtcImludFwiOntiaWdpbnQ6cy5wfX0se1wiaW50XCI6e2JpZ2ludDpzLnF9fSx7XCJpbnRcIjp7YmlnaW50OnMuZ319LHtcImludFwiOntiaWdpbnQ6cy55fX0se1wiaW50XCI6e2JpZ2ludDpzLnh9fV19KTtyZXR1cm4gd31pZigoKHR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBSU0FLZXkpfHwodHlwZW9mIHUuRFNBIT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgdS5EU0EpfHwodHlwZW9mIHUuRUNEU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiB1LkVDRFNBKSkmJmEuaXNQdWJsaWM9PXRydWUmJihyPT09dW5kZWZpbmVkfHxyPT1cIlBLQ1M4UFVCXCIpKXt2YXIgdD1uZXcgS0pVUi5hc24xLng1MDkuU3ViamVjdFB1YmxpY0tleUluZm8oYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiUFVCTElDIEtFWVwiKX1pZihyPT1cIlBLQ1MxUFJWXCImJnR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBSU0FLZXkmJihvPT09dW5kZWZpbmVkfHxvPT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciB0PXAoYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiUlNBIFBSSVZBVEUgS0VZXCIpfWlmKHI9PVwiUEtDUzFQUlZcIiYmdHlwZW9mIFJTQUtleSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBJiYobz09PXVuZGVmaW5lZHx8bz09bnVsbCkmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgZj1uZXcgS0pVUi5hc24xLkRFUk9iamVjdElkZW50aWZpZXIoe25hbWU6YS5jdXJ2ZU5hbWV9KTt2YXIgbD1mLmdldEVuY29kZWRIZXgoKTt2YXIgZT1xKGEpO3ZhciBrPWUuZ2V0RW5jb2RlZEhleCgpO3ZhciBpPVwiXCI7aSs9di5BU04xVXRpbC5nZXRQRU1TdHJpbmdGcm9tSGV4KGwsXCJFQyBQQVJBTUVURVJTXCIpO2krPXYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChrLFwiRUMgUFJJVkFURSBLRVlcIik7cmV0dXJuIGl9aWYocj09XCJQS0NTMVBSVlwiJiZ0eXBlb2YgS0pVUi5jcnlwdG8uRFNBIT1cInVuZGVmaW5lZFwiJiZhIGluc3RhbmNlb2YgS0pVUi5jcnlwdG8uRFNBJiYobz09PXVuZGVmaW5lZHx8bz09bnVsbCkmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgdD1uKGEpO3ZhciBtPXQuZ2V0RW5jb2RlZEhleCgpO3JldHVybiB2LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgobSxcIkRTQSBQUklWQVRFIEtFWVwiKX1pZihyPT1cIlBLQ1M1UFJWXCImJnR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBSU0FLZXkmJihvIT09dW5kZWZpbmVkJiZvIT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciB0PXAoYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYoZz09PXVuZGVmaW5lZCl7Zz1cIkRFUy1FREUzLUNCQ1wifXJldHVybiB0aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleChcIlJTQVwiLG0sbyxnKX1pZihyPT1cIlBLQ1M1UFJWXCImJnR5cGVvZiBLSlVSLmNyeXB0by5FQ0RTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBJiYobyE9PXVuZGVmaW5lZCYmbyE9bnVsbCkmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgdD1xKGEpO3ZhciBtPXQuZ2V0RW5jb2RlZEhleCgpO2lmKGc9PT11bmRlZmluZWQpe2c9XCJERVMtRURFMy1DQkNcIn1yZXR1cm4gdGhpcy5nZXRFbmNyeXB0ZWRQS0NTNVBFTUZyb21QcnZLZXlIZXgoXCJFQ1wiLG0sbyxnKX1pZihyPT1cIlBLQ1M1UFJWXCImJnR5cGVvZiBLSlVSLmNyeXB0by5EU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0EmJihvIT09dW5kZWZpbmVkJiZvIT1udWxsKSYmYS5pc1ByaXZhdGU9PXRydWUpe3ZhciB0PW4oYSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYoZz09PXVuZGVmaW5lZCl7Zz1cIkRFUy1FREUzLUNCQ1wifXJldHVybiB0aGlzLmdldEVuY3J5cHRlZFBLQ1M1UEVNRnJvbVBydktleUhleChcIkRTQVwiLG0sbyxnKX12YXIgaD1mdW5jdGlvbih3LHMpe3ZhciB5PWIodyxzKTt2YXIgeD1uZXcgS0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7c2VxOlt7b2lkOntuYW1lOlwicGtjczVQQkVTMlwifX0se3NlcTpbe3NlcTpbe29pZDp7bmFtZTpcInBrY3M1UEJLREYyXCJ9fSx7c2VxOlt7b2N0c3RyOntoZXg6eS5wYmtkZjJTYWx0fX0se1wiaW50XCI6eS5wYmtkZjJJdGVyfV19XX0se3NlcTpbe29pZDp7bmFtZTpcImRlcy1FREUzLUNCQ1wifX0se29jdHN0cjp7aGV4OnkuZW5jcnlwdGlvblNjaGVtZUlWfX1dfV19XX0se29jdHN0cjp7aGV4OnkuY2lwaGVydGV4dH19XX0pO3JldHVybiB4LmdldEVuY29kZWRIZXgoKX07dmFyIGI9ZnVuY3Rpb24oRCxFKXt2YXIgeD0xMDA7dmFyIEM9Q3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20oOCk7dmFyIEI9XCJERVMtRURFMy1DQkNcIjt2YXIgcz1DcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbSg4KTt2YXIgeT1DcnlwdG9KUy5QQktERjIoRSxDLHtrZXlTaXplOjE5Mi8zMixpdGVyYXRpb25zOnh9KTt2YXIgej1DcnlwdG9KUy5lbmMuSGV4LnBhcnNlKEQpO3ZhciBBPUNyeXB0b0pTLlRyaXBsZURFUy5lbmNyeXB0KHoseSx7aXY6c30pK1wiXCI7dmFyIHc9e307dy5jaXBoZXJ0ZXh0PUE7dy5wYmtkZjJTYWx0PUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KEMpO3cucGJrZGYySXRlcj14O3cuZW5jcnlwdGlvblNjaGVtZUFsZz1CO3cuZW5jcnlwdGlvblNjaGVtZUlWPUNyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHMpO3JldHVybiB3fTtpZihyPT1cIlBLQ1M4UFJWXCImJnR5cGVvZiBSU0FLZXkhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBSU0FLZXkmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgZD1wKGEpO3ZhciBjPWQuZ2V0RW5jb2RlZEhleCgpO3ZhciB0PUtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MH0se3NlcTpbe29pZDp7bmFtZTpcInJzYUVuY3J5cHRpb25cIn19LHtcIm51bGxcIjp0cnVlfV19LHtvY3RzdHI6e2hleDpjfX1dfSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYobz09PXVuZGVmaW5lZHx8bz09bnVsbCl7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiUFJJVkFURSBLRVlcIil9ZWxzZXt2YXIgaz1oKG0sbyk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChrLFwiRU5DUllQVEVEIFBSSVZBVEUgS0VZXCIpfX1pZihyPT1cIlBLQ1M4UFJWXCImJnR5cGVvZiBLSlVSLmNyeXB0by5FQ0RTQSE9XCJ1bmRlZmluZWRcIiYmYSBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBJiZhLmlzUHJpdmF0ZT09dHJ1ZSl7dmFyIGQ9bmV3IEtKVVIuYXNuMS5BU04xVXRpbC5uZXdPYmplY3Qoe3NlcTpbe1wiaW50XCI6MX0se29jdHN0cjp7aGV4OmEucHJ2S2V5SGV4fX0se3RhZzpbXCJhMVwiLHRydWUse2JpdHN0cjp7aGV4OlwiMDBcIithLnB1YktleUhleH19XX1dfSk7dmFyIGM9ZC5nZXRFbmNvZGVkSGV4KCk7dmFyIHQ9S0pVUi5hc24xLkFTTjFVdGlsLm5ld09iamVjdCh7c2VxOlt7XCJpbnRcIjowfSx7c2VxOlt7b2lkOntuYW1lOlwiZWNQdWJsaWNLZXlcIn19LHtvaWQ6e25hbWU6YS5jdXJ2ZU5hbWV9fV19LHtvY3RzdHI6e2hleDpjfX1dfSk7dmFyIG09dC5nZXRFbmNvZGVkSGV4KCk7aWYobz09PXVuZGVmaW5lZHx8bz09bnVsbCl7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChtLFwiUFJJVkFURSBLRVlcIil9ZWxzZXt2YXIgaz1oKG0sbyk7cmV0dXJuIHYuQVNOMVV0aWwuZ2V0UEVNU3RyaW5nRnJvbUhleChrLFwiRU5DUllQVEVEIFBSSVZBVEUgS0VZXCIpfX1pZihyPT1cIlBLQ1M4UFJWXCImJnR5cGVvZiBLSlVSLmNyeXB0by5EU0EhPVwidW5kZWZpbmVkXCImJmEgaW5zdGFuY2VvZiBLSlVSLmNyeXB0by5EU0EmJmEuaXNQcml2YXRlPT10cnVlKXt2YXIgZD1uZXcgS0pVUi5hc24xLkRFUkludGVnZXIoe2JpZ2ludDphLnh9KTt2YXIgYz1kLmdldEVuY29kZWRIZXgoKTt2YXIgdD1LSlVSLmFzbjEuQVNOMVV0aWwubmV3T2JqZWN0KHtzZXE6W3tcImludFwiOjB9LHtzZXE6W3tvaWQ6e25hbWU6XCJkc2FcIn19LHtzZXE6W3tcImludFwiOntiaWdpbnQ6YS5wfX0se1wiaW50XCI6e2JpZ2ludDphLnF9fSx7XCJpbnRcIjp7YmlnaW50OmEuZ319XX1dfSx7b2N0c3RyOntoZXg6Y319XX0pO3ZhciBtPXQuZ2V0RW5jb2RlZEhleCgpO2lmKG89PT11bmRlZmluZWR8fG89PW51bGwpe3JldHVybiB2LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgobSxcIlBSSVZBVEUgS0VZXCIpfWVsc2V7dmFyIGs9aChtLG8pO3JldHVybiB2LkFTTjFVdGlsLmdldFBFTVN0cmluZ0Zyb21IZXgoayxcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiKX19dGhyb3dcInVuc3VwcG9ydGVkIG9iamVjdCBub3IgZm9ybWF0XCJ9O0tFWVVUSUwuZ2V0S2V5RnJvbUNTUlBFTT1mdW5jdGlvbihiKXt2YXIgYT1LRVlVVElMLmdldEhleEZyb21QRU0oYixcIkNFUlRJRklDQVRFIFJFUVVFU1RcIik7dmFyIGM9S0VZVVRJTC5nZXRLZXlGcm9tQ1NSSGV4KGEpO3JldHVybiBjfTtLRVlVVElMLmdldEtleUZyb21DU1JIZXg9ZnVuY3Rpb24oYSl7dmFyIGM9S0VZVVRJTC5wYXJzZUNTUkhleChhKTt2YXIgYj1LRVlVVElMLmdldEtleShjLnA4cHVia2V5aGV4LG51bGwsXCJwa2NzOHB1YlwiKTtyZXR1cm4gYn07S0VZVVRJTC5wYXJzZUNTUkhleD1mdW5jdGlvbihjKXt2YXIgYj17fTt2YXIgZT1jO2lmKGUuc3Vic3RyKDAsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBDU1IoY29kZTowMDEpXCJ9dmFyIGQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZSwwKTtpZihkLmxlbmd0aDwxKXt0aHJvd1wibWFsZm9ybWVkIENTUihjb2RlOjAwMilcIn1pZihlLnN1YnN0cihkWzBdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgQ1NSKGNvZGU6MDAzKVwifXZhciBhPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGUsZFswXSk7aWYoYS5sZW5ndGg8Myl7dGhyb3dcIm1hbGZvcm1lZCBDU1IoY29kZTowMDQpXCJ9Yi5wOHB1YmtleWhleD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGUsYVsyXSk7cmV0dXJuIGJ9O1xuLyohIHJzYXBlbS0xLjEuanMgKGMpIDIwMTIgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gX3JzYXBlbV9wZW1Ub0Jhc2U2NChiKXt2YXIgYT1iO2E9YS5yZXBsYWNlKFwiLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLVwiLFwiXCIpO2E9YS5yZXBsYWNlKFwiLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS1cIixcIlwiKTthPWEucmVwbGFjZSgvWyBcXG5dKy9nLFwiXCIpO3JldHVybiBhfWZ1bmN0aW9uIF9yc2FwZW1fZ2V0UG9zQXJyYXlPZkNoaWxkcmVuRnJvbUhleChkKXt2YXIgaj1uZXcgQXJyYXkoKTt2YXIgaz1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKGQsMCk7dmFyIGY9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsayk7dmFyIGg9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsZik7dmFyIGI9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsaCk7dmFyIGw9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsYik7dmFyIGU9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsbCk7dmFyIGc9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsZSk7dmFyIGM9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsZyk7dmFyIGk9QVNOMUhFWC5nZXRQb3NPZk5leHRTaWJsaW5nX0F0T2JqKGQsYyk7ai5wdXNoKGssZixoLGIsbCxlLGcsYyxpKTtyZXR1cm4gan1mdW5jdGlvbiBfcnNhcGVtX2dldEhleFZhbHVlQXJyYXlPZkNoaWxkcmVuRnJvbUhleChpKXt2YXIgbz1fcnNhcGVtX2dldFBvc0FycmF5T2ZDaGlsZHJlbkZyb21IZXgoaSk7dmFyIHI9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzBdKTt2YXIgZj1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bMV0pO3ZhciBqPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1syXSk7dmFyIGs9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzNdKTt2YXIgYz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bNF0pO3ZhciBiPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1s1XSk7dmFyIGg9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooaSxvWzZdKTt2YXIgZz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihpLG9bN10pO3ZhciBsPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGksb1s4XSk7dmFyIG09bmV3IEFycmF5KCk7bS5wdXNoKHIsZixqLGssYyxiLGgsZyxsKTtyZXR1cm4gbX1mdW5jdGlvbiBfcnNhcGVtX3JlYWRQcml2YXRlS2V5RnJvbUFTTjFIZXhTdHJpbmcoYyl7dmFyIGI9X3JzYXBlbV9nZXRIZXhWYWx1ZUFycmF5T2ZDaGlsZHJlbkZyb21IZXgoYyk7dGhpcy5zZXRQcml2YXRlRXgoYlsxXSxiWzJdLGJbM10sYls0XSxiWzVdLGJbNl0sYls3XSxiWzhdKX1mdW5jdGlvbiBfcnNhcGVtX3JlYWRQcml2YXRlS2V5RnJvbVBFTVN0cmluZyhlKXt2YXIgYz1fcnNhcGVtX3BlbVRvQmFzZTY0KGUpO3ZhciBkPWI2NHRvaGV4KGMpO3ZhciBiPV9yc2FwZW1fZ2V0SGV4VmFsdWVBcnJheU9mQ2hpbGRyZW5Gcm9tSGV4KGQpO3RoaXMuc2V0UHJpdmF0ZUV4KGJbMV0sYlsyXSxiWzNdLGJbNF0sYls1XSxiWzZdLGJbN10sYls4XSl9UlNBS2V5LnByb3RvdHlwZS5yZWFkUHJpdmF0ZUtleUZyb21QRU1TdHJpbmc9X3JzYXBlbV9yZWFkUHJpdmF0ZUtleUZyb21QRU1TdHJpbmc7UlNBS2V5LnByb3RvdHlwZS5yZWFkUHJpdmF0ZUtleUZyb21BU04xSGV4U3RyaW5nPV9yc2FwZW1fcmVhZFByaXZhdGVLZXlGcm9tQVNOMUhleFN0cmluZztcbi8qISByc2FzaWduLTEuMi43LmpzIChjKSAyMDEyIEtlbmppIFVydXNoaW1hIHwga2p1ci5naXRodWIuY29tL2pzcnNhc2lnbi9saWNlbnNlXG4gKi9cbnZhciBfUkVfSEVYREVDT05MWT1uZXcgUmVnRXhwKFwiXCIpO19SRV9IRVhERUNPTkxZLmNvbXBpbGUoXCJbXjAtOWEtZl1cIixcImdpXCIpO2Z1bmN0aW9uIF9yc2FzaWduX2dldEhleFBhZGRlZERpZ2VzdEluZm9Gb3JTdHJpbmcoZCxlLGEpe3ZhciBiPWZ1bmN0aW9uKGYpe3JldHVybiBLSlVSLmNyeXB0by5VdGlsLmhhc2hTdHJpbmcoZixhKX07dmFyIGM9YihkKTtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5nZXRQYWRkZWREaWdlc3RJbmZvSGV4KGMsYSxlKX1mdW5jdGlvbiBfemVyb1BhZGRpbmdPZlNpZ25hdHVyZShlLGQpe3ZhciBjPVwiXCI7dmFyIGE9ZC80LWUubGVuZ3RoO2Zvcih2YXIgYj0wO2I8YTtiKyspe2M9YytcIjBcIn1yZXR1cm4gYytlfWZ1bmN0aW9uIF9yc2FzaWduX3NpZ25TdHJpbmcoZCxhKXt2YXIgYj1mdW5jdGlvbihlKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoU3RyaW5nKGUsYSl9O3ZhciBjPWIoZCk7cmV0dXJuIHRoaXMuc2lnbldpdGhNZXNzYWdlSGFzaChjLGEpfWZ1bmN0aW9uIF9yc2FzaWduX3NpZ25XaXRoTWVzc2FnZUhhc2goZSxjKXt2YXIgZj1LSlVSLmNyeXB0by5VdGlsLmdldFBhZGRlZERpZ2VzdEluZm9IZXgoZSxjLHRoaXMubi5iaXRMZW5ndGgoKSk7dmFyIGI9cGFyc2VCaWdJbnQoZiwxNik7dmFyIGQ9dGhpcy5kb1ByaXZhdGUoYik7dmFyIGE9ZC50b1N0cmluZygxNik7cmV0dXJuIF96ZXJvUGFkZGluZ09mU2lnbmF0dXJlKGEsdGhpcy5uLmJpdExlbmd0aCgpKX1mdW5jdGlvbiBfcnNhc2lnbl9zaWduU3RyaW5nV2l0aFNIQTEoYSl7cmV0dXJuIF9yc2FzaWduX3NpZ25TdHJpbmcuY2FsbCh0aGlzLGEsXCJzaGExXCIpfWZ1bmN0aW9uIF9yc2FzaWduX3NpZ25TdHJpbmdXaXRoU0hBMjU2KGEpe3JldHVybiBfcnNhc2lnbl9zaWduU3RyaW5nLmNhbGwodGhpcyxhLFwic2hhMjU2XCIpfWZ1bmN0aW9uIHBzc19tZ2YxX3N0cihjLGEsZSl7dmFyIGI9XCJcIixkPTA7d2hpbGUoYi5sZW5ndGg8YSl7Yis9aGV4dG9yc3RyKGUocnN0cnRvaGV4KGMrU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsWyhkJjQyNzgxOTAwODApPj4yNCwoZCYxNjcxMTY4MCk+PjE2LChkJjY1MjgwKT4+OCxkJjI1NV0pKSkpO2QrPTF9cmV0dXJuIGJ9ZnVuY3Rpb24gX3JzYXNpZ25fc2lnblN0cmluZ1BTUyhlLGEsZCl7dmFyIGM9ZnVuY3Rpb24oZil7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChmLGEpfTt2YXIgYj1jKHJzdHJ0b2hleChlKSk7aWYoZD09PXVuZGVmaW5lZCl7ZD0tMX1yZXR1cm4gdGhpcy5zaWduV2l0aE1lc3NhZ2VIYXNoUFNTKGIsYSxkKX1mdW5jdGlvbiBfcnNhc2lnbl9zaWduV2l0aE1lc3NhZ2VIYXNoUFNTKGwsYSxrKXt2YXIgYj1oZXh0b3JzdHIobCk7dmFyIGc9Yi5sZW5ndGg7dmFyIG09dGhpcy5uLmJpdExlbmd0aCgpLTE7dmFyIGM9TWF0aC5jZWlsKG0vOCk7dmFyIGQ7dmFyIG89ZnVuY3Rpb24oaSl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaEhleChpLGEpfTtpZihrPT09LTF8fGs9PT11bmRlZmluZWQpe2s9Z31lbHNle2lmKGs9PT0tMil7az1jLWctMn1lbHNle2lmKGs8LTIpe3Rocm93XCJpbnZhbGlkIHNhbHQgbGVuZ3RoXCJ9fX1pZihjPChnK2srMikpe3Rocm93XCJkYXRhIHRvbyBsb25nXCJ9dmFyIGY9XCJcIjtpZihrPjApe2Y9bmV3IEFycmF5KGspO25ldyBTZWN1cmVSYW5kb20oKS5uZXh0Qnl0ZXMoZik7Zj1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxmKX12YXIgbj1oZXh0b3JzdHIobyhyc3RydG9oZXgoXCJcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXCIrYitmKSkpO3ZhciBqPVtdO2ZvcihkPTA7ZDxjLWstZy0yO2QrPTEpe2pbZF09MH12YXIgZT1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxqKStcIlxceDAxXCIrZjt2YXIgaD1wc3NfbWdmMV9zdHIobixlLmxlbmd0aCxvKTt2YXIgcT1bXTtmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCs9MSl7cVtkXT1lLmNoYXJDb2RlQXQoZCleaC5jaGFyQ29kZUF0KGQpfXZhciBwPSg2NTI4MD4+KDgqYy1tKSkmMjU1O3FbMF0mPX5wO2ZvcihkPTA7ZDxnO2QrKyl7cS5wdXNoKG4uY2hhckNvZGVBdChkKSl9cS5wdXNoKDE4OCk7cmV0dXJuIF96ZXJvUGFkZGluZ09mU2lnbmF0dXJlKHRoaXMuZG9Qcml2YXRlKG5ldyBCaWdJbnRlZ2VyKHEpKS50b1N0cmluZygxNiksdGhpcy5uLmJpdExlbmd0aCgpKX1mdW5jdGlvbiBfcnNhc2lnbl9nZXREZWNyeXB0U2lnbmF0dXJlQkkoYSxkLGMpe3ZhciBiPW5ldyBSU0FLZXkoKTtiLnNldFB1YmxpYyhkLGMpO3ZhciBlPWIuZG9QdWJsaWMoYSk7cmV0dXJuIGV9ZnVuY3Rpb24gX3JzYXNpZ25fZ2V0SGV4RGlnZXN0SW5mb0Zyb21TaWcoYSxjLGIpe3ZhciBlPV9yc2FzaWduX2dldERlY3J5cHRTaWduYXR1cmVCSShhLGMsYik7dmFyIGQ9ZS50b1N0cmluZygxNikucmVwbGFjZSgvXjFmKzAwLyxcIlwiKTtyZXR1cm4gZH1mdW5jdGlvbiBfcnNhc2lnbl9nZXRBbGdOYW1lQW5kSGFzaEZyb21IZXhEaXNnZXN0SW5mbyhmKXtmb3IodmFyIGUgaW4gS0pVUi5jcnlwdG8uVXRpbC5ESUdFU1RJTkZPSEVBRCl7dmFyIGQ9S0pVUi5jcnlwdG8uVXRpbC5ESUdFU1RJTkZPSEVBRFtlXTt2YXIgYj1kLmxlbmd0aDtpZihmLnN1YnN0cmluZygwLGIpPT1kKXt2YXIgYz1bZSxmLnN1YnN0cmluZyhiKV07cmV0dXJuIGN9fXJldHVybltdfWZ1bmN0aW9uIF9yc2FzaWduX3ZlcmlmeVNpZ25hdHVyZVdpdGhBcmdzKGYsYixnLGope3ZhciBlPV9yc2FzaWduX2dldEhleERpZ2VzdEluZm9Gcm9tU2lnKGIsZyxqKTt2YXIgaD1fcnNhc2lnbl9nZXRBbGdOYW1lQW5kSGFzaEZyb21IZXhEaXNnZXN0SW5mbyhlKTtpZihoLmxlbmd0aD09MCl7cmV0dXJuIGZhbHNlfXZhciBkPWhbMF07dmFyIGk9aFsxXTt2YXIgYT1mdW5jdGlvbihrKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoU3RyaW5nKGssZCl9O3ZhciBjPWEoZik7cmV0dXJuKGk9PWMpfWZ1bmN0aW9uIF9yc2FzaWduX3ZlcmlmeUhleFNpZ25hdHVyZUZvck1lc3NhZ2UoYyxiKXt2YXIgZD1wYXJzZUJpZ0ludChjLDE2KTt2YXIgYT1fcnNhc2lnbl92ZXJpZnlTaWduYXR1cmVXaXRoQXJncyhiLGQsdGhpcy5uLnRvU3RyaW5nKDE2KSx0aGlzLmUudG9TdHJpbmcoMTYpKTtyZXR1cm4gYX1mdW5jdGlvbiBfcnNhc2lnbl92ZXJpZnlTdHJpbmcoZixqKXtqPWoucmVwbGFjZShfUkVfSEVYREVDT05MWSxcIlwiKTtqPWoucmVwbGFjZSgvWyBcXG5dKy9nLFwiXCIpO3ZhciBiPXBhcnNlQmlnSW50KGosMTYpO2lmKGIuYml0TGVuZ3RoKCk+dGhpcy5uLmJpdExlbmd0aCgpKXtyZXR1cm4gMH12YXIgaT10aGlzLmRvUHVibGljKGIpO3ZhciBlPWkudG9TdHJpbmcoMTYpLnJlcGxhY2UoL14xZiswMC8sXCJcIik7dmFyIGc9X3JzYXNpZ25fZ2V0QWxnTmFtZUFuZEhhc2hGcm9tSGV4RGlzZ2VzdEluZm8oZSk7aWYoZy5sZW5ndGg9PTApe3JldHVybiBmYWxzZX12YXIgZD1nWzBdO3ZhciBoPWdbMV07dmFyIGE9ZnVuY3Rpb24oayl7cmV0dXJuIEtKVVIuY3J5cHRvLlV0aWwuaGFzaFN0cmluZyhrLGQpfTt2YXIgYz1hKGYpO3JldHVybihoPT1jKX1mdW5jdGlvbiBfcnNhc2lnbl92ZXJpZnlXaXRoTWVzc2FnZUhhc2goZSxhKXthPWEucmVwbGFjZShfUkVfSEVYREVDT05MWSxcIlwiKTthPWEucmVwbGFjZSgvWyBcXG5dKy9nLFwiXCIpO3ZhciBiPXBhcnNlQmlnSW50KGEsMTYpO2lmKGIuYml0TGVuZ3RoKCk+dGhpcy5uLmJpdExlbmd0aCgpKXtyZXR1cm4gMH12YXIgaD10aGlzLmRvUHVibGljKGIpO3ZhciBnPWgudG9TdHJpbmcoMTYpLnJlcGxhY2UoL14xZiswMC8sXCJcIik7dmFyIGM9X3JzYXNpZ25fZ2V0QWxnTmFtZUFuZEhhc2hGcm9tSGV4RGlzZ2VzdEluZm8oZyk7aWYoYy5sZW5ndGg9PTApe3JldHVybiBmYWxzZX12YXIgZD1jWzBdO3ZhciBmPWNbMV07cmV0dXJuKGY9PWUpfWZ1bmN0aW9uIF9yc2FzaWduX3ZlcmlmeVN0cmluZ1BTUyhjLGIsYSxmKXt2YXIgZT1mdW5jdGlvbihnKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGcsYSl9O3ZhciBkPWUocnN0cnRvaGV4KGMpKTtpZihmPT09dW5kZWZpbmVkKXtmPS0xfXJldHVybiB0aGlzLnZlcmlmeVdpdGhNZXNzYWdlSGFzaFBTUyhkLGIsYSxmKX1mdW5jdGlvbiBfcnNhc2lnbl92ZXJpZnlXaXRoTWVzc2FnZUhhc2hQU1MoZixzLGwsYyl7dmFyIGs9bmV3IEJpZ0ludGVnZXIocywxNik7aWYoay5iaXRMZW5ndGgoKT50aGlzLm4uYml0TGVuZ3RoKCkpe3JldHVybiBmYWxzZX12YXIgcj1mdW5jdGlvbihpKXtyZXR1cm4gS0pVUi5jcnlwdG8uVXRpbC5oYXNoSGV4KGksbCl9O3ZhciBqPWhleHRvcnN0cihmKTt2YXIgaD1qLmxlbmd0aDt2YXIgZz10aGlzLm4uYml0TGVuZ3RoKCktMTt2YXIgbT1NYXRoLmNlaWwoZy84KTt2YXIgcTtpZihjPT09LTF8fGM9PT11bmRlZmluZWQpe2M9aH1lbHNle2lmKGM9PT0tMil7Yz1tLWgtMn1lbHNle2lmKGM8LTIpe3Rocm93XCJpbnZhbGlkIHNhbHQgbGVuZ3RoXCJ9fX1pZihtPChoK2MrMikpe3Rocm93XCJkYXRhIHRvbyBsb25nXCJ9dmFyIGE9dGhpcy5kb1B1YmxpYyhrKS50b0J5dGVBcnJheSgpO2ZvcihxPTA7cTxhLmxlbmd0aDtxKz0xKXthW3FdJj0yNTV9d2hpbGUoYS5sZW5ndGg8bSl7YS51bnNoaWZ0KDApfWlmKGFbbS0xXSE9PTE4OCl7dGhyb3dcImVuY29kZWQgbWVzc2FnZSBkb2VzIG5vdCBlbmQgaW4gMHhiY1wifWE9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsYSk7dmFyIGQ9YS5zdWJzdHIoMCxtLWgtMSk7dmFyIGU9YS5zdWJzdHIoZC5sZW5ndGgsaCk7dmFyIHA9KDY1MjgwPj4oOCptLWcpKSYyNTU7aWYoKGQuY2hhckNvZGVBdCgwKSZwKSE9PTApe3Rocm93XCJiaXRzIGJleW9uZCBrZXlzaXplIG5vdCB6ZXJvXCJ9dmFyIG49cHNzX21nZjFfc3RyKGUsZC5sZW5ndGgscik7dmFyIG89W107Zm9yKHE9MDtxPGQubGVuZ3RoO3ErPTEpe29bcV09ZC5jaGFyQ29kZUF0KHEpXm4uY2hhckNvZGVBdChxKX1vWzBdJj1+cDt2YXIgYj1tLWgtYy0yO2ZvcihxPTA7cTxiO3ErPTEpe2lmKG9bcV0hPT0wKXt0aHJvd1wibGVmdG1vc3Qgb2N0ZXRzIG5vdCB6ZXJvXCJ9fWlmKG9bYl0hPT0xKXt0aHJvd1wiMHgwMSBtYXJrZXIgbm90IGZvdW5kXCJ9cmV0dXJuIGU9PT1oZXh0b3JzdHIocihyc3RydG9oZXgoXCJcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXCIraitTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxvLnNsaWNlKC1jKSkpKSl9UlNBS2V5LnByb3RvdHlwZS5zaWduV2l0aE1lc3NhZ2VIYXNoPV9yc2FzaWduX3NpZ25XaXRoTWVzc2FnZUhhc2g7UlNBS2V5LnByb3RvdHlwZS5zaWduU3RyaW5nPV9yc2FzaWduX3NpZ25TdHJpbmc7UlNBS2V5LnByb3RvdHlwZS5zaWduU3RyaW5nV2l0aFNIQTE9X3JzYXNpZ25fc2lnblN0cmluZ1dpdGhTSEExO1JTQUtleS5wcm90b3R5cGUuc2lnblN0cmluZ1dpdGhTSEEyNTY9X3JzYXNpZ25fc2lnblN0cmluZ1dpdGhTSEEyNTY7UlNBS2V5LnByb3RvdHlwZS5zaWduPV9yc2FzaWduX3NpZ25TdHJpbmc7UlNBS2V5LnByb3RvdHlwZS5zaWduV2l0aFNIQTE9X3JzYXNpZ25fc2lnblN0cmluZ1dpdGhTSEExO1JTQUtleS5wcm90b3R5cGUuc2lnbldpdGhTSEEyNTY9X3JzYXNpZ25fc2lnblN0cmluZ1dpdGhTSEEyNTY7UlNBS2V5LnByb3RvdHlwZS5zaWduV2l0aE1lc3NhZ2VIYXNoUFNTPV9yc2FzaWduX3NpZ25XaXRoTWVzc2FnZUhhc2hQU1M7UlNBS2V5LnByb3RvdHlwZS5zaWduU3RyaW5nUFNTPV9yc2FzaWduX3NpZ25TdHJpbmdQU1M7UlNBS2V5LnByb3RvdHlwZS5zaWduUFNTPV9yc2FzaWduX3NpZ25TdHJpbmdQU1M7UlNBS2V5LlNBTFRfTEVOX0hMRU49LTE7UlNBS2V5LlNBTFRfTEVOX01BWD0tMjtSU0FLZXkucHJvdG90eXBlLnZlcmlmeVdpdGhNZXNzYWdlSGFzaD1fcnNhc2lnbl92ZXJpZnlXaXRoTWVzc2FnZUhhc2g7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlTdHJpbmc9X3JzYXNpZ25fdmVyaWZ5U3RyaW5nO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5SGV4U2lnbmF0dXJlRm9yTWVzc2FnZT1fcnNhc2lnbl92ZXJpZnlIZXhTaWduYXR1cmVGb3JNZXNzYWdlO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5PV9yc2FzaWduX3ZlcmlmeVN0cmluZztSU0FLZXkucHJvdG90eXBlLnZlcmlmeUhleFNpZ25hdHVyZUZvckJ5dGVBcnJheU1lc3NhZ2U9X3JzYXNpZ25fdmVyaWZ5SGV4U2lnbmF0dXJlRm9yTWVzc2FnZTtSU0FLZXkucHJvdG90eXBlLnZlcmlmeVdpdGhNZXNzYWdlSGFzaFBTUz1fcnNhc2lnbl92ZXJpZnlXaXRoTWVzc2FnZUhhc2hQU1M7UlNBS2V5LnByb3RvdHlwZS52ZXJpZnlTdHJpbmdQU1M9X3JzYXNpZ25fdmVyaWZ5U3RyaW5nUFNTO1JTQUtleS5wcm90b3R5cGUudmVyaWZ5UFNTPV9yc2FzaWduX3ZlcmlmeVN0cmluZ1BTUztSU0FLZXkuU0FMVF9MRU5fUkVDT1ZFUj0tMjtcbi8qISB4NTA5LTEuMS45LmpzIChjKSAyMDEyLTIwMTYgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gWDUwOSgpe3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQT1udWxsO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQV9oTj1udWxsO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQV9oRT1udWxsO3RoaXMuaGV4PW51bGw7dGhpcy5nZXRTZXJpYWxOdW1iZXJIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gQVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsMV0pfTt0aGlzLmdldFNpZ25hdHVyZUFsZ29yaXRobUZpZWxkPWZ1bmN0aW9uKCl7dmFyIGI9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsMiwwXSk7dmFyIGE9S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50KGIpO3ZhciBjPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShhKTtyZXR1cm4gY307dGhpcy5nZXRJc3N1ZXJIZXg9ZnVuY3Rpb24oKXtyZXR1cm4gQVNOMUhFWC5nZXREZWNlbmRhbnRIZXhUTFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCwzXSl9O3RoaXMuZ2V0SXNzdWVyU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFg1MDkuaGV4MmRuKEFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VExWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsM10pKX07dGhpcy5nZXRTdWJqZWN0SGV4PWZ1bmN0aW9uKCl7cmV0dXJuIEFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VExWQnlOdGhMaXN0KHRoaXMuaGV4LDAsWzAsNV0pfTt0aGlzLmdldFN1YmplY3RTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gWDUwOS5oZXgyZG4oQVNOMUhFWC5nZXREZWNlbmRhbnRIZXhUTFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCw1XSkpfTt0aGlzLmdldE5vdEJlZm9yZT1mdW5jdGlvbigpe3ZhciBhPUFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VkJ5TnRoTGlzdCh0aGlzLmhleCwwLFswLDQsMF0pO2E9YS5yZXBsYWNlKC8oLi4pL2csXCIlJDFcIik7YT1kZWNvZGVVUklDb21wb25lbnQoYSk7cmV0dXJuIGF9O3RoaXMuZ2V0Tm90QWZ0ZXI9ZnVuY3Rpb24oKXt2YXIgYT1BU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QodGhpcy5oZXgsMCxbMCw0LDFdKTthPWEucmVwbGFjZSgvKC4uKS9nLFwiJSQxXCIpO2E9ZGVjb2RlVVJJQ29tcG9uZW50KGEpO3JldHVybiBhfTt0aGlzLnJlYWRDZXJ0UEVNPWZ1bmN0aW9uKGMpe3ZhciBlPVg1MDkucGVtVG9IZXgoYyk7dmFyIGI9WDUwOS5nZXRQdWJsaWNLZXlIZXhBcnJheUZyb21DZXJ0SGV4KGUpO3ZhciBkPW5ldyBSU0FLZXkoKTtkLnNldFB1YmxpYyhiWzBdLGJbMV0pO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQT1kO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQV9oTj1iWzBdO3RoaXMuc3ViamVjdFB1YmxpY0tleVJTQV9oRT1iWzFdO3RoaXMuaGV4PWV9O3RoaXMucmVhZENlcnRQRU1XaXRob3V0UlNBSW5pdD1mdW5jdGlvbihjKXt2YXIgZD1YNTA5LnBlbVRvSGV4KGMpO3ZhciBiPVg1MDkuZ2V0UHVibGljS2V5SGV4QXJyYXlGcm9tQ2VydEhleChkKTt0aGlzLnN1YmplY3RQdWJsaWNLZXlSU0Euc2V0UHVibGljKGJbMF0sYlsxXSk7dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBX2hOPWJbMF07dGhpcy5zdWJqZWN0UHVibGljS2V5UlNBX2hFPWJbMV07dGhpcy5oZXg9ZH07dGhpcy5nZXRJbmZvPWZ1bmN0aW9uKCl7dmFyIHA9XCJCYXNpYyBGaWVsZHNcXG5cIjtwKz1cIiAgc2VyaWFsIG51bWJlcjogXCIrdGhpcy5nZXRTZXJpYWxOdW1iZXJIZXgoKStcIlxcblwiO3ArPVwiICBzaWduYXR1cmUgYWxnb3JpdGhtOiBcIit0aGlzLmdldFNpZ25hdHVyZUFsZ29yaXRobUZpZWxkKCkrXCJcXG5cIjtwKz1cIiAgaXNzdWVyOiBcIit0aGlzLmdldElzc3VlclN0cmluZygpK1wiXFxuXCI7cCs9XCIgIG5vdEJlZm9yZTogXCIrdGhpcy5nZXROb3RCZWZvcmUoKStcIlxcblwiO3ArPVwiICBub3RBZnRlcjogXCIrdGhpcy5nZXROb3RBZnRlcigpK1wiXFxuXCI7cCs9XCIgIHN1YmplY3Q6IFwiK3RoaXMuZ2V0U3ViamVjdFN0cmluZygpK1wiXFxuXCI7cCs9XCIgIHN1YmplY3QgcHVibGljIGtleSBpbmZvOiBcXG5cIjt2YXIgaj1YNTA5LmdldFN1YmplY3RQdWJsaWNLZXlJbmZvUG9zRnJvbUNlcnRIZXgodGhpcy5oZXgpO3ZhciBkPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmoodGhpcy5oZXgsaik7dmFyIG49S0VZVVRJTC5nZXRLZXkoZCxudWxsLFwicGtjczhwdWJcIik7aWYobiBpbnN0YW5jZW9mIFJTQUtleSl7cCs9XCIgICAga2V5IGFsZ29yaXRobTogUlNBXFxuXCI7cCs9XCIgICAgbj1cIituLm4udG9TdHJpbmcoMTYpLnN1YnN0cigwLDE2KStcIi4uLlxcblwiO3ArPVwiICAgIGU9XCIrbi5lLnRvU3RyaW5nKDE2KStcIlxcblwifXArPVwiWDUwOXYzIEV4dGVuc2lvbnM6XFxuXCI7dmFyIG09WDUwOS5nZXRWM0V4dEluZm9MaXN0T2ZDZXJ0SGV4KHRoaXMuaGV4KTtmb3IodmFyIGU9MDtlPG0ubGVuZ3RoO2UrKyl7dmFyIGI9bVtlXTt2YXIgbz1LSlVSLmFzbjEueDUwOS5PSUQub2lkMm5hbWUoYi5vaWQpO2lmKG89PT1cIlwiKXtvPWIub2lkfXZhciBrPVwiXCI7aWYoYi5jcml0aWNhbD09PXRydWUpe2s9XCJDUklUSUNBTFwifXArPVwiICBcIitvK1wiIFwiK2srXCI6XFxuXCI7aWYobz09PVwiYmFzaWNDb25zdHJhaW50c1wiKXt2YXIgZz1YNTA5LmdldEV4dEJhc2ljQ29uc3RyYWludHModGhpcy5oZXgpO2lmKGcuY0E9PT11bmRlZmluZWQpe3ArPVwiICAgIHt9XFxuXCJ9ZWxzZXtwKz1cIiAgICBjQT10cnVlXCI7aWYoZy5wYXRoTGVuIT09dW5kZWZpbmVkKXtwKz1cIiwgcGF0aExlbj1cIitnLnBhdGhMZW59cCs9XCJcXG5cIn19ZWxzZXtpZihvPT09XCJrZXlVc2FnZVwiKXtwKz1cIiAgICBcIitYNTA5LmdldEV4dEtleVVzYWdlU3RyaW5nKHRoaXMuaGV4KStcIlxcblwifWVsc2V7aWYobz09PVwic3ViamVjdEtleUlkZW50aWZpZXJcIil7cCs9XCIgICAgXCIrWDUwOS5nZXRFeHRTdWJqZWN0S2V5SWRlbnRpZmllcih0aGlzLmhleCkrXCJcXG5cIn1lbHNle2lmKG89PT1cImF1dGhvcml0eUtleUlkZW50aWZpZXJcIil7dmFyIGE9WDUwOS5nZXRFeHRBdXRob3JpdHlLZXlJZGVudGlmaWVyKHRoaXMuaGV4KTtpZihhLmtpZCE9PXVuZGVmaW5lZCl7cCs9XCIgICAga2lkPVwiK2Eua2lkK1wiXFxuXCJ9fWVsc2V7aWYobz09PVwiZXh0S2V5VXNhZ2VcIil7dmFyIGg9WDUwOS5nZXRFeHRFeHRLZXlVc2FnZU5hbWUodGhpcy5oZXgpO3ArPVwiICAgIFwiK2guam9pbihcIiwgXCIpK1wiXFxuXCJ9ZWxzZXtpZihvPT09XCJzdWJqZWN0QWx0TmFtZVwiKXt2YXIgZj1YNTA5LmdldEV4dFN1YmplY3RBbHROYW1lKHRoaXMuaGV4KTtwKz1cIiAgICBcIitmLmpvaW4oXCIsIFwiKStcIlxcblwifWVsc2V7aWYobz09PVwiY1JMRGlzdHJpYnV0aW9uUG9pbnRzXCIpe3ZhciBsPVg1MDkuZ2V0RXh0Q1JMRGlzdHJpYnV0aW9uUG9pbnRzVVJJKHRoaXMuaGV4KTtwKz1cIiAgICBcIitsK1wiXFxuXCJ9ZWxzZXtpZihvPT09XCJhdXRob3JpdHlJbmZvQWNjZXNzXCIpe3ZhciBjPVg1MDkuZ2V0RXh0QUlBSW5mbyh0aGlzLmhleCk7aWYoYy5vY3NwIT09dW5kZWZpbmVkKXtwKz1cIiAgICBvY3NwOiBcIitjLm9jc3Auam9pbihcIixcIikrXCJcXG5cIn1pZihjLmNhaXNzdWVyIT09dW5kZWZpbmVkKXtwKz1cIiAgICBjYWlzc3VlcjogXCIrYy5jYWlzc3Vlci5qb2luKFwiLFwiKStcIlxcblwifX19fX19fX19fXArPVwic2lnbmF0dXJlIGFsZ29yaXRobTogXCIrWDUwOS5nZXRTaWduYXR1cmVBbGdvcml0aG1OYW1lKHRoaXMuaGV4KStcIlxcblwiO3ArPVwic2lnbmF0dXJlOiBcIitYNTA5LmdldFNpZ25hdHVyZVZhbHVlSGV4KHRoaXMuaGV4KS5zdWJzdHIoMCwxNikrXCIuLi5cXG5cIjtyZXR1cm4gcH19WDUwOS5wZW1Ub0Jhc2U2ND1mdW5jdGlvbihhKXt2YXIgYj1hO2I9Yi5yZXBsYWNlKFwiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXCIsXCJcIik7Yj1iLnJlcGxhY2UoXCItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXCIsXCJcIik7Yj1iLnJlcGxhY2UoL1sgXFxuXSsvZyxcIlwiKTtyZXR1cm4gYn07WDUwOS5wZW1Ub0hleD1mdW5jdGlvbihhKXt2YXIgYz1YNTA5LnBlbVRvQmFzZTY0KGEpO3ZhciBiPWI2NHRvaGV4KGMpO3JldHVybiBifTtYNTA5LmdldFN1YmplY3RQdWJsaWNLZXlQb3NGcm9tQ2VydEhleD1mdW5jdGlvbihmKXt2YXIgZT1YNTA5LmdldFN1YmplY3RQdWJsaWNLZXlJbmZvUG9zRnJvbUNlcnRIZXgoZik7aWYoZT09LTEpe3JldHVybiAtMX12YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLGUpO2lmKGIubGVuZ3RoIT0yKXtyZXR1cm4gLTF9dmFyIGQ9YlsxXTtpZihmLnN1YnN0cmluZyhkLGQrMikhPVwiMDNcIil7cmV0dXJuIC0xfXZhciBjPUFTTjFIRVguZ2V0U3RhcnRQb3NPZlZfQXRPYmooZixkKTtpZihmLnN1YnN0cmluZyhjLGMrMikhPVwiMDBcIil7cmV0dXJuIC0xfXJldHVybiBjKzJ9O1g1MDkuZ2V0U3ViamVjdFB1YmxpY0tleUluZm9Qb3NGcm9tQ2VydEhleD1mdW5jdGlvbihkKXt2YXIgYz1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKGQsMCk7dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZCxjKTtpZihiLmxlbmd0aDwxKXtyZXR1cm4gLTF9aWYoZC5zdWJzdHJpbmcoYlswXSxiWzBdKzEwKT09XCJhMDAzMDIwMTAyXCIpe2lmKGIubGVuZ3RoPDYpe3JldHVybiAtMX1yZXR1cm4gYls2XX1lbHNle2lmKGIubGVuZ3RoPDUpe3JldHVybiAtMX1yZXR1cm4gYls1XX19O1g1MDkuZ2V0UHVibGljS2V5SGV4QXJyYXlGcm9tQ2VydEhleD1mdW5jdGlvbihmKXt2YXIgZT1YNTA5LmdldFN1YmplY3RQdWJsaWNLZXlQb3NGcm9tQ2VydEhleChmKTt2YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLGUpO2lmKGIubGVuZ3RoIT0yKXtyZXR1cm5bXX12YXIgZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGJbMF0pO3ZhciBjPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGYsYlsxXSk7aWYoZCE9bnVsbCYmYyE9bnVsbCl7cmV0dXJuW2QsY119ZWxzZXtyZXR1cm5bXX19O1g1MDkuZ2V0SGV4VGJzQ2VydGlmaWNhdGVGcm9tQ2VydD1mdW5jdGlvbihiKXt2YXIgYT1BU04xSEVYLmdldFN0YXJ0UG9zT2ZWX0F0T2JqKGIsMCk7cmV0dXJuIGF9O1g1MDkuZ2V0UHVibGljS2V5SGV4QXJyYXlGcm9tQ2VydFBFTT1mdW5jdGlvbihjKXt2YXIgZD1YNTA5LnBlbVRvSGV4KGMpO3ZhciBiPVg1MDkuZ2V0UHVibGljS2V5SGV4QXJyYXlGcm9tQ2VydEhleChkKTtyZXR1cm4gYn07WDUwOS5oZXgyZG49ZnVuY3Rpb24oZSl7dmFyIGY9XCJcIjt2YXIgYz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihlLDApO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgYj1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGUsY1tkXSk7Zj1mK1wiL1wiK1g1MDkuaGV4MnJkbihiKX1yZXR1cm4gZn07WDUwOS5oZXgycmRuPWZ1bmN0aW9uKGEpe3ZhciBmPUFTTjFIRVguZ2V0RGVjZW5kYW50SGV4VExWQnlOdGhMaXN0KGEsMCxbMCwwXSk7dmFyIGU9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KGEsMCxbMCwxXSk7dmFyIGM9XCJcIjt0cnl7Yz1YNTA5LkROX0FUVFJIRVhbZl19Y2F0Y2goYil7Yz1mfWU9ZS5yZXBsYWNlKC8oLi4pL2csXCIlJDFcIik7dmFyIGQ9ZGVjb2RlVVJJQ29tcG9uZW50KGUpO3JldHVybiBjK1wiPVwiK2R9O1g1MDkuRE5fQVRUUkhFWD17XCIwNjAzNTUwNDA2XCI6XCJDXCIsXCIwNjAzNTUwNDBhXCI6XCJPXCIsXCIwNjAzNTUwNDBiXCI6XCJPVVwiLFwiMDYwMzU1MDQwM1wiOlwiQ05cIixcIjA2MDM1NTA0MDVcIjpcIlNOXCIsXCIwNjAzNTUwNDA4XCI6XCJTVFwiLFwiMDYwMzU1MDQwN1wiOlwiTFwiLFwiMDYwMzU1MDQwOVwiOlwic3RyZWV0QWRkcmVzc1wiLFwiMDYwMzU1MDQwZlwiOlwiYnVzaW5lc3NDYXRlZ29yeVwiLFwiMDYwMzU1MDQxMVwiOlwicG9zdGFsQ29kZVwiLFwiMDYwYjJiMDYwMTA0MDE4MjM3M2MwMjAxMDJcIjpcImp1cmlzZGljdGlvbk9mSW5jb3Jwb3JhdGlvblNQXCIsXCIwNjBiMmIwNjAxMDQwMTgyMzczYzAyMDEwM1wiOlwianVyaXNkaWN0aW9uT2ZJbmNvcnBvcmF0aW9uQ1wiLH07WDUwOS5nZXRQdWJsaWNLZXlGcm9tQ2VydFBFTT1mdW5jdGlvbihmKXt2YXIgYz1YNTA5LmdldFB1YmxpY0tleUluZm9Qcm9wT2ZDZXJ0UEVNKGYpO2lmKGMuYWxnb2lkPT1cIjJhODY0ODg2ZjcwZDAxMDEwMVwiKXt2YXIgaT1LRVlVVElMLnBhcnNlUHVibGljUmF3UlNBS2V5SGV4KGMua2V5aGV4KTt2YXIgaj1uZXcgUlNBS2V5KCk7ai5zZXRQdWJsaWMoaS5uLGkuZSk7cmV0dXJuIGp9ZWxzZXtpZihjLmFsZ29pZD09XCIyYTg2NDhjZTNkMDIwMVwiKXt2YXIgZT1LSlVSLmNyeXB0by5PSUQub2lkaGV4Mm5hbWVbYy5hbGdwYXJhbV07dmFyIGo9bmV3IEtKVVIuY3J5cHRvLkVDRFNBKHtjdXJ2ZTplLGluZm86Yy5rZXloZXh9KTtqLnNldFB1YmxpY0tleUhleChjLmtleWhleCk7cmV0dXJuIGp9ZWxzZXtpZihjLmFsZ29pZD09XCIyYTg2NDhjZTM4MDQwMVwiKXt2YXIgYj1BU04xSEVYLmdldFZieUxpc3QoYy5hbGdwYXJhbSwwLFswXSxcIjAyXCIpO3ZhciBhPUFTTjFIRVguZ2V0VmJ5TGlzdChjLmFsZ3BhcmFtLDAsWzFdLFwiMDJcIik7dmFyIGQ9QVNOMUhFWC5nZXRWYnlMaXN0KGMuYWxncGFyYW0sMCxbMl0sXCIwMlwiKTt2YXIgaD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihjLmtleWhleCwwKTtoPWguc3Vic3RyKDIpO3ZhciBqPW5ldyBLSlVSLmNyeXB0by5EU0EoKTtqLnNldFB1YmxpYyhuZXcgQmlnSW50ZWdlcihiLDE2KSxuZXcgQmlnSW50ZWdlcihhLDE2KSxuZXcgQmlnSW50ZWdlcihkLDE2KSxuZXcgQmlnSW50ZWdlcihoLDE2KSk7cmV0dXJuIGp9ZWxzZXt0aHJvd1widW5zdXBwb3J0ZWQga2V5XCJ9fX19O1g1MDkuZ2V0UHVibGljS2V5SW5mb1Byb3BPZkNlcnRQRU09ZnVuY3Rpb24oZSl7dmFyIGk9e307aS5hbGdwYXJhbT1udWxsO3ZhciBmPVg1MDkucGVtVG9IZXgoZSk7dmFyIGQ9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZiwwKTtpZihkLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDAxKVwifWlmKGYuc3Vic3RyKGRbMF0sMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDAyKVwifXZhciBjPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsZFswXSk7dmFyIGc9NjtpZihmLnN1YnN0cihjWzBdLDIpIT09XCJhMFwiKXtnPTV9aWYoYy5sZW5ndGg8ZysxKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDMpXCJ9dmFyIGE9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZixjW2ddKTtpZihhLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOSBjZXJ0aWZpY2F0ZSBQRU0gKGNvZGU6MDA0KVwifXZhciBoPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsYVswXSk7aWYoaC5sZW5ndGghPTIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwNSlcIn1pLmFsZ29pZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGhbMF0pO2lmKGYuc3Vic3RyKGhbMV0sMik9PVwiMDZcIil7aS5hbGdwYXJhbT1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGhbMV0pfWVsc2V7aWYoZi5zdWJzdHIoaFsxXSwyKT09XCIzMFwiKXtpLmFsZ3BhcmFtPUFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooZixoWzFdKX19aWYoZi5zdWJzdHIoYVsxXSwyKSE9XCIwM1wiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDYpXCJ9dmFyIGI9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixhWzFdKTtpLmtleWhleD1iLnN1YnN0cigyKTtyZXR1cm4gaX07WDUwOS5nZXRQdWJsaWNLZXlJbmZvUG9zT2ZDZXJ0SEVYPWZ1bmN0aW9uKGMpe3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGMsMCk7aWYoYi5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMSlcIn1pZihjLnN1YnN0cihiWzBdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMilcIn12YXIgYT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihjLGJbMF0pO2lmKGEubGVuZ3RoPDcpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMylcIn1yZXR1cm4gYVs2XX07WDUwOS5nZXRWM0V4dEluZm9MaXN0T2ZDZXJ0SGV4PWZ1bmN0aW9uKGcpe3ZhciBiPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGcsMCk7aWYoYi5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMSlcIn1pZihnLnN1YnN0cihiWzBdLDIpIT1cIjMwXCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMilcIn12YXIgYT1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihnLGJbMF0pO2lmKGEubGVuZ3RoPDgpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwMylcIn1pZihnLnN1YnN0cihhWzddLDIpIT1cImEzXCIpe3Rocm93XCJtYWxmb3JtZWQgWC41MDkgY2VydGlmaWNhdGUgUEVNIChjb2RlOjAwNClcIn12YXIgaD1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihnLGFbN10pO2lmKGgubGVuZ3RoIT0xKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDUpXCJ9aWYoZy5zdWJzdHIoaFswXSwyKSE9XCIzMFwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5IGNlcnRpZmljYXRlIFBFTSAoY29kZTowMDYpXCJ9dmFyIGY9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxoWzBdKTt2YXIgZT1mLmxlbmd0aDt2YXIgZD1uZXcgQXJyYXkoZSk7Zm9yKHZhciBjPTA7YzxlO2MrKyl7ZFtjXT1YNTA5LmdldFYzRXh0SXRlbUluZm9fQXRPYmooZyxmW2NdKX1yZXR1cm4gZH07WDUwOS5nZXRWM0V4dEl0ZW1JbmZvX0F0T2JqPWZ1bmN0aW9uKGYsZyl7dmFyIGU9e307ZS5wb3NUTFY9Zzt2YXIgYj1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihmLGcpO2lmKGIubGVuZ3RoIT0yJiZiLmxlbmd0aCE9Myl7dGhyb3dcIm1hbGZvcm1lZCBYLjUwOXYzIEV4dCAoY29kZTowMDEpXCJ9aWYoZi5zdWJzdHIoYlswXSwyKSE9XCIwNlwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5djMgRXh0IChjb2RlOjAwMilcIn12YXIgZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGJbMF0pO2Uub2lkPUFTTjFIRVguaGV4dG9vaWRzdHIoZCk7ZS5jcml0aWNhbD1mYWxzZTtpZihiLmxlbmd0aD09Myl7ZS5jcml0aWNhbD10cnVlfXZhciBjPWJbYi5sZW5ndGgtMV07aWYoZi5zdWJzdHIoYywyKSE9XCIwNFwiKXt0aHJvd1wibWFsZm9ybWVkIFguNTA5djMgRXh0IChjb2RlOjAwMylcIn1lLnBvc1Y9QVNOMUhFWC5nZXRTdGFydFBvc09mVl9BdE9iaihmLGMpO3JldHVybiBlfTtYNTA5LmdldEhleE9mVExWX1YzRXh0VmFsdWU9ZnVuY3Rpb24oYixhKXt2YXIgYz1YNTA5LmdldFBvc09mVExWX1YzRXh0VmFsdWUoYixhKTtpZihjPT0tMSl7cmV0dXJuIG51bGx9cmV0dXJuIEFTTjFIRVguZ2V0SGV4T2ZUTFZfQXRPYmooYixjKX07WDUwOS5nZXRIZXhPZlZfVjNFeHRWYWx1ZT1mdW5jdGlvbihiLGEpe3ZhciBjPVg1MDkuZ2V0UG9zT2ZUTFZfVjNFeHRWYWx1ZShiLGEpO2lmKGM9PS0xKXtyZXR1cm4gbnVsbH1yZXR1cm4gQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooYixjKX07WDUwOS5nZXRQb3NPZlRMVl9WM0V4dFZhbHVlPWZ1bmN0aW9uKGYsYil7dmFyIGQ9YjtpZighYi5tYXRjaCgvXlswLTkuXSskLykpe2Q9S0pVUi5hc24xLng1MDkuT0lELm5hbWUyb2lkKGIpfWlmKGQ9PVwiXCIpe3JldHVybiAtMX12YXIgYz1YNTA5LmdldFYzRXh0SW5mb0xpc3RPZkNlcnRIZXgoZik7Zm9yKHZhciBhPTA7YTxjLmxlbmd0aDthKyspe3ZhciBlPWNbYV07aWYoZS5vaWQ9PWQpe3JldHVybiBlLnBvc1Z9fXJldHVybiAtMX07WDUwOS5nZXRFeHRCYXNpY0NvbnN0cmFpbnRzPWZ1bmN0aW9uKGQpe3ZhciBhPVg1MDkuZ2V0SGV4T2ZWX1YzRXh0VmFsdWUoZCxcImJhc2ljQ29uc3RyYWludHNcIik7aWYoYT09PW51bGwpe3JldHVybiBudWxsfWlmKGE9PT1cIlwiKXtyZXR1cm57fX1pZihhPT09XCIwMTAxZmZcIil7cmV0dXJue2NBOnRydWV9fWlmKGEuc3Vic3RyKDAsOCk9PT1cIjAxMDFmZjAyXCIpe3ZhciBjPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGEsNik7dmFyIGI9cGFyc2VJbnQoYywxNik7cmV0dXJue2NBOnRydWUscGF0aExlbjpifX10aHJvd1widW5rbm93biBlcnJvclwifTtYNTA5LktFWVVTQUdFX05BTUU9W1wiZGlnaXRhbFNpZ25hdHVyZVwiLFwibm9uUmVwdWRpYXRpb25cIixcImtleUVuY2lwaGVybWVudFwiLFwiZGF0YUVuY2lwaGVybWVudFwiLFwia2V5QWdyZWVtZW50XCIsXCJrZXlDZXJ0U2lnblwiLFwiY1JMU2lnblwiLFwiZW5jaXBoZXJPbmx5XCIsXCJkZWNpcGhlck9ubHlcIl07WDUwOS5nZXRFeHRLZXlVc2FnZUJpbj1mdW5jdGlvbihkKXt2YXIgYj1YNTA5LmdldEhleE9mVl9WM0V4dFZhbHVlKGQsXCJrZXlVc2FnZVwiKTtpZihiPT1cIlwiKXtyZXR1cm5cIlwifWlmKGIubGVuZ3RoJTIhPTB8fGIubGVuZ3RoPD0yKXt0aHJvd1wibWFsZm9ybWVkIGtleSB1c2FnZSB2YWx1ZVwifXZhciBhPXBhcnNlSW50KGIuc3Vic3RyKDAsMikpO3ZhciBjPXBhcnNlSW50KGIuc3Vic3RyKDIpLDE2KS50b1N0cmluZygyKTtyZXR1cm4gYy5zdWJzdHIoMCxjLmxlbmd0aC1hKX07WDUwOS5nZXRFeHRLZXlVc2FnZVN0cmluZz1mdW5jdGlvbihlKXt2YXIgZD1YNTA5LmdldEV4dEtleVVzYWdlQmluKGUpO3ZhciBiPW5ldyBBcnJheSgpO2Zvcih2YXIgYz0wO2M8ZC5sZW5ndGg7YysrKXtpZihkLnN1YnN0cihjLDEpPT1cIjFcIil7Yi5wdXNoKFg1MDkuS0VZVVNBR0VfTkFNRVtjXSl9fXJldHVybiBiLmpvaW4oXCIsXCIpfTtYNTA5LmdldEV4dFN1YmplY3RLZXlJZGVudGlmaWVyPWZ1bmN0aW9uKGIpe3ZhciBhPVg1MDkuZ2V0SGV4T2ZWX1YzRXh0VmFsdWUoYixcInN1YmplY3RLZXlJZGVudGlmaWVyXCIpO3JldHVybiBhfTtYNTA5LmdldEV4dEF1dGhvcml0eUtleUlkZW50aWZpZXI9ZnVuY3Rpb24oZil7dmFyIGI9e307dmFyIGU9WDUwOS5nZXRIZXhPZlRMVl9WM0V4dFZhbHVlKGYsXCJhdXRob3JpdHlLZXlJZGVudGlmaWVyXCIpO2lmKGU9PT1udWxsKXtyZXR1cm4gbnVsbH12YXIgYz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihlLDApO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXtpZihlLnN1YnN0cihjW2RdLDIpPT09XCI4MFwiKXtiLmtpZD1BU04xSEVYLmdldEhleE9mVl9BdE9iaihlLGNbZF0pfX1yZXR1cm4gYn07WDUwOS5nZXRFeHRFeHRLZXlVc2FnZU5hbWU9ZnVuY3Rpb24oayl7dmFyIGI9bmV3IEFycmF5KCk7dmFyIGY9WDUwOS5nZXRIZXhPZlRMVl9WM0V4dFZhbHVlKGssXCJleHRLZXlVc2FnZVwiKTtpZihmPT09bnVsbCl7cmV0dXJuIG51bGx9dmFyIGM9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZiwwKTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyl7dmFyIGo9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZixjW2VdKTt2YXIgZz1LSlVSLmFzbjEuQVNOMVV0aWwub2lkSGV4VG9JbnQoaik7dmFyIGQ9S0pVUi5hc24xLng1MDkuT0lELm9pZDJuYW1lKGcpO2IucHVzaChkKX1yZXR1cm4gYn07WDUwOS5nZXRFeHRTdWJqZWN0QWx0TmFtZT1mdW5jdGlvbihnKXt2YXIgYj1uZXcgQXJyYXkoKTt2YXIgZj1YNTA5LmdldEhleE9mVExWX1YzRXh0VmFsdWUoZyxcInN1YmplY3RBbHROYW1lXCIpO3ZhciBjPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGYsMCk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe2lmKGYuc3Vic3RyKGNbZV0sMik9PT1cIjgyXCIpe3ZhciBkPWhleHRvdXRmOChBU04xSEVYLmdldEhleE9mVl9BdE9iaihmLGNbZV0pKTtiLnB1c2goZCl9fXJldHVybiBifTtYNTA5LmdldEV4dENSTERpc3RyaWJ1dGlvblBvaW50c1VSST1mdW5jdGlvbihuKXt2YXIgcD1uZXcgQXJyYXkoKTt2YXIgaz1YNTA5LmdldEhleE9mVExWX1YzRXh0VmFsdWUobixcImNSTERpc3RyaWJ1dGlvblBvaW50c1wiKTt2YXIgbz1BU04xSEVYLmdldFBvc0FycmF5T2ZDaGlsZHJlbl9BdE9iaihrLDApO2Zvcih2YXIgZz0wO2c8by5sZW5ndGg7ZysrKXt2YXIgbD1BU04xSEVYLmdldEhleE9mVExWX0F0T2JqKGssb1tnXSk7dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmoobCwwKTtmb3IodmFyIGU9MDtlPGIubGVuZ3RoO2UrKyl7aWYobC5zdWJzdHIoYltlXSwyKT09PVwiYTBcIil7dmFyIGY9QVNOMUhFWC5nZXRIZXhPZlZfQXRPYmoobCxiW2VdKTtpZihmLnN1YnN0cigwLDIpPT09XCJhMFwiKXt2YXIgYz1BU04xSEVYLmdldEhleE9mVl9BdE9iaihmLDApO2lmKGMuc3Vic3RyKDAsMik9PT1cIjg2XCIpe3ZhciBtPUFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGMsMCk7dmFyIGQ9aGV4dG91dGY4KG0pO3AucHVzaChkKX19fX19cmV0dXJuIHB9O1g1MDkuZ2V0RXh0QUlBSW5mbz1mdW5jdGlvbihnKXt2YXIgaj17fTtqLm9jc3A9W107ai5jYWlzc3Vlcj1bXTt2YXIgaD1YNTA5LmdldFBvc09mVExWX1YzRXh0VmFsdWUoZyxcImF1dGhvcml0eUluZm9BY2Nlc3NcIik7aWYoaD09LTEpe3JldHVybiBudWxsfWlmKGcuc3Vic3RyKGgsMikhPVwiMzBcIil7dGhyb3dcIm1hbGZvcm1lZCBBSUEgRXh0biBWYWx1ZVwifXZhciBkPUFTTjFIRVguZ2V0UG9zQXJyYXlPZkNoaWxkcmVuX0F0T2JqKGcsaCk7Zm9yKHZhciBjPTA7YzxkLmxlbmd0aDtjKyspe3ZhciBhPWRbY107dmFyIGI9QVNOMUhFWC5nZXRQb3NBcnJheU9mQ2hpbGRyZW5fQXRPYmooZyxhKTtpZihiLmxlbmd0aCE9Mil7dGhyb3dcIm1hbGZvcm1lZCBBY2Nlc3NEZXNjcmlwdGlvbiBvZiBBSUEgRXh0blwifXZhciBlPWJbMF07dmFyIGY9YlsxXTtpZihBU04xSEVYLmdldEhleE9mVl9BdE9iaihnLGUpPT1cIjJiMDYwMTA1MDUwNzMwMDFcIil7aWYoZy5zdWJzdHIoZiwyKT09XCI4NlwiKXtqLm9jc3AucHVzaChoZXh0b3V0ZjgoQVNOMUhFWC5nZXRIZXhPZlZfQXRPYmooZyxmKSkpfX1pZihBU04xSEVYLmdldEhleE9mVl9BdE9iaihnLGUpPT1cIjJiMDYwMTA1MDUwNzMwMDJcIil7aWYoZy5zdWJzdHIoZiwyKT09XCI4NlwiKXtqLmNhaXNzdWVyLnB1c2goaGV4dG91dGY4KEFTTjFIRVguZ2V0SGV4T2ZWX0F0T2JqKGcsZikpKX19fXJldHVybiBqfTtYNTA5LmdldFNpZ25hdHVyZUFsZ29yaXRobU5hbWU9ZnVuY3Rpb24oZCl7dmFyIGI9QVNOMUhFWC5nZXREZWNlbmRhbnRIZXhWQnlOdGhMaXN0KGQsMCxbMSwwXSk7dmFyIGE9S0pVUi5hc24xLkFTTjFVdGlsLm9pZEhleFRvSW50KGIpO3ZhciBjPUtKVVIuYXNuMS54NTA5Lk9JRC5vaWQybmFtZShhKTtyZXR1cm4gY307WDUwOS5nZXRTaWduYXR1cmVWYWx1ZUhleD1mdW5jdGlvbihiKXt2YXIgYT1BU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QoYiwwLFsyXSk7aWYoYS5zdWJzdHIoMCwyKSE9PVwiMDBcIil7dGhyb3dcImNhbid0IGdldCBzaWduYXR1cmUgdmFsdWVcIn1yZXR1cm4gYS5zdWJzdHIoMil9O1g1MDkuZ2V0U2VyaWFsTnVtYmVySGV4PWZ1bmN0aW9uKGEpe3JldHVybiBBU04xSEVYLmdldERlY2VuZGFudEhleFZCeU50aExpc3QoYSwwLFswLDFdKX07XG4vKiEgandzLTMuMy40IChjKSAyMDEzLTIwMTYgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNyc2FzaWduL2xpY2Vuc2VcbiAqL1xuaWYodHlwZW9mIEtKVVI9PVwidW5kZWZpbmVkXCJ8fCFLSlVSKXtLSlVSPXt9fWlmKHR5cGVvZiBLSlVSLmp3cz09XCJ1bmRlZmluZWRcInx8IUtKVVIuandzKXtLSlVSLmp3cz17fX1LSlVSLmp3cy5KV1M9ZnVuY3Rpb24oKXt2YXIgYT1LSlVSLmp3cy5KV1M7dGhpcy5wYXJzZUpXUz1mdW5jdGlvbihlLGcpe2lmKCh0aGlzLnBhcnNlZEpXUyE9PXVuZGVmaW5lZCkmJihnfHwodGhpcy5wYXJzZWRKV1Muc2lndmFsSCE9PXVuZGVmaW5lZCkpKXtyZXR1cm59aWYoZS5tYXRjaCgvXihbXi5dKylcXC4oW14uXSspXFwuKFteLl0rKSQvKT09bnVsbCl7dGhyb3dcIkpXUyBzaWduYXR1cmUgaXMgbm90IGEgZm9ybSBvZiAnSGVhZC5QYXlsb2FkLlNpZ1ZhbHVlJy5cIn12YXIgaD1SZWdFeHAuJDE7dmFyIGM9UmVnRXhwLiQyO3ZhciBpPVJlZ0V4cC4kMzt2YXIgaz1oK1wiLlwiK2M7dGhpcy5wYXJzZWRKV1M9e307dGhpcy5wYXJzZWRKV1MuaGVhZEI2NFU9aDt0aGlzLnBhcnNlZEpXUy5wYXlsb2FkQjY0VT1jO3RoaXMucGFyc2VkSldTLnNpZ3ZhbEI2NFU9aTt0aGlzLnBhcnNlZEpXUy5zaT1rO2lmKCFnKXt2YXIgZj1iNjR1dG9oZXgoaSk7dmFyIGQ9cGFyc2VCaWdJbnQoZiwxNik7dGhpcy5wYXJzZWRKV1Muc2lndmFsSD1mO3RoaXMucGFyc2VkSldTLnNpZ3ZhbEJJPWR9dmFyIGI9YjY0dXRvdXRmOChoKTt2YXIgaj1iNjR1dG91dGY4KGMpO3RoaXMucGFyc2VkSldTLmhlYWRTPWI7dGhpcy5wYXJzZWRKV1MucGF5bG9hZFM9ajtpZighYS5pc1NhZmVKU09OU3RyaW5nKGIsdGhpcy5wYXJzZWRKV1MsXCJoZWFkUFwiKSl7dGhyb3dcIm1hbGZvcm1lZCBKU09OIHN0cmluZyBmb3IgSldTIEhlYWQ6IFwiK2J9fX07S0pVUi5qd3MuSldTLnNpZ249ZnVuY3Rpb24oYSxpLGMsbSxsKXt2YXIgaz1LSlVSLmp3cy5KV1M7dmFyIHEsZSxqO2lmKHR5cGVvZiBpIT1cInN0cmluZ1wiJiZ0eXBlb2YgaSE9XCJvYmplY3RcIil7dGhyb3dcInNwSGVhZGVyIG11c3QgYmUgSlNPTiBzdHJpbmcgb3Igb2JqZWN0OiBcIitpfWlmKHR5cGVvZiBpPT1cIm9iamVjdFwiKXtlPWk7cT1KU09OLnN0cmluZ2lmeShlKX1pZih0eXBlb2YgaT09XCJzdHJpbmdcIil7cT1pO2lmKCFrLmlzU2FmZUpTT05TdHJpbmcocSkpe3Rocm93XCJKV1MgSGVhZCBpcyBub3Qgc2FmZSBKU09OIHN0cmluZzogXCIrcX1lPWsucmVhZFNhZmVKU09OU3RyaW5nKHEpfWo9YztpZih0eXBlb2YgYz09XCJvYmplY3RcIil7aj1KU09OLnN0cmluZ2lmeShjKX1pZigoYT09XCJcInx8YT09bnVsbCkmJmUuYWxnIT09dW5kZWZpbmVkKXthPWUuYWxnfWlmKChhIT1cIlwiJiZhIT1udWxsKSYmZS5hbGc9PT11bmRlZmluZWQpe2UuYWxnPWE7cT1KU09OLnN0cmluZ2lmeShlKX1pZihhIT09ZS5hbGcpe3Rocm93XCJhbGcgYW5kIHNIZWFkZXIuYWxnIGRvZXNuJ3QgbWF0Y2g6IFwiK2ErXCIhPVwiK2UuYWxnfXZhciBkPW51bGw7aWYoay5qd3NhbGcyc2lnYWxnW2FdPT09dW5kZWZpbmVkKXt0aHJvd1widW5zdXBwb3J0ZWQgYWxnIG5hbWU6IFwiK2F9ZWxzZXtkPWsuandzYWxnMnNpZ2FsZ1thXX12YXIgYj11dGY4dG9iNjR1KHEpO3ZhciBnPXV0Zjh0b2I2NHUoaik7dmFyIG89YitcIi5cIitnO3ZhciBuPVwiXCI7aWYoZC5zdWJzdHIoMCw0KT09XCJIbWFjXCIpe2lmKG09PT11bmRlZmluZWQpe3Rocm93XCJtYWMga2V5IHNoYWxsIGJlIHNwZWNpZmllZCBmb3IgSFMqIGFsZ1wifXZhciBoPW5ldyBLSlVSLmNyeXB0by5NYWMoe2FsZzpkLHByb3Y6XCJjcnlwdG9qc1wiLHBhc3M6bX0pO2gudXBkYXRlU3RyaW5nKG8pO249aC5kb0ZpbmFsKCl9ZWxzZXtpZihkLmluZGV4T2YoXCJ3aXRoRUNEU0FcIikhPS0xKXt2YXIgcD1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6ZH0pO3AuaW5pdChtLGwpO3AudXBkYXRlU3RyaW5nKG8pO2hBU04xU2lnPXAuc2lnbigpO249S0pVUi5jcnlwdG8uRUNEU0EuYXNuMVNpZ1RvQ29uY2F0U2lnKGhBU04xU2lnKX1lbHNle2lmKGQhPVwibm9uZVwiKXt2YXIgcD1uZXcgS0pVUi5jcnlwdG8uU2lnbmF0dXJlKHthbGc6ZH0pO3AuaW5pdChtLGwpO3AudXBkYXRlU3RyaW5nKG8pO249cC5zaWduKCl9fX12YXIgZj1oZXh0b2I2NHUobik7cmV0dXJuIG8rXCIuXCIrZn07S0pVUi5qd3MuSldTLnZlcmlmeT1mdW5jdGlvbihwLHQsail7dmFyIG09S0pVUi5qd3MuSldTO3ZhciBxPXAuc3BsaXQoXCIuXCIpO3ZhciBkPXFbMF07dmFyIGw9cVsxXTt2YXIgYj1kK1wiLlwiK2w7dmFyIHI9YjY0dXRvaGV4KHFbMl0pO3ZhciBpPW0ucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgocVswXSkpO3ZhciBoPW51bGw7dmFyIHM9bnVsbDtpZihpLmFsZz09PXVuZGVmaW5lZCl7dGhyb3dcImFsZ29yaXRobSBub3Qgc3BlY2lmaWVkIGluIGhlYWRlclwifWVsc2V7aD1pLmFsZztzPWguc3Vic3RyKDAsMil9aWYoaiE9bnVsbCYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGopPT09XCJbb2JqZWN0IEFycmF5XVwiJiZqLmxlbmd0aD4wKXt2YXIgYz1cIjpcIitqLmpvaW4oXCI6XCIpK1wiOlwiO2lmKGMuaW5kZXhPZihcIjpcIitoK1wiOlwiKT09LTEpe3Rocm93XCJhbGdvcml0aG0gJ1wiK2grXCInIG5vdCBhY2NlcHRlZCBpbiB0aGUgbGlzdFwifX1pZihoIT1cIm5vbmVcIiYmdD09PW51bGwpe3Rocm93XCJrZXkgc2hhbGwgYmUgc3BlY2lmaWVkIHRvIHZlcmlmeS5cIn1pZih0eXBlb2YgdD09XCJzdHJpbmdcIiYmdC5pbmRleE9mKFwiLS0tLS1CRUdJTiBcIikhPS0xKXt0PUtFWVVUSUwuZ2V0S2V5KHQpfWlmKHM9PVwiUlNcInx8cz09XCJQU1wiKXtpZighKHQgaW5zdGFuY2VvZiBSU0FLZXkpKXt0aHJvd1wia2V5IHNoYWxsIGJlIGEgUlNBS2V5IG9iaiBmb3IgUlMqIGFuZCBQUyogYWxnc1wifX1pZihzPT1cIkVTXCIpe2lmKCEodCBpbnN0YW5jZW9mIEtKVVIuY3J5cHRvLkVDRFNBKSl7dGhyb3dcImtleSBzaGFsbCBiZSBhIEVDRFNBIG9iaiBmb3IgRVMqIGFsZ3NcIn19aWYoaD09XCJub25lXCIpe312YXIgbj1udWxsO2lmKG0uandzYWxnMnNpZ2FsZ1tpLmFsZ109PT11bmRlZmluZWQpe3Rocm93XCJ1bnN1cHBvcnRlZCBhbGcgbmFtZTogXCIraH1lbHNle249bS5qd3NhbGcyc2lnYWxnW2hdfWlmKG49PVwibm9uZVwiKXt0aHJvd1wibm90IHN1cHBvcnRlZFwifWVsc2V7aWYobi5zdWJzdHIoMCw0KT09XCJIbWFjXCIpe3ZhciBrPW51bGw7aWYodD09PXVuZGVmaW5lZCl7dGhyb3dcImhleGFkZWNpbWFsIGtleSBzaGFsbCBiZSBzcGVjaWZpZWQgZm9yIEhNQUNcIn12YXIgZz1uZXcgS0pVUi5jcnlwdG8uTWFjKHthbGc6bixwYXNzOnR9KTtnLnVwZGF0ZVN0cmluZyhiKTtrPWcuZG9GaW5hbCgpO3JldHVybiByPT1rfWVsc2V7aWYobi5pbmRleE9mKFwid2l0aEVDRFNBXCIpIT0tMSl7dmFyIGY9bnVsbDt0cnl7Zj1LSlVSLmNyeXB0by5FQ0RTQS5jb25jYXRTaWdUb0FTTjFTaWcocil9Y2F0Y2gobyl7cmV0dXJuIGZhbHNlfXZhciBlPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpufSk7ZS5pbml0KHQpO2UudXBkYXRlU3RyaW5nKGIpO3JldHVybiBlLnZlcmlmeShmKX1lbHNle3ZhciBlPW5ldyBLSlVSLmNyeXB0by5TaWduYXR1cmUoe2FsZzpufSk7ZS5pbml0KHQpO2UudXBkYXRlU3RyaW5nKGIpO3JldHVybiBlLnZlcmlmeShyKX19fX07S0pVUi5qd3MuSldTLnBhcnNlPWZ1bmN0aW9uKGcpe3ZhciBjPWcuc3BsaXQoXCIuXCIpO3ZhciBiPXt9O3ZhciBmLGUsZDtpZihjLmxlbmd0aCE9MiYmYy5sZW5ndGghPTMpe3Rocm93XCJtYWxmb3JtZWQgc0pXUzogd3JvbmcgbnVtYmVyIG9mICcuJyBzcGxpdHRlZCBlbGVtZW50c1wifWY9Y1swXTtlPWNbMV07aWYoYy5sZW5ndGg9PTMpe2Q9Y1syXX1iLmhlYWRlck9iaj1LSlVSLmp3cy5KV1MucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgoZikpO2IucGF5bG9hZE9iaj1LSlVSLmp3cy5KV1MucmVhZFNhZmVKU09OU3RyaW5nKGI2NHV0b3V0ZjgoZSkpO2IuaGVhZGVyUFA9SlNPTi5zdHJpbmdpZnkoYi5oZWFkZXJPYmosbnVsbCxcIiAgXCIpO2lmKGIucGF5bG9hZE9iaj09bnVsbCl7Yi5wYXlsb2FkUFA9YjY0dXRvdXRmOChlKX1lbHNle2IucGF5bG9hZFBQPUpTT04uc3RyaW5naWZ5KGIucGF5bG9hZE9iaixudWxsLFwiICBcIil9aWYoZCE9PXVuZGVmaW5lZCl7Yi5zaWdIZXg9YjY0dXRvaGV4KGQpfXJldHVybiBifTtLSlVSLmp3cy5KV1MudmVyaWZ5SldUPWZ1bmN0aW9uKGQsaixsKXt2YXIgaD1LSlVSLmp3cy5KV1M7dmFyIGk9ZC5zcGxpdChcIi5cIik7dmFyIGM9aVswXTt2YXIgZz1pWzFdO3ZhciBtPWMrXCIuXCIrZzt2YXIgaz1iNjR1dG9oZXgoaVsyXSk7dmFyIGY9aC5yZWFkU2FmZUpTT05TdHJpbmcoYjY0dXRvdXRmOChjKSk7dmFyIGU9aC5yZWFkU2FmZUpTT05TdHJpbmcoYjY0dXRvdXRmOChnKSk7aWYoZi5hbGc9PT11bmRlZmluZWQpe3JldHVybiBmYWxzZX1pZihsLmFsZz09PXVuZGVmaW5lZCl7dGhyb3dcImFjY2VwdEZpZWxkLmFsZyBzaGFsbCBiZSBzcGVjaWZpZWRcIn1pZighaC5pbkFycmF5KGYuYWxnLGwuYWxnKSl7cmV0dXJuIGZhbHNlfWlmKGUuaXNzIT09dW5kZWZpbmVkJiZ0eXBlb2YgbC5pc3M9PT1cIm9iamVjdFwiKXtpZighaC5pbkFycmF5KGUuaXNzLGwuaXNzKSl7cmV0dXJuIGZhbHNlfX1pZihlLnN1YiE9PXVuZGVmaW5lZCYmdHlwZW9mIGwuc3ViPT09XCJvYmplY3RcIil7aWYoIWguaW5BcnJheShlLnN1YixsLnN1Yikpe3JldHVybiBmYWxzZX19aWYoZS5hdWQhPT11bmRlZmluZWQmJnR5cGVvZiBsLmF1ZD09PVwib2JqZWN0XCIpe2lmKHR5cGVvZiBlLmF1ZD09XCJzdHJpbmdcIil7aWYoIWguaW5BcnJheShlLmF1ZCxsLmF1ZCkpe3JldHVybiBmYWxzZX19ZWxzZXtpZih0eXBlb2YgZS5hdWQ9PVwib2JqZWN0XCIpe2lmKCFoLmluY2x1ZGVkQXJyYXkoZS5hdWQsbC5hdWQpKXtyZXR1cm4gZmFsc2V9fX19dmFyIGI9S0pVUi5qd3MuSW50RGF0ZS5nZXROb3coKTtpZihsLnZlcmlmeUF0IT09dW5kZWZpbmVkJiZ0eXBlb2YgbC52ZXJpZnlBdD09PVwibnVtYmVyXCIpe2I9bC52ZXJpZnlBdH1pZihsLmdyYWNlUGVyaW9kPT09dW5kZWZpbmVkfHx0eXBlb2YgbC5ncmFjZVBlcmlvZCE9PVwibnVtYmVyXCIpe2wuZ3JhY2VQZXJpb2Q9MH1pZihlLmV4cCE9PXVuZGVmaW5lZCYmdHlwZW9mIGUuZXhwPT1cIm51bWJlclwiKXtpZihlLmV4cCtsLmdyYWNlUGVyaW9kPGIpe3JldHVybiBmYWxzZX19aWYoZS5uYmYhPT11bmRlZmluZWQmJnR5cGVvZiBlLm5iZj09XCJudW1iZXJcIil7aWYoYjxlLm5iZi1sLmdyYWNlUGVyaW9kKXtyZXR1cm4gZmFsc2V9fWlmKGUuaWF0IT09dW5kZWZpbmVkJiZ0eXBlb2YgZS5pYXQ9PVwibnVtYmVyXCIpe2lmKGI8ZS5pYXQtbC5ncmFjZVBlcmlvZCl7cmV0dXJuIGZhbHNlfX1pZihlLmp0aSE9PXVuZGVmaW5lZCYmbC5qdGkhPT11bmRlZmluZWQpe2lmKGUuanRpIT09bC5qdGkpe3JldHVybiBmYWxzZX19aWYoIUtKVVIuandzLkpXUy52ZXJpZnkoZCxqLGwuYWxnKSl7cmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfTtLSlVSLmp3cy5KV1MuaW5jbHVkZWRBcnJheT1mdW5jdGlvbihiLGEpe3ZhciBkPUtKVVIuandzLkpXUy5pbkFycmF5O2lmKGI9PT1udWxsKXtyZXR1cm4gZmFsc2V9aWYodHlwZW9mIGIhPT1cIm9iamVjdFwiKXtyZXR1cm4gZmFsc2V9aWYodHlwZW9mIGIubGVuZ3RoIT09XCJudW1iZXJcIil7cmV0dXJuIGZhbHNlfWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXtpZighZChiW2NdLGEpKXtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfTtLSlVSLmp3cy5KV1MuaW5BcnJheT1mdW5jdGlvbihkLGIpe2lmKGI9PT1udWxsKXtyZXR1cm4gZmFsc2V9aWYodHlwZW9mIGIhPT1cIm9iamVjdFwiKXtyZXR1cm4gZmFsc2V9aWYodHlwZW9mIGIubGVuZ3RoIT09XCJudW1iZXJcIil7cmV0dXJuIGZhbHNlfWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXtpZihiW2NdPT1kKXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfTtLSlVSLmp3cy5KV1MuandzYWxnMnNpZ2FsZz17SFMyNTY6XCJIbWFjU0hBMjU2XCIsSFMzODQ6XCJIbWFjU0hBMzg0XCIsSFM1MTI6XCJIbWFjU0hBNTEyXCIsUlMyNTY6XCJTSEEyNTZ3aXRoUlNBXCIsUlMzODQ6XCJTSEEzODR3aXRoUlNBXCIsUlM1MTI6XCJTSEE1MTJ3aXRoUlNBXCIsRVMyNTY6XCJTSEEyNTZ3aXRoRUNEU0FcIixFUzM4NDpcIlNIQTM4NHdpdGhFQ0RTQVwiLFBTMjU2OlwiU0hBMjU2d2l0aFJTQWFuZE1HRjFcIixQUzM4NDpcIlNIQTM4NHdpdGhSU0FhbmRNR0YxXCIsUFM1MTI6XCJTSEE1MTJ3aXRoUlNBYW5kTUdGMVwiLG5vbmU6XCJub25lXCIsfTtLSlVSLmp3cy5KV1MuaXNTYWZlSlNPTlN0cmluZz1mdW5jdGlvbihjLGIsZCl7dmFyIGU9bnVsbDt0cnl7ZT1qc29uUGFyc2UoYyk7aWYodHlwZW9mIGUhPVwib2JqZWN0XCIpe3JldHVybiAwfWlmKGUuY29uc3RydWN0b3I9PT1BcnJheSl7cmV0dXJuIDB9aWYoYil7YltkXT1lfXJldHVybiAxfWNhdGNoKGEpe3JldHVybiAwfX07S0pVUi5qd3MuSldTLnJlYWRTYWZlSlNPTlN0cmluZz1mdW5jdGlvbihiKXt2YXIgYz1udWxsO3RyeXtjPWpzb25QYXJzZShiKTtpZih0eXBlb2YgYyE9XCJvYmplY3RcIil7cmV0dXJuIG51bGx9aWYoYy5jb25zdHJ1Y3Rvcj09PUFycmF5KXtyZXR1cm4gbnVsbH1yZXR1cm4gY31jYXRjaChhKXtyZXR1cm4gbnVsbH19O0tKVVIuandzLkpXUy5nZXRFbmNvZGVkU2lnbmF0dXJlVmFsdWVGcm9tSldTPWZ1bmN0aW9uKGEpe2lmKGEubWF0Y2goL15bXi5dK1xcLlteLl0rXFwuKFteLl0rKSQvKT09bnVsbCl7dGhyb3dcIkpXUyBzaWduYXR1cmUgaXMgbm90IGEgZm9ybSBvZiAnSGVhZC5QYXlsb2FkLlNpZ1ZhbHVlJy5cIn1yZXR1cm4gUmVnRXhwLiQxfTtLSlVSLmp3cy5KV1MuZ2V0SldLdGh1bWJwcmludD1mdW5jdGlvbihkKXtpZihkLmt0eSE9PVwiUlNBXCImJmQua3R5IT09XCJFQ1wiJiZkLmt0eSE9PVwib2N0XCIpe3Rocm93XCJ1bnN1cHBvcnRlZCBhbGdvcml0aG0gZm9yIEpXSyBUaHVtcHJpbnRcIn12YXIgYT1cIntcIjtpZihkLmt0eT09PVwiUlNBXCIpe2lmKHR5cGVvZiBkLm4hPVwic3RyaW5nXCJ8fHR5cGVvZiBkLmUhPVwic3RyaW5nXCIpe3Rocm93XCJ3cm9uZyBuIGFuZCBlIHZhbHVlIGZvciBSU0Ega2V5XCJ9YSs9J1wiZVwiOlwiJytkLmUrJ1wiLCc7YSs9J1wia3R5XCI6XCInK2Qua3R5KydcIiwnO2ErPSdcIm5cIjpcIicrZC5uKydcIn0nfWVsc2V7aWYoZC5rdHk9PT1cIkVDXCIpe2lmKHR5cGVvZiBkLmNydiE9XCJzdHJpbmdcInx8dHlwZW9mIGQueCE9XCJzdHJpbmdcInx8dHlwZW9mIGQueSE9XCJzdHJpbmdcIil7dGhyb3dcIndyb25nIGNydiwgeCBhbmQgeSB2YWx1ZSBmb3IgRUMga2V5XCJ9YSs9J1wiY3J2XCI6XCInK2QuY3J2KydcIiwnO2ErPSdcImt0eVwiOlwiJytkLmt0eSsnXCIsJzthKz0nXCJ4XCI6XCInK2QueCsnXCIsJzthKz0nXCJ5XCI6XCInK2QueSsnXCJ9J31lbHNle2lmKGQua3R5PT09XCJvY3RcIil7aWYodHlwZW9mIGQuayE9XCJzdHJpbmdcIil7dGhyb3dcIndyb25nIGsgdmFsdWUgZm9yIG9jdChzeW1tZXRyaWMpIGtleVwifWErPSdcImt0eVwiOlwiJytkLmt0eSsnXCIsJzthKz0nXCJrXCI6XCInK2QuaysnXCJ9J319fXZhciBiPXJzdHJ0b2hleChhKTt2YXIgYz1LSlVSLmNyeXB0by5VdGlsLmhhc2hIZXgoYixcInNoYTI1NlwiKTt2YXIgZT1oZXh0b2I2NHUoYyk7cmV0dXJuIGV9O0tKVVIuandzLkludERhdGU9e307S0pVUi5qd3MuSW50RGF0ZS5nZXQ9ZnVuY3Rpb24oYSl7aWYoYT09XCJub3dcIil7cmV0dXJuIEtKVVIuandzLkludERhdGUuZ2V0Tm93KCl9ZWxzZXtpZihhPT1cIm5vdyArIDFob3VyXCIpe3JldHVybiBLSlVSLmp3cy5JbnREYXRlLmdldE5vdygpKzYwKjYwfWVsc2V7aWYoYT09XCJub3cgKyAxZGF5XCIpe3JldHVybiBLSlVSLmp3cy5JbnREYXRlLmdldE5vdygpKzYwKjYwKjI0fWVsc2V7aWYoYT09XCJub3cgKyAxbW9udGhcIil7cmV0dXJuIEtKVVIuandzLkludERhdGUuZ2V0Tm93KCkrNjAqNjAqMjQqMzB9ZWxzZXtpZihhPT1cIm5vdyArIDF5ZWFyXCIpe3JldHVybiBLSlVSLmp3cy5JbnREYXRlLmdldE5vdygpKzYwKjYwKjI0KjM2NX1lbHNle2lmKGEubWF0Y2goL1okLykpe3JldHVybiBLSlVSLmp3cy5JbnREYXRlLmdldFp1bHUoYSl9ZWxzZXtpZihhLm1hdGNoKC9eWzAtOV0rJC8pKXtyZXR1cm4gcGFyc2VJbnQoYSl9fX19fX19dGhyb3dcInVuc3VwcG9ydGVkIGZvcm1hdDogXCIrYX07S0pVUi5qd3MuSW50RGF0ZS5nZXRadWx1PWZ1bmN0aW9uKGwpe3ZhciBrO2lmKGs9bC5tYXRjaCgvKFxcZCspKFxcZFxcZCkoXFxkXFxkKShcXGRcXGQpKFxcZFxcZCkoXFxkXFxkKVovKSl7dmFyIGI9UmVnRXhwLiQxO3ZhciBpPXBhcnNlSW50KGIpO2lmKGIubGVuZ3RoPT00KXt9ZWxzZXtpZihiLmxlbmd0aD09Mil7aWYoNTA8PWkmJmk8MTAwKXtpPTE5MDAraX1lbHNle2lmKDA8PWkmJmk8NTApe2k9MjAwMCtpfWVsc2V7dGhyb3dcIm1hbGZvcm1lZCB5ZWFyIHN0cmluZyBmb3IgVVRDVGltZVwifX19ZWxzZXt0aHJvd1wibWFsZm9ybWVkIHllYXIgc3RyaW5nXCJ9fXZhciBnPXBhcnNlSW50KFJlZ0V4cC4kMiktMTt2YXIgaj1wYXJzZUludChSZWdFeHAuJDMpO3ZhciBjPXBhcnNlSW50KFJlZ0V4cC4kNCk7dmFyIGU9cGFyc2VJbnQoUmVnRXhwLiQ1KTt2YXIgZj1wYXJzZUludChSZWdFeHAuJDYpO3ZhciBoPW5ldyBEYXRlKERhdGUuVVRDKGksZyxqLGMsZSxmKSk7cmV0dXJuIH5+KGgvMTAwMCl9dGhyb3dcInVuc3VwcG9ydGVkIGZvcm1hdDogXCIrbH07S0pVUi5qd3MuSW50RGF0ZS5nZXROb3c9ZnVuY3Rpb24oKXt2YXIgYT1+fihuZXcgRGF0ZSgpLzEwMDApO3JldHVybiBhfTtLSlVSLmp3cy5JbnREYXRlLmludERhdGUyVVRDU3RyaW5nPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBEYXRlKGEqMTAwMCk7cmV0dXJuIGIudG9VVENTdHJpbmcoKX07S0pVUi5qd3MuSW50RGF0ZS5pbnREYXRlMlp1bHU9ZnVuY3Rpb24oZSl7dmFyIGk9bmV3IERhdGUoZSoxMDAwKTt2YXIgaD0oXCIwMDAwXCIraS5nZXRVVENGdWxsWWVhcigpKS5zbGljZSgtNCk7dmFyIGc9KFwiMDBcIisoaS5nZXRVVENNb250aCgpKzEpKS5zbGljZSgtMik7dmFyIGI9KFwiMDBcIitpLmdldFVUQ0RhdGUoKSkuc2xpY2UoLTIpO3ZhciBhPShcIjAwXCIraS5nZXRVVENIb3VycygpKS5zbGljZSgtMik7dmFyIGM9KFwiMDBcIitpLmdldFVUQ01pbnV0ZXMoKSkuc2xpY2UoLTIpO3ZhciBmPShcIjAwXCIraS5nZXRVVENTZWNvbmRzKCkpLnNsaWNlKC0yKTtyZXR1cm4gaCtnK2IrYStjK2YrXCJaXCJ9O1xuLyohIGp3c2pzLTIuMC4xIChjKSAyMDEwLTIwMTUgS2VuamkgVXJ1c2hpbWEgfCBranVyLmdpdGh1Yi5jb20vanNqd3MvbGljZW5zZVxuICovXG5pZih0eXBlb2YgS0pVUj09XCJ1bmRlZmluZWRcInx8IUtKVVIpe0tKVVI9e319aWYodHlwZW9mIEtKVVIuandzPT1cInVuZGVmaW5lZFwifHwhS0pVUi5qd3Mpe0tKVVIuandzPXt9fUtKVVIuandzLkpXU0pTPWZ1bmN0aW9uKCl7dmFyIGE9S0pVUi5qd3MuSldTO3RoaXMuYUhlYWRlcj1bXTt0aGlzLnNQYXlsb2FkPVwiXCI7dGhpcy5hU2lnbmF0dXJlPVtdO3RoaXMuaW5pdD1mdW5jdGlvbigpe3RoaXMuYUhlYWRlcj1bXTt0aGlzLnNQYXlsb2FkPVwiXCI7dGhpcy5hU2lnbmF0dXJlPVtdfTt0aGlzLmluaXRXaXRoSldTPWZ1bmN0aW9uKGMpe3RoaXMuaW5pdCgpO3ZhciBiPW5ldyBLSlVSLmp3cy5KV1MoKTtiLnBhcnNlSldTKGMpO3RoaXMuYUhlYWRlci5wdXNoKGIucGFyc2VkSldTLmhlYWRCNjRVKTt0aGlzLnNQYXlsb2FkPWIucGFyc2VkSldTLnBheWxvYWRCNjRVO3RoaXMuYVNpZ25hdHVyZS5wdXNoKGIucGFyc2VkSldTLnNpZ3ZhbEI2NFUpfTt0aGlzLmFkZFNpZ25hdHVyZUJ5SGVhZGVyS2V5PWZ1bmN0aW9uKGUsYil7dmFyIGQ9YjY0dXRvdXRmOCh0aGlzLnNQYXlsb2FkKTt2YXIgYz1uZXcgS0pVUi5qd3MuSldTKCk7dmFyIGY9Yy5nZW5lcmF0ZUpXU0J5UDFQcnZLZXkoZSxkLGIpO3RoaXMuYUhlYWRlci5wdXNoKGMucGFyc2VkSldTLmhlYWRCNjRVKTt0aGlzLmFTaWduYXR1cmUucHVzaChjLnBhcnNlZEpXUy5zaWd2YWxCNjRVKX07dGhpcy5hZGRTaWduYXR1cmVCeUhlYWRlclBheWxvYWRLZXk9ZnVuY3Rpb24oZSxkLGIpe3ZhciBjPW5ldyBLSlVSLmp3cy5KV1MoKTt2YXIgZj1jLmdlbmVyYXRlSldTQnlQMVBydktleShlLGQsYik7dGhpcy5hSGVhZGVyLnB1c2goYy5wYXJzZWRKV1MuaGVhZEI2NFUpO3RoaXMuc1BheWxvYWQ9Yy5wYXJzZWRKV1MucGF5bG9hZEI2NFU7dGhpcy5hU2lnbmF0dXJlLnB1c2goYy5wYXJzZWRKV1Muc2lndmFsQjY0VSl9O3RoaXMudmVyaWZ5V2l0aENlcnRzPWZ1bmN0aW9uKGMpe2lmKHRoaXMuYUhlYWRlci5sZW5ndGghPWMubGVuZ3RoKXt0aHJvd1wibnVtIGhlYWRlcnMgZG9lcyBub3QgbWF0Y2ggd2l0aCBudW0gY2VydHNcIn1pZih0aGlzLmFTaWduYXR1cmUubGVuZ3RoIT1jLmxlbmd0aCl7dGhyb3dcIm51bSBzaWduYXR1cmVzIGRvZXMgbm90IG1hdGNoIHdpdGggbnVtIGNlcnRzXCJ9dmFyIGs9dGhpcy5zUGF5bG9hZDt2YXIgZz1cIlwiO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZT1jW2RdO3ZhciBmPXRoaXMuYUhlYWRlcltkXTt2YXIgbT10aGlzLmFTaWduYXR1cmVbZF07dmFyIGI9ZitcIi5cIitrK1wiLlwiK207dmFyIGo9bmV3IEtKVVIuandzLkpXUygpO3RyeXt2YXIgbD1qLnZlcmlmeUpXU0J5UGVtWDUwOUNlcnQoYixlKTtpZihsIT0xKXtnKz0oZCsxKStcInRoIHNpZ25hdHVyZSB1bm1hdGNoLiBcIn19Y2F0Y2goaCl7Zys9KGQrMSkrXCJ0aCBzaWduYXR1cmUgZmFpbChcIitoK1wiKS4gXCJ9fWlmKGc9PVwiXCIpe3JldHVybiAxfWVsc2V7dGhyb3cgZ319O3RoaXMucmVhZEpXU0pTPWZ1bmN0aW9uKGIpe3ZhciBjPWEucmVhZFNhZmVKU09OU3RyaW5nKGIpO2lmKGM9PW51bGwpe3Rocm93XCJhcmd1bWVudCBpcyBub3QgSlNPTiBzdHJpbmc6IFwiK2J9dGhpcy5hSGVhZGVyPWMuaGVhZGVyczt0aGlzLnNQYXlsb2FkPWMucGF5bG9hZDt0aGlzLmFTaWduYXR1cmU9Yy5zaWduYXR1cmVzfTt0aGlzLmdldEpTT049ZnVuY3Rpb24oKXtyZXR1cm57aGVhZGVyczp0aGlzLmFIZWFkZXIscGF5bG9hZDp0aGlzLnNQYXlsb2FkLHNpZ25hdHVyZXM6dGhpcy5hU2lnbmF0dXJlfX07dGhpcy5pc0VtcHR5PWZ1bmN0aW9uKCl7aWYodGhpcy5hSGVhZGVyLmxlbmd0aD09MCl7cmV0dXJuIDF9cmV0dXJuIDB9fTtcbi8qISBub2RldXRpbC0xLjAuMCAoYykgMjAxNSBLZW5qaSBVcnVzaGltYSB8IGtqdXIuZ2l0aHViLmNvbS9qc3JzYXNpZ24vbGljZW5zZVxuICovXG5mdW5jdGlvbiByZWFkRmlsZVVURjgoYSl7cmV0dXJuIHJlcXVpcmUoXCJmc1wiKS5yZWFkRmlsZVN5bmMoYSxcInV0ZjhcIil9ZnVuY3Rpb24gcmVhZEZpbGVIZXhCeUJpbihjKXt2YXIgYj1yZXF1aXJlKFwianNyc2FzaWduXCIpO3ZhciBhPXJlcXVpcmUoXCJmc1wiKTtyZXR1cm4gYi5yc3RydG9oZXgoYS5yZWFkRmlsZVN5bmMoYyxcImJpbmFyeVwiKSl9ZnVuY3Rpb24gcmVhZEZpbGUoYil7dmFyIGE9cmVxdWlyZShcImZzXCIpO3JldHVybiBhLnJlYWRGaWxlU3luYyhiLFwiYmluYXJ5XCIpfWZ1bmN0aW9uIHNhdmVGaWxlKGMsYil7dmFyIGE9cmVxdWlyZShcImZzXCIpO2Eud3JpdGVGaWxlU3luYyhjLGIsXCJiaW5hcnlcIil9ZnVuY3Rpb24gc2F2ZUZpbGVCaW5CeUhleChlLGIpe3ZhciBhPXJlcXVpcmUoXCJmc1wiKTt2YXIgYz1yZXF1aXJlKFwianNyc2FzaWduXCIpO3ZhciBkPWMuaGV4dG9yc3RyKGIpO2Eud3JpdGVGaWxlU3luYyhlLGQsXCJiaW5hcnlcIil9O1xuZXhwb3J0cy5TZWN1cmVSYW5kb20gPSBTZWN1cmVSYW5kb207XG5leHBvcnRzLnJuZ19zZWVkX3RpbWUgPSBybmdfc2VlZF90aW1lO1xuXG5leHBvcnRzLkJpZ0ludGVnZXIgPSBCaWdJbnRlZ2VyO1xuZXhwb3J0cy5SU0FLZXkgPSBSU0FLZXk7XG5leHBvcnRzLkVDRFNBID0gS0pVUi5jcnlwdG8uRUNEU0E7XG5leHBvcnRzLkRTQSA9IEtKVVIuY3J5cHRvLkRTQTtcbmV4cG9ydHMuU2lnbmF0dXJlID0gS0pVUi5jcnlwdG8uU2lnbmF0dXJlO1xuZXhwb3J0cy5NZXNzYWdlRGlnZXN0ID0gS0pVUi5jcnlwdG8uTWVzc2FnZURpZ2VzdDtcbmV4cG9ydHMuTWFjID0gS0pVUi5jcnlwdG8uTWFjO1xuZXhwb3J0cy5LRVlVVElMID0gS0VZVVRJTDtcbmV4cG9ydHMuQVNOMUhFWCA9IEFTTjFIRVg7XG5leHBvcnRzLlg1MDkgPSBYNTA5O1xuZXhwb3J0cy5DcnlwdG9KUyA9IENyeXB0b0pTO1xuXG4vLyBleHQvYmFzZTY0LmpzXG5leHBvcnRzLmI2NHRvaGV4ID0gYjY0dG9oZXg7XG5leHBvcnRzLmI2NHRvQkEgPSBiNjR0b0JBO1xuXG4vLyBiYXNlNjR4LmpzXG5leHBvcnRzLnN0b0JBID0gc3RvQkE7XG5leHBvcnRzLkJBdG9zID0gQkF0b3M7XG5leHBvcnRzLkJBdG9oZXggPSBCQXRvaGV4O1xuZXhwb3J0cy5zdG9oZXggPSBzdG9oZXg7XG5leHBvcnRzLnN0b2I2NCA9IHN0b2I2NDtcbmV4cG9ydHMuc3RvYjY0dSA9IHN0b2I2NHU7XG5leHBvcnRzLmI2NHV0b3MgPSBiNjR1dG9zO1xuZXhwb3J0cy5iNjR0b2I2NHUgPSBiNjR0b2I2NHU7XG5leHBvcnRzLmI2NHV0b2I2NCA9IGI2NHV0b2I2NDtcbmV4cG9ydHMuaGV4MmI2NCA9IGhleDJiNjQ7XG5leHBvcnRzLmhleHRvYjY0dSA9IGhleHRvYjY0dTtcbmV4cG9ydHMuYjY0dXRvaGV4ID0gYjY0dXRvaGV4O1xuZXhwb3J0cy5iNjR0b2hleCA9IGI2NHRvaGV4O1xuZXhwb3J0cy51dGY4dG9iNjR1ID0gdXRmOHRvYjY0dTtcbmV4cG9ydHMuYjY0dXRvdXRmOCA9IGI2NHV0b3V0Zjg7XG5leHBvcnRzLnV0Zjh0b2I2NCA9IHV0Zjh0b2I2NDtcbmV4cG9ydHMuYjY0dG91dGY4ID0gYjY0dG91dGY4O1xuZXhwb3J0cy51dGY4dG9oZXggPSB1dGY4dG9oZXg7XG5leHBvcnRzLmhleHRvdXRmOCA9IGhleHRvdXRmODtcbmV4cG9ydHMuaGV4dG9yc3RyID0gaGV4dG9yc3RyO1xuZXhwb3J0cy5yc3RydG9oZXggPSByc3RydG9oZXg7XG5leHBvcnRzLm5ld2xpbmVfdG9Vbml4ID0gbmV3bGluZV90b1VuaXg7XG5leHBvcnRzLm5ld2xpbmVfdG9Eb3MgPSBuZXdsaW5lX3RvRG9zO1xuZXhwb3J0cy5pbnRhcnlzdHJ0b2hleCA9IGludGFyeXN0cnRvaGV4O1xuZXhwb3J0cy5zdHJkaWZmaWR4ID0gc3RyZGlmZmlkeDtcblxuZXhwb3J0cy5jcnlwdG8gPSBLSlVSLmNyeXB0bztcbmV4cG9ydHMuYXNuMSA9IEtKVVIuYXNuMTtcbmV4cG9ydHMuandzID0gS0pVUi5qd3M7XG5cbmV4cG9ydHMucmVhZEZpbGVVVEY4ID0gcmVhZEZpbGVVVEY4O1xuZXhwb3J0cy5yZWFkRmlsZUhleEJ5QmluID0gcmVhZEZpbGVIZXhCeUJpbjtcbmV4cG9ydHMucmVhZEZpbGUgPSByZWFkRmlsZTtcbmV4cG9ydHMuc2F2ZUZpbGUgPSBzYXZlRmlsZTtcbmV4cG9ydHMuc2F2ZUZpbGVCaW5CeUhleCA9IHNhdmVGaWxlQmluQnlIZXg7XG5cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2pzcnNhc2lnbi9saWIvanNyc2FzaWduLmpzXG4gKiogbW9kdWxlIGlkID0gMzExXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbnZhciByb290UGFyZW50ID0ge31cblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBTYWZhcmkgNS03IGxhY2tzIHN1cHBvcnQgZm9yIGNoYW5naW5nIHRoZSBgT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvcmAgcHJvcGVydHlcbiAqICAgICBvbiBvYmplY3RzLlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgZnVuY3Rpb24gQmFyICgpIHt9XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLmZvbyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH1cbiAgICBhcnIuY29uc3RydWN0b3IgPSBCYXJcbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAgICAgICBhcnIuY29uc3RydWN0b3IgPT09IEJhciAmJiAvLyBjb25zdHJ1Y3RvciBjYW4gYmUgc2V0XG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbi8qKlxuICogQ2xhc3M6IEJ1ZmZlclxuICogPT09PT09PT09PT09PVxuICpcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgYXJlIGF1Z21lbnRlZFxuICogd2l0aCBmdW5jdGlvbiBwcm9wZXJ0aWVzIGZvciBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgQVBJIGZ1bmN0aW9ucy4gV2UgdXNlXG4gKiBgVWludDhBcnJheWAgc28gdGhhdCBzcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdCByZXR1cm5zXG4gKiBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBCeSBhdWdtZW50aW5nIHRoZSBpbnN0YW5jZXMsIHdlIGNhbiBhdm9pZCBtb2RpZnlpbmcgdGhlIGBVaW50OEFycmF5YFxuICogcHJvdG90eXBlLlxuICovXG5mdW5jdGlvbiBCdWZmZXIgKGFyZykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIC8vIEF2b2lkIGdvaW5nIHRocm91Z2ggYW4gQXJndW1lbnRzQWRhcHRvclRyYW1wb2xpbmUgaW4gdGhlIGNvbW1vbiBjYXNlLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBhcmd1bWVudHNbMV0pXG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnKVxuICB9XG5cbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXMubGVuZ3RoID0gMFxuICAgIHRoaXMucGFyZW50ID0gdW5kZWZpbmVkXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZyb21OdW1iZXIodGhpcywgYXJnKVxuICB9XG5cbiAgLy8gU2xpZ2h0bHkgbGVzcyBjb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhpcywgYXJnLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6ICd1dGY4JylcbiAgfVxuXG4gIC8vIFVudXN1YWwuXG4gIHJldHVybiBmcm9tT2JqZWN0KHRoaXMsIGFyZylcbn1cblxuZnVuY3Rpb24gZnJvbU51bWJlciAodGhhdCwgbGVuZ3RoKSB7XG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGggPCAwID8gMCA6IGNoZWNrZWQobGVuZ3RoKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGF0W2ldID0gMFxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykgZW5jb2RpbmcgPSAndXRmOCdcblxuICAvLyBBc3N1bXB0aW9uOiBieXRlTGVuZ3RoKCkgcmV0dXJuIHZhbHVlIGlzIGFsd2F5cyA8IGtNYXhMZW5ndGguXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuXG4gIHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAodGhhdCwgb2JqZWN0KSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqZWN0KSkgcmV0dXJuIGZyb21CdWZmZXIodGhhdCwgb2JqZWN0KVxuXG4gIGlmIChpc0FycmF5KG9iamVjdCkpIHJldHVybiBmcm9tQXJyYXkodGhhdCwgb2JqZWN0KVxuXG4gIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ211c3Qgc3RhcnQgd2l0aCBudW1iZXIsIGJ1ZmZlciwgYXJyYXkgb3Igc3RyaW5nJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKG9iamVjdC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgcmV0dXJuIGZyb21UeXBlZEFycmF5KHRoYXQsIG9iamVjdClcbiAgICB9XG4gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIG9iamVjdClcbiAgICB9XG4gIH1cblxuICBpZiAob2JqZWN0Lmxlbmd0aCkgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqZWN0KVxuXG4gIHJldHVybiBmcm9tSnNvbk9iamVjdCh0aGF0LCBvYmplY3QpXG59XG5cbmZ1bmN0aW9uIGZyb21CdWZmZXIgKHRoYXQsIGJ1ZmZlcikge1xuICB2YXIgbGVuZ3RoID0gY2hlY2tlZChidWZmZXIubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgYnVmZmVyLmNvcHkodGhhdCwgMCwgMCwgbGVuZ3RoKVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXkgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vLyBEdXBsaWNhdGUgb2YgZnJvbUFycmF5KCkgdG8ga2VlcCBmcm9tQXJyYXkoKSBtb25vbW9ycGhpYy5cbmZ1bmN0aW9uIGZyb21UeXBlZEFycmF5ICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuICAvLyBUcnVuY2F0aW5nIHRoZSBlbGVtZW50cyBpcyBwcm9iYWJseSBub3Qgd2hhdCBwZW9wbGUgZXhwZWN0IGZyb20gdHlwZWRcbiAgLy8gYXJyYXlzIHdpdGggQllURVNfUEVSX0VMRU1FTlQgPiAxIGJ1dCBpdCdzIGNvbXBhdGlibGUgd2l0aCB0aGUgYmVoYXZpb3JcbiAgLy8gb2YgdGhlIG9sZCBCdWZmZXIgY29uc3RydWN0b3IuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKHRoYXQsIGFycmF5KSB7XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIGFycmF5LmJ5dGVMZW5ndGhcbiAgICB0aGF0ID0gQnVmZmVyLl9hdWdtZW50KG5ldyBVaW50OEFycmF5KGFycmF5KSlcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdCA9IGZyb21UeXBlZEFycmF5KHRoYXQsIG5ldyBVaW50OEFycmF5KGFycmF5KSlcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLy8gRGVzZXJpYWxpemUgeyB0eXBlOiAnQnVmZmVyJywgZGF0YTogWzEsMiwzLC4uLl0gfSBpbnRvIGEgQnVmZmVyIG9iamVjdC5cbi8vIFJldHVybnMgYSB6ZXJvLWxlbmd0aCBidWZmZXIgZm9yIGlucHV0cyB0aGF0IGRvbid0IGNvbmZvcm0gdG8gdGhlIHNwZWMuXG5mdW5jdGlvbiBmcm9tSnNvbk9iamVjdCAodGhhdCwgb2JqZWN0KSB7XG4gIHZhciBhcnJheVxuICB2YXIgbGVuZ3RoID0gMFxuXG4gIGlmIChvYmplY3QudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmplY3QuZGF0YSkpIHtcbiAgICBhcnJheSA9IG9iamVjdC5kYXRhXG4gICAgbGVuZ3RoID0gY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB9XG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG59IGVsc2Uge1xuICAvLyBwcmUtc2V0IGZvciB2YWx1ZXMgdGhhdCBtYXkgZXhpc3QgaW4gdGhlIGZ1dHVyZVxuICBCdWZmZXIucHJvdG90eXBlLmxlbmd0aCA9IHVuZGVmaW5lZFxuICBCdWZmZXIucHJvdG90eXBlLnBhcmVudCA9IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBhbGxvY2F0ZSAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBCdWZmZXIuX2F1Z21lbnQobmV3IFVpbnQ4QXJyYXkobGVuZ3RoKSlcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgICB0aGF0Ll9pc0J1ZmZlciA9IHRydWVcbiAgfVxuXG4gIHZhciBmcm9tUG9vbCA9IGxlbmd0aCAhPT0gMCAmJiBsZW5ndGggPD0gQnVmZmVyLnBvb2xTaXplID4+PiAxXG4gIGlmIChmcm9tUG9vbCkgdGhhdC5wYXJlbnQgPSByb290UGFyZW50XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChzdWJqZWN0LCBlbmNvZGluZykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU2xvd0J1ZmZlcikpIHJldHVybiBuZXcgU2xvd0J1ZmZlcihzdWJqZWN0LCBlbmNvZGluZylcblxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihzdWJqZWN0LCBlbmNvZGluZylcbiAgZGVsZXRlIGJ1Zi5wYXJlbnRcbiAgcmV0dXJuIGJ1ZlxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgdmFyIGkgPSAwXG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSBicmVha1xuXG4gICAgKytpXG4gIH1cblxuICBpZiAoaSAhPT0gbGVuKSB7XG4gICAgeCA9IGFbaV1cbiAgICB5ID0gYltpXVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICdyYXcnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdsaXN0IGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycy4nKVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWYgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV1cbiAgICBpdGVtLmNvcHkoYnVmLCBwb3MpXG4gICAgcG9zICs9IGl0ZW0ubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykgc3RyaW5nID0gJycgKyBzdHJpbmdcblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgIC8vIERlcHJlY2F0ZWRcbiAgICAgIGNhc2UgJ3Jhdyc6XG4gICAgICBjYXNlICdyYXdzJzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICBzdGFydCA9IHN0YXJ0IHwgMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPT09IEluZmluaXR5ID8gdGhpcy5sZW5ndGggOiBlbmQgfCAwXG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcbiAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKGVuZCA8PSBzdGFydCkgcmV0dXJuICcnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYmluYXJ5U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8IDBcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiAwXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQpIHtcbiAgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICBieXRlT2Zmc2V0ID4+PSAwXG5cbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gdGhpcy5sZW5ndGgpIHJldHVybiAtMVxuXG4gIC8vIE5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gTWF0aC5tYXgodGhpcy5sZW5ndGggKyBieXRlT2Zmc2V0LCAwKVxuXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSByZXR1cm4gLTEgLy8gc3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcgYWx3YXlzIGZhaWxzXG4gICAgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHRoaXMsIHZhbCwgYnl0ZU9mZnNldClcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldClcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0aGlzLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YodGhpcywgWyB2YWwgXSwgYnl0ZU9mZnNldClcbiAgfVxuXG4gIGZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yICh2YXIgaSA9IDA7IGJ5dGVPZmZzZXQgKyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJyW2J5dGVPZmZzZXQgKyBpXSA9PT0gdmFsW2ZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4XSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbC5sZW5ndGgpIHJldHVybiBieXRlT2Zmc2V0ICsgZm91bmRJbmRleFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuLy8gYGdldGAgaXMgZGVwcmVjYXRlZFxuQnVmZmVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKG9mZnNldCkge1xuICBjb25zb2xlLmxvZygnLmdldCgpIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB1c2luZyBhcnJheSBpbmRleGVzIGluc3RlYWQuJylcbiAgcmV0dXJuIHRoaXMucmVhZFVJbnQ4KG9mZnNldClcbn1cblxuLy8gYHNldGAgaXMgZGVwcmVjYXRlZFxuQnVmZmVyLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBzZXQgKHYsIG9mZnNldCkge1xuICBjb25zb2xlLmxvZygnLnNldCgpIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB1c2luZyBhcnJheSBpbmRleGVzIGluc3RlYWQuJylcbiAgcmV0dXJuIHRoaXMud3JpdGVVSW50OCh2LCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmluYXJ5V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHZhciBzd2FwID0gZW5jb2RpbmdcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIG9mZnNldCA9IGxlbmd0aCB8IDBcbiAgICBsZW5ndGggPSBzd2FwXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGJpbmFyeVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gYmluYXJ5U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIG5ld0J1ZiA9IEJ1ZmZlci5fYXVnbWVudCh0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpKVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47IGkrKykge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9XG5cbiAgaWYgKG5ld0J1Zi5sZW5ndGgpIG5ld0J1Zi5wYXJlbnQgPSB0aGlzLnBhcmVudCB8fCB0aGlzXG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdidWZmZXIgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3ZhbHVlIGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpLCAwKVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpLCAwKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7IGkrKykge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyBpKyspIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gdmFsdWUgPCAwID8gMSA6IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSB2YWx1ZSA8IDAgPyAxIDogMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCd2YWx1ZSBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdpbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0Ll9zZXQodGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLCB0YXJnZXRTdGFydClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gZmlsbCh2YWx1ZSwgc3RhcnQ9MCwgZW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXZhbHVlKSB2YWx1ZSA9IDBcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kKSBlbmQgPSB0aGlzLmxlbmd0aFxuXG4gIGlmIChlbmQgPCBzdGFydCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2VuZCA8IHN0YXJ0JylcblxuICAvLyBGaWxsIDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVyblxuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDAgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdlbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICB0aGlzW2ldID0gdmFsdWVcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gdXRmOFRvQnl0ZXModmFsdWUudG9TdHJpbmcoKSlcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgdGhpc1tpXSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGBBcnJheUJ1ZmZlcmAgd2l0aCB0aGUgKmNvcGllZCogbWVtb3J5IG9mIHRoZSBidWZmZXIgaW5zdGFuY2UuXG4gKiBBZGRlZCBpbiBOb2RlIDAuMTIuIE9ubHkgYXZhaWxhYmxlIGluIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBBcnJheUJ1ZmZlci5cbiAqL1xuQnVmZmVyLnByb3RvdHlwZS50b0FycmF5QnVmZmVyID0gZnVuY3Rpb24gdG9BcnJheUJ1ZmZlciAoKSB7XG4gIGlmICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAgIHJldHVybiAobmV3IEJ1ZmZlcih0aGlzKSkuYnVmZmVyXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheSh0aGlzLmxlbmd0aClcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgYnVmW2ldID0gdGhpc1tpXVxuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1Zi5idWZmZXJcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQnVmZmVyLnRvQXJyYXlCdWZmZXIgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXInKVxuICB9XG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIEJQID0gQnVmZmVyLnByb3RvdHlwZVxuXG4vKipcbiAqIEF1Z21lbnQgYSBVaW50OEFycmF5ICppbnN0YW5jZSogKG5vdCB0aGUgVWludDhBcnJheSBjbGFzcyEpIHdpdGggQnVmZmVyIG1ldGhvZHNcbiAqL1xuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gX2F1Z21lbnQgKGFycikge1xuICBhcnIuY29uc3RydWN0b3IgPSBCdWZmZXJcbiAgYXJyLl9pc0J1ZmZlciA9IHRydWVcblxuICAvLyBzYXZlIHJlZmVyZW5jZSB0byBvcmlnaW5hbCBVaW50OEFycmF5IHNldCBtZXRob2QgYmVmb3JlIG92ZXJ3cml0aW5nXG4gIGFyci5fc2V0ID0gYXJyLnNldFxuXG4gIC8vIGRlcHJlY2F0ZWRcbiAgYXJyLmdldCA9IEJQLmdldFxuICBhcnIuc2V0ID0gQlAuc2V0XG5cbiAgYXJyLndyaXRlID0gQlAud3JpdGVcbiAgYXJyLnRvU3RyaW5nID0gQlAudG9TdHJpbmdcbiAgYXJyLnRvTG9jYWxlU3RyaW5nID0gQlAudG9TdHJpbmdcbiAgYXJyLnRvSlNPTiA9IEJQLnRvSlNPTlxuICBhcnIuZXF1YWxzID0gQlAuZXF1YWxzXG4gIGFyci5jb21wYXJlID0gQlAuY29tcGFyZVxuICBhcnIuaW5kZXhPZiA9IEJQLmluZGV4T2ZcbiAgYXJyLmNvcHkgPSBCUC5jb3B5XG4gIGFyci5zbGljZSA9IEJQLnNsaWNlXG4gIGFyci5yZWFkVUludExFID0gQlAucmVhZFVJbnRMRVxuICBhcnIucmVhZFVJbnRCRSA9IEJQLnJlYWRVSW50QkVcbiAgYXJyLnJlYWRVSW50OCA9IEJQLnJlYWRVSW50OFxuICBhcnIucmVhZFVJbnQxNkxFID0gQlAucmVhZFVJbnQxNkxFXG4gIGFyci5yZWFkVUludDE2QkUgPSBCUC5yZWFkVUludDE2QkVcbiAgYXJyLnJlYWRVSW50MzJMRSA9IEJQLnJlYWRVSW50MzJMRVxuICBhcnIucmVhZFVJbnQzMkJFID0gQlAucmVhZFVJbnQzMkJFXG4gIGFyci5yZWFkSW50TEUgPSBCUC5yZWFkSW50TEVcbiAgYXJyLnJlYWRJbnRCRSA9IEJQLnJlYWRJbnRCRVxuICBhcnIucmVhZEludDggPSBCUC5yZWFkSW50OFxuICBhcnIucmVhZEludDE2TEUgPSBCUC5yZWFkSW50MTZMRVxuICBhcnIucmVhZEludDE2QkUgPSBCUC5yZWFkSW50MTZCRVxuICBhcnIucmVhZEludDMyTEUgPSBCUC5yZWFkSW50MzJMRVxuICBhcnIucmVhZEludDMyQkUgPSBCUC5yZWFkSW50MzJCRVxuICBhcnIucmVhZEZsb2F0TEUgPSBCUC5yZWFkRmxvYXRMRVxuICBhcnIucmVhZEZsb2F0QkUgPSBCUC5yZWFkRmxvYXRCRVxuICBhcnIucmVhZERvdWJsZUxFID0gQlAucmVhZERvdWJsZUxFXG4gIGFyci5yZWFkRG91YmxlQkUgPSBCUC5yZWFkRG91YmxlQkVcbiAgYXJyLndyaXRlVUludDggPSBCUC53cml0ZVVJbnQ4XG4gIGFyci53cml0ZVVJbnRMRSA9IEJQLndyaXRlVUludExFXG4gIGFyci53cml0ZVVJbnRCRSA9IEJQLndyaXRlVUludEJFXG4gIGFyci53cml0ZVVJbnQxNkxFID0gQlAud3JpdGVVSW50MTZMRVxuICBhcnIud3JpdGVVSW50MTZCRSA9IEJQLndyaXRlVUludDE2QkVcbiAgYXJyLndyaXRlVUludDMyTEUgPSBCUC53cml0ZVVJbnQzMkxFXG4gIGFyci53cml0ZVVJbnQzMkJFID0gQlAud3JpdGVVSW50MzJCRVxuICBhcnIud3JpdGVJbnRMRSA9IEJQLndyaXRlSW50TEVcbiAgYXJyLndyaXRlSW50QkUgPSBCUC53cml0ZUludEJFXG4gIGFyci53cml0ZUludDggPSBCUC53cml0ZUludDhcbiAgYXJyLndyaXRlSW50MTZMRSA9IEJQLndyaXRlSW50MTZMRVxuICBhcnIud3JpdGVJbnQxNkJFID0gQlAud3JpdGVJbnQxNkJFXG4gIGFyci53cml0ZUludDMyTEUgPSBCUC53cml0ZUludDMyTEVcbiAgYXJyLndyaXRlSW50MzJCRSA9IEJQLndyaXRlSW50MzJCRVxuICBhcnIud3JpdGVGbG9hdExFID0gQlAud3JpdGVGbG9hdExFXG4gIGFyci53cml0ZUZsb2F0QkUgPSBCUC53cml0ZUZsb2F0QkVcbiAgYXJyLndyaXRlRG91YmxlTEUgPSBCUC53cml0ZURvdWJsZUxFXG4gIGFyci53cml0ZURvdWJsZUJFID0gQlAud3JpdGVEb3VibGVCRVxuICBhcnIuZmlsbCA9IEJQLmZpbGxcbiAgYXJyLmluc3BlY3QgPSBCUC5pbnNwZWN0XG4gIGFyci50b0FycmF5QnVmZmVyID0gQlAudG9BcnJheUJ1ZmZlclxuXG4gIHJldHVybiBhcnJcbn1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqICh3ZWJwYWNrKS9+L25vZGUtbGlicy1icm93c2VyL34vYnVmZmVyL2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMzEyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgbG9va3VwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG47KGZ1bmN0aW9uIChleHBvcnRzKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuICB2YXIgQXJyID0gKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJylcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IEFycmF5XG5cblx0dmFyIFBMVVMgICA9ICcrJy5jaGFyQ29kZUF0KDApXG5cdHZhciBTTEFTSCAgPSAnLycuY2hhckNvZGVBdCgwKVxuXHR2YXIgTlVNQkVSID0gJzAnLmNoYXJDb2RlQXQoMClcblx0dmFyIExPV0VSICA9ICdhJy5jaGFyQ29kZUF0KDApXG5cdHZhciBVUFBFUiAgPSAnQScuY2hhckNvZGVBdCgwKVxuXHR2YXIgUExVU19VUkxfU0FGRSA9ICctJy5jaGFyQ29kZUF0KDApXG5cdHZhciBTTEFTSF9VUkxfU0FGRSA9ICdfJy5jaGFyQ29kZUF0KDApXG5cblx0ZnVuY3Rpb24gZGVjb2RlIChlbHQpIHtcblx0XHR2YXIgY29kZSA9IGVsdC5jaGFyQ29kZUF0KDApXG5cdFx0aWYgKGNvZGUgPT09IFBMVVMgfHxcblx0XHQgICAgY29kZSA9PT0gUExVU19VUkxfU0FGRSlcblx0XHRcdHJldHVybiA2MiAvLyAnKydcblx0XHRpZiAoY29kZSA9PT0gU0xBU0ggfHxcblx0XHQgICAgY29kZSA9PT0gU0xBU0hfVVJMX1NBRkUpXG5cdFx0XHRyZXR1cm4gNjMgLy8gJy8nXG5cdFx0aWYgKGNvZGUgPCBOVU1CRVIpXG5cdFx0XHRyZXR1cm4gLTEgLy9ubyBtYXRjaFxuXHRcdGlmIChjb2RlIDwgTlVNQkVSICsgMTApXG5cdFx0XHRyZXR1cm4gY29kZSAtIE5VTUJFUiArIDI2ICsgMjZcblx0XHRpZiAoY29kZSA8IFVQUEVSICsgMjYpXG5cdFx0XHRyZXR1cm4gY29kZSAtIFVQUEVSXG5cdFx0aWYgKGNvZGUgPCBMT1dFUiArIDI2KVxuXHRcdFx0cmV0dXJuIGNvZGUgLSBMT1dFUiArIDI2XG5cdH1cblxuXHRmdW5jdGlvbiBiNjRUb0J5dGVBcnJheSAoYjY0KSB7XG5cdFx0dmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcblxuXHRcdGlmIChiNjQubGVuZ3RoICUgNCA+IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG5cdFx0fVxuXG5cdFx0Ly8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcblx0XHQvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG5cdFx0Ly8gcmVwcmVzZW50IG9uZSBieXRlXG5cdFx0Ly8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG5cdFx0Ly8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuXHRcdHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cdFx0cGxhY2VIb2xkZXJzID0gJz0nID09PSBiNjQuY2hhckF0KGxlbiAtIDIpID8gMiA6ICc9JyA9PT0gYjY0LmNoYXJBdChsZW4gLSAxKSA/IDEgOiAwXG5cblx0XHQvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcblx0XHRhcnIgPSBuZXcgQXJyKGI2NC5sZW5ndGggKiAzIC8gNCAtIHBsYWNlSG9sZGVycylcblxuXHRcdC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcblx0XHRsID0gcGxhY2VIb2xkZXJzID4gMCA/IGI2NC5sZW5ndGggLSA0IDogYjY0Lmxlbmd0aFxuXG5cdFx0dmFyIEwgPSAwXG5cblx0XHRmdW5jdGlvbiBwdXNoICh2KSB7XG5cdFx0XHRhcnJbTCsrXSA9IHZcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDE4KSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDEyKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMikpIDw8IDYpIHwgZGVjb2RlKGI2NC5jaGFyQXQoaSArIDMpKVxuXHRcdFx0cHVzaCgodG1wICYgMHhGRjAwMDApID4+IDE2KVxuXHRcdFx0cHVzaCgodG1wICYgMHhGRjAwKSA+PiA4KVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH1cblxuXHRcdGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcblx0XHRcdHRtcCA9IChkZWNvZGUoYjY0LmNoYXJBdChpKSkgPDwgMikgfCAoZGVjb2RlKGI2NC5jaGFyQXQoaSArIDEpKSA+PiA0KVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDEwKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDQpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAyKSkgPj4gMilcblx0XHRcdHB1c2goKHRtcCA+PiA4KSAmIDB4RkYpXG5cdFx0XHRwdXNoKHRtcCAmIDB4RkYpXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFyclxuXHR9XG5cblx0ZnVuY3Rpb24gdWludDhUb0Jhc2U2NCAodWludDgpIHtcblx0XHR2YXIgaSxcblx0XHRcdGV4dHJhQnl0ZXMgPSB1aW50OC5sZW5ndGggJSAzLCAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuXHRcdFx0b3V0cHV0ID0gXCJcIixcblx0XHRcdHRlbXAsIGxlbmd0aFxuXG5cdFx0ZnVuY3Rpb24gZW5jb2RlIChudW0pIHtcblx0XHRcdHJldHVybiBsb29rdXAuY2hhckF0KG51bSlcblx0XHR9XG5cblx0XHRmdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuXHRcdFx0cmV0dXJuIGVuY29kZShudW0gPj4gMTggJiAweDNGKSArIGVuY29kZShudW0gPj4gMTIgJiAweDNGKSArIGVuY29kZShudW0gPj4gNiAmIDB4M0YpICsgZW5jb2RlKG51bSAmIDB4M0YpXG5cdFx0fVxuXG5cdFx0Ly8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuXHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IHVpbnQ4Lmxlbmd0aCAtIGV4dHJhQnl0ZXM7IGkgPCBsZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0dGVtcCA9ICh1aW50OFtpXSA8PCAxNikgKyAodWludDhbaSArIDFdIDw8IDgpICsgKHVpbnQ4W2kgKyAyXSlcblx0XHRcdG91dHB1dCArPSB0cmlwbGV0VG9CYXNlNjQodGVtcClcblx0XHR9XG5cblx0XHQvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG5cdFx0c3dpdGNoIChleHRyYUJ5dGVzKSB7XG5cdFx0XHRjYXNlIDE6XG5cdFx0XHRcdHRlbXAgPSB1aW50OFt1aW50OC5sZW5ndGggLSAxXVxuXHRcdFx0XHRvdXRwdXQgKz0gZW5jb2RlKHRlbXAgPj4gMilcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA8PCA0KSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSAnPT0nXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdHRlbXAgPSAodWludDhbdWludDgubGVuZ3RoIC0gMl0gPDwgOCkgKyAodWludDhbdWludDgubGVuZ3RoIC0gMV0pXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUodGVtcCA+PiAxMClcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA+PiA0KSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUoKHRlbXAgPDwgMikgJiAweDNGKVxuXHRcdFx0XHRvdXRwdXQgKz0gJz0nXG5cdFx0XHRcdGJyZWFrXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG91dHB1dFxuXHR9XG5cblx0ZXhwb3J0cy50b0J5dGVBcnJheSA9IGI2NFRvQnl0ZUFycmF5XG5cdGV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IHVpbnQ4VG9CYXNlNjRcbn0odHlwZW9mIGV4cG9ydHMgPT09ICd1bmRlZmluZWQnID8gKHRoaXMuYmFzZTY0anMgPSB7fSkgOiBleHBvcnRzKSlcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9idWZmZXIvfi9iYXNlNjQtanMvbGliL2I2NC5qc1xuICoqIG1vZHVsZSBpZCA9IDMxM1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAodmFsdWUgKiBjIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqICh3ZWJwYWNrKS9+L25vZGUtbGlicy1icm93c2VyL34vYnVmZmVyL34vaWVlZTc1NC9pbmRleC5qc1xuICoqIG1vZHVsZSBpZCA9IDMxNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqICh3ZWJwYWNrKS9+L25vZGUtbGlicy1icm93c2VyL34vYnVmZmVyL34vaXNhcnJheS9pbmRleC5qc1xuICoqIG1vZHVsZSBpZCA9IDMxNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgVXJsVXRpbGl0eSBmcm9tICcuL1VybFV0aWxpdHknO1xuaW1wb3J0IFNpZ25pblN0YXRlIGZyb20gJy4vU2lnbmluU3RhdGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaWduaW5SZXF1ZXN0IHtcbiAgICBjb25zdHJ1Y3Rvcih7XG4gICAgICAgIC8vIG1hbmRhdG9yeVxuICAgICAgICB1cmwsIGNsaWVudF9pZCwgcmVkaXJlY3RfdXJpLCByZXNwb25zZV90eXBlLCBzY29wZSwgYXV0aG9yaXR5LFxuICAgICAgICAvLyBvcHRpb25hbFxuICAgICAgICBkYXRhLCBwcm9tcHQsIGRpc3BsYXksIG1heF9hZ2UsIHVpX2xvY2FsZXMsIGlkX3Rva2VuX2hpbnQsIGxvZ2luX2hpbnQsIGFjcl92YWx1ZXNcbiAgICB9KSB7XG4gICAgICAgIGlmICghdXJsKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyB1cmwgcGFzc2VkIHRvIFNpZ25pblJlcXVlc3RcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1cmxcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjbGllbnRfaWQpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIGNsaWVudF9pZCBwYXNzZWQgdG8gU2lnbmluUmVxdWVzdFwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNsaWVudF9pZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlZGlyZWN0X3VyaSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gcmVkaXJlY3RfdXJpIHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVkaXJlY3RfdXJpXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVzcG9uc2VfdHlwZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gcmVzcG9uc2VfdHlwZSBwYXNzZWQgdG8gU2lnbmluUmVxdWVzdFwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlc3BvbnNlX3R5cGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzY29wZSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2NvcGUgcGFzc2VkIHRvIFNpZ25pblJlcXVlc3RcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzY29wZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWF1dGhvcml0eSkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gYXV0aG9yaXR5IHBhc3NlZCB0byBTaWduaW5SZXF1ZXN0XCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXV0aG9yaXR5XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9pZGMgPSBTaWduaW5SZXF1ZXN0LmlzT2lkYyhyZXNwb25zZV90eXBlKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IG5ldyBTaWduaW5TdGF0ZSh7IG5vbmNlOiBvaWRjLCBkYXRhLCBjbGllbnRfaWQsIGF1dGhvcml0eSB9KTtcblxuICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcImNsaWVudF9pZFwiLCBjbGllbnRfaWQpO1xuICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInJlZGlyZWN0X3VyaVwiLCByZWRpcmVjdF91cmkpO1xuICAgICAgICB1cmwgPSBVcmxVdGlsaXR5LmFkZFF1ZXJ5UGFyYW0odXJsLCBcInJlc3BvbnNlX3R5cGVcIiwgcmVzcG9uc2VfdHlwZSk7XG4gICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwic2NvcGVcIiwgc2NvcGUpO1xuICAgICAgICBcbiAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJzdGF0ZVwiLCB0aGlzLnN0YXRlLmlkKTtcbiAgICAgICAgaWYgKG9pZGMpIHtcbiAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwibm9uY2VcIiwgdGhpcy5zdGF0ZS5ub25jZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb3B0aW9uYWwgPSB7IHByb21wdCwgZGlzcGxheSwgbWF4X2FnZSwgdWlfbG9jYWxlcywgaWRfdG9rZW5faGludCwgbG9naW5faGludCwgYWNyX3ZhbHVlcyB9O1xuICAgICAgICBmb3IobGV0IGtleSBpbiBvcHRpb25hbCl7XG4gICAgICAgICAgICBpZiAob3B0aW9uYWxba2V5XSkge1xuICAgICAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIGtleSwgb3B0aW9uYWxba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNPaWRjKHJlc3BvbnNlX3R5cGUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlc3BvbnNlX3R5cGUuc3BsaXQoL1xccysvZykuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtID09PSBcImlkX3Rva2VuXCI7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gISEocmVzdWx0WzBdKTtcbiAgICB9XG4gICAgXG4gICAgc3RhdGljIGlzT0F1dGgocmVzcG9uc2VfdHlwZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVzcG9uc2VfdHlwZS5zcGxpdCgvXFxzKy9nKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0gPT09IFwidG9rZW5cIjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAhIShyZXN1bHRbMF0pO1xuICAgIH1cbn1cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9TaWduaW5SZXF1ZXN0LmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXJsVXRpbGl0eSB7XG4gICAgc3RhdGljIGFkZFF1ZXJ5UGFyYW0odXJsLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodXJsLmluZGV4T2YoJz8nKSA8IDApIHtcbiAgICAgICAgICAgIHVybCArPSBcIj9cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cmxbdXJsLmxlbmd0aCAtIDFdICE9PSBcIj9cIikge1xuICAgICAgICAgICAgdXJsICs9IFwiJlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgdXJsICs9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKTtcbiAgICAgICAgdXJsICs9IFwiPVwiO1xuICAgICAgICB1cmwgKz0gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZVVybEZyYWdtZW50KHZhbHVlLCBkZWxpbWl0ZXIgPSBcIiNcIiwgZ2xvYmFsID0gR2xvYmFsKSB7XG4gICAgICAgIExvZy5pbmZvKFwiVXJsVXRpbGl0eS5wYXJzZVVybEZyYWdtZW50XCIpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKXtcbiAgICAgICAgICAgIHZhbHVlID0gZ2xvYmFsLmxvY2F0aW9uLmhyZWY7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaWR4ID0gdmFsdWUubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcbiAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cihpZHggKyAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwYXJhbXMgPSB7fSxcbiAgICAgICAgICAgIHJlZ2V4ID0gLyhbXiY9XSspPShbXiZdKikvZyxcbiAgICAgICAgICAgIG07XG5cbiAgICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgICB3aGlsZSAobSA9IHJlZ2V4LmV4ZWModmFsdWUpKSB7XG4gICAgICAgICAgICBwYXJhbXNbZGVjb2RlVVJJQ29tcG9uZW50KG1bMV0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChtWzJdKTtcbiAgICAgICAgICAgIGlmIChjb3VudGVyKysgPiA1MCkge1xuICAgICAgICAgICAgICAgIExvZy5lcnJvcihcInJlc3BvbnNlIGV4Y2VlZGVkIGV4cGVjdGVkIG51bWJlciBvZiBwYXJhbWV0ZXJzXCIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcjogXCJSZXNwb25zZSBleGNlZWRlZCBleHBlY3RlZCBudW1iZXIgb2YgcGFyYW1ldGVyc1wiXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIHByb3AgaW4gcGFyYW1zKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge307XG4gICAgfVxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1VybFV0aWxpdHkuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBTdGF0ZSBmcm9tICcuL1N0YXRlJztcbmltcG9ydCByYW5kb20gZnJvbSAnLi9yYW5kb20nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaWduaW5TdGF0ZSBleHRlbmRzIFN0YXRlIHtcbiAgICBjb25zdHJ1Y3Rvcih7bm9uY2UsIGF1dGhvcml0eSwgY2xpZW50X2lkfSA9IHt9KSB7XG4gICAgICAgIHN1cGVyKGFyZ3VtZW50c1swXSk7XG4gICAgICAgIFxuICAgICAgICBpZiAobm9uY2UgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuX25vbmNlID0gcmFuZG9tKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9uY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX25vbmNlID0gbm9uY2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMuX2F1dGhvcml0eSA9IGF1dGhvcml0eTtcbiAgICAgICAgdGhpcy5fY2xpZW50X2lkID0gY2xpZW50X2lkO1xuICAgIH1cblxuICAgIGdldCBub25jZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vbmNlO1xuICAgIH1cbiAgICBnZXQgYXV0aG9yaXR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXV0aG9yaXR5O1xuICAgIH1cbiAgICBnZXQgY2xpZW50X2lkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50X2lkO1xuICAgIH1cbiAgICBcbiAgICB0b1N0b3JhZ2VTdHJpbmcoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiU2lnbmluU3RhdGUudG9TdG9yYWdlU3RyaW5nXCIpO1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBkYXRhOiB0aGlzLmRhdGEsXG4gICAgICAgICAgICBjcmVhdGVkOiB0aGlzLmNyZWF0ZWQsXG4gICAgICAgICAgICBub25jZTogdGhpcy5ub25jZSxcbiAgICAgICAgICAgIGF1dGhvcml0eTogdGhpcy5hdXRob3JpdHksXG4gICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMuY2xpZW50X2lkXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tU3RvcmFnZVN0cmluZyhzdG9yYWdlU3RyaW5nKSB7XG4gICAgICAgIExvZy5pbmZvKFwiU2lnbmluU3RhdGUuZnJvbVN0b3JhZ2VTdHJpbmdcIik7XG4gICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShzdG9yYWdlU3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduaW5TdGF0ZShkYXRhKTtcbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9TaWduaW5TdGF0ZS5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IHJhbmRvbSBmcm9tICcuL3JhbmRvbSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXRlIHtcbiAgICBjb25zdHJ1Y3Rvcih7aWQsIGRhdGEsIGNyZWF0ZWR9ID0ge30pIHtcbiAgICAgICAgdGhpcy5faWQgPSBpZCB8fCByYW5kb20oKTtcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjcmVhdGVkID09PSAnbnVtYmVyJyAmJiBjcmVhdGVkID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlZCA9IGNyZWF0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVkID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faWQ7XG4gICAgfVxuICAgIGdldCBkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG4gICAgZ2V0IGNyZWF0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVkO1xuICAgIH1cblxuICAgIHRvU3RvcmFnZVN0cmluZygpIHtcbiAgICAgICAgTG9nLmluZm8oXCJTdGF0ZS50b1N0b3JhZ2VTdHJpbmdcIik7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgICAgICAgIGNyZWF0ZWQ6IHRoaXMuY3JlYXRlZFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgc3RhdGljIGZyb21TdG9yYWdlU3RyaW5nKHN0b3JhZ2VTdHJpbmcpIHtcbiAgICAgICAgTG9nLmluZm8oXCJTdGF0ZS5mcm9tU3RvcmFnZVN0cmluZ1wiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZShKU09OLnBhcnNlKHN0b3JhZ2VTdHJpbmcpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY2xlYXJTdGFsZVN0YXRlKHN0b3JhZ2UsIGFnZSkge1xuICAgICAgICBMb2cuaW5mbyhcIlN0YXRlLmNsZWFyU3RhbGVTdGF0ZVwiKTtcblxuICAgICAgICB2YXIgY3V0b2ZmID0gRGF0ZS5ub3coKSAvIDEwMDAgLSBhZ2U7XG5cbiAgICAgICAgcmV0dXJuIHN0b3JhZ2UuZ2V0QWxsS2V5cygpLnRoZW4oa2V5cyA9PiB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcImdvdCBrZXlzXCIsIGtleXMpO1xuXG4gICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHAgPSBzdG9yYWdlLmdldChrZXkpLnRoZW4oaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZW1vdmUgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBTdGF0ZS5mcm9tU3RvcmFnZVN0cmluZyhpdGVtKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJnb3QgaXRlbSBmcm9tIGtleTogXCIsIGtleSwgc3RhdGUuY3JlYXRlZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuY3JlYXRlZCA8PSBjdXRvZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lcnJvcihcIkVycm9yIHBhcnNpbmcgc3RhdGUgZm9yIGtleVwiLCBrZXksIGUubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwibm8gaXRlbSBpbiBzdG9yYWdlIGZvciBrZXk6IFwiLCBrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwicmVtb3ZlZCBpdGVtIGZvciBrZXk6IFwiLCBrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2gocCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIExvZy5pbmZvKFwid2FpdGluZyBvbiBwcm9taXNlIGNvdW50OlwiLCBwcm9taXNlcy5sZW5ndGgpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvU3RhdGUuanNcbiAqKi8iLCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFkYWxKUyB2MS4wLjhcbi8vIEBwcmVzZXJ2ZSBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBPcGVuIFRlY2hub2xvZ2llcywgSW5jLlxuLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZFxuLy8gQXBhY2hlIExpY2Vuc2UgMi4wXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE5PVElDRTogdGhlIGNvZGUgaW4gdGhpcyBmaWxlIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IE1pY3Jvc29mdFxuLy8gb3JpZ2luYWwgc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vQXp1cmVBRC9henVyZS1hY3RpdmVkaXJlY3RvcnktbGlicmFyeS1mb3ItanMvYmxvYi9tYXN0ZXIvbGliL2FkYWwuanMjTDEwMjlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmFuZG9tKCkge1xuICAgIHZhciBndWlkSG9sZGVyID0gJ3h4eHh4eHh4eHh4eDR4eHh5eHh4eHh4eHh4eHh4eHh4JztcbiAgICB2YXIgaGV4ID0gJzAxMjM0NTY3ODlhYmNkZWYnO1xuICAgIHZhciByID0gMDtcbiAgICB2YXIgZ3VpZFJlc3BvbnNlID0gXCJcIjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGd1aWRIb2xkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGd1aWRIb2xkZXJbaV0gIT09ICctJyAmJiBndWlkSG9sZGVyW2ldICE9PSAnNCcpIHtcbiAgICAgICAgICAgIC8vIGVhY2ggeCBhbmQgeSBuZWVkcyB0byBiZSByYW5kb21cbiAgICAgICAgICAgIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGd1aWRIb2xkZXJbaV0gPT09ICd4Jykge1xuICAgICAgICAgICAgZ3VpZFJlc3BvbnNlICs9IGhleFtyXTtcbiAgICAgICAgfSBlbHNlIGlmIChndWlkSG9sZGVyW2ldID09PSAneScpIHtcbiAgICAgICAgICAgIC8vIGNsb2NrLXNlcS1hbmQtcmVzZXJ2ZWQgZmlyc3QgaGV4IGlzIGZpbHRlcmVkIGFuZCByZW1haW5pbmcgaGV4IHZhbHVlcyBhcmUgcmFuZG9tXG4gICAgICAgICAgICByICY9IDB4MzsgLy8gYml0IGFuZCB3aXRoIDAwMTEgdG8gc2V0IHBvcyAyIHRvIHplcm8gPzA/P1xuICAgICAgICAgICAgciB8PSAweDg7IC8vIHNldCBwb3MgMyB0byAxIGFzIDE/Pz9cbiAgICAgICAgICAgIGd1aWRSZXNwb25zZSArPSBoZXhbcl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBndWlkUmVzcG9uc2UgKz0gZ3VpZEhvbGRlcltpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ3VpZFJlc3BvbnNlO1xufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3JhbmRvbS5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBVcmxVdGlsaXR5IGZyb20gJy4vVXJsVXRpbGl0eSc7XG5cbmNvbnN0IE9pZGNTY29wZSA9IFwib3BlbmlkXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpZ25pblJlc3BvbnNlIHtcbiAgICBjb25zdHJ1Y3Rvcih1cmwpIHtcblxuICAgICAgICB2YXIgdmFsdWVzID0gVXJsVXRpbGl0eS5wYXJzZVVybEZyYWdtZW50KHVybCwgXCIjXCIpO1xuXG4gICAgICAgIHRoaXMuZXJyb3IgPSB2YWx1ZXMuZXJyb3I7XG4gICAgICAgIHRoaXMuZXJyb3JfZGVzY3JpcHRpb24gPSB2YWx1ZXMuZXJyb3JfZGVzY3JpcHRpb247XG4gICAgICAgIHRoaXMuZXJyb3JfdXJpID0gdmFsdWVzLmVycm9yX3VyaTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuc3RhdGUgPSB2YWx1ZXMuc3RhdGU7XG4gICAgICAgIHRoaXMuaWRfdG9rZW4gPSB2YWx1ZXMuaWRfdG9rZW47XG4gICAgICAgIHRoaXMuc2Vzc2lvbl9zdGF0ZSA9IHZhbHVlcy5zZXNzaW9uX3N0YXRlO1xuICAgICAgICB0aGlzLmFjY2Vzc190b2tlbiA9IHZhbHVlcy5hY2Nlc3NfdG9rZW47XG4gICAgICAgIHRoaXMudG9rZW5fdHlwZSA9IHZhbHVlcy50b2tlbl90eXBlO1xuICAgICAgICB0aGlzLnNjb3BlID0gdmFsdWVzLnNjb3BlO1xuICAgICAgICB0aGlzLnByb2ZpbGUgPSB1bmRlZmluZWQ7IC8vIHdpbGwgYmUgc2V0IGZyb20gUmVzcG9uc2VWYWxpZGF0b3JcblxuICAgICAgICBsZXQgZXhwaXJlc19pbiA9IHBhcnNlSW50KHZhbHVlcy5leHBpcmVzX2luKTtcbiAgICAgICAgaWYgKHR5cGVvZiBleHBpcmVzX2luID09PSAnbnVtYmVyJyAmJiBleHBpcmVzX2luID4gMCkge1xuICAgICAgICAgICAgbGV0IG5vdyA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgICAgICAgIHRoaXMuZXhwaXJlc19hdCA9IG5vdyArIGV4cGlyZXNfaW47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgZXhwaXJlc19pbigpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwaXJlc19hdCkge1xuICAgICAgICAgICAgbGV0IG5vdyA9IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cGlyZXNfYXQgLSBub3c7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBnZXQgZXhwaXJlZCgpIHtcbiAgICAgICAgbGV0IGV4cGlyZXNfaW4gPSB0aGlzLmV4cGlyZXNfaW47XG4gICAgICAgIGlmIChleHBpcmVzX2luICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBleHBpcmVzX2luIDw9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBnZXQgc2NvcGVzKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2NvcGUgfHwgXCJcIikuc3BsaXQoXCIgXCIpO1xuICAgIH1cbiAgICBcbiAgICBnZXQgaXNPcGVuSWRDb25uZWN0KCl7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3Blcy5pbmRleE9mKE9pZGNTY29wZSkgPj0gMDtcbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9TaWduaW5SZXNwb25zZS5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IFVybFV0aWxpdHkgZnJvbSAnLi9VcmxVdGlsaXR5JztcbmltcG9ydCBTdGF0ZSBmcm9tICcuL1N0YXRlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2lnbm91dFJlcXVlc3Qge1xuICAgIGNvbnN0cnVjdG9yKHt1cmwsIGlkX3Rva2VuX2hpbnQsIHBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaSwgZGF0YX0pIHtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIExvZy5lcnJvcihcIk5vIHVybCBwYXNzZWQgdG8gU2lnbm91dFJlcXVlc3RcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1cmxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWRfdG9rZW5faGludCkge1xuICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJpZF90b2tlbl9oaW50XCIsIGlkX3Rva2VuX2hpbnQpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gVXJsVXRpbGl0eS5hZGRRdWVyeVBhcmFtKHVybCwgXCJwb3N0X2xvZ291dF9yZWRpcmVjdF91cmlcIiwgcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gbmV3IFN0YXRlKHsgZGF0YSB9KTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHVybCA9IFVybFV0aWxpdHkuYWRkUXVlcnlQYXJhbSh1cmwsIFwic3RhdGVcIiwgdGhpcy5zdGF0ZS5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9TaWdub3V0UmVxdWVzdC5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBVcmxVdGlsaXR5IGZyb20gJy4vVXJsVXRpbGl0eSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpZ25vdXRSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IodXJsKSB7XG5cbiAgICAgICAgdmFyIHZhbHVlcyA9IFVybFV0aWxpdHkucGFyc2VVcmxGcmFnbWVudCh1cmwsIFwiP1wiKTtcblxuICAgICAgICB0aGlzLmVycm9yID0gdmFsdWVzLmVycm9yO1xuICAgICAgICB0aGlzLmVycm9yX2Rlc2NyaXB0aW9uID0gdmFsdWVzLmVycm9yX2Rlc2NyaXB0aW9uO1xuICAgICAgICB0aGlzLmVycm9yX3VyaSA9IHZhbHVlcy5lcnJvcl91cmk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHZhbHVlcy5zdGF0ZTtcbiAgICB9XG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvU2lnbm91dFJlc3BvbnNlLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEluTWVtb3J5V2ViU3RvcmFnZXtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB0aGlzLl9kYXRhID0ge307XG4gICAgfVxuICAgIFxuICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgIExvZy5pbmZvKFwiSW5NZW1vcnlXZWJTdG9yYWdlLmdldEl0ZW1cIiwga2V5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFba2V5XTtcbiAgICB9XG4gICAgXG4gICAgc2V0SXRlbShrZXksIHZhbHVlKXtcbiAgICAgICAgTG9nLmluZm8oXCJJbk1lbW9yeVdlYlN0b3JhZ2Uuc2V0SXRlbVwiLCBrZXkpO1xuICAgICAgICB0aGlzLl9kYXRhW2tleV0gPSB2YWx1ZTtcbiAgICB9ICAgXG4gICAgXG4gICAgcmVtb3ZlSXRlbShrZXkpe1xuICAgICAgICBMb2cuaW5mbyhcIkluTWVtb3J5V2ViU3RvcmFnZS5yZW1vdmVJdGVtXCIsIGtleSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9kYXRhW2tleV07XG4gICAgfVxuICAgIFxuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLl9kYXRhKS5sZW5ndGg7XG4gICAgfVxuICAgIFxuICAgIGtleShpbmRleCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcy5fZGF0YSlbaW5kZXhdO1xuICAgIH1cbn1cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9Jbk1lbW9yeVdlYlN0b3JhZ2UuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBPaWRjQ2xpZW50IGZyb20gJy4vT2lkY0NsaWVudCc7XG5pbXBvcnQgVXNlck1hbmFnZXJTZXR0aW5ncyBmcm9tICcuL1VzZXJNYW5hZ2VyU2V0dGluZ3MnO1xuaW1wb3J0IFVzZXIgZnJvbSAnLi9Vc2VyJztcbmltcG9ydCBVc2VyTWFuYWdlckV2ZW50cyBmcm9tICcuL1VzZXJNYW5hZ2VyRXZlbnRzJztcbmltcG9ydCBTaWxlbnRSZW5ld1NlcnZpY2UgZnJvbSAnLi9TaWxlbnRSZW5ld1NlcnZpY2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVc2VyTWFuYWdlciBleHRlbmRzIE9pZGNDbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzID0ge30pIHtcbiAgICAgICAgXG4gICAgICAgIGlmICghKHNldHRpbmdzIGluc3RhbmNlb2YgVXNlck1hbmFnZXJTZXR0aW5ncykpIHtcbiAgICAgICAgICAgIHNldHRpbmdzID0gbmV3IFVzZXJNYW5hZ2VyU2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHNldHRpbmdzKTtcblxuXG4gICAgICAgIC8vIG9yZGVyIGlzIGltcG9ydGFudCBmb3IgdGhlc2UgdHdvIHByb3BlcnRpZXM7IFNpbGVudFJlbmV3U2VydmljZSBkZXBlbmRzIG9uIHRoZSBldmVudHMuXG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBVc2VyTWFuYWdlckV2ZW50cyhzZXR0aW5ncyk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuYXV0b21hdGljU2lsZW50UmVuZXcpIHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwiYXV0b21hdGljU2lsZW50UmVuZXcgaXMgY29uZmlndXJlZCwgc2V0dGluZyB1cCBzaWxlbnQgcmVuZXdcIilcbiAgICAgICAgICAgIHRoaXMuX3NpbGVudFJlbmV3U2VydmljZSA9IG5ldyBTaWxlbnRSZW5ld1NlcnZpY2UodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgX3JlZGlyZWN0TmF2aWdhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5yZWRpcmVjdE5hdmlnYXRvcjtcbiAgICB9XG4gICAgZ2V0IF9wb3B1cE5hdmlnYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MucG9wdXBOYXZpZ2F0b3I7XG4gICAgfVxuICAgIGdldCBfaWZyYW1lTmF2aWdhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5pZnJhbWVOYXZpZ2F0b3I7XG4gICAgfVxuICAgIGdldCBfdXNlclN0b3JlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy51c2VyU3RvcmU7XG4gICAgfVxuXG4gICAgZ2V0IGV2ZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50cztcbiAgICB9XG5cbiAgICBnZXRVc2VyKCkge1xuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLmdldFVzZXJcIik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRVc2VyKCkudGhlbih1c2VyID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJ1c2VyIGxvYWRlZFwiKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5sb2FkKHVzZXIsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB1c2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJ1c2VyIG5vdCBmb3VuZCBpbiBzdG9yYWdlXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW1vdmVVc2VyKCkge1xuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnJlbW92ZVVzZXJcIik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0b3JlVXNlcihudWxsKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwidXNlciByZW1vdmVkIGZyb20gc3RvcmFnZVwiKTtcblxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzLnVubG9hZCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzaWduaW5Qb3B1cChhcmdzID0ge30pIHtcbiAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlci5zaWduaW5Qb3B1cFwiKTtcblxuICAgICAgICBsZXQgdXJsID0gYXJncy5yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5wb3B1cF9yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5yZWRpcmVjdF91cmk7XG4gICAgICAgIGlmICghdXJsKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBwb3B1cF9yZWRpcmVjdF91cmkgb3IgcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gcG9wdXBfcmVkaXJlY3RfdXJpIG9yIHJlZGlyZWN0X3VyaSBjb25maWd1cmVkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFyZ3MucmVkaXJlY3RfdXJpID0gdXJsO1xuICAgICAgICBhcmdzLmRpc3BsYXkgPSBcInBvcHVwXCI7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pbihhcmdzLCB0aGlzLl9wb3B1cE5hdmlnYXRvciwge1xuICAgICAgICAgICAgc3RhcnRVcmw6IHVybCxcbiAgICAgICAgICAgIHBvcHVwV2luZG93RmVhdHVyZXM6IGFyZ3MucG9wdXBXaW5kb3dGZWF0dXJlcyB8fCB0aGlzLnNldHRpbmdzLnBvcHVwV2luZG93RmVhdHVyZXMsXG4gICAgICAgICAgICBwb3B1cFdpbmRvd1RhcmdldDogYXJncy5wb3B1cFdpbmRvd1RhcmdldCB8fCB0aGlzLnNldHRpbmdzLnBvcHVwV2luZG93VGFyZ2V0XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzaWduaW5Qb3B1cENhbGxiYWNrKHVybCkge1xuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25pblBvcHVwQ2FsbGJhY2tcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5DYWxsYmFjayh1cmwsIHRoaXMuX3BvcHVwTmF2aWdhdG9yKTtcbiAgICB9XG4gICAgc2lnbmluU2lsZW50KGFyZ3MgPSB7fSkge1xuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25pblNpbGVudFwiKTtcblxuICAgICAgICBsZXQgdXJsID0gYXJncy5yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5zaWxlbnRfcmVkaXJlY3RfdXJpO1xuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gc2lsZW50X3JlZGlyZWN0X3VyaSBjb25maWd1cmVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHNpbGVudF9yZWRpcmVjdF91cmkgY29uZmlndXJlZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhcmdzLnJlZGlyZWN0X3VyaSA9IHVybDtcbiAgICAgICAgYXJncy5wcm9tcHQgPSBcIm5vbmVcIjtcblxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluKGFyZ3MsIHRoaXMuX2lmcmFtZU5hdmlnYXRvciwgeyBcbiAgICAgICAgICAgIHN0YXJ0VXJsOiB1cmwsIFxuICAgICAgICAgICAgc2lsZW50UmVxdWVzdFRpbWVvdXQ6IGFyZ3Muc2lsZW50UmVxdWVzdFRpbWVvdXQgfHwgdGhpcy5zZXR0aW5ncy5zaWxlbnRSZXF1ZXN0VGltZW91dFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2lnbmluU2lsZW50Q2FsbGJhY2sodXJsKSB7XG4gICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbmluU2lsZW50Q2FsbGJhY2tcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5DYWxsYmFjayh1cmwsIHRoaXMuX2lmcmFtZU5hdmlnYXRvcik7XG4gICAgfVxuXG4gICAgX3NpZ25pbihhcmdzLCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcyA9IHt9KSB7XG4gICAgICAgIExvZy5pbmZvKFwiX3NpZ25pblwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25pblN0YXJ0KGFyZ3MsIG5hdmlnYXRvciwgbmF2aWdhdG9yUGFyYW1zKS50aGVuKG5hdlJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5FbmQobmF2UmVzcG9uc2UudXJsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9zaWduaW5DYWxsYmFjayh1cmwsIG5hdmlnYXRvcikge1xuICAgICAgICBMb2cuaW5mbyhcIl9zaWduaW5DYWxsYmFja1wiKTtcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5jYWxsYmFjayh1cmwpO1xuICAgIH1cbiAgICBfc2lnbm91dChhcmdzLCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcyA9IHt9KSB7XG4gICAgICAgIExvZy5pbmZvKFwiX3NpZ25vdXRcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0U3RhcnQoYXJncywgbmF2aWdhdG9yLCBuYXZpZ2F0b3JQYXJhbXMpLnRoZW4obmF2UmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25vdXRFbmQobmF2UmVzcG9uc2UudXJsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9zaWdub3V0Q2FsbGJhY2sodXJsLCBuYXZpZ2F0b3IpIHtcbiAgICAgICAgTG9nLmluZm8oXCJfc2lnbm91dENhbGxiYWNrXCIpO1xuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLmNhbGxiYWNrKHVybCk7XG4gICAgfVxuXG4gICAgc2lnbmluUmVkaXJlY3QoYXJncykge1xuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25pblJlZGlyZWN0XCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmluU3RhcnQoYXJncywgdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3IpO1xuICAgIH1cbiAgICBzaWduaW5SZWRpcmVjdENhbGxiYWNrKHVybCkge1xuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25pblJlZGlyZWN0Q2FsbGJhY2tcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduaW5FbmQodXJsIHx8IHRoaXMuX3JlZGlyZWN0TmF2aWdhdG9yLnVybCk7XG4gICAgfVxuICAgIHNpZ25vdXRSZWRpcmVjdChhcmdzKSB7XG4gICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbm91dFJlZGlyZWN0XCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbm91dFN0YXJ0KGFyZ3MsIHRoaXMuX3JlZGlyZWN0TmF2aWdhdG9yKTtcbiAgICB9XG4gICAgc2lnbm91dFBvcHVwKGFyZ3MgPSB7fSkge1xuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyLnNpZ25vdXRQb3B1cFwiKTtcblxuICAgICAgICBsZXQgdXJsID0gYXJncy5yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5wb3B1cF9yZWRpcmVjdF91cmkgfHwgdGhpcy5zZXR0aW5ncy5yZWRpcmVjdF91cmk7XG4gICAgICAgIGlmICghdXJsKSB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJObyBwb3B1cF9yZWRpcmVjdF91cmkgb3IgcmVkaXJlY3RfdXJpIGNvbmZpZ3VyZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiTm8gcG9wdXBfcmVkaXJlY3RfdXJpIG9yIHJlZGlyZWN0X3VyaSBjb25maWd1cmVkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0KGFyZ3MsIHRoaXMuX3BvcHVwTmF2aWdhdG9yLCB7IFxuICAgICAgICAgICAgc3RhcnRVcmw6IHVybCxcbiAgICAgICAgICAgIHBvcHVwV2luZG93RmVhdHVyZXM6IGFyZ3MucG9wdXBXaW5kb3dGZWF0dXJlcyB8fCB0aGlzLnNldHRpbmdzLnBvcHVwV2luZG93RmVhdHVyZXMsXG4gICAgICAgICAgICBwb3B1cFdpbmRvd1RhcmdldDogYXJncy5wb3B1cFdpbmRvd1RhcmdldCB8fCB0aGlzLnNldHRpbmdzLnBvcHVwV2luZG93VGFyZ2V0IFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2lnbm91dFJlZGlyZWN0Q2FsbGJhY2sodXJsKSB7XG4gICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXIuc2lnbm91dFJlZGlyZWN0Q2FsbGJhY2tcIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWdub3V0RW5kKHVybCB8fCB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvci51cmwpO1xuICAgIH1cblxuICAgIF9zaWduaW5TdGFydChhcmdzLCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcyA9IHt9KSB7XG4gICAgICAgIExvZy5pbmZvKFwiX3NpZ25pblN0YXJ0XCIpO1xuXG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IucHJlcGFyZShuYXZpZ2F0b3JQYXJhbXMpLnRoZW4oaGFuZGxlID0+IHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwiZ290IG5hdmlnYXRvciB3aW5kb3cgaGFuZGxlXCIpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaWduaW5SZXF1ZXN0KGFyZ3MpLnRoZW4oc2lnbmluUmVxdWVzdCA9PiB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJnb3Qgc2lnbmluIHJlcXVlc3RcIik7XG5cbiAgICAgICAgICAgICAgICBuYXZpZ2F0b3JQYXJhbXMudXJsID0gc2lnbmluUmVxdWVzdC51cmw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZS5uYXZpZ2F0ZShuYXZpZ2F0b3JQYXJhbXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfc2lnbmluRW5kKHVybCkge1xuICAgICAgICBMb2cuaW5mbyhcIl9zaWduaW5FbmRcIik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1NpZ25pblJlc3BvbnNlKHVybCkudGhlbihzaWduaW5SZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcImdvdCBzaWduaW4gcmVzcG9uc2VcIik7XG5cbiAgICAgICAgICAgIGxldCB1c2VyID0gbmV3IFVzZXIoc2lnbmluUmVzcG9uc2UpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RvcmVVc2VyKHVzZXIpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwidXNlciBzdG9yZWRcIik7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHMubG9hZCh1c2VyKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB1c2VyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9zaWdub3V0U3RhcnQoYXJncyA9IHt9LCBuYXZpZ2F0b3IsIG5hdmlnYXRvclBhcmFtcyA9IHt9KSB7XG4gICAgICAgIExvZy5pbmZvKFwiX3NpZ25vdXRTdGFydFwiKTtcblxuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnByZXBhcmUobmF2aWdhdG9yUGFyYW1zKS50aGVuKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcImdvdCBuYXZpZ2F0b3Igd2luZG93IGhhbmRsZVwiKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VXNlcigpLnRoZW4odXNlciA9PiB7XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJsb2FkZWQgY3VycmVudCB1c2VyIGZyb20gc3RvcmFnZVwiKTtcblxuICAgICAgICAgICAgICAgIHZhciBpZF90b2tlbiA9IGFyZ3MuaWRfdG9rZW5faGludCB8fCB1c2VyICYmIHVzZXIuaWRfdG9rZW47XG4gICAgICAgICAgICAgICAgaWYgKGlkX3Rva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5pbmZvKFwiU2V0dGluZyBpZF90b2tlbiBpbnRvIHNpZ25vdXQgcmVxdWVzdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5pZF90b2tlbl9oaW50ID0gaWRfdG9rZW47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlVXNlcigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInVzZXIgcmVtb3ZlZCwgY3JlYXRpbmcgc2lnbm91dCByZXF1ZXN0XCIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNpZ25vdXRSZXF1ZXN0KGFyZ3MpLnRoZW4oc2lnbm91dFJlcXVlc3QgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmluZm8oXCJnb3Qgc2lnbm91dCByZXF1ZXN0XCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3JQYXJhbXMudXJsID0gc2lnbm91dFJlcXVlc3QudXJsO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZS5uYXZpZ2F0ZShuYXZpZ2F0b3JQYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3NpZ25vdXRFbmQodXJsKSB7XG4gICAgICAgIExvZy5pbmZvKFwiX3NpZ25vdXRFbmRcIik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1NpZ25vdXRSZXNwb25zZSh1cmwpLnRoZW4oc2lnbm91dFJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwiZ290IHNpZ25vdXQgcmVzcG9uc2VcIik7XG5cbiAgICAgICAgICAgIHJldHVybiBzaWdub3V0UmVzcG9uc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBfdXNlclN0b3JlS2V5KCkge1xuICAgICAgICByZXR1cm4gYHVzZXI6JHt0aGlzLnNldHRpbmdzLmF1dGhvcml0eX06JHt0aGlzLnNldHRpbmdzLmNsaWVudF9pZH1gO1xuICAgIH1cblxuICAgIF9sb2FkVXNlcigpIHtcbiAgICAgICAgTG9nLmluZm8oXCJfbG9hZFVzZXJcIik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJTdG9yZS5nZXQodGhpcy5fdXNlclN0b3JlS2V5KS50aGVuKHN0b3JhZ2VTdHJpbmcgPT4ge1xuICAgICAgICAgICAgaWYgKHN0b3JhZ2VTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICBMb2cuaW5mbyhcInVzZXIgc3RvcmFnZVN0cmluZyBsb2FkZWRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVzZXIuZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIExvZy5pbmZvKFwibm8gdXNlciBzdG9yYWdlU3RyaW5nXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9zdG9yZVVzZXIodXNlcikge1xuICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgICAgTG9nLmluZm8oXCJfc3RvcmVVc2VyIHN0b3JpbmcgdXNlclwiKTtcblxuICAgICAgICAgICAgdmFyIHN0b3JhZ2VTdHJpbmcgPSB1c2VyLnRvU3RvcmFnZVN0cmluZygpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJTdG9yZS5zZXQodGhpcy5fdXNlclN0b3JlS2V5LCBzdG9yYWdlU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwiX3N0b3JlVXNlciByZW1vdmluZyB1c2VyIHN0b3JhZ2VcIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlLnJlbW92ZSh0aGlzLl91c2VyU3RvcmVLZXkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvVXNlck1hbmFnZXIuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBPaWRjQ2xpZW50U2V0dGluZ3MgZnJvbSAnLi9PaWRjQ2xpZW50U2V0dGluZ3MnO1xuaW1wb3J0IFJlZGlyZWN0TmF2aWdhdG9yIGZyb20gJy4vUmVkaXJlY3ROYXZpZ2F0b3InO1xuaW1wb3J0IFBvcHVwTmF2aWdhdG9yIGZyb20gJy4vUG9wdXBOYXZpZ2F0b3InO1xuaW1wb3J0IElGcmFtZU5hdmlnYXRvciBmcm9tICcuL0lGcmFtZU5hdmlnYXRvcic7XG5pbXBvcnQgV2ViU3RvcmFnZVN0YXRlU3RvcmUgZnJvbSAnLi9XZWJTdG9yYWdlU3RhdGVTdG9yZSc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vR2xvYmFsJztcblxuY29uc3QgRGVmYXVsdEFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gNjA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJNYW5hZ2VyU2V0dGluZ3MgZXh0ZW5kcyBPaWRjQ2xpZW50U2V0dGluZ3Mge1xuICAgIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgcG9wdXBfcmVkaXJlY3RfdXJpLFxuICAgICAgICBwb3B1cFdpbmRvd0ZlYXR1cmVzLFxuICAgICAgICBwb3B1cFdpbmRvd1RhcmdldCxcbiAgICAgICAgc2lsZW50X3JlZGlyZWN0X3VyaSxcbiAgICAgICAgc2lsZW50UmVxdWVzdFRpbWVvdXQsXG4gICAgICAgIGF1dG9tYXRpY1NpbGVudFJlbmV3ID0gZmFsc2UsXG4gICAgICAgIGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gRGVmYXVsdEFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lLFxuICAgICAgICByZWRpcmVjdE5hdmlnYXRvciA9IG5ldyBSZWRpcmVjdE5hdmlnYXRvcigpLFxuICAgICAgICBwb3B1cE5hdmlnYXRvciA9IG5ldyBQb3B1cE5hdmlnYXRvcigpLFxuICAgICAgICBpZnJhbWVOYXZpZ2F0b3IgPSBuZXcgSUZyYW1lTmF2aWdhdG9yKCksXG4gICAgICAgIHVzZXJTdG9yZSA9IG5ldyBXZWJTdG9yYWdlU3RhdGVTdG9yZSh7IHN0b3JlOiBHbG9iYWwuc2Vzc2lvblN0b3JhZ2UgfSlcbiAgICB9ID0ge30pIHtcbiAgICAgICAgc3VwZXIoYXJndW1lbnRzWzBdKTtcblxuICAgICAgICB0aGlzLl9wb3B1cF9yZWRpcmVjdF91cmkgPSBwb3B1cF9yZWRpcmVjdF91cmk7XG4gICAgICAgIHRoaXMuX3BvcHVwV2luZG93RmVhdHVyZXMgPSBwb3B1cFdpbmRvd0ZlYXR1cmVzO1xuICAgICAgICB0aGlzLl9wb3B1cFdpbmRvd1RhcmdldCA9IHBvcHVwV2luZG93VGFyZ2V0O1xuICAgICAgICBcbiAgICAgICAgdGhpcy5fc2lsZW50X3JlZGlyZWN0X3VyaSA9IHNpbGVudF9yZWRpcmVjdF91cmk7XG4gICAgICAgIHRoaXMuX3NpbGVudFJlcXVlc3RUaW1lb3V0ID0gc2lsZW50UmVxdWVzdFRpbWVvdXQ7XG4gICAgICAgIHRoaXMuX2F1dG9tYXRpY1NpbGVudFJlbmV3ID0gISFhdXRvbWF0aWNTaWxlbnRSZW5ldztcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUgPSBhY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZTtcblxuICAgICAgICB0aGlzLl9yZWRpcmVjdE5hdmlnYXRvciA9IHJlZGlyZWN0TmF2aWdhdG9yO1xuICAgICAgICB0aGlzLl9wb3B1cE5hdmlnYXRvciA9IHBvcHVwTmF2aWdhdG9yO1xuICAgICAgICB0aGlzLl9pZnJhbWVOYXZpZ2F0b3IgPSBpZnJhbWVOYXZpZ2F0b3I7XG4gICAgICAgIFxuICAgICAgICB0aGlzLl91c2VyU3RvcmUgPSB1c2VyU3RvcmU7XG4gICAgfVxuXG4gICAgZ2V0IHBvcHVwX3JlZGlyZWN0X3VyaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwX3JlZGlyZWN0X3VyaTtcbiAgICB9XG4gICAgZ2V0IHBvcHVwV2luZG93RmVhdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cFdpbmRvd0ZlYXR1cmVzO1xuICAgIH1cbiAgICBnZXQgcG9wdXBXaW5kb3dUYXJnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cFdpbmRvd1RhcmdldDtcbiAgICB9XG5cbiAgICBnZXQgc2lsZW50X3JlZGlyZWN0X3VyaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpbGVudF9yZWRpcmVjdF91cmk7XG4gICAgfVxuICAgICBnZXQgc2lsZW50UmVxdWVzdFRpbWVvdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWxlbnRSZXF1ZXN0VGltZW91dDtcbiAgICB9XG4gICAgZ2V0IGF1dG9tYXRpY1NpbGVudFJlbmV3KCkge1xuICAgICAgICByZXR1cm4gISEodGhpcy5zaWxlbnRfcmVkaXJlY3RfdXJpICYmIHRoaXMuX2F1dG9tYXRpY1NpbGVudFJlbmV3KTtcbiAgICB9XG4gICAgZ2V0IGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWU7XG4gICAgfVxuXG4gICAgZ2V0IHJlZGlyZWN0TmF2aWdhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVkaXJlY3ROYXZpZ2F0b3I7XG4gICAgfVxuICAgIGdldCBwb3B1cE5hdmlnYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwTmF2aWdhdG9yO1xuICAgIH1cbiAgICBnZXQgaWZyYW1lTmF2aWdhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faWZyYW1lTmF2aWdhdG9yO1xuICAgIH1cbiAgICBcbiAgICBnZXQgdXNlclN0b3JlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlclN0b3JlO1xuICAgIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL1VzZXJNYW5hZ2VyU2V0dGluZ3MuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkaXJlY3ROYXZpZ2F0b3Ige1xuICAgIFxuICAgIHByZXBhcmUoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgfVxuXG4gICAgbmF2aWdhdGUocGFyYW1zKSB7XG4gICAgICAgIExvZy5pbmZvKFwiUmVkaXJlY3ROYXZpZ2F0b3IubmF2aWdhdGVcIik7XG4gICAgICAgIFxuICAgICAgICBpZiAoIXBhcmFtcyB8fCAhcGFyYW1zLnVybCkge1xuICAgICAgICAgICAgTG9nLmVycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIk5vIHVybCBwcm92aWRlZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSBwYXJhbXMudXJsO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGdldCB1cmwoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiUmVkaXJlY3ROYXZpZ2F0b3IudXJsXCIpO1xuICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvUmVkaXJlY3ROYXZpZ2F0b3IuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBQb3B1cFdpbmRvdyBmcm9tICcuL1BvcHVwV2luZG93JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9wdXBOYXZpZ2F0b3Ige1xuICAgIFxuICAgIHByZXBhcmUocGFyYW1zKSB7XG4gICAgICAgIGxldCBwb3B1cCA9IG5ldyBQb3B1cFdpbmRvdyhwYXJhbXMpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvcHVwKTtcbiAgICB9XG4gICAgXG4gICAgY2FsbGJhY2sodXJsKSB7XG4gICAgICAgIExvZy5pbmZvKFwiUG9wdXBOYXZpZ2F0b3IuY2FsbGJhY2tcIik7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFBvcHVwV2luZG93Lm5vdGlmeU9wZW5lcih1cmwpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9Qb3B1cE5hdmlnYXRvci5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5jb25zdCBDaGVja0ZvclBvcHVwQ2xvc2VkSW50ZXJ2YWwgPSA1MDA7XG5jb25zdCBEZWZhdWx0UG9wdXBGZWF0dXJlcyA9ICdsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHdpZHRoPTUwMCxoZWlnaHQ9NTAwLGxlZnQ9MTAwLHRvcD0xMDAnO1xuY29uc3QgRGVmYXVsdFBvcHVwVGFyZ2V0ID0gXCJfYmxhbmtcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9wdXBXaW5kb3cge1xuXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgICAgIExvZy5pbmZvKFwiUG9wdXBXaW5kb3cuY3RvclwiKTtcblxuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50ID0gdGhpcy5fbWVzc2FnZS5iaW5kKHRoaXMpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnQsIGZhbHNlKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBmZWF0dXJlcyA9IHBhcmFtcy5wb3B1cFdpbmRvd0ZlYXR1cmVzIHx8IERlZmF1bHRQb3B1cEZlYXR1cmVzO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gcGFyYW1zLnBvcHVwV2luZG93VGFyZ2V0IHx8IERlZmF1bHRQb3B1cFRhcmdldDtcblxuICAgICAgICB0aGlzLl9wb3B1cCA9IHdpbmRvdy5vcGVuKCcnLCB0YXJnZXQsIGZlYXR1cmVzKTtcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcInBvcHVwIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXCIpO1xuICAgICAgICAgICAgdGhpcy5fY2hlY2tGb3JQb3B1cENsb3NlZFRpbWVyID0gd2luZG93LnNldEludGVydmFsKHRoaXMuX2NoZWNrRm9yUG9wdXBDbG9zZWQuYmluZCh0aGlzKSwgQ2hlY2tGb3JQb3B1cENsb3NlZEludGVydmFsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5hdmlnYXRlKHBhcmFtcykge1xuICAgICAgICBMb2cuaW5mbyhcIlBvcHVwV2luZG93Lm5hdmlnYXRlXCIpO1xuXG4gICAgICAgIGlmICghdGhpcy5fcG9wdXApIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiRXJyb3Igb3BlbmluZyBwb3B1cCB3aW5kb3dcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXBhcmFtcyB8fCAhcGFyYW1zLnVybCkge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJObyB1cmwgcHJvdmlkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcIlNldHRpbmcgVVJMIGluIHBvcHVwXCIpO1xuXG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5fcG9wdXAud2luZG93LmxvY2F0aW9uID0gcGFyYW1zLnVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gICAgfVxuXG4gICAgZ2V0IHByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlO1xuICAgIH1cblxuICAgIF9zdWNjZXNzKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xuXG4gICAgICAgIExvZy5pbmZvKFwiU3VjY2Vzc2Z1bCByZXNwb25zZSBmcm9tIHBvcHVwIHdpbmRvd1wiKTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZShkYXRhKTtcbiAgICB9XG4gICAgX2Vycm9yKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xuXG4gICAgICAgIExvZy5lcnJvcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5fcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlKSk7XG4gICAgfVxuXG4gICAgX2NsZWFudXAoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiUG9wdXBXaW5kb3cuX2NsZWFudXBcIik7XG5cbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50LCBmYWxzZSk7XG4gICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuX2NoZWNrRm9yUG9wdXBDbG9zZWRUaW1lcik7XG5cbiAgICAgICAgdGhpcy5fY2hlY2tGb3JQb3B1cENsb3NlZFRpbWVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYm91bmRNZXNzYWdlRXZlbnRzc2FnZSA9IG51bGw7XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy5fcG9wdXApe1xuICAgICAgICAgICAgdGhpcy5fcG9wdXAuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wb3B1cCA9IG51bGw7XG4gICAgfVxuXG4gICAgX2NoZWNrRm9yUG9wdXBDbG9zZWQoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiUG9wdXBXaW5kb3cuX2NoZWNrRm9yUG9wdXBDbG9zZWRcIik7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9wb3B1cCB8fCB0aGlzLl9wb3B1cC5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiUG9wdXAgd2luZG93IGNsb3NlZFwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9tZXNzYWdlKGUpIHtcbiAgICAgICAgTG9nLmluZm8oXCJQb3B1cFdpbmRvdy5fbWVzc2FnZVwiKTtcblxuICAgICAgICBpZiAoZS5vcmlnaW4gPT09IHRoaXMuX29yaWdpbiAmJlxuICAgICAgICAgICAgZS5zb3VyY2UgPT09IHRoaXMuX3BvcHVwLndpbmRvd1xuICAgICAgICApIHtcbiAgICAgICAgICAgIExvZy5pbmZvKFwicHJvY2Vzc2luZyBtZXNzYWdlXCIpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgdXJsID0gZS5kYXRhIHx8IGUuc291cmNlLmxvY2F0aW9uLmhyZWY7IC8vIGZvciBJRTlcblxuICAgICAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xuXG4gICAgICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3VjY2Vzcyh7IHVybDogdXJsIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJJbnZhbGlkIHJlc3BvbnNlIGZyb20gcG9wdXBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgX29yaWdpbigpIHtcbiAgICAgICAgcmV0dXJuIGxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICsgbG9jYXRpb24uaG9zdDtcbiAgICB9XG5cbiAgICBzdGF0aWMgbm90aWZ5T3BlbmVyKHVybCkge1xuICAgICAgICBMb2cuaW5mbyhcIlBvcHVwV2luZG93Lm5vdGlmeU9wZW5lclwiKTtcblxuICAgICAgICBpZiAod2luZG93Lm9wZW5lcikge1xuICAgICAgICAgICAgdXJsID0gdXJsIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwicG9zdGluZyB1cmwgbWVzc2FnZSB0byBvcGVuZXJcIik7XG4gICAgICAgICAgICAgICAgd2luZG93Lm9wZW5lci5wb3N0TWVzc2FnZSh1cmwsIGxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICsgbG9jYXRpb24uaG9zdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9Qb3B1cFdpbmRvdy5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IElGcmFtZVdpbmRvdyBmcm9tICcuL0lGcmFtZVdpbmRvdyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIElGcmFtZU5hdmlnYXRvciB7XG5cbiAgICBwcmVwYXJlKHBhcmFtcykge1xuICAgICAgICBsZXQgZnJhbWUgPSBuZXcgSUZyYW1lV2luZG93KHBhcmFtcyk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZnJhbWUpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKHVybCkge1xuICAgICAgICBMb2cuaW5mbyhcIklGcmFtZU5hdmlnYXRvci5jYWxsYmFja1wiKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgSUZyYW1lV2luZG93Lm5vdGlmeVBhcmVudCh1cmwpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9JRnJhbWVOYXZpZ2F0b3IuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcblxuY29uc3QgRGVmYXVsdFRpbWVvdXQgPSA1MDAwO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJRnJhbWVXaW5kb3cge1xuXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgICAgIExvZy5pbmZvKFwiSUZyYW1lV2luZG93LmN0b3JcIik7XG5cbiAgICAgICAgdGhpcy5fcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9ib3VuZE1lc3NhZ2VFdmVudCA9IHRoaXMuX21lc3NhZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50LCBmYWxzZSk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLl9mcmFtZSA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgICAgICB0aGlzLl9mcmFtZS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2ZyYW1lKTtcbiAgICB9XG5cbiAgICBuYXZpZ2F0ZShwYXJhbXMpIHtcbiAgICAgICAgTG9nLmluZm8oXCJJRnJhbWVXaW5kb3cubmF2aWdhdGVcIik7XG5cbiAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy51cmwpIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiTm8gdXJsIHByb3ZpZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRpbWVvdXQgPSBwYXJhbXMuc2lsZW50UmVxdWVzdFRpbWVvdXQgfHwgRGVmYXVsdFRpbWVvdXQ7XG4gICAgICAgICAgICBMb2cuaW5mbyhcIlVzaW5nIHRpbWVvdXQgb2Y6XCIsIHRpbWVvdXQpO1xuICAgICAgICAgICAgdGhpcy5fdGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLl90aW1lb3V0LmJpbmQodGhpcyksIHRpbWVvdXQpO1xuICAgICAgICAgICAgdGhpcy5fZnJhbWUuc3JjID0gcGFyYW1zLnVybDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZTtcbiAgICB9XG5cbiAgICBnZXQgcHJvbWlzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XG4gICAgfVxuXG4gICAgX3N1Y2Nlc3MoZGF0YSkge1xuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XG5cbiAgICAgICAgTG9nLmluZm8oXCJTdWNjZXNzZnVsIHJlc3BvbnNlIGZyb20gZnJhbWUgd2luZG93XCIpO1xuICAgICAgICB0aGlzLl9yZXNvbHZlKGRhdGEpO1xuICAgIH1cbiAgICBfZXJyb3IobWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XG5cbiAgICAgICAgTG9nLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLl9yZWplY3QobmV3IEVycm9yKG1lc3NhZ2UpKTtcbiAgICB9XG5cbiAgICBfY2xlYW51cCgpIHtcbiAgICAgICAgTG9nLmluZm8oXCJJRnJhbWVXaW5kb3cuX2NsZWFudXBcIik7XG5cbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50LCBmYWxzZSk7XG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLl9mcmFtZSk7XG5cbiAgICAgICAgdGhpcy5fdGltZXIgPSBudWxsO1xuICAgICAgICB0aGlzLl9mcmFtZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2JvdW5kTWVzc2FnZUV2ZW50ID0gbnVsbDtcbiAgICB9XG5cbiAgICBfdGltZW91dCgpIHtcbiAgICAgICAgTG9nLmluZm8oXCJJRnJhbWVXaW5kb3cuX3RpbWVvdXRcIik7XG4gICAgICAgIHRoaXMuX2Vycm9yKFwiRnJhbWUgd2luZG93IHRpbWVkIG91dFwiKTtcbiAgICB9XG5cbiAgICBfbWVzc2FnZShlKSB7XG4gICAgICAgIExvZy5pbmZvKFwiSUZyYW1lV2luZG93Ll9tZXNzYWdlXCIpO1xuXG4gICAgICAgIGlmICh0aGlzLl90aW1lciAmJlxuICAgICAgICAgICAgZS5vcmlnaW4gPT09IHRoaXMuX29yaWdpbiAmJlxuICAgICAgICAgICAgZS5zb3VyY2UgPT09IHRoaXMuX2ZyYW1lLmNvbnRlbnRXaW5kb3dcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgdXJsID0gZS5kYXRhO1xuICAgICAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N1Y2Nlc3MoeyB1cmw6IHVybCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9yKFwiSW52YWxpZCByZXNwb25zZSBmcm9tIGZyYW1lXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IF9vcmlnaW4oKSB7XG4gICAgICAgIHJldHVybiBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiArIGxvY2F0aW9uLmhvc3Q7XG4gICAgfVxuXG4gICAgc3RhdGljIG5vdGlmeVBhcmVudCh1cmwpIHtcbiAgICAgICAgTG9nLmluZm8oXCJJRnJhbWVXaW5kb3cubm90aWZ5UGFyZW50XCIpO1xuXG4gICAgICAgIGlmICh3aW5kb3cucGFyZW50ICYmIHdpbmRvdyAhPT0gd2luZG93LnBhcmVudCkge1xuICAgICAgICAgICAgdXJsID0gdXJsIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwicG9zdGluZyB1cmwgbWVzc2FnZSB0byBwYXJlbnRcIik7XG4gICAgICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh1cmwsIGxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICsgbG9jYXRpb24uaG9zdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9JRnJhbWVXaW5kb3cuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlciB7XG4gICAgY29uc3RydWN0b3Ioe2lkX3Rva2VuLCBzZXNzaW9uX3N0YXRlLCBhY2Nlc3NfdG9rZW4sIHRva2VuX3R5cGUsIHNjb3BlLCBwcm9maWxlLCBleHBpcmVzX2F0LCBzdGF0ZX0pIHtcbiAgICAgICAgdGhpcy5pZF90b2tlbiA9IGlkX3Rva2VuO1xuICAgICAgICB0aGlzLnNlc3Npb25fc3RhdGUgPSBzZXNzaW9uX3N0YXRlO1xuICAgICAgICB0aGlzLmFjY2Vzc190b2tlbiA9IGFjY2Vzc190b2tlbjtcbiAgICAgICAgdGhpcy50b2tlbl90eXBlID0gdG9rZW5fdHlwZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgICAgICB0aGlzLnByb2ZpbGUgPSBwcm9maWxlO1xuICAgICAgICB0aGlzLmV4cGlyZXNfYXQgPSBleHBpcmVzX2F0O1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgfVxuXG4gICAgZ2V0IGV4cGlyZXNfaW4oKSB7XG4gICAgICAgIGlmICh0aGlzLmV4cGlyZXNfYXQpIHtcbiAgICAgICAgICAgIGxldCBub3cgPSBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHBpcmVzX2F0IC0gbm93O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZ2V0IGV4cGlyZWQoKSB7XG4gICAgICAgIGxldCBleHBpcmVzX2luID0gdGhpcy5leHBpcmVzX2luO1xuICAgICAgICBpZiAoZXhwaXJlc19pbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwaXJlc19pbiA8PSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZ2V0IHNjb3BlcygpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNjb3BlIHx8IFwiXCIpLnNwbGl0KFwiIFwiKTtcbiAgICB9XG5cbiAgICB0b1N0b3JhZ2VTdHJpbmcoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiVXNlci50b1N0b3JhZ2VTdHJpbmdcIik7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBpZF90b2tlbjogdGhpcy5pZF90b2tlbixcbiAgICAgICAgICAgIHNlc3Npb25fc3RhdGU6IHRoaXMuc2Vzc2lvbl9zdGF0ZSxcbiAgICAgICAgICAgIGFjY2Vzc190b2tlbjogdGhpcy5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICB0b2tlbl90eXBlOiB0aGlzLnRva2VuX3R5cGUsXG4gICAgICAgICAgICBzY29wZTogdGhpcy5zY29wZSxcbiAgICAgICAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcbiAgICAgICAgICAgIGV4cGlyZXNfYXQ6IHRoaXMuZXhwaXJlc19hdFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbVN0b3JhZ2VTdHJpbmcoc3RvcmFnZVN0cmluZykge1xuICAgICAgICBMb2cuaW5mbyhcIlVzZXIuZnJvbVN0b3JhZ2VTdHJpbmdcIik7XG4gICAgICAgIHJldHVybiBuZXcgVXNlcihKU09OLnBhcnNlKHN0b3JhZ2VTdHJpbmcpKTtcbiAgICB9XG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvVXNlci5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuaW1wb3J0IEFjY2Vzc1Rva2VuRXZlbnRzIGZyb20gJy4vQWNjZXNzVG9rZW5FdmVudHMnO1xuaW1wb3J0IEV2ZW50IGZyb20gJy4vRXZlbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVc2VyTWFuYWdlckV2ZW50cyBleHRlbmRzIEFjY2Vzc1Rva2VuRXZlbnRzIHtcblxuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fdXNlckxvYWRlZCA9IG5ldyBFdmVudChcIlVzZXIgbG9hZGVkXCIpO1xuICAgICAgICB0aGlzLl91c2VyVW5sb2FkZWQgPSBuZXcgRXZlbnQoXCJVc2VyIHVubG9hZGVkXCIpO1xuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld0Vycm9yID0gbmV3IEV2ZW50KFwiU2lsZW50IHJlbmV3IGVycm9yXCIpO1xuICAgIH1cblxuICAgIGxvYWQodXNlciwgcmFpc2VFdmVudD10cnVlKSB7XG4gICAgICAgIExvZy5pbmZvKFwiVXNlck1hbmFnZXJFdmVudHMubG9hZFwiKTtcbiAgICAgICAgc3VwZXIubG9hZCh1c2VyKTtcbiAgICAgICAgaWYgKHJhaXNlRXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3VzZXJMb2FkZWQucmFpc2UodXNlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdW5sb2FkKCkge1xuICAgICAgICBMb2cuaW5mbyhcIlVzZXJNYW5hZ2VyRXZlbnRzLnVubG9hZFwiKTtcbiAgICAgICAgc3VwZXIudW5sb2FkKCk7XG4gICAgICAgIHRoaXMuX3VzZXJVbmxvYWRlZC5yYWlzZSgpO1xuICAgIH1cblxuICAgIGFkZFVzZXJMb2FkZWQoY2IpIHtcbiAgICAgICAgdGhpcy5fdXNlckxvYWRlZC5hZGRIYW5kbGVyKGNiKTtcbiAgICB9XG4gICAgcmVtb3ZlVXNlckxvYWRlZChjYikge1xuICAgICAgICB0aGlzLl91c2VyTG9hZGVkLnJlbW92ZUhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICBcbiAgICBhZGRVc2VyVW5sb2FkZWQoY2IpIHtcbiAgICAgICAgdGhpcy5fdXNlclVubG9hZGVkLmFkZEhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICByZW1vdmVVc2VyVW5sb2FkZWQoY2IpIHtcbiAgICAgICAgdGhpcy5fdXNlclVubG9hZGVkLnJlbW92ZUhhbmRsZXIoY2IpO1xuICAgIH1cblxuICAgIGFkZFNpbGVudFJlbmV3RXJyb3IoY2IpIHtcbiAgICAgICAgdGhpcy5fc2lsZW50UmVuZXdFcnJvci5hZGRIYW5kbGVyKGNiKTtcbiAgICB9XG4gICAgcmVtb3ZlU2lsZW50UmVuZXdFcnJvcihjYikge1xuICAgICAgICB0aGlzLl9zaWxlbnRSZW5ld0Vycm9yLnJlbW92ZUhhbmRsZXIoY2IpO1xuICAgIH1cbiAgICBfcmFpc2VTaWxlbnRSZW5ld0Vycm9yKGUpIHtcbiAgICAgICAgTG9nLmluZm8oXCJVc2VyTWFuYWdlckV2ZW50cy5fcmFpc2VTaWxlbnRSZW5ld0Vycm9yXCIsIGUubWVzc2FnZSk7XG4gICAgICAgIHRoaXMuX3NpbGVudFJlbmV3RXJyb3IucmFpc2UoZSk7XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvVXNlck1hbmFnZXJFdmVudHMuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBUaW1lciBmcm9tICcuL1RpbWVyJztcblxuY29uc3QgRGVmYXVsdEFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lID0gNjA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFjY2Vzc1Rva2VuRXZlbnRzIHtcblxuICAgIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUgPSBEZWZhdWx0QWNjZXNzVG9rZW5FeHBpcmluZ05vdGlmaWNhdGlvblRpbWUsXG4gICAgICAgIGFjY2Vzc1Rva2VuRXhwaXJpbmdUaW1lciA9IG5ldyBUaW1lcihcIkFjY2VzcyB0b2tlbiBleHBpcmluZ1wiKSxcbiAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmVkVGltZXIgPSBuZXcgVGltZXIoXCJBY2Nlc3MgdG9rZW4gZXhwaXJlZFwiKVxuICAgIH0gPSB7fSkge1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZSA9IGFjY2Vzc1Rva2VuRXhwaXJpbmdOb3RpZmljYXRpb25UaW1lO1xuXG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmcgPSBhY2Nlc3NUb2tlbkV4cGlyaW5nVGltZXI7XG4gICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZCA9IGFjY2Vzc1Rva2VuRXhwaXJlZFRpbWVyO1xuICAgIH1cblxuICAgIGxvYWQoY29udGFpbmVyKSB7XG4gICAgICAgIExvZy5pbmZvKFwiQWNjZXNzVG9rZW5FdmVudHMubG9hZFwiKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuX2NhbmNlbFRpbWVycygpO1xuXG4gICAgICAgIC8vIG9ubHkgcmVnaXN0ZXIgZXZlbnRzIGlmIHRoZXJlJ3MgYW4gYWNjZXNzIHRva2VuIHdoZXJlIHdlIGNhcmUgYWJvdXQgZXhwaXJhdGlvblxuICAgICAgICBpZiAoY29udGFpbmVyLmFjY2Vzc190b2tlbikge1xuICAgICAgICAgICAgbGV0IGR1cmF0aW9uID0gY29udGFpbmVyLmV4cGlyZXNfaW47XG4gICAgICAgICAgICBMb2cuaW5mbyhcImFjY2VzcyB0b2tlbiBwcmVzZW50LCByZW1haW5pbmcgZHVyYXRpb246XCIsIGR1cmF0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIG9ubHkgcmVnaXN0ZXIgZXhwaXJpbmcgaWYgd2Ugc3RpbGwgaGF2ZSB0aW1lXG4gICAgICAgICAgICAgICAgbGV0IGV4cGlyaW5nID0gZHVyYXRpb24gLSB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nTm90aWZpY2F0aW9uVGltZTtcbiAgICAgICAgICAgICAgICBpZiAoZXhwaXJpbmcgPD0gMCl7XG4gICAgICAgICAgICAgICAgICAgIGV4cGlyaW5nID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTG9nLmluZm8oXCJyZWdpc3RlcmluZyBleHBpcmluZyB0aW1lciBpbjpcIiwgZXhwaXJpbmcpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJpbmcuaW5pdChleHBpcmluZyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFsd2F5cyByZWdpc3RlciBleHBpcmVkLiBpZiBpdCdzIG5lZ2F0aXZlLCBpdCB3aWxsIHN0aWxsIGZpcmVcbiAgICAgICAgICAgIGxldCBleHBpcmVkID0gZHVyYXRpb24gKyAxO1xuICAgICAgICAgICAgTG9nLmluZm8oXCJyZWdpc3RlcmluZyBleHBpcmVkIHRpbWVyIGluOlwiLCBleHBpcmVkKTtcbiAgICAgICAgICAgIHRoaXMuX2FjY2Vzc1Rva2VuRXhwaXJlZC5pbml0KGV4cGlyZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdW5sb2FkKCkge1xuICAgICAgICBMb2cuaW5mbyhcIkFjY2Vzc1Rva2VuRXZlbnRzLnVubG9hZFwiKTtcbiAgICAgICAgdGhpcy5fY2FuY2VsVGltZXJzKCk7XG4gICAgfVxuICAgIFxuICAgIF9jYW5jZWxUaW1lcnMoKXtcbiAgICAgICAgTG9nLmluZm8oXCJjYW5jZWxpbmcgZXhpc3RpbmcgYWNjZXNzIHRva2VuIHRpbWVyc1wiKTtcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZy5jYW5jZWwoKTtcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmVkLmNhbmNlbCgpO1xuICAgIH1cblxuICAgIGFkZEFjY2Vzc1Rva2VuRXhwaXJpbmcoY2IpIHtcbiAgICAgICAgdGhpcy5fYWNjZXNzVG9rZW5FeHBpcmluZy5hZGRIYW5kbGVyKGNiKTtcbiAgICB9XG4gICAgcmVtb3ZlQWNjZXNzVG9rZW5FeHBpcmluZyhjYikge1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyaW5nLnJlbW92ZUhhbmRsZXIoY2IpO1xuICAgIH1cblxuICAgIGFkZEFjY2Vzc1Rva2VuRXhwaXJlZChjYikge1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyZWQuYWRkSGFuZGxlcihjYik7XG4gICAgfVxuICAgIHJlbW92ZUFjY2Vzc1Rva2VuRXhwaXJlZChjYikge1xuICAgICAgICB0aGlzLl9hY2Nlc3NUb2tlbkV4cGlyZWQucmVtb3ZlSGFuZGxlcihjYik7XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvQWNjZXNzVG9rZW5FdmVudHMuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBHbG9iYWwgZnJvbSAnLi9HbG9iYWwnO1xuaW1wb3J0IEV2ZW50IGZyb20gJy4vRXZlbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW1lciBleHRlbmRzIEV2ZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHRpbWVyID0gR2xvYmFsLnRpbWVyKSB7XG4gICAgICAgIHN1cGVyKG5hbWUpO1xuICAgICAgICB0aGlzLl90aW1lciA9IHRpbWVyO1xuICAgIH1cblxuICAgIGluaXQoZHVyYXRpb24pIHtcbiAgICAgICAgdGhpcy5jYW5jZWwoKTtcblxuICAgICAgICBpZiAoZHVyYXRpb24gPD0gMCkge1xuICAgICAgICAgICAgZHVyYXRpb24gPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdGltZXJIYW5kbGUgPSB0aGlzLl90aW1lci5zZXRUaW1lb3V0KHRoaXMuX2NhbGxiYWNrLmJpbmQodGhpcyksIGR1cmF0aW9uICogMTAwMCk7XG4gICAgfVxuXG4gICAgY2FuY2VsKCkge1xuICAgICAgICBpZiAodGhpcy5fdGltZXJIYW5kbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyLmNsZWFyVGltZW91dCh0aGlzLl90aW1lckhhbmRsZSk7XG4gICAgICAgICAgICB0aGlzLl90aW1lckhhbmRsZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfY2FsbGJhY2soKSB7XG4gICAgICAgIHRoaXMuX3RpbWVySGFuZGxlID0gbnVsbDtcbiAgICAgICAgc3VwZXIucmFpc2UoKTtcbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9UaW1lci5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgICAgIHRoaXMuX25hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBbXTtcbiAgICB9XG5cbiAgICBhZGRIYW5kbGVyKGNiKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcy5wdXNoKGNiKTtcbiAgICB9XG5cbiAgICByZW1vdmVIYW5kbGVyKGNiKSB7XG4gICAgICAgIHZhciBpZHggPSB0aGlzLl9jYWxsYmFja3MuZmluZEluZGV4KGl0ZW0gPT4gaXRlbSA9PT0gY2IpO1xuICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJhaXNlKC4uLnBhcmFtcykge1xuICAgICAgICBMb2cuaW5mbyhcIlJhaXNpbmcgZXZlbnQ6IFwiICsgdGhpcy5fbmFtZSk7XG4gICAgICAgIGZvciAodmFyIGNiIG9mIHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgY2IoLi4ucGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL0V2ZW50LmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpbGVudFJlbmV3U2VydmljZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcih1c2VyTWFuYWdlcikge1xuICAgICAgICB0aGlzLl91c2VyTWFuYWdlciA9IHVzZXJNYW5hZ2VyO1xuICAgICAgICB0aGlzLl91c2VyTWFuYWdlci5ldmVudHMuYWRkQWNjZXNzVG9rZW5FeHBpcmluZyh0aGlzLl90b2tlbkV4cGlyaW5nLmJpbmQodGhpcykpO1xuXG4gICAgICAgIC8vIHRoaXMgd2lsbCB0cmlnZ2VyIGxvYWRpbmcgb2YgdGhlIHVzZXIgc28gdGhlIGV4cGlyaW5nIGV2ZW50cyBjYW4gYmUgaW5pdGlhbGl6ZWRcbiAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZ2V0VXNlcigpLnRoZW4odXNlcj0+e1xuICAgICAgICAgICAgLy8gZGVsaWJlcmF0ZSBub3BcbiAgICAgICAgfSkuY2F0Y2goZXJyPT57XG4gICAgICAgICAgICAvLyBjYXRjaCB0byBzdXBwcmVzcyBlcnJvcnMgc2luY2Ugd2UncmUgaW4gYSBjdG9yXG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBmcm9tIGdldFVzZXI6XCIsIGVyci5tZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIF90b2tlbkV4cGlyaW5nKCkge1xuICAgICAgICBMb2cuaW5mbyhcIlNpbGVudFJlbmV3U2VydmljZSBhdXRvbWF0aWNhbGx5IHJlbmV3aW5nIGFjY2VzcyB0b2tlblwiKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuX3VzZXJNYW5hZ2VyLnNpZ25pblNpbGVudCgpLnRoZW4odXNlciA9PiB7XG4gICAgICAgICAgICBMb2cuaW5mbyhcIlNpbGVudCB0b2tlbiByZW5ld2FsIHN1Y2Nlc3NmdWxcIik7XG4gICAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgICAgICBMb2cuZXJyb3IoXCJFcnJvciBmcm9tIHNpZ25pblNpbGVudDpcIiwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy5fdXNlck1hbmFnZXIuZXZlbnRzLl9yYWlzZVNpbGVudFJlbmV3RXJyb3IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvU2lsZW50UmVuZXdTZXJ2aWNlLmpzXG4gKiovIiwiLy8gQ29weXJpZ2h0IChjKSBCcm9jayBBbGxlbiAmIERvbWluaWNrIEJhaWVyLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gU2VlIExJQ0VOU0UgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IExvZyBmcm9tICcuL0xvZyc7XG5pbXBvcnQgQ29yZG92YVBvcHVwV2luZG93IGZyb20gJy4vQ29yZG92YVBvcHVwV2luZG93JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29yZG92YVBvcHVwTmF2aWdhdG9yIHtcbiAgICBcbiAgICBwcmVwYXJlKHBhcmFtcykge1xuICAgICAgICBsZXQgcG9wdXAgPSBuZXcgQ29yZG92YVBvcHVwV2luZG93KHBhcmFtcyk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9wdXApO1xuICAgIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL0NvcmRvdmFQb3B1cE5hdmlnYXRvci5qc1xuICoqLyIsIi8vIENvcHlyaWdodCAoYykgQnJvY2sgQWxsZW4gJiBEb21pbmljayBCYWllci4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFNlZSBMSUNFTlNFIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG5cbmltcG9ydCBMb2cgZnJvbSAnLi9Mb2cnO1xuXG5jb25zdCBEZWZhdWx0UG9wdXBGZWF0dXJlcyA9ICdsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHpvb209bm8nO1xuY29uc3QgRGVmYXVsdFBvcHVwVGFyZ2V0ID0gXCJfYmxhbmtcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29yZG92YVBvcHVwV2luZG93IHtcblxuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgICBMb2cuaW5mbyhcIkNvcmRvdmFQb3B1cFdpbmRvdy5jdG9yXCIpO1xuXG4gICAgICAgIHRoaXMuX3Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMuX3JlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5mZWF0dXJlcyA9IHBhcmFtcy5wb3B1cFdpbmRvd0ZlYXR1cmVzIHx8IERlZmF1bHRQb3B1cEZlYXR1cmVzO1xuICAgICAgICB0aGlzLnRhcmdldCA9IHBhcmFtcy5wb3B1cFdpbmRvd1RhcmdldCB8fCBEZWZhdWx0UG9wdXBUYXJnZXQ7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnJlZGlyZWN0X3VyaSA9IHBhcmFtcy5zdGFydFVybDtcbiAgICAgICAgTG9nLmluZm8oXCJyZWRpcmVjdF91cmk6IFwiICsgdGhpcy5yZWRpcmVjdF91cmkpO1xuICAgIH1cblxuICAgIF9pc0luQXBwQnJvd3Nlckluc3RhbGxlZChjb3Jkb3ZhTWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIFtcImNvcmRvdmEtcGx1Z2luLWluYXBwYnJvd3NlclwiLCBcImNvcmRvdmEtcGx1Z2luLWluYXBwYnJvd3Nlci5pbmFwcGJyb3dzZXJcIiwgXCJvcmcuYXBhY2hlLmNvcmRvdmEuaW5hcHBicm93c2VyXCJdLnNvbWUoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3Jkb3ZhTWV0YWRhdGEuaGFzT3duUHJvcGVydHkobmFtZSlcbiAgICAgICAgfSlcbiAgICB9XG4gICAgXG4gICAgbmF2aWdhdGUocGFyYW1zKSB7XG4gICAgICAgIExvZy5pbmZvKFwiQ29yZG92YVBvcHVwV2luZG93Lm5hdmlnYXRlXCIpO1xuXG4gICAgICAgIGlmICghcGFyYW1zIHx8ICFwYXJhbXMudXJsKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvcihcIk5vIHVybCBwcm92aWRlZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghd2luZG93LmNvcmRvdmEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoXCJjb3Jkb3ZhIGlzIHVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgY29yZG92YU1ldGFkYXRhID0gd2luZG93LmNvcmRvdmEucmVxdWlyZShcImNvcmRvdmEvcGx1Z2luX2xpc3RcIikubWV0YWRhdGE7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNJbkFwcEJyb3dzZXJJbnN0YWxsZWQoY29yZG92YU1ldGFkYXRhKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoXCJJbkFwcEJyb3dzZXIgcGx1Z2luIG5vdCBmb3VuZFwiKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcG9wdXAgPSBjb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKHBhcmFtcy51cmwsIHRoaXMudGFyZ2V0LCB0aGlzLmZlYXR1cmVzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wb3B1cCkge1xuICAgICAgICAgICAgICAgIExvZy5pbmZvKFwicG9wdXAgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcIik7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdGhpcy5fZXhpdENhbGxiYWNrRXZlbnQgPSB0aGlzLl9leGl0Q2FsbGJhY2suYmluZCh0aGlzKTsgXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9hZFN0YXJ0Q2FsbGJhY2tFdmVudCA9IHRoaXMuX2xvYWRTdGFydENhbGxiYWNrLmJpbmQodGhpcyk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9wdXAuYWRkRXZlbnRMaXN0ZW5lcihcImV4aXRcIiwgdGhpcy5fZXhpdENhbGxiYWNrRXZlbnQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3B1cC5hZGRFdmVudExpc3RlbmVyKFwibG9hZHN0YXJ0XCIsIHRoaXMuX2xvYWRTdGFydENhbGxiYWNrRXZlbnQsIGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyb3IoXCJFcnJvciBvcGVuaW5nIHBvcHVwIHdpbmRvd1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xuICAgIH1cblxuICAgIGdldCBwcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcbiAgICB9XG5cbiAgICBfbG9hZFN0YXJ0Q2FsbGJhY2soZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnVybC5pbmRleE9mKHRoaXMucmVkaXJlY3RfdXJpKSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fc3VjY2Vzcyh7IHVybDogZXZlbnQudXJsIH0pO1xuICAgICAgICB9ICAgIFxuICAgIH1cbiAgICBfZXhpdENhbGxiYWNrKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5fZXJyb3IobWVzc2FnZSk7ICAgIFxuICAgIH1cbiAgICBcbiAgICBfc3VjY2VzcyhkYXRhKSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcblxuICAgICAgICBMb2cuaW5mbyhcIlN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBjb3Jkb3ZhIHBvcHVwIHdpbmRvd1wiKTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZShkYXRhKTtcbiAgICB9XG4gICAgX2Vycm9yKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5fY2xlYW51cCgpO1xuXG4gICAgICAgIExvZy5lcnJvcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5fcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlKSk7XG4gICAgfVxuXG4gICAgX2NsZWFudXAoKSB7XG4gICAgICAgIExvZy5pbmZvKFwiQ29yZG92YVBvcHVwV2luZG93Ll9jbGVhbnVwXCIpO1xuXG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCl7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXhpdFwiLCB0aGlzLl9leGl0Q2FsbGJhY2tFdmVudCwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5fcG9wdXAucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImxvYWRzdGFydFwiLCB0aGlzLl9sb2FkU3RhcnRDYWxsYmFja0V2ZW50LCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BvcHVwID0gbnVsbDtcbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9Db3Jkb3ZhUG9wdXBXaW5kb3cuanNcbiAqKi8iLCIvLyBDb3B5cmlnaHQgKGMpIEJyb2NrIEFsbGVuICYgRG9taW5pY2sgQmFpZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBTZWUgTElDRU5TRSBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuXG5pbXBvcnQgTG9nIGZyb20gJy4vTG9nJztcbmltcG9ydCBDb3Jkb3ZhUG9wdXBXaW5kb3cgZnJvbSAnLi9Db3Jkb3ZhUG9wdXBXaW5kb3cnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb3Jkb3ZhSUZyYW1lTmF2aWdhdG9yIHtcbiAgICBcbiAgICBwcmVwYXJlKHBhcmFtcykge1xuICAgICAgICBwYXJhbXMucG9wdXBXaW5kb3dGZWF0dXJlcyA9ICdoaWRkZW49eWVzJztcbiAgICAgICAgbGV0IHBvcHVwID0gbmV3IENvcmRvdmFQb3B1cFdpbmRvdyhwYXJhbXMpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvcHVwKTtcbiAgICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9Db3Jkb3ZhSUZyYW1lTmF2aWdhdG9yLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==